@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,550 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE PROJECT'S SOURCE INDEX — what React/R3F components a project's own TSX
|
|
3
|
+
* declares, and which REGION each file belongs to.
|
|
4
|
+
*
|
|
5
|
+
* Split out of `project-content.ts` (2026-09-18, WORK.md §The open-source
|
|
6
|
+
* launch phase 1 unit 9) for the reason `canvas-board-actions.ts` already
|
|
7
|
+
* states about itself: keeping a subject separate from the estate it reads
|
|
8
|
+
* means opening the editor does not initialize that estate to answer a
|
|
9
|
+
* different question. The Content browser panel imports its SIBLING half for
|
|
10
|
+
* five presentation helpers, and that one import carried this half's
|
|
11
|
+
* TypeScript-AST work — `ui-source/oid-transform.ts` (1,811 lines), the five
|
|
12
|
+
* R3F prop-contract bindings, `ui-source/ts-ast.ts` and
|
|
13
|
+
* `ui-source/adapter-region-includes.ts`, EIGHT files — into every editor boot,
|
|
14
|
+
* a `models` build that indexes no R3F source included.
|
|
15
|
+
*
|
|
16
|
+
* Nothing in the eager shell calls anything here. Every caller is either a
|
|
17
|
+
* SCAN (`server/project-components.ts`, `server/routes/project-source.ts`,
|
|
18
|
+
* `api/assets.ts` and `browser-transpile.ts`, the last two already through
|
|
19
|
+
* `await import()`) or a story module reached after a project opens. The two
|
|
20
|
+
* halves still share the `ProjectComponentEntry` shape, which is a TYPE and
|
|
21
|
+
* costs no closure.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import ts from 'typescript';
|
|
25
|
+
import { MANIFEST_FILENAME } from '@volter/editor-project/manifest/filename';
|
|
26
|
+
import { resolveRelativeSpecifier } from '../resolve-relative-specifier';
|
|
27
|
+
import type { StorageBackend } from '../storage/types';
|
|
28
|
+
import {
|
|
29
|
+
ADAPTER_MODULE_FILENAME,
|
|
30
|
+
parseAdapterRegionIncludes,
|
|
31
|
+
} from '../ui-source/adapter-region-includes';
|
|
32
|
+
import type { ImportersOf, RegionBinding, RegionSurface } from '../ui-source/file-region-resolver';
|
|
33
|
+
import { resolveFileRegion } from '../ui-source/file-region-resolver';
|
|
34
|
+
import {
|
|
35
|
+
analyzeR3fComponentContracts,
|
|
36
|
+
builtinR3fContractsForSource,
|
|
37
|
+
} from '../ui-source/oid-transform';
|
|
38
|
+
import type { ProjectComponentEntry } from './project-content';
|
|
39
|
+
|
|
40
|
+
const PROJECT_SOURCE_EXTENSIONS = /\.(?:[cm]?[jt]sx)$/i;
|
|
41
|
+
const SKIPPED_SOURCE_DIRECTORIES = new Set([
|
|
42
|
+
'node_modules',
|
|
43
|
+
'dist',
|
|
44
|
+
'build',
|
|
45
|
+
'.git',
|
|
46
|
+
'.vgai',
|
|
47
|
+
'tools',
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
function hasModifier(statement: ts.Statement, kind: ts.SyntaxKind): boolean {
|
|
51
|
+
return Boolean(
|
|
52
|
+
ts.canHaveModifiers(statement) &&
|
|
53
|
+
ts.getModifiers(statement)?.some((modifier) => modifier.kind === kind),
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function declarationBindings(statement: ts.Statement): string[] {
|
|
58
|
+
if (ts.isFunctionDeclaration(statement) && statement.name) return [statement.name.text];
|
|
59
|
+
if (!ts.isVariableStatement(statement)) return [];
|
|
60
|
+
return statement.declarationList.declarations.flatMap((declaration) =>
|
|
61
|
+
ts.isIdentifier(declaration.name) ? [declaration.name.text] : [],
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function exportClauseBindings(statement: ts.Statement): string[] {
|
|
66
|
+
if (ts.isExportAssignment(statement) && ts.isIdentifier(statement.expression)) {
|
|
67
|
+
return [statement.expression.text];
|
|
68
|
+
}
|
|
69
|
+
if (!ts.isExportDeclaration(statement) || !statement.exportClause) return [];
|
|
70
|
+
if (!ts.isNamedExports(statement.exportClause)) return [];
|
|
71
|
+
return statement.exportClause.elements.map(
|
|
72
|
+
(element) => (element.propertyName ?? element.name).text,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function exportedBindings(sourceFile: ts.SourceFile): Set<string> {
|
|
77
|
+
return new Set(
|
|
78
|
+
sourceFile.statements.flatMap((statement) => [
|
|
79
|
+
...exportClauseBindings(statement),
|
|
80
|
+
...(hasModifier(statement, ts.SyntaxKind.ExportKeyword) ||
|
|
81
|
+
hasModifier(statement, ts.SyntaxKind.DefaultKeyword)
|
|
82
|
+
? declarationBindings(statement)
|
|
83
|
+
: []),
|
|
84
|
+
]),
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function defaultExportBindings(sourceFile: ts.SourceFile): Set<string> {
|
|
89
|
+
return new Set(
|
|
90
|
+
sourceFile.statements.flatMap((statement) =>
|
|
91
|
+
hasModifier(statement, ts.SyntaxKind.DefaultKeyword)
|
|
92
|
+
? declarationBindings(statement)
|
|
93
|
+
: ts.isExportAssignment(statement) && ts.isIdentifier(statement.expression)
|
|
94
|
+
? [statement.expression.text]
|
|
95
|
+
: [],
|
|
96
|
+
),
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
interface ComponentSourceInfo {
|
|
101
|
+
line: number;
|
|
102
|
+
body: ts.ConciseBody;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function componentSourceInfo(sourceFile: ts.SourceFile): Map<string, ComponentSourceInfo> {
|
|
106
|
+
const result = new Map<string, ComponentSourceInfo>();
|
|
107
|
+
for (const statement of sourceFile.statements) {
|
|
108
|
+
if (ts.isFunctionDeclaration(statement) && statement.name && statement.body) {
|
|
109
|
+
result.set(statement.name.text, {
|
|
110
|
+
line:
|
|
111
|
+
sourceFile.getLineAndCharacterOfPosition(statement.name.getStart(sourceFile)).line + 1,
|
|
112
|
+
body: statement.body,
|
|
113
|
+
});
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (!ts.isVariableStatement(statement)) continue;
|
|
117
|
+
for (const declaration of statement.declarationList.declarations) {
|
|
118
|
+
if (
|
|
119
|
+
!ts.isIdentifier(declaration.name) ||
|
|
120
|
+
!declaration.initializer ||
|
|
121
|
+
(!ts.isArrowFunction(declaration.initializer) &&
|
|
122
|
+
!ts.isFunctionExpression(declaration.initializer))
|
|
123
|
+
) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
result.set(declaration.name.text, {
|
|
127
|
+
line:
|
|
128
|
+
sourceFile.getLineAndCharacterOfPosition(declaration.name.getStart(sourceFile)).line + 1,
|
|
129
|
+
body: declaration.initializer.body,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function isInsideCollection(node: ts.Node): boolean {
|
|
137
|
+
let current: ts.Node | undefined = node.parent;
|
|
138
|
+
while (current && !ts.isStatement(current)) {
|
|
139
|
+
if (
|
|
140
|
+
ts.isCallExpression(current) &&
|
|
141
|
+
ts.isPropertyAccessExpression(current.expression) &&
|
|
142
|
+
(current.expression.name.text === 'map' || current.expression.name.text === 'flatMap')
|
|
143
|
+
) {
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
current = current.parent;
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function componentSourceUses(
|
|
152
|
+
sourceFile: ts.SourceFile,
|
|
153
|
+
): Map<string, { count: number; collection: boolean }> {
|
|
154
|
+
const result = new Map<string, { count: number; collection: boolean }>();
|
|
155
|
+
const visit = (node: ts.Node): void => {
|
|
156
|
+
if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) {
|
|
157
|
+
const name = node.tagName.getText();
|
|
158
|
+
if (/^[A-Z][A-Za-z0-9_$]*$/.test(name)) {
|
|
159
|
+
const previous = result.get(name) ?? { count: 0, collection: false };
|
|
160
|
+
result.set(name, {
|
|
161
|
+
count: previous.count + 1,
|
|
162
|
+
collection: previous.collection || isInsideCollection(node),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
ts.forEachChild(node, visit);
|
|
167
|
+
};
|
|
168
|
+
visit(sourceFile);
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Discover top-level visual React/R3F component definitions in one module.
|
|
173
|
+
* This is a source index, not prefab inference: Content joins these definitions
|
|
174
|
+
* to portable CSF and admits only components a story explicitly declares.
|
|
175
|
+
*
|
|
176
|
+
* `surface` is the file's REGION, resolved by the one shared resolver
|
|
177
|
+
* (`../ui-source/file-region-resolver.ts`) from the project's declarations and
|
|
178
|
+
* import reach — see {@link projectFileSurfaces}. It is a parameter and not
|
|
179
|
+
* something derived here, because a single file cannot see what reaches it: the
|
|
180
|
+
* `@react-three/fiber` / `@pixi/react` / DOM-tag scans that used to decide it
|
|
181
|
+
* grouped Content by whichever library a file happened to name, so a project
|
|
182
|
+
* that centralized its imports had its components filed under `unknown`.
|
|
183
|
+
* `'unknown'` now means exactly one thing — the resolver could not place this
|
|
184
|
+
* file — which is a real state Content can show rather than a guess it made. */
|
|
185
|
+
export function discoverComponentsInSource(
|
|
186
|
+
source: string,
|
|
187
|
+
path: string,
|
|
188
|
+
surface: RegionSurface | 'unknown' = 'unknown',
|
|
189
|
+
): ProjectComponentEntry[] {
|
|
190
|
+
const sourceFile = ts.createSourceFile(
|
|
191
|
+
path,
|
|
192
|
+
source,
|
|
193
|
+
ts.ScriptTarget.Latest,
|
|
194
|
+
true,
|
|
195
|
+
ts.ScriptKind.TSX,
|
|
196
|
+
);
|
|
197
|
+
const exported = exportedBindings(sourceFile);
|
|
198
|
+
const defaultExports = defaultExportBindings(sourceFile);
|
|
199
|
+
const contracts = [
|
|
200
|
+
...analyzeR3fComponentContracts(source, path, builtinR3fContractsForSource(source, path)),
|
|
201
|
+
];
|
|
202
|
+
const sourceInfo = componentSourceInfo(sourceFile);
|
|
203
|
+
const sourceUses = componentSourceUses(sourceFile);
|
|
204
|
+
return contracts
|
|
205
|
+
.filter(([name]) => sourceInfo.has(name))
|
|
206
|
+
.map(([name, contract]) => {
|
|
207
|
+
return {
|
|
208
|
+
name,
|
|
209
|
+
path,
|
|
210
|
+
line: sourceInfo.get(name)!.line,
|
|
211
|
+
exported: exported.has(name),
|
|
212
|
+
defaultExport: defaultExports.has(name),
|
|
213
|
+
declaredInRootEntry: false,
|
|
214
|
+
sourceUseCount: sourceUses.get(name)?.count ?? 0,
|
|
215
|
+
sourceCollectionUse: sourceUses.get(name)?.collection ?? false,
|
|
216
|
+
surface,
|
|
217
|
+
contentKind: contract.rootTag?.toLowerCase() === 'svg' ? 'image' : 'component',
|
|
218
|
+
contract,
|
|
219
|
+
};
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** One indexed source file, project-relative path plus its bytes. */
|
|
224
|
+
export interface IndexedProjectSource {
|
|
225
|
+
readonly path: string;
|
|
226
|
+
readonly source: string;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** A project's regions in the resolver's vocabulary, plus each one's entry. */
|
|
230
|
+
export interface ProjectRegionEntry extends RegionBinding {
|
|
231
|
+
/** Project-relative entry path, or `undefined` for an entry-less root. */
|
|
232
|
+
readonly entry?: string;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** Resolve a relative import specifier against the indexed file set. Extension
|
|
236
|
+
* and index resolution is a filesystem question and the resolver is pure, so
|
|
237
|
+
* it is answered here from a REAL index rather than by guessing an extension
|
|
238
|
+
* onto a path — the same shape `project-adapter.ts`'s `makeResolveModule` uses. */
|
|
239
|
+
function resolveRelativeImport(
|
|
240
|
+
specifier: string,
|
|
241
|
+
fromPath: string,
|
|
242
|
+
paths: ReadonlySet<string>,
|
|
243
|
+
): string | undefined {
|
|
244
|
+
return resolveRelativeSpecifier(specifier, fromPath, paths) ?? undefined;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/** Every project-local module `source` imports or re-exports from. */
|
|
248
|
+
function importedPaths(source: string, path: string, paths: ReadonlySet<string>): string[] {
|
|
249
|
+
const file = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
250
|
+
const out: string[] = [];
|
|
251
|
+
for (const statement of file.statements) {
|
|
252
|
+
const specifier =
|
|
253
|
+
(ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement)) &&
|
|
254
|
+
statement.moduleSpecifier &&
|
|
255
|
+
ts.isStringLiteralLike(statement.moduleSpecifier)
|
|
256
|
+
? statement.moduleSpecifier.text
|
|
257
|
+
: undefined;
|
|
258
|
+
if (specifier === undefined) continue;
|
|
259
|
+
const resolved = resolveRelativeImport(specifier, path, paths);
|
|
260
|
+
if (resolved !== undefined) out.push(resolved);
|
|
261
|
+
}
|
|
262
|
+
return out;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* The one region answer for every indexed file, through the shared resolver.
|
|
267
|
+
*
|
|
268
|
+
* Content has no live Vite module graph, so it builds the same seam from the
|
|
269
|
+
* sources it already read: the import edges are INVERTED into an `ImportersOf`
|
|
270
|
+
* and handed to `resolveFileRegion`, which then applies exactly the precedence
|
|
271
|
+
* every other site gets — a region's declared `include` glob, then a root
|
|
272
|
+
* entry, then reach. A file no region reaches stays `'unknown'`, which Content
|
|
273
|
+
* shows as its own state.
|
|
274
|
+
*/
|
|
275
|
+
export function projectFileSurfaces(
|
|
276
|
+
files: readonly IndexedProjectSource[],
|
|
277
|
+
regions: readonly ProjectRegionEntry[],
|
|
278
|
+
): Map<string, RegionSurface> {
|
|
279
|
+
const paths = new Set(files.map((file) => file.path));
|
|
280
|
+
const importers = new Map<string, Set<string>>();
|
|
281
|
+
for (const file of files) {
|
|
282
|
+
for (const imported of importedPaths(file.source, file.path, paths)) {
|
|
283
|
+
const bucket = importers.get(imported);
|
|
284
|
+
if (bucket) bucket.add(file.path);
|
|
285
|
+
else importers.set(imported, new Set([file.path]));
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
const importersOf: ImportersOf = (id) => importers.get(id);
|
|
289
|
+
const byEntry = new Map<string, RegionBinding>();
|
|
290
|
+
for (const region of regions) {
|
|
291
|
+
if (region.entry !== undefined) byEntry.set(region.entry.replace(/^\.\//, ''), region);
|
|
292
|
+
}
|
|
293
|
+
const surfaces = new Map<string, RegionSurface>();
|
|
294
|
+
for (const file of files) {
|
|
295
|
+
const answer = resolveFileRegion({
|
|
296
|
+
file: file.path,
|
|
297
|
+
projectRelative: file.path,
|
|
298
|
+
regions,
|
|
299
|
+
regionOfEntry: (candidate) => byEntry.get(candidate),
|
|
300
|
+
importersOf,
|
|
301
|
+
});
|
|
302
|
+
if (answer.surface !== undefined) surfaces.set(file.path, answer.surface);
|
|
303
|
+
}
|
|
304
|
+
return surfaces;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/** A root's `adapter` field reduced to a surface — the bare-string shorthand or
|
|
308
|
+
* the `{ module | ingest, surface }` object forms. Never throws on a malformed
|
|
309
|
+
* shape; the manifest loader is the validation authority. */
|
|
310
|
+
function rootSurface(adapter: unknown): RegionSurface | undefined {
|
|
311
|
+
const value =
|
|
312
|
+
typeof adapter === 'string' ? adapter : (adapter as { surface?: unknown } | null)?.surface;
|
|
313
|
+
return value === 'three' || value === 'canvas' || value === 'dom' ? value : undefined;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* A project's regions, PLUS what reading them lost.
|
|
318
|
+
*
|
|
319
|
+
* `unreadable` is carried rather than dropped because dropping it is the exact
|
|
320
|
+
* failure this whole rung retired: an adapter whose `regions` binding this
|
|
321
|
+
* reader cannot evaluate statically still has its `include` globs honored by
|
|
322
|
+
* the real loader (`project-adapter.ts`, which evaluates the module), so a
|
|
323
|
+
* silent "read fine" here would mean the two readers disagree with nobody told.
|
|
324
|
+
* Every caller reports it in whatever channel it owns.
|
|
325
|
+
*
|
|
326
|
+
* It is the REASON SENTENCE, not a bare flag, because the causes are genuinely
|
|
327
|
+
* different — an unreadable `regions` binding, an unreadable manifest, a failed
|
|
328
|
+
* read of either — and the warning that reaches a terminal has to name the one
|
|
329
|
+
* that happened rather than the one that is most common.
|
|
330
|
+
*/
|
|
331
|
+
export interface ProjectRegions {
|
|
332
|
+
readonly regions: readonly ProjectRegionEntry[];
|
|
333
|
+
/** `null` when nothing was lost; otherwise what was, in one sentence. */
|
|
334
|
+
readonly unreadable: string | null;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/** What an unreadable `regions` binding costs, and how to write one that reads. */
|
|
338
|
+
const UNREADABLE_ADAPTER_REGIONS =
|
|
339
|
+
`${ADAPTER_MODULE_FILENAME} declares a \`regions\` binding that cannot be read statically, so ` +
|
|
340
|
+
'any `include` globs in it were NOT consulted when grouping this project’s components — files ' +
|
|
341
|
+
'those globs claim will show their reach-derived surface, or `unknown`. Write the regions as an ' +
|
|
342
|
+
'array of object literals passed directly to defineAdapter({…}), with literal `id` and ' +
|
|
343
|
+
'`include` values.';
|
|
344
|
+
|
|
345
|
+
/** One sentence for a read that threw, naming the file and the failure. */
|
|
346
|
+
function readFailure(filename: string, error: unknown): string {
|
|
347
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
348
|
+
return (
|
|
349
|
+
`${filename} could not be read (${detail}), so this project's regions were resolved without ` +
|
|
350
|
+
'it. This is NOT the absent-file case — an absent file is a declaration, a failed read is a ' +
|
|
351
|
+
'gap — and the surfaces below may disagree with what the real loader computes.'
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* The project's regions as the resolver reads them: the manifest's roots joined
|
|
357
|
+
* to whatever `include` globs its `vgai.adapter.ts` declares for them.
|
|
358
|
+
*
|
|
359
|
+
* ABSENT AND UNREADABLE ARE DIFFERENT ANSWERS, and only the reader knows which
|
|
360
|
+
* one its backend just gave — Node rejects ENOENT, a `StorageBackend` rejects
|
|
361
|
+
* for a missing path too, and neither rejection distinguishes itself from a
|
|
362
|
+
* permissions error or a corrupt handle. So the callbacks say it in the return
|
|
363
|
+
* type: resolve `null` for "this file is not there" (a missing adapter is the
|
|
364
|
+
* DECLARED native default — pure reach — exactly as an absent
|
|
365
|
+
* `vgai.adapter.ts` means `nativeAdapter()`), and REJECT for a read that
|
|
366
|
+
* failed. A rejection used to be swallowed into the same empty string as an
|
|
367
|
+
* absent file, which reported the loss as a declaration.
|
|
368
|
+
*/
|
|
369
|
+
export async function projectRegionEntries(
|
|
370
|
+
readManifest: () => Promise<string | null>,
|
|
371
|
+
readAdapter: () => Promise<string | null>,
|
|
372
|
+
): Promise<ProjectRegions> {
|
|
373
|
+
let manifest: string | null;
|
|
374
|
+
try {
|
|
375
|
+
manifest = await readManifest();
|
|
376
|
+
} catch (error) {
|
|
377
|
+
return { regions: [], unreadable: readFailure(MANIFEST_FILENAME, error) };
|
|
378
|
+
}
|
|
379
|
+
if (manifest === null) {
|
|
380
|
+
return {
|
|
381
|
+
regions: [],
|
|
382
|
+
unreadable: `${MANIFEST_FILENAME} is absent, so this project declares no regions at all and every file falls to its reach-derived surface, or \`unknown\`.`,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
let adapter: string | null;
|
|
386
|
+
try {
|
|
387
|
+
adapter = await readAdapter();
|
|
388
|
+
} catch (error) {
|
|
389
|
+
// The manifest still yields the roots; only the `include` globs are lost.
|
|
390
|
+
return {
|
|
391
|
+
regions: projectRegionEntriesFromSources(manifest, '').regions,
|
|
392
|
+
unreadable: readFailure(ADAPTER_MODULE_FILENAME, error),
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
return projectRegionEntriesFromSources(manifest, adapter ?? '');
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* The SYNCHRONOUS half of {@link projectRegionEntries}, for readers that
|
|
400
|
+
* already hold both files' bytes — the project-side `check-idioms` scanner is
|
|
401
|
+
* one, and its R3F floor rule needs the region answer or it silently analyzes
|
|
402
|
+
* nothing. One implementation, two entry shapes; never two parsers.
|
|
403
|
+
*/
|
|
404
|
+
export function projectRegionEntriesFromSources(
|
|
405
|
+
manifestSource: string,
|
|
406
|
+
adapterSource: string,
|
|
407
|
+
): ProjectRegions {
|
|
408
|
+
let roots: Array<{ id?: unknown; entry?: unknown; adapter?: unknown }> = [];
|
|
409
|
+
try {
|
|
410
|
+
roots = (JSON.parse(manifestSource) as { roots?: typeof roots }).roots ?? [];
|
|
411
|
+
} catch (error) {
|
|
412
|
+
// A manifest whose bytes are here but do not parse is a LOSS, not a project
|
|
413
|
+
// that declares no regions — the loader reads the same file through the real
|
|
414
|
+
// schema and gets roots this index will not have.
|
|
415
|
+
return { regions: [], unreadable: readFailure(MANIFEST_FILENAME, error) };
|
|
416
|
+
}
|
|
417
|
+
const declared = parseAdapterRegionIncludes(adapterSource);
|
|
418
|
+
const includes = declared.byRegionId;
|
|
419
|
+
const regions = roots.flatMap((root) => {
|
|
420
|
+
const id = typeof root.id === 'string' ? root.id : undefined;
|
|
421
|
+
const surface = rootSurface(root.adapter);
|
|
422
|
+
if (id === undefined || surface === undefined) return [];
|
|
423
|
+
const include = includes.get(id);
|
|
424
|
+
const mounts = declared.mountsByRegionId.get(id);
|
|
425
|
+
return [
|
|
426
|
+
{
|
|
427
|
+
id,
|
|
428
|
+
surface,
|
|
429
|
+
...(typeof root.entry === 'string' ? { entry: root.entry } : {}),
|
|
430
|
+
...(include ? { include } : {}),
|
|
431
|
+
...(mounts?.length ? { mounts } : {}),
|
|
432
|
+
},
|
|
433
|
+
];
|
|
434
|
+
});
|
|
435
|
+
return { regions, unreadable: declared.unreadable ? UNREADABLE_ADAPTER_REGIONS : null };
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Say out loud what reading this project's regions lost, so the `include` globs
|
|
440
|
+
* the real loader WILL honor are not silently missing from this index.
|
|
441
|
+
*
|
|
442
|
+
* `console.warn` on purpose: it is the same instrument `reportOidSurfaceDiagnostics`
|
|
443
|
+
* already uses for the OID lane's own version of this message, so the dev
|
|
444
|
+
* server's terminal and the hosted editor's console both get it without a
|
|
445
|
+
* second channel. Warn-once per project AND reason — a component index rebuilds
|
|
446
|
+
* on every project change, so a per-rebuild repeat is noise, but a DIFFERENT
|
|
447
|
+
* loss on the same project is news and must not be swallowed by the first one.
|
|
448
|
+
*/
|
|
449
|
+
const reportedUnreadableRegions = new Set<string>();
|
|
450
|
+
export function reportUnreadableRegions(projectLabel: string, reason: string): void {
|
|
451
|
+
const key = `${projectLabel}\n${reason}`;
|
|
452
|
+
if (reportedUnreadableRegions.has(key)) return;
|
|
453
|
+
reportedUnreadableRegions.add(key);
|
|
454
|
+
// biome-ignore lint/suspicious/noConsole: this warning IS the function (see its docblock)
|
|
455
|
+
console.warn(`[project-content] ${projectLabel}: ${reason}`);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* The {@link projectRegionEntries} reader contract over a {@link StorageBackend}:
|
|
460
|
+
* ABSENT resolves `null`, every other failure rejects. `read` rejects for both,
|
|
461
|
+
* so `exists` is what separates them — the backend's own answer, not a guess
|
|
462
|
+
* from the error's shape.
|
|
463
|
+
*/
|
|
464
|
+
export async function readOptionalFromBackend(
|
|
465
|
+
backend: StorageBackend,
|
|
466
|
+
path: string,
|
|
467
|
+
): Promise<string | null> {
|
|
468
|
+
try {
|
|
469
|
+
return await backend.read(path);
|
|
470
|
+
} catch (error) {
|
|
471
|
+
if (await backend.exists(path)) throw error;
|
|
472
|
+
return null;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/** Browser-hosted equivalent of the server component index. */
|
|
477
|
+
export async function discoverProjectComponentsFromStorage(
|
|
478
|
+
backend: StorageBackend,
|
|
479
|
+
): Promise<ProjectComponentEntry[]> {
|
|
480
|
+
const pending = ['src'];
|
|
481
|
+
const files: string[] = [];
|
|
482
|
+
while (pending.length > 0 && files.length < 512) {
|
|
483
|
+
const directory = pending.shift()!;
|
|
484
|
+
const entries = await backend.list(directory).catch(() => []);
|
|
485
|
+
for (const entry of entries) {
|
|
486
|
+
if (entry.type === 'dir') {
|
|
487
|
+
if (!SKIPPED_SOURCE_DIRECTORIES.has(entry.name) && !entry.name.startsWith('.')) {
|
|
488
|
+
pending.push(entry.path);
|
|
489
|
+
}
|
|
490
|
+
} else if (PROJECT_SOURCE_EXTENSIONS.test(entry.path)) {
|
|
491
|
+
files.push(entry.path);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
const sources = (
|
|
496
|
+
await Promise.all(
|
|
497
|
+
files.map((path) =>
|
|
498
|
+
backend
|
|
499
|
+
.read(path)
|
|
500
|
+
.then((source): IndexedProjectSource[] => [{ path, source }])
|
|
501
|
+
.catch(() => []),
|
|
502
|
+
),
|
|
503
|
+
)
|
|
504
|
+
).flat();
|
|
505
|
+
const { regions, unreadable } = await projectRegionEntries(
|
|
506
|
+
() => readOptionalFromBackend(backend, MANIFEST_FILENAME),
|
|
507
|
+
() => readOptionalFromBackend(backend, ADAPTER_MODULE_FILENAME),
|
|
508
|
+
);
|
|
509
|
+
if (unreadable) reportUnreadableRegions(backend.id, unreadable);
|
|
510
|
+
const surfaces = projectFileSurfaces(sources, regions);
|
|
511
|
+
const discovered = sources.flatMap((file) =>
|
|
512
|
+
discoverComponentsInSource(file.source, file.path, surfaces.get(file.path) ?? 'unknown'),
|
|
513
|
+
);
|
|
514
|
+
const rootEntries = await projectRootEntries(() => backend.read(MANIFEST_FILENAME));
|
|
515
|
+
return omitRootDocumentComponents(discovered, rootEntries).sort(compareProjectComponents);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
export async function projectRootEntries(
|
|
519
|
+
readManifest: () => Promise<string>,
|
|
520
|
+
): Promise<Set<string>> {
|
|
521
|
+
try {
|
|
522
|
+
const parsed = JSON.parse(await readManifest()) as { roots?: Array<{ entry?: unknown }> };
|
|
523
|
+
return new Set(
|
|
524
|
+
(parsed.roots ?? []).flatMap((root) =>
|
|
525
|
+
typeof root.entry === 'string' ? [root.entry.replace(/^\.\//, '')] : [],
|
|
526
|
+
),
|
|
527
|
+
);
|
|
528
|
+
} catch {
|
|
529
|
+
return new Set();
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
export function omitRootDocumentComponents(
|
|
534
|
+
components: readonly ProjectComponentEntry[],
|
|
535
|
+
rootEntries: ReadonlySet<string>,
|
|
536
|
+
): ProjectComponentEntry[] {
|
|
537
|
+
return components.flatMap((component) => {
|
|
538
|
+
const declaredInRootEntry = rootEntries.has(component.path.replace(/^\.\//, ''));
|
|
539
|
+
if (component.defaultExport && declaredInRootEntry) return [];
|
|
540
|
+
return [{ ...component, declaredInRootEntry }];
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
export function compareProjectComponents(
|
|
545
|
+
left: ProjectComponentEntry,
|
|
546
|
+
right: ProjectComponentEntry,
|
|
547
|
+
): number {
|
|
548
|
+
if (left.exported !== right.exported) return left.exported ? -1 : 1;
|
|
549
|
+
return left.name.localeCompare(right.name) || left.path.localeCompare(right.path);
|
|
550
|
+
}
|