create-aura3d 1.4.2 → 1.4.4

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 (78) hide show
  1. package/README.md +2 -2
  2. package/dist/index.d.ts +4 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +3 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/showcase-spec-artifacts.d.ts +5 -0
  7. package/dist/showcase-spec-artifacts.d.ts.map +1 -1
  8. package/dist/showcase-spec-artifacts.js +11 -2
  9. package/dist/showcase-spec-artifacts.js.map +1 -1
  10. package/dist/showcase-spec-asset-pair-composition.d.ts +116 -0
  11. package/dist/showcase-spec-asset-pair-composition.d.ts.map +1 -0
  12. package/dist/showcase-spec-asset-pair-composition.js +336 -0
  13. package/dist/showcase-spec-asset-pair-composition.js.map +1 -0
  14. package/dist/showcase-spec-compiler.d.ts.map +1 -1
  15. package/dist/showcase-spec-compiler.js +149 -10
  16. package/dist/showcase-spec-compiler.js.map +1 -1
  17. package/dist/showcase-spec-composition-evidence.d.ts +14 -0
  18. package/dist/showcase-spec-composition-evidence.d.ts.map +1 -0
  19. package/dist/showcase-spec-composition-evidence.js +123 -0
  20. package/dist/showcase-spec-composition-evidence.js.map +1 -0
  21. package/dist/showcase-spec-evidence.js +50 -1
  22. package/dist/showcase-spec-evidence.js.map +1 -1
  23. package/dist/showcase-spec-game-geometry-extractor.d.ts +4 -2
  24. package/dist/showcase-spec-game-geometry-extractor.d.ts.map +1 -1
  25. package/dist/showcase-spec-game-geometry-extractor.js +248 -26
  26. package/dist/showcase-spec-game-geometry-extractor.js.map +1 -1
  27. package/dist/showcase-spec-game-geometry-probe.d.ts +20 -0
  28. package/dist/showcase-spec-game-geometry-probe.d.ts.map +1 -0
  29. package/dist/showcase-spec-game-geometry-probe.js +16 -0
  30. package/dist/showcase-spec-game-geometry-probe.js.map +1 -0
  31. package/dist/showcase-spec-game-replacement-evidence.js +7 -3
  32. package/dist/showcase-spec-game-replacement-evidence.js.map +1 -1
  33. package/dist/showcase-spec-game-scene-scale.d.ts +10 -0
  34. package/dist/showcase-spec-game-scene-scale.d.ts.map +1 -0
  35. package/dist/showcase-spec-game-scene-scale.js +71 -0
  36. package/dist/showcase-spec-game-scene-scale.js.map +1 -0
  37. package/dist/showcase-spec-game-template-evidence.d.ts +10 -0
  38. package/dist/showcase-spec-game-template-evidence.d.ts.map +1 -1
  39. package/dist/showcase-spec-game-template-evidence.js +48 -5
  40. package/dist/showcase-spec-game-template-evidence.js.map +1 -1
  41. package/dist/showcase-spec-gameplay-evidence.js +4 -3
  42. package/dist/showcase-spec-gameplay-evidence.js.map +1 -1
  43. package/dist/showcase-spec-parser.d.ts.map +1 -1
  44. package/dist/showcase-spec-parser.js +3 -0
  45. package/dist/showcase-spec-parser.js.map +1 -1
  46. package/dist/showcase-spec-platformer-artifacts.d.ts +1 -0
  47. package/dist/showcase-spec-platformer-artifacts.d.ts.map +1 -1
  48. package/dist/showcase-spec-platformer-artifacts.js +164 -43
  49. package/dist/showcase-spec-platformer-artifacts.js.map +1 -1
  50. package/dist/showcase-spec-racing-artifacts.d.ts +1 -0
  51. package/dist/showcase-spec-racing-artifacts.d.ts.map +1 -1
  52. package/dist/showcase-spec-racing-artifacts.js +203 -31
  53. package/dist/showcase-spec-racing-artifacts.js.map +1 -1
  54. package/dist/showcase-spec-replacement-candidates.js +2 -1
  55. package/dist/showcase-spec-replacement-candidates.js.map +1 -1
  56. package/dist/showcase-spec-types.d.ts +22 -0
  57. package/dist/showcase-spec-types.d.ts.map +1 -1
  58. package/package.json +3 -3
  59. package/templates/animation-channel/package.json +1 -1
  60. package/templates/animation-studio/package.json +5 -5
  61. package/templates/character-controller/package.json +3 -3
  62. package/templates/cinematic-scene/package.json +1 -1
  63. package/templates/episode-builder/package.json +1 -1
  64. package/templates/falling-blocks-starter/package.json +1 -1
  65. package/templates/fighting-game/package.json +1 -1
  66. package/templates/mini-game/package.json +1 -1
  67. package/templates/product-viewer/package.json +1 -1
  68. package/templates/prompt-animation-channel/package.json +1 -1
  69. package/templates/racing-starter/package.json +1 -1
  70. package/templates/racing-starter/src/main.ts +1 -1
  71. package/templates/three-compat-architecture-interior/package.json +1 -1
  72. package/templates/three-compat-asset-inspector/package.json +1 -1
  73. package/templates/three-compat-character-viewer/package.json +1 -1
  74. package/templates/three-compat-custom-threejs-migration/package.json +1 -1
  75. package/templates/three-compat-large-scene/package.json +1 -1
  76. package/templates/three-compat-material-authoring/package.json +1 -1
  77. package/templates/three-compat-postprocess-scene/package.json +1 -1
  78. package/templates/three-compat-premium-product-viewer/package.json +1 -1
