@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,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE MECHANICAL TypeScript-AST HELPERS every `ui-source/` reader repeats.
|
|
3
|
+
*
|
|
4
|
+
* Not an abstraction over the TypeScript compiler API — each function here
|
|
5
|
+
* hands back the compiler's OWN node and gets out of the way, and every caller
|
|
6
|
+
* keeps programming against `ts.*`. What they remove is the retyping: the
|
|
7
|
+
* eleven modules in this directory that read a TSX module each spelled the same
|
|
8
|
+
* four or five little walks out again, and the copies had begun to disagree
|
|
9
|
+
* about things that matter.
|
|
10
|
+
*
|
|
11
|
+
* What "matters" means, concretely — this is the drift these functions existed
|
|
12
|
+
* in nine, three, three, two and two copies of, and what each copy got wrong:
|
|
13
|
+
*
|
|
14
|
+
* - {@link parseAuthoringTsx}: `ts.createSourceFile(file, code,
|
|
15
|
+
* ScriptTarget.Latest, true, ScriptKind.TSX)` appeared at NINE sites, two of
|
|
16
|
+
* them already wrapped in a local `parseTsx`/`sourceFile` whose only
|
|
17
|
+
* difference was argument order. Both of the last two arguments are silent
|
|
18
|
+
* if wrong: `setParentNodes: false` leaves `node.parent` undefined, which
|
|
19
|
+
* breaks every upward walk here (including {@link enclosingScope}) at
|
|
20
|
+
* runtime rather than at compile time, and a missing `ScriptKind.TSX`
|
|
21
|
+
* parses JSX as type assertions.
|
|
22
|
+
* - {@link hasModifier}: two copies, ALREADY drifted —
|
|
23
|
+
* `plan-fork-component.ts`'s guarded with `ts.canHaveModifiers` and
|
|
24
|
+
* `r3f-project-contracts.ts`'s cast the node to `ts.HasModifiers` and hoped.
|
|
25
|
+
* The guarded form is the one kept.
|
|
26
|
+
* - {@link enclosingScope}: three copies of one loop, returning
|
|
27
|
+
* `FunctionLikeDeclaration` in two and `SignatureDeclaration` in the third
|
|
28
|
+
* for the same four node kinds.
|
|
29
|
+
* - {@link numericLiteral}: three copies (`numeric`, `numericLiteral`) of the
|
|
30
|
+
* unary-sign rule — the part a fourth author would plausibly write without,
|
|
31
|
+
* silently losing every negative literal.
|
|
32
|
+
* - {@link jsxAttribute} / {@link refIdentifier}: two and three copies of
|
|
33
|
+
* "find this attribute", one of the `refIdentifier`s returning `undefined`
|
|
34
|
+
* where the others return `null`.
|
|
35
|
+
*
|
|
36
|
+
* Deliberately NOT here: anything whose two versions differ for a caller's own
|
|
37
|
+
* reason. `plan-fork-component.ts`'s `jsxAtOffset` and `reparent-guard.ts`'s
|
|
38
|
+
* `jsxElementAt` look like twins and are not — one wants the OPENING element to
|
|
39
|
+
* read its tag, the other wants the whole `ts.JsxElement` to move it, and the
|
|
40
|
+
* second prunes the walk by span while the first does not.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import * as ts from 'typescript';
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Parse one authored TSX/TS module the way every reader in this directory
|
|
47
|
+
* needs it: newest syntax, parent pointers set, JSX enabled.
|
|
48
|
+
*
|
|
49
|
+
* `file` is the module's path — it is what the compiler reports in positions
|
|
50
|
+
* and what `node.getText(sf)` reads against, so pass the real one where there
|
|
51
|
+
* is one.
|
|
52
|
+
*/
|
|
53
|
+
/**
|
|
54
|
+
* ONE parse per (file, bytes) — the same source is parsed several times over
|
|
55
|
+
* for one bundle otherwise.
|
|
56
|
+
*
|
|
57
|
+
* `ProjectContractResolver` calls this three times for a single file
|
|
58
|
+
* (`importedForSource`, `typeAliasesForSource`, `propSpecsForSource`), the
|
|
59
|
+
* stamping transform parses it again, and every one of those runs on EVERY
|
|
60
|
+
* structural edit.
|
|
61
|
+
* Measured on `examples/third-person`, the contract walk alone costs 380ms of
|
|
62
|
+
* the ~1.1s an edit spends on CPU.
|
|
63
|
+
*
|
|
64
|
+
* Keyed on the BYTES, so it is sound in a way an analysis cache is not: a
|
|
65
|
+
* parse is a pure function of its input, while what a file MEANS also depends
|
|
66
|
+
* on the files it imports. Edited bytes miss the cache and re-parse; the entry
|
|
67
|
+
* for the old bytes is dropped, so the map holds one node tree per live file
|
|
68
|
+
* rather than one per revision.
|
|
69
|
+
*/
|
|
70
|
+
const parsedByFile = new Map<
|
|
71
|
+
string,
|
|
72
|
+
{ readonly code: string; readonly sourceFile: ts.SourceFile }
|
|
73
|
+
>();
|
|
74
|
+
|
|
75
|
+
export function parseAuthoringTsx(file: string, code: string): ts.SourceFile {
|
|
76
|
+
const cached = parsedByFile.get(file);
|
|
77
|
+
if (cached && cached.code === code) return cached.sourceFile;
|
|
78
|
+
const sourceFile = ts.createSourceFile(
|
|
79
|
+
file,
|
|
80
|
+
code,
|
|
81
|
+
ts.ScriptTarget.Latest,
|
|
82
|
+
/* setParentNodes */ true,
|
|
83
|
+
ts.ScriptKind.TSX,
|
|
84
|
+
);
|
|
85
|
+
parsedByFile.set(file, { code, sourceFile });
|
|
86
|
+
return sourceFile;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Drop every cached parse — for a project switch, where the next project's
|
|
90
|
+
* files may reuse these paths with different bytes. Bytes are compared on
|
|
91
|
+
* every hit anyway, so this is hygiene against unbounded growth, not
|
|
92
|
+
* correctness. */
|
|
93
|
+
export function clearAuthoringParseCache(): void {
|
|
94
|
+
parsedByFile.clear();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Whether `node` carries a given modifier (`export`, `default`, …). False for
|
|
98
|
+
* a node kind that cannot carry modifiers at all, rather than throwing. */
|
|
99
|
+
export function hasModifier(node: ts.Node, kind: ts.SyntaxKind): boolean {
|
|
100
|
+
if (!ts.canHaveModifiers(node)) return false;
|
|
101
|
+
return (ts.getModifiers(node) ?? []).some((modifier) => modifier.kind === kind);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The nearest function-like ancestor of `node` — the scope a hook call, a ref
|
|
106
|
+
* declaration or a JSX element belongs to.
|
|
107
|
+
*
|
|
108
|
+
* Requires parent pointers, so the source must come from
|
|
109
|
+
* {@link parseAuthoringTsx} (or another parse that set them).
|
|
110
|
+
*/
|
|
111
|
+
export function enclosingScope(node: ts.Node): ts.FunctionLikeDeclaration | null {
|
|
112
|
+
let current: ts.Node | undefined = node.parent;
|
|
113
|
+
while (current) {
|
|
114
|
+
if (
|
|
115
|
+
ts.isArrowFunction(current) ||
|
|
116
|
+
ts.isFunctionExpression(current) ||
|
|
117
|
+
ts.isFunctionDeclaration(current) ||
|
|
118
|
+
ts.isMethodDeclaration(current)
|
|
119
|
+
) {
|
|
120
|
+
return current;
|
|
121
|
+
}
|
|
122
|
+
current = current.parent;
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* The number an expression literally IS, or `undefined` when it is anything
|
|
129
|
+
* computed. A leading `-`/`+` counts: `position={[-1, 0, 2]}` is authored
|
|
130
|
+
* constantly and its first entry is a `PrefixUnaryExpression`, not a numeric
|
|
131
|
+
* literal.
|
|
132
|
+
*/
|
|
133
|
+
export function numericLiteral(expression: ts.Expression): number | undefined {
|
|
134
|
+
if (ts.isNumericLiteral(expression)) return Number(expression.text);
|
|
135
|
+
if (
|
|
136
|
+
ts.isPrefixUnaryExpression(expression) &&
|
|
137
|
+
(expression.operator === ts.SyntaxKind.MinusToken ||
|
|
138
|
+
expression.operator === ts.SyntaxKind.PlusToken) &&
|
|
139
|
+
ts.isNumericLiteral(expression.operand)
|
|
140
|
+
) {
|
|
141
|
+
const value = Number(expression.operand.text);
|
|
142
|
+
return expression.operator === ts.SyntaxKind.MinusToken ? -value : value;
|
|
143
|
+
}
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** The named attribute on a JSX opening element, or `undefined`. Spread
|
|
148
|
+
* attributes are not attributes and are skipped. */
|
|
149
|
+
export function jsxAttribute(
|
|
150
|
+
element: ts.JsxOpeningLikeElement,
|
|
151
|
+
name: string,
|
|
152
|
+
): ts.JsxAttribute | undefined {
|
|
153
|
+
return element.attributes.properties.find(
|
|
154
|
+
(candidate): candidate is ts.JsxAttribute =>
|
|
155
|
+
ts.isJsxAttribute(candidate) && candidate.name.getText() === name,
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* The identifier a `ref={x}` attribute binds on this element, or `null`.
|
|
161
|
+
*
|
|
162
|
+
* `null` for both "no `ref`" and "a `ref` bound to something that is not a bare
|
|
163
|
+
* identifier" (`ref={(n) => …}`, `ref={refs[i]}`): every caller is matching the
|
|
164
|
+
* ref against a `useRef` declaration by NAME, and neither case has one.
|
|
165
|
+
*/
|
|
166
|
+
export function refIdentifier(element: ts.JsxOpeningLikeElement): string | null {
|
|
167
|
+
const ref = jsxAttribute(element, 'ref');
|
|
168
|
+
const initializer = ref?.initializer;
|
|
169
|
+
if (!initializer || !ts.isJsxExpression(initializer) || !initializer.expression) return null;
|
|
170
|
+
return ts.isIdentifier(initializer.expression) ? initializer.expression.text : null;
|
|
171
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Does THIS project interpret utility classes?" — the evidence gate in front of
|
|
3
|
+
* `writeStyleAuto`'s className route.
|
|
4
|
+
*
|
|
5
|
+
* Why it exists: the router used to pick the Tailwind arbitrary-value class
|
|
6
|
+
* (`bg-[#059669]`) whenever an element merely HAD a literal `className`, with no
|
|
7
|
+
* evidence anything would ever compile that class. On a plain-CSS project the
|
|
8
|
+
* write lands in source and paints NOTHING — measured on the vendored pmndrs
|
|
9
|
+
* racing-game (plain Vite + `src/styles.css`, no tailwind in its tree or ours):
|
|
10
|
+
* the editor's visible result was only the adapter's optimistic inline patch, a
|
|
11
|
+
* cold remount rendered `rgba(0, 0, 0, 0)`, and the game's own build has no
|
|
12
|
+
* transformer for it either. Inert bytes in someone's source that tell a lie
|
|
13
|
+
* about their game.
|
|
14
|
+
*
|
|
15
|
+
* The fix is the same observation-over-inference rule the OID dialect decision
|
|
16
|
+
* follows: route on what was OBSERVED about the project, not on what the
|
|
17
|
+
* element's shape suggests. A tier gathers evidence with whatever I/O it has
|
|
18
|
+
* (`node:fs` on the dev server, `StorageBackend` in the hosted browser) and
|
|
19
|
+
* hands the bytes here; the decision itself is pure and lives ONLY here, so the
|
|
20
|
+
* two tiers cannot drift into different answers.
|
|
21
|
+
*
|
|
22
|
+
* **The probe is deliberately strict, and the asymmetry is why.** A false
|
|
23
|
+
* NEGATIVE costs an inline `style={{…}}` write — a less idiomatic expression of
|
|
24
|
+
* the same edit that paints correctly in every project, in and out of the
|
|
25
|
+
* editor. A false POSITIVE costs a write that is a lie. So "a dependency is
|
|
26
|
+
* listed" is not enough on its own: something must also show the pipeline is
|
|
27
|
+
* actually wired (a config file, a postcss/vite/astro plugin mention, or a css
|
|
28
|
+
* entry that imports the framework). A CDN/runtime interpreter in HTML stands
|
|
29
|
+
* alone because it needs no build step at all.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/** The routing answer, plus what was actually observed to produce it. */
|
|
33
|
+
export interface UtilityClassSupport {
|
|
34
|
+
/** True only when the project was OBSERVED to interpret utility classes. */
|
|
35
|
+
readonly supported: boolean;
|
|
36
|
+
/** What was (or was not) found — quoted verbatim in a refusal message. */
|
|
37
|
+
readonly evidence: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The answer when nothing was probed at all. It is `supported: false` because
|
|
42
|
+
* an unprobed project is an unproven one, and the honest route for an unproven
|
|
43
|
+
* project is the inline style that works everywhere.
|
|
44
|
+
*/
|
|
45
|
+
export const UTILITY_CLASSES_UNPROVEN: UtilityClassSupport = {
|
|
46
|
+
supported: false,
|
|
47
|
+
evidence: 'no utility-class pipeline was probed for this project',
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Root-relative files a tier should read when it can. Config files are listed
|
|
52
|
+
* by exact name (a probe should not have to guess extensions); the css/html
|
|
53
|
+
* evidence is found by extension instead — see {@link isUtilityClassEvidenceFile}.
|
|
54
|
+
*/
|
|
55
|
+
export const UTILITY_CLASS_EVIDENCE_FILES: readonly string[] = [
|
|
56
|
+
'package.json',
|
|
57
|
+
'tailwind.config.js',
|
|
58
|
+
'tailwind.config.cjs',
|
|
59
|
+
'tailwind.config.mjs',
|
|
60
|
+
'tailwind.config.ts',
|
|
61
|
+
'uno.config.js',
|
|
62
|
+
'uno.config.ts',
|
|
63
|
+
'unocss.config.js',
|
|
64
|
+
'unocss.config.ts',
|
|
65
|
+
'postcss.config.js',
|
|
66
|
+
'postcss.config.cjs',
|
|
67
|
+
'postcss.config.mjs',
|
|
68
|
+
'postcss.config.ts',
|
|
69
|
+
'vite.config.js',
|
|
70
|
+
'vite.config.ts',
|
|
71
|
+
'astro.config.mjs',
|
|
72
|
+
'astro.config.ts',
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
/** Extensions worth scanning for a framework entry marker (`@tailwind`, a CDN script). */
|
|
76
|
+
export const UTILITY_CLASS_EVIDENCE_EXTENSIONS: readonly string[] = ['.css', '.html'];
|
|
77
|
+
|
|
78
|
+
/** True when `path`'s content can carry evidence — the filter a directory walk uses. */
|
|
79
|
+
export function isUtilityClassEvidenceFile(path: string): boolean {
|
|
80
|
+
const name = path.slice(path.lastIndexOf('/') + 1);
|
|
81
|
+
if (UTILITY_CLASS_EVIDENCE_FILES.includes(name)) return true;
|
|
82
|
+
return UTILITY_CLASS_EVIDENCE_EXTENSIONS.some((ext) => name.endsWith(ext));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Package names whose presence means a utility-class compiler is a dependency. */
|
|
86
|
+
const UTILITY_PACKAGE_PREFIXES: readonly string[] = [
|
|
87
|
+
'tailwindcss',
|
|
88
|
+
'@tailwindcss/',
|
|
89
|
+
'unocss',
|
|
90
|
+
'@unocss/',
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
const CONFIG_FILE_RE = /(^|\/)(tailwind|uno|unocss)\.config\.[cm]?[jt]s$/;
|
|
94
|
+
const PLUGIN_HOST_RE = /(^|\/)(postcss|vite|astro)\.config\.[cm]?[jt]s$/;
|
|
95
|
+
const PLUGIN_MENTION_RE = /tailwindcss|unocss/;
|
|
96
|
+
/** Tailwind v3 directives, the v4 css import, `@apply`, and UnoCSS's own entry. */
|
|
97
|
+
const CSS_ENTRY_RE =
|
|
98
|
+
/@tailwind\s+(base|components|utilities|variants)|@import\s+['"](tailwindcss|unocss)|@apply\s|@unocss\b/;
|
|
99
|
+
/** Interpreters that need no build step — the class is compiled in the page itself. */
|
|
100
|
+
const RUNTIME_RE = /cdn\.tailwindcss\.com|@unocss\/runtime|unocss\/runtime/;
|
|
101
|
+
|
|
102
|
+
function dependencyNames(packageJson: string): readonly string[] {
|
|
103
|
+
let parsed: unknown;
|
|
104
|
+
try {
|
|
105
|
+
parsed = JSON.parse(packageJson);
|
|
106
|
+
} catch {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
if (!parsed || typeof parsed !== 'object') return [];
|
|
110
|
+
const names: string[] = [];
|
|
111
|
+
for (const [key, value] of Object.entries(parsed as Record<string, unknown>)) {
|
|
112
|
+
if (!/dependencies$/i.test(key) || !value || typeof value !== 'object') continue;
|
|
113
|
+
names.push(...Object.keys(value as Record<string, unknown>));
|
|
114
|
+
}
|
|
115
|
+
return names;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Decide from gathered evidence. `files` maps a root-relative path to that
|
|
120
|
+
* file's text; a tier includes whatever it could read and omits the rest
|
|
121
|
+
* (absence is simply less evidence, never an error).
|
|
122
|
+
*/
|
|
123
|
+
export function detectUtilityClassSupport(files: ReadonlyMap<string, string>): UtilityClassSupport {
|
|
124
|
+
let dependency: string | null = null;
|
|
125
|
+
let config: string | null = null;
|
|
126
|
+
let plugin: string | null = null;
|
|
127
|
+
let cssEntry: string | null = null;
|
|
128
|
+
let runtime: string | null = null;
|
|
129
|
+
|
|
130
|
+
for (const [path, content] of files) {
|
|
131
|
+
const name = path.slice(path.lastIndexOf('/') + 1);
|
|
132
|
+
if (name === 'package.json') {
|
|
133
|
+
const hit = dependencyNames(content).find((dep) =>
|
|
134
|
+
UTILITY_PACKAGE_PREFIXES.some((prefix) =>
|
|
135
|
+
prefix.endsWith('/') ? dep.startsWith(prefix) : dep === prefix,
|
|
136
|
+
),
|
|
137
|
+
);
|
|
138
|
+
if (hit) dependency ??= `"${hit}" in ${path}`;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (CONFIG_FILE_RE.test(path)) {
|
|
142
|
+
config ??= path;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (PLUGIN_HOST_RE.test(path) && PLUGIN_MENTION_RE.test(content)) {
|
|
146
|
+
plugin ??= path;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (name.endsWith('.css') && CSS_ENTRY_RE.test(content)) {
|
|
150
|
+
cssEntry ??= path;
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (name.endsWith('.html') && RUNTIME_RE.test(content)) runtime ??= path;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (runtime) {
|
|
157
|
+
return { supported: true, evidence: `a utility-class runtime is loaded by ${runtime}` };
|
|
158
|
+
}
|
|
159
|
+
const wiring = config ?? plugin ?? cssEntry;
|
|
160
|
+
if (dependency && wiring) {
|
|
161
|
+
return { supported: true, evidence: `${dependency}, wired by ${wiring}` };
|
|
162
|
+
}
|
|
163
|
+
const partial = dependency
|
|
164
|
+
? `${dependency} is declared but nothing wires it (no tailwind/uno config, no postcss/vite/astro plugin, no css entry)`
|
|
165
|
+
: wiring
|
|
166
|
+
? `${wiring} mentions one but no tailwind/uno dependency is declared`
|
|
167
|
+
: 'no tailwind/uno dependency, config, css entry or CDN runtime';
|
|
168
|
+
return { supported: false, evidence: `${partial} — utility classes are not compiled here` };
|
|
169
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Surgical native TypeScript edit for “Apply to Component”. The selected
|
|
3
|
+
* instance supplies a literal value; the OID index supplies the component
|
|
4
|
+
* declaration name. Only an existing literal destructuring default is
|
|
5
|
+
* writable — computed defaults are source-owned logic and are refused.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import ts from 'typescript';
|
|
9
|
+
import { parseAuthoringTsx } from './ts-ast';
|
|
10
|
+
|
|
11
|
+
export interface ComponentDefaultEditResult {
|
|
12
|
+
readonly code: string;
|
|
13
|
+
readonly changed: boolean;
|
|
14
|
+
readonly dynamic: boolean;
|
|
15
|
+
readonly error?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function componentParameter(node: ts.Node, componentName: string): ts.ParameterDeclaration | null {
|
|
19
|
+
if (ts.isFunctionDeclaration(node) && node.name?.text === componentName) {
|
|
20
|
+
return node.parameters[0] ?? null;
|
|
21
|
+
}
|
|
22
|
+
if (
|
|
23
|
+
ts.isVariableDeclaration(node) &&
|
|
24
|
+
ts.isIdentifier(node.name) &&
|
|
25
|
+
node.name.text === componentName &&
|
|
26
|
+
node.initializer &&
|
|
27
|
+
(ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer))
|
|
28
|
+
) {
|
|
29
|
+
return node.initializer.parameters[0] ?? null;
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function findComponentParameter(
|
|
35
|
+
node: ts.Node,
|
|
36
|
+
componentName: string,
|
|
37
|
+
): ts.ParameterDeclaration | null {
|
|
38
|
+
const direct = componentParameter(node, componentName);
|
|
39
|
+
if (direct) return direct;
|
|
40
|
+
let nested: ts.ParameterDeclaration | null = null;
|
|
41
|
+
node.forEachChild((child) => {
|
|
42
|
+
if (!nested) nested = findComponentParameter(child, componentName);
|
|
43
|
+
});
|
|
44
|
+
return nested;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function stringReplacement(initializer: ts.Expression, value: string): string | null {
|
|
48
|
+
if (!ts.isStringLiteral(initializer) && !ts.isNoSubstitutionTemplateLiteral(initializer)) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const quote = initializer.getText()[0];
|
|
52
|
+
if (quote === "'") {
|
|
53
|
+
return `'${value.replaceAll('\\', '\\\\').replaceAll("'", "\\'").replaceAll('\n', '\\n')}'`;
|
|
54
|
+
}
|
|
55
|
+
if (quote === '`') {
|
|
56
|
+
return `\`${value
|
|
57
|
+
.replaceAll('\\', '\\\\')
|
|
58
|
+
.replaceAll('`', '\\`')
|
|
59
|
+
.replaceAll('${', '\\${')
|
|
60
|
+
.replaceAll('\n', '\\n')}\``;
|
|
61
|
+
}
|
|
62
|
+
return JSON.stringify(value);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function literalReplacement(initializer: ts.Expression, value: string): string | null {
|
|
66
|
+
const stringLiteral = stringReplacement(initializer, value);
|
|
67
|
+
if (stringLiteral !== null) return stringLiteral;
|
|
68
|
+
if (
|
|
69
|
+
ts.isNumericLiteral(initializer) ||
|
|
70
|
+
(ts.isPrefixUnaryExpression(initializer) && ts.isNumericLiteral(initializer.operand))
|
|
71
|
+
) {
|
|
72
|
+
return Number.isFinite(Number(value)) ? value : null;
|
|
73
|
+
}
|
|
74
|
+
if (
|
|
75
|
+
initializer.kind === ts.SyntaxKind.TrueKeyword ||
|
|
76
|
+
initializer.kind === ts.SyntaxKind.FalseKeyword
|
|
77
|
+
) {
|
|
78
|
+
return value === 'true' || value === 'false' ? value : null;
|
|
79
|
+
}
|
|
80
|
+
if (ts.isArrayLiteralExpression(initializer)) {
|
|
81
|
+
const trimmed = value.trim();
|
|
82
|
+
return /^\[\s*-?(?:\d+(?:\.\d+)?|\.\d+)(?:\s*,\s*-?(?:\d+(?:\.\d+)?|\.\d+))*\s*\]$/.test(
|
|
83
|
+
trimmed,
|
|
84
|
+
)
|
|
85
|
+
? trimmed
|
|
86
|
+
: null;
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function writeComponentDefault(
|
|
92
|
+
code: string,
|
|
93
|
+
fileName: string,
|
|
94
|
+
componentName: string,
|
|
95
|
+
prop: string,
|
|
96
|
+
value: string,
|
|
97
|
+
): ComponentDefaultEditResult {
|
|
98
|
+
const source = parseAuthoringTsx(fileName, code);
|
|
99
|
+
const parameter = findComponentParameter(source, componentName);
|
|
100
|
+
if (!parameter || !ts.isObjectBindingPattern(parameter.name)) {
|
|
101
|
+
return {
|
|
102
|
+
code,
|
|
103
|
+
changed: false,
|
|
104
|
+
dynamic: true,
|
|
105
|
+
error: `${componentName} does not declare literal destructured defaults.`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const binding = parameter.name.elements.find((element) => {
|
|
109
|
+
const authoredName = element.propertyName ?? element.name;
|
|
110
|
+
return ts.isIdentifier(authoredName) && authoredName.text === prop;
|
|
111
|
+
});
|
|
112
|
+
if (!binding?.initializer) {
|
|
113
|
+
return {
|
|
114
|
+
code,
|
|
115
|
+
changed: false,
|
|
116
|
+
dynamic: true,
|
|
117
|
+
error: `${componentName}.${prop} has no declared default initializer.`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const replacement = literalReplacement(binding.initializer, value);
|
|
121
|
+
if (replacement === null) {
|
|
122
|
+
return {
|
|
123
|
+
code,
|
|
124
|
+
changed: false,
|
|
125
|
+
dynamic: true,
|
|
126
|
+
error: `${componentName}.${prop} uses a computed or incompatible default.`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const start = binding.initializer.getStart(source);
|
|
130
|
+
const end = binding.initializer.getEnd();
|
|
131
|
+
const next = code.slice(0, start) + replacement + code.slice(end);
|
|
132
|
+
return { code: next, changed: next !== code, dynamic: false };
|
|
133
|
+
}
|