@fps-games/editor 0.2.1-beta.2 → 0.2.1-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.json +41 -41
- package/dist/local-editor-harness.d.ts.map +1 -1
- package/dist/local-editor-harness.js +16 -7
- package/dist/local-editor-harness.js.map +1 -1
- package/dist/playable-babylon-rendering.d.ts +8 -7
- package/dist/playable-babylon-rendering.d.ts.map +1 -1
- package/dist/playable-babylon-rendering.js +77 -32
- package/dist/playable-babylon-rendering.js.map +1 -1
- package/dist/playable-product-projection-preview.d.ts +2 -0
- package/dist/playable-product-projection-preview.d.ts.map +1 -1
- package/dist/playable-product-projection-preview.js +7 -4
- package/dist/playable-product-projection-preview.js.map +1 -1
- package/dist/playable-sdk.d.ts +1 -1
- package/dist/playable-sdk.d.ts.map +1 -1
- package/dist/playable-sdk.js +1 -1
- package/dist/playable-sdk.js.map +1 -1
- package/dist/playable-standard-project.d.ts +0 -1
- package/dist/playable-standard-project.d.ts.map +1 -1
- package/dist/playable-standard-project.js +13 -4
- package/dist/playable-standard-project.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/environment/environment-texture-controller.d.ts +4 -2
- package/node_modules/@fps-games/babylon-renderer/dist/environment/environment-texture-controller.d.ts.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/environment/environment-texture-controller.js +301 -121
- package/node_modules/@fps-games/babylon-renderer/dist/environment/environment-texture-controller.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/environment/profile.js +5 -4
- package/node_modules/@fps-games/babylon-renderer/dist/environment/profile.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/environment/types.d.ts +4 -4
- package/node_modules/@fps-games/babylon-renderer/dist/environment/types.d.ts.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/environment/types.js +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/environment/types.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/game-world-plugin-lifecycle.d.ts +2 -0
- package/node_modules/@fps-games/babylon-renderer/dist/game-world-plugin-lifecycle.d.ts.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/game-world-plugin-lifecycle.js +12 -1
- package/node_modules/@fps-games/babylon-renderer/dist/game-world-plugin-lifecycle.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/plugin.d.ts +6 -3
- package/node_modules/@fps-games/babylon-renderer/dist/plugin.d.ts.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/plugin.js +100 -39
- package/node_modules/@fps-games/babylon-renderer/dist/plugin.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/reference.d.ts +1 -3
- package/node_modules/@fps-games/babylon-renderer/dist/reference.d.ts.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/reference.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/package.json +11 -8
- package/node_modules/@fps-games/editor-babylon/package.json +6 -6
- package/node_modules/@fps-games/editor-browser/package.json +7 -7
- package/node_modules/@fps-games/editor-core/package.json +6 -6
- package/node_modules/@fps-games/editor-forge-play/package.json +2 -2
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/generated-module.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/generated-module.js +10 -3
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/generated-module.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.d.ts +2 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.js +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/package-resolution/aliases.d.ts +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/package-resolution/aliases.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/package-resolution/aliases.js +4 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/package-resolution/aliases.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/rendering-profile/panel.js +4 -4
- package/node_modules/@fps-games/editor-playable-sdk/dist/rendering-profile/panel.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/rendering-profile/types.d.ts +2 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/rendering-profile/types.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/rendering-profile/types.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/assets.js +1 -5
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/assets.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/upgrade-doctor/inspectors.js +53 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/upgrade-doctor/inspectors.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/upgrade-doctor/types.d.ts +2 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/upgrade-doctor/types.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/upgrade-doctor/types.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/package.json +6 -6
- package/node_modules/@fps-games/editor-protocol/package.json +2 -2
- package/node_modules/@fps-games/editor-tooling/package.json +3 -3
- package/node_modules/@fps-games/editor-ui/package.json +1 -1
- package/node_modules/@fps-games/playable-assets/dist/identity.d.ts +1 -0
- package/node_modules/@fps-games/playable-assets/dist/identity.d.ts.map +1 -1
- package/node_modules/@fps-games/playable-assets/dist/identity.js +1 -1
- package/node_modules/@fps-games/playable-assets/dist/identity.js.map +1 -1
- package/node_modules/@fps-games/playable-assets/dist/index.d.ts +1 -0
- package/node_modules/@fps-games/playable-assets/dist/index.d.ts.map +1 -1
- package/node_modules/@fps-games/playable-assets/dist/index.js +1 -0
- package/node_modules/@fps-games/playable-assets/dist/index.js.map +1 -1
- package/node_modules/@fps-games/playable-assets/dist/resource-resolver.d.ts +46 -0
- package/node_modules/@fps-games/playable-assets/dist/resource-resolver.d.ts.map +1 -0
- package/node_modules/@fps-games/playable-assets/dist/resource-resolver.js +109 -0
- package/node_modules/@fps-games/playable-assets/dist/resource-resolver.js.map +1 -0
- package/node_modules/@fps-games/playable-assets/package.json +1 -1
- package/node_modules/@fps-games/playable-contracts/package.json +1 -1
- package/node_modules/@fps-games/playable-rendering/package.json +2 -2
- package/node_modules/@fps-games/playable-runtime/dist/runtime.d.ts.map +1 -1
- package/node_modules/@fps-games/playable-runtime/dist/runtime.js +5 -0
- package/node_modules/@fps-games/playable-runtime/dist/runtime.js.map +1 -1
- package/node_modules/@fps-games/playable-runtime/dist/types.d.ts +2 -0
- package/node_modules/@fps-games/playable-runtime/dist/types.d.ts.map +1 -1
- package/node_modules/@fps-games/playable-runtime/dist/types.js.map +1 -1
- package/node_modules/@fps-games/playable-runtime/package.json +12 -12
- package/node_modules/@fps-games/playable-runtime-data/package.json +4 -4
- package/node_modules/@fps-games/playable-scene/package.json +2 -2
- package/node_modules/@fps-games/plugin-api/package.json +1 -1
- package/node_modules/@fps-games/plugin-assets/dist/reference.d.ts.map +1 -1
- package/node_modules/@fps-games/plugin-assets/dist/reference.js +11 -4
- package/node_modules/@fps-games/plugin-assets/dist/reference.js.map +1 -1
- package/node_modules/@fps-games/plugin-assets/dist/renderer.d.ts +8 -0
- package/node_modules/@fps-games/plugin-assets/dist/renderer.d.ts.map +1 -0
- package/node_modules/@fps-games/plugin-assets/dist/renderer.js +13 -0
- package/node_modules/@fps-games/plugin-assets/dist/renderer.js.map +1 -0
- package/node_modules/@fps-games/plugin-assets/dist/resources.d.ts +12 -0
- package/node_modules/@fps-games/plugin-assets/dist/resources.d.ts.map +1 -0
- package/node_modules/@fps-games/plugin-assets/dist/resources.js +8 -0
- package/node_modules/@fps-games/plugin-assets/dist/resources.js.map +1 -0
- package/node_modules/@fps-games/plugin-assets/dist/runtime.d.ts +2 -1
- package/node_modules/@fps-games/plugin-assets/dist/runtime.d.ts.map +1 -1
- package/node_modules/@fps-games/plugin-assets/dist/runtime.js +3 -0
- package/node_modules/@fps-games/plugin-assets/dist/runtime.js.map +1 -1
- package/node_modules/@fps-games/plugin-assets/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-assets/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-assets/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-assets/package.json +32 -8
- package/node_modules/@fps-games/plugin-hierarchy/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-hierarchy/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-hierarchy/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-hierarchy/package.json +5 -5
- package/node_modules/@fps-games/plugin-host/package.json +2 -2
- package/node_modules/@fps-games/plugin-markers/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-markers/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-markers/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-markers/package.json +5 -5
- package/node_modules/@fps-games/plugin-materials/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-materials/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-materials/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-materials/package.json +5 -5
- package/node_modules/@fps-games/plugin-rendering/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-rendering/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-rendering/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-rendering/package.json +5 -5
- package/node_modules/@fps-games/plugin-scene/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-scene/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-scene/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-scene/package.json +5 -5
- package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-shadow-map-experiment/package.json +5 -5
- package/node_modules/@fps-games/plugin-shadows/dist/version.d.ts +1 -1
- package/node_modules/@fps-games/plugin-shadows/dist/version.js +1 -1
- package/node_modules/@fps-games/plugin-shadows/dist/version.js.map +1 -1
- package/node_modules/@fps-games/plugin-shadows/package.json +7 -7
- package/package.json +24 -22
|
@@ -15,6 +15,7 @@ export declare function guidToPlayableEditorAssetStableToken(guid: unknown): str
|
|
|
15
15
|
export declare function createPlayableEditorAssetId(kind: PlayableEditorAssetKind, guid: string): string;
|
|
16
16
|
export declare function toPlayableEditorAssetImportName(value: unknown): string;
|
|
17
17
|
export declare function normalizePlayableEditorAssetKind(value: unknown, filePath?: string): PlayableEditorAssetKind | null;
|
|
18
|
+
export declare function getPlayableEditorAssetPathExtension(filePath: string): string;
|
|
18
19
|
export declare function stripKnownPlayableEditorAssetExtension(value: unknown): string;
|
|
19
20
|
export declare function normalizePlayableEditorAssetDisplayName(value: unknown, fallback: unknown): string;
|
|
20
21
|
export declare function normalizePlayableEditorAssetCodeKey(value: unknown, fallback: unknown): string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE9E,eAAO,MAAM,mCAAmC,iDAAkD,CAAC;AAEnG,eAAO,MAAM,gCAAgC,4BAA6B,CAAC;AAC3E,eAAO,MAAM,gCAAgC,6CAA8C,CAAC;AAC5F,eAAO,MAAM,8CAA8C,oDAAqD,CAAC;AACjH,eAAO,MAAM,kCAAkC,sFAGrC,CAAC;AACX,eAAO,MAAM,gCAAgC,4DAA6D,CAAC;AAC3G,eAAO,MAAM,kCAAkC,wJAIrC,CAAC;AAEX,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,IAAI,MAAM,CAAC;IACtB,eAAe,CAAC,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CAC3C;AAED,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,yBAAyB,GAAG,MAAM,CAG7F;AAED,wBAAgB,oCAAoC,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE1E;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAU/F;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUtE;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,OAAO,EACd,QAAQ,SAAK,GACZ,uBAAuB,GAAG,IAAI,CAYhC;
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE9E,eAAO,MAAM,mCAAmC,iDAAkD,CAAC;AAEnG,eAAO,MAAM,gCAAgC,4BAA6B,CAAC;AAC3E,eAAO,MAAM,gCAAgC,6CAA8C,CAAC;AAC5F,eAAO,MAAM,8CAA8C,oDAAqD,CAAC;AACjH,eAAO,MAAM,kCAAkC,sFAGrC,CAAC;AACX,eAAO,MAAM,gCAAgC,4DAA6D,CAAC;AAC3G,eAAO,MAAM,kCAAkC,wJAIrC,CAAC;AAEX,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,IAAI,MAAM,CAAC;IACtB,eAAe,CAAC,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CAC3C;AAED,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,yBAAyB,GAAG,MAAM,CAG7F;AAED,wBAAgB,oCAAoC,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE1E;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAU/F;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUtE;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,OAAO,EACd,QAAQ,SAAK,GACZ,uBAAuB,GAAG,IAAI,CAYhC;AAED,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM5E;AAeD,wBAAgB,sCAAsC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAU7E;AAED,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAGjG;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CASpG;AAED,wBAAgB,oCAAoC,CAAC,IAAI,EAAE,uBAAuB,GAAG,SAAS,MAAM,EAAE,CAMrG"}
|
|
@@ -61,7 +61,7 @@ export function normalizePlayableEditorAssetKind(value, filePath = '') {
|
|
|
61
61
|
return 'texture';
|
|
62
62
|
return null;
|
|
63
63
|
}
|
|
64
|
-
function getPlayableEditorAssetPathExtension(filePath) {
|
|
64
|
+
export function getPlayableEditorAssetPathExtension(filePath) {
|
|
65
65
|
const cleanPath = filePath.split(/[?#]/, 1)[0] ?? '';
|
|
66
66
|
const slashIndex = Math.max(cleanPath.lastIndexOf('/'), cleanPath.lastIndexOf('\\'));
|
|
67
67
|
const fileName = cleanPath.slice(slashIndex + 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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","sourcesContent":["export type PlayableEditorAssetKind = 'model' | 'texture' | 'image' | 'sound';\n\nexport const PLAYABLE_EDITOR_ASSET_CATALOG_KINDS = ['model', 'texture', 'image', 'sound'] as const;\n\nexport const PLAYABLE_EDITOR_MODEL_EXTENSIONS = ['.glb', '.gltf'] as const;\nexport const PLAYABLE_EDITOR_IMAGE_EXTENSIONS = ['.png', '.jpg', '.jpeg', '.webp'] as const;\nexport const PLAYABLE_EDITOR_ENVIRONMENT_TEXTURE_EXTENSIONS = ['.env', '.hdr', '.dds', '.ktx', '.ktx2'] as const;\nexport const PLAYABLE_EDITOR_TEXTURE_EXTENSIONS = [\n ...PLAYABLE_EDITOR_IMAGE_EXTENSIONS,\n ...PLAYABLE_EDITOR_ENVIRONMENT_TEXTURE_EXTENSIONS,\n] as const;\nexport const PLAYABLE_EDITOR_SOUND_EXTENSIONS = ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.m4a'] as const;\nexport const PLAYABLE_EDITOR_DEFAULT_EXTENSIONS = [\n ...PLAYABLE_EDITOR_MODEL_EXTENSIONS,\n ...PLAYABLE_EDITOR_TEXTURE_EXTENSIONS,\n ...PLAYABLE_EDITOR_SOUND_EXTENSIONS,\n] as const;\n\nexport interface PlayableAssetRandomSource {\n randomUUID?(): string;\n fillRandomBytes?(bytes: Uint8Array): void;\n}\n\nexport function createPlayableEditorAssetGuid(randomSource: PlayableAssetRandomSource): string {\n if (randomSource.randomUUID) return randomSource.randomUUID();\n return createFallbackPlayableEditorAssetGuid(randomSource);\n}\n\nexport function guidToPlayableEditorAssetStableToken(guid: unknown): string {\n return String(guid ?? '').trim().toLowerCase().replace(/-/g, '');\n}\n\nexport function createPlayableEditorAssetId(kind: PlayableEditorAssetKind, guid: string): string {\n const token = guidToPlayableEditorAssetStableToken(guid);\n const prefix = kind === 'model'\n ? 'asset'\n : kind === 'texture'\n ? 'texture'\n : kind === 'sound'\n ? 'sound'\n : 'image';\n return `${prefix}_${token}`;\n}\n\nexport function toPlayableEditorAssetImportName(value: unknown): string {\n const raw = String(value ?? '').trim();\n const segments = raw.split(/[^a-zA-Z0-9_$]+/).filter(Boolean);\n const camel = segments\n .map((segment, index) => index === 0\n ? segment\n : `${segment.charAt(0).toUpperCase()}${segment.slice(1)}`)\n .join('');\n const safe = camel.replace(/[^a-zA-Z0-9_$]/g, '') || 'assetUrl';\n return /^[a-zA-Z_$]/.test(safe) ? safe : `asset${safe}`;\n}\n\nexport function normalizePlayableEditorAssetKind(\n value: unknown,\n filePath = '',\n): PlayableEditorAssetKind | null {\n const raw = String(value ?? '').trim().toLowerCase();\n if (raw === 'glb' || raw === 'gltf' || raw === 'model') return 'model';\n if (raw === 'groundtexture' || raw === 'ground-texture' || raw === 'texture') return 'texture';\n if (raw === 'ui' || raw === 'image' || raw === 'img') return 'image';\n if (raw === 'audio' || raw === 'sound') return 'sound';\n\n const extension = getPlayableEditorAssetPathExtension(filePath);\n if ((PLAYABLE_EDITOR_MODEL_EXTENSIONS as readonly string[]).includes(extension)) return 'model';\n if ((PLAYABLE_EDITOR_SOUND_EXTENSIONS as readonly string[]).includes(extension)) return 'sound';\n if ((PLAYABLE_EDITOR_TEXTURE_EXTENSIONS as readonly string[]).includes(extension)) return 'texture';\n return null;\n}\n\nfunction getPlayableEditorAssetPathExtension(filePath: string): string {\n const cleanPath = filePath.split(/[?#]/, 1)[0] ?? '';\n const slashIndex = Math.max(cleanPath.lastIndexOf('/'), cleanPath.lastIndexOf('\\\\'));\n const fileName = cleanPath.slice(slashIndex + 1);\n const dotIndex = fileName.lastIndexOf('.');\n return dotIndex >= 0 ? fileName.slice(dotIndex).toLowerCase() : '';\n}\n\nfunction createFallbackPlayableEditorAssetGuid(randomSource: PlayableAssetRandomSource): string {\n const bytes = new Uint8Array(16);\n if (!randomSource.fillRandomBytes) throw new Error('Asset GUID random source must provide randomUUID or fillRandomBytes.');\n randomSource.fillRandomBytes(bytes);\n if (bytes.every((byte) => byte === 0)) {\n throw new Error('Asset GUID random source returned no entropy.');\n }\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nexport function stripKnownPlayableEditorAssetExtension(value: unknown): string {\n let raw = String(value ?? '').trim();\n const lower = raw.toLowerCase();\n for (const extension of [...PLAYABLE_EDITOR_DEFAULT_EXTENSIONS].sort((a, b) => b.length - a.length)) {\n if (lower.endsWith(extension)) {\n raw = raw.slice(0, -extension.length);\n break;\n }\n }\n return raw;\n}\n\nexport function normalizePlayableEditorAssetDisplayName(value: unknown, fallback: unknown): string {\n const displayName = String(value ?? '').trim() || stripKnownPlayableEditorAssetExtension(fallback);\n return displayName || 'Asset';\n}\n\nexport function normalizePlayableEditorAssetCodeKey(value: unknown, fallback: unknown): string | null {\n const raw = stripKnownPlayableEditorAssetExtension(value || fallback)\n .trim()\n .toLowerCase()\n .normalize('NFKD')\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .replace(/_{2,}/g, '_');\n return raw || null;\n}\n\nexport function getPlayableEditorAssetKindExtensions(kind: PlayableEditorAssetKind): readonly string[] {\n if (kind === 'model') return PLAYABLE_EDITOR_MODEL_EXTENSIONS;\n if (kind === 'sound') return PLAYABLE_EDITOR_SOUND_EXTENSIONS;\n if (kind === 'texture') return PLAYABLE_EDITOR_TEXTURE_EXTENSIONS;\n if (kind === 'image') return PLAYABLE_EDITOR_IMAGE_EXTENSIONS;\n return [];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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","sourcesContent":["export type PlayableEditorAssetKind = 'model' | 'texture' | 'image' | 'sound';\n\nexport const PLAYABLE_EDITOR_ASSET_CATALOG_KINDS = ['model', 'texture', 'image', 'sound'] as const;\n\nexport const PLAYABLE_EDITOR_MODEL_EXTENSIONS = ['.glb', '.gltf'] as const;\nexport const PLAYABLE_EDITOR_IMAGE_EXTENSIONS = ['.png', '.jpg', '.jpeg', '.webp'] as const;\nexport const PLAYABLE_EDITOR_ENVIRONMENT_TEXTURE_EXTENSIONS = ['.env', '.hdr', '.dds', '.ktx', '.ktx2'] as const;\nexport const PLAYABLE_EDITOR_TEXTURE_EXTENSIONS = [\n ...PLAYABLE_EDITOR_IMAGE_EXTENSIONS,\n ...PLAYABLE_EDITOR_ENVIRONMENT_TEXTURE_EXTENSIONS,\n] as const;\nexport const PLAYABLE_EDITOR_SOUND_EXTENSIONS = ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.m4a'] as const;\nexport const PLAYABLE_EDITOR_DEFAULT_EXTENSIONS = [\n ...PLAYABLE_EDITOR_MODEL_EXTENSIONS,\n ...PLAYABLE_EDITOR_TEXTURE_EXTENSIONS,\n ...PLAYABLE_EDITOR_SOUND_EXTENSIONS,\n] as const;\n\nexport interface PlayableAssetRandomSource {\n randomUUID?(): string;\n fillRandomBytes?(bytes: Uint8Array): void;\n}\n\nexport function createPlayableEditorAssetGuid(randomSource: PlayableAssetRandomSource): string {\n if (randomSource.randomUUID) return randomSource.randomUUID();\n return createFallbackPlayableEditorAssetGuid(randomSource);\n}\n\nexport function guidToPlayableEditorAssetStableToken(guid: unknown): string {\n return String(guid ?? '').trim().toLowerCase().replace(/-/g, '');\n}\n\nexport function createPlayableEditorAssetId(kind: PlayableEditorAssetKind, guid: string): string {\n const token = guidToPlayableEditorAssetStableToken(guid);\n const prefix = kind === 'model'\n ? 'asset'\n : kind === 'texture'\n ? 'texture'\n : kind === 'sound'\n ? 'sound'\n : 'image';\n return `${prefix}_${token}`;\n}\n\nexport function toPlayableEditorAssetImportName(value: unknown): string {\n const raw = String(value ?? '').trim();\n const segments = raw.split(/[^a-zA-Z0-9_$]+/).filter(Boolean);\n const camel = segments\n .map((segment, index) => index === 0\n ? segment\n : `${segment.charAt(0).toUpperCase()}${segment.slice(1)}`)\n .join('');\n const safe = camel.replace(/[^a-zA-Z0-9_$]/g, '') || 'assetUrl';\n return /^[a-zA-Z_$]/.test(safe) ? safe : `asset${safe}`;\n}\n\nexport function normalizePlayableEditorAssetKind(\n value: unknown,\n filePath = '',\n): PlayableEditorAssetKind | null {\n const raw = String(value ?? '').trim().toLowerCase();\n if (raw === 'glb' || raw === 'gltf' || raw === 'model') return 'model';\n if (raw === 'groundtexture' || raw === 'ground-texture' || raw === 'texture') return 'texture';\n if (raw === 'ui' || raw === 'image' || raw === 'img') return 'image';\n if (raw === 'audio' || raw === 'sound') return 'sound';\n\n const extension = getPlayableEditorAssetPathExtension(filePath);\n if ((PLAYABLE_EDITOR_MODEL_EXTENSIONS as readonly string[]).includes(extension)) return 'model';\n if ((PLAYABLE_EDITOR_SOUND_EXTENSIONS as readonly string[]).includes(extension)) return 'sound';\n if ((PLAYABLE_EDITOR_TEXTURE_EXTENSIONS as readonly string[]).includes(extension)) return 'texture';\n return null;\n}\n\nexport function getPlayableEditorAssetPathExtension(filePath: string): string {\n const cleanPath = filePath.split(/[?#]/, 1)[0] ?? '';\n const slashIndex = Math.max(cleanPath.lastIndexOf('/'), cleanPath.lastIndexOf('\\\\'));\n const fileName = cleanPath.slice(slashIndex + 1);\n const dotIndex = fileName.lastIndexOf('.');\n return dotIndex >= 0 ? fileName.slice(dotIndex).toLowerCase() : '';\n}\n\nfunction createFallbackPlayableEditorAssetGuid(randomSource: PlayableAssetRandomSource): string {\n const bytes = new Uint8Array(16);\n if (!randomSource.fillRandomBytes) throw new Error('Asset GUID random source must provide randomUUID or fillRandomBytes.');\n randomSource.fillRandomBytes(bytes);\n if (bytes.every((byte) => byte === 0)) {\n throw new Error('Asset GUID random source returned no entropy.');\n }\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nexport function stripKnownPlayableEditorAssetExtension(value: unknown): string {\n let raw = String(value ?? '').trim();\n const lower = raw.toLowerCase();\n for (const extension of [...PLAYABLE_EDITOR_DEFAULT_EXTENSIONS].sort((a, b) => b.length - a.length)) {\n if (lower.endsWith(extension)) {\n raw = raw.slice(0, -extension.length);\n break;\n }\n }\n return raw;\n}\n\nexport function normalizePlayableEditorAssetDisplayName(value: unknown, fallback: unknown): string {\n const displayName = String(value ?? '').trim() || stripKnownPlayableEditorAssetExtension(fallback);\n return displayName || 'Asset';\n}\n\nexport function normalizePlayableEditorAssetCodeKey(value: unknown, fallback: unknown): string | null {\n const raw = stripKnownPlayableEditorAssetExtension(value || fallback)\n .trim()\n .toLowerCase()\n .normalize('NFKD')\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .replace(/_{2,}/g, '_');\n return raw || null;\n}\n\nexport function getPlayableEditorAssetKindExtensions(kind: PlayableEditorAssetKind): readonly string[] {\n if (kind === 'model') return PLAYABLE_EDITOR_MODEL_EXTENSIONS;\n if (kind === 'sound') return PLAYABLE_EDITOR_SOUND_EXTENSIONS;\n if (kind === 'texture') return PLAYABLE_EDITOR_TEXTURE_EXTENSIONS;\n if (kind === 'image') return PLAYABLE_EDITOR_IMAGE_EXTENSIONS;\n return [];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC","sourcesContent":["export * from './identity.js';\nexport * from './portable-path.js';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC","sourcesContent":["export * from './identity.js';\nexport * from './portable-path.js';\nexport * from './resource-resolver.js';\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type PlayableAssetFormat = `.${string}`;
|
|
2
|
+
export type PlayableAssetResourceTransport = 'path-url' | 'http-url' | 'data-url' | 'blob-url';
|
|
3
|
+
/** The browser-safe subset emitted by the generated project asset catalog. */
|
|
4
|
+
export interface PlayableGeneratedAssetCatalogEntry {
|
|
5
|
+
readonly assetId: string;
|
|
6
|
+
readonly url: string;
|
|
7
|
+
readonly format: PlayableAssetFormat;
|
|
8
|
+
readonly relativePath: string;
|
|
9
|
+
readonly originalFileName?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface PlayableResolvedAssetResource {
|
|
12
|
+
readonly assetId: string | null;
|
|
13
|
+
readonly url: string;
|
|
14
|
+
readonly format: PlayableAssetFormat;
|
|
15
|
+
readonly transport: PlayableAssetResourceTransport;
|
|
16
|
+
readonly relativePath: string | null;
|
|
17
|
+
readonly originalFileName: string | null;
|
|
18
|
+
}
|
|
19
|
+
export interface PlayableAssetResourceReference {
|
|
20
|
+
readonly assetId?: string | null;
|
|
21
|
+
readonly url?: string | null;
|
|
22
|
+
}
|
|
23
|
+
export type PlayableAssetResourceResolutionCode = 'asset.resource.not-found' | 'asset.resource.format-missing' | 'asset.resource.format-unsupported' | 'asset.resource.invalid-reference';
|
|
24
|
+
export interface PlayableAssetResourceResolutionDiagnostic {
|
|
25
|
+
readonly code: PlayableAssetResourceResolutionCode;
|
|
26
|
+
readonly assetId: string | null;
|
|
27
|
+
readonly format: PlayableAssetFormat | null;
|
|
28
|
+
readonly transport: PlayableAssetResourceTransport | null;
|
|
29
|
+
/** A safe bounded URL description. It never includes a data/blob payload. */
|
|
30
|
+
readonly urlSummary: string | null;
|
|
31
|
+
}
|
|
32
|
+
export type PlayableAssetResourceResolution = Readonly<{
|
|
33
|
+
ok: true;
|
|
34
|
+
resource: PlayableResolvedAssetResource;
|
|
35
|
+
}> | Readonly<{
|
|
36
|
+
ok: false;
|
|
37
|
+
diagnostic: PlayableAssetResourceResolutionDiagnostic;
|
|
38
|
+
}>;
|
|
39
|
+
export interface PlayableAssetResourceResolver {
|
|
40
|
+
resolve(reference: PlayableAssetResourceReference): PlayableAssetResourceResolution;
|
|
41
|
+
}
|
|
42
|
+
export declare function createPlayableAssetResourceResolver(catalog: Readonly<Record<string, PlayableGeneratedAssetCatalogEntry>>): PlayableAssetResourceResolver;
|
|
43
|
+
export declare function getPlayableAssetFormat(value: unknown): PlayableAssetFormat | null;
|
|
44
|
+
export declare function isPlayableAssetFormatSupported(format: PlayableAssetFormat): boolean;
|
|
45
|
+
export declare function getPlayableAssetResourceTransport(url: string): PlayableAssetResourceTransport;
|
|
46
|
+
//# sourceMappingURL=resource-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-resolver.d.ts","sourceRoot":"","sources":["../src/resource-resolver.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,mBAAmB,GAAG,IAAI,MAAM,EAAE,CAAC;AAC/C,MAAM,MAAM,8BAA8B,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAE/F,8EAA8E;AAC9E,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,8BAA8B,CAAC;IACnD,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,mCAAmC,GAC3C,0BAA0B,GAC1B,+BAA+B,GAC/B,mCAAmC,GACnC,kCAAkC,CAAC;AAEvC,MAAM,WAAW,yCAAyC;IACxD,QAAQ,CAAC,IAAI,EAAE,mCAAmC,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,8BAA8B,GAAG,IAAI,CAAC;IAC1D,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,MAAM,+BAA+B,GACvC,QAAQ,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,6BAA6B,CAAA;CAAE,CAAC,GAC/D,QAAQ,CAAC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,yCAAyC,CAAA;CAAE,CAAC,CAAC;AAEnF,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,SAAS,EAAE,8BAA8B,GAAG,+BAA+B,CAAC;CACrF;AAED,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC,GACpE,6BAA6B,CAoC/B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAGjF;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAEnF;AAED,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,MAAM,GAAG,8BAA8B,CAK7F"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { PLAYABLE_EDITOR_DEFAULT_EXTENSIONS, getPlayableEditorAssetPathExtension, } from './identity.js';
|
|
2
|
+
export function createPlayableAssetResourceResolver(catalog) {
|
|
3
|
+
const entries = new Map();
|
|
4
|
+
for (const [catalogAssetId, input] of Object.entries(catalog)) {
|
|
5
|
+
const entry = normalizeCatalogEntry(catalogAssetId, input);
|
|
6
|
+
if (entries.has(entry.assetId))
|
|
7
|
+
throw new Error(`Duplicate generated asset catalog id: ${entry.assetId}`);
|
|
8
|
+
entries.set(entry.assetId, entry);
|
|
9
|
+
}
|
|
10
|
+
return Object.freeze({
|
|
11
|
+
resolve(reference) {
|
|
12
|
+
const assetId = normalizeOptionalString(reference.assetId);
|
|
13
|
+
const url = normalizeOptionalString(reference.url);
|
|
14
|
+
if (assetId) {
|
|
15
|
+
const entry = entries.get(assetId);
|
|
16
|
+
if (!entry)
|
|
17
|
+
return failed('asset.resource.not-found', assetId, null, null, url);
|
|
18
|
+
return resolved({
|
|
19
|
+
assetId: entry.assetId,
|
|
20
|
+
url: entry.url,
|
|
21
|
+
format: entry.format,
|
|
22
|
+
transport: getPlayableAssetResourceTransport(entry.url),
|
|
23
|
+
relativePath: entry.relativePath,
|
|
24
|
+
originalFileName: entry.originalFileName ?? null,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (!url)
|
|
28
|
+
return failed('asset.resource.invalid-reference', null, null, null, null);
|
|
29
|
+
const transport = getPlayableAssetResourceTransport(url);
|
|
30
|
+
if (transport === 'data-url' || transport === 'blob-url') {
|
|
31
|
+
return failed('asset.resource.format-missing', null, null, transport, url);
|
|
32
|
+
}
|
|
33
|
+
const format = getPlayableAssetFormat(url);
|
|
34
|
+
if (!format)
|
|
35
|
+
return failed('asset.resource.format-missing', null, null, transport, url);
|
|
36
|
+
if (!isPlayableAssetFormatSupported(format)) {
|
|
37
|
+
return failed('asset.resource.format-unsupported', null, format, transport, url);
|
|
38
|
+
}
|
|
39
|
+
return resolved({ assetId: null, url, format, transport, relativePath: null, originalFileName: null });
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
export function getPlayableAssetFormat(value) {
|
|
44
|
+
const extension = getPlayableEditorAssetPathExtension(String(value ?? ''));
|
|
45
|
+
return extension ? extension : null;
|
|
46
|
+
}
|
|
47
|
+
export function isPlayableAssetFormatSupported(format) {
|
|
48
|
+
return PLAYABLE_EDITOR_DEFAULT_EXTENSIONS.includes(format);
|
|
49
|
+
}
|
|
50
|
+
export function getPlayableAssetResourceTransport(url) {
|
|
51
|
+
if (/^data:/i.test(url))
|
|
52
|
+
return 'data-url';
|
|
53
|
+
if (/^blob:/i.test(url))
|
|
54
|
+
return 'blob-url';
|
|
55
|
+
if (/^https?:/i.test(url))
|
|
56
|
+
return 'http-url';
|
|
57
|
+
return 'path-url';
|
|
58
|
+
}
|
|
59
|
+
function normalizeCatalogEntry(catalogAssetId, input) {
|
|
60
|
+
const assetId = normalizeRequiredString(input?.assetId, `Generated asset catalog entry ${catalogAssetId} assetId`);
|
|
61
|
+
if (assetId !== catalogAssetId)
|
|
62
|
+
throw new Error(`Generated asset catalog key/id mismatch: ${catalogAssetId}`);
|
|
63
|
+
const url = normalizeRequiredString(input.url, `Generated asset catalog entry ${assetId} url`);
|
|
64
|
+
const relativePath = normalizeRequiredString(input.relativePath, `Generated asset catalog entry ${assetId} relativePath`);
|
|
65
|
+
const format = normalizeFormat(input.format, `Generated asset catalog entry ${assetId} format`);
|
|
66
|
+
const derivedFormat = getPlayableAssetFormat(relativePath);
|
|
67
|
+
if (derivedFormat !== format)
|
|
68
|
+
throw new Error(`Generated asset catalog entry ${assetId} format must match relativePath.`);
|
|
69
|
+
if (!isPlayableAssetFormatSupported(format))
|
|
70
|
+
throw new Error(`Generated asset catalog entry ${assetId} has unsupported format: ${format}`);
|
|
71
|
+
const originalFileName = normalizeOptionalString(input.originalFileName);
|
|
72
|
+
return Object.freeze({ assetId, url, format, relativePath, ...(originalFileName ? { originalFileName } : {}) });
|
|
73
|
+
}
|
|
74
|
+
function normalizeFormat(value, label) {
|
|
75
|
+
const format = getPlayableAssetFormat(String(value ?? ''));
|
|
76
|
+
if (!format || format !== String(value).trim().toLowerCase())
|
|
77
|
+
throw new Error(`${label} must be a normalized file extension.`);
|
|
78
|
+
return format;
|
|
79
|
+
}
|
|
80
|
+
function normalizeRequiredString(value, label) {
|
|
81
|
+
const result = normalizeOptionalString(value);
|
|
82
|
+
if (!result)
|
|
83
|
+
throw new Error(`${label} is required.`);
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
function normalizeOptionalString(value) {
|
|
87
|
+
if (typeof value !== 'string')
|
|
88
|
+
return null;
|
|
89
|
+
const result = value.trim();
|
|
90
|
+
return result || null;
|
|
91
|
+
}
|
|
92
|
+
function resolved(resource) {
|
|
93
|
+
return Object.freeze({ ok: true, resource: Object.freeze(resource) });
|
|
94
|
+
}
|
|
95
|
+
function failed(code, assetId, format, transport, url) {
|
|
96
|
+
return Object.freeze({ ok: false, diagnostic: Object.freeze({
|
|
97
|
+
code, assetId, format, transport, urlSummary: summarizeUrl(url),
|
|
98
|
+
}) });
|
|
99
|
+
}
|
|
100
|
+
function summarizeUrl(url) {
|
|
101
|
+
if (!url)
|
|
102
|
+
return null;
|
|
103
|
+
if (/^data:/i.test(url))
|
|
104
|
+
return 'data:<redacted>';
|
|
105
|
+
if (/^blob:/i.test(url))
|
|
106
|
+
return 'blob:<redacted>';
|
|
107
|
+
return url.length <= 160 ? url : `${url.slice(0, 157)}...`;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=resource-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-resolver.js","sourceRoot":"","sources":["../src/resource-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n PLAYABLE_EDITOR_DEFAULT_EXTENSIONS,\n getPlayableEditorAssetPathExtension,\n} from './identity.js';\n\nexport type PlayableAssetFormat = `.${string}`;\nexport type PlayableAssetResourceTransport = 'path-url' | 'http-url' | 'data-url' | 'blob-url';\n\n/** The browser-safe subset emitted by the generated project asset catalog. */\nexport interface PlayableGeneratedAssetCatalogEntry {\n readonly assetId: string;\n readonly url: string;\n readonly format: PlayableAssetFormat;\n readonly relativePath: string;\n readonly originalFileName?: string;\n}\n\nexport interface PlayableResolvedAssetResource {\n readonly assetId: string | null;\n readonly url: string;\n readonly format: PlayableAssetFormat;\n readonly transport: PlayableAssetResourceTransport;\n readonly relativePath: string | null;\n readonly originalFileName: string | null;\n}\n\nexport interface PlayableAssetResourceReference {\n readonly assetId?: string | null;\n readonly url?: string | null;\n}\n\nexport type PlayableAssetResourceResolutionCode =\n | 'asset.resource.not-found'\n | 'asset.resource.format-missing'\n | 'asset.resource.format-unsupported'\n | 'asset.resource.invalid-reference';\n\nexport interface PlayableAssetResourceResolutionDiagnostic {\n readonly code: PlayableAssetResourceResolutionCode;\n readonly assetId: string | null;\n readonly format: PlayableAssetFormat | null;\n readonly transport: PlayableAssetResourceTransport | null;\n /** A safe bounded URL description. It never includes a data/blob payload. */\n readonly urlSummary: string | null;\n}\n\nexport type PlayableAssetResourceResolution =\n | Readonly<{ ok: true; resource: PlayableResolvedAssetResource }>\n | Readonly<{ ok: false; diagnostic: PlayableAssetResourceResolutionDiagnostic }>;\n\nexport interface PlayableAssetResourceResolver {\n resolve(reference: PlayableAssetResourceReference): PlayableAssetResourceResolution;\n}\n\nexport function createPlayableAssetResourceResolver(\n catalog: Readonly<Record<string, PlayableGeneratedAssetCatalogEntry>>,\n): PlayableAssetResourceResolver {\n const entries = new Map<string, PlayableGeneratedAssetCatalogEntry>();\n for (const [catalogAssetId, input] of Object.entries(catalog)) {\n const entry = normalizeCatalogEntry(catalogAssetId, input);\n if (entries.has(entry.assetId)) throw new Error(`Duplicate generated asset catalog id: ${entry.assetId}`);\n entries.set(entry.assetId, entry);\n }\n return Object.freeze({\n resolve(reference: PlayableAssetResourceReference) {\n const assetId = normalizeOptionalString(reference.assetId);\n const url = normalizeOptionalString(reference.url);\n if (assetId) {\n const entry = entries.get(assetId);\n if (!entry) return failed('asset.resource.not-found', assetId, null, null, url);\n return resolved({\n assetId: entry.assetId,\n url: entry.url,\n format: entry.format,\n transport: getPlayableAssetResourceTransport(entry.url),\n relativePath: entry.relativePath,\n originalFileName: entry.originalFileName ?? null,\n });\n }\n if (!url) return failed('asset.resource.invalid-reference', null, null, null, null);\n const transport = getPlayableAssetResourceTransport(url);\n if (transport === 'data-url' || transport === 'blob-url') {\n return failed('asset.resource.format-missing', null, null, transport, url);\n }\n const format = getPlayableAssetFormat(url);\n if (!format) return failed('asset.resource.format-missing', null, null, transport, url);\n if (!isPlayableAssetFormatSupported(format)) {\n return failed('asset.resource.format-unsupported', null, format, transport, url);\n }\n return resolved({ assetId: null, url, format, transport, relativePath: null, originalFileName: null });\n },\n });\n}\n\nexport function getPlayableAssetFormat(value: unknown): PlayableAssetFormat | null {\n const extension = getPlayableEditorAssetPathExtension(String(value ?? ''));\n return extension ? extension as PlayableAssetFormat : null;\n}\n\nexport function isPlayableAssetFormatSupported(format: PlayableAssetFormat): boolean {\n return (PLAYABLE_EDITOR_DEFAULT_EXTENSIONS as readonly string[]).includes(format);\n}\n\nexport function getPlayableAssetResourceTransport(url: string): PlayableAssetResourceTransport {\n if (/^data:/i.test(url)) return 'data-url';\n if (/^blob:/i.test(url)) return 'blob-url';\n if (/^https?:/i.test(url)) return 'http-url';\n return 'path-url';\n}\n\nfunction normalizeCatalogEntry(\n catalogAssetId: string,\n input: PlayableGeneratedAssetCatalogEntry,\n): PlayableGeneratedAssetCatalogEntry {\n const assetId = normalizeRequiredString(input?.assetId, `Generated asset catalog entry ${catalogAssetId} assetId`);\n if (assetId !== catalogAssetId) throw new Error(`Generated asset catalog key/id mismatch: ${catalogAssetId}`);\n const url = normalizeRequiredString(input.url, `Generated asset catalog entry ${assetId} url`);\n const relativePath = normalizeRequiredString(input.relativePath, `Generated asset catalog entry ${assetId} relativePath`);\n const format = normalizeFormat(input.format, `Generated asset catalog entry ${assetId} format`);\n const derivedFormat = getPlayableAssetFormat(relativePath);\n if (derivedFormat !== format) throw new Error(`Generated asset catalog entry ${assetId} format must match relativePath.`);\n if (!isPlayableAssetFormatSupported(format)) throw new Error(`Generated asset catalog entry ${assetId} has unsupported format: ${format}`);\n const originalFileName = normalizeOptionalString(input.originalFileName);\n return Object.freeze({ assetId, url, format, relativePath, ...(originalFileName ? { originalFileName } : {}) });\n}\n\nfunction normalizeFormat(value: unknown, label: string): PlayableAssetFormat {\n const format = getPlayableAssetFormat(String(value ?? ''));\n if (!format || format !== String(value).trim().toLowerCase()) throw new Error(`${label} must be a normalized file extension.`);\n return format;\n}\n\nfunction normalizeRequiredString(value: unknown, label: string): string {\n const result = normalizeOptionalString(value);\n if (!result) throw new Error(`${label} is required.`);\n return result;\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const result = value.trim();\n return result || null;\n}\n\nfunction resolved(resource: PlayableResolvedAssetResource): PlayableAssetResourceResolution {\n return Object.freeze({ ok: true, resource: Object.freeze(resource) });\n}\n\nfunction failed(\n code: PlayableAssetResourceResolutionCode,\n assetId: string | null,\n format: PlayableAssetFormat | null,\n transport: PlayableAssetResourceTransport | null,\n url: string | null,\n): PlayableAssetResourceResolution {\n return Object.freeze({ ok: false, diagnostic: Object.freeze({\n code, assetId, format, transport, urlSummary: summarizeUrl(url),\n }) });\n}\n\nfunction summarizeUrl(url: string | null): string | null {\n if (!url) return null;\n if (/^data:/i.test(url)) return 'data:<redacted>';\n if (/^blob:/i.test(url)) return 'blob:<redacted>';\n return url.length <= 160 ? url : `${url.slice(0, 157)}...`;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fps-games/playable-rendering",
|
|
3
|
-
"version": "0.2.1-beta.
|
|
3
|
+
"version": "0.2.1-beta.3",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Environment-neutral rendering and shadow contracts and resolution logic.",
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@fps-games/playable-contracts": "0.2.1-beta.
|
|
21
|
+
"@fps-games/playable-contracts": "0.2.1-beta.3"
|
|
22
22
|
}
|
|
23
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EACjB,0BAA0B,EAE3B,MAAM,YAAY,CAAC;AAEpB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAa9F;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,0BAA0B,GAAG,QAAQ,CAAC,0BAA0B,CAAC,CAkC/G;AA+BD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAiHvE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { defineFpsPluginEntry, defineFpsPluginManifest } from '@fps-games/plugin-api';
|
|
2
2
|
import { createFpsPluginHost } from '@fps-games/plugin-host';
|
|
3
|
+
import { FPS_ASSET_CATALOG_SOURCE } from '@fps-games/plugin-assets/resources';
|
|
3
4
|
import { assertFpsRuntimePluginDataContracts, createFpsRuntimeDataSnapshot } from './runtime-data.js';
|
|
4
5
|
import { createFpsStandardRuntimePlugins } from './standard-plugins.js';
|
|
5
6
|
import { FPS_RUNTIME_DATA, FPS_RUNTIME_PROJECT, FPS_RUNTIME_SCENE_ID, } from './tokens.js';
|
|
@@ -135,6 +136,10 @@ export function createFpsRuntime(options) {
|
|
|
135
136
|
initialServices: [
|
|
136
137
|
{ token: FPS_RUNTIME_PROJECT, value: project },
|
|
137
138
|
{ token: FPS_RUNTIME_DATA, value: runtimeData },
|
|
139
|
+
{
|
|
140
|
+
token: FPS_ASSET_CATALOG_SOURCE,
|
|
141
|
+
value: Object.freeze({ catalog: options.assetCatalog }),
|
|
142
|
+
},
|
|
138
143
|
],
|
|
139
144
|
loadEntry: async (manifest) => pluginById.get(manifest.id)?.runtime ?? null,
|
|
140
145
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineFpsPluginEntry, defineFpsPluginManifest } from '@fps-games/plugin-api';\nimport type { FpsServiceToken } from '@fps-games/plugin-api';\nimport { createFpsPluginHost } from '@fps-games/plugin-host';\nimport { assertFpsRuntimePluginDataContracts, createFpsRuntimeDataSnapshot } from './runtime-data.js';\nimport { createFpsStandardRuntimePlugins } from './standard-plugins.js';\nimport {\n FPS_RUNTIME_DATA,\n FPS_RUNTIME_PROJECT,\n FPS_RUNTIME_SCENE_ID,\n} from './tokens.js';\nimport type {\n FpsProjectDefinition,\n FpsRuntime,\n FpsRuntimeOptions,\n FpsRuntimePluginDefinition,\n FpsRuntimeSceneScope,\n} from './types.js';\n\nexport function defineFpsProject(project: FpsProjectDefinition): Readonly<FpsProjectDefinition> {\n assertRuntimePluginKeys(project, ['projectId', 'projectName', 'plugins'], 'Runtime project');\n if (typeof project.projectId !== 'string' || !project.projectId.trim()) throw new Error('Project id is required.');\n if (typeof project.projectName !== 'string' || !project.projectName.trim()) throw new Error('Project name is required.');\n const hasPlugins = Object.prototype.hasOwnProperty.call(project, 'plugins');\n const plugins = hasPlugins\n ? readRuntimeDataArray(project.plugins, 'Runtime project plugins').map(plugin => defineFpsRuntimePlugin(plugin as FpsRuntimePluginDefinition))\n : undefined;\n return Object.freeze({\n projectId: project.projectId,\n projectName: project.projectName,\n ...(plugins ? { plugins: Object.freeze(plugins) } : {}),\n });\n}\n\nexport function defineFpsRuntimePlugin(plugin: FpsRuntimePluginDefinition): Readonly<FpsRuntimePluginDefinition> {\n assertRuntimePluginKeys(plugin, ['manifest', 'runtime', 'scope', 'data'], 'Runtime plugin definition');\n const hasData = Object.prototype.hasOwnProperty.call(plugin, 'data');\n const manifest = defineFpsPluginManifest(plugin.manifest);\n const entry = defineFpsPluginEntry(plugin.runtime);\n if (manifest.id !== entry.pluginId) throw new Error(`Runtime plugin id mismatch: ${manifest.id}`);\n if (entry.environment !== 'runtime') throw new Error(`Runtime plugin has invalid environment: ${manifest.id}`);\n if (!manifest.entries.runtime) throw new Error(`Runtime plugin manifest entry is required: ${manifest.id}`);\n if (plugin.scope !== undefined && !['application', 'project', 'scene'].includes(plugin.scope)) {\n throw new Error(`Runtime plugin has invalid scope: ${plugin.manifest.id}`);\n }\n if (hasData) assertRuntimePluginKeys(plugin.data, ['schemaVersion', 'required', 'validate'], 'Runtime plugin data contract');\n if (hasData && (!Number.isInteger(plugin.data!.schemaVersion) || plugin.data!.schemaVersion < 1)) {\n throw new Error(`Runtime plugin data schemaVersion must be a positive integer: ${manifest.id}`);\n }\n if (hasData) {\n if (plugin.data!.required !== undefined && typeof plugin.data!.required !== 'boolean') {\n throw new Error(`Runtime plugin data required must be boolean: ${manifest.id}`);\n }\n if (typeof plugin.data!.validate !== 'function') throw new Error(`Runtime plugin data validator is required: ${manifest.id}`);\n if (plugin.data!.validate.constructor.name === 'AsyncFunction') {\n throw new Error(`Runtime plugin data validator must be synchronous: ${manifest.id}`);\n }\n }\n return Object.freeze({\n manifest,\n runtime: entry,\n ...(plugin.scope ? { scope: plugin.scope } : {}),\n ...(hasData ? { data: Object.freeze({\n schemaVersion: plugin.data!.schemaVersion,\n ...(plugin.data!.required === undefined ? {} : { required: plugin.data!.required }),\n validate: plugin.data!.validate,\n }) } : {}),\n });\n}\n\nfunction assertRuntimePluginKeys(value: unknown, keys: readonly string[], label: string): void {\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(`${label} must be an object.`);\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) throw new Error(`${label} must be a plain object.`);\n const allowed = new Set(keys);\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string' || !allowed.has(key)) throw new Error(`${label} contains unknown field: ${String(key)}`);\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor?.enumerable || !('value' in descriptor)) throw new Error(`${label} must contain enumerable data fields only: ${key}`);\n }\n}\n\nfunction readRuntimeDataArray(value: unknown, label: string): readonly unknown[] {\n if (!Array.isArray(value)) throw new Error(`${label} must be an array.`);\n const result: unknown[] = [];\n for (let index = 0; index < value.length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!descriptor?.enumerable || !('value' in descriptor)) throw new Error(`${label} must be a dense data array.`);\n result.push(descriptor.value);\n }\n for (const key of Reflect.ownKeys(value)) {\n if (key === 'length') continue;\n if (typeof key !== 'string' || !/^(0|[1-9][0-9]*)$/.test(key) || Number(key) >= value.length) {\n throw new Error(`${label} contains unsupported property: ${String(key)}`);\n }\n }\n return result;\n}\n\nexport function createFpsRuntime(options: FpsRuntimeOptions): FpsRuntime {\n const runtimeData = createFpsRuntimeDataSnapshot(options.data);\n const project = defineFpsProject(options.project);\n const plugins = [...createFpsStandardRuntimePlugins(), ...(project.plugins ?? []), ...(options.plugins ?? [])]\n .map(plugin => defineFpsRuntimePlugin(plugin));\n const pluginById = new Map<string, FpsRuntimePluginDefinition>();\n for (const plugin of plugins) {\n if (pluginById.has(plugin.manifest.id)) throw new Error(`Duplicate runtime plugin id: ${plugin.manifest.id}`);\n pluginById.set(plugin.manifest.id, plugin);\n }\n assertFpsRuntimePluginDataContracts(runtimeData, plugins);\n const applicationPlugins = plugins.filter(plugin => plugin.scope === 'application');\n const projectPlugins = plugins.filter(plugin => (plugin.scope ?? 'project') === 'project');\n const scenePlugins = plugins.filter(plugin => plugin.scope === 'scene');\n const applicationHost = createFpsPluginHost({\n environment: 'runtime',\n apiVersion: 1,\n manifests: applicationPlugins.map(plugin => plugin.manifest),\n loadEntry: async manifest => pluginById.get(manifest.id)?.runtime ?? null,\n report: options.report,\n });\n let projectHost: ReturnType<typeof createFpsPluginHost> | null = null;\n let state: FpsRuntime['state'] = 'created';\n let transitioning = false;\n\n return {\n get state() { return state; },\n get services() { return state === 'started' ? projectHost?.services ?? null : null; },\n async start() {\n if (transitioning) throw new Error('Runtime lifecycle transition already in progress.');\n if (state !== 'created') throw new Error(`Runtime cannot start from state: ${state}`);\n transitioning = true;\n try {\n await applicationHost.start();\n projectHost = applicationHost.createScope({\n scope: 'project',\n manifests: projectPlugins.map(plugin => plugin.manifest),\n initialServices: [\n { token: FPS_RUNTIME_PROJECT as FpsServiceToken<unknown>, value: project },\n { token: FPS_RUNTIME_DATA as FpsServiceToken<unknown>, value: runtimeData },\n ],\n loadEntry: async manifest => pluginById.get(manifest.id)?.runtime ?? null,\n });\n await projectHost.start();\n state = 'started';\n } catch (error) {\n let cleanupFailed = false;\n let cleanupError: unknown;\n try {\n if (applicationHost.state !== 'disposed') await applicationHost.dispose();\n }\n catch (cleanupCause) { cleanupFailed = true; cleanupError = cleanupCause; }\n finally {\n if (!cleanupFailed) projectHost = null;\n state = cleanupFailed ? 'cleanup-failed' : 'disposed';\n }\n if (cleanupFailed) {\n const combined = new Error(`Runtime startup failed and cleanup reported an error: ${String((error as Error)?.message ?? error)}; ${String((cleanupError as Error)?.message ?? cleanupError)}`);\n Object.assign(combined, { errors: [error, cleanupError] });\n throw combined;\n }\n throw error;\n } finally {\n transitioning = false;\n }\n },\n async stop() {\n if (transitioning) throw new Error('Runtime lifecycle transition already in progress.');\n if (state !== 'started' && state !== 'cleanup-failed') return;\n transitioning = true;\n try { await applicationHost.stop(); }\n finally {\n if (applicationHost.state === 'stopped') state = 'stopped';\n else if (applicationHost.state === 'cleanup-failed') state = 'cleanup-failed';\n else if (applicationHost.state === 'disposed') {\n projectHost = null;\n state = 'disposed';\n }\n transitioning = false;\n }\n },\n async dispose() {\n if (transitioning) throw new Error('Runtime lifecycle transition already in progress.');\n if (state === 'disposed') return;\n transitioning = true;\n try { await applicationHost.dispose(); }\n finally {\n if (applicationHost.state === 'disposed') {\n projectHost = null;\n state = 'disposed';\n }\n else if (applicationHost.state === 'cleanup-failed') state = 'cleanup-failed';\n transitioning = false;\n }\n },\n async createSceneScope(sceneId: string): Promise<FpsRuntimeSceneScope> {\n if (transitioning) throw new Error('Runtime lifecycle transition already in progress.');\n if (state !== 'started' || !projectHost) throw new Error(`Runtime scene scope requires started state, got: ${state}`);\n if (!sceneId.trim()) throw new Error('Runtime scene id is required.');\n const host = projectHost.createScope({\n scope: 'scene',\n manifests: scenePlugins.map(plugin => plugin.manifest),\n initialServices: [{ token: FPS_RUNTIME_SCENE_ID as FpsServiceToken<unknown>, value: sceneId }],\n loadEntry: async manifest => pluginById.get(manifest.id)?.runtime ?? null,\n });\n await host.start();\n return { id: sceneId, host, dispose: () => host.dispose() };\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineFpsPluginEntry, defineFpsPluginManifest } from '@fps-games/plugin-api';\nimport type { FpsServiceToken } from '@fps-games/plugin-api';\nimport { createFpsPluginHost } from '@fps-games/plugin-host';\nimport { FPS_ASSET_CATALOG_SOURCE } from '@fps-games/plugin-assets/resources';\nimport { assertFpsRuntimePluginDataContracts, createFpsRuntimeDataSnapshot } from './runtime-data.js';\nimport { createFpsStandardRuntimePlugins } from './standard-plugins.js';\nimport {\n FPS_RUNTIME_DATA,\n FPS_RUNTIME_PROJECT,\n FPS_RUNTIME_SCENE_ID,\n} from './tokens.js';\nimport type {\n FpsProjectDefinition,\n FpsRuntime,\n FpsRuntimeOptions,\n FpsRuntimePluginDefinition,\n FpsRuntimeSceneScope,\n} from './types.js';\n\nexport function defineFpsProject(project: FpsProjectDefinition): Readonly<FpsProjectDefinition> {\n assertRuntimePluginKeys(project, ['projectId', 'projectName', 'plugins'], 'Runtime project');\n if (typeof project.projectId !== 'string' || !project.projectId.trim()) throw new Error('Project id is required.');\n if (typeof project.projectName !== 'string' || !project.projectName.trim()) throw new Error('Project name is required.');\n const hasPlugins = Object.prototype.hasOwnProperty.call(project, 'plugins');\n const plugins = hasPlugins\n ? readRuntimeDataArray(project.plugins, 'Runtime project plugins').map(plugin => defineFpsRuntimePlugin(plugin as FpsRuntimePluginDefinition))\n : undefined;\n return Object.freeze({\n projectId: project.projectId,\n projectName: project.projectName,\n ...(plugins ? { plugins: Object.freeze(plugins) } : {}),\n });\n}\n\nexport function defineFpsRuntimePlugin(plugin: FpsRuntimePluginDefinition): Readonly<FpsRuntimePluginDefinition> {\n assertRuntimePluginKeys(plugin, ['manifest', 'runtime', 'scope', 'data'], 'Runtime plugin definition');\n const hasData = Object.prototype.hasOwnProperty.call(plugin, 'data');\n const manifest = defineFpsPluginManifest(plugin.manifest);\n const entry = defineFpsPluginEntry(plugin.runtime);\n if (manifest.id !== entry.pluginId) throw new Error(`Runtime plugin id mismatch: ${manifest.id}`);\n if (entry.environment !== 'runtime') throw new Error(`Runtime plugin has invalid environment: ${manifest.id}`);\n if (!manifest.entries.runtime) throw new Error(`Runtime plugin manifest entry is required: ${manifest.id}`);\n if (plugin.scope !== undefined && !['application', 'project', 'scene'].includes(plugin.scope)) {\n throw new Error(`Runtime plugin has invalid scope: ${plugin.manifest.id}`);\n }\n if (hasData) assertRuntimePluginKeys(plugin.data, ['schemaVersion', 'required', 'validate'], 'Runtime plugin data contract');\n if (hasData && (!Number.isInteger(plugin.data!.schemaVersion) || plugin.data!.schemaVersion < 1)) {\n throw new Error(`Runtime plugin data schemaVersion must be a positive integer: ${manifest.id}`);\n }\n if (hasData) {\n if (plugin.data!.required !== undefined && typeof plugin.data!.required !== 'boolean') {\n throw new Error(`Runtime plugin data required must be boolean: ${manifest.id}`);\n }\n if (typeof plugin.data!.validate !== 'function') throw new Error(`Runtime plugin data validator is required: ${manifest.id}`);\n if (plugin.data!.validate.constructor.name === 'AsyncFunction') {\n throw new Error(`Runtime plugin data validator must be synchronous: ${manifest.id}`);\n }\n }\n return Object.freeze({\n manifest,\n runtime: entry,\n ...(plugin.scope ? { scope: plugin.scope } : {}),\n ...(hasData ? { data: Object.freeze({\n schemaVersion: plugin.data!.schemaVersion,\n ...(plugin.data!.required === undefined ? {} : { required: plugin.data!.required }),\n validate: plugin.data!.validate,\n }) } : {}),\n });\n}\n\nfunction assertRuntimePluginKeys(value: unknown, keys: readonly string[], label: string): void {\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(`${label} must be an object.`);\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) throw new Error(`${label} must be a plain object.`);\n const allowed = new Set(keys);\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string' || !allowed.has(key)) throw new Error(`${label} contains unknown field: ${String(key)}`);\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor?.enumerable || !('value' in descriptor)) throw new Error(`${label} must contain enumerable data fields only: ${key}`);\n }\n}\n\nfunction readRuntimeDataArray(value: unknown, label: string): readonly unknown[] {\n if (!Array.isArray(value)) throw new Error(`${label} must be an array.`);\n const result: unknown[] = [];\n for (let index = 0; index < value.length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!descriptor?.enumerable || !('value' in descriptor)) throw new Error(`${label} must be a dense data array.`);\n result.push(descriptor.value);\n }\n for (const key of Reflect.ownKeys(value)) {\n if (key === 'length') continue;\n if (typeof key !== 'string' || !/^(0|[1-9][0-9]*)$/.test(key) || Number(key) >= value.length) {\n throw new Error(`${label} contains unsupported property: ${String(key)}`);\n }\n }\n return result;\n}\n\nexport function createFpsRuntime(options: FpsRuntimeOptions): FpsRuntime {\n const runtimeData = createFpsRuntimeDataSnapshot(options.data);\n const project = defineFpsProject(options.project);\n const plugins = [...createFpsStandardRuntimePlugins(), ...(project.plugins ?? []), ...(options.plugins ?? [])]\n .map(plugin => defineFpsRuntimePlugin(plugin));\n const pluginById = new Map<string, FpsRuntimePluginDefinition>();\n for (const plugin of plugins) {\n if (pluginById.has(plugin.manifest.id)) throw new Error(`Duplicate runtime plugin id: ${plugin.manifest.id}`);\n pluginById.set(plugin.manifest.id, plugin);\n }\n assertFpsRuntimePluginDataContracts(runtimeData, plugins);\n const applicationPlugins = plugins.filter(plugin => plugin.scope === 'application');\n const projectPlugins = plugins.filter(plugin => (plugin.scope ?? 'project') === 'project');\n const scenePlugins = plugins.filter(plugin => plugin.scope === 'scene');\n const applicationHost = createFpsPluginHost({\n environment: 'runtime',\n apiVersion: 1,\n manifests: applicationPlugins.map(plugin => plugin.manifest),\n loadEntry: async manifest => pluginById.get(manifest.id)?.runtime ?? null,\n report: options.report,\n });\n let projectHost: ReturnType<typeof createFpsPluginHost> | null = null;\n let state: FpsRuntime['state'] = 'created';\n let transitioning = false;\n\n return {\n get state() { return state; },\n get services() { return state === 'started' ? projectHost?.services ?? null : null; },\n async start() {\n if (transitioning) throw new Error('Runtime lifecycle transition already in progress.');\n if (state !== 'created') throw new Error(`Runtime cannot start from state: ${state}`);\n transitioning = true;\n try {\n await applicationHost.start();\n projectHost = applicationHost.createScope({\n scope: 'project',\n manifests: projectPlugins.map(plugin => plugin.manifest),\n initialServices: [\n { token: FPS_RUNTIME_PROJECT as FpsServiceToken<unknown>, value: project },\n { token: FPS_RUNTIME_DATA as FpsServiceToken<unknown>, value: runtimeData },\n {\n token: FPS_ASSET_CATALOG_SOURCE as FpsServiceToken<unknown>,\n value: Object.freeze({ catalog: options.assetCatalog }),\n },\n ],\n loadEntry: async manifest => pluginById.get(manifest.id)?.runtime ?? null,\n });\n await projectHost.start();\n state = 'started';\n } catch (error) {\n let cleanupFailed = false;\n let cleanupError: unknown;\n try {\n if (applicationHost.state !== 'disposed') await applicationHost.dispose();\n }\n catch (cleanupCause) { cleanupFailed = true; cleanupError = cleanupCause; }\n finally {\n if (!cleanupFailed) projectHost = null;\n state = cleanupFailed ? 'cleanup-failed' : 'disposed';\n }\n if (cleanupFailed) {\n const combined = new Error(`Runtime startup failed and cleanup reported an error: ${String((error as Error)?.message ?? error)}; ${String((cleanupError as Error)?.message ?? cleanupError)}`);\n Object.assign(combined, { errors: [error, cleanupError] });\n throw combined;\n }\n throw error;\n } finally {\n transitioning = false;\n }\n },\n async stop() {\n if (transitioning) throw new Error('Runtime lifecycle transition already in progress.');\n if (state !== 'started' && state !== 'cleanup-failed') return;\n transitioning = true;\n try { await applicationHost.stop(); }\n finally {\n if (applicationHost.state === 'stopped') state = 'stopped';\n else if (applicationHost.state === 'cleanup-failed') state = 'cleanup-failed';\n else if (applicationHost.state === 'disposed') {\n projectHost = null;\n state = 'disposed';\n }\n transitioning = false;\n }\n },\n async dispose() {\n if (transitioning) throw new Error('Runtime lifecycle transition already in progress.');\n if (state === 'disposed') return;\n transitioning = true;\n try { await applicationHost.dispose(); }\n finally {\n if (applicationHost.state === 'disposed') {\n projectHost = null;\n state = 'disposed';\n }\n else if (applicationHost.state === 'cleanup-failed') state = 'cleanup-failed';\n transitioning = false;\n }\n },\n async createSceneScope(sceneId: string): Promise<FpsRuntimeSceneScope> {\n if (transitioning) throw new Error('Runtime lifecycle transition already in progress.');\n if (state !== 'started' || !projectHost) throw new Error(`Runtime scene scope requires started state, got: ${state}`);\n if (!sceneId.trim()) throw new Error('Runtime scene id is required.');\n const host = projectHost.createScope({\n scope: 'scene',\n manifests: scenePlugins.map(plugin => plugin.manifest),\n initialServices: [{ token: FPS_RUNTIME_SCENE_ID as FpsServiceToken<unknown>, value: sceneId }],\n loadEntry: async manifest => pluginById.get(manifest.id)?.runtime ?? null,\n });\n await host.start();\n return { id: sceneId, host, dispose: () => host.dispose() };\n },\n };\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { FpsRuntimeData } from '@fps-games/playable-contracts';
|
|
2
2
|
import type { FpsDiagnostic, FpsPluginEntry, FpsPluginManifest, FpsServiceRegistry } from '@fps-games/plugin-api';
|
|
3
3
|
import type { FpsPluginHost } from '@fps-games/plugin-host';
|
|
4
|
+
import type { FpsAssetCatalogSource } from '@fps-games/plugin-assets/resources';
|
|
4
5
|
export interface FpsProjectDefinition {
|
|
5
6
|
readonly projectId: string;
|
|
6
7
|
readonly projectName: string;
|
|
@@ -37,6 +38,7 @@ export interface FpsRuntime {
|
|
|
37
38
|
export interface FpsRuntimeOptions {
|
|
38
39
|
project: FpsProjectDefinition;
|
|
39
40
|
data: FpsRuntimeData;
|
|
41
|
+
assetCatalog: FpsAssetCatalogSource['catalog'];
|
|
40
42
|
plugins?: readonly FpsRuntimePluginDefinition[];
|
|
41
43
|
report?(diagnostic: FpsDiagnostic): void;
|
|
42
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAClH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAClH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAEhF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;CAC1D;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE;QACd,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;KAC7C,CAAC;CACH;AAED,YAAY,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE9E,YAAY,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,YAAY,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,YAAY,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACtF,YAAY,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAEjF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,GAAG,UAAU,CAAC;IAClF,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAChD,MAAM,CAAC,CAAC,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;CAC1C;AAED,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kCAAkC,CAAC;AAE1C,qBAAa,yBAA0B,SAAQ,KAAK;IAEhD,QAAQ,CAAC,IAAI,EAAE,+BAA+B,GAAG,6BAA6B,GAAG,iCAAiC,GAAG,6BAA6B;IAClJ,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBADhB,IAAI,EAAE,+BAA+B,GAAG,6BAA6B,GAAG,iCAAiC,GAAG,6BAA6B,EACzI,QAAQ,EAAE,MAAM,EACzB,OAAO,EAAE,MAAM;CAKlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAoDA,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YACW,IAAyI,EACzI,QAAgB,EACzB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,SAAI,GAAJ,IAAI,CAAqI;QACzI,aAAQ,GAAR,QAAQ,CAAQ;QAIzB,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import type { FpsRuntimeData } from '@fps-games/playable-contracts';\nimport type { FpsDiagnostic, FpsPluginEntry, FpsPluginManifest, FpsServiceRegistry } from '@fps-games/plugin-api';\nimport type { FpsPluginHost } from '@fps-games/plugin-host';\nimport type { FpsAssetCatalogSource } from '@fps-games/plugin-assets/resources';\n\nexport interface FpsProjectDefinition {\n readonly projectId: string;\n readonly projectName: string;\n readonly plugins?: readonly FpsRuntimePluginDefinition[];\n}\n\nexport interface FpsRuntimePluginDefinition {\n readonly manifest: Readonly<FpsPluginManifest>;\n readonly runtime: Readonly<FpsPluginEntry>;\n readonly scope?: 'application' | 'project' | 'scene';\n readonly data?: {\n readonly schemaVersion: number;\n readonly required?: boolean;\n readonly validate: (value: unknown) => void;\n };\n}\n\nexport type { FpsRuntimeSceneService } from '@fps-games/plugin-scene/runtime';\n\nexport type { FpsRuntimeAssetService } from '@fps-games/plugin-assets/runtime';\nexport type { FpsRuntimeMarkerService } from '@fps-games/plugin-markers/runtime';\nexport type { FpsRuntimeRenderingService } from '@fps-games/plugin-rendering/runtime';\nexport type { FpsRuntimeShadowService } from '@fps-games/plugin-shadows/runtime';\n\nexport interface FpsRuntimeSceneScope {\n readonly id: string;\n readonly host: FpsPluginHost;\n dispose(): Promise<void>;\n}\n\nexport interface FpsRuntime {\n readonly state: 'created' | 'started' | 'stopped' | 'cleanup-failed' | 'disposed';\n readonly services: FpsServiceRegistry | null;\n start(): Promise<void>;\n stop(): Promise<void>;\n dispose(): Promise<void>;\n createSceneScope(sceneId: string): Promise<FpsRuntimeSceneScope>;\n}\n\nexport interface FpsRuntimeOptions {\n project: FpsProjectDefinition;\n data: FpsRuntimeData;\n assetCatalog: FpsAssetCatalogSource['catalog'];\n plugins?: readonly FpsRuntimePluginDefinition[];\n report?(diagnostic: FpsDiagnostic): void;\n}\n\nexport {\n FpsRuntimeDataError,\n FpsRuntimeSchemaError,\n} from '@fps-games/playable-runtime-data';\n\nexport class FpsRuntimePluginDataError extends Error {\n constructor(\n readonly code: 'runtime.plugin-data.unclaimed' | 'runtime.plugin-data.missing' | 'runtime.plugin-data.unsupported' | 'runtime.plugin-data.invalid',\n readonly pluginId: string,\n message: string,\n ) {\n super(message);\n this.name = 'FpsRuntimePluginDataError';\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fps-games/playable-runtime",
|
|
3
|
-
"version": "0.2.1-beta.
|
|
3
|
+
"version": "0.2.1-beta.3",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Plugin-based runtime host for fps-games playable projects.",
|
|
@@ -14,16 +14,16 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@fps-games/playable-contracts": "0.2.1-beta.
|
|
18
|
-
"@fps-games/playable-rendering": "0.2.1-beta.
|
|
19
|
-
"@fps-games/playable-runtime-data": "0.2.1-beta.
|
|
20
|
-
"@fps-games/plugin-assets": "0.2.1-beta.
|
|
21
|
-
"@fps-games/plugin-materials": "0.2.1-beta.
|
|
22
|
-
"@fps-games/plugin-markers": "0.2.1-beta.
|
|
23
|
-
"@fps-games/plugin-rendering": "0.2.1-beta.
|
|
24
|
-
"@fps-games/plugin-shadows": "0.2.1-beta.
|
|
25
|
-
"@fps-games/plugin-scene": "0.2.1-beta.
|
|
26
|
-
"@fps-games/plugin-api": "0.2.1-beta.
|
|
27
|
-
"@fps-games/plugin-host": "0.2.1-beta.
|
|
17
|
+
"@fps-games/playable-contracts": "0.2.1-beta.3",
|
|
18
|
+
"@fps-games/playable-rendering": "0.2.1-beta.3",
|
|
19
|
+
"@fps-games/playable-runtime-data": "0.2.1-beta.3",
|
|
20
|
+
"@fps-games/plugin-assets": "0.2.1-beta.3",
|
|
21
|
+
"@fps-games/plugin-materials": "0.2.1-beta.3",
|
|
22
|
+
"@fps-games/plugin-markers": "0.2.1-beta.3",
|
|
23
|
+
"@fps-games/plugin-rendering": "0.2.1-beta.3",
|
|
24
|
+
"@fps-games/plugin-shadows": "0.2.1-beta.3",
|
|
25
|
+
"@fps-games/plugin-scene": "0.2.1-beta.3",
|
|
26
|
+
"@fps-games/plugin-api": "0.2.1-beta.3",
|
|
27
|
+
"@fps-games/plugin-host": "0.2.1-beta.3"
|
|
28
28
|
}
|
|
29
29
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fps-games/playable-runtime-data",
|
|
3
|
-
"version": "0.2.1-beta.
|
|
3
|
+
"version": "0.2.1-beta.3",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Strict validation and immutable snapshots for fps-games Runtime Data.",
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@fps-games/playable-contracts": "0.2.1-beta.
|
|
18
|
-
"@fps-games/playable-rendering": "0.2.1-beta.
|
|
19
|
-
"@fps-games/plugin-api": "0.2.1-beta.
|
|
17
|
+
"@fps-games/playable-contracts": "0.2.1-beta.3",
|
|
18
|
+
"@fps-games/playable-rendering": "0.2.1-beta.3",
|
|
19
|
+
"@fps-games/plugin-api": "0.2.1-beta.3"
|
|
20
20
|
}
|
|
21
21
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fps-games/playable-scene",
|
|
3
|
-
"version": "0.2.1-beta.
|
|
3
|
+
"version": "0.2.1-beta.3",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Environment-neutral scene graph and transform domain logic.",
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@fps-games/playable-contracts": "0.2.1-beta.
|
|
17
|
+
"@fps-games/playable-contracts": "0.2.1-beta.3"
|
|
18
18
|
}
|
|
19
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../src/reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAG/B,eAAO,MAAM,oBAAoB,EAAG,mBAA4B,CAAC;AAEjE,wBAAgB,YAAY,IAAI,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../src/reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAG/B,eAAO,MAAM,oBAAoB,EAAG,mBAA4B,CAAC;AAEjE,wBAAgB,YAAY,IAAI,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAUjE;AAED,wBAAgB,6BAA6B,IAAI,QAAQ,CAAC,iBAAiB,CAAC,CAmB3E"}
|