diff --git a/packages/ses/src/get-anonymous-intrinsics.js b/packages/ses/src/get-anonymous-intrinsics.js index f7fcd37118..1dc66f9825 100644 --- a/packages/ses/src/get-anonymous-intrinsics.js +++ b/packages/ses/src/get-anonymous-intrinsics.js @@ -161,5 +161,19 @@ export const getAnonymousIntrinsics = () => { ); } + if (globalThis.ModuleSource) { + const AbstractModuleSourcePrototype = getPrototypeOf( + globalThis.ModuleSource.prototype, + ); + intrinsics['%AbstractModuleSourcePrototype%'] = + AbstractModuleSourcePrototype; + intrinsics['%AbstractModuleSource%'] = + AbstractModuleSourcePrototype.constructor; + } + + if (globalThis.ModuleSource) { + intrinsics['%ModuleSourcePrototype%'] = globalThis.ModuleSource.prototype; + } + return intrinsics; }; diff --git a/packages/ses/src/permits-intrinsics.js b/packages/ses/src/permits-intrinsics.js index 03f7fe2250..aefef597ce 100644 --- a/packages/ses/src/permits-intrinsics.js +++ b/packages/ses/src/permits-intrinsics.js @@ -212,7 +212,9 @@ export default function whitelistIntrinsics( } } - throw TypeError(`Unexpected whitelist permit ${permit} at ${path}`); + throw TypeError( + `Unexpected property ${prop} with permit ${permit} at ${path}`, + ); } /* diff --git a/packages/ses/src/permits.js b/packages/ses/src/permits.js index 585d3c0c3f..6915f081f4 100644 --- a/packages/ses/src/permits.js +++ b/packages/ses/src/permits.js @@ -101,8 +101,12 @@ export const universalPropertyNames = { // ESNext + // https://github.com/tc39/proposal-source-phase-imports?tab=readme-ov-file#js-module-source + ModuleSource: 'ModuleSource', + lockdown: 'lockdown', harden: 'harden', + HandledPromise: 'HandledPromise', // TODO: Until Promise.delegate (see below). }; @@ -1505,6 +1509,25 @@ export const permitted = { resolve: fn, }, + // https://github.com/tc39/proposal-source-phase-imports?tab=readme-ov-file#js-module-source + '%AbstractModuleSourcePrototype%': { + '@@toStringTag': getter, + constructor: '%AbstractModuleSource%', + }, + '%AbstractModuleSource%': { + '[[Proto]]': '%FunctionPrototype%', + prototype: '%AbstractModuleSourcePrototype%', + }, + '%ModuleSourcePrototype%': { + '[[Proto]]': '%AbstractModuleSourcePrototype%', + '@@toStringTag': getter, + constructor: 'ModuleSource', + }, + ModuleSource: { + '[[Proto]]': '%FunctionPrototype%', + prototype: '%ModuleSourcePrototype%', + }, + Promise: { // Properties of the Promise Constructor '[[Proto]]': '%FunctionPrototype%', diff --git a/packages/ses/test/module-source.test.js b/packages/ses/test/module-source.test.js index dfdd0c2772..69a2504faf 100644 --- a/packages/ses/test/module-source.test.js +++ b/packages/ses/test/module-source.test.js @@ -47,4 +47,5 @@ test('module source constructor', t => { test('ModuleSource is a shared intrinsic', t => { t.truthy(ModuleSource === new Compartment().globalThis.ModuleSource); + t.truthy(Object.isFrozen(ModuleSource)); });