@forgeax/engine-pack 0.1.3 → 0.1.6

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.
Files changed (95) hide show
  1. package/README.md +52 -4
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/owner-chain.integration.test.d.ts +2 -0
  4. package/dist/__tests__/owner-chain.integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/package-finalizer.contract.test.d.ts +2 -0
  6. package/dist/__tests__/package-finalizer.contract.test.d.ts.map +1 -0
  7. package/dist/__tests__/runtime.browser.test.d.ts +2 -0
  8. package/dist/__tests__/runtime.browser.test.d.ts.map +1 -0
  9. package/dist/__tests__/scanner-inventory.contract.test.d.ts +2 -0
  10. package/dist/__tests__/scanner-inventory.contract.test.d.ts.map +1 -0
  11. package/dist/artifact-path.mjs +53 -0
  12. package/dist/artifact-path.mjs.map +1 -0
  13. package/dist/atlas/shelf-pack.d.ts.map +1 -1
  14. package/dist/build.d.ts +19 -0
  15. package/dist/build.d.ts.map +1 -0
  16. package/dist/build.mjs +10168 -0
  17. package/dist/build.mjs.map +1 -0
  18. package/dist/builtin.d.ts +20 -0
  19. package/dist/builtin.d.ts.map +1 -1
  20. package/dist/builtin.mjs +141 -0
  21. package/dist/builtin.mjs.map +1 -0
  22. package/dist/catalog-builder.d.ts +43 -0
  23. package/dist/catalog-builder.d.ts.map +1 -0
  24. package/dist/catalog-delta.d.ts +11 -0
  25. package/dist/catalog-delta.d.ts.map +1 -0
  26. package/dist/catalog-projection.d.ts +91 -0
  27. package/dist/catalog-projection.d.ts.map +1 -0
  28. package/dist/cli-asset.mjs +231 -484
  29. package/dist/cli-asset.mjs.map +1 -1
  30. package/dist/index.mjs +83 -1
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/material-cook.d.ts +2 -0
  33. package/dist/material-cook.d.ts.map +1 -0
  34. package/dist/material-cook.mjs +193 -0
  35. package/dist/material-cook.mjs.map +1 -0
  36. package/dist/mesh-bin-contract.mjs +96 -0
  37. package/dist/mesh-bin-contract.mjs.map +1 -0
  38. package/dist/native-cooker-registry.d.ts +19 -0
  39. package/dist/native-cooker-registry.d.ts.map +1 -1
  40. package/dist/native-cooker.mjs +37 -0
  41. package/dist/native-cooker.mjs.map +1 -1
  42. package/dist/package-finalizer.d.ts +121 -0
  43. package/dist/package-finalizer.d.ts.map +1 -0
  44. package/dist/resolve-asset-source.d.ts.map +1 -1
  45. package/dist/resolve-asset-source.mjs +16 -6
  46. package/dist/resolve-asset-source.mjs.map +1 -1
  47. package/dist/runtime-publication.d.ts +44 -0
  48. package/dist/runtime-publication.d.ts.map +1 -0
  49. package/dist/runtime.d.ts +8 -0
  50. package/dist/runtime.d.ts.map +1 -0
  51. package/dist/runtime.mjs +7261 -0
  52. package/dist/runtime.mjs.map +1 -0
  53. package/dist/scanner.d.ts +87 -54
  54. package/dist/scanner.d.ts.map +1 -1
  55. package/dist/scanner.mjs +258 -454
  56. package/dist/scanner.mjs.map +1 -1
  57. package/dist/scriptable-pack-node.d.ts +3 -8
  58. package/dist/scriptable-pack-node.d.ts.map +1 -1
  59. package/dist/scriptable-pack-node.mjs +93 -9
  60. package/dist/scriptable-pack-node.mjs.map +1 -1
  61. package/dist/scriptable-pack-worker.mjs +1 -0
  62. package/dist/scriptable-pack-worker.mjs.map +1 -1
  63. package/dist/scriptable-pack.d.ts +33 -0
  64. package/dist/scriptable-pack.d.ts.map +1 -1
  65. package/dist/scriptable-pack.mjs +91 -2
  66. package/dist/scriptable-pack.mjs.map +1 -1
  67. package/dist/topology.d.ts +1 -1
  68. package/dist/topology.d.ts.map +1 -1
  69. package/package.json +27 -2
  70. package/src/__tests__/mesh-bin-consumer-surface.unit.test.ts +2 -1
  71. package/src/__tests__/owner-chain.integration.test.ts +78 -0
  72. package/src/__tests__/package-finalizer.contract.test.ts +105 -0
  73. package/src/__tests__/runtime.browser.test.ts +15 -0
  74. package/src/__tests__/scanner-inventory.contract.test.ts +167 -0
  75. package/src/__tests__/scanner-inventory.test.ts +16 -12
  76. package/src/__tests__/scriptable-pack.unit.test.ts +42 -0
  77. package/src/atlas/shelf-pack.ts +20 -24
  78. package/src/build.ts +139 -0
  79. package/src/builtin.ts +38 -0
  80. package/src/catalog-builder.ts +313 -0
  81. package/src/catalog-delta.ts +189 -0
  82. package/src/catalog-projection.ts +344 -0
  83. package/src/cli-asset.ts +1 -5
  84. package/src/index.ts +2 -2
  85. package/src/material-cook.ts +13 -0
  86. package/src/native-cooker-registry.ts +72 -0
  87. package/src/package-finalizer.ts +394 -0
  88. package/src/resolve-asset-source.ts +2 -7
  89. package/src/runtime-publication.ts +190 -0
  90. package/src/runtime.ts +23 -0
  91. package/src/scanner.ts +289 -290
  92. package/src/scriptable-pack-node.ts +27 -23
  93. package/src/scriptable-pack-worker.ts +2 -0
  94. package/src/scriptable-pack.ts +123 -1
  95. package/src/topology.ts +2 -1
