@webspatial/core-sdk 1.7.0 → 2.0.0
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/CHANGELOG.md +61 -0
- package/README.md +10 -0
- package/dist/JSBCommand.d.ts +398 -0
- package/dist/JSBCommand.js +668 -0
- package/dist/JSBCommand.js.map +1 -0
- package/dist/Spatial.d.ts +63 -0
- package/dist/Spatial.js +60 -0
- package/dist/Spatial.js.map +1 -0
- package/dist/SpatialObject.d.ts +19 -0
- package/dist/SpatialObject.js +44 -0
- package/dist/SpatialObject.js.map +1 -0
- package/dist/SpatialScene.d.ts +51 -0
- package/dist/SpatialScene.js +74 -0
- package/dist/SpatialScene.js.map +1 -0
- package/dist/SpatialSession.d.ts +143 -0
- package/dist/SpatialSession.js +173 -0
- package/dist/SpatialSession.js.map +1 -0
- package/dist/SpatialWebEvent.d.ts +8 -0
- package/dist/SpatialWebEvent.js +18 -0
- package/dist/SpatialWebEvent.js.map +1 -0
- package/dist/SpatialWebEventCreator.d.ts +11 -0
- package/dist/SpatialWebEventCreator.js +11 -0
- package/dist/SpatialWebEventCreator.js.map +1 -0
- package/dist/Spatialized2DElement.d.ts +42 -0
- package/dist/Spatialized2DElement.js +47 -0
- package/dist/Spatialized2DElement.js.map +1 -0
- package/dist/SpatializedDynamic3DElement.d.ts +7 -0
- package/dist/SpatializedDynamic3DElement.js +43 -0
- package/dist/SpatializedDynamic3DElement.js.map +1 -0
- package/dist/SpatializedElement.d.ts +7 -0
- package/dist/SpatializedElement.js +206 -0
- package/dist/SpatializedElement.js.map +1 -0
- package/dist/SpatializedElementCreator.d.ts +15 -0
- package/dist/SpatializedElementCreator.js +47 -0
- package/dist/SpatializedElementCreator.js.map +1 -0
- package/dist/SpatializedStatic3DElement.d.ts +195 -0
- package/dist/SpatializedStatic3DElement.js +327 -0
- package/dist/SpatializedStatic3DElement.js.map +1 -0
- package/dist/WebMsgCommand.d.ts +7 -0
- package/dist/WebMsgCommand.js +23 -0
- package/dist/WebMsgCommand.js.map +1 -0
- package/dist/index.d.ts +35 -1251
- package/dist/index.js +21 -3650
- package/dist/index.js.map +1 -1
- package/dist/install-polyfills.d.ts +2 -0
- package/dist/install-polyfills.js +13 -0
- package/dist/install-polyfills.js.map +1 -0
- package/dist/isSSREnv.d.ts +3 -0
- package/dist/isSSREnv.js +6 -0
- package/dist/isSSREnv.js.map +1 -0
- package/dist/motion/AnimationObject.d.ts +7 -0
- package/dist/motion/AnimationObject.js +140 -0
- package/dist/motion/AnimationObject.js.map +1 -0
- package/dist/motion/compute/index.d.ts +10 -0
- package/dist/motion/compute/index.js +19 -0
- package/dist/motion/compute/index.js.map +1 -0
- package/dist/motion/compute/motionPropertyValues.d.ts +19 -0
- package/dist/motion/compute/motionPropertyValues.js +50 -0
- package/dist/motion/compute/motionPropertyValues.js.map +1 -0
- package/dist/motion/compute/normalize.d.ts +31 -0
- package/dist/motion/compute/normalize.js +201 -0
- package/dist/motion/compute/normalize.js.map +1 -0
- package/dist/motion/compute/validate.d.ts +22 -0
- package/dist/motion/compute/validate.js +103 -0
- package/dist/motion/compute/validate.js.map +1 -0
- package/dist/motion/index.d.ts +8 -0
- package/dist/motion/index.js +6 -0
- package/dist/motion/index.js.map +1 -0
- package/dist/motion/native/serializeMotionTimeline.d.ts +12 -0
- package/dist/motion/native/serializeMotionTimeline.js +21 -0
- package/dist/motion/native/serializeMotionTimeline.js.map +1 -0
- package/dist/physicalMetrics-W5uZ5xKb.d.ts +48 -0
- package/dist/physicalMetrics.d.ts +1 -0
- package/dist/physicalMetrics.js +58 -0
- package/dist/physicalMetrics.js.map +1 -0
- package/dist/platform-adapter/CommandResultUtils.d.ts +12 -0
- package/dist/platform-adapter/CommandResultUtils.js +21 -0
- package/dist/platform-adapter/CommandResultUtils.js.map +1 -0
- package/dist/platform-adapter/createPlatformSync.d.ts +16 -0
- package/dist/platform-adapter/createPlatformSync.js +30 -0
- package/dist/platform-adapter/createPlatformSync.js.map +1 -0
- package/dist/platform-adapter/index.d.ts +12 -0
- package/dist/platform-adapter/index.js +10 -0
- package/dist/platform-adapter/index.js.map +1 -0
- package/dist/platform-adapter/interface.d.ts +7 -0
- package/dist/platform-adapter/interface.js +1 -0
- package/dist/platform-adapter/interface.js.map +1 -0
- package/dist/platform-adapter/pico-os/PicoOSPlatform.d.ts +25 -0
- package/dist/platform-adapter/pico-os/PicoOSPlatform.js +168 -0
- package/dist/platform-adapter/pico-os/PicoOSPlatform.js.map +1 -0
- package/dist/platform-adapter/puppeteer/PuppeteerPlatform.d.ts +66 -0
- package/dist/platform-adapter/puppeteer/PuppeteerPlatform.js +372 -0
- package/dist/platform-adapter/puppeteer/PuppeteerPlatform.js.map +1 -0
- package/dist/platform-adapter/spatialRequestMetadata.d.ts +6 -0
- package/dist/platform-adapter/spatialRequestMetadata.js +39 -0
- package/dist/platform-adapter/spatialRequestMetadata.js.map +1 -0
- package/dist/platform-adapter/spatialSceneQuery.d.ts +12 -0
- package/dist/platform-adapter/spatialSceneQuery.js +12 -0
- package/dist/platform-adapter/spatialSceneQuery.js.map +1 -0
- package/dist/platform-adapter/vision-os/VisionOSPlatform.d.ts +19 -0
- package/dist/platform-adapter/vision-os/VisionOSPlatform.js +77 -0
- package/dist/platform-adapter/vision-os/VisionOSPlatform.js.map +1 -0
- package/dist/platform-runtime.d.ts +12 -0
- package/dist/platform-runtime.js +14 -0
- package/dist/platform-runtime.js.map +1 -0
- package/dist/reality/Attachment.d.ts +19 -0
- package/dist/reality/Attachment.js +39 -0
- package/dist/reality/Attachment.js.map +1 -0
- package/dist/reality/component/ModelComponent.d.ts +14 -0
- package/dist/reality/component/ModelComponent.js +11 -0
- package/dist/reality/component/ModelComponent.js.map +1 -0
- package/dist/reality/component/SpatialComponent.d.ts +8 -0
- package/dist/reality/component/SpatialComponent.js +19 -0
- package/dist/reality/component/SpatialComponent.js.map +1 -0
- package/dist/reality/component/index.d.ts +8 -0
- package/dist/reality/component/index.js +3 -0
- package/dist/reality/component/index.js.map +1 -0
- package/dist/reality/entity/SpatialEntity.d.ts +7 -0
- package/dist/reality/entity/SpatialEntity.js +291 -0
- package/dist/reality/entity/SpatialEntity.js.map +1 -0
- package/dist/reality/entity/SpatialModelEntity.d.ts +17 -0
- package/dist/reality/entity/SpatialModelEntity.js +17 -0
- package/dist/reality/entity/SpatialModelEntity.js.map +1 -0
- package/dist/reality/entity/index.d.ts +8 -0
- package/dist/reality/entity/index.js +3 -0
- package/dist/reality/entity/index.js.map +1 -0
- package/dist/reality/geometry/SpatialBoxGeometry.d.ts +16 -0
- package/dist/reality/geometry/SpatialBoxGeometry.js +13 -0
- package/dist/reality/geometry/SpatialBoxGeometry.js.map +1 -0
- package/dist/reality/geometry/SpatialConeGeometry.d.ts +16 -0
- package/dist/reality/geometry/SpatialConeGeometry.js +13 -0
- package/dist/reality/geometry/SpatialConeGeometry.js.map +1 -0
- package/dist/reality/geometry/SpatialCylinderGeometry.d.ts +16 -0
- package/dist/reality/geometry/SpatialCylinderGeometry.js +13 -0
- package/dist/reality/geometry/SpatialCylinderGeometry.js.map +1 -0
- package/dist/reality/geometry/SpatialGeometry.d.ts +7 -0
- package/dist/reality/geometry/SpatialGeometry.js +13 -0
- package/dist/reality/geometry/SpatialGeometry.js.map +1 -0
- package/dist/reality/geometry/SpatialPlaneGeometry.d.ts +16 -0
- package/dist/reality/geometry/SpatialPlaneGeometry.js +13 -0
- package/dist/reality/geometry/SpatialPlaneGeometry.js.map +1 -0
- package/dist/reality/geometry/SpatialSphereGeometry.d.ts +16 -0
- package/dist/reality/geometry/SpatialSphereGeometry.js +13 -0
- package/dist/reality/geometry/SpatialSphereGeometry.js.map +1 -0
- package/dist/reality/geometry/index.d.ts +12 -0
- package/dist/reality/geometry/index.js +7 -0
- package/dist/reality/geometry/index.js.map +1 -0
- package/dist/reality/index.d.ts +18 -0
- package/dist/reality/index.js +7 -0
- package/dist/reality/index.js.map +1 -0
- package/dist/reality/material/SpatialMaterial.d.ts +7 -0
- package/dist/reality/material/SpatialMaterial.js +13 -0
- package/dist/reality/material/SpatialMaterial.js.map +1 -0
- package/dist/reality/material/SpatialUnlitMaterial.d.ts +16 -0
- package/dist/reality/material/SpatialUnlitMaterial.js +16 -0
- package/dist/reality/material/SpatialUnlitMaterial.js.map +1 -0
- package/dist/reality/material/index.d.ts +8 -0
- package/dist/reality/material/index.js +3 -0
- package/dist/reality/material/index.js.map +1 -0
- package/dist/reality/realityCreator.d.ts +22 -0
- package/dist/reality/realityCreator.js +89 -0
- package/dist/reality/realityCreator.js.map +1 -0
- package/dist/reality/resource/SpatialModelAsset.d.ts +15 -0
- package/dist/reality/resource/SpatialModelAsset.js +12 -0
- package/dist/reality/resource/SpatialModelAsset.js.map +1 -0
- package/dist/reality/resource/SpatialTextureResource.d.ts +16 -0
- package/dist/reality/resource/SpatialTextureResource.js +16 -0
- package/dist/reality/resource/SpatialTextureResource.js.map +1 -0
- package/dist/reality/resource/index.d.ts +9 -0
- package/dist/reality/resource/index.js +3 -0
- package/dist/reality/resource/index.js.map +1 -0
- package/dist/runtime/WebSpatialRuntimeError.d.ts +10 -0
- package/dist/runtime/WebSpatialRuntimeError.js +14 -0
- package/dist/runtime/WebSpatialRuntimeError.js.map +1 -0
- package/dist/runtime/capability-data.d.ts +12 -0
- package/dist/runtime/capability-data.js +134 -0
- package/dist/runtime/capability-data.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -0
- package/dist/runtime/index.js +27 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/jsbAdapterPlatform.d.ts +9 -0
- package/dist/runtime/jsbAdapterPlatform.js +38 -0
- package/dist/runtime/jsbAdapterPlatform.js.map +1 -0
- package/dist/runtime/keys.d.ts +34 -0
- package/dist/runtime/keys.js +122 -0
- package/dist/runtime/keys.js.map +1 -0
- package/dist/runtime/semver.d.ts +8 -0
- package/dist/runtime/semver.js +32 -0
- package/dist/runtime/semver.js.map +1 -0
- package/dist/runtime/supports.d.ts +22 -0
- package/dist/runtime/supports.js +78 -0
- package/dist/runtime/supports.js.map +1 -0
- package/dist/runtime/types.d.ts +12 -0
- package/dist/runtime/types.js +1 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/userAgent.d.ts +20 -0
- package/dist/runtime/userAgent.js +41 -0
- package/dist/runtime/userAgent.js.map +1 -0
- package/dist/scene-polyfill.d.ts +18 -0
- package/dist/scene-polyfill.js +480 -0
- package/dist/scene-polyfill.js.map +1 -0
- package/dist/spatial-host.d.ts +13 -0
- package/dist/spatial-host.js +18 -0
- package/dist/spatial-host.js.map +1 -0
- package/dist/spatial-window-polyfill.d.ts +3 -0
- package/dist/spatial-window-polyfill.js +155 -0
- package/dist/spatial-window-polyfill.js.map +1 -0
- package/dist/spatializedElementMotion-_0XWPQCE.d.ts +1009 -0
- package/dist/types/animation.d.ts +7 -0
- package/dist/types/animation.js +1 -0
- package/dist/types/animation.js.map +1 -0
- package/dist/types/global.d.ts +38 -0
- package/dist/types/global.js +1 -0
- package/dist/types/global.js.map +1 -0
- package/dist/types/internal.d.ts +7 -0
- package/dist/types/internal.js +12 -0
- package/dist/types/internal.js.map +1 -0
- package/dist/types/motion/index.d.ts +7 -0
- package/dist/types/motion/index.js +3 -0
- package/dist/types/motion/index.js.map +1 -0
- package/dist/types/motion/spatializedElementMotion.d.ts +7 -0
- package/dist/types/motion/spatializedElementMotion.js +1 -0
- package/dist/types/motion/spatializedElementMotion.js.map +1 -0
- package/dist/types/motion/spatializedMotion.d.ts +7 -0
- package/dist/types/motion/spatializedMotion.js +16 -0
- package/dist/types/motion/spatializedMotion.js.map +1 -0
- package/dist/types/motion/spatializedPlayback.d.ts +11 -0
- package/dist/types/motion/spatializedPlayback.js +1 -0
- package/dist/types/motion/spatializedPlayback.js.map +1 -0
- package/dist/types/motion/spatializedVisual.d.ts +35 -0
- package/dist/types/motion/spatializedVisual.js +1 -0
- package/dist/types/motion/spatializedVisual.js.map +1 -0
- package/dist/types/types.d.ts +7 -0
- package/dist/types/types.js +117 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils.d.ts +44 -0
- package/dist/utils.js +86 -0
- package/dist/utils.js.map +1 -0
- package/package.json +20 -4
- package/src/JSBCommand.ts +132 -5
- package/src/SpatialObject.ts +10 -0
- package/src/Spatialized2DElement.ts +5 -0
- package/src/SpatializedDynamic3DElement.ts +5 -0
- package/src/SpatializedElement.ts +29 -0
- package/src/SpatializedStatic3DElement.ts +42 -3
- package/src/WebMsgCommand.ts +40 -0
- package/src/coverage-boost.test.ts +239 -216
- package/src/index.ts +25 -11
- package/src/install-polyfills.ts +38 -0
- package/src/jsbcommand.coverage.test.ts +23 -0
- package/src/motion/AnimationObject.test.ts +421 -0
- package/src/motion/AnimationObject.ts +208 -0
- package/src/motion/compute/index.ts +10 -0
- package/src/motion/compute/motionPropertyValues.test.ts +55 -0
- package/src/motion/compute/motionPropertyValues.ts +70 -0
- package/src/motion/compute/normalize.test.ts +99 -0
- package/src/motion/compute/normalize.ts +289 -0
- package/src/motion/compute/validate.test.ts +229 -0
- package/src/motion/compute/validate.ts +156 -0
- package/src/motion/index.ts +2 -0
- package/src/motion/native/serializeMotionTimeline.test.ts +61 -0
- package/src/motion/native/serializeMotionTimeline.ts +27 -0
- package/src/platform-adapter/createPlatformSync.ts +5 -3
- package/src/platform-adapter/pico-os/PicoOSPlatform.ts +76 -11
- package/src/platform-adapter/spatialRequestMetadata.test.ts +175 -0
- package/src/platform-adapter/spatialRequestMetadata.ts +48 -0
- package/src/platform-adapter/vision-os/VisionOSPlatform.ts +6 -1
- package/src/reality/entity/SpatialEntity.ts +127 -0
- package/src/runtime/capability-data.ts +104 -4
- package/src/runtime/index.ts +0 -11
- package/src/runtime/keys.ts +12 -1
- package/src/runtime/supports.test.ts +143 -4
- package/src/runtime/supports.ts +3 -1
- package/src/runtime/useAnimation.capability.test.ts +275 -0
- package/src/scene-polyfill.manifest.test.ts +306 -5
- package/src/scene-polyfill.request-metadata.test.ts +39 -0
- package/src/scene-polyfill.test.ts +33 -94
- package/src/scene-polyfill.ts +117 -87
- package/src/spatial-window-polyfill.ts +18 -2
- package/src/transform-roundtrip.test.ts +90 -0
- package/src/types/animation.ts +224 -0
- package/src/types/global.ts +1 -8
- package/src/types/motion/index.ts +10 -0
- package/src/types/motion/spatializedElementMotion.ts +49 -0
- package/src/types/motion/spatializedMotion.ts +147 -0
- package/src/types/motion/spatializedPlayback.ts +17 -0
- package/src/types/motion/spatializedVisual.ts +24 -0
- package/src/types/types.ts +3 -0
- package/src/utils.ts +54 -0
- package/tsup.config.ts +61 -36
- package/vitest.config.ts +5 -1
- package/dist/iife/index.d.ts +0 -1251
- package/dist/iife/index.global.js +0 -75
- package/dist/iife/index.global.js.map +0 -1
- package/src/platform-adapter/ssr/SSRPlatform.ts +0 -52
- /package/src/{ssr-polyfill.ts → isSSREnv.ts} +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
class WebSpatialRuntimeError extends Error {
|
|
2
|
+
capability;
|
|
3
|
+
constructor(capability, message) {
|
|
4
|
+
super(
|
|
5
|
+
message ?? `Capability "${capability}" is not supported in this WebSpatial runtime`
|
|
6
|
+
);
|
|
7
|
+
this.name = "WebSpatialRuntimeError";
|
|
8
|
+
this.capability = capability;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
WebSpatialRuntimeError
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=WebSpatialRuntimeError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/WebSpatialRuntimeError.ts"],"sourcesContent":["/**\n * Thrown when a runtime-gated JS API is invoked but `supports('<name>')` is false.\n * See OpenSpec `runtime-capabilities/spec.md` (Unsupported behavior contracts).\n */\nexport class WebSpatialRuntimeError extends Error {\n public readonly capability: string\n\n constructor(capability: string, message?: string) {\n super(\n message ??\n `Capability \"${capability}\" is not supported in this WebSpatial runtime`,\n )\n this.name = 'WebSpatialRuntimeError'\n this.capability = capability\n }\n}\n"],"mappings":"AAIO,MAAM,+BAA+B,MAAM;AAAA,EAChC;AAAA,EAEhB,YAAY,YAAoB,SAAkB;AAChD;AAAA,MACE,WACE,eAAe,UAAU;AAAA,IAC7B;AACA,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AACF;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type CapabilityVersionRow = {
|
|
2
|
+
/** Semver string from `WSAppShell` / `PicoWebApp` (see `review.md` §4). */
|
|
3
|
+
version: string;
|
|
4
|
+
/** Top-level keys and `name:subToken` compound keys. */
|
|
5
|
+
flags: Record<string, boolean>;
|
|
6
|
+
};
|
|
7
|
+
declare const CAPABILITY_TABLE: {
|
|
8
|
+
visionos: CapabilityVersionRow[];
|
|
9
|
+
picoos: CapabilityVersionRow[];
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { CAPABILITY_TABLE, type CapabilityVersionRow };
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { SUB_TOKENS_BY_NAME, TOP_LEVEL_KEYS } from "./keys";
|
|
2
|
+
function baseTrueFlags() {
|
|
3
|
+
const flags = {};
|
|
4
|
+
for (const k of TOP_LEVEL_KEYS) {
|
|
5
|
+
flags[k] = true;
|
|
6
|
+
}
|
|
7
|
+
for (const [name, toks] of Object.entries(SUB_TOKENS_BY_NAME)) {
|
|
8
|
+
for (const t of toks) {
|
|
9
|
+
flags[`${name}:${t}`] = true;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return flags;
|
|
13
|
+
}
|
|
14
|
+
function matrixVision_1_5_0_Flags() {
|
|
15
|
+
const flags = baseTrueFlags();
|
|
16
|
+
const modelNo = [
|
|
17
|
+
"autoplay",
|
|
18
|
+
"loop",
|
|
19
|
+
"stagemode",
|
|
20
|
+
"poster",
|
|
21
|
+
"loading",
|
|
22
|
+
"source",
|
|
23
|
+
"paused",
|
|
24
|
+
"duration",
|
|
25
|
+
"playbackRate",
|
|
26
|
+
"play",
|
|
27
|
+
"pause",
|
|
28
|
+
"currentTime"
|
|
29
|
+
];
|
|
30
|
+
for (const t of modelNo) {
|
|
31
|
+
flags[`Model:${t}`] = false;
|
|
32
|
+
}
|
|
33
|
+
flags["SpatialRotateEvent:constrainedToAxis"] = true;
|
|
34
|
+
flags["useAnimation"] = false;
|
|
35
|
+
flags["AttachmentEntity:placement"] = false;
|
|
36
|
+
return flags;
|
|
37
|
+
}
|
|
38
|
+
function matrixVision_1_6_0_Flags() {
|
|
39
|
+
const flags = baseTrueFlags();
|
|
40
|
+
for (const t of ["stagemode", "poster", "loading", "currentTime"]) {
|
|
41
|
+
flags[`Model:${t}`] = false;
|
|
42
|
+
}
|
|
43
|
+
flags["SpatialRotateEvent:constrainedToAxis"] = true;
|
|
44
|
+
flags["useAnimation"] = false;
|
|
45
|
+
flags["AttachmentEntity:placement"] = false;
|
|
46
|
+
return flags;
|
|
47
|
+
}
|
|
48
|
+
function matrixVision_1_7_0_Flags() {
|
|
49
|
+
const flags = matrixVision_1_6_0_Flags();
|
|
50
|
+
flags["Model:currentTime"] = true;
|
|
51
|
+
flags["Model:loading"] = true;
|
|
52
|
+
flags["Model:poster"] = true;
|
|
53
|
+
return flags;
|
|
54
|
+
}
|
|
55
|
+
function matrixVision_1_8_0_Flags() {
|
|
56
|
+
const flags = matrixVision_1_7_0_Flags();
|
|
57
|
+
flags["useAnimation"] = true;
|
|
58
|
+
return flags;
|
|
59
|
+
}
|
|
60
|
+
function matrixPico_0_1_1_Flags() {
|
|
61
|
+
const flags = matrixVision_1_5_0_Flags();
|
|
62
|
+
flags.xrInnerDepth = false;
|
|
63
|
+
flags.xrOuterDepth = false;
|
|
64
|
+
return flags;
|
|
65
|
+
}
|
|
66
|
+
function matrixPico_0_1_2_Flags() {
|
|
67
|
+
const flags = matrixVision_1_6_0_Flags();
|
|
68
|
+
flags.xrInnerDepth = false;
|
|
69
|
+
flags.xrOuterDepth = false;
|
|
70
|
+
flags["Model:currentTime"] = true;
|
|
71
|
+
flags["Model:poster"] = true;
|
|
72
|
+
return flags;
|
|
73
|
+
}
|
|
74
|
+
function matrixPico_0_2_2_Flags() {
|
|
75
|
+
const flags = matrixPico_0_1_2_Flags();
|
|
76
|
+
return flags;
|
|
77
|
+
}
|
|
78
|
+
function matrixPico_0_3_1_Flags() {
|
|
79
|
+
const flags = matrixPico_0_2_2_Flags();
|
|
80
|
+
flags["Model:loading"] = true;
|
|
81
|
+
return flags;
|
|
82
|
+
}
|
|
83
|
+
function matrixPico_0_4_90_Flags() {
|
|
84
|
+
const flags = matrixPico_0_3_1_Flags();
|
|
85
|
+
flags["useAnimation"] = true;
|
|
86
|
+
flags["AttachmentEntity:placement"] = true;
|
|
87
|
+
return flags;
|
|
88
|
+
}
|
|
89
|
+
function visionOsRow_1_5_0() {
|
|
90
|
+
return { version: "1.5.0", flags: matrixVision_1_5_0_Flags() };
|
|
91
|
+
}
|
|
92
|
+
function visionOsRow_1_6_0() {
|
|
93
|
+
return { version: "1.6.0", flags: matrixVision_1_6_0_Flags() };
|
|
94
|
+
}
|
|
95
|
+
function visionOsRow_1_7_0() {
|
|
96
|
+
return { version: "1.7.0", flags: matrixVision_1_7_0_Flags() };
|
|
97
|
+
}
|
|
98
|
+
function visionOsRow_1_8_0() {
|
|
99
|
+
return { version: "1.8.0", flags: matrixVision_1_8_0_Flags() };
|
|
100
|
+
}
|
|
101
|
+
function picoOsRow_0_1_1() {
|
|
102
|
+
return { version: "0.1.1", flags: matrixPico_0_1_1_Flags() };
|
|
103
|
+
}
|
|
104
|
+
function picoOsRow_0_1_2() {
|
|
105
|
+
return { version: "0.1.2", flags: matrixPico_0_1_2_Flags() };
|
|
106
|
+
}
|
|
107
|
+
function picoOsRow_0_2_2() {
|
|
108
|
+
return { version: "0.2.2", flags: matrixPico_0_2_2_Flags() };
|
|
109
|
+
}
|
|
110
|
+
function picoOsRow_0_3_1() {
|
|
111
|
+
return { version: "0.3.1", flags: matrixPico_0_3_1_Flags() };
|
|
112
|
+
}
|
|
113
|
+
function picoOsRow_0_4_90() {
|
|
114
|
+
return { version: "0.4.90", flags: matrixPico_0_4_90_Flags() };
|
|
115
|
+
}
|
|
116
|
+
const CAPABILITY_TABLE = {
|
|
117
|
+
visionos: [
|
|
118
|
+
visionOsRow_1_5_0(),
|
|
119
|
+
visionOsRow_1_6_0(),
|
|
120
|
+
visionOsRow_1_7_0(),
|
|
121
|
+
visionOsRow_1_8_0()
|
|
122
|
+
],
|
|
123
|
+
picoos: [
|
|
124
|
+
picoOsRow_0_1_1(),
|
|
125
|
+
picoOsRow_0_1_2(),
|
|
126
|
+
picoOsRow_0_2_2(),
|
|
127
|
+
picoOsRow_0_3_1(),
|
|
128
|
+
picoOsRow_0_4_90()
|
|
129
|
+
]
|
|
130
|
+
};
|
|
131
|
+
export {
|
|
132
|
+
CAPABILITY_TABLE
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=capability-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/capability-data.ts"],"sourcesContent":["/**\n * Versioned capability rows transcribed from the product matrix (`capability-matrix.template.md`).\n * visionOS **WSAppShell/1.5.0** & **1.6.0** & **1.7.0** & **1.8.0**; picoOS **PicoWebApp/0.1.1** & **0.1.2** & **0.2.2** & **0.3.1** & **0.4.90** — see matrix in OpenSpec / product docs.\n *\n * **picoOS** rows use dedicated builders (alpha2.0 / alpha2.1 subtokens); visionOS rows are separate.\n */\nimport { SUB_TOKENS_BY_NAME, TOP_LEVEL_KEYS } from './keys'\n\nexport type CapabilityVersionRow = {\n /** Semver string from `WSAppShell` / `PicoWebApp` (see `review.md` §4). */\n version: string\n /** Top-level keys and `name:subToken` compound keys. */\n flags: Record<string, boolean>\n}\n\nfunction baseTrueFlags(): Record<string, boolean> {\n const flags: Record<string, boolean> = {}\n for (const k of TOP_LEVEL_KEYS) {\n flags[k] = true\n }\n for (const [name, toks] of Object.entries(SUB_TOKENS_BY_NAME)) {\n for (const t of toks) {\n flags[`${name}:${t}`] = true\n }\n }\n return flags\n}\n\n/**\n * visionOS **WSAppShell/1.5.0**.\n * Model: only `ready`, `currentSrc`, `entityTransform` among tracked sub-tokens are Y; SpatialRotateEvent:constrainedToAxis Y.\n */\nfunction matrixVision_1_5_0_Flags(): Record<string, boolean> {\n const flags = baseTrueFlags()\n const modelNo = [\n 'autoplay',\n 'loop',\n 'stagemode',\n 'poster',\n 'loading',\n 'source',\n 'paused',\n 'duration',\n 'playbackRate',\n 'play',\n 'pause',\n 'currentTime',\n ] as const\n for (const t of modelNo) {\n flags[`Model:${t}`] = false\n }\n flags['SpatialRotateEvent:constrainedToAxis'] = true\n // Container useAnimation is not supported until WSAppShell/1.8.0.\n flags['useAnimation'] = false\n // Placement-shaped attachment protocol lands in picoOS PicoWebApp/0.4.90\n // (OTA0); no visionOS shell decodes it yet.\n flags['AttachmentEntity:placement'] = false\n return flags\n}\n\n/**\n * visionOS **WSAppShell/1.6.0** — WebSpatial April / playback expansion (see product matrix).\n * Model: `stagemode`, `poster`, `loading`, `currentTime` remain N; rest of tracked Model sub-tokens Y.\n */\nfunction matrixVision_1_6_0_Flags(): Record<string, boolean> {\n const flags = baseTrueFlags()\n for (const t of ['stagemode', 'poster', 'loading', 'currentTime'] as const) {\n flags[`Model:${t}`] = false\n }\n flags['SpatialRotateEvent:constrainedToAxis'] = true\n // Container useAnimation is not supported until WSAppShell/1.8.0.\n flags['useAnimation'] = false\n // Placement-shaped attachment protocol lands in picoOS PicoWebApp/0.4.90\n // (OTA0); no visionOS shell decodes it yet.\n flags['AttachmentEntity:placement'] = false\n return flags\n}\n\n/**\n * visionOS **WSAppShell/1.7.0** — entity transform animation support.\n * Container `useAnimation` remains unavailable in this row.\n */\nfunction matrixVision_1_7_0_Flags(): Record<string, boolean> {\n const flags = matrixVision_1_6_0_Flags()\n flags['Model:currentTime'] = true\n flags['Model:loading'] = true\n flags['Model:poster'] = true\n return flags\n}\n\n/**\n * visionOS **WSAppShell/1.8.0**.\n */\nfunction matrixVision_1_8_0_Flags(): Record<string, boolean> {\n const flags = matrixVision_1_7_0_Flags()\n flags['useAnimation'] = true\n return flags\n}\n\n/**\n * picoOS **PicoWebApp/0.1.1** — alpha2.0 baseline (product matrix).\n * WindowScene / VolumeScene / Material subtokens Y; Model sub-tokens per matrix; **`xrInnerDepth` / `xrOuterDepth` N**.\n */\nfunction matrixPico_0_1_1_Flags(): Record<string, boolean> {\n const flags = matrixVision_1_5_0_Flags()\n flags.xrInnerDepth = false\n flags.xrOuterDepth = false\n return flags\n}\n\n/**\n * picoOS **PicoWebApp/0.1.2** — beta2.0 playback expansion (product matrix).\n * **`xrInnerDepth` / `xrOuterDepth` N** (same as 0.1.1).\n */\nfunction matrixPico_0_1_2_Flags(): Record<string, boolean> {\n const flags = matrixVision_1_6_0_Flags()\n flags.xrInnerDepth = false\n flags.xrOuterDepth = false\n flags['Model:currentTime'] = true\n flags['Model:poster'] = true\n return flags\n}\n\n/**\n * picoOS **PicoWebApp/0.2.2** — entity transform animation support.\n * Container `useAnimation` remains unavailable in this row.\n */\nfunction matrixPico_0_2_2_Flags(): Record<string, boolean> {\n const flags = matrixPico_0_1_2_Flags()\n return flags\n}\n\n/**\n * picoOS **PicoWebApp/0.3.1** — beta2.1\n */\nfunction matrixPico_0_3_1_Flags(): Record<string, boolean> {\n const flags = matrixPico_0_2_2_Flags()\n flags['Model:loading'] = true\n return flags\n}\n\n/**\n * picoOS **PicoWebApp/0.4.90** — OTA0 container animation support.\n */\nfunction matrixPico_0_4_90_Flags(): Record<string, boolean> {\n const flags = matrixPico_0_3_1_Flags()\n flags['useAnimation'] = true\n flags['AttachmentEntity:placement'] = true\n return flags\n}\n\nfunction visionOsRow_1_5_0(): CapabilityVersionRow {\n return { version: '1.5.0', flags: matrixVision_1_5_0_Flags() }\n}\n\nfunction visionOsRow_1_6_0(): CapabilityVersionRow {\n return { version: '1.6.0', flags: matrixVision_1_6_0_Flags() }\n}\n\nfunction visionOsRow_1_7_0(): CapabilityVersionRow {\n return { version: '1.7.0', flags: matrixVision_1_7_0_Flags() }\n}\n\n/**\n * Build the capability row for visionOS **WSAppShell/1.8.0**.\n */\nfunction visionOsRow_1_8_0(): CapabilityVersionRow {\n return { version: '1.8.0', flags: matrixVision_1_8_0_Flags() }\n}\n\nfunction picoOsRow_0_1_1(): CapabilityVersionRow {\n return { version: '0.1.1', flags: matrixPico_0_1_1_Flags() }\n}\n\n// Pico OS 6.0 Beta 2.0\nfunction picoOsRow_0_1_2(): CapabilityVersionRow {\n return { version: '0.1.2', flags: matrixPico_0_1_2_Flags() }\n}\n\nfunction picoOsRow_0_2_2(): CapabilityVersionRow {\n return { version: '0.2.2', flags: matrixPico_0_2_2_Flags() }\n}\n\n// Pico OS 6.0 Beta 2.1\nfunction picoOsRow_0_3_1(): CapabilityVersionRow {\n return { version: '0.3.1', flags: matrixPico_0_3_1_Flags() }\n}\n\n/**\n * Build the capability row for picoOS **PicoWebApp/0.4.90** OTA0.\n */\nfunction picoOsRow_0_4_90(): CapabilityVersionRow {\n return { version: '0.4.90', flags: matrixPico_0_4_90_Flags() }\n}\n\nexport const CAPABILITY_TABLE: {\n visionos: CapabilityVersionRow[]\n picoos: CapabilityVersionRow[]\n} = {\n visionos: [\n visionOsRow_1_5_0(),\n visionOsRow_1_6_0(),\n visionOsRow_1_7_0(),\n visionOsRow_1_8_0(),\n ],\n picoos: [\n picoOsRow_0_1_1(),\n picoOsRow_0_1_2(),\n picoOsRow_0_2_2(),\n picoOsRow_0_3_1(),\n picoOsRow_0_4_90(),\n ],\n}\n"],"mappings":"AAMA,SAAS,oBAAoB,sBAAsB;AASnD,SAAS,gBAAyC;AAChD,QAAM,QAAiC,CAAC;AACxC,aAAW,KAAK,gBAAgB;AAC9B,UAAM,CAAC,IAAI;AAAA,EACb;AACA,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AAC7D,eAAW,KAAK,MAAM;AACpB,YAAM,GAAG,IAAI,IAAI,CAAC,EAAE,IAAI;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAMA,SAAS,2BAAoD;AAC3D,QAAM,QAAQ,cAAc;AAC5B,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,KAAK,SAAS;AACvB,UAAM,SAAS,CAAC,EAAE,IAAI;AAAA,EACxB;AACA,QAAM,sCAAsC,IAAI;AAEhD,QAAM,cAAc,IAAI;AAGxB,QAAM,4BAA4B,IAAI;AACtC,SAAO;AACT;AAMA,SAAS,2BAAoD;AAC3D,QAAM,QAAQ,cAAc;AAC5B,aAAW,KAAK,CAAC,aAAa,UAAU,WAAW,aAAa,GAAY;AAC1E,UAAM,SAAS,CAAC,EAAE,IAAI;AAAA,EACxB;AACA,QAAM,sCAAsC,IAAI;AAEhD,QAAM,cAAc,IAAI;AAGxB,QAAM,4BAA4B,IAAI;AACtC,SAAO;AACT;AAMA,SAAS,2BAAoD;AAC3D,QAAM,QAAQ,yBAAyB;AACvC,QAAM,mBAAmB,IAAI;AAC7B,QAAM,eAAe,IAAI;AACzB,QAAM,cAAc,IAAI;AACxB,SAAO;AACT;AAKA,SAAS,2BAAoD;AAC3D,QAAM,QAAQ,yBAAyB;AACvC,QAAM,cAAc,IAAI;AACxB,SAAO;AACT;AAMA,SAAS,yBAAkD;AACzD,QAAM,QAAQ,yBAAyB;AACvC,QAAM,eAAe;AACrB,QAAM,eAAe;AACrB,SAAO;AACT;AAMA,SAAS,yBAAkD;AACzD,QAAM,QAAQ,yBAAyB;AACvC,QAAM,eAAe;AACrB,QAAM,eAAe;AACrB,QAAM,mBAAmB,IAAI;AAC7B,QAAM,cAAc,IAAI;AACxB,SAAO;AACT;AAMA,SAAS,yBAAkD;AACzD,QAAM,QAAQ,uBAAuB;AACrC,SAAO;AACT;AAKA,SAAS,yBAAkD;AACzD,QAAM,QAAQ,uBAAuB;AACrC,QAAM,eAAe,IAAI;AACzB,SAAO;AACT;AAKA,SAAS,0BAAmD;AAC1D,QAAM,QAAQ,uBAAuB;AACrC,QAAM,cAAc,IAAI;AACxB,QAAM,4BAA4B,IAAI;AACtC,SAAO;AACT;AAEA,SAAS,oBAA0C;AACjD,SAAO,EAAE,SAAS,SAAS,OAAO,yBAAyB,EAAE;AAC/D;AAEA,SAAS,oBAA0C;AACjD,SAAO,EAAE,SAAS,SAAS,OAAO,yBAAyB,EAAE;AAC/D;AAEA,SAAS,oBAA0C;AACjD,SAAO,EAAE,SAAS,SAAS,OAAO,yBAAyB,EAAE;AAC/D;AAKA,SAAS,oBAA0C;AACjD,SAAO,EAAE,SAAS,SAAS,OAAO,yBAAyB,EAAE;AAC/D;AAEA,SAAS,kBAAwC;AAC/C,SAAO,EAAE,SAAS,SAAS,OAAO,uBAAuB,EAAE;AAC7D;AAGA,SAAS,kBAAwC;AAC/C,SAAO,EAAE,SAAS,SAAS,OAAO,uBAAuB,EAAE;AAC7D;AAEA,SAAS,kBAAwC;AAC/C,SAAO,EAAE,SAAS,SAAS,OAAO,uBAAuB,EAAE;AAC7D;AAGA,SAAS,kBAAwC;AAC/C,SAAO,EAAE,SAAS,SAAS,OAAO,uBAAuB,EAAE;AAC7D;AAKA,SAAS,mBAAyC;AAChD,SAAO,EAAE,SAAS,UAAU,OAAO,wBAAwB,EAAE;AAC/D;AAEO,MAAM,mBAGT;AAAA,EACF,UAAU;AAAA,IACR,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,EACpB;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB;AACF;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { WebSpatialRuntimeSnapshot, WebSpatialRuntimeType } from './types.js';
|
|
2
|
+
export { WebSpatialRuntimeError } from './WebSpatialRuntimeError.js';
|
|
3
|
+
export { VISIONOS_DEBUG_SHELL_VERSION_PLACEHOLDER, getRuntime, resetRuntimeCacheForTests, supports } from './supports.js';
|
|
4
|
+
export { compareSemver, parseSemverOrNull } from './semver.js';
|
|
5
|
+
export { computeRuntimeFromUserAgent, parseShellToken } from './userAgent.js';
|
|
6
|
+
export { JsbAdapterPlatformKind, resolveJsbAdapterPlatform } from './jsbAdapterPlatform.js';
|
|
7
|
+
export { CAPABILITY_TABLE, CapabilityVersionRow } from './capability-data.js';
|
|
8
|
+
export { CapabilityKey } from './keys.js';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { WebSpatialRuntimeError } from "./WebSpatialRuntimeError";
|
|
2
|
+
import {
|
|
3
|
+
supports,
|
|
4
|
+
getRuntime,
|
|
5
|
+
resetRuntimeCacheForTests,
|
|
6
|
+
VISIONOS_DEBUG_SHELL_VERSION_PLACEHOLDER
|
|
7
|
+
} from "./supports";
|
|
8
|
+
import { compareSemver, parseSemverOrNull } from "./semver";
|
|
9
|
+
import { computeRuntimeFromUserAgent, parseShellToken } from "./userAgent";
|
|
10
|
+
import {
|
|
11
|
+
resolveJsbAdapterPlatform
|
|
12
|
+
} from "./jsbAdapterPlatform";
|
|
13
|
+
import { CAPABILITY_TABLE } from "./capability-data";
|
|
14
|
+
export {
|
|
15
|
+
CAPABILITY_TABLE,
|
|
16
|
+
VISIONOS_DEBUG_SHELL_VERSION_PLACEHOLDER,
|
|
17
|
+
WebSpatialRuntimeError,
|
|
18
|
+
compareSemver,
|
|
19
|
+
computeRuntimeFromUserAgent,
|
|
20
|
+
getRuntime,
|
|
21
|
+
parseSemverOrNull,
|
|
22
|
+
parseShellToken,
|
|
23
|
+
resetRuntimeCacheForTests,
|
|
24
|
+
resolveJsbAdapterPlatform,
|
|
25
|
+
supports
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["export type { WebSpatialRuntimeSnapshot, WebSpatialRuntimeType } from './types'\nexport { WebSpatialRuntimeError } from './WebSpatialRuntimeError'\nexport {\n supports,\n getRuntime,\n resetRuntimeCacheForTests,\n VISIONOS_DEBUG_SHELL_VERSION_PLACEHOLDER,\n} from './supports'\nexport { compareSemver, parseSemverOrNull } from './semver'\nexport { computeRuntimeFromUserAgent, parseShellToken } from './userAgent'\nexport {\n resolveJsbAdapterPlatform,\n type JsbAdapterPlatformKind,\n} from './jsbAdapterPlatform'\nexport type { CapabilityVersionRow } from './capability-data'\nexport { CAPABILITY_TABLE } from './capability-data'\nexport type { CapabilityKey } from './keys'\n"],"mappings":"AACA,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe,yBAAyB;AACjD,SAAS,6BAA6B,uBAAuB;AAC7D;AAAA,EACE;AAAA,OAEK;AAEP,SAAS,wBAAwB;","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which native JSB / protocol adapter to load in the browser.
|
|
3
|
+
* Derived from {@link computeRuntimeFromUserAgent} plus legacy fallbacks
|
|
4
|
+
* (Pico WebSpatial semver gate; otherwise default visionOS shell).
|
|
5
|
+
*/
|
|
6
|
+
type JsbAdapterPlatformKind = 'puppeteer' | 'picoos' | 'visionos';
|
|
7
|
+
declare function resolveJsbAdapterPlatform(userAgent: string): JsbAdapterPlatformKind;
|
|
8
|
+
|
|
9
|
+
export { type JsbAdapterPlatformKind, resolveJsbAdapterPlatform };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { computeRuntimeFromUserAgent } from "./userAgent";
|
|
2
|
+
function getWebSpatialVersion(ua) {
|
|
3
|
+
const match = ua.match(/WebSpatial\/(\d+)\.(\d+)\.(\d+)/);
|
|
4
|
+
if (!match) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
return [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
8
|
+
}
|
|
9
|
+
function isVersionGreater(a, b) {
|
|
10
|
+
if (!a) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
for (let index = 0; index < 3; index += 1) {
|
|
14
|
+
const diff = a[index] - b[index];
|
|
15
|
+
if (diff > 0) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
if (diff < 0) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
function resolveJsbAdapterPlatform(userAgent) {
|
|
25
|
+
const rt = computeRuntimeFromUserAgent(userAgent);
|
|
26
|
+
if (rt.type === "puppeteer") {
|
|
27
|
+
return "puppeteer";
|
|
28
|
+
}
|
|
29
|
+
const webSpatialVersion = getWebSpatialVersion(userAgent);
|
|
30
|
+
if (userAgent.includes("PicoWebApp") && isVersionGreater(webSpatialVersion, [0, 0, 1])) {
|
|
31
|
+
return "picoos";
|
|
32
|
+
}
|
|
33
|
+
return "visionos";
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
resolveJsbAdapterPlatform
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=jsbAdapterPlatform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/jsbAdapterPlatform.ts"],"sourcesContent":["import { computeRuntimeFromUserAgent } from './userAgent'\n\nfunction getWebSpatialVersion(ua: string): number[] | null {\n const match = ua.match(/WebSpatial\\/(\\d+)\\.(\\d+)\\.(\\d+)/)\n if (!match) {\n return null\n }\n return [Number(match[1]), Number(match[2]), Number(match[3])]\n}\n\nfunction isVersionGreater(a: number[] | null, b: number[]): boolean {\n if (!a) {\n return false\n }\n for (let index = 0; index < 3; index += 1) {\n const diff = a[index] - b[index]\n if (diff > 0) {\n return true\n }\n if (diff < 0) {\n return false\n }\n }\n return false\n}\n\n/**\n * Which native JSB / protocol adapter to load in the browser.\n * Derived from {@link computeRuntimeFromUserAgent} plus legacy fallbacks\n * (Pico WebSpatial semver gate; otherwise default visionOS shell).\n */\nexport type JsbAdapterPlatformKind = 'puppeteer' | 'picoos' | 'visionos'\n\nexport function resolveJsbAdapterPlatform(\n userAgent: string,\n): JsbAdapterPlatformKind {\n const rt = computeRuntimeFromUserAgent(userAgent)\n if (rt.type === 'puppeteer') {\n return 'puppeteer'\n }\n\n const webSpatialVersion = getWebSpatialVersion(userAgent)\n if (\n userAgent.includes('PicoWebApp') &&\n isVersionGreater(webSpatialVersion, [0, 0, 1])\n ) {\n return 'picoos'\n }\n\n return 'visionos'\n}\n"],"mappings":"AAAA,SAAS,mCAAmC;AAE5C,SAAS,qBAAqB,IAA6B;AACzD,QAAM,QAAQ,GAAG,MAAM,iCAAiC;AACxD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO,CAAC,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC;AAC9D;AAEA,SAAS,iBAAiB,GAAoB,GAAsB;AAClE,MAAI,CAAC,GAAG;AACN,WAAO;AAAA,EACT;AACA,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;AACzC,UAAM,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK;AAC/B,QAAI,OAAO,GAAG;AACZ,aAAO;AAAA,IACT;AACA,QAAI,OAAO,GAAG;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AASO,SAAS,0BACd,WACwB;AACxB,QAAM,KAAK,4BAA4B,SAAS;AAChD,MAAI,GAAG,SAAS,aAAa;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,qBAAqB,SAAS;AACxD,MACE,UAAU,SAAS,YAAY,KAC/B,iBAAiB,mBAAmB,CAAC,GAAG,GAAG,CAAC,CAAC,GAC7C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical `supports(name)` key registry (OpenSpec `review.md` §3).
|
|
3
|
+
* Aliases are normalized before lookup (see `normalizeCapabilityName`).
|
|
4
|
+
*
|
|
5
|
+
* @internal SDK contract data — not part of the public `@webspatial/react-sdk`
|
|
6
|
+
* surface. Import via `@webspatial/core-sdk/runtime/keys` only for SDK demos,
|
|
7
|
+
* contract tests, and capability-matrix tooling.
|
|
8
|
+
*/
|
|
9
|
+
declare const COMPONENT_KEYS: readonly ["Model", "Reality", "Entity", "BoxEntity", "SphereEntity", "ConeEntity", "CylinderEntity", "PlaneEntity", "SceneGraph", "ModelAsset", "ModelEntity", "UnlitMaterial", "Material", "AttachmentAsset", "AttachmentEntity"];
|
|
10
|
+
declare const CSS_KEYS: readonly ["-xr-background-material", "-xr-back", "-xr-depth", "-xr-transform"];
|
|
11
|
+
declare const GESTURE_KEYS: readonly ["SpatialTapEvent", "SpatialDragStartEvent", "SpatialDragEvent", "SpatialDragEndEvent", "SpatialRotateEvent", "SpatialRotateEndEvent", "SpatialMagnifyEvent", "SpatialMagnifyEndEvent"];
|
|
12
|
+
declare const ANIMATION_KEYS: readonly ["useAnimation"];
|
|
13
|
+
declare const JS_SCENE_KEYS: readonly ["useMetrics", "convertCoordinate", "initScene", "WindowScene", "VolumeScene"];
|
|
14
|
+
/**
|
|
15
|
+
* Spatialized container `ref` readbacks (`HTMLElement` / React `useDomProxy` Proxy).
|
|
16
|
+
* See `global.d.ts` (`HTMLElement`) and `useDomProxy.ts` (`has` / `get` traps).
|
|
17
|
+
*/
|
|
18
|
+
declare const ELEMENT_DOM_DEPTH_KEYS: readonly ["xrClientDepth", "xrOffsetBack"];
|
|
19
|
+
/**
|
|
20
|
+
* Scene / global readbacks on `Window` (`global.d.ts` → `Window`).
|
|
21
|
+
*/
|
|
22
|
+
declare const WINDOW_DOM_DEPTH_KEYS: readonly ["xrInnerDepth", "xrOuterDepth"];
|
|
23
|
+
declare const DOM_DEPTH_KEYS: readonly ["xrClientDepth", "xrOffsetBack", "xrInnerDepth", "xrOuterDepth"];
|
|
24
|
+
/** Top-level names accepted by `supports(name)` (canonical keys after alias normalization). */
|
|
25
|
+
declare const TOP_LEVEL_KEYS: readonly ["Model", "Reality", "Entity", "BoxEntity", "SphereEntity", "ConeEntity", "CylinderEntity", "PlaneEntity", "SceneGraph", "ModelAsset", "ModelEntity", "UnlitMaterial", "Material", "AttachmentAsset", "AttachmentEntity", "-xr-background-material", "-xr-back", "-xr-depth", "-xr-transform", "SpatialTapEvent", "SpatialDragStartEvent", "SpatialDragEvent", "SpatialDragEndEvent", "SpatialRotateEvent", "SpatialRotateEndEvent", "SpatialMagnifyEvent", "SpatialMagnifyEndEvent", "useAnimation", "useMetrics", "convertCoordinate", "initScene", "WindowScene", "VolumeScene", "xrClientDepth", "xrOffsetBack", "xrInnerDepth", "xrOuterDepth"];
|
|
26
|
+
/** Union of documented capability keys; unknown strings may still be passed to `supports` (returns `false`). */
|
|
27
|
+
type CapabilityKey = (typeof TOP_LEVEL_KEYS)[number];
|
|
28
|
+
declare function normalizeCapabilityName(name: string): string;
|
|
29
|
+
/** Known sub-tokens per canonical top-level `name` (AND semantics). */
|
|
30
|
+
declare const SUB_TOKENS_BY_NAME: Readonly<Record<string, readonly string[]>>;
|
|
31
|
+
declare function isKnownTopLevel(name: string): boolean;
|
|
32
|
+
declare function isKnownSubToken(name: string, token: string): boolean;
|
|
33
|
+
|
|
34
|
+
export { ANIMATION_KEYS, COMPONENT_KEYS, CSS_KEYS, type CapabilityKey, DOM_DEPTH_KEYS, ELEMENT_DOM_DEPTH_KEYS, GESTURE_KEYS, JS_SCENE_KEYS, SUB_TOKENS_BY_NAME, TOP_LEVEL_KEYS, WINDOW_DOM_DEPTH_KEYS, isKnownSubToken, isKnownTopLevel, normalizeCapabilityName };
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
const COMPONENT_KEYS = [
|
|
2
|
+
"Model",
|
|
3
|
+
"Reality",
|
|
4
|
+
"Entity",
|
|
5
|
+
"BoxEntity",
|
|
6
|
+
"SphereEntity",
|
|
7
|
+
"ConeEntity",
|
|
8
|
+
"CylinderEntity",
|
|
9
|
+
"PlaneEntity",
|
|
10
|
+
"SceneGraph",
|
|
11
|
+
"ModelAsset",
|
|
12
|
+
"ModelEntity",
|
|
13
|
+
"UnlitMaterial",
|
|
14
|
+
"Material",
|
|
15
|
+
"AttachmentAsset",
|
|
16
|
+
"AttachmentEntity"
|
|
17
|
+
];
|
|
18
|
+
const CSS_KEYS = [
|
|
19
|
+
"-xr-background-material",
|
|
20
|
+
"-xr-back",
|
|
21
|
+
"-xr-depth",
|
|
22
|
+
"-xr-transform"
|
|
23
|
+
];
|
|
24
|
+
const GESTURE_KEYS = [
|
|
25
|
+
"SpatialTapEvent",
|
|
26
|
+
"SpatialDragStartEvent",
|
|
27
|
+
"SpatialDragEvent",
|
|
28
|
+
"SpatialDragEndEvent",
|
|
29
|
+
"SpatialRotateEvent",
|
|
30
|
+
"SpatialRotateEndEvent",
|
|
31
|
+
"SpatialMagnifyEvent",
|
|
32
|
+
"SpatialMagnifyEndEvent"
|
|
33
|
+
];
|
|
34
|
+
const ANIMATION_KEYS = ["useAnimation"];
|
|
35
|
+
const JS_SCENE_KEYS = [
|
|
36
|
+
"useMetrics",
|
|
37
|
+
"convertCoordinate",
|
|
38
|
+
"initScene",
|
|
39
|
+
"WindowScene",
|
|
40
|
+
"VolumeScene"
|
|
41
|
+
];
|
|
42
|
+
const ELEMENT_DOM_DEPTH_KEYS = ["xrClientDepth", "xrOffsetBack"];
|
|
43
|
+
const WINDOW_DOM_DEPTH_KEYS = ["xrInnerDepth", "xrOuterDepth"];
|
|
44
|
+
const DOM_DEPTH_KEYS = [
|
|
45
|
+
...ELEMENT_DOM_DEPTH_KEYS,
|
|
46
|
+
...WINDOW_DOM_DEPTH_KEYS
|
|
47
|
+
];
|
|
48
|
+
const TOP_LEVEL_KEYS = [
|
|
49
|
+
...COMPONENT_KEYS,
|
|
50
|
+
...CSS_KEYS,
|
|
51
|
+
...GESTURE_KEYS,
|
|
52
|
+
...ANIMATION_KEYS,
|
|
53
|
+
...JS_SCENE_KEYS,
|
|
54
|
+
...DOM_DEPTH_KEYS
|
|
55
|
+
];
|
|
56
|
+
const ALIAS_TO_CANONICAL = {
|
|
57
|
+
Box: "BoxEntity",
|
|
58
|
+
Sphere: "SphereEntity",
|
|
59
|
+
Cone: "ConeEntity",
|
|
60
|
+
Cylinder: "CylinderEntity",
|
|
61
|
+
Plane: "PlaneEntity",
|
|
62
|
+
World: "SceneGraph"
|
|
63
|
+
};
|
|
64
|
+
function normalizeCapabilityName(name) {
|
|
65
|
+
return ALIAS_TO_CANONICAL[name] ?? name;
|
|
66
|
+
}
|
|
67
|
+
const SUB_TOKENS_BY_NAME = {
|
|
68
|
+
Material: ["unlit"],
|
|
69
|
+
WindowScene: ["defaultSize", "resizability"],
|
|
70
|
+
VolumeScene: [
|
|
71
|
+
"defaultSize",
|
|
72
|
+
"resizability",
|
|
73
|
+
"worldScaling",
|
|
74
|
+
"worldAlignment",
|
|
75
|
+
"baseplateVisibility"
|
|
76
|
+
],
|
|
77
|
+
SpatialRotateEvent: ["constrainedToAxis"],
|
|
78
|
+
// Placement-shaped attachment JSB protocol (placementId + Vec3 transform +
|
|
79
|
+
// meter width/height). Runtimes without it take the legacy payload
|
|
80
|
+
// (parentEntityId + tuple position + point size).
|
|
81
|
+
AttachmentEntity: ["placement"],
|
|
82
|
+
Model: [
|
|
83
|
+
"autoplay",
|
|
84
|
+
"loop",
|
|
85
|
+
"stagemode",
|
|
86
|
+
"poster",
|
|
87
|
+
"loading",
|
|
88
|
+
"source",
|
|
89
|
+
"ready",
|
|
90
|
+
"currentSrc",
|
|
91
|
+
"entityTransform",
|
|
92
|
+
"paused",
|
|
93
|
+
"duration",
|
|
94
|
+
"playbackRate",
|
|
95
|
+
"play",
|
|
96
|
+
"pause",
|
|
97
|
+
"currentTime"
|
|
98
|
+
]
|
|
99
|
+
};
|
|
100
|
+
function isKnownTopLevel(name) {
|
|
101
|
+
return TOP_LEVEL_KEYS.includes(name);
|
|
102
|
+
}
|
|
103
|
+
function isKnownSubToken(name, token) {
|
|
104
|
+
const allowed = SUB_TOKENS_BY_NAME[name];
|
|
105
|
+
return allowed !== void 0 && allowed.includes(token);
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
ANIMATION_KEYS,
|
|
109
|
+
COMPONENT_KEYS,
|
|
110
|
+
CSS_KEYS,
|
|
111
|
+
DOM_DEPTH_KEYS,
|
|
112
|
+
ELEMENT_DOM_DEPTH_KEYS,
|
|
113
|
+
GESTURE_KEYS,
|
|
114
|
+
JS_SCENE_KEYS,
|
|
115
|
+
SUB_TOKENS_BY_NAME,
|
|
116
|
+
TOP_LEVEL_KEYS,
|
|
117
|
+
WINDOW_DOM_DEPTH_KEYS,
|
|
118
|
+
isKnownSubToken,
|
|
119
|
+
isKnownTopLevel,
|
|
120
|
+
normalizeCapabilityName
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/keys.ts"],"sourcesContent":["/**\n * Canonical `supports(name)` key registry (OpenSpec `review.md` §3).\n * Aliases are normalized before lookup (see `normalizeCapabilityName`).\n *\n * @internal SDK contract data — not part of the public `@webspatial/react-sdk`\n * surface. Import via `@webspatial/core-sdk/runtime/keys` only for SDK demos,\n * contract tests, and capability-matrix tooling.\n */\n\nexport const COMPONENT_KEYS = [\n 'Model',\n 'Reality',\n 'Entity',\n 'BoxEntity',\n 'SphereEntity',\n 'ConeEntity',\n 'CylinderEntity',\n 'PlaneEntity',\n 'SceneGraph',\n 'ModelAsset',\n 'ModelEntity',\n 'UnlitMaterial',\n 'Material',\n 'AttachmentAsset',\n 'AttachmentEntity',\n] as const\n\nexport const CSS_KEYS = [\n '-xr-background-material',\n '-xr-back',\n '-xr-depth',\n '-xr-transform',\n] as const\n\nexport const GESTURE_KEYS = [\n 'SpatialTapEvent',\n 'SpatialDragStartEvent',\n 'SpatialDragEvent',\n 'SpatialDragEndEvent',\n 'SpatialRotateEvent',\n 'SpatialRotateEndEvent',\n 'SpatialMagnifyEvent',\n 'SpatialMagnifyEndEvent',\n] as const\n\nexport const ANIMATION_KEYS = ['useAnimation'] as const\n\nexport const JS_SCENE_KEYS = [\n 'useMetrics',\n 'convertCoordinate',\n 'initScene',\n 'WindowScene',\n 'VolumeScene',\n] as const\n\n/**\n * Spatialized container `ref` readbacks (`HTMLElement` / React `useDomProxy` Proxy).\n * See `global.d.ts` (`HTMLElement`) and `useDomProxy.ts` (`has` / `get` traps).\n */\nexport const ELEMENT_DOM_DEPTH_KEYS = ['xrClientDepth', 'xrOffsetBack'] as const\n\n/**\n * Scene / global readbacks on `Window` (`global.d.ts` → `Window`).\n */\nexport const WINDOW_DOM_DEPTH_KEYS = ['xrInnerDepth', 'xrOuterDepth'] as const\n\nexport const DOM_DEPTH_KEYS = [\n ...ELEMENT_DOM_DEPTH_KEYS,\n ...WINDOW_DOM_DEPTH_KEYS,\n] as const\n\n/** Top-level names accepted by `supports(name)` (canonical keys after alias normalization). */\nexport const TOP_LEVEL_KEYS = [\n ...COMPONENT_KEYS,\n ...CSS_KEYS,\n ...GESTURE_KEYS,\n ...ANIMATION_KEYS,\n ...JS_SCENE_KEYS,\n ...DOM_DEPTH_KEYS,\n] as const\n\n/** Union of documented capability keys; unknown strings may still be passed to `supports` (returns `false`). */\nexport type CapabilityKey = (typeof TOP_LEVEL_KEYS)[number]\n\nconst ALIAS_TO_CANONICAL: Record<string, string> = {\n Box: 'BoxEntity',\n Sphere: 'SphereEntity',\n Cone: 'ConeEntity',\n Cylinder: 'CylinderEntity',\n Plane: 'PlaneEntity',\n World: 'SceneGraph',\n}\n\nexport function normalizeCapabilityName(name: string): string {\n return ALIAS_TO_CANONICAL[name] ?? name\n}\n\n/** Known sub-tokens per canonical top-level `name` (AND semantics). */\nexport const SUB_TOKENS_BY_NAME: Readonly<Record<string, readonly string[]>> = {\n Material: ['unlit'],\n WindowScene: ['defaultSize', 'resizability'],\n VolumeScene: [\n 'defaultSize',\n 'resizability',\n 'worldScaling',\n 'worldAlignment',\n 'baseplateVisibility',\n ],\n SpatialRotateEvent: ['constrainedToAxis'],\n // Placement-shaped attachment JSB protocol (placementId + Vec3 transform +\n // meter width/height). Runtimes without it take the legacy payload\n // (parentEntityId + tuple position + point size).\n AttachmentEntity: ['placement'],\n Model: [\n 'autoplay',\n 'loop',\n 'stagemode',\n 'poster',\n 'loading',\n 'source',\n 'ready',\n 'currentSrc',\n 'entityTransform',\n 'paused',\n 'duration',\n 'playbackRate',\n 'play',\n 'pause',\n 'currentTime',\n ],\n}\n\nexport function isKnownTopLevel(name: string): boolean {\n return (TOP_LEVEL_KEYS as readonly string[]).includes(name)\n}\n\nexport function isKnownSubToken(name: string, token: string): boolean {\n const allowed = SUB_TOKENS_BY_NAME[name]\n return allowed !== undefined && allowed.includes(token)\n}\n"],"mappings":"AASO,MAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,WAAW;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,eAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,iBAAiB,CAAC,cAAc;AAEtC,MAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,MAAM,yBAAyB,CAAC,iBAAiB,cAAc;AAK/D,MAAM,wBAAwB,CAAC,gBAAgB,cAAc;AAE7D,MAAM,iBAAiB;AAAA,EAC5B,GAAG;AAAA,EACH,GAAG;AACL;AAGO,MAAM,iBAAiB;AAAA,EAC5B,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAKA,MAAM,qBAA6C;AAAA,EACjD,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AACT;AAEO,SAAS,wBAAwB,MAAsB;AAC5D,SAAO,mBAAmB,IAAI,KAAK;AACrC;AAGO,MAAM,qBAAkE;AAAA,EAC7E,UAAU,CAAC,OAAO;AAAA,EAClB,aAAa,CAAC,eAAe,cAAc;AAAA,EAC3C,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,oBAAoB,CAAC,mBAAmB;AAAA;AAAA;AAAA;AAAA,EAIxC,kBAAkB,CAAC,WAAW;AAAA,EAC9B,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,MAAuB;AACrD,SAAQ,eAAqC,SAAS,IAAI;AAC5D;AAEO,SAAS,gBAAgB,MAAc,OAAwB;AACpE,QAAM,UAAU,mBAAmB,IAAI;AACvC,SAAO,YAAY,UAAa,QAAQ,SAAS,KAAK;AACxD;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal semver compare for capability table rows (`major.minor.patch`).
|
|
3
|
+
* Returns negative if a < b, zero if equal, positive if a > b.
|
|
4
|
+
*/
|
|
5
|
+
declare function compareSemver(a: string, b: string): number;
|
|
6
|
+
declare function parseSemverOrNull(v: string): string | null;
|
|
7
|
+
|
|
8
|
+
export { compareSemver, parseSemverOrNull };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
function compareSemver(a, b) {
|
|
2
|
+
const pa = parseSemverParts(a);
|
|
3
|
+
const pb = parseSemverParts(b);
|
|
4
|
+
if (!pa || !pb) {
|
|
5
|
+
return String(a).localeCompare(String(b));
|
|
6
|
+
}
|
|
7
|
+
const len = Math.max(pa.length, pb.length);
|
|
8
|
+
for (let i = 0; i < len; i++) {
|
|
9
|
+
const da = pa[i] ?? 0;
|
|
10
|
+
const db = pb[i] ?? 0;
|
|
11
|
+
if (da !== db) return da - db;
|
|
12
|
+
}
|
|
13
|
+
return 0;
|
|
14
|
+
}
|
|
15
|
+
function parseSemverParts(v) {
|
|
16
|
+
const m = /^(\d+)(?:\.(\d+)(?:\.(\d+))?)?/.exec(v.trim());
|
|
17
|
+
if (!m) return null;
|
|
18
|
+
const major = Number(m[1]);
|
|
19
|
+
const minor = m[2] !== void 0 ? Number(m[2]) : 0;
|
|
20
|
+
const patch = m[3] !== void 0 ? Number(m[3]) : 0;
|
|
21
|
+
if ([major, minor, patch].some((n) => Number.isNaN(n))) return null;
|
|
22
|
+
return [major, minor, patch];
|
|
23
|
+
}
|
|
24
|
+
function parseSemverOrNull(v) {
|
|
25
|
+
const m = /^(\d+(?:\.\d+){0,2})/.exec(v.trim());
|
|
26
|
+
return m ? m[1] : null;
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
compareSemver,
|
|
30
|
+
parseSemverOrNull
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=semver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/semver.ts"],"sourcesContent":["/**\n * Minimal semver compare for capability table rows (`major.minor.patch`).\n * Returns negative if a < b, zero if equal, positive if a > b.\n */\nexport function compareSemver(a: string, b: string): number {\n const pa = parseSemverParts(a)\n const pb = parseSemverParts(b)\n if (!pa || !pb) {\n return String(a).localeCompare(String(b))\n }\n const len = Math.max(pa.length, pb.length)\n for (let i = 0; i < len; i++) {\n const da = pa[i] ?? 0\n const db = pb[i] ?? 0\n if (da !== db) return da - db\n }\n return 0\n}\n\nfunction parseSemverParts(v: string): number[] | null {\n const m = /^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?/.exec(v.trim())\n if (!m) return null\n const major = Number(m[1])\n const minor = m[2] !== undefined ? Number(m[2]) : 0\n const patch = m[3] !== undefined ? Number(m[3]) : 0\n if ([major, minor, patch].some(n => Number.isNaN(n))) return null\n return [major, minor, patch]\n}\n\nexport function parseSemverOrNull(v: string): string | null {\n const m = /^(\\d+(?:\\.\\d+){0,2})/.exec(v.trim())\n return m ? m[1] : null\n}\n"],"mappings":"AAIO,SAAS,cAAc,GAAW,GAAmB;AAC1D,QAAM,KAAK,iBAAiB,CAAC;AAC7B,QAAM,KAAK,iBAAiB,CAAC;AAC7B,MAAI,CAAC,MAAM,CAAC,IAAI;AACd,WAAO,OAAO,CAAC,EAAE,cAAc,OAAO,CAAC,CAAC;AAAA,EAC1C;AACA,QAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM;AACzC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,QAAI,OAAO,GAAI,QAAO,KAAK;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,GAA4B;AACpD,QAAM,IAAI,iCAAiC,KAAK,EAAE,KAAK,CAAC;AACxD,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,QAAQ,OAAO,EAAE,CAAC,CAAC;AACzB,QAAM,QAAQ,EAAE,CAAC,MAAM,SAAY,OAAO,EAAE,CAAC,CAAC,IAAI;AAClD,QAAM,QAAQ,EAAE,CAAC,MAAM,SAAY,OAAO,EAAE,CAAC,CAAC,IAAI;AAClD,MAAI,CAAC,OAAO,OAAO,KAAK,EAAE,KAAK,OAAK,OAAO,MAAM,CAAC,CAAC,EAAG,QAAO;AAC7D,SAAO,CAAC,OAAO,OAAO,KAAK;AAC7B;AAEO,SAAS,kBAAkB,GAA0B;AAC1D,QAAM,IAAI,uBAAuB,KAAK,EAAE,KAAK,CAAC;AAC9C,SAAO,IAAI,EAAE,CAAC,IAAI;AACpB;","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { WebSpatialRuntimeSnapshot } from './types.js';
|
|
2
|
+
import { CapabilityKey } from './keys.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Unsubstituted shell version placeholder from visionOS manifest / Xcode template
|
|
6
|
+
* (`manifest.swift`). When still present in `WSAppShell/<version>`, treat as debug
|
|
7
|
+
* build: {@link supports} returns true for every valid capability query.
|
|
8
|
+
*/
|
|
9
|
+
declare const VISIONOS_DEBUG_SHELL_VERSION_PLACEHOLDER = "WS_SHELL_VERSION";
|
|
10
|
+
/** Test helper: clear cached UA/runtime snapshot between Vitest cases. */
|
|
11
|
+
declare function resetRuntimeCacheForTests(): void;
|
|
12
|
+
/**
|
|
13
|
+
* Internal runtime snapshot (not part of the public `@webspatial/react-sdk` surface).
|
|
14
|
+
*/
|
|
15
|
+
declare function getRuntime(): WebSpatialRuntimeSnapshot;
|
|
16
|
+
/**
|
|
17
|
+
* Public capability probe (`WebSpatialRuntime.supports` re-exports this from React SDK).
|
|
18
|
+
*/
|
|
19
|
+
declare function supports(name: CapabilityKey, tokens?: readonly string[]): boolean;
|
|
20
|
+
declare function supports(name: string, tokens?: readonly string[]): boolean;
|
|
21
|
+
|
|
22
|
+
export { VISIONOS_DEBUG_SHELL_VERSION_PLACEHOLDER, getRuntime, resetRuntimeCacheForTests, supports };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { CAPABILITY_TABLE } from "./capability-data";
|
|
2
|
+
import { compareSemver, parseSemverOrNull } from "./semver";
|
|
3
|
+
import { computeRuntimeFromUserAgent } from "./userAgent";
|
|
4
|
+
import {
|
|
5
|
+
isKnownSubToken,
|
|
6
|
+
isKnownTopLevel,
|
|
7
|
+
normalizeCapabilityName
|
|
8
|
+
} from "./keys";
|
|
9
|
+
const VISIONOS_DEBUG_SHELL_VERSION_PLACEHOLDER = "WS_SHELL_VERSION";
|
|
10
|
+
let runtimeCache;
|
|
11
|
+
function resetRuntimeCacheForTests() {
|
|
12
|
+
runtimeCache = void 0;
|
|
13
|
+
}
|
|
14
|
+
function getRuntime() {
|
|
15
|
+
if (runtimeCache !== void 0) return runtimeCache;
|
|
16
|
+
if (typeof navigator === "undefined") {
|
|
17
|
+
runtimeCache = { type: null, shellVersion: null };
|
|
18
|
+
return runtimeCache;
|
|
19
|
+
}
|
|
20
|
+
runtimeCache = computeRuntimeFromUserAgent(navigator.userAgent);
|
|
21
|
+
return runtimeCache;
|
|
22
|
+
}
|
|
23
|
+
function selectRow(type, shellVersion) {
|
|
24
|
+
const norm = parseSemverOrNull(shellVersion);
|
|
25
|
+
if (!norm) return null;
|
|
26
|
+
const rows = CAPABILITY_TABLE[type];
|
|
27
|
+
if (!rows.length) return null;
|
|
28
|
+
const sorted = [...rows].sort((a, b) => compareSemver(a.version, b.version));
|
|
29
|
+
const minV = sorted[0].version;
|
|
30
|
+
if (compareSemver(norm, minV) < 0) return null;
|
|
31
|
+
let chosen = null;
|
|
32
|
+
for (const row of sorted) {
|
|
33
|
+
if (compareSemver(row.version, norm) <= 0) {
|
|
34
|
+
chosen = row;
|
|
35
|
+
} else {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return chosen;
|
|
40
|
+
}
|
|
41
|
+
function supports(name, tokens) {
|
|
42
|
+
if (typeof name !== "string") return false;
|
|
43
|
+
const canonical = normalizeCapabilityName(name);
|
|
44
|
+
if (!isKnownTopLevel(canonical)) return false;
|
|
45
|
+
const tokList = tokens === void 0 ? [] : Array.isArray(tokens) ? [...tokens] : [];
|
|
46
|
+
if (tokList.some((t) => typeof t !== "string")) return false;
|
|
47
|
+
for (const t of tokList) {
|
|
48
|
+
if (!isKnownSubToken(canonical, t)) return false;
|
|
49
|
+
}
|
|
50
|
+
const rt = getRuntime();
|
|
51
|
+
if (rt.type === "puppeteer") {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
if (rt.type === null) return false;
|
|
55
|
+
if (rt.shellVersion === null) return false;
|
|
56
|
+
if (rt.type === "visionos" && rt.shellVersion === VISIONOS_DEBUG_SHELL_VERSION_PLACEHOLDER) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
const parsedShell = parseSemverOrNull(rt.shellVersion);
|
|
60
|
+
if (!parsedShell) return false;
|
|
61
|
+
if (rt.type !== "visionos" && rt.type !== "picoos") return false;
|
|
62
|
+
const row = selectRow(rt.type, parsedShell);
|
|
63
|
+
if (!row) return false;
|
|
64
|
+
if (tokList.length === 0) {
|
|
65
|
+
return row.flags[canonical] === true;
|
|
66
|
+
}
|
|
67
|
+
if (row.flags[canonical] !== true) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return tokList.every((t) => row.flags[`${canonical}:${t}`] === true);
|
|
71
|
+
}
|
|
72
|
+
export {
|
|
73
|
+
VISIONOS_DEBUG_SHELL_VERSION_PLACEHOLDER,
|
|
74
|
+
getRuntime,
|
|
75
|
+
resetRuntimeCacheForTests,
|
|
76
|
+
supports
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=supports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/supports.ts"],"sourcesContent":["import { CAPABILITY_TABLE, type CapabilityVersionRow } from './capability-data'\nimport { compareSemver, parseSemverOrNull } from './semver'\nimport type { WebSpatialRuntimeSnapshot } from './types'\nimport { computeRuntimeFromUserAgent } from './userAgent'\nimport {\n type CapabilityKey,\n isKnownSubToken,\n isKnownTopLevel,\n normalizeCapabilityName,\n} from './keys'\n\n/**\n * Unsubstituted shell version placeholder from visionOS manifest / Xcode template\n * (`manifest.swift`). When still present in `WSAppShell/<version>`, treat as debug\n * build: {@link supports} returns true for every valid capability query.\n */\nexport const VISIONOS_DEBUG_SHELL_VERSION_PLACEHOLDER = 'WS_SHELL_VERSION'\n\nlet runtimeCache: WebSpatialRuntimeSnapshot | undefined\n\n/** Test helper: clear cached UA/runtime snapshot between Vitest cases. */\nexport function resetRuntimeCacheForTests(): void {\n runtimeCache = undefined\n}\n\n/**\n * Internal runtime snapshot (not part of the public `@webspatial/react-sdk` surface).\n */\nexport function getRuntime(): WebSpatialRuntimeSnapshot {\n if (runtimeCache !== undefined) return runtimeCache\n if (typeof navigator === 'undefined') {\n runtimeCache = { type: null, shellVersion: null }\n return runtimeCache\n }\n runtimeCache = computeRuntimeFromUserAgent(navigator.userAgent)\n return runtimeCache\n}\n\nfunction selectRow(\n type: 'visionos' | 'picoos',\n shellVersion: string,\n): CapabilityVersionRow | null {\n const norm = parseSemverOrNull(shellVersion)\n if (!norm) return null\n const rows = CAPABILITY_TABLE[type]\n if (!rows.length) return null\n const sorted = [...rows].sort((a, b) => compareSemver(a.version, b.version))\n const minV = sorted[0].version\n if (compareSemver(norm, minV) < 0) return null\n\n let chosen: CapabilityVersionRow | null = null\n for (const row of sorted) {\n if (compareSemver(row.version, norm) <= 0) {\n chosen = row\n } else {\n break\n }\n }\n return chosen\n}\n\n/**\n * Public capability probe (`WebSpatialRuntime.supports` re-exports this from React SDK).\n */\nexport function supports(\n name: CapabilityKey,\n tokens?: readonly string[],\n): boolean\nexport function supports(name: string, tokens?: readonly string[]): boolean\nexport function supports(name: string, tokens?: readonly string[]): boolean {\n if (typeof name !== 'string') return false\n const canonical = normalizeCapabilityName(name)\n if (!isKnownTopLevel(canonical)) return false\n\n const tokList =\n tokens === undefined ? [] : Array.isArray(tokens) ? [...tokens] : []\n if (tokList.some(t => typeof t !== 'string')) return false\n\n for (const t of tokList) {\n if (!isKnownSubToken(canonical, t)) return false\n }\n\n const rt = getRuntime()\n if (rt.type === 'puppeteer') {\n return true\n }\n if (rt.type === null) return false\n if (rt.shellVersion === null) return false\n\n if (\n rt.type === 'visionos' &&\n rt.shellVersion === VISIONOS_DEBUG_SHELL_VERSION_PLACEHOLDER\n ) {\n return true\n }\n\n const parsedShell = parseSemverOrNull(rt.shellVersion)\n if (!parsedShell) return false\n\n if (rt.type !== 'visionos' && rt.type !== 'picoos') return false\n\n const row = selectRow(rt.type, parsedShell)\n if (!row) return false\n\n if (tokList.length === 0) {\n return row.flags[canonical] === true\n }\n if (row.flags[canonical] !== true) {\n return false\n }\n return tokList.every(t => row.flags[`${canonical}:${t}`] === true)\n}\n"],"mappings":"AAAA,SAAS,wBAAmD;AAC5D,SAAS,eAAe,yBAAyB;AAEjD,SAAS,mCAAmC;AAC5C;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAOA,MAAM,2CAA2C;AAExD,IAAI;AAGG,SAAS,4BAAkC;AAChD,iBAAe;AACjB;AAKO,SAAS,aAAwC;AACtD,MAAI,iBAAiB,OAAW,QAAO;AACvC,MAAI,OAAO,cAAc,aAAa;AACpC,mBAAe,EAAE,MAAM,MAAM,cAAc,KAAK;AAChD,WAAO;AAAA,EACT;AACA,iBAAe,4BAA4B,UAAU,SAAS;AAC9D,SAAO;AACT;AAEA,SAAS,UACP,MACA,cAC6B;AAC7B,QAAM,OAAO,kBAAkB,YAAY;AAC3C,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAO,iBAAiB,IAAI;AAClC,MAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,QAAM,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC;AAC3E,QAAM,OAAO,OAAO,CAAC,EAAE;AACvB,MAAI,cAAc,MAAM,IAAI,IAAI,EAAG,QAAO;AAE1C,MAAI,SAAsC;AAC1C,aAAW,OAAO,QAAQ;AACxB,QAAI,cAAc,IAAI,SAAS,IAAI,KAAK,GAAG;AACzC,eAAS;AAAA,IACX,OAAO;AACL;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAUO,SAAS,SAAS,MAAc,QAAqC;AAC1E,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,QAAM,YAAY,wBAAwB,IAAI;AAC9C,MAAI,CAAC,gBAAgB,SAAS,EAAG,QAAO;AAExC,QAAM,UACJ,WAAW,SAAY,CAAC,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC;AACrE,MAAI,QAAQ,KAAK,OAAK,OAAO,MAAM,QAAQ,EAAG,QAAO;AAErD,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,gBAAgB,WAAW,CAAC,EAAG,QAAO;AAAA,EAC7C;AAEA,QAAM,KAAK,WAAW;AACtB,MAAI,GAAG,SAAS,aAAa;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,GAAG,SAAS,KAAM,QAAO;AAC7B,MAAI,GAAG,iBAAiB,KAAM,QAAO;AAErC,MACE,GAAG,SAAS,cACZ,GAAG,iBAAiB,0CACpB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,kBAAkB,GAAG,YAAY;AACrD,MAAI,CAAC,YAAa,QAAO;AAEzB,MAAI,GAAG,SAAS,cAAc,GAAG,SAAS,SAAU,QAAO;AAE3D,QAAM,MAAM,UAAU,GAAG,MAAM,WAAW;AAC1C,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,IAAI,MAAM,SAAS,MAAM;AAAA,EAClC;AACA,MAAI,IAAI,MAAM,SAAS,MAAM,MAAM;AACjC,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,MAAM,OAAK,IAAI,MAAM,GAAG,SAAS,IAAI,CAAC,EAAE,MAAM,IAAI;AACnE;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal runtime classification (see OpenSpec `review.md`).
|
|
3
|
+
* `puppeteer`: automation / test harness UA — not a product matrix row; see `supports()`.
|
|
4
|
+
*/
|
|
5
|
+
type WebSpatialRuntimeType = 'visionos' | 'picoos' | 'puppeteer' | null;
|
|
6
|
+
/** Snapshot returned by internal `getRuntime()` (not a public app API). */
|
|
7
|
+
type WebSpatialRuntimeSnapshot = {
|
|
8
|
+
type: WebSpatialRuntimeType;
|
|
9
|
+
shellVersion: string | null;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export type { WebSpatialRuntimeSnapshot, WebSpatialRuntimeType };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|