@nimbus-sh/worker 0.1.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/README.md +219 -0
- package/dist/_shared/bytes.d.ts +18 -0
- package/dist/_shared/bytes.d.ts.map +1 -0
- package/dist/_shared/bytes.js +17 -0
- package/dist/_shared/cache-stats.d.ts +146 -0
- package/dist/_shared/cache-stats.d.ts.map +1 -0
- package/dist/_shared/cache-stats.js +162 -0
- package/dist/_shared/exports-resolver.d.ts +76 -0
- package/dist/_shared/exports-resolver.d.ts.map +1 -0
- package/dist/_shared/exports-resolver.js +284 -0
- package/dist/_shared/install-phase.d.ts +47 -0
- package/dist/_shared/install-phase.d.ts.map +1 -0
- package/dist/_shared/install-phase.js +1 -0
- package/dist/_shared/real-node-imports.d.ts +38 -0
- package/dist/_shared/real-node-imports.d.ts.map +1 -0
- package/dist/_shared/real-node-imports.js +46 -0
- package/dist/_shared/retry.d.ts +93 -0
- package/dist/_shared/retry.d.ts.map +1 -0
- package/dist/_shared/retry.js +161 -0
- package/dist/_shared/session-id.d.ts +39 -0
- package/dist/_shared/session-id.d.ts.map +1 -0
- package/dist/_shared/session-id.js +127 -0
- package/dist/_shared/session-router.d.ts +104 -0
- package/dist/_shared/session-router.d.ts.map +1 -0
- package/dist/_shared/session-router.js +165 -0
- package/dist/_shared/w7-frame.d.ts +93 -0
- package/dist/_shared/w7-frame.d.ts.map +1 -0
- package/dist/_shared/w7-frame.js +402 -0
- package/dist/auth/index.d.ts +16 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +15 -0
- package/dist/auth/middleware.d.ts +85 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +150 -0
- package/dist/auth/token.d.ts +96 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +226 -0
- package/dist/auth/types.d.ts +141 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +114 -0
- package/dist/bindings/d1.d.ts +102 -0
- package/dist/bindings/d1.d.ts.map +1 -0
- package/dist/bindings/d1.js +549 -0
- package/dist/bindings/kv.d.ts +82 -0
- package/dist/bindings/kv.d.ts.map +1 -0
- package/dist/bindings/kv.js +290 -0
- package/dist/bindings/r2.d.ts +137 -0
- package/dist/bindings/r2.d.ts.map +1 -0
- package/dist/bindings/r2.js +379 -0
- package/dist/cirrus-npm-cjs.generated.d.ts +17 -0
- package/dist/cirrus-npm-cjs.generated.d.ts.map +1 -0
- package/dist/cirrus-npm-cjs.generated.js +41 -0
- package/dist/cirrus-plugin-react.generated.d.ts +34 -0
- package/dist/cirrus-plugin-react.generated.d.ts.map +1 -0
- package/dist/cirrus-plugin-react.generated.js +33 -0
- package/dist/constants.d.ts +34 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +116 -0
- package/dist/esbuild-wasm-bundle.generated.d.ts +41 -0
- package/dist/esbuild-wasm-bundle.generated.d.ts.map +1 -0
- package/dist/esbuild-wasm-bundle.generated.js +40 -0
- package/dist/facets/cirrus-real.d.ts +147 -0
- package/dist/facets/cirrus-real.d.ts.map +1 -0
- package/dist/facets/cirrus-real.js +981 -0
- package/dist/facets/inner-do-registry.d.ts +41 -0
- package/dist/facets/inner-do-registry.d.ts.map +1 -0
- package/dist/facets/inner-do-registry.js +51 -0
- package/dist/facets/manager.d.ts +314 -0
- package/dist/facets/manager.d.ts.map +1 -0
- package/dist/facets/manager.js +2681 -0
- package/dist/facets/process.d.ts +318 -0
- package/dist/facets/process.d.ts.map +1 -0
- package/dist/facets/process.js +567 -0
- package/dist/facets/real-vite-fs-shim.d.ts +151 -0
- package/dist/facets/real-vite-fs-shim.d.ts.map +1 -0
- package/dist/facets/real-vite-fs-shim.js +1279 -0
- package/dist/facets/real-vite-hmr.d.ts +142 -0
- package/dist/facets/real-vite-hmr.d.ts.map +1 -0
- package/dist/facets/real-vite-hmr.js +476 -0
- package/dist/facets/vite-dev-server.d.ts +293 -0
- package/dist/facets/vite-dev-server.d.ts.map +1 -0
- package/dist/facets/vite-dev-server.js +2580 -0
- package/dist/facets/wasm-swap-registry.d.ts +261 -0
- package/dist/facets/wasm-swap-registry.d.ts.map +1 -0
- package/dist/facets/wasm-swap-registry.js +551 -0
- package/dist/facets/ws-terminal.d.ts +107 -0
- package/dist/facets/ws-terminal.d.ts.map +1 -0
- package/dist/facets/ws-terminal.js +207 -0
- package/dist/git/commands.d.ts +13 -0
- package/dist/git/commands.d.ts.map +1 -0
- package/dist/git/commands.js +633 -0
- package/dist/git/network-facet.d.ts +61 -0
- package/dist/git/network-facet.d.ts.map +1 -0
- package/dist/git/network-facet.js +700 -0
- package/dist/git-bundle.generated.d.ts +16 -0
- package/dist/git-bundle.generated.d.ts.map +1 -0
- package/dist/git-bundle.generated.js +15 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/loaders/child-process/spawn-facet.d.ts +90 -0
- package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -0
- package/dist/loaders/child-process/spawn-facet.js +103 -0
- package/dist/loaders/child-process/spawn-pool.d.ts +110 -0
- package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -0
- package/dist/loaders/child-process/spawn-pool.js +161 -0
- package/dist/loaders/fanout-pool.d.ts +195 -0
- package/dist/loaders/fanout-pool.d.ts.map +1 -0
- package/dist/loaders/fanout-pool.js +326 -0
- package/dist/loaders/generated-workers.d.ts +26 -0
- package/dist/loaders/generated-workers.d.ts.map +1 -0
- package/dist/loaders/generated-workers.js +25 -0
- package/dist/loaders/index.d.ts +15 -0
- package/dist/loaders/index.d.ts.map +1 -0
- package/dist/loaders/index.js +13 -0
- package/dist/loaders/loader-pool.d.ts +273 -0
- package/dist/loaders/loader-pool.d.ts.map +1 -0
- package/dist/loaders/loader-pool.js +624 -0
- package/dist/loaders/npm-resolve-preamble.d.ts +34 -0
- package/dist/loaders/npm-resolve-preamble.d.ts.map +1 -0
- package/dist/loaders/npm-resolve-preamble.js +237 -0
- package/dist/loaders/pre-bundle-preamble.d.ts +41 -0
- package/dist/loaders/pre-bundle-preamble.d.ts.map +1 -0
- package/dist/loaders/pre-bundle-preamble.js +114 -0
- package/dist/loaders/vendor/codegen.d.ts +24 -0
- package/dist/loaders/vendor/codegen.d.ts.map +1 -0
- package/dist/loaders/vendor/codegen.js +44 -0
- package/dist/loaders/vendor/errors.d.ts +24 -0
- package/dist/loaders/vendor/errors.d.ts.map +1 -0
- package/dist/loaders/vendor/errors.js +46 -0
- package/dist/loaders/vendor/index.d.ts +16 -0
- package/dist/loaders/vendor/index.d.ts.map +1 -0
- package/dist/loaders/vendor/index.js +11 -0
- package/dist/loaders/vendor/pool.d.ts +88 -0
- package/dist/loaders/vendor/pool.d.ts.map +1 -0
- package/dist/loaders/vendor/pool.js +353 -0
- package/dist/loaders/vendor/primitives.d.ts +11 -0
- package/dist/loaders/vendor/primitives.d.ts.map +1 -0
- package/dist/loaders/vendor/primitives.js +33 -0
- package/dist/loaders/vendor/serialize.d.ts +3 -0
- package/dist/loaders/vendor/serialize.d.ts.map +1 -0
- package/dist/loaders/vendor/serialize.js +25 -0
- package/dist/loaders/vendor/types.d.ts +60 -0
- package/dist/loaders/vendor/types.d.ts.map +1 -0
- package/dist/loaders/vendor/types.js +4 -0
- package/dist/npm/cache.d.ts +136 -0
- package/dist/npm/cache.d.ts.map +1 -0
- package/dist/npm/cache.js +429 -0
- package/dist/npm/install-batch-facet.d.ts +129 -0
- package/dist/npm/install-batch-facet.d.ts.map +1 -0
- package/dist/npm/install-batch-facet.js +598 -0
- package/dist/npm/install-facet.d.ts +29 -0
- package/dist/npm/install-facet.d.ts.map +1 -0
- package/dist/npm/install-facet.js +9 -0
- package/dist/npm/installer.d.ts +239 -0
- package/dist/npm/installer.d.ts.map +1 -0
- package/dist/npm/installer.js +2022 -0
- package/dist/npm/npx-install.d.ts +74 -0
- package/dist/npm/npx-install.d.ts.map +1 -0
- package/dist/npm/npx-install.js +302 -0
- package/dist/npm/pre-bundle-facet.d.ts +168 -0
- package/dist/npm/pre-bundle-facet.d.ts.map +1 -0
- package/dist/npm/pre-bundle-facet.js +653 -0
- package/dist/npm/r2-cache.d.ts +286 -0
- package/dist/npm/r2-cache.d.ts.map +1 -0
- package/dist/npm/r2-cache.js +506 -0
- package/dist/npm/resolve-facet.d.ts +202 -0
- package/dist/npm/resolve-facet.d.ts.map +1 -0
- package/dist/npm/resolve-facet.js +833 -0
- package/dist/npm/resolve-one-facet.d.ts +204 -0
- package/dist/npm/resolve-one-facet.d.ts.map +1 -0
- package/dist/npm/resolve-one-facet.js +437 -0
- package/dist/npm/resolver.d.ts +109 -0
- package/dist/npm/resolver.d.ts.map +1 -0
- package/dist/npm/resolver.js +899 -0
- package/dist/npm/tarball-stream.d.ts +85 -0
- package/dist/npm/tarball-stream.d.ts.map +1 -0
- package/dist/npm/tarball-stream.js +205 -0
- package/dist/npm/tarball.d.ts +51 -0
- package/dist/npm/tarball.d.ts.map +1 -0
- package/dist/npm/tarball.js +185 -0
- package/dist/observability/diag-counters.d.ts +292 -0
- package/dist/observability/diag-counters.d.ts.map +1 -0
- package/dist/observability/diag-counters.js +302 -0
- package/dist/observability/heap-estimate.d.ts +166 -0
- package/dist/observability/heap-estimate.d.ts.map +1 -0
- package/dist/observability/heap-estimate.js +192 -0
- package/dist/observability/heavy-alloc-coord.d.ts +95 -0
- package/dist/observability/heavy-alloc-coord.d.ts.map +1 -0
- package/dist/observability/heavy-alloc-coord.js +149 -0
- package/dist/observability/oom-classify.d.ts +56 -0
- package/dist/observability/oom-classify.d.ts.map +1 -0
- package/dist/observability/oom-classify.js +118 -0
- package/dist/observability/oom-discriminator.d.ts +192 -0
- package/dist/observability/oom-discriminator.d.ts.map +1 -0
- package/dist/observability/oom-discriminator.js +233 -0
- package/dist/real-vite-bundle.generated.d.ts +46 -0
- package/dist/real-vite-bundle.generated.d.ts.map +1 -0
- package/dist/real-vite-bundle.generated.js +53 -0
- package/dist/replica/routing.d.ts +171 -0
- package/dist/replica/routing.d.ts.map +1 -0
- package/dist/replica/routing.js +288 -0
- package/dist/replica/suspension.d.ts +36 -0
- package/dist/replica/suspension.d.ts.map +1 -0
- package/dist/replica/suspension.js +49 -0
- package/dist/router/index.d.ts +156 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +220 -0
- package/dist/runtime/assets-loader.d.ts +71 -0
- package/dist/runtime/assets-loader.d.ts.map +1 -0
- package/dist/runtime/assets-loader.js +128 -0
- package/dist/runtime/barrel-detect.d.ts +46 -0
- package/dist/runtime/barrel-detect.d.ts.map +1 -0
- package/dist/runtime/barrel-detect.js +73 -0
- package/dist/runtime/barrel-synthesizer.d.ts +181 -0
- package/dist/runtime/barrel-synthesizer.d.ts.map +1 -0
- package/dist/runtime/barrel-synthesizer.js +541 -0
- package/dist/runtime/bun-repl.d.ts +46 -0
- package/dist/runtime/bun-repl.d.ts.map +1 -0
- package/dist/runtime/bun-repl.js +326 -0
- package/dist/runtime/bun-runner.d.ts +66 -0
- package/dist/runtime/bun-runner.d.ts.map +1 -0
- package/dist/runtime/bun-runner.js +219 -0
- package/dist/runtime/clang-runner.d.ts +38 -0
- package/dist/runtime/clang-runner.d.ts.map +1 -0
- package/dist/runtime/clang-runner.js +1033 -0
- package/dist/runtime/comment-strip.d.ts +37 -0
- package/dist/runtime/comment-strip.d.ts.map +1 -0
- package/dist/runtime/comment-strip.js +74 -0
- package/dist/runtime/esbuild-service.d.ts +201 -0
- package/dist/runtime/esbuild-service.d.ts.map +1 -0
- package/dist/runtime/esbuild-service.js +1444 -0
- package/dist/runtime/esbuild-wasm-bytes.d.ts +87 -0
- package/dist/runtime/esbuild-wasm-bytes.d.ts.map +1 -0
- package/dist/runtime/esbuild-wasm-bytes.js +131 -0
- package/dist/runtime/framework-detect.d.ts +71 -0
- package/dist/runtime/framework-detect.d.ts.map +1 -0
- package/dist/runtime/framework-detect.js +178 -0
- package/dist/runtime/long-running-handle.d.ts +133 -0
- package/dist/runtime/long-running-handle.d.ts.map +1 -0
- package/dist/runtime/long-running-handle.js +192 -0
- package/dist/runtime/node-repl.d.ts +36 -0
- package/dist/runtime/node-repl.d.ts.map +1 -0
- package/dist/runtime/node-repl.js +293 -0
- package/dist/runtime/node-runner.d.ts +111 -0
- package/dist/runtime/node-runner.d.ts.map +1 -0
- package/dist/runtime/node-runner.js +194 -0
- package/dist/runtime/node-shims.d.ts +24 -0
- package/dist/runtime/node-shims.d.ts.map +1 -0
- package/dist/runtime/node-shims.js +3019 -0
- package/dist/runtime/package-manager.d.ts +118 -0
- package/dist/runtime/package-manager.d.ts.map +1 -0
- package/dist/runtime/package-manager.js +420 -0
- package/dist/runtime/port-registry.d.ts +80 -0
- package/dist/runtime/port-registry.d.ts.map +1 -0
- package/dist/runtime/port-registry.js +166 -0
- package/dist/runtime/process-logs-api.d.ts +102 -0
- package/dist/runtime/process-logs-api.d.ts.map +1 -0
- package/dist/runtime/process-logs-api.js +253 -0
- package/dist/runtime/process-logs.d.ts +311 -0
- package/dist/runtime/process-logs.d.ts.map +1 -0
- package/dist/runtime/process-logs.js +656 -0
- package/dist/runtime/process-table.d.ts +65 -0
- package/dist/runtime/process-table.d.ts.map +1 -0
- package/dist/runtime/process-table.js +107 -0
- package/dist/runtime/project-detect.d.ts +21 -0
- package/dist/runtime/project-detect.d.ts.map +1 -0
- package/dist/runtime/project-detect.js +46 -0
- package/dist/runtime/python-repl.d.ts +66 -0
- package/dist/runtime/python-repl.d.ts.map +1 -0
- package/dist/runtime/python-repl.js +563 -0
- package/dist/runtime/python-runner.d.ts +50 -0
- package/dist/runtime/python-runner.d.ts.map +1 -0
- package/dist/runtime/python-runner.js +870 -0
- package/dist/runtime/repl-session.d.ts +160 -0
- package/dist/runtime/repl-session.d.ts.map +1 -0
- package/dist/runtime/repl-session.js +393 -0
- package/dist/runtime/require-resolver.d.ts +52 -0
- package/dist/runtime/require-resolver.d.ts.map +1 -0
- package/dist/runtime/require-resolver.js +690 -0
- package/dist/runtime/router-basename.d.ts +36 -0
- package/dist/runtime/router-basename.d.ts.map +1 -0
- package/dist/runtime/router-basename.js +310 -0
- package/dist/runtime/ruby-repl.d.ts +43 -0
- package/dist/runtime/ruby-repl.d.ts.map +1 -0
- package/dist/runtime/ruby-repl.js +229 -0
- package/dist/runtime/ruby-runner.d.ts +62 -0
- package/dist/runtime/ruby-runner.d.ts.map +1 -0
- package/dist/runtime/ruby-runner.js +737 -0
- package/dist/runtime/runtime-catalog.d.ts +99 -0
- package/dist/runtime/runtime-catalog.d.ts.map +1 -0
- package/dist/runtime/runtime-catalog.js +183 -0
- package/dist/runtime/runtime-registry.d.ts +136 -0
- package/dist/runtime/runtime-registry.d.ts.map +1 -0
- package/dist/runtime/runtime-registry.js +318 -0
- package/dist/runtime/streams.d.ts +13 -0
- package/dist/runtime/streams.d.ts.map +1 -0
- package/dist/runtime/streams.js +402 -0
- package/dist/runtime/wasi-instance.d.ts +190 -0
- package/dist/runtime/wasi-instance.d.ts.map +1 -0
- package/dist/runtime/wasi-instance.js +2044 -0
- package/dist/runtime/wasm-runner.d.ts +117 -0
- package/dist/runtime/wasm-runner.d.ts.map +1 -0
- package/dist/runtime/wasm-runner.js +705 -0
- package/dist/session/bindings.d.ts +168 -0
- package/dist/session/bindings.d.ts.map +1 -0
- package/dist/session/bindings.js +524 -0
- package/dist/session/ctx-exports.d.ts +16 -0
- package/dist/session/ctx-exports.d.ts.map +1 -0
- package/dist/session/ctx-exports.js +22 -0
- package/dist/session/diag.d.ts +62 -0
- package/dist/session/diag.d.ts.map +1 -0
- package/dist/session/diag.js +118 -0
- package/dist/session/fs-watch.d.ts +132 -0
- package/dist/session/fs-watch.d.ts.map +1 -0
- package/dist/session/fs-watch.js +255 -0
- package/dist/session/helpers.d.ts +150 -0
- package/dist/session/helpers.d.ts.map +1 -0
- package/dist/session/helpers.js +472 -0
- package/dist/session/hibernation.d.ts +145 -0
- package/dist/session/hibernation.d.ts.map +1 -0
- package/dist/session/hibernation.js +385 -0
- package/dist/session/init-phases.d.ts +87 -0
- package/dist/session/init-phases.d.ts.map +1 -0
- package/dist/session/init-phases.js +137 -0
- package/dist/session/init.d.ts +46 -0
- package/dist/session/init.d.ts.map +1 -0
- package/dist/session/init.js +3579 -0
- package/dist/session/keys.d.ts +56 -0
- package/dist/session/keys.d.ts.map +1 -0
- package/dist/session/keys.js +55 -0
- package/dist/session/nimbus-session.d.ts +434 -0
- package/dist/session/nimbus-session.d.ts.map +1 -0
- package/dist/session/nimbus-session.js +1084 -0
- package/dist/session/programmatic.d.ts +105 -0
- package/dist/session/programmatic.d.ts.map +1 -0
- package/dist/session/programmatic.js +326 -0
- package/dist/session/replica-routes.d.ts +68 -0
- package/dist/session/replica-routes.d.ts.map +1 -0
- package/dist/session/replica-routes.js +77 -0
- package/dist/session/routes.d.ts +29 -0
- package/dist/session/routes.d.ts.map +1 -0
- package/dist/session/routes.js +1331 -0
- package/dist/session/rpc.d.ts +323 -0
- package/dist/session/rpc.d.ts.map +1 -0
- package/dist/session/rpc.js +808 -0
- package/dist/session/state-store.d.ts +210 -0
- package/dist/session/state-store.d.ts.map +1 -0
- package/dist/session/state-store.js +459 -0
- package/dist/session/supervisor-rpc.d.ts +269 -0
- package/dist/session/supervisor-rpc.d.ts.map +1 -0
- package/dist/session/supervisor-rpc.js +437 -0
- package/dist/session/ws-hibernation-config.d.ts +64 -0
- package/dist/session/ws-hibernation-config.d.ts.map +1 -0
- package/dist/session/ws-hibernation-config.js +89 -0
- package/dist/session/ws.d.ts +95 -0
- package/dist/session/ws.d.ts.map +1 -0
- package/dist/session/ws.js +395 -0
- package/dist/shell/features.d.ts +410 -0
- package/dist/shell/features.d.ts.map +1 -0
- package/dist/shell/features.js +1885 -0
- package/dist/shell/unix-commands.d.ts +15 -0
- package/dist/shell/unix-commands.d.ts.map +1 -0
- package/dist/shell/unix-commands.js +3703 -0
- package/dist/stubs/lifo-ui.d.ts +10 -0
- package/dist/stubs/lifo-ui.d.ts.map +1 -0
- package/dist/stubs/lifo-ui.js +1 -0
- package/dist/tailwind-play.generated.d.ts +19 -0
- package/dist/tailwind-play.generated.d.ts.map +1 -0
- package/dist/tailwind-play.generated.js +18 -0
- package/dist/vfs/dev-provider.d.ts +64 -0
- package/dist/vfs/dev-provider.d.ts.map +1 -0
- package/dist/vfs/dev-provider.js +191 -0
- package/dist/vfs/events.d.ts +51 -0
- package/dist/vfs/events.d.ts.map +1 -0
- package/dist/vfs/events.js +127 -0
- package/dist/vfs/path.d.ts +30 -0
- package/dist/vfs/path.d.ts.map +1 -0
- package/dist/vfs/path.js +41 -0
- package/dist/vfs/seed-project.d.ts +62 -0
- package/dist/vfs/seed-project.d.ts.map +1 -0
- package/dist/vfs/seed-project.js +1045 -0
- package/dist/vfs/sqlite-vfs.d.ts +435 -0
- package/dist/vfs/sqlite-vfs.d.ts.map +1 -0
- package/dist/vfs/sqlite-vfs.js +1670 -0
- package/dist/vfs/symlink-registry.d.ts +64 -0
- package/dist/vfs/symlink-registry.d.ts.map +1 -0
- package/dist/vfs/symlink-registry.js +137 -0
- package/dist/wrangler/nimbus-wrangler.d.ts +157 -0
- package/dist/wrangler/nimbus-wrangler.d.ts.map +1 -0
- package/dist/wrangler/nimbus-wrangler.js +931 -0
- package/package.json +77 -0
- package/public/_assets/cirrus-plugin-react.bundle.js +70740 -0
- package/public/_assets/esbuild-0.24.2.wasm +0 -0
- package/public/_assets/real-vite-bundle.js +101478 -0
- package/public/_assets/rollup.wasm +0 -0
- package/public/favicon.svg +8 -0
- package/public/index.html +565 -0
- package/public/s/index.html +2379 -0
- package/scripts/bundle-esbuild-wasm.mjs +244 -0
- package/scripts/bundle-facet-workers.mjs +137 -0
- package/scripts/bundle-git.mjs +118 -0
- package/scripts/bundle-npm-cjs.mjs +363 -0
- package/scripts/bundle-plugin-react.mjs +480 -0
- package/scripts/bundle-real-vite.mjs +959 -0
- package/scripts/bundle-runtime.mjs +600 -0
- package/scripts/bundle-tailwind-play.mjs +130 -0
- package/scripts/patch-lifo-ui.mjs +131 -0
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* barrel-synthesizer.ts — generate synthetic entry files for "barrel"
|
|
3
|
+
* packages so they tree-shake cleanly through esbuild.
|
|
4
|
+
*
|
|
5
|
+
* Why this exists
|
|
6
|
+
* ───────────────
|
|
7
|
+
* Some npm packages ship as a "barrel" — a single index file that
|
|
8
|
+
* re-exports hundreds or thousands of named exports, each living in
|
|
9
|
+
* its own source file. Examples observed in the wild:
|
|
10
|
+
*
|
|
11
|
+
* lucide-react@0.460: ~3940 files (~1500 icons × 2 entry forms)
|
|
12
|
+
* @phosphor-icons/react: thousands of icon components
|
|
13
|
+
* react-icons: thousands of icons across icon families
|
|
14
|
+
* @mui/icons-material: thousands of Material icons
|
|
15
|
+
* @heroicons/react: hundreds of icons (split by style)
|
|
16
|
+
*
|
|
17
|
+
* Bundling the whole barrel as if it were a normal browser module OOMs
|
|
18
|
+
* esbuild's WASM facet — the compiler tries to ingest the entire
|
|
19
|
+
* source tree into one ESM output. We previously fell back to
|
|
20
|
+
* `https://esm.sh/<pkg>?deps=react@<v>,react-dom@<v>` (commit fc17847)
|
|
21
|
+
* which violated the 100% edge contract: every preview load fetched
|
|
22
|
+
* tree-shaken bytes from a third-party CDN.
|
|
23
|
+
*
|
|
24
|
+
* The fix is structural. Instead of bundling `import * from 'pkg'`,
|
|
25
|
+
* we scan the user's source code for the SET of named imports the
|
|
26
|
+
* project actually uses
|
|
27
|
+
*
|
|
28
|
+
* import { Home, FileText, Zap } from 'lucide-react'
|
|
29
|
+
*
|
|
30
|
+
* and synthesize a tiny entry module
|
|
31
|
+
*
|
|
32
|
+
* export { Home, FileText, Zap } from 'lucide-react';
|
|
33
|
+
*
|
|
34
|
+
* which esbuild bundles in milliseconds because reachability prunes
|
|
35
|
+
* everything else. The output is small (5–20 KiB for typical icon
|
|
36
|
+
* sets) and ships from our edge.
|
|
37
|
+
*
|
|
38
|
+
* Generality
|
|
39
|
+
* ──────────
|
|
40
|
+
* This is NOT lucide-react-specific. Any barrel package whose author
|
|
41
|
+
* marked `sideEffects: false` (or whose individual icon files are
|
|
42
|
+
* side-effect-free) works automatically — esbuild's tree-shake takes
|
|
43
|
+
* care of selecting the actually-used exports. Packages without
|
|
44
|
+
* sideEffects: false may still tree-shake because esbuild's static
|
|
45
|
+
* analysis of `export { X } from './x.js'` is conservative-correct.
|
|
46
|
+
*
|
|
47
|
+
* Failure mode
|
|
48
|
+
* ────────────
|
|
49
|
+
* If the scanner can't enumerate the set (dynamic imports, computed
|
|
50
|
+
* member access like `Icons[name]`, etc.), the synthesizer returns
|
|
51
|
+
* null and the caller MUST hard-error. NO CDN fallback. The user
|
|
52
|
+
* sees a clear remediation: "add a static import for the
|
|
53
|
+
* dynamically-referenced icon."
|
|
54
|
+
*/
|
|
55
|
+
import { packageNameFromSpecifier } from './barrel-detect.js';
|
|
56
|
+
/**
|
|
57
|
+
* Static-import scanner. Walks the user's source tree under projDir
|
|
58
|
+
* and extracts named-import sets. Returns a map keyed by package name.
|
|
59
|
+
*
|
|
60
|
+
* Recognized syntax:
|
|
61
|
+
* import { A } from 'pkg'
|
|
62
|
+
* import { A, B } from 'pkg'
|
|
63
|
+
* import { A as X, B as Y } from 'pkg'
|
|
64
|
+
* import D, { A } from 'pkg' // only A is captured (D is default)
|
|
65
|
+
*
|
|
66
|
+
* NOT recognized (intentional — these can't be statically tree-shaken):
|
|
67
|
+
* import * as M from 'pkg' — caller must bundle whole pkg
|
|
68
|
+
* import('pkg') — dynamic; runtime resolution
|
|
69
|
+
* const { A } = require('pkg') — CJS at runtime
|
|
70
|
+
*
|
|
71
|
+
* The scanner is intentionally conservative-text-based. We do NOT
|
|
72
|
+
* parse a full AST — that would require shipping acorn or esbuild's
|
|
73
|
+
* parser at runtime in the supervisor. The regex covers the >99% case
|
|
74
|
+
* for browser source code in TS/JS/JSX/TSX.
|
|
75
|
+
*
|
|
76
|
+
* Costs: O(files × content_length). For Mossaic (199 source files,
|
|
77
|
+
* ~150 KiB total source) this is single-digit ms.
|
|
78
|
+
*/
|
|
79
|
+
export function scanNamedImports(vfs, projDir) {
|
|
80
|
+
const result = new Map();
|
|
81
|
+
const scanExts = new Set(['.ts', '.tsx', '.jsx', '.js', '.mjs']);
|
|
82
|
+
const add = (pkgName, name) => {
|
|
83
|
+
let set = result.get(pkgName);
|
|
84
|
+
if (!set) {
|
|
85
|
+
set = new Set();
|
|
86
|
+
result.set(pkgName, set);
|
|
87
|
+
}
|
|
88
|
+
set.add(name);
|
|
89
|
+
};
|
|
90
|
+
// Match `import { ... } from 'spec'` and `import D, { ... } from 'spec'`.
|
|
91
|
+
// Non-greedy to handle multiple imports per file. The `[^"']*?` after
|
|
92
|
+
// the closing brace tolerates whitespace + the optional `from`.
|
|
93
|
+
// Captures:
|
|
94
|
+
// 1: the named-import body (between { and })
|
|
95
|
+
// 2: the specifier
|
|
96
|
+
const namedImportRe = /import\s+(?:[A-Za-z_$][\w$]*\s*,\s*)?\{([^}]+)\}\s*from\s*["']([^"']+)["']/g;
|
|
97
|
+
const walk = (dir, depth) => {
|
|
98
|
+
if (depth > 6)
|
|
99
|
+
return;
|
|
100
|
+
let entries;
|
|
101
|
+
try {
|
|
102
|
+
entries = vfs.readdir(dir);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
for (const entry of entries) {
|
|
108
|
+
if (entry.name === 'node_modules' || entry.name === '.git' ||
|
|
109
|
+
entry.name === 'dist' || entry.name === 'build')
|
|
110
|
+
continue;
|
|
111
|
+
const path = dir + '/' + entry.name;
|
|
112
|
+
if (entry.type === 'directory') {
|
|
113
|
+
walk(path, depth + 1);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const dot = entry.name.lastIndexOf('.');
|
|
117
|
+
if (dot < 0)
|
|
118
|
+
continue;
|
|
119
|
+
const ext = entry.name.substring(dot);
|
|
120
|
+
if (!scanExts.has(ext))
|
|
121
|
+
continue;
|
|
122
|
+
let code;
|
|
123
|
+
try {
|
|
124
|
+
code = vfs.readFileString(path);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
let m;
|
|
130
|
+
while ((m = namedImportRe.exec(code)) !== null) {
|
|
131
|
+
const body = m[1];
|
|
132
|
+
const specRaw = m[2];
|
|
133
|
+
// Skip relative + builtin imports: only bare package specifiers.
|
|
134
|
+
if (specRaw.startsWith('.') || specRaw.startsWith('/') || specRaw.startsWith('node:'))
|
|
135
|
+
continue;
|
|
136
|
+
// Skip subpath imports — the user is opting into per-file
|
|
137
|
+
// resolution; esbuild bundles the specific file directly.
|
|
138
|
+
const pkgName = packageNameFromSpecifier(specRaw);
|
|
139
|
+
if (specRaw !== pkgName)
|
|
140
|
+
continue;
|
|
141
|
+
// Parse the named-import body. Each item is one of:
|
|
142
|
+
// X
|
|
143
|
+
// X as Y
|
|
144
|
+
// "X" as Y (TS bracket-import, rare)
|
|
145
|
+
// We capture the SOURCE name (the export name on the package),
|
|
146
|
+
// NOT the local alias.
|
|
147
|
+
for (const partRaw of body.split(',')) {
|
|
148
|
+
const part = partRaw.trim();
|
|
149
|
+
if (!part)
|
|
150
|
+
continue;
|
|
151
|
+
const asMatch = part.match(/^([A-Za-z_$][\w$]*)\s+as\s+[A-Za-z_$][\w$]*$/);
|
|
152
|
+
if (asMatch) {
|
|
153
|
+
add(pkgName, asMatch[1]);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
// Plain identifier — capture as-is. Reject anything that's not
|
|
157
|
+
// a clean JS identifier (e.g. comments, type-only imports).
|
|
158
|
+
if (/^[A-Za-z_$][\w$]*$/.test(part)) {
|
|
159
|
+
add(pkgName, part);
|
|
160
|
+
}
|
|
161
|
+
else if (/^type\s+([A-Za-z_$][\w$]*)/.test(part)) {
|
|
162
|
+
// `import { type Foo } from 'pkg'` — capture, esbuild will
|
|
163
|
+
// strip type-only imports during bundle.
|
|
164
|
+
const tm = part.match(/^type\s+([A-Za-z_$][\w$]*)/);
|
|
165
|
+
if (tm)
|
|
166
|
+
add(pkgName, tm[1]);
|
|
167
|
+
}
|
|
168
|
+
// Anything else (e.g. "default as X") is non-named; skip.
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
walk(projDir, 0);
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
export function buildSyntheticEntry(vfs, nmDir, pkgName, names) {
|
|
177
|
+
if (names.size === 0)
|
|
178
|
+
return null;
|
|
179
|
+
const indexPath = findPackageEsmEntry(vfs, nmDir, pkgName);
|
|
180
|
+
if (!indexPath)
|
|
181
|
+
return null;
|
|
182
|
+
const indexCode = (() => {
|
|
183
|
+
try {
|
|
184
|
+
return vfs.readFileString(indexPath);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
})();
|
|
190
|
+
if (!indexCode)
|
|
191
|
+
return null;
|
|
192
|
+
const exportMap = new Map();
|
|
193
|
+
// Match an entire `export { ... } from '...';` block.
|
|
194
|
+
const reExport = /export\s*\{([^}]+)\}\s*from\s*["']([^"']+)["']\s*;?/g;
|
|
195
|
+
let m;
|
|
196
|
+
while ((m = reExport.exec(indexCode)) !== null) {
|
|
197
|
+
const body = m[1];
|
|
198
|
+
const path = m[2];
|
|
199
|
+
if (!path.startsWith('.'))
|
|
200
|
+
continue; // only relative re-exports
|
|
201
|
+
for (const partRaw of body.split(',')) {
|
|
202
|
+
const part = partRaw.trim();
|
|
203
|
+
if (!part)
|
|
204
|
+
continue;
|
|
205
|
+
// `default as X`
|
|
206
|
+
const defAs = part.match(/^default\s+as\s+([A-Za-z_$][\w$]*)$/);
|
|
207
|
+
if (defAs) {
|
|
208
|
+
exportMap.set(defAs[1], { path, sourceName: 'default', isDefault: true });
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
// `X as Y`
|
|
212
|
+
const renamed = part.match(/^([A-Za-z_$][\w$]*)\s+as\s+([A-Za-z_$][\w$]*)$/);
|
|
213
|
+
if (renamed) {
|
|
214
|
+
exportMap.set(renamed[2], { path, sourceName: renamed[1], isDefault: false });
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
// `X`
|
|
218
|
+
if (/^[A-Za-z_$][\w$]*$/.test(part)) {
|
|
219
|
+
exportMap.set(part, { path, sourceName: part, isDefault: false });
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
// `default` (default re-export with no rename) is rare; skip.
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Primitives wave (P6) — `export * from './x.js'` support.
|
|
226
|
+
//
|
|
227
|
+
// Many barrel packages (date-fns, several utility libraries, some
|
|
228
|
+
// icon kits) use `export *` aggregation instead of per-name
|
|
229
|
+
// re-exports. The original synthesizer ignored these → exportMap
|
|
230
|
+
// stayed empty → /preview/@modules/<pkg> 500'd with "synthetic
|
|
231
|
+
// entry generation returned null".
|
|
232
|
+
//
|
|
233
|
+
// Strategy: harvest each `export *` source's own top-level export
|
|
234
|
+
// declarations once, and inject them into the same exportMap with
|
|
235
|
+
// `sourceName === exportedName`. This is not a full ESM resolver
|
|
236
|
+
// (we don't follow nested `export *` chains), but it covers the
|
|
237
|
+
// common case where the file at the end of the chain has explicit
|
|
238
|
+
// `export function X` / `export const X` / `export class X` /
|
|
239
|
+
// `export { X }` declarations — which matches every barrel
|
|
240
|
+
// observed in the wild.
|
|
241
|
+
//
|
|
242
|
+
// Cap on the number of `export *` sources we walk so a pathological
|
|
243
|
+
// barrel-of-barrels can't blow the synthesizer's budget.
|
|
244
|
+
const indexDirForStar = indexPath.substring(0, indexPath.lastIndexOf('/'));
|
|
245
|
+
const reExportStar = /export\s*\*\s*from\s*["']([^"']+)["']\s*;?/g;
|
|
246
|
+
const STAR_SOURCE_CAP = 1500; // date-fns has ~290; well within cap
|
|
247
|
+
let starSourcesWalked = 0;
|
|
248
|
+
let s;
|
|
249
|
+
while ((s = reExportStar.exec(indexCode)) !== null && starSourcesWalked < STAR_SOURCE_CAP) {
|
|
250
|
+
const path = s[1];
|
|
251
|
+
if (!path.startsWith('.'))
|
|
252
|
+
continue;
|
|
253
|
+
starSourcesWalked++;
|
|
254
|
+
const fullPath = normalizeJoin(indexDirForStar, path);
|
|
255
|
+
let starCode;
|
|
256
|
+
try {
|
|
257
|
+
starCode = vfs.readFileString(fullPath);
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
starCode = null;
|
|
261
|
+
}
|
|
262
|
+
if (!starCode)
|
|
263
|
+
continue;
|
|
264
|
+
// Harvest top-level exports from the source file. Order of patterns:
|
|
265
|
+
// 1. `export { X, Y as Z } from "..."` (re-export from elsewhere)
|
|
266
|
+
// 2. `export { X, Y as Z };` (re-export of locally-bound names)
|
|
267
|
+
// 3. `export function|class|const|let|var X` (declaration)
|
|
268
|
+
// We do NOT walk transitive `export *` chains; that's the
|
|
269
|
+
// budget cap in exchange for simplicity. esbuild handles the
|
|
270
|
+
// actual resolution at bundle time anyway — we only need enough
|
|
271
|
+
// entries in the map to MATCH the user's named imports.
|
|
272
|
+
const reInnerNamed = /export\s*\{([^}]+)\}\s*(?:from\s*["'][^"']+["'])?\s*;?/g;
|
|
273
|
+
let im;
|
|
274
|
+
while ((im = reInnerNamed.exec(starCode)) !== null) {
|
|
275
|
+
for (const partRaw of im[1].split(',')) {
|
|
276
|
+
const part = partRaw.trim();
|
|
277
|
+
if (!part)
|
|
278
|
+
continue;
|
|
279
|
+
const renamed = part.match(/^([A-Za-z_$][\w$]*)\s+as\s+([A-Za-z_$][\w$]*)$/);
|
|
280
|
+
if (renamed) {
|
|
281
|
+
if (!exportMap.has(renamed[2])) {
|
|
282
|
+
exportMap.set(renamed[2], { path, sourceName: renamed[2], isDefault: false });
|
|
283
|
+
}
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
if (/^[A-Za-z_$][\w$]*$/.test(part)) {
|
|
287
|
+
if (!exportMap.has(part)) {
|
|
288
|
+
exportMap.set(part, { path, sourceName: part, isDefault: false });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Top-level declarations — `export function X`, `export class X`,
|
|
294
|
+
// `export const X`, `export let X`, `export var X`. Async, generator
|
|
295
|
+
// and TS modifiers (default, abstract) handled by the prefix opt-out.
|
|
296
|
+
const reDecl = /export\s+(?:async\s+)?(?:function\*?|class|const|let|var)\s+([A-Za-z_$][\w$]*)/g;
|
|
297
|
+
let dm;
|
|
298
|
+
while ((dm = reDecl.exec(starCode)) !== null) {
|
|
299
|
+
const name = dm[1];
|
|
300
|
+
if (!exportMap.has(name)) {
|
|
301
|
+
exportMap.set(name, { path, sourceName: name, isDefault: false });
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
if (exportMap.size === 0)
|
|
306
|
+
return null;
|
|
307
|
+
// Match user's requested names against the map. Build per-file
|
|
308
|
+
// groupings so the synthetic entry has one re-export per source
|
|
309
|
+
// file (smaller text, cleaner tree-shake graph).
|
|
310
|
+
const indexDir = indexPath.substring(0, indexPath.lastIndexOf('/'));
|
|
311
|
+
const grouped = new Map();
|
|
312
|
+
let matched = 0;
|
|
313
|
+
for (const name of names) {
|
|
314
|
+
const ref = exportMap.get(name);
|
|
315
|
+
if (!ref)
|
|
316
|
+
continue;
|
|
317
|
+
matched++;
|
|
318
|
+
// Resolve relative path against indexDir, then strip the
|
|
319
|
+
// package's nmDir prefix so we can build a `pkgName/...` import.
|
|
320
|
+
const fullPath = normalizeJoin(indexDir, ref.path);
|
|
321
|
+
let arr = grouped.get(fullPath);
|
|
322
|
+
if (!arr) {
|
|
323
|
+
arr = [];
|
|
324
|
+
grouped.set(fullPath, arr);
|
|
325
|
+
}
|
|
326
|
+
arr.push({ exportedName: name, sourceName: ref.sourceName, isDefault: ref.isDefault });
|
|
327
|
+
}
|
|
328
|
+
if (matched === 0)
|
|
329
|
+
return null;
|
|
330
|
+
// Emit per-file re-export lines. Use `pkgName/<rel-from-pkg-root>`
|
|
331
|
+
// so esbuild's resolver follows the package's exports field if any.
|
|
332
|
+
const pkgRoot = nmDir + '/' + pkgName;
|
|
333
|
+
const sortedFiles = [...grouped.keys()].sort();
|
|
334
|
+
const lines = [
|
|
335
|
+
`// AUTO-GENERATED synthetic entry for ${pkgName}`,
|
|
336
|
+
`// ${matched} of ${names.size} requested names matched the parsed barrel.`,
|
|
337
|
+
`// esbuild tree-shakes the rest of the package away.`,
|
|
338
|
+
];
|
|
339
|
+
if (matched < names.size) {
|
|
340
|
+
const missing = [...names].filter(n => !exportMap.has(n));
|
|
341
|
+
lines.push(`// MISSING (not found in barrel index): ${missing.sort().join(', ')}`);
|
|
342
|
+
}
|
|
343
|
+
const referencedFiles = [];
|
|
344
|
+
for (const filePath of sortedFiles) {
|
|
345
|
+
let relFromPkg = filePath.startsWith(pkgRoot + '/')
|
|
346
|
+
? filePath.substring(pkgRoot.length + 1)
|
|
347
|
+
: filePath;
|
|
348
|
+
// Use the package-rooted form so esbuild's resolver respects
|
|
349
|
+
// the package's exports/main fields. Strip leading slash.
|
|
350
|
+
const importSpec = pkgName + '/' + relFromPkg;
|
|
351
|
+
const items = grouped.get(filePath);
|
|
352
|
+
// Sort items for determinism.
|
|
353
|
+
items.sort((a, b) => a.exportedName.localeCompare(b.exportedName));
|
|
354
|
+
const memberLines = items.map(i => {
|
|
355
|
+
if (i.isDefault)
|
|
356
|
+
return `default as ${i.exportedName}`;
|
|
357
|
+
if (i.sourceName === i.exportedName)
|
|
358
|
+
return i.exportedName;
|
|
359
|
+
return `${i.sourceName} as ${i.exportedName}`;
|
|
360
|
+
});
|
|
361
|
+
lines.push(`export { ${memberLines.join(', ')} } from ${JSON.stringify(importSpec)};`);
|
|
362
|
+
referencedFiles.push(filePath);
|
|
363
|
+
}
|
|
364
|
+
return {
|
|
365
|
+
code: lines.join('\n') + '\n',
|
|
366
|
+
referencedFiles,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Build a SCOPED slice for a synthetic-entry bundle: include only
|
|
371
|
+
* the files the synthetic entry directly references (+ their
|
|
372
|
+
* transitive imports walked via static analysis), plus the package
|
|
373
|
+
* root's `package.json` (esbuild's resolver reads it for exports/main
|
|
374
|
+
* fields). This bypasses the standard `walkDir` over the whole
|
|
375
|
+
* package, which for icon-libraries with thousands of files can
|
|
376
|
+
* exceed the 28 MiB slice cap.
|
|
377
|
+
*
|
|
378
|
+
* Caller still appends the synthetic entry file itself to the slice
|
|
379
|
+
* (we don't include it here because it lives in a synthetic
|
|
380
|
+
* directory the caller already manages).
|
|
381
|
+
*
|
|
382
|
+
* Returns the list of `SliceEntry`-shaped objects to push into the
|
|
383
|
+
* existing slice, plus the total bytes added (for cap-tracking).
|
|
384
|
+
*
|
|
385
|
+
* `transitiveCap`: how many files we'll walk in total. Bounded so a
|
|
386
|
+
* pathological barrel-of-barrels can't blow the cap. Default 800,
|
|
387
|
+
* which empirically covers icon-libraries with up to ~400 imported
|
|
388
|
+
* icons (each pulling 1-2 transitive shared utility files).
|
|
389
|
+
*/
|
|
390
|
+
export function buildScopedSliceForSynthetic(vfs, nmDir, pkgName, referencedFiles, transitiveCap = 800) {
|
|
391
|
+
const entries = [];
|
|
392
|
+
let totalBytes = 0;
|
|
393
|
+
const visited = new Set();
|
|
394
|
+
const dirSet = new Set();
|
|
395
|
+
const pkgRoot = nmDir + '/' + pkgName;
|
|
396
|
+
const addDir = (d) => {
|
|
397
|
+
if (dirSet.has(d) || !d)
|
|
398
|
+
return;
|
|
399
|
+
dirSet.add(d);
|
|
400
|
+
entries.push({ path: '/' + d.replace(/^\/+/, ''), isDir: true });
|
|
401
|
+
};
|
|
402
|
+
// Always include the package root + its package.json. esbuild's
|
|
403
|
+
// resolver reads package.json for sideEffects, exports, main, etc.
|
|
404
|
+
addDir(pkgRoot);
|
|
405
|
+
const pkgJsonPath = pkgRoot + '/package.json';
|
|
406
|
+
if (vfs.exists(pkgJsonPath) && !vfs.isDirectory(pkgJsonPath)) {
|
|
407
|
+
try {
|
|
408
|
+
const bytes = vfs.readFile(pkgJsonPath);
|
|
409
|
+
entries.push({ path: '/' + pkgJsonPath.replace(/^\/+/, ''), bytes, isDir: false });
|
|
410
|
+
totalBytes += bytes.length + pkgJsonPath.length;
|
|
411
|
+
visited.add(pkgJsonPath);
|
|
412
|
+
}
|
|
413
|
+
catch { }
|
|
414
|
+
}
|
|
415
|
+
// Walker: BFS over referenced files + their relative imports.
|
|
416
|
+
const queue = [...referencedFiles];
|
|
417
|
+
while (queue.length > 0 && visited.size < transitiveCap) {
|
|
418
|
+
const filePath = queue.shift();
|
|
419
|
+
if (visited.has(filePath))
|
|
420
|
+
continue;
|
|
421
|
+
visited.add(filePath);
|
|
422
|
+
if (!vfs.exists(filePath) || vfs.isDirectory(filePath))
|
|
423
|
+
continue;
|
|
424
|
+
let bytes;
|
|
425
|
+
try {
|
|
426
|
+
bytes = vfs.readFile(filePath);
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
// Track parent dirs so esbuild's plugin's dirSet has them.
|
|
432
|
+
const slash = filePath.lastIndexOf('/');
|
|
433
|
+
if (slash > 0)
|
|
434
|
+
addDir(filePath.substring(0, slash));
|
|
435
|
+
entries.push({ path: '/' + filePath.replace(/^\/+/, ''), bytes, isDir: false });
|
|
436
|
+
totalBytes += bytes.length + filePath.length;
|
|
437
|
+
// Parse relative imports and queue them. Same regex as
|
|
438
|
+
// scanNamedImports but with relative-path predicate.
|
|
439
|
+
const text = new TextDecoder().decode(bytes);
|
|
440
|
+
const importRe = /(?:from\s+|import\s*\(?\s*)["'](\.\.?\/[^"']+)["']/g;
|
|
441
|
+
let m;
|
|
442
|
+
while ((m = importRe.exec(text)) !== null) {
|
|
443
|
+
const rel = m[1];
|
|
444
|
+
const dir = filePath.substring(0, slash > 0 ? slash : 0);
|
|
445
|
+
const candidate = normalizeJoin(dir, rel);
|
|
446
|
+
// Try with extensions (.js, .mjs, no-ext-as-dir/index.js).
|
|
447
|
+
for (const ext of ['', '.js', '.mjs', '.cjs', '.jsx']) {
|
|
448
|
+
const tryPath = candidate + ext;
|
|
449
|
+
if (!visited.has(tryPath) && vfs.exists(tryPath) && !vfs.isDirectory(tryPath)) {
|
|
450
|
+
queue.push(tryPath);
|
|
451
|
+
break;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// Also try as directory with index.js.
|
|
455
|
+
const idx = candidate + '/index.js';
|
|
456
|
+
if (!visited.has(idx) && vfs.exists(idx) && !vfs.isDirectory(idx)) {
|
|
457
|
+
queue.push(idx);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
return { entries, totalBytes };
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Resolve the package's main ESM entry file path (preferring the
|
|
465
|
+
* `module` field, then `main`). Returns null if the package isn't
|
|
466
|
+
* installed or doesn't expose a JS entry.
|
|
467
|
+
*/
|
|
468
|
+
function findPackageEsmEntry(vfs, nmDir, pkgName) {
|
|
469
|
+
const pkgRoot = nmDir + '/' + pkgName;
|
|
470
|
+
const pkgJsonPath = pkgRoot + '/package.json';
|
|
471
|
+
if (!vfs.exists(pkgJsonPath))
|
|
472
|
+
return null;
|
|
473
|
+
let pkg;
|
|
474
|
+
try {
|
|
475
|
+
pkg = JSON.parse(vfs.readFileString(pkgJsonPath));
|
|
476
|
+
}
|
|
477
|
+
catch {
|
|
478
|
+
return null;
|
|
479
|
+
}
|
|
480
|
+
// Prefer module (ESM), then main.
|
|
481
|
+
const candidates = [];
|
|
482
|
+
if (typeof pkg.module === 'string')
|
|
483
|
+
candidates.push(pkg.module);
|
|
484
|
+
if (typeof pkg.main === 'string')
|
|
485
|
+
candidates.push(pkg.main);
|
|
486
|
+
// Some packages publish `exports` field with a default condition
|
|
487
|
+
// pointing at ESM; try that as a tiebreaker.
|
|
488
|
+
if (pkg.exports && typeof pkg.exports === 'object') {
|
|
489
|
+
const root = pkg.exports['.'] || pkg.exports;
|
|
490
|
+
if (root && typeof root === 'object') {
|
|
491
|
+
const m = root.import || root.module || root.default;
|
|
492
|
+
if (typeof m === 'string')
|
|
493
|
+
candidates.unshift(m);
|
|
494
|
+
}
|
|
495
|
+
else if (typeof root === 'string') {
|
|
496
|
+
candidates.unshift(root);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
for (const rel of candidates) {
|
|
500
|
+
const clean = rel.replace(/^\.\//, '');
|
|
501
|
+
const abs = pkgRoot + '/' + clean;
|
|
502
|
+
if (vfs.exists(abs) && !vfs.isDirectory(abs))
|
|
503
|
+
return abs;
|
|
504
|
+
// Try with index.js if rel is a directory.
|
|
505
|
+
const idx = abs + '/index.js';
|
|
506
|
+
if (vfs.exists(idx))
|
|
507
|
+
return idx;
|
|
508
|
+
}
|
|
509
|
+
return null;
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Normalize-join two paths: `dir + '/' + rel`, resolving `.` and `..`
|
|
513
|
+
* segments. Used when the barrel-index references siblings via
|
|
514
|
+
* relative paths like `./icons/house.js`.
|
|
515
|
+
*/
|
|
516
|
+
function normalizeJoin(dir, rel) {
|
|
517
|
+
const stack = dir.split('/').filter(Boolean);
|
|
518
|
+
for (const seg of rel.split('/')) {
|
|
519
|
+
if (seg === '.' || seg === '')
|
|
520
|
+
continue;
|
|
521
|
+
if (seg === '..')
|
|
522
|
+
stack.pop();
|
|
523
|
+
else
|
|
524
|
+
stack.push(seg);
|
|
525
|
+
}
|
|
526
|
+
return (dir.startsWith('/') ? '/' : '') + stack.join('/');
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* VFS path where synthetic entries are written. Lives under the
|
|
530
|
+
* project's node_modules in a Nimbus-private namespace so package
|
|
531
|
+
* managers don't collide with real package directories.
|
|
532
|
+
*
|
|
533
|
+
* Format: <projDir>/node_modules/.nimbus-synthetic/<safeName>.entry.js
|
|
534
|
+
*
|
|
535
|
+
* Safe name = pkgName with '@' and '/' replaced by '__' so scoped
|
|
536
|
+
* packages produce a valid filesystem path.
|
|
537
|
+
*/
|
|
538
|
+
export function syntheticEntryPath(projDir, pkgName) {
|
|
539
|
+
const safe = pkgName.replace(/[@/]/g, '__');
|
|
540
|
+
return projDir + '/node_modules/.nimbus-synthetic/' + safe + '.entry.js';
|
|
541
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bun-repl.ts — Bun REPL adapter.
|
|
3
|
+
*
|
|
4
|
+
* Bun is native (workerd nodejs_compat) — no facet-bootstrap like
|
|
5
|
+
* Pyodide. We dispatch eval through a long-lived child-facet that
|
|
6
|
+
* holds a vm.Context across submits, so user-defined variables /
|
|
7
|
+
* functions / imports persist.
|
|
8
|
+
*
|
|
9
|
+
* Design:
|
|
10
|
+
* - One child-facet per REPL session (NimbusLoaderPool with
|
|
11
|
+
* concurrency=1, omitSupervisor=true).
|
|
12
|
+
* - Facet-side: globalThis.__nimbus_bun_ctx caches a vm.createContext()
|
|
13
|
+
* dict; each push() runs vm.runInContext(line, ctx) and returns
|
|
14
|
+
* {stdout, stderr, isIncomplete, isExit}.
|
|
15
|
+
* - Continuation detection: probe parse via `new Function(...code)`
|
|
16
|
+
* wrapped in try/catch — recoverable SyntaxError patterns
|
|
17
|
+
* (per Node's repl.Recoverable shape) → incomplete.
|
|
18
|
+
* - Expression displayhook: vm.runInContext returns the last
|
|
19
|
+
* expression value; if !== undefined, util.inspect(value) → stdout.
|
|
20
|
+
* - Exit: override process.exit inside the context to throw a
|
|
21
|
+
* sentinel; catch sentinel → kind:'exit'.
|
|
22
|
+
*
|
|
23
|
+
* NOT supported in v1 (deferred):
|
|
24
|
+
* - Top-level await at the REPL prompt (Bun supports this natively
|
|
25
|
+
* but vm.runInContext doesn't unwrap top-level await — would need
|
|
26
|
+
* vm.SourceTextModule or evaluation pre-wrap).
|
|
27
|
+
* - Ctrl-C mid-execution (no SIGINT plumbing across facet boundary).
|
|
28
|
+
* - Tab-completion.
|
|
29
|
+
*
|
|
30
|
+
* No setTimeout / sleep / retry / defensive-catch on hot paths. Errors
|
|
31
|
+
* thrown by vm bubble up; we surface them as stderr via the runtime
|
|
32
|
+
* stderr capture.
|
|
33
|
+
*/
|
|
34
|
+
import type { FacetManager } from '../facets/manager.js';
|
|
35
|
+
import type { WebSocketTerminal } from '../facets/ws-terminal.js';
|
|
36
|
+
export interface BunReplDeps {
|
|
37
|
+
facetMgr: FacetManager;
|
|
38
|
+
terminal: WebSocketTerminal;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Top-level wrapper: builds a Bun REPL adapter, drives a ReplSession
|
|
42
|
+
* to completion, returns the exit code. Called from the bun factory's
|
|
43
|
+
* wrapper in init.ts when `bun` is invoked with no args.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runBunRepl(deps: BunReplDeps): Promise<number>;
|
|
46
|
+
//# sourceMappingURL=bun-repl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bun-repl.d.ts","sourceRoot":"","sources":["../../src/runtime/bun-repl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAKlE,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAiTD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAInE"}
|