@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,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NAMED STYLES — the planner behind "create a style from this selection"
|
|
3
|
+
* (the design ledger's named-styles order; Webflow is the prior art). A
|
|
4
|
+
* named style IS a CSS class in the project's own stylesheet — the web's
|
|
5
|
+
* answer to a Figma style, and strictly stronger: it carries any property,
|
|
6
|
+
* cascades, and responds to media/state. Until this, the editor could only
|
|
7
|
+
* write inline styles and detected utility classes; nothing could mint a
|
|
8
|
+
* reusable, project-owned class.
|
|
9
|
+
*
|
|
10
|
+
* Pure text surgery over the CSS source, in the writer idiom
|
|
11
|
+
* (`plan-csf-story.ts` is the shape precedent): every refusal is a named
|
|
12
|
+
* sentence, and the only grammar this file needs is "a class rule is
|
|
13
|
+
* `.name { declarations }` appended at top level" — the dev server's
|
|
14
|
+
* `@scope` wrapping happens at SERVE time, so source rules stay unwrapped.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** One planned edit: the whole next CSS source, or the refusal. */
|
|
18
|
+
export type NamedStylePlan =
|
|
19
|
+
| { ok: true; nextSource: string; summary: string }
|
|
20
|
+
| { ok: false; reason: string };
|
|
21
|
+
|
|
22
|
+
/** A CSS class name this planner will mint: an ordinary identifier with
|
|
23
|
+
* hyphens — the deliberate subset of CSS ident syntax that never needs
|
|
24
|
+
* escaping in a selector, a `className` attribute, or a querySelector. */
|
|
25
|
+
const CLASS_NAME = /^[A-Za-z_][A-Za-z0-9_-]*$/;
|
|
26
|
+
|
|
27
|
+
export function isValidClassName(name: string): boolean {
|
|
28
|
+
return CLASS_NAME.test(name);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Does the CSS source already declare a rule for `.name`? A plain-text scan:
|
|
33
|
+
* `.name` followed by a non-ident character, not preceded by an ident
|
|
34
|
+
* character. Deliberately over-matches (a `.name` inside a comment or url()
|
|
35
|
+
* counts) — this gates CREATION, so the safe error direction is refusing a
|
|
36
|
+
* class that does not truly exist, never silently doubling one that does.
|
|
37
|
+
*/
|
|
38
|
+
export function classRuleExists(cssSource: string, className: string): boolean {
|
|
39
|
+
const escaped = className.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
40
|
+
return new RegExp(`(^|[^\\w-])\\.${escaped}(?![\\w-])`).test(cssSource);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** One declaration of the new rule, already in CSS vocabulary. */
|
|
44
|
+
export interface PlannedDeclaration {
|
|
45
|
+
/** kebab-case CSS property name. */
|
|
46
|
+
prop: string;
|
|
47
|
+
/** CSS value text, unit spelled (`8px`, not `8`). */
|
|
48
|
+
value: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Append a new class rule `.className { … }` to the stylesheet. An EMPTY
|
|
53
|
+
* declarations list is legitimate — Webflow's flow is exactly "name the
|
|
54
|
+
* class first, style it after", and once the element wears the class the
|
|
55
|
+
* style routing (`namedStyleRuleFor`) makes the rule the landing place for
|
|
56
|
+
* subsequent property edits.
|
|
57
|
+
*/
|
|
58
|
+
export function planCreateClassRule(
|
|
59
|
+
cssSource: string,
|
|
60
|
+
className: string,
|
|
61
|
+
decls: readonly PlannedDeclaration[],
|
|
62
|
+
): NamedStylePlan {
|
|
63
|
+
if (!isValidClassName(className)) {
|
|
64
|
+
return {
|
|
65
|
+
ok: false,
|
|
66
|
+
reason:
|
|
67
|
+
`"${className}" is not a usable class name — use letters, digits, hyphens and ` +
|
|
68
|
+
'underscores, starting with a letter.',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (classRuleExists(cssSource, className)) {
|
|
72
|
+
return {
|
|
73
|
+
ok: false,
|
|
74
|
+
reason:
|
|
75
|
+
`a rule mentioning ".${className}" already exists in this stylesheet — apply the ` +
|
|
76
|
+
'existing class, or pick another name.',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const body = decls.map((d) => ` ${d.prop}: ${d.value};\n`).join('');
|
|
80
|
+
const lead =
|
|
81
|
+
cssSource.length === 0 || cssSource.endsWith('\n\n')
|
|
82
|
+
? ''
|
|
83
|
+
: cssSource.endsWith('\n')
|
|
84
|
+
? '\n'
|
|
85
|
+
: '\n\n';
|
|
86
|
+
const nextSource = `${cssSource}${lead}.${className} {\n${body}}\n`;
|
|
87
|
+
return {
|
|
88
|
+
ok: true,
|
|
89
|
+
nextSource,
|
|
90
|
+
summary:
|
|
91
|
+
decls.length === 0
|
|
92
|
+
? `created empty style .${className}`
|
|
93
|
+
: `created .${className} with ${decls.length} declaration${decls.length === 1 ? '' : 's'}`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `planSourceEdit` — the PURE core of a source edit: request + already-read file
|
|
3
|
+
* bytes in, exact before/after bytes out. No I/O, no hashing, no transport.
|
|
4
|
+
*
|
|
5
|
+
* Why it exists: the same edit vocabulary (`SourceEditRequest`) has to be
|
|
6
|
+
* executed by the dev server (`vite-plugin-ui-oid.ts`'s `handlePrepare`),
|
|
7
|
+
* which reads with `node:fs` and hashes with `node:crypto`. The plan itself is
|
|
8
|
+
* environment-free on purpose: resolving an oid to a source offset,
|
|
9
|
+
* picking the writer function, deciding what `changed` means — is identical,
|
|
10
|
+
* and a second hand-written copy of that switch is exactly the kind of fork
|
|
11
|
+
* this repo has been bitten by. So the switch lives here once, over an
|
|
12
|
+
* injected `sources` map the caller has already populated however it can.
|
|
13
|
+
*
|
|
14
|
+
* The caller learns WHICH files to read first from {@link sourceEditFiles},
|
|
15
|
+
* which resolves the request's oids through the same `OidEntry` index without
|
|
16
|
+
* touching any bytes.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { ensureValueImport } from './ensure-import';
|
|
20
|
+
import { lineColToOffset, type OidEntry } from './oid-transform';
|
|
21
|
+
import { planReparent } from './reparent-guard';
|
|
22
|
+
import type { SourceEditRequest } from './source-edit-request';
|
|
23
|
+
import { UTILITY_CLASSES_UNPROVEN, type UtilityClassSupport } from './utility-class-support';
|
|
24
|
+
import { writeComponentDefault } from './write-component-default';
|
|
25
|
+
import {
|
|
26
|
+
deleteElement,
|
|
27
|
+
deleteElements,
|
|
28
|
+
duplicateElement,
|
|
29
|
+
editTextContent,
|
|
30
|
+
getEditableText,
|
|
31
|
+
groupSiblingElements,
|
|
32
|
+
insertChildElement,
|
|
33
|
+
insertSiblingElement,
|
|
34
|
+
removeInlineStyle,
|
|
35
|
+
removePropAttribute,
|
|
36
|
+
reorderChild,
|
|
37
|
+
type StructEditResult,
|
|
38
|
+
type StyleEditResult,
|
|
39
|
+
surgicalCssEdit,
|
|
40
|
+
surgicalCssEditInMedia,
|
|
41
|
+
unwrapElement,
|
|
42
|
+
wrapElement,
|
|
43
|
+
writePropChange,
|
|
44
|
+
writeStyleAuto,
|
|
45
|
+
} from './writer';
|
|
46
|
+
|
|
47
|
+
/** Resolve an oid to its source location, or `undefined` when unknown. */
|
|
48
|
+
export type OidResolver = (oid: string) => OidEntry | undefined;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The outcome of planning one edit.
|
|
52
|
+
*
|
|
53
|
+
* `file === null` means the request never reached a file at all (unknown oid,
|
|
54
|
+
* malformed batch, out-of-scope css path) — `result.error` says why. Otherwise
|
|
55
|
+
* `prevSource`/`newSource` are the WHOLE file before and after; they are equal
|
|
56
|
+
* when the edit was a source no-op (a refused dynamic prop, an absent literal).
|
|
57
|
+
*/
|
|
58
|
+
export interface SourceEditPlan {
|
|
59
|
+
readonly file: string | null;
|
|
60
|
+
readonly changed: boolean;
|
|
61
|
+
readonly prevSource: string;
|
|
62
|
+
readonly newSource: string;
|
|
63
|
+
readonly result: Record<string, unknown>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function failed(error: string): SourceEditPlan {
|
|
67
|
+
return { file: null, changed: false, prevSource: '', newSource: '', result: { error } };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function planned(
|
|
71
|
+
file: string,
|
|
72
|
+
prevSource: string,
|
|
73
|
+
newSource: string,
|
|
74
|
+
result: Record<string, unknown>,
|
|
75
|
+
): SourceEditPlan {
|
|
76
|
+
const changed = prevSource !== newSource && result['changed'] !== false;
|
|
77
|
+
return { file, changed, prevSource, newSource, result: { ...result, changed } };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* D-A3: a `value: null` style request is the REMOVAL sentinel
|
|
82
|
+
* routed to `removeInlineStyle`; anything else takes the normal
|
|
83
|
+
* write-or-append path. Kept here (rather than in the vite plugin, where it
|
|
84
|
+
* used to live alone) because BOTH tiers route the same sentinel.
|
|
85
|
+
*
|
|
86
|
+
* `support` is the caller's OBSERVATION about the target project's utility-class
|
|
87
|
+
* pipeline — the class-vs-inline gate (`utility-class-support.ts`). Omitting it
|
|
88
|
+
* means "unproven", which routes inline: the write that paints in every project.
|
|
89
|
+
*/
|
|
90
|
+
export function applyStyleWriteRequest(
|
|
91
|
+
code: string,
|
|
92
|
+
elementStart: number,
|
|
93
|
+
prop: string,
|
|
94
|
+
value: string | number | null,
|
|
95
|
+
support?: UtilityClassSupport,
|
|
96
|
+
): StyleEditResult & { route?: 'class' | 'inline'; error?: string } {
|
|
97
|
+
if (value === null) return removeInlineStyle(code, elementStart, prop);
|
|
98
|
+
return writeStyleAuto(code, elementStart, prop, value, support ?? UTILITY_CLASSES_UNPROVEN);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Every source file this request needs read before {@link planSourceEdit} can
|
|
103
|
+
* run. Empty when the request cannot resolve at all — plan it anyway and read
|
|
104
|
+
* the honest error off the returned plan, rather than guessing here.
|
|
105
|
+
*/
|
|
106
|
+
export function sourceEditFiles(
|
|
107
|
+
request: SourceEditRequest,
|
|
108
|
+
resolveOid: OidResolver,
|
|
109
|
+
): readonly string[] {
|
|
110
|
+
if (request.kind === 'css') {
|
|
111
|
+
const clean = request.file.split('?')[0] ?? request.file;
|
|
112
|
+
return clean ? [clean] : [];
|
|
113
|
+
}
|
|
114
|
+
const oids =
|
|
115
|
+
request.kind === 'struct-many'
|
|
116
|
+
? [...new Set(request.oids)]
|
|
117
|
+
: [request.oid, ...(request.kind === 'struct' ? [request.targetOid, request.parentOid] : [])];
|
|
118
|
+
const files = new Set<string>();
|
|
119
|
+
for (const oid of oids) {
|
|
120
|
+
if (typeof oid !== 'string') continue;
|
|
121
|
+
const entry = resolveOid(oid);
|
|
122
|
+
if (entry) files.add(entry.file);
|
|
123
|
+
}
|
|
124
|
+
return [...files];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Apply `request` to the source text in `sources`, returning exact before/after
|
|
129
|
+
* bytes. Never throws for an ordinary refusal (unknown oid, cross-file move,
|
|
130
|
+
* unknown op) — those come back as a `result.error` plan so the caller can
|
|
131
|
+
* report them; a MISSING entry in `sources` for a file the request resolved to
|
|
132
|
+
* IS a programming error and throws, because a silently-skipped write is the
|
|
133
|
+
* one outcome this seam must never produce.
|
|
134
|
+
*/
|
|
135
|
+
export function planSourceEdit(
|
|
136
|
+
request: SourceEditRequest,
|
|
137
|
+
sources: ReadonlyMap<string, string>,
|
|
138
|
+
resolveOid: OidResolver,
|
|
139
|
+
/** The target project's observed utility-class support; absent ⇒ unproven ⇒ inline. */
|
|
140
|
+
utilityClasses: UtilityClassSupport = UTILITY_CLASSES_UNPROVEN,
|
|
141
|
+
): SourceEditPlan {
|
|
142
|
+
const sourceOf = (file: string): string => {
|
|
143
|
+
const source = sources.get(file);
|
|
144
|
+
if (source === undefined) {
|
|
145
|
+
throw new Error(`planSourceEdit: source for "${file}" was not provided.`);
|
|
146
|
+
}
|
|
147
|
+
return source;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
if (request.kind === 'css') {
|
|
151
|
+
const cleanFile = request.file.split('?')[0] ?? request.file;
|
|
152
|
+
const src = sourceOf(cleanFile);
|
|
153
|
+
// `media` scopes the edit to a breakpoint's `@media` block (design
|
|
154
|
+
// ledger: breakpoints) — block and rule are minted on demand, so the
|
|
155
|
+
// base path's generated-CSS probe does not apply.
|
|
156
|
+
const edited =
|
|
157
|
+
typeof request.media === 'string' && request.media.trim().length > 0
|
|
158
|
+
? surgicalCssEditInMedia(src, request.media, request.selector, request.prop, request.value)
|
|
159
|
+
: surgicalCssEdit(src, request.selector, request.prop, request.value);
|
|
160
|
+
if (edited === null) return planned(cleanFile, src, src, { changed: false, generated: true });
|
|
161
|
+
return planned(cleanFile, src, edited, { changed: edited !== src });
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (request.kind === 'struct-many') {
|
|
165
|
+
const { oids, op } = request;
|
|
166
|
+
if ((op !== 'delete' && op !== 'group') || !Array.isArray(oids) || oids.length === 0) {
|
|
167
|
+
return failed('invalid struct-many request');
|
|
168
|
+
}
|
|
169
|
+
const entries = [...new Set(oids)].map((oid) => ({ oid, entry: resolveOid(oid) }));
|
|
170
|
+
const missing = entries.find((item) => !item.entry);
|
|
171
|
+
if (missing) return failed(`unknown oid: ${missing.oid}`);
|
|
172
|
+
const file = entries[0]!.entry!.file;
|
|
173
|
+
if (entries.some((item) => item.entry!.file !== file)) {
|
|
174
|
+
return failed('cannot batch-delete across files');
|
|
175
|
+
}
|
|
176
|
+
// ONE snapshot every offset resolves against — see `handleStructMany`'s
|
|
177
|
+
// doc comment for why a per-oid re-read would be unsound here.
|
|
178
|
+
const src = sourceOf(file);
|
|
179
|
+
const offsets = entries.map((item) => lineColToOffset(src, item.entry!.line, item.entry!.col));
|
|
180
|
+
const result =
|
|
181
|
+
op === 'group'
|
|
182
|
+
? groupSiblingElements(src, offsets, request.wrapperTag)
|
|
183
|
+
: deleteElements(src, offsets);
|
|
184
|
+
return planned(file, src, result.code, { changed: result.changed });
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const entry = resolveOid(request.oid);
|
|
188
|
+
if (!entry) return failed('unknown oid');
|
|
189
|
+
const src = sourceOf(entry.file);
|
|
190
|
+
const off = lineColToOffset(src, entry.line, entry.col);
|
|
191
|
+
|
|
192
|
+
if (request.kind === 'component-default') {
|
|
193
|
+
if (!entry.component) {
|
|
194
|
+
return planned(entry.file, src, src, {
|
|
195
|
+
changed: false,
|
|
196
|
+
dynamic: true,
|
|
197
|
+
error: 'the selected definition is not inside a named component.',
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
const result = writeComponentDefault(
|
|
201
|
+
src,
|
|
202
|
+
entry.file,
|
|
203
|
+
entry.component,
|
|
204
|
+
request.prop,
|
|
205
|
+
request.value,
|
|
206
|
+
);
|
|
207
|
+
return planned(entry.file, src, result.code, {
|
|
208
|
+
changed: result.changed,
|
|
209
|
+
dynamic: result.dynamic,
|
|
210
|
+
...(result.error ? { error: result.error } : {}),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (request.kind === 'style') {
|
|
215
|
+
// The value goes through UNCONVERTED: a number must stay a number so the
|
|
216
|
+
// writer emits a bare `12` (React px-ifies it) instead of `'12'` (the
|
|
217
|
+
// CSSOM rejects a unitless length and keeps the previous value).
|
|
218
|
+
const result = applyStyleWriteRequest(src, off, request.prop, request.value, utilityClasses);
|
|
219
|
+
return planned(entry.file, src, result.code, {
|
|
220
|
+
changed: result.changed,
|
|
221
|
+
dynamic: result.dynamic,
|
|
222
|
+
route: result.route,
|
|
223
|
+
appended: result.appended,
|
|
224
|
+
// The `var()` guard's own channel — a refusal the caller must be able to
|
|
225
|
+
// tell from a dynamic expression, because its sentence names a token.
|
|
226
|
+
...(result.tokenRef ? { tokenRef: result.tokenRef } : {}),
|
|
227
|
+
...(result.error ? { error: result.error } : {}),
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (request.kind === 'text') {
|
|
232
|
+
const prevText = getEditableText(src, off);
|
|
233
|
+
const result = editTextContent(src, off, request.text);
|
|
234
|
+
return planned(entry.file, src, result.code, {
|
|
235
|
+
changed: result.changed,
|
|
236
|
+
dynamic: result.dynamic,
|
|
237
|
+
prevText,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (request.kind === 'prop') {
|
|
242
|
+
// `value: null` is the REMOVAL sentinel (same shape as `style`) — reverting
|
|
243
|
+
// a prop to the component's declared default means deleting the attribute,
|
|
244
|
+
// not writing the text "null" into it.
|
|
245
|
+
if (request.value === null) {
|
|
246
|
+
const removed = removePropAttribute(src, off, request.prop);
|
|
247
|
+
return planned(entry.file, src, removed.code, {
|
|
248
|
+
changed: removed.changed,
|
|
249
|
+
dynamic: removed.dynamic,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
const result = writePropChange(src, off, request.prop, request.value, {
|
|
253
|
+
addIfMissing: request.addIfMissing === true,
|
|
254
|
+
allowShapeUpgrade: request.allowShapeUpgrade === true,
|
|
255
|
+
});
|
|
256
|
+
return planned(entry.file, src, result.code, {
|
|
257
|
+
changed: result.changed,
|
|
258
|
+
dynamic: result.dynamic,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// kind === 'struct'
|
|
263
|
+
const resolveCompanion = (id: unknown): number | null | 'cross-file' => {
|
|
264
|
+
if (typeof id !== 'string') return null;
|
|
265
|
+
const companion = resolveOid(id);
|
|
266
|
+
if (!companion) return null;
|
|
267
|
+
if (companion.file !== entry.file) return 'cross-file';
|
|
268
|
+
return lineColToOffset(src, companion.line, companion.col);
|
|
269
|
+
};
|
|
270
|
+
const target = resolveCompanion(request.targetOid);
|
|
271
|
+
const parent = resolveCompanion(request.parentOid);
|
|
272
|
+
if (target === 'cross-file' || parent === 'cross-file') {
|
|
273
|
+
return planned(entry.file, src, src, { changed: false, error: 'cannot move across files' });
|
|
274
|
+
}
|
|
275
|
+
// `reparent` is the ONE struct op with rules of its own (R1–R4): it is planned
|
|
276
|
+
// whole — scope safety, destination legality, world-transform re-basing — before
|
|
277
|
+
// any byte is written, and a refusal returns `src` unchanged with a named reason.
|
|
278
|
+
if (request.op === 'reparent') {
|
|
279
|
+
if (parent == null) {
|
|
280
|
+
return planned(entry.file, src, src, {
|
|
281
|
+
changed: false,
|
|
282
|
+
error: 'the destination is not source-addressable.',
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
const plan = planReparent(src, off, parent, {
|
|
286
|
+
...(request.rebase ? { rebase: request.rebase } : {}),
|
|
287
|
+
...(request.destinationInstances === undefined
|
|
288
|
+
? {}
|
|
289
|
+
: { destinationInstances: request.destinationInstances }),
|
|
290
|
+
...(request.sourceInstances === undefined
|
|
291
|
+
? {}
|
|
292
|
+
: { sourceInstances: request.sourceInstances }),
|
|
293
|
+
});
|
|
294
|
+
return planned(entry.file, src, plan.code, {
|
|
295
|
+
changed: plan.changed,
|
|
296
|
+
...(plan.error ? { error: plan.error } : {}),
|
|
297
|
+
...(plan.warning ? { warning: plan.warning } : {}),
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
let result: StructEditResult;
|
|
302
|
+
switch (request.op) {
|
|
303
|
+
case 'delete':
|
|
304
|
+
result = deleteElement(src, off);
|
|
305
|
+
break;
|
|
306
|
+
case 'duplicate':
|
|
307
|
+
result = duplicateElement(src, off, request.duplicate);
|
|
308
|
+
break;
|
|
309
|
+
case 'wrap':
|
|
310
|
+
result = wrapElement(src, off, String(request.wrapperTag ?? 'div'));
|
|
311
|
+
break;
|
|
312
|
+
case 'unwrap':
|
|
313
|
+
result = unwrapElement(src, off);
|
|
314
|
+
break;
|
|
315
|
+
case 'create':
|
|
316
|
+
result = insertChildElement(
|
|
317
|
+
src,
|
|
318
|
+
off,
|
|
319
|
+
String(request.wrapperTag ?? 'div'),
|
|
320
|
+
typeof request.snippet === 'string' ? request.snippet : undefined,
|
|
321
|
+
);
|
|
322
|
+
break;
|
|
323
|
+
case 'create-sibling':
|
|
324
|
+
result = insertSiblingElement(
|
|
325
|
+
src,
|
|
326
|
+
off,
|
|
327
|
+
typeof request.snippet === 'string' ? request.snippet : '',
|
|
328
|
+
);
|
|
329
|
+
break;
|
|
330
|
+
case 'reorder':
|
|
331
|
+
result = reorderChild(src, off, target, parent);
|
|
332
|
+
break;
|
|
333
|
+
default:
|
|
334
|
+
return planned(entry.file, src, src, {
|
|
335
|
+
changed: false,
|
|
336
|
+
error: `unknown struct op: ${String(request.op)}`,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
// An inserted snippet whose tag is a COMPONENT is broken source until its
|
|
340
|
+
// import exists, so the import rides the SAME plan — one file write, one
|
|
341
|
+
// history transaction, never a half-applied insert. Skipped when the insert
|
|
342
|
+
// itself refused (nothing to import for a snippet that never landed).
|
|
343
|
+
const code =
|
|
344
|
+
result.changed && request.ensureImport
|
|
345
|
+
? ensureValueImport(
|
|
346
|
+
result.code,
|
|
347
|
+
request.ensureImport.name,
|
|
348
|
+
request.ensureImport.module,
|
|
349
|
+
request.ensureImport.kind,
|
|
350
|
+
).code
|
|
351
|
+
: result.code;
|
|
352
|
+
return planned(entry.file, src, code, { changed: result.changed });
|
|
353
|
+
}
|