@vgai/editor 0.2.0
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/LICENSE +661 -0
- package/README.md +35 -0
- package/dist/a/b/c/test-nested.json +1 -0
- package/dist/assets/CCDIKSolver-Dz-ysxZF.js +1 -0
- package/dist/assets/SelectionBox-BXsv_6aH.js +1 -0
- package/dist/assets/browser-project-scripts-DOru4L1x.js +2 -0
- package/dist/assets/browserAll-CEkWYlFk.js +1 -0
- package/dist/assets/collision-world-DniMB0qq.glb +0 -0
- package/dist/assets/create-runtime-DYIWr3va.js +1 -0
- package/dist/assets/data-asset-Bb9sIM7i.js +5 -0
- package/dist/assets/esbuild-BHljloGq.wasm +0 -0
- package/dist/assets/fake-three-BMTQ9rl_.js +1 -0
- package/dist/assets/game-8SDZPPgH.js +1 -0
- package/dist/assets/game-BI111o5f.js +10 -0
- package/dist/assets/game-CevorxyV.js +1 -0
- package/dist/assets/game-Di1H0gFj.js +1 -0
- package/dist/assets/game-Di7XlywD.js +1 -0
- package/dist/assets/game-DjnCaw8R.js +1 -0
- package/dist/assets/game-Q9A0aXSV.js +1 -0
- package/dist/assets/game-pt_1lQLv.js +1 -0
- package/dist/assets/game-source-CvidN7AB.js +1 -0
- package/dist/assets/game-xsOho_wg.js +83 -0
- package/dist/assets/index-Bp5cecD6.js +12 -0
- package/dist/assets/index-CPVV6pjw.js +1 -0
- package/dist/assets/index-CpOnYyeD.js +213 -0
- package/dist/assets/index-Cs8xwv3e.js +1 -0
- package/dist/assets/index-DL7RcQ0n.js +27 -0
- package/dist/assets/index-Dr8H_6Rl.js +1 -0
- package/dist/assets/index-_bCaipUk.js +13650 -0
- package/dist/assets/ingest-siblings-Dz8eEqrV.js +1 -0
- package/dist/assets/mount-manifest-Bhk0ohsl.js +1 -0
- package/dist/assets/recast-navigation.wasm-compat-CvP4UGK6.js +1 -0
- package/dist/assets/scene-query-BivAHhJu.js +1 -0
- package/dist/assets/stats.module--VATS4Kh.js +1 -0
- package/dist/assets/webworkerAll-BLrH0F6F.js +1 -0
- package/dist/assets/xstate-animation-binding-1NGLmw6y.js +1 -0
- package/dist/assets/xstate.esm-BgUD33nl.js +3 -0
- package/dist/index.html +37 -0
- package/dist/ingest/racing-game/UPSTREAM.md +68 -0
- package/dist/ingest/racing-game/a/Inter-Black.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Black.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-BlackItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-BlackItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Bold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Bold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-BoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-BoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLight.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLight.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLightItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLightItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Italic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Italic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Light.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Light.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-LightItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-LightItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Medium.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Medium.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-MediumItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-MediumItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Regular.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Regular.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Thin.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Thin.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ThinItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ThinItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-italic.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-roman.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/index.css +1 -0
- package/dist/ingest/racing-game/images/bronze.png +0 -0
- package/dist/ingest/racing-game/images/gold.png +0 -0
- package/dist/ingest/racing-game/images/silver.png +0 -0
- package/dist/ingest/racing-game/index.html +15 -0
- package/dist/ingest/racing-game/models/chassis-draco.glb +0 -0
- package/dist/ingest/racing-game/models/track-draco.glb +0 -0
- package/dist/ingest/racing-game/models/wheel-draco.glb +0 -0
- package/dist/ingest/racing-game/rg-entry.js +1 -0
- package/dist/ingest/racing-game/sounds/accelerate.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/boost.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/crash.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/engine.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/honk.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/tire-brake.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/train.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/water.mp3 +0 -0
- package/dist/ingest/racing-game/textures/cursor.svg +3 -0
- package/dist/ingest/racing-game/textures/dikhololo_night_1k.hdr +0 -0
- package/dist/ingest/racing-game/textures/heightmap_1024.png +0 -0
- package/dist/ingest/racing-game/textures/mask.svg +11 -0
- package/dist/ingest/racing-game/textures/no_sound.png +0 -0
- package/dist/ingest/racing-game/three-r139.module.js +50617 -0
- package/dist/ingest/racing-game/vendor.js +179 -0
- package/dist/ingest/racing-game/vgai.game.json +20 -0
- package/dist/ingest/simcity/UPSTREAM.md +65 -0
- package/dist/ingest/simcity/favicon.ico +0 -0
- package/dist/ingest/simcity/fonts/Bebas-Regular.otf +0 -0
- package/dist/ingest/simcity/fonts/Digitalt.otf +0 -0
- package/dist/ingest/simcity/fonts/Stanberry.ttf +0 -0
- package/dist/ingest/simcity/icons/bulldozer-color.png +0 -0
- package/dist/ingest/simcity/icons/bulldozer.png +0 -0
- package/dist/ingest/simcity/icons/calendar.png +0 -0
- package/dist/ingest/simcity/icons/factory-color.png +0 -0
- package/dist/ingest/simcity/icons/factory.png +0 -0
- package/dist/ingest/simcity/icons/house-color.png +0 -0
- package/dist/ingest/simcity/icons/house.png +0 -0
- package/dist/ingest/simcity/icons/job.png +0 -0
- package/dist/ingest/simcity/icons/office.png +0 -0
- package/dist/ingest/simcity/icons/pause-color.png +0 -0
- package/dist/ingest/simcity/icons/pause.png +0 -0
- package/dist/ingest/simcity/icons/person.png +0 -0
- package/dist/ingest/simcity/icons/play-color.png +0 -0
- package/dist/ingest/simcity/icons/play.png +0 -0
- package/dist/ingest/simcity/icons/power-color.png +0 -0
- package/dist/ingest/simcity/icons/power-line-color.png +0 -0
- package/dist/ingest/simcity/icons/power.png +0 -0
- package/dist/ingest/simcity/icons/road-color.png +0 -0
- package/dist/ingest/simcity/icons/road.png +0 -0
- package/dist/ingest/simcity/icons/select-color.png +0 -0
- package/dist/ingest/simcity/icons/select.png +0 -0
- package/dist/ingest/simcity/icons/store-color.png +0 -0
- package/dist/ingest/simcity/index.html +94 -0
- package/dist/ingest/simcity/index.js +58 -0
- package/dist/ingest/simcity/main.css +233 -0
- package/dist/ingest/simcity/models/armored-truck.glb +0 -0
- package/dist/ingest/simcity/models/building-block-4floor-corner.glb +0 -0
- package/dist/ingest/simcity/models/building-block-4floor-short.glb +0 -0
- package/dist/ingest/simcity/models/building-block-5floor.glb +0 -0
- package/dist/ingest/simcity/models/building-burger-joint.glb +0 -0
- package/dist/ingest/simcity/models/building-cafe.glb +0 -0
- package/dist/ingest/simcity/models/building-casino.glb +0 -0
- package/dist/ingest/simcity/models/building-cinema.glb +0 -0
- package/dist/ingest/simcity/models/building-house-block-big.glb +0 -0
- package/dist/ingest/simcity/models/building-house-family-large.glb +0 -0
- package/dist/ingest/simcity/models/building-house-family-small.glb +0 -0
- package/dist/ingest/simcity/models/building-office-balcony.glb +0 -0
- package/dist/ingest/simcity/models/building-office-big.glb +0 -0
- package/dist/ingest/simcity/models/building-office-pyramid.glb +0 -0
- package/dist/ingest/simcity/models/building-office-tall.glb +0 -0
- package/dist/ingest/simcity/models/building-office.glb +0 -0
- package/dist/ingest/simcity/models/building-restaurant.glb +0 -0
- package/dist/ingest/simcity/models/building-skyscraper.glb +0 -0
- package/dist/ingest/simcity/models/car-ambulance-pickup.glb +0 -0
- package/dist/ingest/simcity/models/car-baywatch.glb +0 -0
- package/dist/ingest/simcity/models/car-hippie-van.glb +0 -0
- package/dist/ingest/simcity/models/car-passenger-race.glb +0 -0
- package/dist/ingest/simcity/models/car-passenger.glb +0 -0
- package/dist/ingest/simcity/models/car-police.glb +0 -0
- package/dist/ingest/simcity/models/car-taxi.glb +0 -0
- package/dist/ingest/simcity/models/car-tow-truck.glb +0 -0
- package/dist/ingest/simcity/models/car-truck-dump.glb +0 -0
- package/dist/ingest/simcity/models/car-veteran.glb +0 -0
- package/dist/ingest/simcity/models/construction-small.glb +0 -0
- package/dist/ingest/simcity/models/data-center.glb +0 -0
- package/dist/ingest/simcity/models/industry-factory-old.glb +0 -0
- package/dist/ingest/simcity/models/industry-factory.glb +0 -0
- package/dist/ingest/simcity/models/industry-refinery.glb +0 -0
- package/dist/ingest/simcity/models/industry-warehouse.glb +0 -0
- package/dist/ingest/simcity/models/power_line_pole_modified.glb +0 -0
- package/dist/ingest/simcity/models/tile-plain_grass.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-curve.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-end.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-intersection-t.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-intersection.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-straight.glb +0 -0
- package/dist/ingest/simcity/models/truck.glb +0 -0
- package/dist/ingest/simcity/statusIcons/no-power.png +0 -0
- package/dist/ingest/simcity/statusIcons/no-road-access.png +0 -0
- package/dist/ingest/simcity/textures/base.png +0 -0
- package/dist/ingest/simcity/textures/grid.png +0 -0
- package/dist/ingest/simcity/textures/specular.png +0 -0
- package/dist/ingest/simcity/three-r155.module.js +51466 -0
- package/dist/ingest/simcity/vgai.game.json +20 -0
- package/dist/ingest/tanks/UPSTREAM.md +69 -0
- package/dist/ingest/tanks/index.html +214 -0
- package/dist/ingest/tanks/models/pixelTank.fbx +0 -0
- package/dist/ingest/tanks/tanks-entry.js +92 -0
- package/dist/ingest/tanks/three-r170.module.js +54571 -0
- package/dist/ingest/tanks/vgai.game.json +20 -0
- package/dist/inputmaps/default.inputmap.json +41 -0
- package/dist/jsm/libs/draco/gltf/draco_decoder.js +33 -0
- package/dist/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
- package/dist/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/dist/scenes/untitled.vscn.json +29 -0
- package/dist/textures/waternormals.jpg +0 -0
- package/dist-server/packaged.mjs +18155 -0
- package/package.json +36 -0
- package/server/asset-library-routes.ts +833 -0
- package/server/canonical-path.ts +50 -0
- package/server/cloud-asset-catalog.ts +101 -0
- package/server/dev.ts +350 -0
- package/server/editor-server.ts +1537 -0
- package/server/editor-sse.ts +73 -0
- package/server/game-globals-shadow.ts +58 -0
- package/server/local-asset-catalog.ts +163 -0
- package/server/packaged.ts +571 -0
- package/server/prod.ts +75 -0
- package/server/project-optimize-deps-entries.ts +149 -0
- package/server/project-view.ts +65 -0
- package/server/server-utils.ts +430 -0
- package/server/session-registry.ts +93 -0
- package/src/EditorContext.tsx +87 -0
- package/src/achieved-tier.ts +126 -0
- package/src/action-registry.ts +268 -0
- package/src/adapter-resolver.ts +1858 -0
- package/src/asset-events.ts +100 -0
- package/src/authoring/active-adapter.ts +98 -0
- package/src/authoring/active-systems.ts +50 -0
- package/src/authoring/boundary-authoring-adapter.ts +178 -0
- package/src/authoring/composite-authoring-adapter.ts +891 -0
- package/src/authoring/design-time-layers.ts +776 -0
- package/src/authoring/edit-mode-authoring.ts +643 -0
- package/src/authoring/embed-only-adapter.ts +57 -0
- package/src/authoring/ephemeral-persistence.ts +26 -0
- package/src/authoring/eyedropper-session.ts +69 -0
- package/src/authoring/first-party-hierarchy-menu.ts +74 -0
- package/src/authoring/first-party-inspector/AddSectionMenu.tsx +118 -0
- package/src/authoring/first-party-inspector/EnvironmentSection.tsx +550 -0
- package/src/authoring/first-party-inspector/HeaderSection.tsx +329 -0
- package/src/authoring/first-party-inspector/is-first-party-selection.ts +44 -0
- package/src/authoring/first-party-inspector/register.tsx +108 -0
- package/src/authoring/ingest-authoring-adapter.ts +475 -0
- package/src/authoring/ingest-capture.ts +94 -0
- package/src/authoring/ingest-game-adapter.ts +291 -0
- package/src/authoring/ingest-iframe-adapter.ts +38 -0
- package/src/authoring/ingest-iframe-reachable-adapter.ts +401 -0
- package/src/authoring/ingest-overlay.ts +193 -0
- package/src/authoring/layered-pick.ts +87 -0
- package/src/authoring/mount-failure-report.ts +112 -0
- package/src/authoring/overlay-report.ts +52 -0
- package/src/authoring/project-scenes.ts +111 -0
- package/src/authoring/react-dom-authoring-adapter.ts +795 -0
- package/src/authoring/react-inspector-section.tsx +1041 -0
- package/src/authoring/react-world-authoring-adapter.ts +2400 -0
- package/src/authoring/root-activation.ts +61 -0
- package/src/authoring/scene-ui-layer.ts +485 -0
- package/src/authoring/story-overlay.ts +48 -0
- package/src/authoring/ui-authoring-adapter.ts +325 -0
- package/src/authoring/ui-hierarchy-menu.ts +40 -0
- package/src/authoring/ui-inspector-sections.tsx +156 -0
- package/src/authoring/undo-timeline.ts +145 -0
- package/src/authoring/vgai-scene-authoring-adapter.ts +746 -0
- package/src/authoring/viewport-pick-context.ts +31 -0
- package/src/authoring/viewport-raycast.ts +80 -0
- package/src/authoring/world-overlay.ts +76 -0
- package/src/authoring/world-pan-state.ts +115 -0
- package/src/authoring/world-session-state.ts +102 -0
- package/src/authoring/world2d-authoring-adapter.ts +313 -0
- package/src/browser-external-watch.ts +98 -0
- package/src/browser-play-entry.ts +112 -0
- package/src/browser-project-scripts.ts +112 -0
- package/src/browser-transpile.ts +246 -0
- package/src/browser-watch-reload.ts +100 -0
- package/src/command-listener.ts +326 -0
- package/src/components/AlignToolbar.tsx +189 -0
- package/src/components/AppRoot.tsx +73 -0
- package/src/components/AssetBrowser.tsx +502 -0
- package/src/components/BottomPanel.tsx +326 -0
- package/src/components/BuildPanel.tsx +455 -0
- package/src/components/CameraInfo.tsx +56 -0
- package/src/components/CommandPalette.tsx +265 -0
- package/src/components/ConsolePanel.tsx +272 -0
- package/src/components/DataPanel.tsx +1268 -0
- package/src/components/DefaultEditorLayout.tsx +509 -0
- package/src/components/FolderTree.tsx +179 -0
- package/src/components/GameHierarchy.tsx +1349 -0
- package/src/components/Inspector.tsx +671 -0
- package/src/components/InspectorToolSection.tsx +74 -0
- package/src/components/MountFailureBanner.tsx +110 -0
- package/src/components/NetworkSection.tsx +109 -0
- package/src/components/OnlineAssetBrowser.tsx +448 -0
- package/src/components/OverlayReportBanner.tsx +122 -0
- package/src/components/PlayBar.tsx +356 -0
- package/src/components/PrefabSaveDialog.tsx +201 -0
- package/src/components/ProjectHeader.tsx +174 -0
- package/src/components/ProjectScreen.tsx +1004 -0
- package/src/components/RightPanel.tsx +166 -0
- package/src/components/RootActivateDialog.tsx +105 -0
- package/src/components/SaveDialog.tsx +197 -0
- package/src/components/SaveStatus.tsx +69 -0
- package/src/components/StatsOverlay.tsx +35 -0
- package/src/components/ToolHost.tsx +80 -0
- package/src/components/Toolbar.tsx +307 -0
- package/src/components/ViewportOverlay.tsx +234 -0
- package/src/components/ViewportPanel.tsx +369 -0
- package/src/components/WorldContextMenu.tsx +257 -0
- package/src/components/WorldSelectionOverlay.tsx +2003 -0
- package/src/components/WorldTextEditor.tsx +86 -0
- package/src/components/asset-viewers/AssetViewer.tsx +38 -0
- package/src/components/asset-viewers/AudioViewer.tsx +149 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +77 -0
- package/src/components/asset-viewers/ImageViewer.tsx +65 -0
- package/src/components/asset-viewers/InputMapViewer.tsx +206 -0
- package/src/components/asset-viewers/ModelViewer.tsx +180 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +236 -0
- package/src/components/data-csv.ts +301 -0
- package/src/components/entity-name-commit.ts +18 -0
- package/src/components/inspector-property-grouping.ts +65 -0
- package/src/components/inspector-widgets/AlignmentGrid.tsx +188 -0
- package/src/components/inspector-widgets/BorderEditor.tsx +305 -0
- package/src/components/inspector-widgets/ColorPicker.tsx +548 -0
- package/src/components/inspector-widgets/FilterEditor.tsx +108 -0
- package/src/components/inspector-widgets/FontPicker.tsx +196 -0
- package/src/components/inspector-widgets/GradientEditor.tsx +277 -0
- package/src/components/inspector-widgets/ScrubbableInput.tsx +152 -0
- package/src/components/inspector-widgets/ShadowEditor.tsx +332 -0
- package/src/components/inspector-widgets/color-utils.ts +202 -0
- package/src/components/inspector-widgets/gallery-main.tsx +167 -0
- package/src/components/inspector-widgets/index.ts +22 -0
- package/src/components/inspector-widgets/shared.tsx +135 -0
- package/src/components/inspectors/AnimationSection.tsx +143 -0
- package/src/components/inspectors/AudioSection.tsx +215 -0
- package/src/components/inspectors/BoneAttachmentSection.tsx +82 -0
- package/src/components/inspectors/CameraSection.tsx +105 -0
- package/src/components/inspectors/ComponentsSection.tsx +358 -0
- package/src/components/inspectors/JointsSection.tsx +255 -0
- package/src/components/inspectors/LightSection.tsx +116 -0
- package/src/components/inspectors/MaterialSection.tsx +1189 -0
- package/src/components/inspectors/MeshSection.tsx +99 -0
- package/src/components/inspectors/NavigationSection.tsx +58 -0
- package/src/components/inspectors/ParticleSection.tsx +681 -0
- package/src/components/inspectors/PhysicsSection.tsx +326 -0
- package/src/components/inspectors/PostProcessingSection.tsx +1290 -0
- package/src/components/inspectors/RenderingSection.tsx +109 -0
- package/src/components/inspectors/ShadowSection.tsx +84 -0
- package/src/components/inspectors/SplineSection.tsx +191 -0
- package/src/components/inspectors/TransformSection.tsx +191 -0
- package/src/components/inspectors/json-schema-fields.ts +281 -0
- package/src/components/inspectors/multi-edit-utils.ts +49 -0
- package/src/components/inspectors/zod-fields.ts +184 -0
- package/src/components/primitives/ColorInput.tsx +109 -0
- package/src/components/primitives/JsonInput.tsx +98 -0
- package/src/components/primitives/NumberInput.tsx +164 -0
- package/src/components/primitives/Panel.tsx +68 -0
- package/src/components/primitives/SectionHeader.tsx +45 -0
- package/src/components/primitives/Tooltip.tsx +82 -0
- package/src/components/primitives/Vec3Input.tsx +62 -0
- package/src/components/world-overlay-gestures.ts +1438 -0
- package/src/doctor/data-checks.ts +285 -0
- package/src/doctor/report.ts +386 -0
- package/src/editor-api.ts +700 -0
- package/src/editor-console.ts +194 -0
- package/src/editor-hotkeys.ts +441 -0
- package/src/editor-layers.ts +2 -0
- package/src/editor-mode.ts +28 -0
- package/src/editor-store.ts +2225 -0
- package/src/editor-viewport.ts +1924 -0
- package/src/entity-factory.ts +221 -0
- package/src/game-globals-prelude.ts +27 -0
- package/src/gated-globals.ts +131 -0
- package/src/generated/setup-by-example.generated.ts +53 -0
- package/src/gizmo-registry.ts +608 -0
- package/src/handle-system.ts +221 -0
- package/src/hierarchy-menu-registry.ts +70 -0
- package/src/hierarchy-rows.ts +73 -0
- package/src/hosted-example.ts +160 -0
- package/src/hotkeys.ts +142 -0
- package/src/ingest/discovery-react.ts +132 -0
- package/src/ingest/discovery.ts +205 -0
- package/src/ingest/discovery2d.ts +204 -0
- package/src/ingest/esm-entry-resolution.ts +102 -0
- package/src/ingest/games/bloom-composer/game.js +99 -0
- package/src/ingest/games/bloom-composer/vgai.game.json +21 -0
- package/src/ingest/games/embed-bundle/embed.html +10 -0
- package/src/ingest/games/embed-bundle/vgai.game.json +21 -0
- package/src/ingest/games/games-fps/assets/collision-world.glb +0 -0
- package/src/ingest/games/games-fps/game.js +479 -0
- package/src/ingest/games/games-fps/vgai.game.json +24 -0
- package/src/ingest/games/iframe-reachable/game-source.js +58 -0
- package/src/ingest/games/iframe-reachable/vgai.game.json +21 -0
- package/src/ingest/games/interactive-cubes/game.js +139 -0
- package/src/ingest/games/interactive-cubes/vgai.game.json +21 -0
- package/src/ingest/games/mismatched-three/fake-three.js +38 -0
- package/src/ingest/games/mismatched-three/game.js +10 -0
- package/src/ingest/games/mismatched-three/vgai.game.json +22 -0
- package/src/ingest/games/own-three-bundled/game.js +43 -0
- package/src/ingest/games/own-three-bundled/vgai.game.json +21 -0
- package/src/ingest/games/pointerlock-maze/game.js +288 -0
- package/src/ingest/games/pointerlock-maze/vgai.game.json +22 -0
- package/src/ingest/games-2d/_fixtures/first-party-scene.scn2d.json +124 -0
- package/src/ingest/games-2d/bubbo-bubbo/vgai.game.json +25 -0
- package/src/ingest/games-2d/bunnymark/game.ts +88 -0
- package/src/ingest/games-2d/bunnymark/vgai.game.json +21 -0
- package/src/ingest/games-2d/flappy/game.ts +148 -0
- package/src/ingest/games-2d/flappy/vgai.game.json +21 -0
- package/src/ingest/games-2d/flappy-pixi/vgai.game.json +25 -0
- package/src/ingest/games-2d/puzzling-potions/vgai.game.json +25 -0
- package/src/ingest/games-2d/tilemap-camera/game.ts +115 -0
- package/src/ingest/games-2d/tilemap-camera/vgai.game.json +21 -0
- package/src/ingest/games-react/react-rpg/entry.tsx +185 -0
- package/src/ingest/games-react/react-rpg/shims.d.ts +26 -0
- package/src/ingest/games-react/react-rpg/src/ui/game-state.tsx +129 -0
- package/src/ingest/games-react/react-rpg/vgai.game.json +21 -0
- package/src/ingest/host-namespace-registry.ts +196 -0
- package/src/ingest/types.ts +127 -0
- package/src/ingest-hierarchy-rows.ts +207 -0
- package/src/ingest-mode.ts +2092 -0
- package/src/ingest-siblings.ts +466 -0
- package/src/initial-scene.ts +194 -0
- package/src/inspector-section-registry.ts +117 -0
- package/src/interactive-edit-scope.ts +34 -0
- package/src/main.tsx +23 -0
- package/src/manifest-project.ts +43 -0
- package/src/model-thumbnail.ts +156 -0
- package/src/module-mode.ts +513 -0
- package/src/navmesh-handler.ts +94 -0
- package/src/packaged-runtime.ts +49 -0
- package/src/play-mode.ts +1148 -0
- package/src/playground/main.ts +206 -0
- package/src/project-manager.ts +173 -0
- package/src/scene-diff.ts +112 -0
- package/src/scene-serializer.ts +144 -0
- package/src/scene-sync.ts +587 -0
- package/src/scene-ui-mode/active-scene-ui.ts +58 -0
- package/src/scene-ui-mode/scene-ui-palette-panel.tsx +152 -0
- package/src/scene-ui-mode/scene-ui-timeline-tab.tsx +29 -0
- package/src/scene-ui-mode/ui-prefab-dialog-host.tsx +74 -0
- package/src/scene-ui-mode/ui-prefab-hierarchy-menu.ts +49 -0
- package/src/scene-ui-mode/ui-prefab-io.ts +76 -0
- package/src/script-loader.ts +143 -0
- package/src/storage/fsa-storage.ts +55 -0
- package/src/storage/handle-storage.ts +150 -0
- package/src/storage/handle-store.ts +116 -0
- package/src/storage/http-storage.ts +137 -0
- package/src/storage/index.ts +147 -0
- package/src/storage/mem-storage.ts +135 -0
- package/src/storage/opfs-storage.ts +25 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/seed.ts +106 -0
- package/src/storage/types.ts +110 -0
- package/src/tool-loader.ts +291 -0
- package/src/ui-editor/inspector.tsx +563 -0
- package/src/ui-editor/node-ops.ts +266 -0
- package/src/ui-editor/overlay.tsx +380 -0
- package/src/ui-editor/palette.tsx +114 -0
- package/src/ui-editor/react-store.ts +78 -0
- package/src/ui-editor/timeline-panel.tsx +443 -0
- package/src/ui-editor/ui-edit-store.ts +552 -0
- package/src/ui-editor/ui-prefab.ts +95 -0
- package/src/ui-source/inspect.ts +544 -0
- package/src/ui-source/oid-transform.ts +133 -0
- package/src/ui-source/source-write-backend.ts +203 -0
- package/src/ui-source/tailwind-map.ts +174 -0
- package/src/ui-source/writer.ts +1175 -0
- package/src/widgets/index.ts +73 -0
- package/template/.claude/skills/editor/SKILL.md +252 -0
- package/template/CLAUDE.md +512 -0
- package/template/LICENSE +30 -0
- package/template/emit-schemas.ts +42 -0
- package/template/index.html +17 -0
- package/template/package.json +53 -0
- package/template/project.json +9 -0
- package/template/public/audio/ambient-arena.wav +0 -0
- package/template/public/audio/ambient-music.wav +0 -0
- package/template/public/audio/ambient-nature.wav +0 -0
- package/template/public/audio/ambient-wind.wav +0 -0
- package/template/public/inputmaps/default.inputmap.json +41 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
- package/template/public/jsm/libs/draco/gltf/draco_encoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/template/public/scenes/default.vscn.json +43 -0
- package/template/public/scenes/untitled.vscn.json +29 -0
- package/template/public/textures/waternormals.jpg +0 -0
- package/template/server/colyseus-setup.ts +85 -0
- package/template/server/main.ts +34 -0
- package/template/server/rooms/arena-room.ts +420 -0
- package/template/server/rooms/game-room.ts +162 -0
- package/template/server/rooms.ts +15 -0
- package/template/server/tsconfig.json +19 -0
- package/template/src/data/README.md +40 -0
- package/template/src/data/assets.ts +31 -0
- package/template/src/data/tuning.data.json +5 -0
- package/template/src/data/tuning.schema.json +21 -0
- package/template/src/data/tuning.schema.ts +34 -0
- package/template/src/data/tuning.ts +24 -0
- package/template/src/main.ts +157 -0
- package/template/src/scripts/components/data-spinner.ts +45 -0
- package/template/src/scripts/components/scene-camera.ts +40 -0
- package/template/src/scripts/main.ts +94 -0
- package/template/src/scripts/registry.ts +46 -0
- package/template/src/tools/README.md +14 -0
- package/template/src/tools/example.tool.tsx +91 -0
- package/template/src/tools/spin.tool.tsx +101 -0
- package/template/src/ui/Button.tsx +27 -0
- package/template/src/ui/DefaultHud.tsx +40 -0
- package/template/src/ui/KeyHint.tsx +25 -0
- package/template/src/ui/Panel.tsx +52 -0
- package/template/src/ui/RebindPanel.tsx +129 -0
- package/template/src/ui/Slider.tsx +28 -0
- package/template/src/ui/StatusDot.tsx +22 -0
- package/template/src/ui/Toggle.tsx +19 -0
- package/template/src/ui/game-state.tsx +37 -0
- package/template/src/ui/index.ts +7 -0
- package/template/src/ui/mount-default-hud.tsx +19 -0
- package/template/src/ui/mount-ui.ts +15 -0
- package/template/tsconfig.json +36 -0
- package/template/validate-asset-content.ts +78 -0
- package/template/validate-manifest.ts +55 -0
- package/template/validate-scenes.ts +211 -0
- package/template/vgai.game.json +21 -0
- package/template/vite.config.ts +128 -0
- package/vite-plugin-example-assets.ts +60 -0
- package/vite-plugin-game-globals.ts +46 -0
- package/vite-plugin-game-static.ts +71 -0
- package/vite-plugin-project-game-static.ts +84 -0
- package/vite-plugin-react-game-static.ts +98 -0
- package/vite-plugin-react-world-provider.ts +81 -0
- package/vite-plugin-react-world-runtime.ts +76 -0
- package/vite-plugin-ui-oid.ts +561 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vite-plugin-react-game-static — serve the vendored react-rpg game's
|
|
3
|
+
* runtime-needed `public/` asset subset (Track N, N2 —
|
|
4
|
+
* docs/REACT-INGEST-LANDING-DESIGN.md D-N7) at the URLs the vendored game's
|
|
5
|
+
* OWN code computes for them — never a game-source edit (the anti-shim
|
|
6
|
+
* rule); this is pure host wiring, mirroring `vite-plugin-game-static.ts`'s
|
|
7
|
+
* precedent for Track P.
|
|
8
|
+
*
|
|
9
|
+
* Two call sites, read directly off `vendor/react-games/react-rpg/src`:
|
|
10
|
+
*
|
|
11
|
+
* - `src/features/dialog-manager/dialogs/game-select/index.jsx` has a
|
|
12
|
+
* literal `src="/logo-no-bg.png"` — an absolute ROOT path, verbatim.
|
|
13
|
+
* - `src/config/constants.js`'s `GET_REF_URL()` builds a tile-asset BASE
|
|
14
|
+
* URL from its own `import.meta.url`, slicing off everything from the
|
|
15
|
+
* literal substring `'src'` onward and appending `'tiles/'`. Upstream's
|
|
16
|
+
* own repo serves this module at `/src/config/constants.js` (Vite root =
|
|
17
|
+
* their repo root), so the slice keeps `import.meta.url`'s ORIGIN and
|
|
18
|
+
* nothing else, yielding an origin-rooted `/tiles/` URL there.
|
|
19
|
+
*
|
|
20
|
+
* EMPIRICAL FINDING (an earlier vendoring attempt got this wrong — kept
|
|
21
|
+
* for the record, since it's not obvious): the vendored folder here is
|
|
22
|
+
* named `src/`, matching upstream EXACTLY — NOT renamed (the pixi
|
|
23
|
+
* precedent's convention would suggest `game/`, and `docs/REACT-INGEST-
|
|
24
|
+
* LANDING-DESIGN.md` D-N5 even suggests it, but a renamed folder actively
|
|
25
|
+
* BREAKS this game: this dev server's URL for `constants.js` is
|
|
26
|
+
* `http://<host>/vendor/react-games/react-rpg/game/config/constants.js`
|
|
27
|
+
* if renamed — which contains NO `'src'` substring anywhere, so
|
|
28
|
+
* `indexOf('src')` returns `-1`; `String.prototype.substring` clamps a
|
|
29
|
+
* negative end to `0`, so the slice degenerates to `''`, and the computed
|
|
30
|
+
* "URL" is the bare string `'tiles/'` — NOT a valid absolute URL. The
|
|
31
|
+
* game's own `features/map/map-padding.jsx` then does
|
|
32
|
+
* `new URL('./tile.png', REF_URL)`, and `new URL()`'s second argument
|
|
33
|
+
* (base) MUST itself be a valid absolute URL or the constructor THROWS
|
|
34
|
+
* (`TypeError: Failed to construct 'URL': Invalid base URL`) — verified
|
|
35
|
+
* against the real dev server; this is a hard runtime crash the moment
|
|
36
|
+
* the dungeon view tries to render a single tile, not a cosmetic issue.
|
|
37
|
+
* Keeping the folder named `src/` makes `indexOf('src')` find the REAL
|
|
38
|
+
* segment, so the slice yields a genuine origin-rooted URL prefix:
|
|
39
|
+
* `http://<host>/vendor/react-games/react-rpg/` + `'tiles/'` ==
|
|
40
|
+
* `http://<host>/vendor/react-games/react-rpg/tiles/` — the route this
|
|
41
|
+
* plugin serves below. (`verify-unaltered.mjs`'s doc comment records the
|
|
42
|
+
* same finding from the zero-diff-script side.)
|
|
43
|
+
*
|
|
44
|
+
* Scope: this plugin unconditionally claims `/logo-no-bg.png` and
|
|
45
|
+
* `/vendor/react-games/react-rpg/tiles/*` at the editor's own root/vendor
|
|
46
|
+
* path, same tradeoff `vite-plugin-game-static.ts` accepts for
|
|
47
|
+
* `/pixi-game-static/` — acceptable because nothing else in this repo claims
|
|
48
|
+
* either path today. `/tiles/*` (a page-relative fallback, in case a future
|
|
49
|
+
* checkout path ever contains the substring `'src'` in an earlier segment,
|
|
50
|
+
* which would shift where the slice lands) is also served, defensively.
|
|
51
|
+
*/
|
|
52
|
+
import { readFile } from 'node:fs/promises';
|
|
53
|
+
import { extname, join, normalize, resolve } from 'node:path';
|
|
54
|
+
import type { Plugin } from 'vite';
|
|
55
|
+
|
|
56
|
+
const MIME: Record<string, string> = {
|
|
57
|
+
'.png': 'image/png',
|
|
58
|
+
'.jpg': 'image/jpeg',
|
|
59
|
+
'.jpeg': 'image/jpeg',
|
|
60
|
+
'.webp': 'image/webp',
|
|
61
|
+
'.svg': 'image/svg+xml',
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const TILES_URL_PREFIXES = ['/tiles/', '/vendor/react-games/react-rpg/tiles/'];
|
|
65
|
+
|
|
66
|
+
export function reactGameStaticPlugin(repoRoot: string): Plugin {
|
|
67
|
+
const publicRoot = resolve(repoRoot, 'vendor/react-games/react-rpg/public');
|
|
68
|
+
return {
|
|
69
|
+
name: 'vgai-react-game-static',
|
|
70
|
+
configureServer(server) {
|
|
71
|
+
server.middlewares.use(async (req, res, next) => {
|
|
72
|
+
const url = (req.url ?? '').split('?')[0] ?? '';
|
|
73
|
+
const tilesPrefix = TILES_URL_PREFIXES.find((p) => url.startsWith(p));
|
|
74
|
+
const relPath =
|
|
75
|
+
url === '/logo-no-bg.png'
|
|
76
|
+
? url
|
|
77
|
+
: tilesPrefix && `/tiles/${url.slice(tilesPrefix.length)}`;
|
|
78
|
+
if (!relPath) return next();
|
|
79
|
+
try {
|
|
80
|
+
const filePath = normalize(join(publicRoot, relPath));
|
|
81
|
+
// path-traversal guard: stay inside publicRoot
|
|
82
|
+
if (!filePath.startsWith(publicRoot)) {
|
|
83
|
+
res.statusCode = 403;
|
|
84
|
+
res.end('forbidden');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const buf = await readFile(filePath);
|
|
88
|
+
res.setHeader('Content-Type', MIME[extname(filePath)] ?? 'application/octet-stream');
|
|
89
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
90
|
+
res.statusCode = 200;
|
|
91
|
+
res.end(buf);
|
|
92
|
+
} catch {
|
|
93
|
+
next();
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vite plugin: a tiny synthetic ES module that STATICALLY re-exports
|
|
3
|
+
* `GameProvider` from a given project's `src/ui/game-state.tsx`
|
|
4
|
+
* (T6.2 slice 3 finding — see `packages/editor/src/adapter-resolver.ts`'s
|
|
5
|
+
* `loadProjectGameProvider` doc comment for the full mechanism this closes).
|
|
6
|
+
*
|
|
7
|
+
* The problem this solves: `resolveDefaultReactAdapter` needs `GameProvider`
|
|
8
|
+
* from the SAME `game-state.tsx` module instance a react world's entry
|
|
9
|
+
* module's OWN static relative import (`import { useGameState } from
|
|
10
|
+
* './src/ui/game-state'`) resolves to — otherwise `<GameProvider>`
|
|
11
|
+
* and `useGameState`'s `useGame()` read/write DIFFERENT `createContext()`
|
|
12
|
+
* objects and `useGame()` throws "no Game in context" even though
|
|
13
|
+
* `<GameProvider>` genuinely wraps the tree. `adapter-resolver.ts` cannot
|
|
14
|
+
* import `game-state.tsx` directly with a hand-built runtime `/@fs/` string
|
|
15
|
+
* (`import(/* @vite-ignore *\/ computedPath)`) and expect it to land on the
|
|
16
|
+
* SAME module: verified empirically (T6.2 slice 3's AC e2e, and this
|
|
17
|
+
* plugin's own doc history) that Vite's dev server treats a raw dynamic
|
|
18
|
+
* `/@fs/` fetch differently from its own rewrite of a STATIC relative
|
|
19
|
+
* import found while transforming a `.tsx` file — the two request URLs
|
|
20
|
+
* diverge (a query-string difference observed in practice), and since
|
|
21
|
+
* browser ES module identity is per-exact-URL, that is enough to produce
|
|
22
|
+
* TWO separate module instances even though both point at the identical
|
|
23
|
+
* file on disk.
|
|
24
|
+
*
|
|
25
|
+
* The fix: make the resolver's own request for `GameProvider` go through
|
|
26
|
+
* the SAME transform-time static-import rewrite Vite already applies to a
|
|
27
|
+
* react-world entry's own relative import, by asking Vite to transform a
|
|
28
|
+
* SYNTHETIC module whose body is nothing but a literal, static
|
|
29
|
+
* `export { GameProvider } from '/@fs/<projectRoot>/src/ui/
|
|
30
|
+
* game-state.tsx';` — that specifier is resolved by the SAME plugin
|
|
31
|
+
* machinery (Vite's own `resolveId`) an entry module's static import goes
|
|
32
|
+
* through, so both converge on the identical final module.
|
|
33
|
+
*/
|
|
34
|
+
import type { Plugin } from 'vite';
|
|
35
|
+
|
|
36
|
+
/** The dynamic-import-facing URL prefix (`?root=<projectRoot>` query). */
|
|
37
|
+
export const REACT_WORLD_PROVIDER_PATH = '/__vgai-game-provider';
|
|
38
|
+
|
|
39
|
+
const VIRTUAL_ID_PREFIX = '\0vgai-game-provider:';
|
|
40
|
+
|
|
41
|
+
/** Build the dynamic-import specifier `adapter-resolver.ts` uses. */
|
|
42
|
+
export function reactWorldProviderImportSpecifier(projectRoot: string): string {
|
|
43
|
+
return `${REACT_WORLD_PROVIDER_PATH}?root=${encodeURIComponent(projectRoot)}`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function reactWorldProviderPlugin(): Plugin {
|
|
47
|
+
return {
|
|
48
|
+
name: 'vgai-react-world-provider',
|
|
49
|
+
resolveId(id) {
|
|
50
|
+
if (id.startsWith(REACT_WORLD_PROVIDER_PATH)) {
|
|
51
|
+
const query = id.slice(REACT_WORLD_PROVIDER_PATH.length);
|
|
52
|
+
return VIRTUAL_ID_PREFIX + query;
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
},
|
|
56
|
+
load(id) {
|
|
57
|
+
if (!id.startsWith(VIRTUAL_ID_PREFIX)) return undefined;
|
|
58
|
+
const query = id.slice(VIRTUAL_ID_PREFIX.length);
|
|
59
|
+
const params = new URLSearchParams(query.startsWith('?') ? query.slice(1) : query);
|
|
60
|
+
const projectRoot = params.get('root');
|
|
61
|
+
if (!projectRoot) {
|
|
62
|
+
throw new Error(
|
|
63
|
+
`vgai-react-world-provider: missing \`?root=\` (got id "${id}") — ` +
|
|
64
|
+
'reactWorldProviderImportSpecifier() should always supply it.',
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
// Windows roots arrive as 'C:\…' — no leading slash and backslashed.
|
|
68
|
+
// Normalize to Vite's canonical '/@fs/C:/…' form; the bare-concat form
|
|
69
|
+
// degenerates to '/@fsC:\…', which Vite cannot serve. POSIX roots
|
|
70
|
+
// (leading '/') keep the original concat shape.
|
|
71
|
+
const rootUrlPath = projectRoot.replace(/\\/g, '/');
|
|
72
|
+
const gameStatePath = `/@fs${rootUrlPath.startsWith('/') ? '' : '/'}${rootUrlPath}/src/ui/game-state.tsx`;
|
|
73
|
+
// A LITERAL static specifier — Vite's own import-analysis rewrites this
|
|
74
|
+
// the SAME way it rewrites a react-world entry's own relative import
|
|
75
|
+
// to the same file (both are static specifiers processed by the same
|
|
76
|
+
// resolver at transform time), which is what makes the two converge on
|
|
77
|
+
// one module instance.
|
|
78
|
+
return `export { GameProvider } from ${JSON.stringify(gameStatePath)};\n`;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vite plugin: a tiny synthetic ES module that STATICALLY re-exports
|
|
3
|
+
* `createElement` (react), `createRoot`/`flushSync` (react-dom/client,
|
|
4
|
+
* react-dom), and the engine-published `GameProvider` fallback
|
|
5
|
+
* (`@engine/react/game-state`) —
|
|
6
|
+
* PACKAGED-runtime-only sibling of `vite-plugin-react-world-provider.ts`,
|
|
7
|
+
* closing the "second, deeper gap" that file's mechanism doesn't reach (see
|
|
8
|
+
* `packages/editor/server/packaged.ts`'s header doc comment, "React-world OID
|
|
9
|
+
* authoring parity" section, and `adapter-resolver.ts`'s
|
|
10
|
+
* `resolveReactWorldMountRuntime` doc comment for the full mechanism this
|
|
11
|
+
* fixes).
|
|
12
|
+
*
|
|
13
|
+
* The problem this solves: under the packaged runtime (`packaged.ts` — a
|
|
14
|
+
* `@vgai/editor` npm package with NO monorepo checkout), the editor's OWN
|
|
15
|
+
* `react`/`react-dom/client` are STATICALLY bundled into its prebuilt SPA
|
|
16
|
+
* (`dist/`, built once at `npm run build -w @vgai/editor` time) — a totally
|
|
17
|
+
* separate, already-built bundle, physically disconnected from the SEPARATE,
|
|
18
|
+
* project-rooted Vite instance `packaged.ts` boots to serve the opened
|
|
19
|
+
* project's own module graph (which resolves bare `react` from the
|
|
20
|
+
* PROJECT's own `node_modules`, per that Vite instance's `root`). Mounting a
|
|
21
|
+
* react world with `createRoot` from the editor's bundle while the entry
|
|
22
|
+
* component's hooks run against the project's own `react` produces TWO
|
|
23
|
+
* separate React module instances — `useContext`/`useState` etc. read/write
|
|
24
|
+
* different internal singletons, and `useContext` throws on a `null`
|
|
25
|
+
* dispatcher (confirmed live, `packaged.ts`'s header doc comment).
|
|
26
|
+
*
|
|
27
|
+
* `dev.ts`/the Electron `prod.ts` path have no such split (ONE shared Vite
|
|
28
|
+
* instance + repo-root `vite.config.ts`'s `resolve.dedupe: ['react',
|
|
29
|
+
* 'react-dom', ...]` already collapses the editor's own react and the
|
|
30
|
+
* project's react onto one module instance) — this plugin is registered
|
|
31
|
+
* ONLY on the packaged runtime's project-rooted Vite instance (`packaged.ts`)
|
|
32
|
+
* plus the root `vitest.config.ts` (so this branch is exercisable from a
|
|
33
|
+
* headless unit test, same precedent as `reactWorldProviderPlugin`'s own
|
|
34
|
+
* vitest registration) — never on `dev.ts`/the root `vite.config.ts` dev/
|
|
35
|
+
* Electron path, which must stay byte-unchanged.
|
|
36
|
+
*
|
|
37
|
+
* The fix mirrors `vite-plugin-react-world-provider.ts`'s: ask Vite to
|
|
38
|
+
* transform a SYNTHETIC module whose body is nothing but literal, STATIC
|
|
39
|
+
* `export … from '<bare-or-aliased specifier>'` lines — those specifiers go
|
|
40
|
+
* through the SAME transform-time resolver (and the SAME `optimizeDeps`
|
|
41
|
+
* prebundle cache) a react-world entry module's own static `import react
|
|
42
|
+
* from 'react'` goes through, so both converge on the identical `react`/
|
|
43
|
+
* `react-dom/client` module instances. No `?root=` parameterization is
|
|
44
|
+
* needed here (unlike the GameProvider plugin): `react`, `react-dom/client`,
|
|
45
|
+
* and `@engine/react/game-state` are all resolved relative to THIS Vite
|
|
46
|
+
* instance's own root/aliases, not a per-project file path.
|
|
47
|
+
*/
|
|
48
|
+
import type { Plugin } from 'vite';
|
|
49
|
+
|
|
50
|
+
/** The dynamic-import-facing URL `adapter-resolver.ts` imports. */
|
|
51
|
+
export const REACT_WORLD_RUNTIME_PATH = '/__vgai-react-world-runtime';
|
|
52
|
+
|
|
53
|
+
const VIRTUAL_ID = '\0vgai-react-world-runtime';
|
|
54
|
+
|
|
55
|
+
export function reactWorldRuntimePlugin(): Plugin {
|
|
56
|
+
return {
|
|
57
|
+
name: 'vgai-react-world-runtime',
|
|
58
|
+
resolveId(id) {
|
|
59
|
+
if (id === REACT_WORLD_RUNTIME_PATH) return VIRTUAL_ID;
|
|
60
|
+
return undefined;
|
|
61
|
+
},
|
|
62
|
+
load(id) {
|
|
63
|
+
if (id !== VIRTUAL_ID) return undefined;
|
|
64
|
+
return [
|
|
65
|
+
"export { createElement } from 'react';",
|
|
66
|
+
"export { createRoot } from 'react-dom/client';",
|
|
67
|
+
// `flushSync` — needed by `design-time-layers.ts`'s react-world layer
|
|
68
|
+
// mount (its synchronous initial render), from the SAME react-dom
|
|
69
|
+
// peer as `createRoot` above (react-dom/client and react-dom are the
|
|
70
|
+
// same installed package's two entry points).
|
|
71
|
+
"export { flushSync } from 'react-dom';",
|
|
72
|
+
"export { GameProvider as EngineGameProvider } from '@engine/react/game-state';",
|
|
73
|
+
].join('\n');
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|