@volter/editor-core 0.5.57
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/BUNDLED_NOTICES +1527 -0
- package/LICENSE +686 -0
- package/LICENSE-APACHE +202 -0
- package/NOTICE +18 -0
- package/README.md +24 -0
- package/dist/build/chunk-JS4D4XZ3.js +175 -0
- package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
- package/dist/build/vite-plugin-product-contributions.js +100 -0
- package/dist/build/vite-plugin-product-contributions.js.map +7 -0
- package/dist/build/vite-plugin-shared-react.js +25 -0
- package/dist/build/vite-plugin-shared-react.js.map +7 -0
- package/dist/build/vite-plugin-shared-three.js +86 -0
- package/dist/build/vite-plugin-shared-three.js.map +7 -0
- package/dist/server/chunk-KMJC7AGO.js +98 -0
- package/dist/server/chunk-KMJC7AGO.js.map +7 -0
- package/dist/server/chunk-PSILUMGS.js +46 -0
- package/dist/server/chunk-PSILUMGS.js.map +7 -0
- package/dist/server/frame-proxy.js +255 -0
- package/dist/server/frame-proxy.js.map +7 -0
- package/dist/server/open-browser.js +53 -0
- package/dist/server/open-browser.js.map +7 -0
- package/dist/server/process-shutdown.js +127 -0
- package/dist/server/process-shutdown.js.map +7 -0
- package/dist/server/session-registry.js +141 -0
- package/dist/server/session-registry.js.map +7 -0
- package/dist/server/spawn-opener.js +11 -0
- package/dist/server/spawn-opener.js.map +7 -0
- package/dist/server/worktree-identity.js +11 -0
- package/dist/server/worktree-identity.js.map +7 -0
- package/dist-server/packaged.mjs +88816 -0
- package/package.json +118 -0
- package/scripts/build-plugins.mjs +14 -0
- package/scripts/build-server.mjs +26 -0
- package/scripts/build-session.mjs +9 -0
- package/server/account-credentials.ts +60 -0
- package/server/account-service.ts +1434 -0
- package/server/adapter-region-includes.ts +47 -0
- package/server/asset-catalog-v2.ts +175 -0
- package/server/asset-history-snapshots.ts +196 -0
- package/server/asset-ledger-store.ts +195 -0
- package/server/asset-library-routes.ts +1595 -0
- package/server/blender-wasm-artifact.ts +430 -0
- package/server/boot-timings.ts +106 -0
- package/server/canonical-path.ts +50 -0
- package/server/checkout-workspace-preflight.ts +349 -0
- package/server/cloud-asset-catalog.ts +158 -0
- package/server/coding-inference-launch.ts +237 -0
- package/server/collaboration-account-client.ts +202 -0
- package/server/collaboration-attribution.ts +122 -0
- package/server/collaboration-session.ts +934 -0
- package/server/comfyui-bridge.ts +248 -0
- package/server/console-ledger.ts +499 -0
- package/server/creation-site-transform.ts +304 -0
- package/server/creation-site-write.ts +648 -0
- package/server/data-file-serialize.ts +158 -0
- package/server/editor-brand-html.ts +72 -0
- package/server/editor-control-socket.ts +366 -0
- package/server/editor-server-options.ts +190 -0
- package/server/editor-server.ts +1483 -0
- package/server/editor-sse.ts +352 -0
- package/server/engine-provenance.ts +169 -0
- package/server/engine-source-restart.ts +117 -0
- package/server/frame-bridge.ts +115 -0
- package/server/frame-proxy.ts +490 -0
- package/server/frame-workbench.ts +259 -0
- package/server/frontend-handoff.ts +229 -0
- package/server/game-globals-shadow.ts +113 -0
- package/server/gameplay-session-retention.ts +149 -0
- package/server/gameplay-sessions.ts +123 -0
- package/server/generation-jobs.ts +201 -0
- package/server/generation-reconciler.ts +137 -0
- package/server/generative-execution-context.ts +59 -0
- package/server/git-workflow.ts +612 -0
- package/server/harness-chat-caller.ts +36 -0
- package/server/harness-chat-service.ts +1681 -0
- package/server/idle-shutdown.ts +170 -0
- package/server/js-profiling-policy.ts +52 -0
- package/server/launcher-settings.ts +84 -0
- package/server/local-asset-catalog.ts +410 -0
- package/server/managed-account-defaults.ts +22 -0
- package/server/mock-control-plane.ts +540 -0
- package/server/model-import-conversion.ts +345 -0
- package/server/native-credential-store.ts +162 -0
- package/server/open-browser.ts +118 -0
- package/server/packaged.ts +1192 -0
- package/server/play-stall.ts +126 -0
- package/server/process-shutdown.ts +218 -0
- package/server/product-presets.ts +55 -0
- package/server/project-build-artifact.ts +95 -0
- package/server/project-components.ts +100 -0
- package/server/project-dependency-invalidation.ts +114 -0
- package/server/project-file-scan.ts +235 -0
- package/server/project-hmr-files.ts +215 -0
- package/server/project-install-roots.ts +210 -0
- package/server/project-kinds.ts +71 -0
- package/server/project-mcp-servers.ts +82 -0
- package/server/project-module-freshness.ts +109 -0
- package/server/project-module-instance.ts +375 -0
- package/server/project-optimize-deps-entries.ts +827 -0
- package/server/project-output-writer.ts +679 -0
- package/server/project-package-origin.ts +63 -0
- package/server/project-root-surface.ts +831 -0
- package/server/project-scratch-path.ts +47 -0
- package/server/project-script-hmr.ts +619 -0
- package/server/project-serving-plugins.ts +236 -0
- package/server/project-tools.ts +653 -0
- package/server/project-validation.ts +250 -0
- package/server/project-verbs.ts +127 -0
- package/server/project-view.ts +52 -0
- package/server/project-watch.ts +1134 -0
- package/server/project-work-coordinator.ts +288 -0
- package/server/provider-credentials.ts +331 -0
- package/server/recent-projects-store.ts +98 -0
- package/server/redact-secrets.ts +71 -0
- package/server/repository-presence.ts +267 -0
- package/server/routes/account.ts +357 -0
- package/server/routes/agents.ts +60 -0
- package/server/routes/assets.ts +154 -0
- package/server/routes/build.ts +13 -0
- package/server/routes/collaboration.ts +595 -0
- package/server/routes/configurations.ts +419 -0
- package/server/routes/context.ts +264 -0
- package/server/routes/control-plane.ts +1811 -0
- package/server/routes/logs.ts +272 -0
- package/server/routes/project-identity.ts +302 -0
- package/server/routes/project-open.ts +429 -0
- package/server/routes/project-source.ts +686 -0
- package/server/routes/project-state.ts +383 -0
- package/server/routes/relay.ts +1029 -0
- package/server/routes/route-helpers.ts +29 -0
- package/server/routes/served-modules.ts +138 -0
- package/server/routes/session-tabs.ts +196 -0
- package/server/routes/settings.ts +121 -0
- package/server/routes/share-control.ts +486 -0
- package/server/routes/themes.ts +116 -0
- package/server/routes/tools.ts +230 -0
- package/server/routes/worktrees.ts +595 -0
- package/server/scoped-game-css.ts +461 -0
- package/server/server-utils.ts +1194 -0
- package/server/session-product.ts +112 -0
- package/server/session-registry.ts +230 -0
- package/server/share-claims.ts +138 -0
- package/server/share-host.ts +526 -0
- package/server/share-session-gateway.ts +1362 -0
- package/server/share-tunnel.ts +123 -0
- package/server/spawn-opener.ts +74 -0
- package/server/support/play/log-format.ts +76 -0
- package/server/support/play/session-record.ts +199 -0
- package/server/support/project/build-discipline.ts +718 -0
- package/server/support/project/inspection-node.ts +119 -0
- package/server/support/project/log-naming.ts +54 -0
- package/server/support/project/provenance.ts +290 -0
- package/server/support/project/run-name.ts +18 -0
- package/server/support/project/session-journal.ts +830 -0
- package/server/support/project/shared.ts +327 -0
- package/server/tab-bootstrap.ts +62 -0
- package/server/tab-heartbeat.ts +477 -0
- package/server/tab-lifecycle.ts +550 -0
- package/server/tab-presence.ts +1508 -0
- package/server/team-agent-mirror.ts +95 -0
- package/server/twin-auth.ts +138 -0
- package/server/vendored-lock-recorder.ts +968 -0
- package/server/worktree-identity.ts +121 -0
- package/server/worktree-management.ts +398 -0
- package/server/worktree-retention.d.mts +13 -0
- package/server/worktree-retention.mjs +205 -0
- package/src/EditorContext.tsx +169 -0
- package/src/account.ts +333 -0
- package/src/action-registry.ts +532 -0
- package/src/active-product.ts +74 -0
- package/src/active-project.ts +155 -0
- package/src/adapter-editor-config.ts +25 -0
- package/src/adapter-observation.ts +49 -0
- package/src/animation/stage-transport.ts +379 -0
- package/src/animation/three-clips-subject.ts +172 -0
- package/src/api/asset-library-wire.ts +45 -0
- package/src/api/assets.ts +365 -0
- package/src/api/base.ts +10 -0
- package/src/api/build.ts +99 -0
- package/src/api/git-wire.ts +56 -0
- package/src/api/logs.ts +92 -0
- package/src/api/project-identity.ts +74 -0
- package/src/api/project-open.ts +355 -0
- package/src/api/project-source.ts +162 -0
- package/src/api/project-state.ts +107 -0
- package/src/api/relay.ts +268 -0
- package/src/api/settings.ts +36 -0
- package/src/api/themes.ts +45 -0
- package/src/api/worktrees.ts +257 -0
- package/src/asset-compare-core.ts +171 -0
- package/src/asset-compare.ts +294 -0
- package/src/asset-editor-context.tsx +100 -0
- package/src/asset-events.ts +97 -0
- package/src/asset-inspector-actions.ts +87 -0
- package/src/asset-preview-framing.ts +357 -0
- package/src/asset-preview.ts +2802 -0
- package/src/asset-selection-viewer-registry.ts +113 -0
- package/src/asset-selection.ts +133 -0
- package/src/asset-workflow/asset-capabilities.ts +344 -0
- package/src/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/asset-workflow/asset-ledger.ts +156 -0
- package/src/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/asset-workflow/asset-types.ts +142 -0
- package/src/asset-workflow/asset-workflow-quality.ts +61 -0
- package/src/asset-workflow/audio-preview-player.ts +193 -0
- package/src/asset-workflow/audio-waveform.ts +22 -0
- package/src/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/asset-workflow/folder-preview.ts +345 -0
- package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/asset-workflow/image-view-scale.ts +32 -0
- package/src/asset-workflow/import-contract.ts +124 -0
- package/src/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/asset-workflow/model-inspection.ts +818 -0
- package/src/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +139 -0
- package/src/asset-workflow/project-asset-operations.ts +154 -0
- package/src/asset-workflow/project-asset-roots.ts +68 -0
- package/src/asset-workflow/project-content.ts +288 -0
- package/src/asset-workflow/project-source-index.ts +550 -0
- package/src/asset-workflow/thumbnail-system.ts +256 -0
- package/src/authoring/active-adapter.ts +199 -0
- package/src/authoring/active-systems.ts +422 -0
- package/src/authoring/adapter-key.ts +18 -0
- package/src/authoring/authoring-asset-url.ts +27 -0
- package/src/authoring/bootstrap-state.ts +49 -0
- package/src/authoring/boundary-authoring-adapter.ts +184 -0
- package/src/authoring/breakpoint-state.ts +43 -0
- package/src/authoring/canvas-scene-guides.ts +76 -0
- package/src/authoring/component-instance-root.ts +171 -0
- package/src/authoring/composite-authoring-adapter.ts +2110 -0
- package/src/authoring/consumer-actions.ts +520 -0
- package/src/authoring/css-numeric-style.ts +97 -0
- package/src/authoring/design-time-layers.ts +849 -0
- package/src/authoring/design-time-mount-registry.ts +235 -0
- package/src/authoring/design-time-settle.ts +343 -0
- package/src/authoring/edit-mode-authoring.ts +619 -0
- package/src/authoring/eyedropper-session.ts +60 -0
- package/src/authoring/instance-source-menu-register.ts +13 -0
- package/src/authoring/instance-source-menu.ts +135 -0
- package/src/authoring/layered-pick.ts +183 -0
- package/src/authoring/live-gesture-lock.ts +50 -0
- package/src/authoring/live-object-transform.ts +62 -0
- package/src/authoring/mount-failure-report.ts +154 -0
- package/src/authoring/mounted-root-subjects.ts +144 -0
- package/src/authoring/no-authoring-adapter.ts +55 -0
- package/src/authoring/null-inspection-subjects.tsx +75 -0
- package/src/authoring/object3d-document-persistence.ts +106 -0
- package/src/authoring/object3d-document-session-registry.ts +120 -0
- package/src/authoring/object3d-document-session.ts +1326 -0
- package/src/authoring/object3d-gesture-controller.ts +113 -0
- package/src/authoring/panel-authoring.ts +121 -0
- package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
- package/src/authoring/prefab-instance-section-model.ts +55 -0
- package/src/authoring/project-authoring-session.ts +105 -0
- package/src/authoring/provenance.ts +99 -0
- package/src/authoring/quarks-particle-systems.ts +19 -0
- package/src/authoring/react-canvas-navigation.ts +255 -0
- package/src/authoring/react-design-canvas-style.ts +20 -0
- package/src/authoring/react-story-board.ts +937 -0
- package/src/authoring/selection-scope.ts +195 -0
- package/src/authoring/shell-document-ops.ts +169 -0
- package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
- package/src/authoring/shell-viewport-policy.ts +48 -0
- package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
- package/src/authoring/stories-scope.ts +35 -0
- package/src/authoring/story-board-chrome-fit.ts +107 -0
- package/src/authoring/story-board-presentation.ts +111 -0
- package/src/authoring/three-projection-core.ts +226 -0
- package/src/authoring/viewport-pick-context.ts +40 -0
- package/src/authoring/viewport-raycast.ts +240 -0
- package/src/authoring/viewport-tool-context.ts +73 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +152 -0
- package/src/authoring/world-pan-state.ts +198 -0
- package/src/authoring/world-session-state.ts +101 -0
- package/src/authoring/write-pipe.ts +173 -0
- package/src/availability-tick.ts +66 -0
- package/src/bitmap-label.ts +120 -0
- package/src/blender-tab-metrics.ts +161 -0
- package/src/board-open-actions.ts +20 -0
- package/src/boot-routing.ts +391 -0
- package/src/build-identity.ts +15 -0
- package/src/bytes-codec.ts +62 -0
- package/src/camera-authoring.ts +175 -0
- package/src/cancellation-reason.ts +58 -0
- package/src/canvas-preview-frames.ts +482 -0
- package/src/capture-camera-pose.ts +77 -0
- package/src/chrome-registry.ts +159 -0
- package/src/chrome-slot-registry.ts +91 -0
- package/src/collaboration-client.ts +264 -0
- package/src/collaboration-presence.ts +41 -0
- package/src/command-dispatch.ts +19 -0
- package/src/command-listener.ts +2743 -0
- package/src/command-registry.ts +70 -0
- package/src/component-board-registry.ts +205 -0
- package/src/component-states-registry.ts +200 -0
- package/src/components/AgentPresentationNotice.tsx +75 -0
- package/src/components/AlignToolbar.tsx +204 -0
- package/src/components/AppRoot.tsx +394 -0
- package/src/components/ApplicationMenus.tsx +415 -0
- package/src/components/AssetBrowser.tsx +2843 -0
- package/src/components/AssetEditorShell.tsx +216 -0
- package/src/components/AssetInspectorToolSection.tsx +124 -0
- package/src/components/BoardRulers.tsx +354 -0
- package/src/components/CameraInfo.tsx +81 -0
- package/src/components/CanvasSceneViewport.tsx +556 -0
- package/src/components/CapabilityCoverageSection.tsx +185 -0
- package/src/components/CenterDocuments.tsx +22 -0
- package/src/components/ChromeSlot.tsx +20 -0
- package/src/components/CodeView.tsx +470 -0
- package/src/components/CollaborationHeaderControl.css +74 -0
- package/src/components/CompactInspectorCard.tsx +190 -0
- package/src/components/CompactInspectorShell.tsx +39 -0
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +270 -0
- package/src/components/DefaultEditorLayout.tsx +106 -0
- package/src/components/DocumentHeaderStrip.tsx +96 -0
- package/src/components/DocumentShelfRail.tsx +45 -0
- package/src/components/DocumentThumbnail.tsx +345 -0
- package/src/components/EditorLeaseGuard.tsx +372 -0
- package/src/components/ErrorBanner.tsx +123 -0
- package/src/components/FolderPreviewTile.tsx +159 -0
- package/src/components/GameHierarchy.tsx +3842 -0
- package/src/components/GameplaySessionTimeline.tsx +295 -0
- package/src/components/InspectionProjection.tsx +968 -0
- package/src/components/Inspector.tsx +233 -0
- package/src/components/InspectorCanvasPreview.tsx +35 -0
- package/src/components/InspectorFieldsSection.tsx +290 -0
- package/src/components/InspectorObjectPreview.tsx +57 -0
- package/src/components/InspectorStoriesSection.tsx +92 -0
- package/src/components/InspectorToolSection.tsx +96 -0
- package/src/components/InspectorTransformSection.tsx +245 -0
- package/src/components/LightExplorerPanel.tsx +433 -0
- package/src/components/MediaProperties.tsx +145 -0
- package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
- package/src/components/Object3DDocumentToolbar.css +100 -0
- package/src/components/Object3DDocumentToolbar.tsx +454 -0
- package/src/components/Object3DDocumentViewport.tsx +58 -0
- package/src/components/ProjectHeader.css +617 -0
- package/src/components/ProjectHeader.tsx +328 -0
- package/src/components/ProjectLayout.tsx +249 -0
- package/src/components/ReactCanvasControls.tsx +284 -0
- package/src/components/RootSelectionOverlay.tsx +3162 -0
- package/src/components/RootTextEditor.tsx +79 -0
- package/src/components/SaveStatus.tsx +70 -0
- package/src/components/StageHost.tsx +1954 -0
- package/src/components/StageOverlays.tsx +21 -0
- package/src/components/StartupErrorScreen.tsx +76 -0
- package/src/components/StartupLoadingScreen.tsx +65 -0
- package/src/components/StatsOverlay.tsx +78 -0
- package/src/components/SurfaceStateOverlay.tsx +24 -0
- package/src/components/ToolContributionSurfaces.tsx +65 -0
- package/src/components/ToolHost.tsx +370 -0
- package/src/components/ToolObject3DPreview.tsx +39 -0
- package/src/components/Toolbar.tsx +595 -0
- package/src/components/TransientHint.tsx +44 -0
- package/src/components/TransportStrip.tsx +174 -0
- package/src/components/VersionControlSection.tsx +470 -0
- package/src/components/VgaiLogo.css +83 -0
- package/src/components/VgaiLogo.tsx +35 -0
- package/src/components/ViewportControlsHint.tsx +60 -0
- package/src/components/ViewportFurniture.tsx +401 -0
- package/src/components/ViewportOverlay.tsx +145 -0
- package/src/components/ViewportOverlaysMenu.tsx +153 -0
- package/src/components/ViewportShadingMenu.tsx +300 -0
- package/src/components/ViewportViewMenu.tsx +101 -0
- package/src/components/WorkspaceDocumentSurface.tsx +204 -0
- package/src/components/WorkspaceUtilitySurface.tsx +22 -0
- package/src/components/WorktreeSwitcher.css +239 -0
- package/src/components/WorktreeSwitcher.tsx +890 -0
- package/src/components/account-documents.tsx +1162 -0
- package/src/components/asset-documents.tsx +812 -0
- package/src/components/asset-editor-persistence.ts +216 -0
- package/src/components/asset-selection-section.tsx +535 -0
- package/src/components/asset-thumbnails.tsx +312 -0
- package/src/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
- package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
- package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
- package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
- package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
- package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
- package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
- package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
- package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
- package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
- package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/components/asset-viewers/shader-source.ts +144 -0
- package/src/components/asset-workflow.css +731 -0
- package/src/components/board-guides.ts +150 -0
- package/src/components/compact-inspector.css +539 -0
- package/src/components/core-utilities.tsx +90 -0
- package/src/components/editor-notifications.css +40 -0
- package/src/components/engine-workspace.css +274 -0
- package/src/components/inspector-preview-section.tsx +238 -0
- package/src/components/inspector-property-grouping.ts +64 -0
- package/src/components/inspector-revert-label.ts +20 -0
- package/src/components/inspector-selection.ts +42 -0
- package/src/components/inspector-stories-gating.ts +171 -0
- package/src/components/inspector-transform-subject.ts +11 -0
- package/src/components/inspector-transform.ts +75 -0
- package/src/components/kind-documents.tsx +500 -0
- package/src/components/palette-action-publisher.tsx +140 -0
- package/src/components/primitives/DraftColorInput.tsx +74 -0
- package/src/components/product-shell.css +1829 -0
- package/src/components/project-tool-documents.tsx +410 -0
- package/src/components/scene-documents.tsx +223 -0
- package/src/components/stage-keyboard.tsx +37 -0
- package/src/components/stage-overlay-set.tsx +107 -0
- package/src/components/stage-presence-markers.ts +478 -0
- package/src/components/standard-viewport-dressing.ts +417 -0
- package/src/components/status-contributions.tsx +403 -0
- package/src/components/tool-documents.tsx +309 -0
- package/src/components/tool-schema-form.tsx +262 -0
- package/src/components/use-after-paint.ts +41 -0
- package/src/components/use-project-image-assets.ts +86 -0
- package/src/components/viewport-header-controls.css +90 -0
- package/src/components/viewport-surface-status.tsx +55 -0
- package/src/components/workspace-history.ts +32 -0
- package/src/components/workspace-static-panel-registry.tsx +152 -0
- package/src/components/workspace-surfaces.css +621 -0
- package/src/components/world-documents.tsx +586 -0
- package/src/components/world-overlay-gestures.ts +1694 -0
- package/src/composite-screenshot.ts +1641 -0
- package/src/console-sync.ts +131 -0
- package/src/constraint-helper.ts +338 -0
- package/src/content-entry-source-registry.ts +184 -0
- package/src/coverage/authoring-seam-evidence.ts +300 -0
- package/src/coverage/canvas-reveal.ts +192 -0
- package/src/coverage/design-time-surfaces.ts +101 -0
- package/src/coverage/live-seam-evidence.ts +11 -0
- package/src/coverage/ontology-invariants.ts +466 -0
- package/src/coverage/session-vitals.ts +501 -0
- package/src/coverage/system-seam-evidence.ts +72 -0
- package/src/crash-null-boundary.ts +36 -0
- package/src/creation-site-edit.ts +1479 -0
- package/src/creation-site-registry.ts +160 -0
- package/src/delegate-harness-registry.ts +143 -0
- package/src/document-context-registry.ts +177 -0
- package/src/document-open-registry.ts +200 -0
- package/src/document-preview-source.ts +20 -0
- package/src/document-renderer-session.ts +138 -0
- package/src/editor-api.ts +46 -0
- package/src/editor-chrome-capture.ts +139 -0
- package/src/editor-commands.ts +164 -0
- package/src/editor-console.ts +563 -0
- package/src/editor-current-view.ts +82 -0
- package/src/editor-document-probe.ts +881 -0
- package/src/editor-git-client.ts +115 -0
- package/src/editor-host-door.ts +462 -0
- package/src/editor-hotkeys.ts +842 -0
- package/src/editor-lease-view.ts +39 -0
- package/src/editor-lease.ts +415 -0
- package/src/editor-mode.ts +19 -0
- package/src/editor-notifications.ts +140 -0
- package/src/editor-presence.ts +563 -0
- package/src/editor-presentation-activity.ts +50 -0
- package/src/editor-presentation-notice.ts +42 -0
- package/src/editor-runtime.tsx +145 -0
- package/src/editor-server-response.ts +86 -0
- package/src/editor-session-attribution.ts +75 -0
- package/src/editor-session-mode.ts +54 -0
- package/src/editor-shell-store.ts +1304 -0
- package/src/editor-state-facets.ts +74 -0
- package/src/editor-styles.css +33 -0
- package/src/editor-view-presentation.ts +810 -0
- package/src/editor-viewport.ts +5302 -0
- package/src/entity-lod.ts +31 -0
- package/src/entity-object.ts +91 -0
- package/src/files/file-provider.ts +62 -0
- package/src/files/project-files.ts +264 -0
- package/src/finders/index.ts +136 -0
- package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/frame/bridge.tsx +1408 -0
- package/src/frame/product.ts +77 -0
- package/src/gameplay-dom-recording.ts +319 -0
- package/src/gameplay-export-state.ts +14 -0
- package/src/gameplay-replay.ts +417 -0
- package/src/gameplay-session-time.ts +9 -0
- package/src/gameplay-sessions.ts +204 -0
- package/src/harness-chat-types.ts +253 -0
- package/src/hierarchy-component-marks.ts +298 -0
- package/src/hierarchy-drop.ts +91 -0
- package/src/hierarchy-expansion-state.ts +80 -0
- package/src/hierarchy-header-slot.ts +52 -0
- package/src/hierarchy-internals.ts +197 -0
- package/src/hierarchy-kind-icon.ts +217 -0
- package/src/hierarchy-mark-reader.ts +73 -0
- package/src/hierarchy-menu-registry.ts +67 -0
- package/src/hierarchy-node-rows.ts +307 -0
- package/src/hierarchy-panel-view.ts +280 -0
- package/src/hierarchy-projection.ts +76 -0
- package/src/hierarchy-row-cache.ts +243 -0
- package/src/hierarchy-row-model.ts +308 -0
- package/src/hierarchy-rows.ts +11 -0
- package/src/hierarchy-walk.ts +86 -0
- package/src/history/editor-session.ts +25 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-delegate.ts +163 -0
- package/src/history/history-limit-notices.ts +43 -0
- package/src/history/history-service.ts +1173 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +386 -0
- package/src/history/project-root-history-backends.ts +139 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +103 -0
- package/src/history/source-history-backend.ts +546 -0
- package/src/history/types.ts +124 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hotkeys.ts +188 -0
- package/src/inference-diagnostics.ts +69 -0
- package/src/initial-project.ts +80 -0
- package/src/inspection/active-subject.ts +578 -0
- package/src/inspection/active-surface.ts +142 -0
- package/src/inspection/compose.ts +1064 -0
- package/src/inspection/display.ts +170 -0
- package/src/inspection/document-subject.ts +109 -0
- package/src/inspection/game-subject.ts +85 -0
- package/src/inspection/model.ts +542 -0
- package/src/inspection/null-subject.ts +115 -0
- package/src/inspection/serialize.ts +357 -0
- package/src/inspection/use-active-inspection.ts +180 -0
- package/src/inspector-presentation.ts +201 -0
- package/src/inspector-section-registry.ts +221 -0
- package/src/instance-source-actions.ts +163 -0
- package/src/instanced-presentation.ts +164 -0
- package/src/js-heap.ts +71 -0
- package/src/key-actions.ts +91 -0
- package/src/keymap-presets.ts +401 -0
- package/src/layout-policy.ts +31 -0
- package/src/learn-links.ts +73 -0
- package/src/light-explorer-model.ts +134 -0
- package/src/live-canvas-frame.ts +55 -0
- package/src/live-document.ts +279 -0
- package/src/live-module-source.ts +230 -0
- package/src/live-session-registry.ts +220 -0
- package/src/live-transition.ts +633 -0
- package/src/manifest-project.ts +107 -0
- package/src/model-thumbnail.ts +523 -0
- package/src/native-selection-style.ts +202 -0
- package/src/object3d-document-write-policy.ts +137 -0
- package/src/packaged-runtime.ts +108 -0
- package/src/palettes/maya.palette.json +57 -0
- package/src/palettes/substance.palette.json +57 -0
- package/src/pasteboard-module.ts +81 -0
- package/src/performance-profiler.ts +367 -0
- package/src/performance-sources.ts +69 -0
- package/src/play-boot-phase.ts +145 -0
- package/src/presentation-surface.ts +248 -0
- package/src/project-adapter.ts +1143 -0
- package/src/project-asset-refresh.ts +26 -0
- package/src/project-declaration-refresh.ts +31 -0
- package/src/project-local-state.ts +118 -0
- package/src/project-manager.ts +243 -0
- package/src/project-module-changes.ts +163 -0
- package/src/project-module-split.ts +266 -0
- package/src/project-provenance.ts +115 -0
- package/src/project-ready.ts +42 -0
- package/src/project-session-reset.ts +67 -0
- package/src/project-shape.ts +68 -0
- package/src/project-tool-discovery.ts +66 -0
- package/src/project-tools.ts +107 -0
- package/src/project-work-types.ts +149 -0
- package/src/projection/three.ts +898 -0
- package/src/projection/types.ts +44 -0
- package/src/readiness.ts +113 -0
- package/src/reflection-probe-helper.ts +142 -0
- package/src/reported-play-state.ts +90 -0
- package/src/resolve-relative-specifier.ts +33 -0
- package/src/scene-document-plan.ts +315 -0
- package/src/scene-framing.ts +315 -0
- package/src/scene-live-open.ts +210 -0
- package/src/scene-view-fog.ts +89 -0
- package/src/scoped-game-css.ts +152 -0
- package/src/session-orphan-record.ts +193 -0
- package/src/session-tombstone.ts +126 -0
- package/src/settings/settings-provider.ts +82 -0
- package/src/settings-store.ts +345 -0
- package/src/shared-view-restore.ts +42 -0
- package/src/shell-store-door.ts +45 -0
- package/src/source-conflict.ts +122 -0
- package/src/spatial-handle-visuals.ts +332 -0
- package/src/stage-context.ts +341 -0
- package/src/stage-store-registry.ts +63 -0
- package/src/stale-chunk-recovery.ts +34 -0
- package/src/state-report-deferral.ts +73 -0
- package/src/storage/host-files-storage.ts +97 -0
- package/src/storage/http-storage.ts +174 -0
- package/src/storage/index.ts +75 -0
- package/src/storage/mem-storage.ts +149 -0
- package/src/storage/path-lock.ts +44 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/types.ts +116 -0
- package/src/stories/StoryComponentThumbnail.tsx +184 -0
- package/src/stories/StoryPreviewMount.tsx +306 -0
- package/src/stories/component-content-source.tsx +106 -0
- package/src/stories/component-states-source.ts +78 -0
- package/src/stories/compose-project-stories.ts +255 -0
- package/src/stories/pixi-story-model.ts +30 -0
- package/src/stories/prefabs-finder.ts +54 -0
- package/src/stories/prefabs-from-stories.ts +182 -0
- package/src/stories/project-story-discovery.ts +78 -0
- package/src/stories/project-story-regions.ts +24 -0
- package/src/stories/story-actions.ts +54 -0
- package/src/stories/story-capture-command.ts +124 -0
- package/src/stories/story-capture.ts +584 -0
- package/src/stories/story-declared-medium.ts +126 -0
- package/src/stories/story-discovery.ts +176 -0
- package/src/stories/story-document-openers.ts +36 -0
- package/src/stories/story-dom-runtime.ts +78 -0
- package/src/stories/story-grouping.ts +111 -0
- package/src/stories/story-lane.ts +88 -0
- package/src/stories/story-mount-turn.ts +27 -0
- package/src/stories/story-opener.ts +260 -0
- package/src/stories/story-pixi-preview.ts +408 -0
- package/src/stories/story-presentation.ts +215 -0
- package/src/stories/story-registry.ts +517 -0
- package/src/stories/story-three-preview.ts +807 -0
- package/src/stories/three-story-model.ts +96 -0
- package/src/story-three-preview-runtime.ts +56 -0
- package/src/surface-keyboard.ts +112 -0
- package/src/surface-state.ts +124 -0
- package/src/tab-bootstrap.js +628 -0
- package/src/tab-census.ts +198 -0
- package/src/tab-lifecycle-client.ts +196 -0
- package/src/theme-library.ts +844 -0
- package/src/theme-preference.ts +378 -0
- package/src/theme.css +3437 -0
- package/src/three-viewport/bone-selection-highlight.ts +119 -0
- package/src/three-viewport/camera-fit.ts +41 -0
- package/src/three-viewport/interactive-renderer.ts +132 -0
- package/src/three-viewport/selection-brackets.ts +310 -0
- package/src/three-viewport/selection-outline.ts +183 -0
- package/src/three-viewport/skeleton-helper.ts +61 -0
- package/src/three-viewport/source-color.ts +167 -0
- package/src/three-viewport/studio-environment.ts +96 -0
- package/src/three-viewport-presentation.ts +23 -0
- package/src/tool-contribution-play.ts +74 -0
- package/src/tool-loader.ts +1798 -0
- package/src/transform-mode-request.ts +57 -0
- package/src/transient-hint.ts +78 -0
- package/src/trigger-volume-helper.ts +116 -0
- package/src/ui-source/adapter-region-includes.ts +241 -0
- package/src/ui-source/ensure-import.ts +132 -0
- package/src/ui-source/file-region-resolver.ts +302 -0
- package/src/ui-source/inspect.ts +775 -0
- package/src/ui-source/oid-transform.ts +1845 -0
- package/src/ui-source/plan-csf-story.ts +196 -0
- package/src/ui-source/plan-extract-component.ts +421 -0
- package/src/ui-source/plan-fork-component.ts +621 -0
- package/src/ui-source/plan-named-style.ts +95 -0
- package/src/ui-source/plan-source-edit.ts +353 -0
- package/src/ui-source/r3f-contract-resolver.ts +327 -0
- package/src/ui-source/r3f-diagnostic-index.ts +165 -0
- package/src/ui-source/r3f-environment-binding.ts +133 -0
- package/src/ui-source/r3f-joint-binding.ts +251 -0
- package/src/ui-source/r3f-lod-binding.ts +91 -0
- package/src/ui-source/r3f-particle-binding.ts +235 -0
- package/src/ui-source/r3f-physics-binding.ts +483 -0
- package/src/ui-source/r3f-project-contracts.ts +444 -0
- package/src/ui-source/relative-import-specifier.ts +34 -0
- package/src/ui-source/reparent-guard.ts +544 -0
- package/src/ui-source/source-edit-request.ts +97 -0
- package/src/ui-source/source-write-backend.ts +618 -0
- package/src/ui-source/syntactic-prop-specs.ts +296 -0
- package/src/ui-source/tier-source-write-backend.ts +279 -0
- package/src/ui-source/ts-ast.ts +171 -0
- package/src/ui-source/utility-class-support.ts +169 -0
- package/src/ui-source/write-component-default.ts +133 -0
- package/src/ui-source/writer.ts +1989 -0
- package/src/viewport-activation-timings.ts +840 -0
- package/src/viewport-authoring-policy.ts +186 -0
- package/src/viewport-controls-hint.ts +57 -0
- package/src/viewport-door.ts +237 -0
- package/src/viewport-shading-boundary.ts +12 -0
- package/src/vite-error-surface.ts +141 -0
- package/src/wait-until.ts +37 -0
- package/src/workspace-areas.ts +156 -0
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-available-documents.ts +127 -0
- package/src/workspace-core-utilities.ts +31 -0
- package/src/workspace-document-ids.ts +59 -0
- package/src/workspace-document-registry.ts +612 -0
- package/src/workspace-document-restore.ts +145 -0
- package/src/workspace-host-commands.ts +141 -0
- package/src/workspace-persistence-gate.ts +40 -0
- package/src/workspace-play-utilities.ts +44 -0
- package/src/workspace-presets.ts +425 -0
- package/src/workspace-regions.ts +294 -0
- package/src/workspace-state-persistence.ts +536 -0
- package/src/workspace-static-panels.ts +73 -0
- package/src/workspace-status-registry.ts +121 -0
- package/src/workspace-style.ts +239 -0
- package/src/workspace-utility-commands.ts +74 -0
- package/src/workspace-utility-registry.ts +263 -0
- package/src/workspace-viewport-rect.ts +97 -0
- package/src/world-adoption.ts +115 -0
- package/src/world-document-routing.ts +104 -0
- package/vite-plugin-creation-site-write.ts +184 -0
- package/vite-plugin-creation-site.ts +80 -0
- package/vite-plugin-game-static.ts +303 -0
- package/vite-plugin-module-doorways.ts +336 -0
- package/vite-plugin-product-contributions.ts +197 -0
- package/vite-plugin-project-game-static.ts +125 -0
- package/vite-plugin-project-jsx-js.ts +65 -0
- package/vite-plugin-project-root-absolute-assets.ts +359 -0
- package/vite-plugin-shared-react.ts +420 -0
- package/vite-plugin-shared-three.ts +203 -0
- package/vite-plugin-ui-oid.ts +2106 -0
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WHERE A PHYSICS-OWNED NODE IS ACTUALLY PLACED — the source fact that says an
|
|
3
|
+
* element's transform is written by a body rather than by the element's own
|
|
4
|
+
* JSX, and which artifact owns that body's SPAWN.
|
|
5
|
+
*
|
|
6
|
+
* ## The measured defect
|
|
7
|
+
*
|
|
8
|
+
* `@react-three/cannon` drives a node by writing its MATRIX:
|
|
9
|
+
* `object.matrixAutoUpdate = false; object.matrix.copy(compose(p, q, ONE))`
|
|
10
|
+
* (`node_modules/@react-three/cannon/dist/index.js`'s `apply`). Two consequences,
|
|
11
|
+
* both of which the editor got wrong before this module existed:
|
|
12
|
+
*
|
|
13
|
+
* - The node's own `position`/`rotation`/`scale` JSX props are DEAD. Writing
|
|
14
|
+
* one produces a file that says the object is somewhere it will never be:
|
|
15
|
+
* the body re-spawns from the hook's argument and overwrites the matrix on
|
|
16
|
+
* the next frame. Measured on the racing-game ingest — a moved chassis wrote
|
|
17
|
+
* its leaf element and the remount re-spawned at the binding's
|
|
18
|
+
* `[-110, 0.75, 220]`, digit for digit.
|
|
19
|
+
* - `scale` goes with them: `apply` composes with a fixed `(1,1,1)`, so a
|
|
20
|
+
* cannon body erases its node's scale as surely as its position.
|
|
21
|
+
*
|
|
22
|
+
* The transform is therefore owned by the BINDING — the `useBox(…)` /
|
|
23
|
+
* `useCompoundBody(…)` call that attached the body to this element's ref — and
|
|
24
|
+
* an honest editor writes where the binding reads, or refuses by name.
|
|
25
|
+
*
|
|
26
|
+
* ## Where the binding reads, measured rather than assumed
|
|
27
|
+
*
|
|
28
|
+
* Over the whole vendored cannon corpus (`vendor/games/racing-game`: `Chassis`,
|
|
29
|
+
* `Wheel`, `Ramp`, `Train`, `Goal`, `Heightmap`, `BoundingBox`) **not one hook
|
|
30
|
+
* argument carries an inline position literal.** Every binding takes its spawn
|
|
31
|
+
* from the component's OWN PROPS — `useBox(() => ({ …props }))`, or the
|
|
32
|
+
* shorthand `useBox(() => ({ args, position, rotation }))` over a destructured
|
|
33
|
+
* prop — so the literal that places the body is the one at the component's
|
|
34
|
+
* CALLSITE (`<Ramp position={[2, -1, 168.55]} />`, `App.tsx:57`). That is the
|
|
35
|
+
* prop literal the write routes to, and the ordinary JSX prop writer already
|
|
36
|
+
* reaches it; what was missing was a contract that admits the forwarding is
|
|
37
|
+
* real, which is `forwarded` below.
|
|
38
|
+
*
|
|
39
|
+
* `literal` is the other shape — a spawn spelled at the hook itself. It is
|
|
40
|
+
* recorded so a refusal can NAME it (`position is owned by useBox at
|
|
41
|
+
* Ramp.tsx:8`) rather than pretending the element's own prop is writable. No
|
|
42
|
+
* writer for it ships: a hook argument is not a JSX element, it has no oid, and
|
|
43
|
+
* building an address for a shape with zero occurrences in the corpus would be
|
|
44
|
+
* a writer with no caller.
|
|
45
|
+
*
|
|
46
|
+
* ## Why this is a SOURCE analysis and not the runtime flag
|
|
47
|
+
*
|
|
48
|
+
* `matrixAutoUpdate === false` is a true runtime tell for cannon, and a useless
|
|
49
|
+
* one for routing: it says a driver owns the node, never WHERE the driver reads
|
|
50
|
+
* its spawn. It is also not general — `@react-three/rapier` writes
|
|
51
|
+
* `object.position.copy(…)`/`object.quaternion.copy(…)` and leaves
|
|
52
|
+
* `matrixAutoUpdate` alone, so the flag misses rapier entirely while the source
|
|
53
|
+
* says plainly that `<RigidBody position={…}>` is the spawn (which is why the
|
|
54
|
+
* built-in rapier contract in `oid-transform.ts` already routes it correctly).
|
|
55
|
+
* The binding is a fact about the file; the write anchor has to be too.
|
|
56
|
+
*
|
|
57
|
+
* Nothing here is a general "physics abstraction": it recognizes ONE package's
|
|
58
|
+
* body hooks by import specifier, the same hand-audited way
|
|
59
|
+
* `BUILTIN_R3F_CONTRACTS` recognizes `<RigidBody>`, because guessing at an
|
|
60
|
+
* unknown library's ownership is how an editor writes props a library ignores.
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
import ts from 'typescript';
|
|
64
|
+
import { enclosingScope, refIdentifier } from './ts-ast';
|
|
65
|
+
|
|
66
|
+
export type PhysicsChannel = 'position' | 'rotation' | 'scale';
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The body binding that owns one element's transform.
|
|
70
|
+
*
|
|
71
|
+
* JSON-shaped on purpose: it rides an `OidEntry` over `/__ui-source/index` to
|
|
72
|
+
* the page, so it holds no `ts.Node`.
|
|
73
|
+
*/
|
|
74
|
+
export interface R3fPhysicsBinding {
|
|
75
|
+
/** The local name of the hook that created the body (`useBox`). */
|
|
76
|
+
hook: string;
|
|
77
|
+
/** 1-based line of the hook call, in the element's own file. */
|
|
78
|
+
line: number;
|
|
79
|
+
/** Channels whose spawn the hook takes from the component's own props — the
|
|
80
|
+
* write belongs at this component's CALLSITE. */
|
|
81
|
+
forwarded: PhysicsChannel[];
|
|
82
|
+
/** Channels the hook spells as an inline literal in its own argument. There
|
|
83
|
+
* is no write anchor for those; a refusal names them. */
|
|
84
|
+
literal: PhysicsChannel[];
|
|
85
|
+
/**
|
|
86
|
+
* Channels the component's OWN `useFrame` drives through the hook's api
|
|
87
|
+
* (`api.position.set(...)`) — the spawn is not the last word for these, so
|
|
88
|
+
* a callsite literal cannot hold: the game re-poses the body every frame
|
|
89
|
+
* (measured on racing-game's `Train`, a Kinematic body driven from its
|
|
90
|
+
* animated group — the doctor's settle leg read the authored spawn back as
|
|
91
|
+
* the old pose, digit for digit). Absent (never `[]`) when nothing drives
|
|
92
|
+
* the api, so an older recorded binding compares equal to one with no
|
|
93
|
+
* opinion — same rule as `bodyForwarded`'s absence.
|
|
94
|
+
*/
|
|
95
|
+
apiDriven?: PhysicsChannel[];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** What an element carrying a binding looks like to a writer. Structural rather
|
|
99
|
+
* than the whole `OidEntry`, so this stays the browser-safe half. */
|
|
100
|
+
export interface PhysicsBoundElement {
|
|
101
|
+
readonly file: string;
|
|
102
|
+
readonly physicsBinding?: R3fPhysicsBinding | undefined;
|
|
103
|
+
/** The callsite half of the same fact: the component this element
|
|
104
|
+
* instantiates hands `channel` to a body binding inside itself, so the
|
|
105
|
+
* literal written HERE is the spawn the simulation reads
|
|
106
|
+
* (`oid-transform.ts`'s `bodyForwarded`). */
|
|
107
|
+
readonly r3fAuthoring?: { readonly bodyForwarded?: readonly string[] | undefined } | undefined;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Is this element's `channel` PLACED BY A SIMULATED BODY — the fact that makes
|
|
112
|
+
* an edit here a `physics-binding` write rather than an ordinary `source-prop`
|
|
113
|
+
* one, in `WriteAnchorKind`'s vocabulary (`@volter/editor-project/adapter`'s `authoring.ts`).
|
|
114
|
+
*
|
|
115
|
+
* Two shapes, and both are the same question ("does a body read this value?")
|
|
116
|
+
* asked of the two places a body can be attached, which is why they answer from
|
|
117
|
+
* one function rather than one per lane:
|
|
118
|
+
*
|
|
119
|
+
* - the element carries the binding itself (`<mesh ref={ref}>` whose ref a
|
|
120
|
+
* `useBox` bound) — its own props are dead on arrival, so the write is
|
|
121
|
+
* refused, and the KIND still says which lane owns the value;
|
|
122
|
+
* - the element is a CALLSITE whose component hands the channel to a binding
|
|
123
|
+
* inside it (`<Ramp position={…}/>`, `<CitadelTower position={…}/>`) — the
|
|
124
|
+
* literal a body actually spawns from, and the WRITABLE case. This is the
|
|
125
|
+
* one whose authored value has to survive the re-settle, which is the whole
|
|
126
|
+
* reason `physics-binding` is a kind of its own.
|
|
127
|
+
*
|
|
128
|
+
* Deliberately beside {@link physicsRefusal}: the refusal names who owns the
|
|
129
|
+
* placement and this names the lane, and two derivations of "who owns this
|
|
130
|
+
* placement" living in different files is exactly how a subject came to be
|
|
131
|
+
* classified in one lane while its edit travelled another.
|
|
132
|
+
*/
|
|
133
|
+
export function bodyPlacedChannel(
|
|
134
|
+
element: PhysicsBoundElement | undefined,
|
|
135
|
+
channel: string,
|
|
136
|
+
): boolean {
|
|
137
|
+
if (channel !== 'position' && channel !== 'rotation' && channel !== 'scale') return false;
|
|
138
|
+
if (element?.physicsBinding) return true;
|
|
139
|
+
return element?.r3fAuthoring?.bodyForwarded?.includes(channel) === true;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* WHY a write to this element's own `channel` would be lost — `null` when no
|
|
144
|
+
* body owns it, which is the ordinary case.
|
|
145
|
+
*
|
|
146
|
+
* ONE derivation, read by both writers (the first-party R3F source lane's
|
|
147
|
+
* `transformEditability` and the ingest lane's `oid-source-persistence`), so
|
|
148
|
+
* the two can never disagree about who owns a placement. Each sentence names
|
|
149
|
+
* the binding and where to go instead; "does not forward position" would send
|
|
150
|
+
* an author to add a prop the body would ignore.
|
|
151
|
+
*/
|
|
152
|
+
export function physicsRefusal(
|
|
153
|
+
element: PhysicsBoundElement | undefined,
|
|
154
|
+
channel: string,
|
|
155
|
+
): string | null {
|
|
156
|
+
const binding = element?.physicsBinding;
|
|
157
|
+
if (!binding) return null;
|
|
158
|
+
if (channel !== 'position' && channel !== 'rotation' && channel !== 'scale') return null;
|
|
159
|
+
const at = `${element!.file.split('/').pop() ?? element!.file}:${binding.line}`;
|
|
160
|
+
const owned = `${channel} is owned by ${binding.hook} at ${at}`;
|
|
161
|
+
if ((binding.forwarded as readonly string[]).includes(channel)) {
|
|
162
|
+
return `${owned}, which reads this component's own ${channel} prop — write it where the instance is placed, not on this element`;
|
|
163
|
+
}
|
|
164
|
+
if ((binding.literal as readonly string[]).includes(channel)) {
|
|
165
|
+
return `${owned} — the body spawns from that hook's own argument, and a hook argument has no write anchor`;
|
|
166
|
+
}
|
|
167
|
+
// Including `scale`, always: the body re-composes the node's matrix with a
|
|
168
|
+
// fixed unit scale (`@react-three/cannon`'s `apply`), so a scale written here
|
|
169
|
+
// is erased on the next frame exactly like a position.
|
|
170
|
+
return `${owned} — this node is placed by the simulation, so a ${channel} written here is overwritten on the next frame`;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* `@react-three/cannon`'s body hooks — every hook that attaches a simulated
|
|
175
|
+
* body to a ref and thereafter writes that object's matrix.
|
|
176
|
+
*
|
|
177
|
+
* `useRaycastVehicle` is here even though its argument names no transform: it
|
|
178
|
+
* binds a ref whose matrix the simulation owns just the same, so an element it
|
|
179
|
+
* binds must be refused rather than written.
|
|
180
|
+
*/
|
|
181
|
+
const CANNON_BODY_HOOKS = new Set([
|
|
182
|
+
'useBox',
|
|
183
|
+
'useCompoundBody',
|
|
184
|
+
'useConvexPolyhedron',
|
|
185
|
+
'useCylinder',
|
|
186
|
+
'useHeightfield',
|
|
187
|
+
'useParticle',
|
|
188
|
+
'usePlane',
|
|
189
|
+
'useRaycastVehicle',
|
|
190
|
+
'useSphere',
|
|
191
|
+
'useTrimesh',
|
|
192
|
+
]);
|
|
193
|
+
|
|
194
|
+
const PHYSICS_PACKAGES = new Set(['@react-three/cannon']);
|
|
195
|
+
|
|
196
|
+
/** A cannon body hook's LOCAL name (an `import { useBox as box }` keeps working)
|
|
197
|
+
* → the imported hook name. */
|
|
198
|
+
function bodyHookNames(sf: ts.SourceFile): Map<string, string> {
|
|
199
|
+
const names = new Map<string, string>();
|
|
200
|
+
for (const statement of sf.statements) {
|
|
201
|
+
if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (!PHYSICS_PACKAGES.has(statement.moduleSpecifier.text)) continue;
|
|
205
|
+
const bindings = statement.importClause?.namedBindings;
|
|
206
|
+
if (!bindings || !ts.isNamedImports(bindings)) continue;
|
|
207
|
+
for (const element of bindings.elements) {
|
|
208
|
+
const imported = element.propertyName?.text ?? element.name.text;
|
|
209
|
+
if (CANNON_BODY_HOOKS.has(imported)) names.set(element.name.text, imported);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return names;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** The names the enclosing function's FIRST parameter binds — i.e. the props an
|
|
216
|
+
* identifier inside the body could be forwarding. `whole` is the props object
|
|
217
|
+
* itself (`props` in `(props) => …`, or a `...rest`). */
|
|
218
|
+
interface PropScope {
|
|
219
|
+
readonly whole: Set<string>;
|
|
220
|
+
readonly named: Set<string>;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function propScopeOf(parameters: ts.NodeArray<ts.ParameterDeclaration> | undefined): PropScope {
|
|
224
|
+
const whole = new Set<string>();
|
|
225
|
+
const named = new Set<string>();
|
|
226
|
+
const first = parameters?.[0];
|
|
227
|
+
if (!first) return { whole, named };
|
|
228
|
+
if (ts.isIdentifier(first.name)) {
|
|
229
|
+
whole.add(first.name.text);
|
|
230
|
+
return { whole, named };
|
|
231
|
+
}
|
|
232
|
+
if (!ts.isObjectBindingPattern(first.name)) return { whole, named };
|
|
233
|
+
for (const element of first.name.elements) {
|
|
234
|
+
if (!ts.isIdentifier(element.name)) continue;
|
|
235
|
+
if (element.dotDotDotToken) whole.add(element.name.text);
|
|
236
|
+
else named.add(element.name.text);
|
|
237
|
+
}
|
|
238
|
+
return { whole, named };
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function isPhysicsChannel(name: string): name is PhysicsChannel {
|
|
242
|
+
return name === 'position' || name === 'rotation' || name === 'scale';
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/** The object literal a body hook's first argument evaluates to — the hook takes
|
|
246
|
+
* either `() => ({…})` or a bare `{…}`. */
|
|
247
|
+
function bodyArgumentObject(call: ts.CallExpression): ts.ObjectLiteralExpression | undefined {
|
|
248
|
+
const first = call.arguments[0];
|
|
249
|
+
if (!first) return undefined;
|
|
250
|
+
if (ts.isObjectLiteralExpression(first)) return first;
|
|
251
|
+
if (!ts.isArrowFunction(first) && !ts.isFunctionExpression(first)) return undefined;
|
|
252
|
+
const body = first.body;
|
|
253
|
+
if (ts.isParenthesizedExpression(body) && ts.isObjectLiteralExpression(body.expression)) {
|
|
254
|
+
return body.expression;
|
|
255
|
+
}
|
|
256
|
+
if (ts.isObjectLiteralExpression(body)) return body;
|
|
257
|
+
if (!ts.isBlock(body)) return undefined;
|
|
258
|
+
for (const statement of body.statements) {
|
|
259
|
+
if (
|
|
260
|
+
ts.isReturnStatement(statement) &&
|
|
261
|
+
statement.expression &&
|
|
262
|
+
ts.isObjectLiteralExpression(statement.expression)
|
|
263
|
+
) {
|
|
264
|
+
return statement.expression;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return undefined;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function isVec3Literal(expression: ts.Expression): boolean {
|
|
271
|
+
if (!ts.isArrayLiteralExpression(expression) || expression.elements.length !== 3) return false;
|
|
272
|
+
return expression.elements.every((element) => {
|
|
273
|
+
const inner = ts.isPrefixUnaryExpression(element) ? element.operand : element;
|
|
274
|
+
return ts.isNumericLiteral(inner);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** Does this expression read one of the enclosing component's own props? */
|
|
279
|
+
function readsProp(expression: ts.Expression, scope: PropScope, channel: PhysicsChannel): boolean {
|
|
280
|
+
if (ts.isIdentifier(expression)) return scope.named.has(expression.text);
|
|
281
|
+
return (
|
|
282
|
+
ts.isPropertyAccessExpression(expression) &&
|
|
283
|
+
ts.isIdentifier(expression.expression) &&
|
|
284
|
+
scope.whole.has(expression.expression.text) &&
|
|
285
|
+
expression.name.text === channel
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* How each channel's spawn is spelled in one hook argument.
|
|
291
|
+
*
|
|
292
|
+
* LAST WINS, the way an object literal actually evaluates: `{ position: […],
|
|
293
|
+
* ...props }` is placed by `props`, and `{ ...props, position: […] }` by the
|
|
294
|
+
* literal. Getting that backwards would name the wrong owner in a refusal.
|
|
295
|
+
*/
|
|
296
|
+
type ChannelOwner = 'forwarded' | 'literal' | 'expression';
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* What ONE property of a hook argument says about placement.
|
|
300
|
+
*
|
|
301
|
+
* A whole-props spread carries every placement prop the caller passed —
|
|
302
|
+
* `scale` deliberately NOT among them: no cannon body reads a scale, and
|
|
303
|
+
* `apply` composes with a fixed `(1,1,1)`, so claiming the caller's `scale`
|
|
304
|
+
* reaches the body would be the exact lie this module exists to stop.
|
|
305
|
+
*/
|
|
306
|
+
function propertyOwnership(
|
|
307
|
+
property: ts.ObjectLiteralElementLike,
|
|
308
|
+
scope: PropScope,
|
|
309
|
+
): ReadonlyArray<readonly [PhysicsChannel, ChannelOwner]> {
|
|
310
|
+
if (ts.isSpreadAssignment(property)) {
|
|
311
|
+
const spreadsProps =
|
|
312
|
+
ts.isIdentifier(property.expression) && scope.whole.has(property.expression.text);
|
|
313
|
+
return spreadsProps
|
|
314
|
+
? ([
|
|
315
|
+
['position', 'forwarded'],
|
|
316
|
+
['rotation', 'forwarded'],
|
|
317
|
+
] as const)
|
|
318
|
+
: [];
|
|
319
|
+
}
|
|
320
|
+
if (ts.isShorthandPropertyAssignment(property)) {
|
|
321
|
+
const name = property.name.text;
|
|
322
|
+
if (!isPhysicsChannel(name)) return [];
|
|
323
|
+
return [[name, scope.named.has(name) ? 'forwarded' : 'expression']];
|
|
324
|
+
}
|
|
325
|
+
if (!ts.isPropertyAssignment(property) || !ts.isIdentifier(property.name)) return [];
|
|
326
|
+
const name = property.name.text;
|
|
327
|
+
if (!isPhysicsChannel(name)) return [];
|
|
328
|
+
if (isVec3Literal(property.initializer)) return [[name, 'literal']];
|
|
329
|
+
return [[name, readsProp(property.initializer, scope, name) ? 'forwarded' : 'expression']];
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function channelOwnership(
|
|
333
|
+
literalObject: ts.ObjectLiteralExpression,
|
|
334
|
+
scope: PropScope,
|
|
335
|
+
): { forwarded: PhysicsChannel[]; literal: PhysicsChannel[] } {
|
|
336
|
+
const owner = new Map<PhysicsChannel, ChannelOwner>();
|
|
337
|
+
for (const property of literalObject.properties) {
|
|
338
|
+
for (const [channel, kind] of propertyOwnership(property, scope)) owner.set(channel, kind);
|
|
339
|
+
}
|
|
340
|
+
const pick = (kind: ChannelOwner): PhysicsChannel[] =>
|
|
341
|
+
[...owner.entries()].filter(([, value]) => value === kind).map(([channel]) => channel);
|
|
342
|
+
return { forwarded: pick('forwarded'), literal: pick('literal') };
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* The ref identifier a body hook binds — either the ref it was HANDED
|
|
347
|
+
* (`useBox(fn, ref)`, the forwardRef spelling) or the one it HANDS BACK
|
|
348
|
+
* (`const [ref] = useBox(fn)`, the plain spelling). Both occur in the vendored
|
|
349
|
+
* corpus and they are the same binding.
|
|
350
|
+
*/
|
|
351
|
+
/** The API identifier a body hook's tuple hands back (`const [, api] = useBox(…)`),
|
|
352
|
+
* or null when the call does not destructure one. */
|
|
353
|
+
function boundApiName(call: ts.CallExpression): string | null {
|
|
354
|
+
const declaration = call.parent;
|
|
355
|
+
if (!ts.isVariableDeclaration(declaration) || !ts.isArrayBindingPattern(declaration.name)) {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
const second = declaration.name.elements[1];
|
|
359
|
+
if (second && ts.isBindingElement(second) && ts.isIdentifier(second.name)) {
|
|
360
|
+
return second.name.text;
|
|
361
|
+
}
|
|
362
|
+
return null;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Channels `scope`'s own `useFrame` callbacks drive through `api` — the same
|
|
367
|
+
* regex-over-callback-text honesty budget `oid-transform.ts`'s
|
|
368
|
+
* `runtimeMotionRefs` holds to, and only INSIDE `useFrame`: a one-time
|
|
369
|
+
* `api.position.set` in an effect is a legitimate re-pose, while a per-frame
|
|
370
|
+
* one makes every authored spawn a dead value.
|
|
371
|
+
*/
|
|
372
|
+
function apiDrivenChannels(
|
|
373
|
+
scope: ts.Node | null,
|
|
374
|
+
sf: ts.SourceFile,
|
|
375
|
+
api: string,
|
|
376
|
+
): PhysicsChannel[] {
|
|
377
|
+
if (!scope) return [];
|
|
378
|
+
const found = new Set<PhysicsChannel>();
|
|
379
|
+
const re = new RegExp(
|
|
380
|
+
`\\b${api.replace(/[$]/g, '\\$&')}\\.(position|rotation|scale)\\.(?:set|copy)\\s*\\(`,
|
|
381
|
+
'g',
|
|
382
|
+
);
|
|
383
|
+
const visit = (node: ts.Node): void => {
|
|
384
|
+
if (ts.isCallExpression(node) && /(^|\.)useFrame$/.test(node.expression.getText(sf))) {
|
|
385
|
+
for (const match of node.getText(sf).matchAll(re)) {
|
|
386
|
+
found.add(match[1] as PhysicsChannel);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
ts.forEachChild(node, visit);
|
|
390
|
+
};
|
|
391
|
+
visit(scope);
|
|
392
|
+
return [...found];
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
function boundRefName(call: ts.CallExpression): string | null {
|
|
396
|
+
const declaration = call.parent;
|
|
397
|
+
if (ts.isVariableDeclaration(declaration) && ts.isArrayBindingPattern(declaration.name)) {
|
|
398
|
+
const first = declaration.name.elements[0];
|
|
399
|
+
if (first && ts.isBindingElement(first) && ts.isIdentifier(first.name)) return first.name.text;
|
|
400
|
+
}
|
|
401
|
+
const handed = call.arguments[1];
|
|
402
|
+
if (handed && ts.isIdentifier(handed)) return handed.text;
|
|
403
|
+
// `useBox(fn, useRef<Mesh>(null))` hands the hook a fresh ref and takes the
|
|
404
|
+
// same object back through the tuple, which the destructuring above already
|
|
405
|
+
// named. Anything else has no name this file can join a `ref={…}` against.
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Every JSX element in `sf` whose ref a physics body binds, mapped to the
|
|
411
|
+
* binding that owns its transform.
|
|
412
|
+
*
|
|
413
|
+
* Keyed by the OPENING element so both readers join on the same node: the
|
|
414
|
+
* component-contract analysis (which asks about a component's root) and the
|
|
415
|
+
* stamping transform (which asks about each element it stamps).
|
|
416
|
+
*/
|
|
417
|
+
export function physicsBindingsByElement(
|
|
418
|
+
sf: ts.SourceFile,
|
|
419
|
+
): Map<ts.JsxOpeningLikeElement, R3fPhysicsBinding> {
|
|
420
|
+
const hooks = bodyHookNames(sf);
|
|
421
|
+
const bindings = new Map<ts.JsxOpeningLikeElement, R3fPhysicsBinding>();
|
|
422
|
+
if (hooks.size === 0) return bindings;
|
|
423
|
+
|
|
424
|
+
/** scope → (ref name → binding). A ref is joined only INSIDE the scope that
|
|
425
|
+
* bound it: two components may each call their ref `ref`. */
|
|
426
|
+
const byScope = new Map<ts.Node | null, Map<string, R3fPhysicsBinding>>();
|
|
427
|
+
|
|
428
|
+
const record = (call: ts.CallExpression, hook: string): void => {
|
|
429
|
+
const refName = boundRefName(call);
|
|
430
|
+
if (!refName) return;
|
|
431
|
+
const scope = enclosingScope(call);
|
|
432
|
+
const argument = bodyArgumentObject(call);
|
|
433
|
+
const ownership = argument
|
|
434
|
+
? channelOwnership(argument, propScopeOf(scope?.parameters))
|
|
435
|
+
: { forwarded: [], literal: [] };
|
|
436
|
+
const { line } = sf.getLineAndCharacterOfPosition(call.getStart(sf));
|
|
437
|
+
const api = boundApiName(call);
|
|
438
|
+
const driven = api ? apiDrivenChannels(scope, sf, api) : [];
|
|
439
|
+
const scoped = byScope.get(scope) ?? new Map<string, R3fPhysicsBinding>();
|
|
440
|
+
scoped.set(refName, {
|
|
441
|
+
hook,
|
|
442
|
+
line: line + 1,
|
|
443
|
+
...ownership,
|
|
444
|
+
...(driven.length > 0 ? { apiDriven: driven } : {}),
|
|
445
|
+
});
|
|
446
|
+
byScope.set(scope, scoped);
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
const collect = (node: ts.Node): void => {
|
|
450
|
+
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {
|
|
451
|
+
const hook = hooks.get(node.expression.text);
|
|
452
|
+
if (hook) record(node, hook);
|
|
453
|
+
}
|
|
454
|
+
ts.forEachChild(node, collect);
|
|
455
|
+
};
|
|
456
|
+
collect(sf);
|
|
457
|
+
if (byScope.size === 0) return bindings;
|
|
458
|
+
|
|
459
|
+
/** Walk OUT through enclosing scopes: a ref bound in the component body is
|
|
460
|
+
* often used by JSX nested inside a callback (`.map(…)`), whose scope key is
|
|
461
|
+
* the callback rather than the component. */
|
|
462
|
+
const bindingFor = (node: ts.JsxOpeningLikeElement): R3fPhysicsBinding | undefined => {
|
|
463
|
+
const refName = refIdentifier(node);
|
|
464
|
+
if (!refName) return undefined;
|
|
465
|
+
let scope: ts.Node | null = enclosingScope(node);
|
|
466
|
+
for (;;) {
|
|
467
|
+
const binding = byScope.get(scope)?.get(refName);
|
|
468
|
+
if (binding) return binding;
|
|
469
|
+
if (scope === null) return undefined;
|
|
470
|
+
scope = enclosingScope(scope);
|
|
471
|
+
}
|
|
472
|
+
};
|
|
473
|
+
|
|
474
|
+
const join = (node: ts.Node): void => {
|
|
475
|
+
if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) {
|
|
476
|
+
const binding = bindingFor(node);
|
|
477
|
+
if (binding) bindings.set(node, binding);
|
|
478
|
+
}
|
|
479
|
+
ts.forEachChild(node, join);
|
|
480
|
+
};
|
|
481
|
+
join(sf);
|
|
482
|
+
return bindings;
|
|
483
|
+
}
|