@endo/compartment-mapper 0.9.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +17 -11
- package/src/bundle-cjs.d.ts.map +1 -1
- package/src/bundle-cjs.js +20 -4
- package/src/import-archive.d.ts.map +1 -1
- package/src/import-archive.js +3 -0
- package/src/import-hook.d.ts.map +1 -1
- package/src/import-hook.js +5 -4
- package/src/link.d.ts +1 -1
- package/src/link.d.ts.map +1 -1
- package/src/link.js +12 -17
- package/src/node-modules.d.ts.map +1 -1
- package/src/node-modules.js +1 -6
- package/src/parse-cjs-shared-export-wrapper.d.ts.map +1 -1
- package/src/parse-cjs-shared-export-wrapper.js +5 -0
- package/src/policy-format.d.ts.map +1 -1
- package/src/policy-format.js +2 -2
- package/src/policy.d.ts +1 -7
- package/src/policy.d.ts.map +1 -1
- package/src/policy.js +24 -99
- package/src/types.d.ts +1 -1
- package/src/types.d.ts.map +1 -1
- package/src/types.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@endo/compartment-mapper",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "The compartment mapper assembles Node applications in a sandbox",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"node",
|
|
@@ -22,7 +22,10 @@
|
|
|
22
22
|
"main": "./index.js",
|
|
23
23
|
"types": "./types.d.ts",
|
|
24
24
|
"exports": {
|
|
25
|
-
".":
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./types.d.ts",
|
|
27
|
+
"default": "./index.js"
|
|
28
|
+
},
|
|
26
29
|
"./import.js": "./import.js",
|
|
27
30
|
"./archive.js": "./archive.js",
|
|
28
31
|
"./import-archive.js": "./import-archive.js",
|
|
@@ -32,21 +35,21 @@
|
|
|
32
35
|
},
|
|
33
36
|
"scripts": {
|
|
34
37
|
"build": "exit 0",
|
|
35
|
-
"
|
|
36
|
-
"
|
|
38
|
+
"build:types": "tsc --build tsconfig.build.json",
|
|
39
|
+
"clean:types": "git clean -f '*.d.ts*'",
|
|
37
40
|
"cover": "c8 ava",
|
|
38
41
|
"lint": "yarn lint:types && yarn lint:js",
|
|
39
42
|
"lint-fix": "eslint --fix .",
|
|
40
43
|
"lint:js": "eslint .",
|
|
41
|
-
"lint:types": "tsc
|
|
44
|
+
"lint:types": "tsc",
|
|
42
45
|
"prettier-fixtures": "prettier --write --with-node-modules './test/fixtures-*/**/*.*js'",
|
|
43
46
|
"test": "ava"
|
|
44
47
|
},
|
|
45
48
|
"dependencies": {
|
|
46
|
-
"@endo/cjs-module-analyzer": "^0.
|
|
47
|
-
"@endo/static-module-record": "^0.
|
|
48
|
-
"@endo/zip": "^0.
|
|
49
|
-
"ses": "^0.
|
|
49
|
+
"@endo/cjs-module-analyzer": "^1.0.0",
|
|
50
|
+
"@endo/static-module-record": "^1.0.0",
|
|
51
|
+
"@endo/zip": "^1.0.0",
|
|
52
|
+
"ses": "^1.0.0"
|
|
50
53
|
},
|
|
51
54
|
"devDependencies": {
|
|
52
55
|
"ava": "^5.3.0",
|
|
@@ -56,7 +59,7 @@
|
|
|
56
59
|
"eslint-config-airbnb-base": "^15.0.0",
|
|
57
60
|
"eslint-config-prettier": "^8.8.0",
|
|
58
61
|
"eslint-plugin-eslint-comments": "^3.1.2",
|
|
59
|
-
"eslint-plugin-import": "^2.
|
|
62
|
+
"eslint-plugin-import": "^2.29.0",
|
|
60
63
|
"prettier": "^3.0.0",
|
|
61
64
|
"typescript": "~5.2.2"
|
|
62
65
|
},
|
|
@@ -93,5 +96,8 @@
|
|
|
93
96
|
],
|
|
94
97
|
"timeout": "2m"
|
|
95
98
|
},
|
|
96
|
-
"
|
|
99
|
+
"typeCoverage": {
|
|
100
|
+
"atLeast": 85.78
|
|
101
|
+
},
|
|
102
|
+
"gitHead": "6aa22009bf8128575c446aebceb0f9a01459d165"
|
|
97
103
|
}
|
package/src/bundle-cjs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle-cjs.d.ts","sourceRoot":"","sources":["bundle-cjs.js"],"names":[],"mappings":";;IA+
|
|
1
|
+
{"version":3,"file":"bundle-cjs.d.ts","sourceRoot":"","sources":["bundle-cjs.js"],"names":[],"mappings":";;IA+CE;;;;;;;;;;;;MAsBC;;;AArDH,8BA2Ba"}
|
package/src/bundle-cjs.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
1
2
|
/** quotes strings */
|
|
2
3
|
const q = JSON.stringify;
|
|
3
4
|
|
|
@@ -5,7 +6,9 @@ const exportsCellRecord = exportsList =>
|
|
|
5
6
|
''.concat(
|
|
6
7
|
...exportsList.map(
|
|
7
8
|
exportName => `\
|
|
8
|
-
${exportName}: cell(${q(exportName)}
|
|
9
|
+
${q(exportName)}: cell(${q(exportName)}${
|
|
10
|
+
exportName !== 'default' ? '' : `, {}`
|
|
11
|
+
}),
|
|
9
12
|
`,
|
|
10
13
|
),
|
|
11
14
|
);
|
|
@@ -14,15 +17,28 @@ const exportsCellRecord = exportsList =>
|
|
|
14
17
|
const runtime = function wrapCjsFunctor(num) {
|
|
15
18
|
/* eslint-disable no-undef */
|
|
16
19
|
return ({ imports = {} }) => {
|
|
20
|
+
const moduleCells = cells[num];
|
|
17
21
|
const cModule = Object.freeze(
|
|
18
|
-
Object.defineProperty({}, 'exports',
|
|
22
|
+
Object.defineProperty({}, 'exports', moduleCells.default),
|
|
19
23
|
);
|
|
20
24
|
// TODO: specifier not found handling
|
|
21
25
|
const requireImpl = specifier => cells[imports[specifier]].default.get();
|
|
22
26
|
functors[num](Object.freeze(requireImpl), cModule.exports, cModule);
|
|
23
|
-
|
|
27
|
+
// Update all named cells from module.exports.
|
|
28
|
+
Object.keys(moduleCells)
|
|
24
29
|
.filter(k => k !== 'default' && k !== '*')
|
|
25
|
-
.map(k =>
|
|
30
|
+
.map(k => moduleCells[k].set(cModule.exports[k]));
|
|
31
|
+
// Add new named cells from module.exports.
|
|
32
|
+
Object.keys(cModule.exports)
|
|
33
|
+
.filter(k => k !== 'default' && k !== '*')
|
|
34
|
+
.filter(k => moduleCells[k] === undefined)
|
|
35
|
+
.map(k => (moduleCells[k] = cell(k, cModule.exports[k])));
|
|
36
|
+
// Update the star cell from all cells.
|
|
37
|
+
const starExports = Object.create(null);
|
|
38
|
+
Object.keys(moduleCells)
|
|
39
|
+
.filter(k => k !== '*')
|
|
40
|
+
.map(k => Object.defineProperty(starExports, k, moduleCells[k]));
|
|
41
|
+
moduleCells['*'].set(Object.freeze(starExports));
|
|
26
42
|
};
|
|
27
43
|
/* eslint-enable no-undef */
|
|
28
44
|
}.toString();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-archive.d.ts","sourceRoot":"","sources":["import-archive.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"import-archive.d.ts","sourceRoot":"","sources":["import-archive.js"],"names":[],"mappings":"AAyPO,2CAZI,UAAU;;;;;;;;gBAUR,QAAQ,OAAO,YAAY,EAAE,WAAW,CAAC,CAmJrD;AAQM,wCALI,OAAO,YAAY,EAAE,MAAM,GAAG,OAAO,YAAY,EAAE,UAAU,mBAC7D,MAAM,kEAEJ,QAAQ,OAAO,YAAY,EAAE,WAAW,CAAC,CAsBrD;AAQM,0CALI,OAAO,YAAY,EAAE,MAAM,GAAG,OAAO,YAAY,EAAE,UAAU,mBAC7D,MAAM,WACN,OAAO,YAAY,EAAE,cAAc,GAAG,OAAO,YAAY,EAAE,kBAAkB,GAC3E,QAAQ,MAAM,CAAC,CAK3B;qCAvMa,kBAAkB"}
|
package/src/import-archive.js
CHANGED
|
@@ -95,6 +95,9 @@ const makeArchiveImportHookMaker = (
|
|
|
95
95
|
// module is a "builtin" module and the policy needs to be enforced.
|
|
96
96
|
enforceModulePolicy(moduleSpecifier, compartmentDescriptor, {
|
|
97
97
|
exit: true,
|
|
98
|
+
errorHint: `Blocked in loading. ${q(
|
|
99
|
+
moduleSpecifier,
|
|
100
|
+
)} was not in the archive and an attempt was made to load it as a builtin`,
|
|
98
101
|
});
|
|
99
102
|
const record = await exitModuleImportHook(moduleSpecifier);
|
|
100
103
|
if (record) {
|
package/src/import-hook.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-hook.d.ts","sourceRoot":"","sources":["import-hook.js"],"names":[],"mappings":"AAuEO;IAJiC,OAAO,GAApC,OAAO,MAAM,EAAE,GAAG,CAAC;IACW,oBAAoB,GAAlD,oBAAoB;IAClB,oBAAoB,GAAC,SAAS,CA0B1C;AAuBM,gDApBI,MAAM,GAAC,UAAU,gBACjB,MAAM;IAEY,OAAO;IACuB,sBAAsB;IACpD,WAAW;IACZ,aAAa;IACN,cAAc;IAOtB,oBAAoB,EAApC,MAAM;IACU,oBAAoB,EAApC,MAAM;IACyB,oBAAoB;IACN,aAAa;IACxD,eAAe,
|
|
1
|
+
{"version":3,"file":"import-hook.d.ts","sourceRoot":"","sources":["import-hook.js"],"names":[],"mappings":"AAuEO;IAJiC,OAAO,GAApC,OAAO,MAAM,EAAE,GAAG,CAAC;IACW,oBAAoB,GAAlD,oBAAoB;IAClB,oBAAoB,GAAC,SAAS,CA0B1C;AAuBM,gDApBI,MAAM,GAAC,UAAU,gBACjB,MAAM;IAEY,OAAO;IACuB,sBAAsB;IACpD,WAAW;IACZ,aAAa;IACN,cAAc;IAOtB,oBAAoB,EAApC,MAAM;IACU,oBAAoB,EAApC,MAAM;IACyB,oBAAoB;IACN,aAAa;IACxD,eAAe,CAqR3B;yBAvYa,OAAO,KAAK,EAAE,UAAU;+BACxB,OAAO,KAAK,EAAE,gBAAgB;4CAC9B,OAAO,KAAK,EAAE,6BAA6B;8CAC3C,OAAO,KAAK,EAAE,+BAA+B;qBAC7C,OAAO,YAAY,EAAE,MAAM;yBAC3B,OAAO,YAAY,EAAE,UAAU;qBAC/B,OAAO,YAAY,EAAE,MAAM;sBAC3B,OAAO,YAAY,EAAE,OAAO;iCAC5B,OAAO,YAAY,EAAE,kBAAkB;oCACvC,OAAO,YAAY,EAAE,qBAAqB;8BAC1C,OAAO,YAAY,EAAE,eAAe;0CACpC,OAAO,YAAY,EAAE,2BAA2B;mCAChD,OAAO,YAAY,EAAE,oBAAoB"}
|
package/src/import-hook.js
CHANGED
|
@@ -220,6 +220,9 @@ export const makeImportHookMaker = (
|
|
|
220
220
|
// hook returns something. Otherwise, we need to fall back to the 'cannot find' error below.
|
|
221
221
|
enforceModulePolicy(moduleSpecifier, compartmentDescriptor, {
|
|
222
222
|
exit: true,
|
|
223
|
+
errorHint: `Blocked in loading. ${q(
|
|
224
|
+
moduleSpecifier,
|
|
225
|
+
)} was not in the compartment map and an attempt was made to load it as a builtin`,
|
|
223
226
|
});
|
|
224
227
|
if (archiveOnly) {
|
|
225
228
|
// Return a place-holder.
|
|
@@ -251,10 +254,8 @@ export const makeImportHookMaker = (
|
|
|
251
254
|
// Collate candidate locations for the moduleSpecifier,
|
|
252
255
|
// to support Node.js conventions and similar.
|
|
253
256
|
const candidates = [moduleSpecifier];
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
candidates.push(`${moduleSpecifier}${candidateSuffix}`);
|
|
257
|
-
}
|
|
257
|
+
for (const candidateSuffix of searchSuffixes) {
|
|
258
|
+
candidates.push(`${moduleSpecifier}${candidateSuffix}`);
|
|
258
259
|
}
|
|
259
260
|
|
|
260
261
|
const { maybeRead } = unpackReadPowers(readPowers);
|
package/src/link.d.ts
CHANGED
|
@@ -18,5 +18,5 @@ export type CompartmentDescriptor = import('./types.js').CompartmentDescriptor;
|
|
|
18
18
|
export type CompartmentMapDescriptor = import('./types.js').CompartmentMapDescriptor;
|
|
19
19
|
export type DeferredAttenuatorsProvider = import('./types.js').DeferredAttenuatorsProvider;
|
|
20
20
|
export type LinkOptions = import('./types.js').LinkOptions;
|
|
21
|
-
export type ERef<T_1> =
|
|
21
|
+
export type ERef<T_1> = any;
|
|
22
22
|
//# sourceMappingURL=link.d.ts.map
|
package/src/link.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["link.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["link.js"],"names":[],"mappings":"AA+IO,iDAPI,OAAO,MAAM,EAAE,QAAQ,CAAC,8BACxB,OAAO,MAAM,EAAE,MAAM,CAAC,qBAEtB,OAAO,MAAM,EAAE,oBAAoB,CAAC,qBACpC,gBAAgB,GACd,OAAO,CA0BnB;AAmKM,sEAHI,wBAAwB,wIACxB,WAAW;;;;;EA0IrB;AAMM,yCAHI,wBAAwB,WACxB,WAAW,eAGqB;4BAvd7B,OAAO,KAAK,EAAE,aAAa;0BAC3B,OAAO,KAAK,EAAE,WAAW;sBACzB,OAAO,YAAY,EAAE,OAAO;mCAC5B,OAAO,YAAY,EAAE,oBAAoB;+BACzC,OAAO,YAAY,EAAE,gBAAgB;+BACrC,OAAO,YAAY,EAAE,gBAAgB;uBACrC,OAAO,YAAY,EAAE,QAAQ;+BAC7B,OAAO,YAAY,EAAE,gBAAgB;oCACrC,OAAO,YAAY,EAAE,qBAAqB;uCAC1C,OAAO,YAAY,EAAE,wBAAwB;0CAC7C,OAAO,YAAY,EAAE,2BAA2B;0BAChD,OAAO,YAAY,EAAE,WAAW"}
|
package/src/link.js
CHANGED
|
@@ -19,7 +19,6 @@ import { parseExtension } from './extension.js';
|
|
|
19
19
|
import {
|
|
20
20
|
enforceModulePolicy,
|
|
21
21
|
ATTENUATORS_COMPARTMENT,
|
|
22
|
-
diagnoseMissingCompartmentError,
|
|
23
22
|
attenuateGlobals,
|
|
24
23
|
makeDeferredAttenuatorsProvider,
|
|
25
24
|
} from './policy.js';
|
|
@@ -232,10 +231,14 @@ const makeModuleMapHook = (
|
|
|
232
231
|
return undefined; // fall through to import hook
|
|
233
232
|
}
|
|
234
233
|
if (foreignModuleSpecifier !== undefined) {
|
|
234
|
+
// archive goes through foreignModuleSpecifier for local modules too
|
|
235
235
|
if (!moduleSpecifier.startsWith('./')) {
|
|
236
|
-
//
|
|
236
|
+
// This code path seems to only be reached on subsequent imports of the same specifier in the same compartment.
|
|
237
|
+
// The check should be redundant and is only left here out of abundance of caution.
|
|
237
238
|
enforceModulePolicy(moduleSpecifier, compartmentDescriptor, {
|
|
238
239
|
exit: false,
|
|
240
|
+
errorHint:
|
|
241
|
+
'This check should not be reachable. If you see this error, please file an issue.',
|
|
239
242
|
});
|
|
240
243
|
}
|
|
241
244
|
|
|
@@ -244,12 +247,7 @@ const makeModuleMapHook = (
|
|
|
244
247
|
throw Error(
|
|
245
248
|
`Cannot import from missing compartment ${q(
|
|
246
249
|
foreignCompartmentName,
|
|
247
|
-
)}
|
|
248
|
-
moduleSpecifier,
|
|
249
|
-
compartmentDescriptor,
|
|
250
|
-
foreignModuleSpecifier,
|
|
251
|
-
foreignCompartmentName,
|
|
252
|
-
})}`,
|
|
250
|
+
)}}`,
|
|
253
251
|
);
|
|
254
252
|
}
|
|
255
253
|
return foreignCompartment.module(foreignModuleSpecifier);
|
|
@@ -279,20 +277,17 @@ const makeModuleMapHook = (
|
|
|
279
277
|
throw Error(
|
|
280
278
|
`Cannot import from missing compartment ${q(
|
|
281
279
|
foreignCompartmentName,
|
|
282
|
-
)}
|
|
283
|
-
moduleSpecifier,
|
|
284
|
-
compartmentDescriptor,
|
|
285
|
-
foreignModuleSpecifier,
|
|
286
|
-
foreignCompartmentName,
|
|
287
|
-
})}`,
|
|
280
|
+
)}`,
|
|
288
281
|
);
|
|
289
282
|
}
|
|
290
283
|
|
|
291
|
-
// Despite all non-exit modules not allowed by policy being dropped
|
|
292
|
-
// while building the graph, this check is necessary because module
|
|
293
|
-
// is written back to the compartment map below.
|
|
294
284
|
enforceModulePolicy(scopePrefix, compartmentDescriptor, {
|
|
295
285
|
exit: false,
|
|
286
|
+
errorHint: `Blocked in linking. ${q(
|
|
287
|
+
moduleSpecifier,
|
|
288
|
+
)} is part of the compartment map and resolves to ${q(
|
|
289
|
+
foreignCompartmentName,
|
|
290
|
+
)}.`,
|
|
296
291
|
});
|
|
297
292
|
// The following line is weird.
|
|
298
293
|
// Information is flowing backward.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-modules.d.ts","sourceRoot":"","sources":["node-modules.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"node-modules.d.ts","sourceRoot":"","sources":["node-modules.js"],"names":[],"mappings":"AAisBO,yDAXI,MAAM,GAAG,UAAU,GAAG,eAAe,mBACrC,MAAM,QACN,IAAI,MAAM,CAAC,qBACX,MAAM,mBACN,MAAM;;yBAGN,MAAM;aACN,MAAM;gBACJ,QAAQ,wBAAwB,CAAC,CA+C7C;uBA3uBa,OAAO,YAAY,EAAE,QAAQ;qBAC7B,OAAO,YAAY,EAAE,MAAM;0BAC3B,OAAO,YAAY,EAAE,WAAW;0BAChC,OAAO,YAAY,EAAE,WAAW;uCAChC,OAAO,YAAY,EAAE,wBAAwB;+BAC7C,OAAO,YAAY,EAAE,gBAAgB;8BACrC,OAAO,YAAY,EAAE,eAAe;oCACpC,OAAO,YAAY,EAAE,qBAAqB;yBAC1C,OAAO,YAAY,EAAE,UAAU;8BAC/B,OAAO,YAAY,EAAE,eAAe;;;;;;;oBAQrC,OAAO,MAAM,EAAE,IAAI,CAAC;;WAKnB,MAAM;UACN,MAAM;UACN,MAAM,MAAM,CAAC;iBACb,MAAM,MAAM,CAAC;qBACb,OAAO;qBACP,OAAO,MAAM,EAAE,MAAM,CAAC;qBACtB,OAAO,MAAM,EAAE,MAAM,CAAC;;;;;yBACtB,OAAO,MAAM,EAAE,MAAM,CAAC;;;;;aAEtB,OAAO,MAAM,EAAE,QAAQ,CAAC;;;;;WAExB,OAAO,MAAM,EAAE,QAAQ,CAAC;;0CAKzB,OAAO,MAAM,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAC;iDA+E/C,MAAM,KACJ,QAAQ,MAAM,CAAC"}
|
package/src/node-modules.js
CHANGED
|
@@ -566,7 +566,7 @@ const graphPackages = async (
|
|
|
566
566
|
* @param {Graph} graph
|
|
567
567
|
* @param {Set<string>} tags - build tags about the target environment
|
|
568
568
|
* for selecting relevant exports, e.g., "browser" or "node".
|
|
569
|
-
* @param {object} policy
|
|
569
|
+
* @param {object|undefined} policy
|
|
570
570
|
* @returns {CompartmentMapDescriptor}
|
|
571
571
|
*/
|
|
572
572
|
const translateGraph = (
|
|
@@ -611,11 +611,6 @@ const translateGraph = (
|
|
|
611
611
|
},
|
|
612
612
|
policy,
|
|
613
613
|
);
|
|
614
|
-
// do not include compartments for packages not covered by policy
|
|
615
|
-
if (policy && !packagePolicy) {
|
|
616
|
-
// eslint-disable-next-line no-continue
|
|
617
|
-
continue;
|
|
618
|
-
}
|
|
619
614
|
|
|
620
615
|
/**
|
|
621
616
|
* @param {string} dependencyName
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-cjs-shared-export-wrapper.d.ts","sourceRoot":"","sources":["parse-cjs-shared-export-wrapper.js"],"names":[],"mappings":"AA8BO,2CAPI,UAAU,GAAG,MAAM,GAAG,SAAS,YAC/B,MAAM,GACJ;IACZ,QAAY,EAAC,MAAM,GAAC,IAAI,CAAC;IACzB,OAAW,EAAE,MAAM,GAAC,IAAI,CAAA;CACrB,CAgCH;AAmBM;IAZe,uBAAuB,EAAlC,MAAM;IACU,WAAW,EAA3B,WAAW;IACgB,eAAe,EAA1C,OAAO,MAAM,EAAE,MAAM,CAAC;IACX,QAAQ,EAAnB,MAAM;IAC8B,UAAU,EAA9C,MAAM,GAAG,UAAU,GAAG,SAAS;;;iBAElB,GAAG;;mBACP,GAAG;;;
|
|
1
|
+
{"version":3,"file":"parse-cjs-shared-export-wrapper.d.ts","sourceRoot":"","sources":["parse-cjs-shared-export-wrapper.js"],"names":[],"mappings":"AA8BO,2CAPI,UAAU,GAAG,MAAM,GAAG,SAAS,YAC/B,MAAM,GACJ;IACZ,QAAY,EAAC,MAAM,GAAC,IAAI,CAAC;IACzB,OAAW,EAAE,MAAM,GAAC,IAAI,CAAA;CACrB,CAgCH;AAmBM;IAZe,uBAAuB,EAAlC,MAAM;IACU,WAAW,EAA3B,WAAW;IACgB,eAAe,EAA1C,OAAO,MAAM,EAAE,MAAM,CAAC;IACX,QAAQ,EAAnB,MAAM;IAC8B,UAAU,EAA9C,MAAM,GAAG,UAAU,GAAG,SAAS;;;iBAElB,GAAG;;mBACP,GAAG;;;EA+GtB;qBAvLa,OAAO,YAAY,EAAE,MAAM;yBAC3B,OAAO,YAAY,EAAE,UAAU"}
|
|
@@ -132,6 +132,11 @@ export const wrap = ({
|
|
|
132
132
|
});
|
|
133
133
|
|
|
134
134
|
const require = (/** @type {string} */ importSpecifier) => {
|
|
135
|
+
if (!has(resolvedImports, importSpecifier)) {
|
|
136
|
+
throw new Error(
|
|
137
|
+
`Cannot find module "${importSpecifier}" in "${location}"`,
|
|
138
|
+
);
|
|
139
|
+
}
|
|
135
140
|
const namespace = compartment.importNow(resolvedImports[importSpecifier]);
|
|
136
141
|
// If you read this file carefully, you'll see it's not possible for a cjs module to not have the default anymore.
|
|
137
142
|
// It's currently possible to require modules that were not created by this file though.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-format.d.ts","sourceRoot":"","sources":["policy-format.js"],"names":[],"mappings":"AAqBO,kDALI,MAAM,SACN,MAAM,YACN,MAAM,GACJ,OAAO,GAAG,MAAM,CAqB5B;AAQM,
|
|
1
|
+
{"version":3,"file":"policy-format.d.ts","sourceRoot":"","sources":["policy-format.js"],"names":[],"mappings":"AAqBO,kDALI,MAAM,SACN,MAAM,YACN,MAAM,GACJ,OAAO,GAAG,MAAM,CAqB5B;AAQM,kDAHI,GAAG,GACD,OAAO,CAGmB;AAOhC,6DAHI,qBAAqB,GACnB,OAAO,CAQnB;AAOM,mEAHI,qBAAqB,GACnB,4BAA4B,CAuBxC;AAyBM,0DALI,OAAO,QACP,MAAM,6BAEJ,IAAI,CA0DhB;AAOM,4CAHI,OAAO,GACL,IAAI,CAgChB;oCA9Ma,OAAO,YAAY,EAAE,qBAAqB;2CAC1C,OAAO,YAAY,EAAE,4BAA4B"}
|
package/src/policy-format.js
CHANGED
|
@@ -43,7 +43,7 @@ export const policyLookupHelper = (packagePolicy, field, itemName) => {
|
|
|
43
43
|
/**
|
|
44
44
|
* Checks if the policy value is set to wildcard to allow everything
|
|
45
45
|
*
|
|
46
|
-
* @param {
|
|
46
|
+
* @param {any} policyValue
|
|
47
47
|
* @returns {boolean}
|
|
48
48
|
*/
|
|
49
49
|
export const isAllowingEverything = policyValue =>
|
|
@@ -122,7 +122,7 @@ export const assertPackagePolicy = (allegedPackagePolicy, path, url) => {
|
|
|
122
122
|
const packagePolicy = Object(allegedPackagePolicy);
|
|
123
123
|
assert(
|
|
124
124
|
allegedPackagePolicy === packagePolicy && !isArray(allegedPackagePolicy),
|
|
125
|
-
`${path} must be an object, got ${allegedPackagePolicy}${inUrl}`,
|
|
125
|
+
`${path} must be an object, got ${q(allegedPackagePolicy)}${inUrl}`,
|
|
126
126
|
);
|
|
127
127
|
const {
|
|
128
128
|
packages,
|
package/src/policy.d.ts
CHANGED
|
@@ -7,14 +7,8 @@ export function dependencyAllowedByPolicy(namingKit: PackageNamingKit, packagePo
|
|
|
7
7
|
export function getPolicyForPackage(namingKit: PackageNamingKit, policy: object | undefined): object | undefined;
|
|
8
8
|
export function makeDeferredAttenuatorsProvider(compartments: Record<string, Compartment>, compartmentDescriptors: Record<string, CompartmentDescriptor>): DeferredAttenuatorsProvider;
|
|
9
9
|
export function attenuateGlobals(globalThis: object, globals: object, packagePolicy: object, attenuators: DeferredAttenuatorsProvider, pendingJobs: Array<Promise<any>>, name?: string): void;
|
|
10
|
-
export function enforceModulePolicy(specifier: string, compartmentDescriptor:
|
|
10
|
+
export function enforceModulePolicy(specifier: string, compartmentDescriptor: import('./types.js').CompartmentDescriptor, info?: object): void;
|
|
11
11
|
export function attenuateModuleHook(specifier: string, originalModuleRecord: ThirdPartyStaticModuleInterface, policy: object, attenuators: DeferredAttenuatorsProvider): Promise<ThirdPartyStaticModuleInterface>;
|
|
12
|
-
export function diagnoseMissingCompartmentError({ moduleSpecifier, compartmentDescriptor, foreignModuleSpecifier, foreignCompartmentName, }: {
|
|
13
|
-
moduleSpecifier: string;
|
|
14
|
-
compartmentDescriptor: object;
|
|
15
|
-
foreignModuleSpecifier: string;
|
|
16
|
-
foreignCompartmentName: string;
|
|
17
|
-
}): string;
|
|
18
12
|
export type PackageNamingKit = import('./types.js').PackageNamingKit;
|
|
19
13
|
export type AttenuationDefinition = import('./types.js').AttenuationDefinition;
|
|
20
14
|
export type FullAttenuationDefinition = import('./types.js').FullAttenuationDefinition;
|
package/src/policy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["policy.js"],"names":[],"mappings":"AAsBA;;GAEG;AACH,sDAAuD;AA0ChD,0CAHI,MAAM,GACJ,MAAM,MAAM,CAAC,CAezB;AA0BM,qDAJI,gBAAgB,
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["policy.js"],"names":[],"mappings":"AAsBA;;GAEG;AACH,sDAAuD;AA0ChD,0CAHI,MAAM,GACJ,MAAM,MAAM,CAAC,CAezB;AA0BM,qDAJI,gBAAgB,iBAChB,GAAG,GACD,OAAO,CASnB;AASM,+CAJI,gBAAgB,UAChB,MAAM,GAAC,SAAS,GACd,MAAM,GAAC,SAAS,CAsB5B;AAgDM,8DAJI,OAAO,MAAM,EAAE,WAAW,CAAC,0BAC3B,OAAO,MAAM,EAAE,qBAAqB,CAAC,GACnC,2BAA2B,CA2CvC;AAmDM,6CARI,MAAM,WACN,MAAM,iBACN,MAAM,eACN,2BAA2B,eAC3B,mBAAc,SACd,MAAM,GACJ,IAAI,CAgDhB;AAeM,+CAJI,MAAM,yBACN,OAAO,YAAY,EAAE,qBAAqB,SAC1C,MAAM,QAgChB;AA+CM,+CANI,MAAM,wBACN,+BAA+B,UAC/B,MAAM,eACN,2BAA2B,GACzB,QAAQ,+BAA+B,CAAC,CAyBpD;+BAzba,OAAO,YAAY,EAAE,gBAAgB;oCACrC,OAAO,YAAY,EAAE,qBAAqB;wCAC1C,OAAO,YAAY,EAAE,yBAAyB;4CAC9C,OAAO,YAAY,EAAE,6BAA6B;yBAClD,OAAO,YAAY,EAAE,UAAU;0CAC/B,OAAO,YAAY,EAAE,2BAA2B;oCAChD,OAAO,YAAY,EAAE,qBAAqB;8CAE1C,OAAO,KAAK,EAAE,+BAA+B"}
|
package/src/policy.js
CHANGED
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
isAllowingEverything,
|
|
18
18
|
} from './policy-format.js';
|
|
19
19
|
|
|
20
|
-
const { entries, values, assign, keys, freeze } = Object;
|
|
20
|
+
const { create, entries, values, assign, keys, freeze } = Object;
|
|
21
21
|
const q = JSON.stringify;
|
|
22
22
|
|
|
23
23
|
/**
|
|
@@ -101,7 +101,7 @@ const generateCanonicalName = ({ isEntry = false, name, path }) => {
|
|
|
101
101
|
* packagePolicy is required, when policy is not set, skipping needs to be handled by the caller.
|
|
102
102
|
*
|
|
103
103
|
* @param {PackageNamingKit} namingKit
|
|
104
|
-
* @param {
|
|
104
|
+
* @param {any} packagePolicy
|
|
105
105
|
* @returns {boolean}
|
|
106
106
|
*/
|
|
107
107
|
export const dependencyAllowedByPolicy = (namingKit, packagePolicy) => {
|
|
@@ -113,29 +113,6 @@ export const dependencyAllowedByPolicy = (namingKit, packagePolicy) => {
|
|
|
113
113
|
return !!policyLookupHelper(packagePolicy, 'packages', canonicalName);
|
|
114
114
|
};
|
|
115
115
|
|
|
116
|
-
const validateDependencies = (policy, canonicalName) => {
|
|
117
|
-
const packages = policy.resources[canonicalName].packages;
|
|
118
|
-
if (!packages || isAllowingEverything(packages)) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const packageNames = keys(packages);
|
|
123
|
-
const attenuators = detectAttenuators(policy);
|
|
124
|
-
// Join attenuators with packageNames into a Set to deduplicate and check if all are listed in policy.resources
|
|
125
|
-
const allSpecifiers = new Set([...packageNames, ...attenuators]);
|
|
126
|
-
for (const specifier of allSpecifiers) {
|
|
127
|
-
if (!(specifier in policy.resources)) {
|
|
128
|
-
throw Error(
|
|
129
|
-
`Package ${q(specifier)} is allowed for ${q(
|
|
130
|
-
canonicalName,
|
|
131
|
-
)} to import but its policy is not defined. Please add a policy for ${q(
|
|
132
|
-
specifier,
|
|
133
|
-
)}`,
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
|
|
139
116
|
/**
|
|
140
117
|
* Returns the policy applicable to the canonicalName of the package
|
|
141
118
|
*
|
|
@@ -154,20 +131,14 @@ export const getPolicyForPackage = (namingKit, policy) => {
|
|
|
154
131
|
if (canonicalName === ATTENUATORS_COMPARTMENT) {
|
|
155
132
|
return {
|
|
156
133
|
defaultAttenuator: policy.defaultAttenuator,
|
|
157
|
-
packages:
|
|
158
|
-
packages[specifier] = true;
|
|
159
|
-
return packages;
|
|
160
|
-
}, {}),
|
|
134
|
+
packages: 'any',
|
|
161
135
|
};
|
|
162
136
|
}
|
|
163
|
-
if (policy.resources && policy.resources[canonicalName]) {
|
|
164
|
-
validateDependencies(policy, canonicalName);
|
|
137
|
+
if (policy.resources && policy.resources[canonicalName] !== undefined) {
|
|
165
138
|
return policy.resources[canonicalName];
|
|
166
139
|
} else {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
);
|
|
170
|
-
return undefined;
|
|
140
|
+
// Allow skipping policy entries for packages with no powers.
|
|
141
|
+
return create(null);
|
|
171
142
|
}
|
|
172
143
|
};
|
|
173
144
|
|
|
@@ -357,15 +328,25 @@ export const attenuateGlobals = (
|
|
|
357
328
|
freezeGlobalThisUnlessOptedOut();
|
|
358
329
|
};
|
|
359
330
|
|
|
331
|
+
const diagnoseModulePolicy = errorHint => {
|
|
332
|
+
if (!errorHint) {
|
|
333
|
+
return '';
|
|
334
|
+
}
|
|
335
|
+
return ` (info: ${errorHint})`;
|
|
336
|
+
};
|
|
360
337
|
/**
|
|
361
338
|
* Throws if importing of the specifier is not allowed by the policy
|
|
362
339
|
*
|
|
363
340
|
* @param {string} specifier
|
|
364
|
-
* @param {
|
|
341
|
+
* @param {import('./types.js').CompartmentDescriptor} compartmentDescriptor
|
|
365
342
|
* @param {object} [info]
|
|
366
343
|
*/
|
|
367
|
-
export const enforceModulePolicy = (
|
|
368
|
-
|
|
344
|
+
export const enforceModulePolicy = (
|
|
345
|
+
specifier,
|
|
346
|
+
compartmentDescriptor,
|
|
347
|
+
info = {},
|
|
348
|
+
) => {
|
|
349
|
+
const { policy, modules, label } = compartmentDescriptor;
|
|
369
350
|
if (!policy) {
|
|
370
351
|
return;
|
|
371
352
|
}
|
|
@@ -373,9 +354,11 @@ export const enforceModulePolicy = (specifier, compartmentDescriptor, info) => {
|
|
|
373
354
|
if (!info.exit) {
|
|
374
355
|
if (!modules[specifier]) {
|
|
375
356
|
throw Error(
|
|
376
|
-
`Importing ${q(specifier)}
|
|
357
|
+
`Importing ${q(specifier)} in ${q(
|
|
358
|
+
label,
|
|
359
|
+
)} was not allowed by packages policy ${q(
|
|
377
360
|
policy.packages,
|
|
378
|
-
)}`,
|
|
361
|
+
)}${diagnoseModulePolicy(info.errorHint)}`,
|
|
379
362
|
);
|
|
380
363
|
}
|
|
381
364
|
return;
|
|
@@ -385,7 +368,7 @@ export const enforceModulePolicy = (specifier, compartmentDescriptor, info) => {
|
|
|
385
368
|
throw Error(
|
|
386
369
|
`Importing ${q(specifier)} was not allowed by policy builtins:${q(
|
|
387
370
|
policy.builtins,
|
|
388
|
-
)}`,
|
|
371
|
+
)}${diagnoseModulePolicy(info.errorHint)}`,
|
|
389
372
|
);
|
|
390
373
|
}
|
|
391
374
|
};
|
|
@@ -459,61 +442,3 @@ export const attenuateModuleHook = async (
|
|
|
459
442
|
originalModuleRecord,
|
|
460
443
|
});
|
|
461
444
|
};
|
|
462
|
-
|
|
463
|
-
const padDiagnosis = text => ` (${text})`;
|
|
464
|
-
/**
|
|
465
|
-
* Provide dignostic information for a missing compartment error
|
|
466
|
-
*
|
|
467
|
-
* @param {object} args
|
|
468
|
-
* @param {string} args.moduleSpecifier
|
|
469
|
-
* @param {object} args.compartmentDescriptor
|
|
470
|
-
* @param {string} args.foreignModuleSpecifier
|
|
471
|
-
* @param {string} args.foreignCompartmentName
|
|
472
|
-
* @returns {string}
|
|
473
|
-
*/
|
|
474
|
-
export const diagnoseMissingCompartmentError = ({
|
|
475
|
-
moduleSpecifier,
|
|
476
|
-
compartmentDescriptor,
|
|
477
|
-
foreignModuleSpecifier,
|
|
478
|
-
foreignCompartmentName,
|
|
479
|
-
}) => {
|
|
480
|
-
const { policy, name, scopes } = compartmentDescriptor;
|
|
481
|
-
|
|
482
|
-
if (policy) {
|
|
483
|
-
if (!policy.packages) {
|
|
484
|
-
return padDiagnosis(
|
|
485
|
-
`There were no allowed packages specified in policy for ${q(name)}`,
|
|
486
|
-
);
|
|
487
|
-
}
|
|
488
|
-
if (name === ATTENUATORS_COMPARTMENT) {
|
|
489
|
-
return padDiagnosis(
|
|
490
|
-
`Attenuator ${q(
|
|
491
|
-
moduleSpecifier,
|
|
492
|
-
)} was imported but there is no policy resources entry defined for it.`,
|
|
493
|
-
);
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
const scopeNames = entries(scopes)
|
|
497
|
-
.filter(([_name, scope]) => scope.compartment === foreignCompartmentName)
|
|
498
|
-
.map(([scopeName]) => scopeName);
|
|
499
|
-
if (scopeNames.length === 1 && scopeNames[0] === moduleSpecifier) {
|
|
500
|
-
return padDiagnosis(
|
|
501
|
-
`Package ${q(
|
|
502
|
-
moduleSpecifier,
|
|
503
|
-
)} is missing. Are you sure there is an entry in policy resources specified for it?`,
|
|
504
|
-
);
|
|
505
|
-
} else {
|
|
506
|
-
return padDiagnosis(
|
|
507
|
-
`Package ${q(moduleSpecifier)} resolves to ${q(
|
|
508
|
-
foreignModuleSpecifier,
|
|
509
|
-
)} in ${q(
|
|
510
|
-
foreignCompartmentName,
|
|
511
|
-
)} which seems disallowed by policy. There is likely an override defined that causes another package to be imported as ${q(
|
|
512
|
-
moduleSpecifier,
|
|
513
|
-
)}.`,
|
|
514
|
-
);
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
// Omit diagnostics when parent package had no policy - it means there was no policy.
|
|
518
|
-
return '';
|
|
519
|
-
};
|
package/src/types.d.ts
CHANGED
|
@@ -107,7 +107,7 @@ export type MaybeReadFn = (location: string) => Promise<Uint8Array | undefined>;
|
|
|
107
107
|
* Must return the given logical location if the real location does not exist.
|
|
108
108
|
*/
|
|
109
109
|
export type CanonicalFn = (location: string) => Promise<string>;
|
|
110
|
-
export type HashFn = (bytes: Uint8Array) => string;
|
|
110
|
+
export type HashFn = (bytes: string | Uint8Array) => string;
|
|
111
111
|
export type Application = {
|
|
112
112
|
import: ExecuteFn;
|
|
113
113
|
sha512?: string | undefined;
|
package/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.js"],"names":[],"mappings":"oCAKc,OAAO,KAAK,EAAE,qBAAqB;8CACnC,OAAO,KAAK,EAAE,+BAA+B;yBAC7C,OAAO,KAAK,EAAE,UAAU;+BACxB,OAAO,KAAK,EAAE,gBAAgB;wBAC9B,OAAO,KAAK,EAAE,SAAS;;;;;;UAWvB,MAAM,MAAM,CAAC;WACb,eAAe;kBACf,OAAO,MAAM,EAAE,qBAAqB,CAAC;;;;;;;iBAQrC,MAAM;YACN,MAAM;;;;;;;;WASN,MAAM;;;;;;;;;;;UAGN,MAAM;cAGN,MAAM;;;;;;;aAIN,OAAO,MAAM,EAAE,gBAAgB,CAAC;YAChC,OAAO,MAAM,EAAE,eAAe,CAAC;;;;aAC/B,OAAO,MAAM,EAAE,QAAQ,CAAC;;;;WACxB,OAAO,MAAM,EAAE,QAAQ,CAAC;;;;YACxB,MAAM;;;;;;;kBAQN,MAAM;;;;;;;;;;;;;;;;;;;iBAiBN,MAAM;;;uBAKP,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,cAAc;;WAS1E,OAAO;cACP,UAAU;;iCAKb,MAAM,SACN,UAAU,KACR,QAAQ,IAAI,CAAC;;UAKZ,MAAM;;gCAKT,MAAM,KACJ,QAAQ,UAAU,CAAC;;;;qCAOrB,MAAM,KACJ,QAAQ,UAAU,GAAG,SAAS,CAAC;;;;;;qCASjC,MAAM,KACJ,QAAQ,MAAM,CAAC;6BAKjB,UAAU,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.js"],"names":[],"mappings":"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"}
|