@poe-platform/safe-js 0.1.376 → 0.1.378

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.
@@ -7225,230 +7225,50 @@ function serializedDateTime(value) {
7225
7225
  // packages/safe-js/src/interp/internal-symbols.ts
7226
7226
  var internalSymbols = /* @__PURE__ */ new Set();
7227
7227
 
7228
- // packages/safe-js/src/interp/accessors.ts
7229
- var accessorClosures = /* @__PURE__ */ new WeakMap();
7230
- var getterAdapters = /* @__PURE__ */ new WeakMap();
7231
- var setterAdapters = /* @__PURE__ */ new WeakMap();
7232
- function accessorAdapter(closure, kind) {
7233
- if (kind === "get") {
7234
- let adapter2 = getterAdapters.get(closure);
7235
- if (adapter2 === void 0) {
7236
- adapter2 = () => void 0;
7237
- getterAdapters.set(closure, adapter2);
7238
- accessorClosures.set(adapter2, closure);
7239
- }
7240
- return adapter2;
7241
- }
7242
- let adapter = setterAdapters.get(closure);
7243
- if (adapter === void 0) {
7244
- adapter = () => {
7245
- throw new TypeError("Accessor writes require sandbox execution.");
7246
- };
7247
- setterAdapters.set(closure, adapter);
7248
- accessorClosures.set(adapter, closure);
7228
+ // packages/safe-js/src/interp/arguments.ts
7229
+ var sandboxArgumentsBrand = /* @__PURE__ */ Symbol("SandboxArguments");
7230
+ internalSymbols.add(sandboxArgumentsBrand);
7231
+ function createSandboxArguments(values) {
7232
+ const result = /* @__PURE__ */ (function() {
7233
+ return arguments;
7234
+ })();
7235
+ for (let index = 0; index < values.length; index += 1) {
7236
+ result[index] = values[index];
7249
7237
  }
7250
- return adapter;
7238
+ result.length = values.length;
7239
+ Object.defineProperty(result, sandboxArgumentsBrand, { value: true });
7240
+ return result;
7251
7241
  }
7252
- function accessorClosure(adapter) {
7253
- if (adapter === void 0) return void 0;
7254
- const closure = accessorClosures.get(adapter);
7255
- if (closure === void 0) throw new TypeError("Native accessors cannot execute in the sandbox.");
7256
- return closure;
7242
+ function isSandboxArguments(value) {
7243
+ return typeof value === "object" && value !== null && Object.hasOwn(value, sandboxArgumentsBrand);
7257
7244
  }
7258
- function retainedAccessorClosures(descriptor) {
7259
- const closures = [];
7260
- for (const adapter of [descriptor.get, descriptor.set]) {
7261
- const closure = adapter === void 0 ? void 0 : accessorClosures.get(adapter);
7262
- if (closure !== void 0) closures.push(closure);
7263
- }
7264
- return closures;
7245
+ function getSandboxArgumentEntries(value) {
7246
+ return Object.entries(Object.getOwnPropertyDescriptors(value)).flatMap(
7247
+ ([key, descriptor]) => "value" in descriptor ? [[key, descriptor.value]] : []
7248
+ );
7265
7249
  }
7266
- function readPropertyDescriptor(descriptor, receiver, context, allowNativeGetter = false) {
7267
- if ("value" in descriptor) return descriptor.value;
7268
- if (descriptor.get === void 0) return void 0;
7269
- const getter = accessorClosures.get(descriptor.get);
7270
- if (getter === void 0) {
7271
- if (!allowNativeGetter) throw new TypeError("Native accessors cannot execute in the sandbox.");
7272
- return Reflect.apply(descriptor.get, receiver, []);
7250
+ function copySandboxArgumentProperties(source, target, copyValue) {
7251
+ const names = Object.getOwnPropertyNames(source);
7252
+ if (!names.includes("length") || names.indexOf("length") > names.indexOf("callee")) {
7253
+ Reflect.deleteProperty(target, "length");
7273
7254
  }
7274
- if (context?.invokeClosure === void 0)
7275
- throw new TypeError("Accessor reads require sandbox execution.");
7276
- return context.invokeClosure(getter, [], receiver);
7277
- }
7278
- function writePropertyDescriptor(descriptor, receiver, value, context) {
7279
- const setter = accessorClosure(descriptor.set);
7280
- if (setter === void 0) throw new TypeError("Cannot assign to a getter-only property.");
7281
- if (context?.invokeClosure === void 0)
7282
- throw new TypeError("Accessor writes require sandbox execution.");
7283
- return context.invokeClosure(setter, [value], receiver).then(() => void 0);
7284
- }
7285
-
7286
- // packages/safe-js/src/interp/symbols.ts
7287
- var wellKnownSymbols = Object.freeze({
7288
- iterator: Symbol.iterator,
7289
- asyncIterator: Symbol.asyncIterator,
7290
- hasInstance: Symbol.hasInstance,
7291
- isConcatSpreadable: Symbol.isConcatSpreadable,
7292
- match: Symbol.match,
7293
- matchAll: Symbol.matchAll,
7294
- replace: Symbol.replace,
7295
- search: Symbol.search,
7296
- species: Symbol.species,
7297
- split: Symbol.split,
7298
- toPrimitive: Symbol.toPrimitive,
7299
- toStringTag: Symbol.toStringTag,
7300
- unscopables: Symbol.unscopables
7301
- });
7302
-
7303
- // packages/safe-js/src/interp/intrinsics.ts
7304
- var identities = /* @__PURE__ */ new WeakMap();
7305
- var realms2 = /* @__PURE__ */ new WeakMap();
7306
- function registerBuiltinIdentities(budget, bindings) {
7307
- let realm = realms2.get(budget);
7308
- if (realm === void 0) realms2.set(budget, realm = /* @__PURE__ */ new Map());
7309
- const pending = Object.entries(bindings).map(([name, value]) => [[name], value]);
7310
- const visited = /* @__PURE__ */ new WeakSet();
7311
- for (let index = 0; index < pending.length; index++) {
7312
- const [path, value] = pending[index];
7313
- if (value === null || typeof value !== "object") continue;
7314
- const id = JSON.stringify(path);
7315
- const previous = realm.get(id);
7316
- if (previous !== void 0 && previous !== value)
7317
- throw new TypeError(`Duplicate intrinsic identity: ${id}`);
7318
- realm.set(id, value);
7319
- if (!identities.has(value)) identities.set(value, id);
7320
- if (visited.has(value)) continue;
7321
- visited.add(value);
7322
- const owner = isSandboxClosure(value) ? value.properties : value;
7323
- if (owner === void 0) continue;
7324
- for (const key of Reflect.ownKeys(owner)) {
7325
- if (typeof key === "symbol" && internalSymbols.has(key)) continue;
7326
- const descriptor = Object.getOwnPropertyDescriptor(owner, key);
7327
- const symbolName = typeof key === "symbol" ? Object.entries(wellKnownSymbols).find(([, symbol]) => symbol === key)?.[0] : void 0;
7328
- if (typeof key === "symbol" && symbolName === void 0)
7329
- throw new TypeError("Intrinsic symbol keys must be well-known symbols.");
7330
- const member = [...path, typeof key === "string" ? key : { symbol: symbolName }];
7331
- if ("value" in descriptor) pending.push([member, descriptor.value]);
7332
- for (const kind of ["get", "set"]) {
7333
- const closure = accessorClosure(descriptor[kind]);
7334
- if (closure !== void 0) pending.push([[...member, kind], closure]);
7335
- }
7255
+ for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(source))) {
7256
+ if (!("value" in descriptor)) {
7257
+ if (key !== "callee") throw new TypeError(`Cannot copy arguments accessor '${key}'.`);
7258
+ continue;
7336
7259
  }
7260
+ Object.defineProperty(target, key, { ...descriptor, value: copyValue(descriptor.value, key) });
7337
7261
  }
7338
- }
7339
- function getIntrinsicIdentity(value) {
7340
- return identities.get(value);
7341
- }
7342
- function resolveIntrinsicIdentity(budget, id) {
7343
- const value = realms2.get(budget)?.get(id);
7344
- if (value === void 0) throw new TypeError(`Unknown intrinsic identity: ${id}`);
7345
- return value;
7346
- }
7347
- function listIntrinsicIdentities(budget) {
7348
- return [...realms2.get(budget)?.keys() ?? []];
7349
- }
7350
- function releaseIntrinsicIdentities(budget) {
7351
- realms2.delete(budget);
7352
- }
7353
-
7354
- // packages/safe-js/src/interp/generator-properties.ts
7355
- var generatorGuestProperties = /* @__PURE__ */ new WeakMap();
7356
- function getGeneratorProperties(value) {
7357
- let properties = generatorGuestProperties.get(value);
7358
- if (properties === void 0) {
7359
- properties = /* @__PURE__ */ Object.create(null);
7360
- generatorGuestProperties.set(value, properties);
7361
- }
7362
- return properties;
7363
- }
7364
-
7365
- // packages/safe-js/src/interp/regexp-properties.ts
7366
- var regexGuestProperties = /* @__PURE__ */ new WeakMap();
7367
- function getRegexProperties(value) {
7368
- const properties = regexGuestProperties.get(value);
7369
- if (properties === void 0) throw new TypeError("Invalid sandbox RegExp storage.");
7370
- return properties;
7371
- }
7372
-
7373
- // packages/safe-js/src/interp/collection-properties.ts
7374
- var collectionGuestProperties = /* @__PURE__ */ new WeakMap();
7375
- function getCollectionProperties(value) {
7376
- const properties = collectionGuestProperties.get(value);
7377
- if (properties === void 0) throw new TypeError("Invalid sandbox collection storage.");
7378
- return properties;
7379
- }
7380
- function copyCollectionProperties(source, target, encode) {
7381
- const properties = collectionGuestProperties.get(source) ?? source;
7382
- for (const key of Reflect.ownKeys(properties)) {
7383
- const descriptor = Object.getOwnPropertyDescriptor(properties, key);
7384
- if (!("value" in descriptor)) throw new TypeError("Collection accessor properties cannot be copied as data.");
7385
- Object.defineProperty(target, key, { ...descriptor, value: encode(descriptor.value) });
7386
- }
7387
- if (!Object.isExtensible(properties)) Object.preventExtensions(target);
7388
- }
7389
-
7390
- // packages/safe-js/src/interp/resources.ts
7391
- import { AsyncLocalStorage } from "node:async_hooks";
7392
- var runResources = new AsyncLocalStorage();
7393
- function retainValues(budget, values) {
7394
- const retained = {};
7395
- budget.setRetainedValues(retained, values);
7396
- const pending = runResources.getStore()?.referenceReleases;
7397
- const release = () => {
7398
- budget.setRetainedValues(retained, void 0);
7399
- pending?.delete(release);
7400
- };
7401
- pending?.add(release);
7402
- return release;
7403
- }
7404
- async function withRunResources(signal, execute) {
7405
- const controller = new AbortController();
7406
- const cancel = () => controller.abort(signal?.reason);
7407
- const cleanups = /* @__PURE__ */ new Set();
7408
- const resources = {
7409
- signal: controller.signal,
7410
- referenceReleases: /* @__PURE__ */ new Set(),
7411
- add(close) {
7412
- cleanups.add(close);
7262
+ const iterator = Object.getOwnPropertyDescriptor(source, Symbol.iterator);
7263
+ if (iterator === void 0) {
7264
+ Reflect.deleteProperty(target, Symbol.iterator);
7265
+ } else {
7266
+ if (iterator.value !== Array.prototype.values) {
7267
+ throw new TypeError("Cannot copy a replaced arguments iterator.");
7413
7268
  }
7414
- };
7415
- signal?.addEventListener("abort", cancel, { once: true });
7416
- if (signal?.aborted) cancel();
7417
- let result;
7418
- let failure;
7419
- let errors = [];
7420
- try {
7421
- result = await runResources.run(resources, execute);
7422
- } catch (error) {
7423
- failure = { reason: error };
7424
- } finally {
7425
- signal?.removeEventListener("abort", cancel);
7426
- controller.abort(new Error("SafeJS run finished."));
7427
- for (const release of resources.referenceReleases) release();
7428
- resources.referenceReleases.clear();
7429
- const outcomes = await Promise.allSettled(
7430
- [...cleanups].map((close) => Promise.resolve().then(close))
7431
- );
7432
- errors = outcomes.flatMap((outcome) => outcome.status === "rejected" ? [outcome.reason] : []);
7269
+ Object.defineProperty(target, Symbol.iterator, iterator);
7433
7270
  }
7434
- if (failure !== void 0) throw failure.reason;
7435
- if (errors.length > 0) throw new AggregateError(errors, "SafeJS resource cleanup failed.");
7436
- return result;
7437
- }
7438
-
7439
- // packages/safe-js/src/interp/error-prototypes.ts
7440
- var errorPrototypes = /* @__PURE__ */ new WeakMap();
7441
-
7442
- // packages/safe-js/src/interp/collection-brands.ts
7443
- var sandboxMapBrand = /* @__PURE__ */ Symbol("SandboxMap");
7444
- var sandboxSetBrand = /* @__PURE__ */ Symbol("SandboxSet");
7445
- internalSymbols.add(sandboxMapBrand);
7446
- internalSymbols.add(sandboxSetBrand);
7447
- function isSandboxMap(value) {
7448
- return typeof value === "object" && value !== null && sandboxMapBrand in value;
7449
- }
7450
- function isSandboxSet(value) {
7451
- return typeof value === "object" && value !== null && sandboxSetBrand in value;
7271
+ if (!Object.isExtensible(source)) Object.preventExtensions(target);
7452
7272
  }
7453
7273
 
7454
7274
  // packages/safe-js/src/interp/collection-iterator.ts
@@ -7545,50 +7365,16 @@ function regexpIteratorState(value) {
7545
7365
  return state;
7546
7366
  }
7547
7367
 
7548
- // packages/safe-js/src/interp/arguments.ts
7549
- var sandboxArgumentsBrand = /* @__PURE__ */ Symbol("SandboxArguments");
7550
- internalSymbols.add(sandboxArgumentsBrand);
7551
- function createSandboxArguments(values) {
7552
- const result = /* @__PURE__ */ (function() {
7553
- return arguments;
7554
- })();
7555
- for (let index = 0; index < values.length; index += 1) {
7556
- result[index] = values[index];
7557
- }
7558
- result.length = values.length;
7559
- Object.defineProperty(result, sandboxArgumentsBrand, { value: true });
7560
- return result;
7561
- }
7562
- function isSandboxArguments(value) {
7563
- return typeof value === "object" && value !== null && Object.hasOwn(value, sandboxArgumentsBrand);
7564
- }
7565
- function getSandboxArgumentEntries(value) {
7566
- return Object.entries(Object.getOwnPropertyDescriptors(value)).flatMap(
7567
- ([key, descriptor]) => "value" in descriptor ? [[key, descriptor.value]] : []
7568
- );
7368
+ // packages/safe-js/src/interp/collection-brands.ts
7369
+ var sandboxMapBrand = /* @__PURE__ */ Symbol("SandboxMap");
7370
+ var sandboxSetBrand = /* @__PURE__ */ Symbol("SandboxSet");
7371
+ internalSymbols.add(sandboxMapBrand);
7372
+ internalSymbols.add(sandboxSetBrand);
7373
+ function isSandboxMap(value) {
7374
+ return typeof value === "object" && value !== null && sandboxMapBrand in value;
7569
7375
  }
7570
- function copySandboxArgumentProperties(source, target, copyValue) {
7571
- const names = Object.getOwnPropertyNames(source);
7572
- if (!names.includes("length") || names.indexOf("length") > names.indexOf("callee")) {
7573
- Reflect.deleteProperty(target, "length");
7574
- }
7575
- for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(source))) {
7576
- if (!("value" in descriptor)) {
7577
- if (key !== "callee") throw new TypeError(`Cannot copy arguments accessor '${key}'.`);
7578
- continue;
7579
- }
7580
- Object.defineProperty(target, key, { ...descriptor, value: copyValue(descriptor.value, key) });
7581
- }
7582
- const iterator = Object.getOwnPropertyDescriptor(source, Symbol.iterator);
7583
- if (iterator === void 0) {
7584
- Reflect.deleteProperty(target, Symbol.iterator);
7585
- } else {
7586
- if (iterator.value !== Array.prototype.values) {
7587
- throw new TypeError("Cannot copy a replaced arguments iterator.");
7588
- }
7589
- Object.defineProperty(target, Symbol.iterator, iterator);
7590
- }
7591
- if (!Object.isExtensible(source)) Object.preventExtensions(target);
7376
+ function isSandboxSet(value) {
7377
+ return typeof value === "object" && value !== null && sandboxSetBrand in value;
7592
7378
  }
7593
7379
 
7594
7380
  // packages/safe-js/src/interp/boxed.ts
@@ -7640,6 +7426,25 @@ function boxedDataProperties(value, includeSymbols = false) {
7640
7426
  });
7641
7427
  }
7642
7428
 
7429
+ // packages/safe-js/src/interp/regexp-properties.ts
7430
+ var regexGuestProperties = /* @__PURE__ */ new WeakMap();
7431
+ function getRegexProperties(value) {
7432
+ const properties = regexGuestProperties.get(value);
7433
+ if (properties === void 0) throw new TypeError("Invalid sandbox RegExp storage.");
7434
+ return properties;
7435
+ }
7436
+
7437
+ // packages/safe-js/src/interp/generator-properties.ts
7438
+ var generatorGuestProperties = /* @__PURE__ */ new WeakMap();
7439
+ function getGeneratorProperties(value) {
7440
+ let properties = generatorGuestProperties.get(value);
7441
+ if (properties === void 0) {
7442
+ properties = /* @__PURE__ */ Object.create(null);
7443
+ generatorGuestProperties.set(value, properties);
7444
+ }
7445
+ return properties;
7446
+ }
7447
+
7643
7448
  // packages/safe-js/src/graph-depth.ts
7644
7449
  var MAX_DATA_DEPTH = 1024;
7645
7450
  var SnapshotBudgetError = class extends Error {
@@ -7733,6 +7538,181 @@ function graphEntries(value) {
7733
7538
  // packages/safe-js/src/interp/generator-prototypes.ts
7734
7539
  var generatorPrototypes = /* @__PURE__ */ new WeakMap();
7735
7540
 
7541
+ // packages/safe-js/src/interp/resources.ts
7542
+ import { AsyncLocalStorage } from "node:async_hooks";
7543
+ var runResources = new AsyncLocalStorage();
7544
+ function retainValues(budget, values) {
7545
+ const retained = {};
7546
+ budget.setRetainedValues(retained, values);
7547
+ const pending = runResources.getStore()?.referenceReleases;
7548
+ const release = () => {
7549
+ budget.setRetainedValues(retained, void 0);
7550
+ pending?.delete(release);
7551
+ };
7552
+ pending?.add(release);
7553
+ return release;
7554
+ }
7555
+ async function withRunResources(signal, execute) {
7556
+ const controller = new AbortController();
7557
+ const cancel = () => controller.abort(signal?.reason);
7558
+ const cleanups = /* @__PURE__ */ new Set();
7559
+ const resources = {
7560
+ signal: controller.signal,
7561
+ referenceReleases: /* @__PURE__ */ new Set(),
7562
+ add(close) {
7563
+ cleanups.add(close);
7564
+ }
7565
+ };
7566
+ signal?.addEventListener("abort", cancel, { once: true });
7567
+ if (signal?.aborted) cancel();
7568
+ let result;
7569
+ let failure;
7570
+ let errors = [];
7571
+ try {
7572
+ result = await runResources.run(resources, execute);
7573
+ } catch (error) {
7574
+ failure = { reason: error };
7575
+ } finally {
7576
+ signal?.removeEventListener("abort", cancel);
7577
+ controller.abort(new Error("SafeJS run finished."));
7578
+ for (const release of resources.referenceReleases) release();
7579
+ resources.referenceReleases.clear();
7580
+ const outcomes = await Promise.allSettled(
7581
+ [...cleanups].map((close) => Promise.resolve().then(close))
7582
+ );
7583
+ errors = outcomes.flatMap((outcome) => outcome.status === "rejected" ? [outcome.reason] : []);
7584
+ }
7585
+ if (failure !== void 0) throw failure.reason;
7586
+ if (errors.length > 0) throw new AggregateError(errors, "SafeJS resource cleanup failed.");
7587
+ return result;
7588
+ }
7589
+
7590
+ // packages/safe-js/src/interp/accessors.ts
7591
+ var accessorClosures = /* @__PURE__ */ new WeakMap();
7592
+ var getterAdapters = /* @__PURE__ */ new WeakMap();
7593
+ var setterAdapters = /* @__PURE__ */ new WeakMap();
7594
+ function accessorAdapter(closure, kind) {
7595
+ if (kind === "get") {
7596
+ let adapter2 = getterAdapters.get(closure);
7597
+ if (adapter2 === void 0) {
7598
+ adapter2 = () => void 0;
7599
+ getterAdapters.set(closure, adapter2);
7600
+ accessorClosures.set(adapter2, closure);
7601
+ }
7602
+ return adapter2;
7603
+ }
7604
+ let adapter = setterAdapters.get(closure);
7605
+ if (adapter === void 0) {
7606
+ adapter = () => {
7607
+ throw new TypeError("Accessor writes require sandbox execution.");
7608
+ };
7609
+ setterAdapters.set(closure, adapter);
7610
+ accessorClosures.set(adapter, closure);
7611
+ }
7612
+ return adapter;
7613
+ }
7614
+ function accessorClosure(adapter) {
7615
+ if (adapter === void 0) return void 0;
7616
+ const closure = accessorClosures.get(adapter);
7617
+ if (closure === void 0) throw new TypeError("Native accessors cannot execute in the sandbox.");
7618
+ return closure;
7619
+ }
7620
+ function retainedAccessorClosures(descriptor) {
7621
+ const closures = [];
7622
+ for (const adapter of [descriptor.get, descriptor.set]) {
7623
+ const closure = adapter === void 0 ? void 0 : accessorClosures.get(adapter);
7624
+ if (closure !== void 0) closures.push(closure);
7625
+ }
7626
+ return closures;
7627
+ }
7628
+ function readPropertyDescriptor(descriptor, receiver, context, allowNativeGetter = false) {
7629
+ if ("value" in descriptor) return descriptor.value;
7630
+ if (descriptor.get === void 0) return void 0;
7631
+ const getter = accessorClosures.get(descriptor.get);
7632
+ if (getter === void 0) {
7633
+ if (!allowNativeGetter) throw new TypeError("Native accessors cannot execute in the sandbox.");
7634
+ return Reflect.apply(descriptor.get, receiver, []);
7635
+ }
7636
+ if (context?.invokeClosure === void 0)
7637
+ throw new TypeError("Accessor reads require sandbox execution.");
7638
+ return context.invokeClosure(getter, [], receiver);
7639
+ }
7640
+ function writePropertyDescriptor(descriptor, receiver, value, context) {
7641
+ const setter = accessorClosure(descriptor.set);
7642
+ if (setter === void 0) throw new TypeError("Cannot assign to a getter-only property.");
7643
+ if (context?.invokeClosure === void 0)
7644
+ throw new TypeError("Accessor writes require sandbox execution.");
7645
+ return context.invokeClosure(setter, [value], receiver).then(() => void 0);
7646
+ }
7647
+
7648
+ // packages/safe-js/src/interp/symbols.ts
7649
+ var wellKnownSymbols = Object.freeze({
7650
+ iterator: Symbol.iterator,
7651
+ asyncIterator: Symbol.asyncIterator,
7652
+ hasInstance: Symbol.hasInstance,
7653
+ isConcatSpreadable: Symbol.isConcatSpreadable,
7654
+ match: Symbol.match,
7655
+ matchAll: Symbol.matchAll,
7656
+ replace: Symbol.replace,
7657
+ search: Symbol.search,
7658
+ species: Symbol.species,
7659
+ split: Symbol.split,
7660
+ toPrimitive: Symbol.toPrimitive,
7661
+ toStringTag: Symbol.toStringTag,
7662
+ unscopables: Symbol.unscopables
7663
+ });
7664
+
7665
+ // packages/safe-js/src/interp/intrinsics.ts
7666
+ var identities = /* @__PURE__ */ new WeakMap();
7667
+ var realms2 = /* @__PURE__ */ new WeakMap();
7668
+ function registerBuiltinIdentities(budget, bindings) {
7669
+ let realm = realms2.get(budget);
7670
+ if (realm === void 0) realms2.set(budget, realm = /* @__PURE__ */ new Map());
7671
+ const pending = Object.entries(bindings).map(([name, value]) => [[name], value]);
7672
+ const visited = /* @__PURE__ */ new WeakSet();
7673
+ for (let index = 0; index < pending.length; index++) {
7674
+ const [path, value] = pending[index];
7675
+ if (value === null || typeof value !== "object") continue;
7676
+ const id = JSON.stringify(path);
7677
+ const previous = realm.get(id);
7678
+ if (previous !== void 0 && previous !== value)
7679
+ throw new TypeError(`Duplicate intrinsic identity: ${id}`);
7680
+ realm.set(id, value);
7681
+ if (!identities.has(value)) identities.set(value, id);
7682
+ if (visited.has(value)) continue;
7683
+ visited.add(value);
7684
+ const owner = isSandboxClosure(value) ? value.properties : value;
7685
+ if (owner === void 0) continue;
7686
+ for (const key of Reflect.ownKeys(owner)) {
7687
+ if (typeof key === "symbol" && internalSymbols.has(key)) continue;
7688
+ const descriptor = Object.getOwnPropertyDescriptor(owner, key);
7689
+ const symbolName = typeof key === "symbol" ? Object.entries(wellKnownSymbols).find(([, symbol]) => symbol === key)?.[0] : void 0;
7690
+ if (typeof key === "symbol" && symbolName === void 0)
7691
+ throw new TypeError("Intrinsic symbol keys must be well-known symbols.");
7692
+ const member = [...path, typeof key === "string" ? key : { symbol: symbolName }];
7693
+ if ("value" in descriptor) pending.push([member, descriptor.value]);
7694
+ for (const kind of ["get", "set"]) {
7695
+ const closure = accessorClosure(descriptor[kind]);
7696
+ if (closure !== void 0) pending.push([[...member, kind], closure]);
7697
+ }
7698
+ }
7699
+ }
7700
+ }
7701
+ function getIntrinsicIdentity(value) {
7702
+ return identities.get(value);
7703
+ }
7704
+ function resolveIntrinsicIdentity(budget, id) {
7705
+ const value = realms2.get(budget)?.get(id);
7706
+ if (value === void 0) throw new TypeError(`Unknown intrinsic identity: ${id}`);
7707
+ return value;
7708
+ }
7709
+ function listIntrinsicIdentities(budget) {
7710
+ return [...realms2.get(budget)?.keys() ?? []];
7711
+ }
7712
+ function releaseIntrinsicIdentities(budget) {
7713
+ realms2.delete(budget);
7714
+ }
7715
+
7736
7716
  // packages/safe-js/src/interp/host-capabilities.ts
7737
7717
  import { types as types6 } from "node:util";
7738
7718
  var MAX_INDEXED_LENGTH = 65536;
@@ -8077,6 +8057,9 @@ function namedKeys(state) {
8077
8057
  });
8078
8058
  }
8079
8059
 
8060
+ // packages/safe-js/src/interp/error-prototypes.ts
8061
+ var errorPrototypes = /* @__PURE__ */ new WeakMap();
8062
+
8080
8063
  // packages/safe-js/src/interp/typed-array-prototypes.ts
8081
8064
  var typedArrayPrototypes = /* @__PURE__ */ new WeakMap();
8082
8065
 
@@ -8475,6 +8458,51 @@ function hasGuestObjectState(value) {
8475
8458
  );
8476
8459
  }
8477
8460
 
8461
+ // packages/safe-js/src/interp/module-namespace.ts
8462
+ var namespaces = /* @__PURE__ */ new WeakSet();
8463
+ function isSandboxModuleNamespace(value) {
8464
+ return value !== null && typeof value === "object" && namespaces.has(value);
8465
+ }
8466
+ function createModuleNamespace(bindings) {
8467
+ const target = /* @__PURE__ */ Object.create(null);
8468
+ const namespace = new Proxy(target, {
8469
+ ownKeys: (owner) => [...Object.getOwnPropertyNames(owner).sort(), ...Object.getOwnPropertySymbols(owner)],
8470
+ set: () => false,
8471
+ defineProperty(owner, key, descriptor) {
8472
+ if (typeof key === "symbol") return Reflect.defineProperty(owner, key, descriptor);
8473
+ const current = Object.getOwnPropertyDescriptor(owner, key);
8474
+ if (current === void 0 || descriptor.configurable === true || descriptor.enumerable === false || "get" in descriptor || "set" in descriptor || descriptor.writable === false) return false;
8475
+ return !("value" in descriptor) || Object.is(descriptor.value, current.value);
8476
+ }
8477
+ });
8478
+ namespaces.add(namespace);
8479
+ const entries = typeof bindings === "function" ? bindings(namespace) : bindings;
8480
+ for (const key of Object.keys(entries).sort())
8481
+ Object.defineProperty(target, key, { value: entries[key], writable: true, enumerable: true });
8482
+ Object.defineProperty(target, Symbol.toStringTag, { value: "Module" });
8483
+ Object.preventExtensions(target);
8484
+ markDescriptorObject(namespace);
8485
+ setSandboxPrototype(namespace, null);
8486
+ return namespace;
8487
+ }
8488
+
8489
+ // packages/safe-js/src/interp/collection-properties.ts
8490
+ var collectionGuestProperties = /* @__PURE__ */ new WeakMap();
8491
+ function getCollectionProperties(value) {
8492
+ const properties = collectionGuestProperties.get(value);
8493
+ if (properties === void 0) throw new TypeError("Invalid sandbox collection storage.");
8494
+ return properties;
8495
+ }
8496
+ function copyCollectionProperties(source, target, encode) {
8497
+ const properties = collectionGuestProperties.get(source) ?? source;
8498
+ for (const key of Reflect.ownKeys(properties)) {
8499
+ const descriptor = Object.getOwnPropertyDescriptor(properties, key);
8500
+ if (!("value" in descriptor)) throw new TypeError("Collection accessor properties cannot be copied as data.");
8501
+ Object.defineProperty(target, key, { ...descriptor, value: encode(descriptor.value) });
8502
+ }
8503
+ if (!Object.isExtensible(properties)) Object.preventExtensions(target);
8504
+ }
8505
+
8478
8506
  // packages/safe-js/src/interp/raw-json.ts
8479
8507
  var rawJsonValues = /* @__PURE__ */ new WeakSet();
8480
8508
  function createRawJson(text) {
@@ -19383,6 +19411,7 @@ function setSandboxProperty(target, property, value, budget, checkInherited = tr
19383
19411
  return;
19384
19412
  }
19385
19413
  const prototypeOwner = target;
19414
+ if (isSandboxModuleNamespace(target)) throw new TypeError("Cannot assign to a module namespace.");
19386
19415
  if (checkInherited) {
19387
19416
  const descriptor2 = getSandboxPropertyDescriptor(target, property, budget);
19388
19417
  if (descriptor2 !== void 0 && !("value" in descriptor2))
@@ -19422,6 +19451,7 @@ function setSandboxProperty(target, property, value, budget, checkInherited = tr
19422
19451
  for (let prototype = getSandboxPrototype(prototypeOwner, budget); prototype !== null; prototype = getSandboxPrototype(prototype, budget)) {
19423
19452
  budget.visitNode();
19424
19453
  assertSandboxDataDepth(depth++);
19454
+ if (isSandboxModuleNamespace(prototype)) throw new TypeError("Cannot assign through a module namespace.");
19425
19455
  const properties = isSandboxGenerator(prototype) ? getGeneratorProperties(prototype) : isSandboxClosure(prototype) ? prototype.properties : prototype;
19426
19456
  const inherited = properties === void 0 ? void 0 : Object.getOwnPropertyDescriptor(properties, key);
19427
19457
  if (inherited === void 0) continue;
@@ -19441,6 +19471,7 @@ function setSuperProperty(base, receiver, key, value, context) {
19441
19471
  for (let current = base; current !== null; current = getSandboxPrototype(current, budget)) {
19442
19472
  budget.visitNode();
19443
19473
  assertSandboxDataDepth(depth++);
19474
+ if (isSandboxModuleNamespace(current)) throw new TypeError("Cannot assign through a module namespace.");
19444
19475
  const properties = isSandboxGenerator(current) ? getGeneratorProperties(current) : isSandboxClosure(current) ? current.properties : current;
19445
19476
  const descriptor = properties === void 0 ? void 0 : Object.getOwnPropertyDescriptor(properties, key);
19446
19477
  if (descriptor === void 0) continue;
@@ -21879,6 +21910,8 @@ function serializeCollectionProperties(value, encode, dataOnly = false) {
21879
21910
 
21880
21911
  // packages/safe-js/src/snapshot/guest-heap.ts
21881
21912
  function captureGuestHeapNode(value, encode) {
21913
+ if (isSandboxModuleNamespace(value))
21914
+ return { kind: "module-namespace", entries: Object.keys(value).map((key) => [key, encode(value[key])]) };
21882
21915
  if (isRawJson(value)) return { kind: "raw-json", text: value.rawJSON };
21883
21916
  const intrinsic = getIntrinsicIdentity(value);
21884
21917
  if (intrinsic !== void 0) {
@@ -22896,7 +22929,7 @@ function encodeReplayData(value, options = {}) {
22896
22929
  const id2 = options.identifyPromise?.(entry, path);
22897
22930
  if (typeof id2 === "string" && id2.length > 0) return { tag: "promise-capability", id: id2 };
22898
22931
  }
22899
- if (typeof entry === "object" && entry !== null && hasGuestObjectState(entry)) {
22932
+ if (typeof entry === "object" && entry !== null && hasGuestObjectState(entry) && !isSandboxModuleNamespace(entry)) {
22900
22933
  throw new MissingReplayCapabilityError("Guest function properties and prototype links cannot be serialized.");
22901
22934
  }
22902
22935
  let capabilityId;
@@ -22917,7 +22950,9 @@ function encodeReplayData(value, options = {}) {
22917
22950
  seen.set(entry, id);
22918
22951
  nodes.push(void 0);
22919
22952
  const child = (value2, key) => encode(value2, depth + 1, [...path, key]);
22920
- if (isSandboxClosure(entry)) {
22953
+ if (isSandboxModuleNamespace(entry)) {
22954
+ nodes[id] = { kind: "module-namespace", entries: Object.keys(entry).map((key) => [key, child(entry[key], key)]) };
22955
+ } else if (isSandboxClosure(entry)) {
22921
22956
  nodes[id] = {
22922
22957
  kind: "capability",
22923
22958
  id: capabilityId,
@@ -23126,6 +23161,20 @@ function decodeReplayData(input, options = {}, parent) {
23126
23161
  throw new TypeError("Invalid replay error metadata.");
23127
23162
  }
23128
23163
  const child = (value) => decode(value, depth + 1);
23164
+ if (kind === "module-namespace") {
23165
+ const entries = list(own(node, "entries"));
23166
+ const names = /* @__PURE__ */ new Set();
23167
+ return createModuleNamespace((namespace) => {
23168
+ restored.set(id, namespace);
23169
+ return Object.fromEntries(entries.map((raw) => {
23170
+ const entry2 = list(raw);
23171
+ if (entry2.length !== 2 || typeof entry2[0] !== "string" || names.has(entry2[0]))
23172
+ throw new TypeError("Invalid module namespace export.");
23173
+ names.add(entry2[0]);
23174
+ return [entry2[0], child(entry2[1])];
23175
+ }));
23176
+ });
23177
+ }
23129
23178
  if (kind === "symbol") {
23130
23179
  if (node.description !== void 0 && typeof node.description !== "string") throw new TypeError("Invalid replay symbol description.");
23131
23180
  let symbol;
@@ -26629,6 +26678,7 @@ function createReflectGlobal(budget) {
26629
26678
  for (let current = target; current !== null; current = getSandboxPrototype(current, budget)) {
26630
26679
  budget.visitNode();
26631
26680
  assertSandboxDataDepth(depth++);
26681
+ if (isSandboxModuleNamespace(current)) return false;
26632
26682
  if (isNumericTypedArray(current) && typeof property === "string" && isTypedArrayIndex(property)) {
26633
26683
  if (current === receiver) {
26634
26684
  await setTypedArrayMember(current, property, value, budget, context);
@@ -26773,6 +26823,19 @@ function absent(value) {
26773
26823
  }
26774
26824
  function validateGuestHeapNode(raw, heap, maxArrayLength = 4294967295) {
26775
26825
  const node = record3(raw);
26826
+ if (node.kind === "module-namespace") {
26827
+ fields(node, ["kind", "entries"]);
26828
+ const entries = array(node.entries);
26829
+ if (entries.length > maxArrayLength) throw new TypeError("Module namespace exceeds allocation limit.");
26830
+ const names = /* @__PURE__ */ new Set();
26831
+ for (const rawEntry of entries) {
26832
+ const entry = array(rawEntry);
26833
+ if (entry.length !== 2 || typeof entry[0] !== "string" || names.has(entry[0]))
26834
+ throw new TypeError("Invalid module namespace export.");
26835
+ names.add(entry[0]);
26836
+ }
26837
+ return true;
26838
+ }
26776
26839
  if (node.kind === "raw-json") {
26777
26840
  fields(node, ["kind", "text"]);
26778
26841
  if (typeof node.text !== "string") throw new TypeError("Invalid raw JSON source.");
@@ -28643,7 +28706,7 @@ var structuredCloneErrorNames = ["Error", "EvalError", "RangeError", "ReferenceE
28643
28706
  function* cloneStructuredGraph(value, state, budget, depth = 0) {
28644
28707
  assertSandboxDataDepth(depth);
28645
28708
  budget.visitNode();
28646
- if (typeof value === "symbol" || isSandboxClosure(value) || isSandboxPromise(value) || isSandboxGenerator(value) || isSandboxCollectionIterator(value) || isSandboxRegExpIterator(value) || isSandboxArrayIterator(value) || isSandboxArguments(value))
28709
+ if (typeof value === "symbol" || isSandboxModuleNamespace(value) || isSandboxClosure(value) || isSandboxPromise(value) || isSandboxGenerator(value) || isSandboxCollectionIterator(value) || isSandboxRegExpIterator(value) || isSandboxArrayIterator(value) || isSandboxArguments(value))
28647
28710
  throw new DOMException("Value cannot be structured cloned.", "DataCloneError");
28648
28711
  if (typeof value !== "object" || value === null) return allocateProducedSandboxValue(value, budget);
28649
28712
  if (isLiveCapability(value)) throw new DOMException("Capabilities cannot be structured cloned.", "DataCloneError");
@@ -28747,8 +28810,8 @@ function measureSandboxData(values, options = {}) {
28747
28810
  usage += 1;
28748
28811
  if (!isGuestHostObject(value)) {
28749
28812
  const symbols = Object.getOwnPropertySymbols(value);
28750
- const descriptors3 = symbols.length === 0 ? [] : symbols.filter((key) => !internalSymbols.has(key)).map((key) => [key, Object.getOwnPropertyDescriptor(value, key)]);
28751
- for (const [key, descriptor] of descriptors3) {
28813
+ const descriptors2 = symbols.length === 0 ? [] : symbols.filter((key) => !internalSymbols.has(key)).map((key) => [key, Object.getOwnPropertyDescriptor(value, key)]);
28814
+ for (const [key, descriptor] of descriptors2) {
28752
28815
  usage += 1;
28753
28816
  visit(key, depth + 1);
28754
28817
  if ("value" in descriptor) visit(descriptor.value, depth + 1);
@@ -28792,13 +28855,13 @@ function measureSandboxData(values, options = {}) {
28792
28855
  if (Array.isArray(value)) {
28793
28856
  usage += value.length;
28794
28857
  if (hasManagedDescriptors(value)) {
28795
- const descriptors3 = [];
28858
+ const descriptors2 = [];
28796
28859
  for (const key of Object.getOwnPropertyNames(value)) {
28797
28860
  if (key === "length") continue;
28798
28861
  const descriptor = Object.getOwnPropertyDescriptor(value, key);
28799
- if (descriptor !== void 0) descriptors3.push([key, descriptor]);
28862
+ if (descriptor !== void 0) descriptors2.push([key, descriptor]);
28800
28863
  }
28801
- for (const [key, descriptor] of descriptors3) {
28864
+ for (const [key, descriptor] of descriptors2) {
28802
28865
  usage += key.length + 1;
28803
28866
  if ("value" in descriptor) visit(descriptor.value, depth + 1);
28804
28867
  else for (const closure of retainedAccessorClosures(descriptor)) visit(closure, depth + 1);
@@ -28865,13 +28928,13 @@ function measureSandboxData(values, options = {}) {
28865
28928
  } else visit(value.properties, depth + 1);
28866
28929
  }
28867
28930
  if (!options.ignoreClosureCaptures)
28868
- for (const retained of value[sandboxRetainedValues]?.() ?? []) visit(retained, depth + 1);
28931
+ for (const retained2 of value[sandboxRetainedValues]?.() ?? []) visit(retained2, depth + 1);
28869
28932
  return;
28870
28933
  }
28871
28934
  if (isSandboxGenerator(value)) {
28872
- const descriptors3 = Object.getOwnPropertyDescriptors(getGeneratorProperties(value));
28873
- for (const key of Reflect.ownKeys(descriptors3)) {
28874
- const descriptor = descriptors3[key];
28935
+ const descriptors2 = Object.getOwnPropertyDescriptors(getGeneratorProperties(value));
28936
+ for (const key of Reflect.ownKeys(descriptors2)) {
28937
+ const descriptor = descriptors2[key];
28875
28938
  usage += typeof key === "string" ? key.length + 1 : 1;
28876
28939
  if (typeof key === "symbol") visit(key, depth + 1);
28877
28940
  if ("value" in descriptor) visit(descriptor.value, depth + 1);
@@ -28912,27 +28975,30 @@ function measureSandboxData(values, options = {}) {
28912
28975
  const entries = [];
28913
28976
  for (const key of Object.getOwnPropertyNames(value)) {
28914
28977
  const descriptor = Object.getOwnPropertyDescriptor(value, key);
28915
- const retained = "value" in descriptor ? [descriptor.value] : retainedAccessorClosures(descriptor);
28916
- if (retained.length > 0) entries.push([key, retained]);
28978
+ const retained2 = "value" in descriptor ? [descriptor.value] : retainedAccessorClosures(descriptor);
28979
+ if (retained2.length > 0) entries.push([key, retained2]);
28917
28980
  }
28918
- for (const [key, retained] of entries) {
28981
+ for (const [key, retained2] of entries) {
28919
28982
  usage += 1 + key.length;
28920
- for (const entry of retained) visit(entry, depth + 1);
28983
+ for (const entry of retained2) visit(entry, depth + 1);
28921
28984
  }
28922
28985
  return;
28923
28986
  }
28924
- const descriptors2 = [];
28925
- for (const key of Object.getOwnPropertyNames(value)) {
28926
- const descriptor = Object.getOwnPropertyDescriptor(value, key);
28927
- if (descriptor !== void 0) descriptors2.push([key, descriptor]);
28928
- }
28987
+ const proxyKeys = nodeTypes.isProxy(value) ? Object.getOwnPropertyNames(value) : void 0;
28988
+ const proxyDescriptors = proxyKeys?.map((key) => Object.getOwnPropertyDescriptor(value, key));
28929
28989
  const includeNonEnumerable = isSandboxDate(value) || isSandboxArrayBuffer(value) || isSandboxDataView(value) || sandboxErrorTypes.has(value) || hasManagedDescriptors(value);
28930
- for (const [key, descriptor] of descriptors2) {
28990
+ const keys = proxyKeys ?? (includeNonEnumerable ? Object.getOwnPropertyNames(value) : Object.keys(value));
28991
+ const retained = [];
28992
+ for (let index = 0; index < keys.length; index++) {
28993
+ const key = keys[index];
28994
+ const descriptor = proxyDescriptors === void 0 ? Object.getOwnPropertyDescriptor(value, key) : proxyDescriptors[index];
28995
+ if (descriptor === void 0) continue;
28931
28996
  if (!descriptor.enumerable && !includeNonEnumerable) continue;
28932
28997
  usage += 1 + key.length;
28933
- if ("value" in descriptor) visit(descriptor.value, depth + 1);
28934
- else for (const closure of retainedAccessorClosures(descriptor)) visit(closure, depth + 1);
28998
+ if ("value" in descriptor) retained.push(descriptor.value);
28999
+ else for (const closure of retainedAccessorClosures(descriptor)) retained.push(closure);
28935
29000
  }
29001
+ for (const entry of retained) visit(entry, depth + 1);
28936
29002
  };
28937
29003
  for (const value of values) visit(value);
28938
29004
  return usage;
@@ -28990,6 +29056,8 @@ function copyToSandbox(value, state, path = "<root>", cloneSandboxCollections =
28990
29056
  }
28991
29057
  if (state.structuredClone && nodeTypes.isSymbolObject(value))
28992
29058
  throw new DOMException("Cannot clone a boxed symbol.", "DataCloneError");
29059
+ if (state.structuredClone && isSandboxModuleNamespace(value))
29060
+ throw new DOMException("Cannot clone a module namespace.", "DataCloneError");
28993
29061
  if (isLiveCapability(value)) throw new TypeError("Live capabilities require their owning realm bridge.");
28994
29062
  if (isRawJson(value)) {
28995
29063
  const existing = state.seen.get(value);
@@ -41804,7 +41872,7 @@ function bindImportDeclaration(declaration, registry, wrappedModules, bindings,
41804
41872
  declaration.source.span
41805
41873
  );
41806
41874
  }
41807
- const wrappedExports = wrappedModules.get(moduleName) ?? createBindingRecord(
41875
+ const wrappedExports = wrappedModules.get(moduleName) ?? createModuleNamespace(
41808
41876
  wrapCancelableBindings(
41809
41877
  wrapCallerInjectedBindings(Object.fromEntries(moduleExports), {
41810
41878
  realm: options.realm,
@@ -41881,7 +41949,7 @@ function registerModuleHostOperationPolicies(registry) {
41881
41949
  function normalizeModuleExports(moduleExports) {
41882
41950
  const entries = moduleExports instanceof Map ? [...moduleExports.entries()] : Object.entries(moduleExports);
41883
41951
  return new Map(
41884
- entries.filter(([exportName]) => exportName.length > 0).sort(([left], [right]) => left.localeCompare(right))
41952
+ entries.sort(([left], [right]) => left.localeCompare(right))
41885
41953
  );
41886
41954
  }
41887
41955
  function createBindingRecord(entries) {
@@ -43888,4 +43956,4 @@ export {
43888
43956
  FileSnapshotBackend,
43889
43957
  run
43890
43958
  };
43891
- //# sourceMappingURL=chunk-7UITTELW.js.map
43959
+ //# sourceMappingURL=chunk-RECEBNHR.js.map