@@ -1,6 +1,6 @@
1
1
  import type { Result } from '@forgeax/engine-types';
2
2
  import { type ProducerSemanticIdentityInput } from './evidence/source-inventory.js';
3
- import { type ScriptablePackAssetKind, type ScriptablePackAuthoringPort, type ScriptablePackDefinition, type ScriptablePackError } from './scriptable-pack.js';
3
+ import { type ScriptablePackAssetKind, type ScriptablePackAuthoringPort, type ScriptablePackDefinition, type ScriptablePackError, type ScriptablePackSourceClosureEntry } from './scriptable-pack.js';
4
4
  export interface ScriptablePackModuleExecutor {
5
5
  load(sourcePath: string): Promise<unknown>;
6
6
  dispose?(reason: 'complete' | 'timeout' | 'failure'): void | Promise<void>;
@@ -23,13 +23,6 @@ export declare function readOptionalBuildCache<T>(cache: OptionalBuildCache<T>):
23
23
  readonly value: T;
24
24
  readonly fromCache: boolean;
25
25
  }>;
26
- /** Serializable source-closure evidence shared by scanner and producer paths. */
27
- export interface ScriptablePackSourceClosureEntry {
28
- readonly path: string;
29
- readonly digest: string;
30
- }
31
- /** Inventory a ScriptablePack module without importing or executing it. */
32
- export declare function inventoryScriptablePackSource(sourcePath: string): Promise<readonly ScriptablePackSourceClosureEntry[]>;
33
26
  export interface LoadScriptablePackOptions {
34
27
  /** Maximum time allowed for module initialization in the isolated worker. */
35
28
  readonly timeoutMs?: number;
@@ -39,6 +32,8 @@ export interface LoadScriptablePackOptions {
39
32
  /** Release the isolated loader after identity projection when build will not be called. */
40
33
  readonly metadataOnly?: boolean;
41
34
  }
35
+ /** Capture one immutable ScriptablePack module closure for inventory and production. */
36
+ export declare function inventoryScriptablePackSource(sourcePath: string, initialSourceText?: string): Promise<readonly ScriptablePackSourceClosureEntry[]>;
42
37
  export declare function createScriptablePackModuleExecutorPool(options?: ScriptablePackModuleExecutorPoolOptions): ScriptablePackModuleExecutorPool;
43
38
  export declare function loadScriptablePack(sourcePath: string, options?: LoadScriptablePackOptions): Promise<Result<Readonly<ScriptablePackDefinition>, ScriptablePackError>>;
44
39
  interface CanonicalOutput {
@@ -1 +1 @@
1
- {"version":3,"file":"scriptable-pack-node.d.ts","sourceRoot":"","sources":["../src/scriptable-pack-node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scriptable-pack-node.d.ts","sourceRoot":"","sources":["../src/scriptable-pack-node.ts"],"names":[],"mappings":"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"}
@@ -116,6 +116,22 @@ var SCRIPTABLE_PACK_ASSET_KINDS = [
116
116
  function isScriptablePackAssetKind(value) {
117
117
  return SCRIPTABLE_PACK_ASSET_KINDS.includes(value);
118
118
  }
119
+ function sceneComponentFieldType(value) {
120
+ if (typeof value === "string") return value;
121
+ if (isRecord(value) && typeof value.type === "string") return value.type;
122
+ return void 0;
123
+ }
124
+ function projectScriptablePackSceneComponents(components) {
125
+ return (components ?? []).map((component) => ({
126
+ name: component.name,
127
+ fields: Object.fromEntries(
128
+ Object.entries(component.fields).map(([fieldName, field]) => [
129
+ fieldName,
130
+ sceneComponentFieldType(field)
131
+ ])
132
+ )
133
+ }));
134
+ }
119
135
  var SCRIPTABLE_PACK_REQUEST_ID_SCHEMA = {
120
136
  type: "string",
121
137
  minLength: 1,
@@ -341,11 +357,20 @@ function freezeDefinition(definition) {
341
357
  guid.slice()
342
358
  ])
343
359
  );
360
+ const sceneComponents = definition.sceneComponents === void 0 ? void 0 : Object.freeze(
361
+ projectScriptablePackSceneComponents(definition.sceneComponents).map(
362
+ (component) => Object.freeze({
363
+ ...component,
364
+ fields: Object.freeze({ ...component.fields })
365
+ })
366
+ )
367
+ );
344
368
  return Object.freeze({
345
369
  ...definition,
346
370
  packageId: definition.packageId.slice(),
347
371
  assets: Object.freeze(assets),
348
- externalAssets: Object.freeze(externalAssets)
372
+ externalAssets: Object.freeze(externalAssets),
373
+ ...sceneComponents === void 0 ? {} : { sceneComponents }
349
374
  });
350
375
  }
351
376
  function validateScriptablePackDefinition(value, sourcePath) {
@@ -376,6 +401,63 @@ function validateScriptablePackDefinition(value, sourcePath) {
376
401
  sourcePath
377
402
  );
378
403
  }
404
+ if (value.sceneComponents !== void 0) {
405
+ if (!Array.isArray(value.sceneComponents)) {
406
+ return invalid(
407
+ "$.sceneComponents",
408
+ "an array of component tokens or neutral schema rows when present",
409
+ value.sceneComponents,
410
+ sourcePath
411
+ );
412
+ }
413
+ const componentNames = /* @__PURE__ */ new Set();
414
+ for (const [componentIndex, component] of value.sceneComponents.entries()) {
415
+ if (!isRecord(component)) {
416
+ return invalid(
417
+ `$.sceneComponents[${componentIndex}]`,
418
+ "a component token or neutral schema row",
419
+ component,
420
+ sourcePath
421
+ );
422
+ }
423
+ if (typeof component.name !== "string" || component.name.trim().length === 0) {
424
+ return invalid(
425
+ `$.sceneComponents[${componentIndex}].name`,
426
+ "a non-empty component name",
427
+ component.name,
428
+ sourcePath
429
+ );
430
+ }
431
+ if (componentNames.has(component.name)) {
432
+ return invalid(
433
+ `$.sceneComponents[${componentIndex}].name`,
434
+ "component names to be unique within one ScriptablePack",
435
+ component.name,
436
+ sourcePath
437
+ );
438
+ }
439
+ componentNames.add(component.name);
440
+ if (!isRecord(component.fields)) {
441
+ return invalid(
442
+ `$.sceneComponents[${componentIndex}].fields`,
443
+ "a field-name to schema-type object",
444
+ component.fields,
445
+ sourcePath
446
+ );
447
+ }
448
+ for (const [fieldName, field] of Object.entries(component.fields)) {
449
+ const type = sceneComponentFieldType(field);
450
+ if (fieldName.trim().length === 0 || type === void 0 || type.trim().length === 0) {
451
+ return invalid(
452
+ `$.sceneComponents[${componentIndex}].fields`,
453
+ "field names with non-empty string schema types",
454
+ field,
455
+ sourcePath
456
+ );
457
+ }
458
+ }
459
+ }
460
+ }
379
461
  if (typeof value.build !== "function") {
380
462
  return invalid("$.build", "a build(assetReader) function", value.build, sourcePath);
381
463
  }
@@ -527,7 +609,7 @@ async function readOptionalBuildCache(cache) {
527
609
  }
528
610
  return { value: await cache.coldCook(), fromCache: false };
529
611
  }
530
- async function resolveRelativeSourceImport(sourcePath, specifier) {
612
+ async function resolveRelativeImport(sourcePath, specifier) {
531
613
  if (!specifier.startsWith(".")) return void 0;
532
614
  const raw = resolve(dirname(sourcePath), specifier);
533
615
  const candidates = extname(raw).length > 0 ? [raw] : [
@@ -548,19 +630,20 @@ async function resolveRelativeSourceImport(sourcePath, specifier) {
548
630
  }
549
631
  return void 0;
550
632
  }
551
- async function inventoryScriptablePackSource(sourcePath) {
552
- const pending = [await realpath(sourcePath)];
633
+ async function inventoryScriptablePackSource(sourcePath, initialSourceText) {
634
+ const root = await realpath(sourcePath);
635
+ const pending = [root];
553
636
  const seen = /* @__PURE__ */ new Set();
554
637
  const entries = [];
555
638
  while (pending.length > 0) {
556
639
  const path = pending.pop();
557
640
  if (path === void 0 || seen.has(path)) continue;
558
641
  seen.add(path);
559
- const bytes = await readFile(path);
642
+ const bytes = path === root && initialSourceText !== void 0 ? new TextEncoder().encode(initialSourceText) : await readFile(path);
560
643
  entries.push({ path, digest: `sha256:${createHash("sha256").update(bytes).digest("hex")}` });
561
- const imports = ts.preProcessFile(new TextDecoder().decode(bytes), true, true).importedFiles;
562
- for (const imported of imports) {
563
- const resolved = await resolveRelativeSourceImport(path, imported.fileName);
644
+ const source = new TextDecoder().decode(bytes);
645
+ for (const imported of ts.preProcessFile(source, true, true).importedFiles) {
646
+ const resolved = await resolveRelativeImport(path, imported.fileName);
564
647
  if (resolved !== void 0) pending.push(await realpath(resolved));
565
648
  }
566
649
  }
@@ -634,6 +717,7 @@ var WorkerScriptablePackExecutor = class {
634
717
  if (message === null || typeof message !== "object") return;
635
718
  const value = message;
636
719
  if (value.kind === "loaded") {
720
+ worker.unref();
637
721
  worker.off("message", onMessage);
638
722
  resolveLoad({
639
723
  default: value.definition === void 0 ? void 0 : {
@@ -1207,7 +1291,7 @@ export default {
1207
1291
  ${manifest.name === void 0 ? "" : `name: ${JSON.stringify(manifest.name)},
1208
1292
  `}assets,
1209
1293
  externalAssets,
1210
- build: () => ok(Object.fromEntries(Object.entries(assets).map(([sourceKey, asset]) => [sourceKey, createOutput(asset.kind)])) as never),
1294
+ build: () => ok(Object.fromEntries(Object.entries(assets).map(([sourceKey, asset]) => [sourceKey, createOutput(asset.kind)])) as Record<string, Asset>),
1211
1295
  } satisfies ScriptablePackDefinition;
1212
1296
  `;
1213
1297
  }