Skip to content

Commit

Permalink
feat(compartment-mapper): handle browser field in construction of com…
Browse files Browse the repository at this point in the history
…partmentMap
  • Loading branch information
kumavis committed Dec 8, 2022
1 parent c10b443 commit ffe0719
Show file tree
Hide file tree
Showing 34 changed files with 263 additions and 8 deletions.
53 changes: 45 additions & 8 deletions packages/compartment-mapper/src/infer-exports.js
Expand Up @@ -9,21 +9,41 @@ const { isArray } = Array;

/**
* @param {string} name - the name of the referrer package.
* @param {Object} exports - the `exports` field from a package.json
* @param {Object} browser - the `browser` field from a package.json
* @param {string} main - the `main` field from a package.json
* @yields {[string, string]}
*/
export function* interpretBrowserExports(name, exports) {
if (typeof exports === 'string') {
yield [name, relativize(exports)];
function* interpretBrowserField(name, browser, main = 'index.js') {
if (typeof browser === 'string') {
yield ['.', relativize(browser)];
return;
}
if (Object(exports) !== exports) {
if (Object(browser) !== browser) {
throw new Error(
`Cannot interpret package.json browser property for package ${name}, must be string or object, got ${exports}`,
`Cannot interpret package.json browser property for package ${name}, must be string or object, got ${browser}`,
);
}
for (const [key, value] of entries(exports)) {
yield [join(name, key), relativize(value)];
for (const [key, value] of entries(browser)) {
// https://github.com/defunctzombie/package-browser-field-spec#ignore-a-module
if (value === false) {
// eslint-disable-next-line no-continue
continue;
}
// replace main export in object form
// https://github.com/defunctzombie/package-browser-field-spec/issues/16
if (key === main) {
yield ['.', relativize(value)];
// eslint-disable-next-line no-continue
continue;
}
// https://github.com/defunctzombie/package-browser-field-spec#replace-specific-files---advanced
if (key.startsWith('./') || key === '.') {
// local module replace
yield [key, relativize(value)];
} else {
// dependency replace
yield [key, value];
}
}
}

Expand Down Expand Up @@ -141,4 +161,21 @@ export const inferExportsAndModules = (
externalAliases,
fromEntries(inferExportsEntries(descriptor, tags, types)),
);
// if present, allow "browser" field to populate moduleMap
const { name, main, browser } = descriptor;
if (tags.has('browser') && browser !== undefined) {
for (const [specifier, target] of interpretBrowserField(
name,
browser,
main,
)) {
const specifierIsRelative =
specifier.startsWith('./') || specifier === '.';
// only relative entries in browser field affect external aliases
if (specifierIsRelative) {
externalAliases[specifier] = target;
}
internalAliases[specifier] = target;
}
}
};

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

44 changes: 44 additions & 0 deletions packages/compartment-mapper/test/test-main.js
Expand Up @@ -181,3 +181,47 @@ scaffold(
},
2,
);

scaffold(
'fixtures-resolve/browser',
test,
new URL(
'fixtures-resolve/node_modules/browser/main.js',
import.meta.url,
).toString(),
(t, { namespace: { results } }) => {
t.deepEqual(results, {
answer1: 200,
answer2: 200,
answer3: 200,
answer4: 200,
answer5: 200,
answer6: 200,
answer7: 200,
answer8: 200,
answer9: 200,
answer10: 200,
});
},
1,
{ tags: new Set(['browser']) },
);

scaffold(
'fixtures-resolve/exports-field',
test,
new URL(
'fixtures-resolve/node_modules/exports-field/main.js',
import.meta.url,
).toString(),
(t, { namespace: { results } }) => {
t.deepEqual(results, {
answer1: 99,
answer2: 77,
answer3: 44,
answer4: 77,
answer5: 99,
});
},
1,
);

0 comments on commit ffe0719

Please sign in to comment.