Skip to content

Commit

Permalink
feat(compartment-mapper): dancing skeleton require.resolve implementa…
Browse files Browse the repository at this point in the history
…tion
  • Loading branch information
naugtur committed Jun 28, 2022
1 parent 792db48 commit ba1de8e
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 5 deletions.
7 changes: 7 additions & 0 deletions packages/compartment-mapper/src/import-hook.js
Expand Up @@ -169,6 +169,12 @@ export const makeImportHookMaker = (
const moduleBytes = await read(moduleLocation).catch(
_error => undefined,
);
const requireResolve = specifier => {
console.warn('Warning: Getting correct result form require.resolve in Endo is only possible if the package was resolved earlier.')
return packageSources[specifier]
? packageSources[specifier].sourceLocation
: null;
};
if (moduleBytes !== undefined) {
// eslint-disable-next-line no-await-in-loop
const envelope = await parse(
Expand All @@ -177,6 +183,7 @@ export const makeImportHookMaker = (
moduleLocation,
packageLocation,
readPowers,
requireResolve,
);
const {
parser,
Expand Down
4 changes: 2 additions & 2 deletions packages/compartment-mapper/src/link.js
Expand Up @@ -77,7 +77,7 @@ const makeExtensionParser = (
parserForLanguage,
transforms,
) => {
return async (bytes, specifier, location, packageLocation, readPowers) => {
return async (bytes, specifier, location, packageLocation, readPowers, requireResolve) => {
let language;
if (has(languageForModuleSpecifier, specifier)) {
language = languageForModuleSpecifier[specifier];
Expand Down Expand Up @@ -106,7 +106,7 @@ const makeExtensionParser = (
);
}
const { parse } = parserForLanguage[language];
return parse(bytes, specifier, location, packageLocation, readPowers);
return parse(bytes, specifier, location, packageLocation, readPowers, requireResolve);
};
};

Expand Down
Expand Up @@ -74,7 +74,7 @@ export const getModulePaths = (readPowers, location) => {
* require: Function,
* }}
*/
export const wrap = (moduleEnvironmentRecord, compartment, resolvedImports) => {
export const wrap = (moduleEnvironmentRecord, compartment, resolvedImports, requireResolve) => {
// This initial default value makes things like exports.hasOwnProperty() work in cjs.
moduleEnvironmentRecord.default = create(
compartment.globalThis.Object.prototype,
Expand Down Expand Up @@ -122,7 +122,7 @@ export const wrap = (moduleEnvironmentRecord, compartment, resolvedImports) => {
},
});

const require = freeze((/** @type {string} */ importSpecifier) => {
const require = (/** @type {string} */ importSpecifier) => {
const namespace = compartment.importNow(resolvedImports[importSpecifier]);
// If you read this file carefully, you'll see it's not possible for a cjs module to not have the default anymore.
// It's currently possible to require modules that were not created by this file though.
Expand All @@ -131,7 +131,10 @@ export const wrap = (moduleEnvironmentRecord, compartment, resolvedImports) => {
} else {
return namespace;
}
});
};
require.resolve = freeze(requireResolve)

freeze(require)

const afterExecute = () => {
const exportsHaveBeenOverwritten = finalExports !== originalExports;
Expand Down
2 changes: 2 additions & 0 deletions packages/compartment-mapper/src/parse-cjs.js
Expand Up @@ -14,6 +14,7 @@ export const parseCjs = async (
location,
_packageLocation,
readPowers,
requireResolve,
) => {
const source = textDecoder.decode(bytes);

Expand Down Expand Up @@ -42,6 +43,7 @@ export const parseCjs = async (
moduleEnvironmentRecord,
compartment,
resolvedImports,
requireResolve,
);

functor(require, moduleExports, module, filename, dirname);
Expand Down

0 comments on commit ba1de8e

Please sign in to comment.