@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,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `vgai-project-jsx-in-js` transform — JSX inside plain `.js` PROJECT
|
|
3
|
+
* files, the CRA-era React idiom most of the OSS React/R3F corpus ships.
|
|
4
|
+
*
|
|
5
|
+
* create-react-app's babel pipeline allowed JSX in `.js`; esbuild does not,
|
|
6
|
+
* so without this Vite's import-analysis refuses the whole game with
|
|
7
|
+
* "content contains invalid JS syntax … name the file .jsx". Renaming an
|
|
8
|
+
* ingested game's files is not an option (adapters never modify game
|
|
9
|
+
* source), so the host transforms instead.
|
|
10
|
+
*
|
|
11
|
+
* This is ONE of THREE places that must agree that a project `.js` file may
|
|
12
|
+
* contain JSX — fixing any one alone leaves the others red:
|
|
13
|
+
* 1. this plugin — Vite's transform lane (the module actually served);
|
|
14
|
+
* 2. `optimizeDeps.esbuildOptions.loader['.js'] = 'jsx'` in `server/dev.ts`
|
|
15
|
+
* — the dependency SCANNER is a second, independent esbuild pass over
|
|
16
|
+
* the same files;
|
|
17
|
+
* 3. `sourceLoader` in `server/project-validation.ts` — the
|
|
18
|
+
* validate-on-change parse mirrors what the dev server will serve, or a
|
|
19
|
+
* servable file reds `vgai status`.
|
|
20
|
+
*
|
|
21
|
+
* Scope is deliberately the SAME predicate the globals shadow uses
|
|
22
|
+
* (`shouldShadowGameGlobals`) — "is this a project-owned `/src/` module" is
|
|
23
|
+
* one question (see `vite-plugin-mount-isolation.ts` for why answering it
|
|
24
|
+
* twice differently is drift) — narrowed to `.js` outside `node_modules`, so
|
|
25
|
+
* the editor's and engine's own sources keep their untouched serve path. A
|
|
26
|
+
* `.js` module with no tag-start `<` is returned untouched (null), so plain-
|
|
27
|
+
* JS project files stay byte-identical; a rare heuristic false positive
|
|
28
|
+
* (`a<b`) still round-trips with identical semantics, because the `jsx`
|
|
29
|
+
* loader only parses JSX where `<` would otherwise be a syntax error.
|
|
30
|
+
*/
|
|
31
|
+
import { transform as esbuildTransform } from 'esbuild';
|
|
32
|
+
import type { Plugin } from 'vite';
|
|
33
|
+
import { shouldShadowGameGlobals } from './server/game-globals-shadow';
|
|
34
|
+
|
|
35
|
+
/** Cheap "could this contain JSX?" gate: `<` immediately followed by a tag
|
|
36
|
+
* start (`<Foo`, `<div`, `</`, `<>`). Plain-JS comparisons (`a < b`) don't
|
|
37
|
+
* match. */
|
|
38
|
+
const JSX_LIKELY = /<[A-Za-z/>]/;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* `getRoots` is a thunk for the same reason the game-globals plugin's is:
|
|
42
|
+
* `dev.ts` mutates its root set when a project opens after boot.
|
|
43
|
+
*/
|
|
44
|
+
export function projectJsxInJsPlugin(getRoots: () => Iterable<string>): Plugin {
|
|
45
|
+
return {
|
|
46
|
+
name: 'vgai-project-jsx-in-js',
|
|
47
|
+
// Ahead of the prelude/mount/creation-site transforms: they assume the
|
|
48
|
+
// module body is valid JS, which a JSX-bearing `.js` file is not yet.
|
|
49
|
+
enforce: 'pre',
|
|
50
|
+
async transform(code: string, id: string) {
|
|
51
|
+
const file = id.split('?')[0]!;
|
|
52
|
+
if (!file.endsWith('.js') || file.includes('/node_modules/')) return null;
|
|
53
|
+
if (!shouldShadowGameGlobals(file, getRoots())) return null;
|
|
54
|
+
if (!JSX_LIKELY.test(code)) return null;
|
|
55
|
+
const out = await esbuildTransform(code, {
|
|
56
|
+
loader: 'jsx',
|
|
57
|
+
jsx: 'automatic',
|
|
58
|
+
jsxDev: true,
|
|
59
|
+
sourcefile: file,
|
|
60
|
+
sourcemap: true,
|
|
61
|
+
});
|
|
62
|
+
return { code: out.code, map: out.map };
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vite-plugin-project-root-absolute-assets — S-9 (the SimCity ingest ledger).
|
|
3
|
+
*
|
|
4
|
+
* THE DEFECT. A foreign game mounted from its own folder is bundled by the
|
|
5
|
+
* EDITOR's Vite server, whose `root` is the engine checkout. So a root-absolute
|
|
6
|
+
* reference in the game's own source —
|
|
7
|
+
*
|
|
8
|
+
* import playIconUrl from '/icons/play-color.png'; // micropolisJS ui.js
|
|
9
|
+
* <img src="/icons/person.png"> // its index.html
|
|
10
|
+
*
|
|
11
|
+
* — resolved against the EDITOR's root and 404'd, taking the whole module graph
|
|
12
|
+
* down with it ("Failed to fetch dynamically imported module … ui.js"). Every
|
|
13
|
+
* ingested game whose author ever typed a leading slash needed a source patch
|
|
14
|
+
* to mount, which is precisely the zero-diff promise the ingest path exists to
|
|
15
|
+
* keep. SimCity's was two lines in `ui.js`, and it was the LAST diff.
|
|
16
|
+
*
|
|
17
|
+
* THE FIX, in one sentence: a root-absolute reference made BY PROJECT CODE
|
|
18
|
+
* resolves inside the PROJECT, against the same conventional public roots a
|
|
19
|
+
* project's own bundler would use.
|
|
20
|
+
*
|
|
21
|
+
* ATTRIBUTION is the whole design, because "project's assets win" and "don't
|
|
22
|
+
* break the editor's own root-absolute assets" are only compatible if we can
|
|
23
|
+
* tell whose request this is. Two seams, two mechanisms, both exact where they
|
|
24
|
+
* can be and conservative where they cannot:
|
|
25
|
+
*
|
|
26
|
+
* 1. MODULE GRAPH (`resolveId`) — `importer` says exactly who asked. A
|
|
27
|
+
* root-absolute specifier imported by a file inside the open project
|
|
28
|
+
* resolves into the project, always, ahead of Vite's own root-relative
|
|
29
|
+
* resolution (`enforce: 'pre'`). Editor modules are untouched: their
|
|
30
|
+
* importer is not under the project root.
|
|
31
|
+
*
|
|
32
|
+
* 2. RUNTIME URLS (middleware) — an `<img src="/icons/…">` or a CSS
|
|
33
|
+
* `url(/fonts/…)` carries no importer, only a `Referer`. A referer that is
|
|
34
|
+
* itself a project file (`/project-game-static/…`, `/@fs/<project>/…`) IS
|
|
35
|
+
* exact attribution and the project wins outright. The rest are
|
|
36
|
+
* UNATTRIBUTABLE by construction — an ingested game's DOM lives in the
|
|
37
|
+
* editor's own document, so its image requests refer the editor page — and
|
|
38
|
+
* those are decided by an explicit precedence rule instead:
|
|
39
|
+
* `THE EDITOR WINS IF IT ACTUALLY HAS THE FILE`, otherwise the project
|
|
40
|
+
* answers. That also removes a class of ingest-boot 404s (S-8).
|
|
41
|
+
*
|
|
42
|
+
* The precedence is computed, not positional, because POSITION DOES NOT
|
|
43
|
+
* WORK HERE and that is worth recording. The obvious design — a Vite POST
|
|
44
|
+
* hook, which runs after `serveStaticMiddleware` and before the 404, so a
|
|
45
|
+
* request only reaches us if nothing else answered — is defeated by this
|
|
46
|
+
* server's `appType: 'spa'`: `htmlFallbackMiddleware` sits BEFORE the post
|
|
47
|
+
* hooks and rewrites the URL of any extension-less-or-not request whose
|
|
48
|
+
* `Accept` contains `*/*` (every browser image request does) to
|
|
49
|
+
* `/index.html`. So the post hook never sees a miss, it sees the editor's
|
|
50
|
+
* page. Measured, not assumed: the first cut of this plugin served the
|
|
51
|
+
* EDITOR's own document from the game's `src/index.html` and the whole
|
|
52
|
+
* editor came up as a file download.
|
|
53
|
+
*
|
|
54
|
+
* WHY PROBE DIRECTORIES INSTEAD OF READING A DECLARED `publicDir`. The obvious
|
|
55
|
+
* alternative — load the project's own `vite.config.*` and read `root`/
|
|
56
|
+
* `publicDir` — executes arbitrary user config inside the editor server, and
|
|
57
|
+
* answers nothing for a game that does not use Vite at all (a webpack game, a
|
|
58
|
+
* plain static game, a folder of scripts). Probing is hermetic and general: we
|
|
59
|
+
* try each conventional public root in order and accept the first one that
|
|
60
|
+
* ACTUALLY CONTAINS the requested file. A wrong candidate therefore cannot
|
|
61
|
+
* produce a wrong answer — it simply does not match — which is what makes an
|
|
62
|
+
* ordered list of guesses safe rather than magic. (micropolisJS declares
|
|
63
|
+
* `root: './src'`, `publicDir: './public'`; `src/public` is the second
|
|
64
|
+
* candidate and the file is found there.)
|
|
65
|
+
*
|
|
66
|
+
* `getProjectRoot` is a THUNK for the same reason the sibling
|
|
67
|
+
* `vite-plugin-project-game-static.ts` uses one: `open-project` can switch the
|
|
68
|
+
* current project live, and every request/resolve must read the CURRENT root.
|
|
69
|
+
*
|
|
70
|
+
* `configureServer`-only, like that sibling: it answers for an OPENED
|
|
71
|
+
* project, which only a session has.
|
|
72
|
+
*/
|
|
73
|
+
import { existsSync, statSync } from 'node:fs';
|
|
74
|
+
import { readFile } from 'node:fs/promises';
|
|
75
|
+
import { extname, join, normalize, resolve, sep } from 'node:path';
|
|
76
|
+
import type { Plugin } from 'vite';
|
|
77
|
+
import { isPathInside } from './server/server-utils';
|
|
78
|
+
import { MIME } from './vite-plugin-game-static';
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Project-relative directories a root-absolute reference from project code may
|
|
82
|
+
* resolve into, MOST SPECIFIC FIRST. The first entry that actually contains the
|
|
83
|
+
* requested file wins (see the header: this is why an ordered guess list is
|
|
84
|
+
* safe). `public` and `static` are the near-universal public-asset conventions;
|
|
85
|
+
* `src/public` is the Vite `root: 'src'` + `publicDir: 'public'` layout
|
|
86
|
+
* micropolisJS uses; `src` and the project root itself come last and reproduce
|
|
87
|
+
* plain "root-absolute means relative to the bundler root" semantics for a
|
|
88
|
+
* project that keeps assets beside its source.
|
|
89
|
+
*/
|
|
90
|
+
export const PROJECT_ROOT_ABSOLUTE_DIRS: readonly string[] = [
|
|
91
|
+
'public',
|
|
92
|
+
'src/public',
|
|
93
|
+
'static',
|
|
94
|
+
'src',
|
|
95
|
+
'',
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Prefixes that are never a project asset reference, whatever asked for them:
|
|
100
|
+
* Vite's own module protocols and virtual ids, the editor's API surface, the
|
|
101
|
+
* verbatim project-file route (which already resolves into the project by its
|
|
102
|
+
* own rules), and node_modules (bare specifiers are Vite's job).
|
|
103
|
+
*/
|
|
104
|
+
const NEVER_PROJECT_PREFIXES = [
|
|
105
|
+
'/@',
|
|
106
|
+
'/__editor',
|
|
107
|
+
'/__vgai',
|
|
108
|
+
'/project-game-static',
|
|
109
|
+
'/game-static',
|
|
110
|
+
'/node_modules/',
|
|
111
|
+
];
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Is `id` a root-absolute reference this plugin may redirect at all? Rejects
|
|
115
|
+
* anything with a scheme, a protocol-relative URL, and the reserved prefixes
|
|
116
|
+
* above. Note `/` alone is rejected — that is the editor document, not an asset.
|
|
117
|
+
*/
|
|
118
|
+
export function isRedirectableRootAbsolute(id: string): boolean {
|
|
119
|
+
if (!id.startsWith('/')) return false;
|
|
120
|
+
if (id.startsWith('//')) return false; // protocol-relative
|
|
121
|
+
if (id === '/') return false;
|
|
122
|
+
return !NEVER_PROJECT_PREFIXES.some(
|
|
123
|
+
(p) => id === p || id.startsWith(`${p}/`) || id.startsWith(p),
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** Strip a query/hash suffix from a specifier or request URL. */
|
|
128
|
+
function bareId(id: string): string {
|
|
129
|
+
return id.split('?')[0]?.split('#')[0] ?? '';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Resolve the root-absolute reference `id` inside `projectRoot`, returning the
|
|
134
|
+
* absolute path of the first candidate directory that actually holds a FILE
|
|
135
|
+
* there — or `null` when no candidate does. `fileExists` is injected so the
|
|
136
|
+
* rule is unit-testable against a synthetic tree with no disk at all.
|
|
137
|
+
*/
|
|
138
|
+
export function resolveProjectRootAbsolute(
|
|
139
|
+
projectRoot: string,
|
|
140
|
+
id: string,
|
|
141
|
+
fileExists: (absPath: string) => boolean,
|
|
142
|
+
): string | null {
|
|
143
|
+
if (!isRedirectableRootAbsolute(id)) return null;
|
|
144
|
+
const rel = normalize(decodeURIComponentSafe(bareId(id).slice(1)));
|
|
145
|
+
// A root-absolute reference that climbs out of the directory it is resolved
|
|
146
|
+
// against is not a reference to a project asset under ANY candidate, so it is
|
|
147
|
+
// refused once here rather than being caught per-candidate by containment —
|
|
148
|
+
// otherwise `/../secret.env` merely lands one directory up, still inside the
|
|
149
|
+
// project, which is a traversal that happens to stay in bounds.
|
|
150
|
+
if (!rel || rel === '..' || rel.startsWith(`..${sep}`) || rel.startsWith('../')) return null;
|
|
151
|
+
for (const dir of PROJECT_ROOT_ABSOLUTE_DIRS) {
|
|
152
|
+
const candidate = normalize(join(resolve(projectRoot), dir, rel));
|
|
153
|
+
if (!isPathInside(projectRoot, candidate)) continue;
|
|
154
|
+
if (fileExists(candidate)) return candidate;
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function decodeURIComponentSafe(s: string): string {
|
|
160
|
+
try {
|
|
161
|
+
return decodeURIComponent(s);
|
|
162
|
+
} catch {
|
|
163
|
+
return s;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Is this request attributable to the open project by its `Referer` alone?
|
|
169
|
+
* True for a referer served out of the project's own files — the verbatim
|
|
170
|
+
* `/project-game-static/` route, or a `/@fs/<projectRoot>/…` module/stylesheet.
|
|
171
|
+
* A CSS `url(...)` inside the game's own stylesheet is the case this exists for.
|
|
172
|
+
*
|
|
173
|
+
* Deliberately NOT true for the editor document: the ingested game's DOM lives
|
|
174
|
+
* in the editor page, so its `<img>` requests refer the editor and are handled
|
|
175
|
+
* by the FALLBACK middleware instead (see the header) — attributable requests
|
|
176
|
+
* take precedence, unattributable ones only fill a hole.
|
|
177
|
+
*/
|
|
178
|
+
export function isProjectAttributedReferer(
|
|
179
|
+
referer: string | undefined,
|
|
180
|
+
projectRoot: string,
|
|
181
|
+
): boolean {
|
|
182
|
+
if (!referer) return false;
|
|
183
|
+
let path: string;
|
|
184
|
+
try {
|
|
185
|
+
path = new URL(referer, 'http://localhost').pathname;
|
|
186
|
+
} catch {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
if (path.startsWith('/project-game-static/')) return true;
|
|
190
|
+
const fsPrefix = '/@fs';
|
|
191
|
+
if (!path.startsWith(fsPrefix)) return false;
|
|
192
|
+
const filePath = decodeURIComponentSafe(path.slice(fsPrefix.length));
|
|
193
|
+
return isPathInside(projectRoot, filePath);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function isFile(absPath: string): boolean {
|
|
197
|
+
try {
|
|
198
|
+
return statSync(absPath).isFile();
|
|
199
|
+
} catch {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
interface MinimalReq {
|
|
205
|
+
url?: string | undefined;
|
|
206
|
+
headers?: Record<string, string | string[] | undefined> | undefined;
|
|
207
|
+
}
|
|
208
|
+
interface MinimalRes {
|
|
209
|
+
statusCode: number;
|
|
210
|
+
setHeader(key: string, value: string): void;
|
|
211
|
+
end(body?: unknown): void;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Is this request for an HTML DOCUMENT rather than an asset? Those never
|
|
216
|
+
* belong to this plugin, and one of them is load-bearing: Vite's
|
|
217
|
+
* `htmlFallbackMiddleware` runs BEFORE post hooks and rewrites `/` to
|
|
218
|
+
* `/index.html`, so without this guard the FALLBACK handler answers the
|
|
219
|
+
* editor's own page with the mounted game's `src/index.html` — the editor
|
|
220
|
+
* downloads instead of loading. (Caught live, not reasoned about; the whole
|
|
221
|
+
* editor came up as an `application/octet-stream` download.)
|
|
222
|
+
*
|
|
223
|
+
* A game reaches its own entry document through `/project-game-static/`, which
|
|
224
|
+
* this plugin never touches, so nothing legitimate is lost.
|
|
225
|
+
*/
|
|
226
|
+
export function isDocumentRequest(url: string): boolean {
|
|
227
|
+
const path = bareId(url).toLowerCase();
|
|
228
|
+
return path.endsWith('.html') || path.endsWith('.htm') || path.endsWith('/');
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** The request's `Referer`, normalized past node's `string | string[]` header type. */
|
|
232
|
+
function refererOf(req: MinimalReq): string | undefined {
|
|
233
|
+
const referer = req.headers?.['referer'];
|
|
234
|
+
return Array.isArray(referer) ? referer[0] : referer;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/** Serve `filePath` verbatim, mirroring the sibling static route's headers. */
|
|
238
|
+
async function sendFile(res: MinimalRes, filePath: string): Promise<boolean> {
|
|
239
|
+
try {
|
|
240
|
+
const buf = await readFile(filePath);
|
|
241
|
+
res.setHeader('Content-Type', MIME[extname(filePath)] ?? 'application/octet-stream');
|
|
242
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
243
|
+
res.statusCode = 200;
|
|
244
|
+
res.end(buf);
|
|
245
|
+
return true;
|
|
246
|
+
} catch {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** Where the EDITOR itself serves root-absolute paths from: its Vite
|
|
252
|
+
* `publicDir` then its `root`. Supplied by `configResolved`. */
|
|
253
|
+
export interface EditorServingDirs {
|
|
254
|
+
readonly publicDir: string | undefined;
|
|
255
|
+
readonly root: string;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Decide who answers a root-absolute request. Exported and pure (both existence
|
|
260
|
+
* probes are injected) because THIS is the contract — "project's assets win"
|
|
261
|
+
* and "the editor's own assets keep working" are one rule, not two middlewares
|
|
262
|
+
* in a lucky order.
|
|
263
|
+
*
|
|
264
|
+
* - not a redirectable asset path, or no project open → nobody, pass it on
|
|
265
|
+
* - referer is a project file → PROJECT (exact attribution, wins outright)
|
|
266
|
+
* - the editor actually has this file → EDITOR (pass it on untouched)
|
|
267
|
+
* - otherwise → PROJECT if it has the file, else nobody
|
|
268
|
+
*/
|
|
269
|
+
export function decideRootAbsoluteOwner(args: {
|
|
270
|
+
url: string;
|
|
271
|
+
referer: string | undefined;
|
|
272
|
+
projectRoot: string | undefined;
|
|
273
|
+
editorDirs: EditorServingDirs;
|
|
274
|
+
projectFile: (projectRoot: string, url: string) => string | null;
|
|
275
|
+
editorHasFile: (absPath: string) => boolean;
|
|
276
|
+
}): { owner: 'project'; filePath: string } | { owner: 'editor' | 'none' } {
|
|
277
|
+
const { url, referer, projectRoot, editorDirs } = args;
|
|
278
|
+
if (!projectRoot) return { owner: 'none' };
|
|
279
|
+
if (!isRedirectableRootAbsolute(url) || isDocumentRequest(url)) return { owner: 'none' };
|
|
280
|
+
const rel = bareId(url).slice(1);
|
|
281
|
+
const editorCandidates = [
|
|
282
|
+
...(editorDirs.publicDir ? [join(editorDirs.publicDir, rel)] : []),
|
|
283
|
+
join(editorDirs.root, rel),
|
|
284
|
+
];
|
|
285
|
+
// Packaged mode's Vite root IS the open project. Let that Vite instance
|
|
286
|
+
// transform its own modules instead of serving them verbatim merely because
|
|
287
|
+
// their Referer is another project module. External-project dev mode keeps
|
|
288
|
+
// the attributed-project precedence below because its Vite root differs.
|
|
289
|
+
if (
|
|
290
|
+
resolve(editorDirs.root) === resolve(projectRoot) &&
|
|
291
|
+
editorCandidates.some(args.editorHasFile)
|
|
292
|
+
) {
|
|
293
|
+
return { owner: 'editor' };
|
|
294
|
+
}
|
|
295
|
+
const attributed = isProjectAttributedReferer(referer, projectRoot);
|
|
296
|
+
if (!attributed) {
|
|
297
|
+
if (editorCandidates.some(args.editorHasFile)) return { owner: 'editor' };
|
|
298
|
+
}
|
|
299
|
+
const filePath = args.projectFile(projectRoot, url);
|
|
300
|
+
return filePath ? { owner: 'project', filePath } : { owner: 'none' };
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Build the request handler this plugin installs. Exported (rather than built
|
|
305
|
+
* inline in `configureServer`) so a unit test can drive it with a fake req/res.
|
|
306
|
+
*/
|
|
307
|
+
export function createProjectRootAbsoluteHandler(
|
|
308
|
+
getProjectRoot: () => string | undefined,
|
|
309
|
+
getEditorDirs: () => EditorServingDirs,
|
|
310
|
+
) {
|
|
311
|
+
return async (req: MinimalReq, res: MinimalRes, next: () => void): Promise<void> => {
|
|
312
|
+
const decision = decideRootAbsoluteOwner({
|
|
313
|
+
url: req.url ?? '',
|
|
314
|
+
referer: refererOf(req),
|
|
315
|
+
projectRoot: getProjectRoot(),
|
|
316
|
+
editorDirs: getEditorDirs(),
|
|
317
|
+
projectFile: (root, url) => resolveProjectRootAbsolute(root, url, isFile),
|
|
318
|
+
editorHasFile: isFile,
|
|
319
|
+
});
|
|
320
|
+
if (decision.owner !== 'project' || !(await sendFile(res, decision.filePath))) next();
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
export function projectRootAbsoluteAssetsPlugin(getProjectRoot: () => string | undefined): Plugin {
|
|
325
|
+
// Filled by `configResolved`; the handler reads it through a thunk so it is
|
|
326
|
+
// never captured before Vite has resolved the config.
|
|
327
|
+
let editorDirs: EditorServingDirs = { publicDir: undefined, root: process.cwd() };
|
|
328
|
+
const handler = createProjectRootAbsoluteHandler(getProjectRoot, () => editorDirs);
|
|
329
|
+
return {
|
|
330
|
+
name: 'vgai-project-root-absolute-assets',
|
|
331
|
+
// Ahead of `vite:resolve`, whose root-relative rule is the defect.
|
|
332
|
+
enforce: 'pre',
|
|
333
|
+
configResolved(config) {
|
|
334
|
+
editorDirs = {
|
|
335
|
+
publicDir: config.publicDir || undefined,
|
|
336
|
+
root: config.root,
|
|
337
|
+
};
|
|
338
|
+
},
|
|
339
|
+
resolveId(source, importer) {
|
|
340
|
+
const projectRoot = getProjectRoot();
|
|
341
|
+
if (!projectRoot || !importer) return null;
|
|
342
|
+
if (!isRedirectableRootAbsolute(source)) return null;
|
|
343
|
+
// ATTRIBUTION: only project code redirects. `importer` is an absolute fs
|
|
344
|
+
// path for a project module (Vite normalizes `/@fs/…` to it), so this is
|
|
345
|
+
// an exact test, not a heuristic.
|
|
346
|
+
if (!isPathInside(projectRoot, bareId(importer))) return null;
|
|
347
|
+
const resolved = resolveProjectRootAbsolute(projectRoot, source, (p) => existsSync(p));
|
|
348
|
+
return resolved ?? null;
|
|
349
|
+
},
|
|
350
|
+
configureServer(server) {
|
|
351
|
+
// PRE hook deliberately (see the header): a post hook never sees a miss
|
|
352
|
+
// on this `appType: 'spa'` server, because `htmlFallbackMiddleware`
|
|
353
|
+
// rewrites the URL to `/index.html` first. Precedence is therefore
|
|
354
|
+
// decided inside the handler, by `decideRootAbsoluteOwner`, rather than
|
|
355
|
+
// by where this middleware sits.
|
|
356
|
+
server.middlewares.use(handler);
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
}
|