package/README.md CHANGED
@@ -40,8 +40,8 @@ npx create-aura3d@latest --help
40
40
  code renders `model(assets.product)` instead of guessed URLs or string IDs.
41
41
  - **AI output stays maintainable.** Coding agents can generate scenes while
42
42
  developers keep normal TypeScript, package scripts, and browser tests.
43
- - **Proof is part of the starter.** Route-health, screenshot, gameplay, or
44
- template checks are included where the template needs them.
43
+ - **Proof is part of the starter.** Route-health, screenshot, gameplay, composition, generated geometry-contract, or template checks are included where the template needs them.
44
+ - **Game routes fail closed.** Public racing/platformer generation uses certified assets and compiler-emitted geometry contracts rather than guessed route-local rectangles or centerlines.
45
45
  - **Static deploys are first-class.** Build output is a browser app you can
46
46
  deploy like any Vite project.
47
47
 
package/dist/index.d.ts CHANGED
@@ -13,4 +13,8 @@ export interface CreateA3DProjectResult {
13
13
  }
14
14
  export declare function createA3DProject(options: CreateA3DProjectOptions): CreateA3DProjectResult;
15
15
  export declare function writeCreateA3DReport(path: string, result: CreateA3DProjectResult): void;
16
+ export { probeShowcaseGameGeometry, type ShowcaseGameGeometryCategory, type ShowcaseGameGeometryProbeResult } from "./showcase-spec-game-geometry-probe.js";
17
+ export type { ExtractOptions as ShowcaseGameGeometryExtractOptions, GeometryExtractionFailure as ShowcaseGameGeometryExtractionFailure, GeometryExtractionResult as ShowcaseGameGeometryExtractionResult, GeometryExtractionSuccess as ShowcaseGameGeometryExtractionSuccess } from "./showcase-spec-game-geometry-extractor.js";
18
+ export type { ShowcasePlatformerPlayableSurfaceMap, ShowcaseRacingTrackTopology } from "./showcase-spec-types.js";
19
+ export { SHOWCASE_ASSET_PAIR_COMPOSITION_THRESHOLDS, validateShowcaseAssetPairComposition, validateShowcaseAssetPairCompositionFromDisk, type ShowcaseAssetPairCompositionCategory, type ShowcaseAssetPairCompositionCheck, type ShowcaseAssetPairCompositionInput, type ShowcaseAssetPairCompositionReport, type ValidateShowcaseAssetPairCompositionFromDiskOptions } from "./showcase-spec-asset-pair-composition.js";
16
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB,kgBAoB1B,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CA6BzF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAGvF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB,kgBAoB1B,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CA6BzF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAGvF;AA0BD,OAAO,EACL,yBAAyB,EACzB,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACrC,MAAM,wCAAwC,CAAC;AAChD,YAAY,EACV,cAAc,IAAI,kCAAkC,EACpD,yBAAyB,IAAI,qCAAqC,EAClE,wBAAwB,IAAI,oCAAoC,EAChE,yBAAyB,IAAI,qCAAqC,EACnE,MAAM,4CAA4C,CAAC;AACpD,YAAY,EACV,oCAAoC,EACpC,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,0CAA0C,EAC1C,oCAAoC,EACpC,4CAA4C,EAC5C,KAAK,oCAAoC,EACzC,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,kCAAkC,EACvC,KAAK,mDAAmD,EACzD,MAAM,2CAA2C,CAAC"}
package/dist/index.js CHANGED
@@ -41,7 +41,7 @@ export function createA3DProject(options) {
41
41
  const packageJson = JSON.parse(readFileSync(packagePath, "utf8"));
42
42
  packageJson.dependencies = {
43
43
  ...(packageJson.dependencies ?? {}),
44
- "@aura3d/engine": options.packageVersion ?? packageJson.dependencies?.["@aura3d/engine"] ?? "1.4.2"
44
+ "@aura3d/engine": options.packageVersion ?? packageJson.dependencies?.["@aura3d/engine"] ?? "1.4.4"
45
45
  };
46
46
  writeFileSync(packagePath, `${JSON.stringify(packageJson, null, 2)}\n`);
47
47
  return {
@@ -80,4 +80,6 @@ function findDefaultTemplateRoot() {
80
80
  }
81
81
  return process.cwd();
82
82
  }
83
+ export { probeShowcaseGameGeometry } from "./showcase-spec-game-geometry-probe.js";
84
+ export { SHOWCASE_ASSET_PAIR_COMPOSITION_THRESHOLDS, validateShowcaseAssetPairComposition, validateShowcaseAssetPairCompositionFromDisk } from "./showcase-spec-asset-pair-composition.js";
83
85
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { ShowcaseCategoryPlan, ShowcaseSpec, ShowcaseSpecFinalStatus } from "./showcase-spec-types.js";
2
2
  export declare function createRouteSource(spec: ShowcaseSpec): string;
3
+ export declare function createRouteArtifacts(spec: ShowcaseSpec): Readonly<Record<string, string>>;
3
4
  export declare function createReadme(spec: ShowcaseSpec, finalStatus: ShowcaseSpecFinalStatus, blockers: readonly string[]): string;
4
5
  export declare function createRouteHealth(spec: ShowcaseSpec, finalStatus: ShowcaseSpecFinalStatus, blockers: readonly string[]): {
5
6
  categoryPlan?: ShowcaseCategoryPlan | undefined;
@@ -12,6 +13,7 @@ export declare function createRouteHealth(spec: ShowcaseSpec, finalStatus: Showc
12
13
  routePrimaryProbe: string | undefined;
13
14
  screenshotSha256: string | undefined;
14
15
  geometryEvidence: import("./showcase-spec-types.js").ShowcaseGameGeometryEvidence | undefined;
16
+ compositionReport: string | undefined;
15
17
  verdict: import("./showcase-spec-types.js").ShowcaseGameAssetPairEvidenceVerdict;
16
18
  notes: string;
17
19
  blockers: readonly string[];
@@ -49,6 +51,7 @@ export declare function createRouteHealth(spec: ShowcaseSpec, finalStatus: Showc
49
51
  blockers: readonly string[];
50
52
  evidence: {
51
53
  releaseAssetProbes?: Readonly<Record<string, string>> | undefined;
54
+ visualReviewPassed?: boolean | undefined;
52
55
  gameplayPassed?: boolean | undefined;
53
56
  gameplayProof?: string | undefined;
54
57
  global: string;
@@ -98,6 +101,8 @@ export declare function createEvidenceChecklist(spec: ShowcaseSpec, finalStatus:
98
101
  readonly routePrimaryPassed: boolean;
99
102
  readonly gameplayProof?: string;
100
103
  readonly gameplayPassed?: boolean;
104
+ readonly visualReviewPassed?: boolean;
105
+ readonly assetPairCompositionReport?: string;
101
106
  readonly releaseAssetProbes?: Readonly<Record<string, string>>;
102
107
  };
103
108
  capabilities: readonly import("./showcase-spec-types.js").ShowcaseSpecCapability[];
@@ -1 +1 @@
1
- {"version":3,"file":"showcase-spec-artifacts.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-artifacts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EACpB,YAAY,EAEZ,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAM5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE1H;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CtH;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB;;;;;;;;;;;;;;;;;EAiB5F;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;EAa5H"}
1
+ {"version":3,"file":"showcase-spec-artifacts.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-artifacts.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,oBAAoB,EACpB,YAAY,EAEZ,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAM5D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAMzF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE1H;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CtH;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB;;;;;;;;;;;;;;;;;EAiB5F;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;EAa5H"}
@@ -1,6 +1,6 @@
1
1
  import { cameraForCategoryPlan } from "./showcase-spec-category-plan.js";
2
- import { createPlatformerRouteSource } from "./showcase-spec-platformer-artifacts.js";
3
- import { createRacingRouteSource } from "./showcase-spec-racing-artifacts.js";
2
+ import { createPlatformerGeometryContractSource, createPlatformerRouteSource } from "./showcase-spec-platformer-artifacts.js";
3
+ import { createRacingGeometryContractSource, createRacingRouteSource } from "./showcase-spec-racing-artifacts.js";
4
4
  export function createRouteSource(spec) {
5
5
  if (spec.platformer)
6
6
  return createPlatformerRouteSource(spec, spec.platformer);
@@ -11,6 +11,13 @@ export function createRouteSource(spec) {
11
11
  const heroAsset = requireAsset(spec, spec.layout.heroAsset);
12
12
  return createBasicRouteSource(spec, heroAsset);
13
13
  }
14
+ export function createRouteArtifacts(spec) {
15
+ return {
16
+ "src/main.ts": createRouteSource(spec),
17
+ ...(spec.platformer ? { "src/generated/game-geometry.ts": createPlatformerGeometryContractSource(spec, spec.platformer) } : {}),
18
+ ...(spec.racing ? { "src/generated/game-geometry.ts": createRacingGeometryContractSource(spec, spec.racing) } : {})
19
+ };
20
+ }
14
21
  export function createReadme(spec, finalStatus, blockers) {
15
22
  return `# ${spec.label}\n\nStatus: ${finalStatus}\n\nClaim label: ${spec.claimLabel}\n\nPrimary asset: ${spec.layout.heroAsset}\n\n${blockers.length === 0 ? "Release evidence is present for this bounded generated route." : `Blocked by:\n${blockers.map((blocker) => `- ${blocker}`).join("\n")}`}\n`;
16
23
  }
@@ -107,6 +114,7 @@ function createRouteHealthEvidence(spec) {
107
114
  routePrimaryPassed: spec.evidence.routePrimaryPassed,
108
115
  ...("gameplayProof" in spec.evidence ? { gameplayProof: spec.evidence.gameplayProof } : {}),
109
116
  ...("gameplayPassed" in spec.evidence ? { gameplayPassed: spec.evidence.gameplayPassed } : {}),
117
+ ...("visualReviewPassed" in spec.evidence ? { visualReviewPassed: spec.evidence.visualReviewPassed } : {}),
110
118
  ...("releaseAssetProbes" in spec.evidence ? { releaseAssetProbes: spec.evidence.releaseAssetProbes } : {})
111
119
  };
112
120
  }
@@ -121,6 +129,7 @@ function createGameAssetPairRouteHealth(spec) {
121
129
  routePrimaryProbe: assetPairEvidence.routePrimaryProbe,
122
130
  screenshotSha256: assetPairEvidence.screenshotSha256,
123
131
  geometryEvidence: assetPairEvidence.geometryEvidence,
132
+ compositionReport: assetPairEvidence.compositionReport,
124
133
  verdict: assetPairEvidence.verdict,
125
134
  notes: assetPairEvidence.notes,
126
135
  blockers: assetPairEvidence.blockers
@@ -1 +1 @@
1
- {"version":3,"file":"showcase-spec-artifacts.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-artifacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"showcase-spec-artifacts.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ export type ShowcaseAssetPairCompositionCategory = "racing" | "platformer";
2
+ export type ShowcaseAssetPairCompositionCheckId = "binding-overlap" | "contact" | "camera-readability" | "scale-contract" | "debug-guide-absence";
3
+ export interface ShowcaseCompositionRect {
4
+ readonly x: number;
5
+ readonly y: number;
6
+ readonly width: number;
7
+ readonly height: number;
8
+ }
9
+ export interface ShowcaseAssetPairCompositionThresholds {
10
+ readonly minBindingOverlapRatio: number;
11
+ readonly maxContactOffsetRatio: number;
12
+ readonly maxScreenContactDistanceRatio: number;
13
+ readonly minPlaySpaceAreaRatio: number;
14
+ readonly maxPlaySpaceAreaRatio: number;
15
+ readonly minSubjectWorldRatio: number;
16
+ readonly maxSubjectWorldRatio: number;
17
+ readonly maxPlatformerScaleDelta: number;
18
+ }
19
+ export declare const SHOWCASE_ASSET_PAIR_COMPOSITION_THRESHOLDS: ShowcaseAssetPairCompositionThresholds;
20
+ export interface ShowcaseAssetPairCompositionInput {
21
+ readonly routeId: string;
22
+ readonly category: ShowcaseAssetPairCompositionCategory;
23
+ readonly screenshot: {
24
+ readonly path: string;
25
+ readonly sha256: string;
26
+ readonly width: number;
27
+ readonly height: number;
28
+ readonly crop: ShowcaseCompositionRect;
29
+ readonly foregroundBounds: ShowcaseCompositionRect;
30
+ readonly foregroundClipped: boolean;
31
+ readonly subjectBounds: ShowcaseCompositionRect;
32
+ readonly subjectClipped: boolean;
33
+ readonly projectedPlaySpaceBounds: ShowcaseCompositionRect;
34
+ readonly projectedContactPoint: {
35
+ readonly x: number;
36
+ readonly y: number;
37
+ };
38
+ readonly projectedSubjectHeight?: number;
39
+ };
40
+ readonly assets: readonly {
41
+ readonly id: string;
42
+ readonly manifestHash: string;
43
+ readonly evidenceHash: string;
44
+ }[];
45
+ readonly geometry: {
46
+ readonly report: string;
47
+ readonly assetId: string;
48
+ readonly assetHash: string;
49
+ readonly source: string;
50
+ readonly modelAnchorCount: number;
51
+ };
52
+ readonly sceneBinding: {
53
+ readonly assetHash: string;
54
+ readonly geometryBinding: string;
55
+ readonly overlay: string;
56
+ readonly averageBindingError: number;
57
+ readonly modelPresentationOffset: {
58
+ readonly x: number;
59
+ readonly y: number;
60
+ readonly z: number;
61
+ };
62
+ };
63
+ readonly contact: {
64
+ readonly proven: boolean;
65
+ readonly normalizedOffset: number;
66
+ };
67
+ readonly camera: {
68
+ readonly mode: string;
69
+ readonly followsSubject: boolean;
70
+ };
71
+ readonly scale: {
72
+ readonly characterScaleRatio?: number;
73
+ readonly projectedTargetHeight?: number;
74
+ };
75
+ readonly debugGuidesAbsent: boolean;
76
+ readonly freshnessFailures?: readonly string[];
77
+ readonly thresholds?: Partial<ShowcaseAssetPairCompositionThresholds>;
78
+ }
79
+ export interface ShowcaseAssetPairCompositionCheck {
80
+ readonly id: ShowcaseAssetPairCompositionCheckId;
81
+ readonly verdict: "pass" | "fail";
82
+ readonly tolerance: Readonly<Record<string, number | boolean | string>>;
83
+ readonly measured: Readonly<Record<string, number | boolean | string>>;
84
+ readonly blockers: readonly string[];
85
+ }
86
+ export interface ShowcaseAssetPairCompositionReport {
87
+ readonly schema: "aura3d-showcase-asset-pair-composition/1.0";
88
+ readonly routeId: string;
89
+ readonly category: ShowcaseAssetPairCompositionCategory;
90
+ readonly verdict: "pass" | "fail";
91
+ readonly pass: boolean;
92
+ readonly screenshot: {
93
+ readonly path: string;
94
+ readonly sha256: string;
95
+ readonly width: number;
96
+ readonly height: number;
97
+ };
98
+ readonly geometry: ShowcaseAssetPairCompositionInput["geometry"];
99
+ readonly assets: ShowcaseAssetPairCompositionInput["assets"];
100
+ readonly thresholds: ShowcaseAssetPairCompositionThresholds;
101
+ readonly checks: readonly ShowcaseAssetPairCompositionCheck[];
102
+ readonly blockers: readonly string[];
103
+ }
104
+ export interface ValidateShowcaseAssetPairCompositionFromDiskOptions {
105
+ readonly projectDir?: string;
106
+ readonly routeId: string;
107
+ readonly category: ShowcaseAssetPairCompositionCategory;
108
+ readonly routePrimaryProbe: string;
109
+ readonly gameplayProof: string;
110
+ readonly geometryReport: string;
111
+ readonly manifest?: string;
112
+ readonly outputPath?: string;
113
+ }
114
+ export declare function validateShowcaseAssetPairComposition(input: ShowcaseAssetPairCompositionInput): ShowcaseAssetPairCompositionReport;
115
+ export declare function validateShowcaseAssetPairCompositionFromDisk(options: ValidateShowcaseAssetPairCompositionFromDiskOptions): ShowcaseAssetPairCompositionReport;
116
+ //# sourceMappingURL=showcase-spec-asset-pair-composition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"showcase-spec-asset-pair-composition.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-asset-pair-composition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,336 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { dirname, isAbsolute, relative, resolve } from "node:path";
4
+ import { mkdirSync } from "node:fs";
5
+ export const SHOWCASE_ASSET_PAIR_COMPOSITION_THRESHOLDS = Object.freeze({
6
+ minBindingOverlapRatio: 0.02,
7
+ maxContactOffsetRatio: 1,
8
+ maxScreenContactDistanceRatio: 0.35,
9
+ minPlaySpaceAreaRatio: 0.04,
10
+ maxPlaySpaceAreaRatio: 0.78,
11
+ minSubjectWorldRatio: 0.08,
12
+ maxSubjectWorldRatio: 0.78,
13
+ maxPlatformerScaleDelta: 0.18
14
+ });
15
+ export function validateShowcaseAssetPairComposition(input) {
16
+ const thresholds = { ...SHOWCASE_ASSET_PAIR_COMPOSITION_THRESHOLDS, ...(input.thresholds ?? {}) };
17
+ const cropArea = area(input.screenshot.crop);
18
+ const playSpaceAreaRatio = ratio(area(input.screenshot.projectedPlaySpaceBounds), cropArea);
19
+ const subjectWorldRatio = ratio(input.screenshot.subjectBounds.height, input.screenshot.crop.height);
20
+ const overlapRatio = input.screenshot.subjectClipped
21
+ ? 0
22
+ : input.category === "platformer"
23
+ ? horizontalIntersectionRatio(input.screenshot.subjectBounds, input.screenshot.projectedPlaySpaceBounds)
24
+ : intersectionRatio(input.screenshot.subjectBounds, input.screenshot.projectedPlaySpaceBounds);
25
+ const subjectBase = {
26
+ x: input.screenshot.subjectBounds.x + input.screenshot.subjectBounds.width / 2,
27
+ y: input.screenshot.subjectBounds.y + input.screenshot.subjectBounds.height
28
+ };
29
+ const screenContactDistance = Math.hypot(subjectBase.x - input.screenshot.projectedContactPoint.x, subjectBase.y - input.screenshot.projectedContactPoint.y);
30
+ const screenContactDistanceRatio = ratio(screenContactDistance, input.screenshot.subjectBounds.height);
31
+ const bindingBlocker = input.category === "racing"
32
+ ? "asset-pair:car-route-not-visibly-bound-to-road-surface"
33
+ : "asset-pair:character-foot-contact-not-visibly-bound-to-platform-surface";
34
+ const cameraBlocker = input.category === "racing"
35
+ ? "asset-pair:track-camera-composition-reads-as-proof-harness"
36
+ : "asset-pair:platform-camera-composition-not-public-quality";
37
+ const scaleBlocker = input.category === "racing"
38
+ ? "asset-pair:vehicle-track-scale-contract-mismatch"
39
+ : "asset-pair:character-world-scale-and-art-direction-not-public-quality";
40
+ const zeroPresentationOffset = input.sceneBinding.modelPresentationOffset.x === 0
41
+ && input.sceneBinding.modelPresentationOffset.y === 0
42
+ && input.sceneBinding.modelPresentationOffset.z === 0;
43
+ const overlayMatches = input.geometry.source === "asset-mesh-extracted"
44
+ ? input.sceneBinding.overlay === "" || input.sceneBinding.overlay === input.screenshot.path
45
+ : input.sceneBinding.overlay === input.screenshot.path;
46
+ const bindingPass = (input.freshnessFailures?.length ?? 0) === 0
47
+ && input.sceneBinding.assetHash === input.geometry.assetHash
48
+ && overlayMatches
49
+ && input.geometry.modelAnchorCount > 0
50
+ && input.sceneBinding.averageBindingError <= 0.06
51
+ && zeroPresentationOffset
52
+ && overlapRatio >= thresholds.minBindingOverlapRatio;
53
+ const contactPass = input.contact.proven
54
+ && input.contact.normalizedOffset <= thresholds.maxContactOffsetRatio
55
+ && screenContactDistanceRatio <= thresholds.maxScreenContactDistanceRatio;
56
+ const selectedRacingCameraMode = input.category === "racing"
57
+ ? input.camera.followsSubject && input.camera.mode === "follow"
58
+ ? "chase"
59
+ : input.camera.mode === "overview" || input.camera.mode === "perspective" || input.camera.mode === "top-down"
60
+ ? "top-down"
61
+ : undefined
62
+ : undefined;
63
+ const cameraBehaviorPass = input.category === "racing" ? selectedRacingCameraMode !== undefined : input.camera.followsSubject;
64
+ const cameraPass = !input.screenshot.foregroundClipped
65
+ && !input.screenshot.subjectClipped
66
+ && playSpaceAreaRatio >= thresholds.minPlaySpaceAreaRatio
67
+ && playSpaceAreaRatio <= thresholds.maxPlaySpaceAreaRatio
68
+ && cameraBehaviorPass;
69
+ const characterScaleRatio = input.scale.characterScaleRatio;
70
+ const projectedTargetHeight = input.scale.projectedTargetHeight;
71
+ const scaleDelta = projectedTargetHeight === undefined
72
+ ? Number.POSITIVE_INFINITY
73
+ : Math.abs(input.screenshot.subjectBounds.height - projectedTargetHeight) / Math.max(projectedTargetHeight, 0.001);
74
+ const platformerScalePass = input.category !== "platformer" || (characterScaleRatio !== undefined
75
+ && characterScaleRatio > 0
76
+ && characterScaleRatio <= 1.25
77
+ && projectedTargetHeight !== undefined
78
+ && projectedTargetHeight > 0
79
+ && scaleDelta <= thresholds.maxPlatformerScaleDelta);
80
+ const scalePass = subjectWorldRatio >= thresholds.minSubjectWorldRatio
81
+ && subjectWorldRatio <= thresholds.maxSubjectWorldRatio
82
+ && platformerScalePass;
83
+ const checks = [
84
+ makeCheck("binding-overlap", bindingPass, {
85
+ minOverlapRatio: thresholds.minBindingOverlapRatio,
86
+ maxAverageBindingError: 0.06,
87
+ requiresCurrentHashes: true,
88
+ requiresZeroPresentationOffset: true
89
+ }, {
90
+ overlapRatio,
91
+ averageBindingError: input.sceneBinding.averageBindingError,
92
+ modelAnchorCount: input.geometry.modelAnchorCount,
93
+ sceneAssetHashMatches: input.sceneBinding.assetHash === input.geometry.assetHash,
94
+ overlayMatches,
95
+ zeroPresentationOffset
96
+ }, bindingBlocker),
97
+ makeCheck("contact", contactPass, {
98
+ maxNormalizedOffset: thresholds.maxContactOffsetRatio,
99
+ maxScreenContactDistanceRatio: thresholds.maxScreenContactDistanceRatio
100
+ }, {
101
+ contactProven: input.contact.proven,
102
+ normalizedOffset: input.contact.normalizedOffset,
103
+ screenContactDistance,
104
+ screenContactDistanceRatio
105
+ }, bindingBlocker),
106
+ makeCheck("camera-readability", cameraPass, {
107
+ minPlaySpaceAreaRatio: thresholds.minPlaySpaceAreaRatio,
108
+ maxPlaySpaceAreaRatio: thresholds.maxPlaySpaceAreaRatio,
109
+ clippedAllowed: false,
110
+ requiresSubjectFollow: input.category !== "racing" || selectedRacingCameraMode === "chase",
111
+ acceptedRacingModes: "chase|top-down"
112
+ }, {
113
+ playSpaceAreaRatio,
114
+ foregroundClipped: input.screenshot.foregroundClipped,
115
+ subjectClipped: input.screenshot.subjectClipped,
116
+ cameraMode: input.camera.mode,
117
+ followsSubject: input.camera.followsSubject,
118
+ ...(selectedRacingCameraMode ? { selectedMode: selectedRacingCameraMode } : {})
119
+ }, cameraBlocker),
120
+ makeCheck("scale-contract", scalePass, {
121
+ minSubjectWorldRatio: thresholds.minSubjectWorldRatio,
122
+ maxSubjectWorldRatio: thresholds.maxSubjectWorldRatio,
123
+ maxPlatformerScaleDelta: thresholds.maxPlatformerScaleDelta
124
+ }, {
125
+ subjectWorldRatio,
126
+ characterScaleRatio: characterScaleRatio ?? "not-required",
127
+ projectedTargetHeight: projectedTargetHeight ?? "not-required",
128
+ renderedSubjectHeight: input.screenshot.subjectBounds.height,
129
+ scaleDelta: Number.isFinite(scaleDelta) ? scaleDelta : "missing"
130
+ }, scaleBlocker),
131
+ makeCheck("debug-guide-absence", input.debugGuidesAbsent, {
132
+ visibleDebugGuidesAllowed: false
133
+ }, {
134
+ debugGuidesAbsent: input.debugGuidesAbsent
135
+ }, "asset-pair:debug-guides-visible")
136
+ ];
137
+ const blockers = unique([
138
+ ...(input.freshnessFailures ?? []),
139
+ ...checks.flatMap((check) => check.blockers)
140
+ ]);
141
+ return {
142
+ schema: "aura3d-showcase-asset-pair-composition/1.0",
143
+ routeId: input.routeId,
144
+ category: input.category,
145
+ verdict: blockers.length === 0 ? "pass" : "fail",
146
+ pass: blockers.length === 0,
147
+ screenshot: {
148
+ path: input.screenshot.path,
149
+ sha256: input.screenshot.sha256,
150
+ width: input.screenshot.width,
151
+ height: input.screenshot.height
152
+ },
153
+ geometry: input.geometry,
154
+ assets: input.assets,
155
+ thresholds,
156
+ checks,
157
+ blockers
158
+ };
159
+ }
160
+ export function validateShowcaseAssetPairCompositionFromDisk(options) {
161
+ const root = resolve(options.projectDir ?? process.cwd());
162
+ const probe = readJsonObject(root, options.routePrimaryProbe, "route-primary-probe");
163
+ const gameplay = readJsonObject(root, options.gameplayProof, "gameplay-proof");
164
+ const geometryReport = readJsonObject(root, options.geometryReport, "geometry-report");
165
+ const manifest = readJsonObject(root, options.manifest ?? "aura.assets.json", "manifest");
166
+ const screenshotPath = readString(readObject(probe, "renderedProbe"), "screenshotPath");
167
+ const screenshotAbsolute = safePath(root, screenshotPath, "screenshot");
168
+ const screenshotSha256 = sha256(readFileSync(screenshotAbsolute));
169
+ const renderedProbe = readObject(probe, "renderedProbe");
170
+ const crop = readRect(renderedProbe, "analysisCrop");
171
+ const foregroundBounds = readRect(renderedProbe, "foregroundBounds");
172
+ const compositionProbe = readObject(probe, "compositionProbe");
173
+ const subjectBounds = readRect(compositionProbe, "subjectBounds");
174
+ const projectedPlaySpaceBounds = readRect(compositionProbe, "projectedPlaySpaceBounds");
175
+ const projectedContactPoint = readPoint(compositionProbe, "projectedContactPoint");
176
+ const evidence = readObject(readObject(gameplay, "evidence"), "before");
177
+ const sceneContainer = readObject(evidence, options.category === "racing" ? "racing" : "platformer");
178
+ const sceneBinding = readObject(sceneContainer, "sceneBinding");
179
+ const geometry = geometryRecord(options.category, geometryReport);
180
+ const manifestAssets = readArray(manifest, "assets");
181
+ const primaryAssets = readStringArray(evidence, "primaryAssets");
182
+ const routeProbeAssets = readArray(probe, "primaryAssets");
183
+ const freshnessFailures = [];
184
+ if (readString(renderedProbe, "sha256") !== screenshotSha256)
185
+ freshnessFailures.push("asset-pair:stale-screenshot-hash");
186
+ if (readString(probe, "routeId") !== options.routeId || readString(geometryReport, "routeId") !== options.routeId) {
187
+ freshnessFailures.push("asset-pair:route-id-mismatch");
188
+ }
189
+ const assets = primaryAssets.map((id) => {
190
+ const manifestAsset = manifestAssets.find((value) => isRecord(value) && value.id === id);
191
+ const probeAsset = routeProbeAssets.find((value) => isRecord(value) && value.id === id);
192
+ const manifestHash = isRecord(manifestAsset) && typeof manifestAsset.hash === "string" ? manifestAsset.hash : "missing";
193
+ const evidenceHash = isRecord(probeAsset) && typeof probeAsset.manifestHash === "string" ? probeAsset.manifestHash : "missing";
194
+ if (manifestHash !== evidenceHash)
195
+ freshnessFailures.push(`asset-pair:stale-manifest-hash:${id}`);
196
+ return { id, manifestHash, evidenceHash };
197
+ });
198
+ if (!assets.some((asset) => asset.id === geometry.assetId && asset.manifestHash === geometry.assetHash)) {
199
+ freshnessFailures.push(`asset-pair:geometry-asset-hash-mismatch:${geometry.assetId}`);
200
+ }
201
+ const contact = compositionContact(options.category, evidence);
202
+ const cameraEvidence = readObject(readObject(readObject(evidence, "diagnostics"), "evidence"), "camera");
203
+ const mode = optionalString(cameraEvidence, "mode") ?? "missing";
204
+ const levelDesign = options.category === "platformer" ? readOptionalObject(evidence, "levelDesign") : undefined;
205
+ const gameplayEvidence = readObject(evidence, "gameplay");
206
+ const debugGuidesAbsent = options.category === "racing"
207
+ ? gameplayEvidence.noDebugLocatorDisk === true
208
+ : levelDesign?.noDebugSurfaceGuides === true;
209
+ const source = readString(geometry.record, "source");
210
+ const modelAlignment = readObject(geometry.record, "modelAlignment");
211
+ const anchorPairs = Array.isArray(modelAlignment.anchorPairs) ? modelAlignment.anchorPairs : [];
212
+ const overlay = optionalString(sceneBinding, options.category === "racing" ? "routeOverlay" : "surfaceOverlay") ?? "";
213
+ const averageBindingError = readNumber(sceneBinding, options.category === "racing" ? "averageRouteTopologyError" : "averageSurfaceBindingError");
214
+ const characterScaleRatio = options.category === "platformer" ? optionalNumber(sceneBinding, "characterScaleRatio") : undefined;
215
+ const projectedTargetHeight = options.category === "platformer" ? optionalNumber(compositionProbe, "projectedSubjectHeight") : undefined;
216
+ const report = validateShowcaseAssetPairComposition({
217
+ routeId: options.routeId,
218
+ category: options.category,
219
+ screenshot: {
220
+ path: screenshotPath,
221
+ sha256: screenshotSha256,
222
+ width: readNumber(renderedProbe, "width"),
223
+ height: readNumber(renderedProbe, "height"),
224
+ crop,
225
+ foregroundBounds,
226
+ foregroundClipped: renderedProbe.clipped === true,
227
+ subjectBounds,
228
+ subjectClipped: compositionProbe.subjectClipped === true,
229
+ projectedPlaySpaceBounds,
230
+ projectedContactPoint,
231
+ ...(projectedTargetHeight !== undefined ? { projectedSubjectHeight: projectedTargetHeight } : {})
232
+ },
233
+ assets,
234
+ geometry: {
235
+ report: options.geometryReport,
236
+ assetId: geometry.assetId,
237
+ assetHash: geometry.assetHash,
238
+ source,
239
+ modelAnchorCount: Math.max(anchorPairs.length, 1)
240
+ },
241
+ sceneBinding: {
242
+ assetHash: readString(sceneBinding, "assetHash"),
243
+ geometryBinding: readString(sceneBinding, "geometryBinding"),
244
+ overlay,
245
+ averageBindingError,
246
+ modelPresentationOffset: readOffset(sceneBinding, "modelPresentationOffset")
247
+ },
248
+ contact,
249
+ camera: {
250
+ mode,
251
+ followsSubject: mode === "follow" && typeof cameraEvidence.followTarget === "string"
252
+ },
253
+ scale: { characterScaleRatio, projectedTargetHeight },
254
+ debugGuidesAbsent,
255
+ freshnessFailures
256
+ });
257
+ if (options.outputPath) {
258
+ const output = safePath(root, options.outputPath, "composition-output");
259
+ mkdirSync(dirname(output), { recursive: true });
260
+ writeFileSync(output, `${JSON.stringify(report, null, 2)}\n`);
261
+ }
262
+ return report;
263
+ }
264
+ function geometryRecord(category, report) {
265
+ const key = category === "racing" ? "topology" : "surfaceMap";
266
+ const record = readObject(report, key);
267
+ return { record, assetId: readString(record, "assetId"), assetHash: readString(record, "assetHash") };
268
+ }
269
+ function compositionContact(category, evidence) {
270
+ if (category === "racing") {
271
+ const alignment = readObject(readObject(evidence, "raceState"), "roadAlignment");
272
+ return { proven: alignment.onRoad === true, normalizedOffset: readNumber(alignment, "normalizedOffset") };
273
+ }
274
+ const diagnostics = readObject(evidence, "diagnostics");
275
+ const alignment = readOptionalObject(diagnostics, "surfaceContactAlignment");
276
+ const gameplay = readObject(evidence, "gameplay");
277
+ return {
278
+ proven: alignment?.feetOnSurface === true && gameplay.surfaceContactProven === true,
279
+ normalizedOffset: Math.abs(optionalNumber(alignment ?? {}, "verticalGap") ?? Number.POSITIVE_INFINITY)
280
+ };
281
+ }
282
+ function makeCheck(id, pass, tolerance, measured, blocker) {
283
+ return { id, verdict: pass ? "pass" : "fail", tolerance, measured, blockers: pass ? [] : [blocker] };
284
+ }
285
+ function horizontalIntersectionRatio(left, right) {
286
+ const x1 = Math.max(left.x, right.x);
287
+ const x2 = Math.min(left.x + left.width, right.x + right.width);
288
+ return ratio(Math.max(0, x2 - x1), Math.max(0, left.width));
289
+ }
290
+ function intersectionRatio(left, right) {
291
+ const x1 = Math.max(left.x, right.x);
292
+ const y1 = Math.max(left.y, right.y);
293
+ const x2 = Math.min(left.x + left.width, right.x + right.width);
294
+ const y2 = Math.min(left.y + left.height, right.y + right.height);
295
+ return ratio(Math.max(0, x2 - x1) * Math.max(0, y2 - y1), area(left));
296
+ }
297
+ function area(rect) { return Math.max(0, rect.width) * Math.max(0, rect.height); }
298
+ function ratio(value, total) { return total > 0 ? Number((value / total).toFixed(4)) : 0; }
299
+ function unique(values) { return [...new Set(values)]; }
300
+ function sha256(value) { return `sha256-${createHash("sha256").update(value).digest("hex")}`; }
301
+ function readJsonObject(root, path, label) {
302
+ const absolute = safePath(root, path, label);
303
+ if (!existsSync(absolute))
304
+ throw new Error(`${label} is missing: ${path}`);
305
+ const parsed = JSON.parse(readFileSync(absolute, "utf8"));
306
+ if (!isRecord(parsed))
307
+ throw new Error(`${label} must contain a JSON object: ${path}`);
308
+ return parsed;
309
+ }
310
+ function safePath(root, path, label) {
311
+ if (!path || isAbsolute(path) || path.includes("\0"))
312
+ throw new Error(`${label} path must be repository-relative`);
313
+ const absolute = resolve(root, path);
314
+ const rel = relative(root, absolute);
315
+ if (rel.startsWith("..") || isAbsolute(rel))
316
+ throw new Error(`${label} path escapes the repository`);
317
+ return absolute;
318
+ }
319
+ function isRecord(value) { return typeof value === "object" && value !== null && !Array.isArray(value); }
320
+ function readObject(value, key) { const result = value[key]; if (!isRecord(result))
321
+ throw new Error(`${key} must be an object`); return result; }
322
+ function readOptionalObject(value, key) { const result = value[key]; return isRecord(result) ? result : undefined; }
323
+ function readArray(value, key) { const result = value[key]; if (!Array.isArray(result))
324
+ throw new Error(`${key} must be an array`); return result; }
325
+ function readString(value, key) { const result = value[key]; if (typeof result !== "string" || !result)
326
+ throw new Error(`${key} must be a non-empty string`); return result; }
327
+ function optionalString(value, key) { const result = value[key]; return typeof result === "string" ? result : undefined; }
328
+ function readNumber(value, key) { const result = value[key]; if (typeof result !== "number" || !Number.isFinite(result))
329
+ throw new Error(`${key} must be finite`); return result; }
330
+ function optionalNumber(value, key) { const result = value[key]; return typeof result === "number" && Number.isFinite(result) ? result : undefined; }
331
+ function readStringArray(value, key) { return readArray(value, key).map((item) => { if (typeof item !== "string")
332
+ throw new Error(`${key} must contain strings`); return item; }); }
333
+ function readRect(value, key) { const rect = readObject(value, key); return { x: readNumber(rect, "x"), y: readNumber(rect, "y"), width: readNumber(rect, "width"), height: readNumber(rect, "height") }; }
334
+ function readPoint(value, key) { const point = readObject(value, key); return { x: readNumber(point, "x"), y: readNumber(point, "y") }; }
335
+ function readOffset(value, key) { const offset = readObject(value, key); return { x: readNumber(offset, "x"), y: readNumber(offset, "y"), z: readNumber(offset, "z") }; }
336
+ //# sourceMappingURL=showcase-spec-asset-pair-composition.js.map