@ecopages/core 0.2.0-beta.30 → 0.2.0-beta.32
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 +1 -0
- package/package.json +82 -3
- package/src/adapters/abstract/application-adapter.d.ts +0 -8
- package/src/adapters/abstract/application-adapter.js +252 -261
- package/src/adapters/abstract/router-adapter.js +12 -4
- package/src/adapters/abstract/segment-path-matcher.js +132 -134
- package/src/adapters/abstract/server-adapter.js +22 -14
- package/src/adapters/abstract/ws-pattern-matcher.js +24 -26
- package/src/adapters/bun/bun-user-websocket-lifecycle.js +83 -86
- package/src/adapters/bun/client-bridge.js +51 -50
- package/src/adapters/bun/create-app.js +171 -161
- package/src/adapters/bun/hmr-manager.js +62 -57
- package/src/adapters/bun/index.js +2 -31
- package/src/adapters/bun/runtime-host.js +61 -54
- package/src/adapters/bun/server-adapter.d.ts +0 -1
- package/src/adapters/bun/server-adapter.js +561 -561
- package/src/adapters/bun/static-preview-host.js +43 -46
- package/src/adapters/create-app.js +11 -14
- package/src/adapters/index.js +2 -30
- package/src/adapters/node/create-app.js +123 -129
- package/src/adapters/node/http-request-bridge.js +147 -106
- package/src/adapters/node/node-client-bridge.js +62 -64
- package/src/adapters/node/node-hmr-manager.js +58 -48
- package/src/adapters/node/runtime-host.js +96 -89
- package/src/adapters/node/server-adapter-dependencies.js +18 -21
- package/src/adapters/node/server-adapter.d.ts +0 -1
- package/src/adapters/node/server-adapter.js +347 -326
- package/src/adapters/node/static-content-server.js +172 -191
- package/src/adapters/node/static-preview-host.js +87 -78
- package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
- package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
- package/src/adapters/shared/hmr/hmr-html-response.js +46 -32
- package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +29 -38
- package/src/adapters/shared/hmr/shared-hmr-manager.js +439 -425
- package/src/adapters/shared/http/api-request-pipeline.js +122 -119
- package/src/adapters/shared/http/api-response.js +77 -77
- package/src/adapters/shared/http/create-body-response.js +22 -19
- package/src/adapters/shared/http/define-api-handler.js +41 -55
- package/src/adapters/shared/http/explicit-static-render-preparation.js +26 -23
- package/src/adapters/shared/http/explicit-static-route-matcher.js +55 -62
- package/src/adapters/shared/http/file-route-middleware-pipeline.js +81 -75
- package/src/adapters/shared/http/fs-server-response-factory.js +101 -96
- package/src/adapters/shared/http/fs-server-response-matcher.js +239 -257
- package/src/adapters/shared/http/run-middleware-chain.js +15 -15
- package/src/adapters/shared/runtime/application-adapter.js +72 -87
- package/src/adapters/shared/runtime/copy-runtime-public-dir.js +25 -22
- package/src/adapters/shared/runtime/port-manager.js +207 -177
- package/src/adapters/shared/runtime/render-context.js +94 -79
- package/src/adapters/shared/runtime/runtime-app-bootstrap.js +33 -38
- package/src/adapters/shared/runtime/runtime-host.js +1 -0
- package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +2 -3
- package/src/adapters/shared/runtime/runtime-server-lifecycle.js +65 -51
- package/src/adapters/shared/runtime/server-adapter.d.ts +1 -0
- package/src/adapters/shared/runtime/server-adapter.js +233 -217
- package/src/adapters/shared/runtime/server-route-handler.js +74 -70
- package/src/adapters/shared/runtime/server-static-builder.js +165 -184
- package/src/adapters/shared/runtime/static-preview-host.js +1 -0
- package/src/adapters/shared/ws/node-http-websocket-upgrades.js +97 -88
- package/src/adapters/shared/ws/websocket-lifecycle.js +57 -50
- package/src/build/README.md +52 -1
- package/src/build/app-build-manifest-runtime.js +129 -108
- package/src/build/browser/browser-runtime-manifest.js +47 -50
- package/src/build/browser/browser-runtime-plugin-helpers.js +32 -12
- package/src/build/browser/browser-runtime-plugin.js +206 -160
- package/src/build/browser/jsx-ownership-plugins.js +51 -37
- package/src/build/browser/lit-static-render-worker-context.js +3 -5
- package/src/build/build-adapter.js +276 -139
- package/src/build/cache/build-input-fingerprint.js +28 -26
- package/src/build/cache/cache-constants.js +4 -6
- package/src/build/cache/cache-keys.js +64 -56
- package/src/build/cache/pages-unified-graph-build.js +179 -178
- package/src/build/cache/production-build-cache.js +47 -54
- package/src/build/cache/server-entry-build-cache.js +134 -146
- package/src/build/contracts/build-contracts.d.ts +4 -4
- package/src/build/contracts/build-contracts.js +1 -0
- package/src/build/contracts/build-manifest.js +58 -43
- package/src/build/contracts/build-types.js +1 -0
- package/src/build/rolldown/rolldown-adapter-helpers.d.ts +9 -0
- package/src/build/rolldown/rolldown-adapter-helpers.js +405 -298
- package/src/build/rolldown/rolldown-build-adapter.js +53 -61
- package/src/build/rolldown/rolldown-build-invocation-metrics.js +31 -35
- package/src/build/rolldown/rolldown-plugin-bridge.js +264 -194
- package/src/build/rolldown/rolldown-source-transform-pass.js +59 -50
- package/src/build/rolldown/runtime-build-output-normalizer.js +227 -175
- package/src/build/rolldown/server-side-css-shim-plugin.js +54 -31
- package/src/build/runtime/build-profile-options.js +36 -36
- package/src/build/runtime/build-request-identity.js +70 -45
- package/src/build/runtime/build-request-policy.js +80 -42
- package/src/build/runtime/build-runtime.js +64 -54
- package/src/build/runtime/deduping-build-executor.js +38 -32
- package/src/build/runtime/parallel-build-executor.js +58 -50
- package/src/build/runtime/serialized-build-executor.js +78 -62
- package/src/cache/index.js +6 -6
- package/src/cache/module-parse-cache.js +99 -68
- package/src/client/navigation-scripts/classification.js +45 -37
- package/src/client/navigation-scripts/index.js +3 -23
- package/src/client/navigation-scripts/navigation-scripts.test.browser.js +58 -62
- package/src/client/navigation-scripts/registry.js +15 -11
- package/src/client/navigation-scripts/rerun-queue.js +81 -64
- package/src/client/scroll.js +32 -24
- package/src/client/scroll.test.browser.js +27 -33
- package/src/client/view-transitions.js +68 -55
- package/src/config/config-builder.d.ts +8 -0
- package/src/config/config-builder.js +637 -642
- package/src/config/constants.js +44 -24
- package/src/declarations.d.ts +1 -0
- package/src/dev/README.md +24 -0
- package/src/dev/client-bridge-registry.js +7 -12
- package/src/dev/dev-client-ownership.js +7 -5
- package/src/dev/hmr-manager-registry.js +7 -12
- package/src/dev/host-runtime.js +25 -30
- package/src/dev/runtime-server-started-message.js +2 -5
- package/src/dev/sc-server.js +106 -103
- package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
- package/src/dev/transform-server/dev-transform-bundler.js +79 -0
- package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
- package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
- package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
- package/src/dev/transform-server/dev-transform-import-rewriter.js +110 -0
- package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
- package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
- package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
- package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
- package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
- package/src/dev/transform-server/dev-transform-server.js +191 -0
- package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
- package/src/dev/transform-server/dev-transform-url.js +58 -0
- package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +27 -0
- package/src/dev/transform-server/dev-transform-vendor-registry.js +145 -0
- package/src/dev/transform-server/index.d.ts +6 -0
- package/src/dev/transform-server/index.js +4 -0
- package/src/dev/transform-server/types.d.ts +15 -0
- package/src/dev/transform-server/types.js +1 -0
- package/src/dev-toolbar/README.md +51 -0
- package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
- package/src/dev-toolbar/define-dev-tool.js +9 -0
- package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
- package/src/dev-toolbar/dev-toolbar-config.js +19 -0
- package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
- package/src/dev-toolbar/dev-toolbar-host.js +117 -0
- package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
- package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
- package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
- package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
- package/src/dev-toolbar/dev-toolbar-package.d.ts +31 -0
- package/src/dev-toolbar/dev-toolbar-package.js +72 -0
- package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
- package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
- package/src/diagnostics/request-build-dedupe.js +34 -28
- package/src/diagnostics/startup-trace.d.ts +10 -1
- package/src/diagnostics/startup-trace.js +269 -241
- package/src/eco/README.md +6 -0
- package/src/eco/eco-declared-component.js +19 -14
- package/src/eco/eco.browser.js +56 -69
- package/src/eco/eco.js +156 -96
- package/src/eco/eco.types.js +5 -0
- package/src/eco/eco.utils.js +1 -10
- package/src/eco/global-injector-map.js +55 -41
- package/src/eco/lazy-injector-map.js +90 -60
- package/src/eco/module-dependencies.js +52 -44
- package/src/eco/page-layout-normalization.js +59 -49
- package/src/errors/http-error.js +50 -49
- package/src/errors/index.js +3 -12
- package/src/errors/locals-access-error.js +5 -8
- package/src/errors/undeclared-component-dependency-error.js +15 -15
- package/src/global/app-logger.js +3 -6
- package/src/hmr/README.md +10 -0
- package/src/hmr/client/hmr-runtime.js +117 -113
- package/src/hmr/client/module-update.d.ts +13 -0
- package/src/hmr/client/module-update.js +39 -0
- package/src/hmr/hmr-asset-paths.d.ts +14 -0
- package/src/hmr/hmr-asset-paths.js +22 -0
- package/src/hmr/hmr-entrypoint-output.d.ts +11 -39
- package/src/hmr/hmr-entrypoint-output.js +28 -54
- package/src/hmr/hmr-file-change-prep.js +13 -16
- package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
- package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
- package/src/hmr/hmr-runtime-paths.d.ts +10 -0
- package/src/hmr/hmr-runtime-paths.js +13 -0
- package/src/hmr/hmr-strategy.d.ts +5 -11
- package/src/hmr/hmr-strategy.js +113 -61
- package/src/hmr/strategies/default-hmr-strategy.js +55 -33
- package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -95
- package/src/hmr/strategies/js-hmr-strategy.js +104 -217
- package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +33 -27
- package/src/index.browser.js +1 -4
- package/src/index.d.ts +1 -0
- package/src/index.js +6 -47
- package/src/integrations/ghtml/ghtml-renderer.js +12 -7
- package/src/integrations/ghtml/ghtml.constants.js +1 -4
- package/src/integrations/ghtml/ghtml.plugin.js +9 -12
- package/src/islands/README.md +25 -0
- package/src/islands/island-host.d.ts +37 -0
- package/src/islands/island-host.js +55 -0
- package/src/plugins/alias-resolver-cache.js +114 -97
- package/src/plugins/alias-resolver-plugin.js +33 -47
- package/src/plugins/define-integration.js +18 -17
- package/src/plugins/eco-component-meta-plugin.js +387 -145
- package/src/plugins/foreign-jsx-override-plugin.js +49 -35
- package/src/plugins/integration-plugin.js +212 -203
- package/src/plugins/jsx-import-source.utils.js +16 -21
- package/src/plugins/processor.js +159 -149
- package/src/plugins/runtime-capability.js +1 -0
- package/src/plugins/source-transform.js +109 -79
- package/src/plugins/tsconfig-import-resolver.d.ts +17 -0
- package/src/plugins/tsconfig-import-resolver.js +218 -142
- package/src/route-renderer/README.md +12 -1
- package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +143 -136
- package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +33 -27
- package/src/route-renderer/orchestration/foreign-child/component-render-context.js +173 -126
- package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +165 -154
- package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +329 -341
- package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +33 -32
- package/src/route-renderer/orchestration/integration-renderer.d.ts +1 -0
- package/src/route-renderer/orchestration/integration-renderer.js +731 -750
- package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +168 -172
- package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +119 -131
- package/src/route-renderer/orchestration/ownership-graph/component-graph.js +82 -91
- package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +82 -76
- package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +29 -31
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +10 -6
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +31 -28
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +3 -0
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +430 -413
- package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +191 -212
- package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +20 -24
- package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +4 -0
- package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +24 -24
- package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +22 -24
- package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +41 -34
- package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +5 -0
- package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +42 -22
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +50 -48
- package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +29 -32
- package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +150 -156
- package/src/route-renderer/orchestration/string-markup-renderer.js +48 -51
- package/src/route-renderer/page-loading/component-dependency-collection.js +120 -124
- package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
- package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
- package/src/route-renderer/page-loading/ecopages-virtual-imports.js +68 -54
- package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
- package/src/route-renderer/page-loading/lazy-trigger-planning.js +46 -36
- package/src/route-renderer/page-loading/module-declaration-aggregation.js +38 -31
- package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
- package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
- package/src/route-renderer/page-loading/page-module-loader.js +130 -124
- package/src/route-renderer/route-renderer.js +74 -76
- package/src/router/client/link-intent.js +55 -39
- package/src/router/client/link-intent.test.browser.js +49 -49
- package/src/router/client/link-navigation-policy.js +114 -93
- package/src/router/client/link-navigation-policy.test.browser.js +70 -80
- package/src/router/client/navigation-coordinator.js +235 -211
- package/src/router/server/route-registry.js +237 -242
- package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
- package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
- package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
- package/src/services/assets/asset-processing-service/assets.types.js +1 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
- package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
- package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
- package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
- package/src/services/assets/asset-processing-service/index.js +8 -8
- package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
- package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
- package/src/services/assets/asset-processing-service/page-package.js +70 -72
- package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
- package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
- package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
- package/src/services/assets/asset-processing-service/processors/index.js +5 -5
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
- package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
- package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
- package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
- package/src/services/assets/browser-bundle.service.js +52 -47
- package/src/services/cache/cache.types.js +5 -0
- package/src/services/cache/index.js +6 -7
- package/src/services/cache/memory-cache-store.js +101 -89
- package/src/services/cache/page-cache-service.js +156 -145
- package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
- package/src/services/html/html-rewriter-provider.service.js +61 -61
- package/src/services/html/html-transformer.service.js +249 -266
- package/src/services/invalidation/development-invalidation.service.js +252 -241
- package/src/services/module-loading/app-module-loader.service.js +1 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
- package/src/services/module-loading/host-module-loader-registry.js +6 -11
- package/src/services/module-loading/module-loading-types.js +1 -0
- package/src/services/module-loading/page-module-import.service.js +235 -243
- package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
- package/src/services/module-loading/route-module-build-cache.js +3 -38
- package/src/services/module-loading/route-module-build-cache.store.js +195 -200
- package/src/services/module-loading/route-module-build-manifest.js +61 -74
- package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
- package/src/services/module-loading/server-module-transpiler.service.js +68 -62
- package/src/services/module-loading/source-module-support.js +15 -7
- package/src/services/runtime-state/dev-graph.service.js +165 -157
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
- package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
- package/src/services/validation/schema-validation-service.js +157 -95
- package/src/services/validation/standard-schema.types.js +1 -0
- package/src/services/validation/validate-standard-schema.js +13 -13
- package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
- package/src/static-site-generator/sitemap-routes.js +33 -28
- package/src/static-site-generator/sitemap.js +38 -29
- package/src/static-site-generator/static-build-invalidation.js +34 -56
- package/src/static-site-generator/static-export-context.js +1 -0
- package/src/static-site-generator/static-site-generator.js +517 -553
- package/src/types/internal-types.d.ts +19 -3
- package/src/types/internal-types.js +1 -0
- package/src/types/public-types.d.ts +16 -46
- package/src/types/public-types.js +1 -0
- package/src/utils/deep-merge.js +39 -26
- package/src/utils/ecopages-route-info.js +27 -23
- package/src/utils/hash.js +3 -6
- package/src/utils/html-escaping.js +21 -8
- package/src/utils/html.js +1 -4
- package/src/utils/invariant.js +11 -10
- package/src/utils/locals-utils.js +32 -22
- package/src/utils/parse-cli-args.js +73 -65
- package/src/utils/path-pattern.js +38 -23
- package/src/utils/path-utils.module.js +8 -11
- package/src/utils/resolve-entry-file.js +70 -38
- package/src/utils/resolve-work-dir.js +23 -27
- package/src/utils/runtime.js +24 -33
- package/src/utils/server-utils.module.js +60 -52
- package/src/utils/static-file-extensions.js +52 -46
- package/src/watchers/project-watcher-ignore.js +16 -15
- package/src/watchers/project-watcher.js +385 -366
- package/src/watchers/project-watcher.test-helpers.js +45 -50
- package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
- package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
- package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
- package/src/build/cache/dev-browser-script-cache.js +0 -90
|
@@ -1,173 +1,219 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Unified browser-runtime plugin factory.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Single factory that exposes the union of behaviors for the browser
|
|
6
|
+
* runtime:
|
|
7
|
+
*
|
|
8
|
+
* - `onResolve` for manifest specifiers → mapped public URL, marked external
|
|
9
|
+
* - `onResolve` for paths starting with `/` whose target is in the manifest's
|
|
10
|
+
* public path set → marked external
|
|
11
|
+
* - `onLoad` for JS/TS files → AST-walking import/export rewrite against the
|
|
12
|
+
* manifest specifier set, with a `code.includes(specifier)` fast path
|
|
13
|
+
*
|
|
14
|
+
* The plugin object carries the manifest's `specifier → publicPath` map
|
|
15
|
+
* under `BROWSER_RUNTIME_IMPORT_REWRITE_MAP` so
|
|
16
|
+
* `collectBrowserRuntimeImportRewriteMap` and the post-build rewriter can
|
|
17
|
+
* read it without re-walking the manifest.
|
|
18
|
+
*
|
|
19
|
+
* This is the single source of truth for browser-runtime plugin behavior.
|
|
20
|
+
* Per-bundler bridges can treat it as a single plugin.
|
|
21
|
+
*/
|
|
22
|
+
import path from 'node:path';
|
|
23
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
24
|
+
import { cachedParseSync } from '../../cache/module-parse-cache.js';
|
|
25
|
+
import { getBrowserRuntimeSpecifierMap } from './browser-runtime-manifest.js';
|
|
26
|
+
import { buildSpecifierFilter } from './browser-runtime-plugin-helpers.js';
|
|
27
|
+
/**
|
|
28
|
+
* Symbol used to attach the manifest's `specifier → publicPath` map to a
|
|
29
|
+
* plugin instance. Consumers read it via `getBrowserRuntimeImportRewriteMap`
|
|
30
|
+
* or `collectBrowserRuntimeImportRewriteMap`.
|
|
31
|
+
*/
|
|
32
|
+
export const BROWSER_RUNTIME_IMPORT_REWRITE_MAP = Symbol.for('ecopages.browserRuntimeImportRewriteMap');
|
|
33
|
+
/**
|
|
34
|
+
* Default name used by `createBrowserRuntimePlugin` when the caller
|
|
35
|
+
* does not provide one.
|
|
36
|
+
*/
|
|
37
|
+
export const DEFAULT_BROWSER_RUNTIME_PLUGIN_NAME = 'browser-runtime-plugin';
|
|
8
38
|
function isRecord(value) {
|
|
9
|
-
|
|
39
|
+
return Boolean(value) && typeof value === 'object';
|
|
10
40
|
}
|
|
11
41
|
function inferLoaderFromPath(filePath) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
42
|
+
const extension = path.extname(filePath).toLowerCase();
|
|
43
|
+
switch (extension) {
|
|
44
|
+
case '.mts':
|
|
45
|
+
case '.cts':
|
|
46
|
+
case '.ts':
|
|
47
|
+
return 'ts';
|
|
48
|
+
case '.tsx':
|
|
49
|
+
return 'tsx';
|
|
50
|
+
case '.jsx':
|
|
51
|
+
return 'jsx';
|
|
52
|
+
default:
|
|
53
|
+
return 'js';
|
|
54
|
+
}
|
|
25
55
|
}
|
|
26
56
|
function queueReplacement(options) {
|
|
27
|
-
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const mappedPath = options.specifierMap.get(options.source.value);
|
|
31
|
-
if (!mappedPath || typeof options.source.start !== "number" || typeof options.source.end !== "number") {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const quote = options.code[options.source.start] === "'" ? "'" : '"';
|
|
35
|
-
options.edits.push({
|
|
36
|
-
start: options.source.start,
|
|
37
|
-
end: options.source.end,
|
|
38
|
-
replacement: `${quote}${mappedPath}${quote}`
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
function rewriteBrowserRuntimeImports(code, specifierMap, filePath = "browser-runtime-imports.js") {
|
|
42
|
-
if (specifierMap.size === 0) {
|
|
43
|
-
return code;
|
|
44
|
-
}
|
|
45
|
-
const edits = [];
|
|
46
|
-
try {
|
|
47
|
-
const result = cachedParseSync(filePath, code, {
|
|
48
|
-
sourceType: "module",
|
|
49
|
-
lang: path.extname(filePath).endsWith("x") ? "tsx" : "ts"
|
|
50
|
-
});
|
|
51
|
-
const walk = (node) => {
|
|
52
|
-
if (!isRecord(node)) {
|
|
57
|
+
if (!isRecord(options.source) || typeof options.source.value !== 'string') {
|
|
53
58
|
return;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
for (const child of value) {
|
|
66
|
-
walk(child);
|
|
67
|
-
}
|
|
68
|
-
} else {
|
|
69
|
-
walk(value);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
walk(result.program);
|
|
74
|
-
} catch {
|
|
75
|
-
return code;
|
|
76
|
-
}
|
|
77
|
-
if (edits.length === 0) {
|
|
78
|
-
return code;
|
|
79
|
-
}
|
|
80
|
-
edits.sort((left, right) => right.start - left.start);
|
|
81
|
-
let rewritten = code;
|
|
82
|
-
for (const edit of edits) {
|
|
83
|
-
rewritten = rewritten.slice(0, edit.start) + edit.replacement + rewritten.slice(edit.end);
|
|
84
|
-
}
|
|
85
|
-
return rewritten;
|
|
86
|
-
}
|
|
87
|
-
function getBrowserRuntimeImportRewriteMap(plugin) {
|
|
88
|
-
return plugin[BROWSER_RUNTIME_IMPORT_REWRITE_MAP];
|
|
59
|
+
}
|
|
60
|
+
const mappedPath = options.specifierMap.get(options.source.value);
|
|
61
|
+
if (!mappedPath || typeof options.source.start !== 'number' || typeof options.source.end !== 'number') {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const quote = options.code[options.source.start] === "'" ? "'" : '"';
|
|
65
|
+
options.edits.push({
|
|
66
|
+
start: options.source.start,
|
|
67
|
+
end: options.source.end,
|
|
68
|
+
replacement: `${quote}${mappedPath}${quote}`,
|
|
69
|
+
});
|
|
89
70
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Rewrites static ESM import/export specifiers and string-literal dynamic imports
|
|
73
|
+
* from manifest-owned runtime specifiers to concrete browser public URLs.
|
|
74
|
+
*
|
|
75
|
+
* Exposed for the post-build rewriter and for tests.
|
|
76
|
+
*/
|
|
77
|
+
export function rewriteBrowserRuntimeImports(code, specifierMap, filePath = 'browser-runtime-imports.js') {
|
|
78
|
+
if (specifierMap.size === 0) {
|
|
79
|
+
return code;
|
|
80
|
+
}
|
|
81
|
+
const edits = [];
|
|
82
|
+
try {
|
|
83
|
+
const result = cachedParseSync(filePath, code, {
|
|
84
|
+
sourceType: 'module',
|
|
85
|
+
lang: path.extname(filePath).endsWith('x') ? 'tsx' : 'ts',
|
|
86
|
+
});
|
|
87
|
+
const walk = (node) => {
|
|
88
|
+
if (!isRecord(node)) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (node.type === 'ImportDeclaration' ||
|
|
92
|
+
node.type === 'ExportNamedDeclaration' ||
|
|
93
|
+
node.type === 'ExportAllDeclaration') {
|
|
94
|
+
queueReplacement({ code, source: node.source, specifierMap, edits });
|
|
95
|
+
}
|
|
96
|
+
if (node.type === 'ImportExpression' && isRecord(node.source)) {
|
|
97
|
+
if (node.source.type === 'StringLiteral' || node.source.type === 'Literal') {
|
|
98
|
+
queueReplacement({ code, source: node.source, specifierMap, edits });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (const value of Object.values(node)) {
|
|
102
|
+
if (Array.isArray(value)) {
|
|
103
|
+
for (const child of value) {
|
|
104
|
+
walk(child);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
walk(value);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
walk(result.program);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return code;
|
|
96
116
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
merged.set(specifier, publicPath);
|
|
100
|
-
}
|
|
117
|
+
if (edits.length === 0) {
|
|
118
|
+
return code;
|
|
101
119
|
}
|
|
102
|
-
|
|
103
|
-
|
|
120
|
+
edits.sort((left, right) => right.start - left.start);
|
|
121
|
+
let rewritten = code;
|
|
122
|
+
for (const edit of edits) {
|
|
123
|
+
rewritten = rewritten.slice(0, edit.start) + edit.replacement + rewritten.slice(edit.end);
|
|
124
|
+
}
|
|
125
|
+
return rewritten;
|
|
126
|
+
}
|
|
127
|
+
export function getBrowserRuntimeImportRewriteMap(plugin) {
|
|
128
|
+
return plugin[BROWSER_RUNTIME_IMPORT_REWRITE_MAP];
|
|
104
129
|
}
|
|
105
|
-
function
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const specifierKeys = Array.from(specifierMap.keys());
|
|
117
|
-
const plugin = {
|
|
118
|
-
name: options.name ?? DEFAULT_BROWSER_RUNTIME_PLUGIN_NAME,
|
|
119
|
-
setup(build) {
|
|
120
|
-
build.onResolve({ filter: specifierFilter }, (args) => {
|
|
121
|
-
const mappedPath = specifierMap.get(args.path);
|
|
122
|
-
if (!mappedPath) {
|
|
123
|
-
return void 0;
|
|
130
|
+
export function collectBrowserRuntimeImportRewriteMap(plugins) {
|
|
131
|
+
const merged = new Map();
|
|
132
|
+
for (const plugin of plugins ?? []) {
|
|
133
|
+
const specifierMap = getBrowserRuntimeImportRewriteMap(plugin);
|
|
134
|
+
if (!specifierMap) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
for (const [specifier, publicPath] of specifierMap.entries()) {
|
|
138
|
+
if (!merged.has(specifier)) {
|
|
139
|
+
merged.set(specifier, publicPath);
|
|
140
|
+
}
|
|
124
141
|
}
|
|
125
|
-
return {
|
|
126
|
-
path: mappedPath,
|
|
127
|
-
external
|
|
128
|
-
};
|
|
129
|
-
});
|
|
130
|
-
if (matchPublicPaths) {
|
|
131
|
-
build.onResolve({ filter: /^\// }, (args) => {
|
|
132
|
-
if (!publicPathSet.has(args.path)) {
|
|
133
|
-
return void 0;
|
|
134
|
-
}
|
|
135
|
-
return {
|
|
136
|
-
path: args.path,
|
|
137
|
-
external: true
|
|
138
|
-
};
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
if (rewriteImports) {
|
|
142
|
-
build.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, (args) => {
|
|
143
|
-
if (!path.isAbsolute(args.path) || !existsSync(args.path)) {
|
|
144
|
-
return void 0;
|
|
145
|
-
}
|
|
146
|
-
const code = readFileSync(args.path, "utf-8");
|
|
147
|
-
if (!specifierKeys.some((specifier) => code.includes(specifier))) {
|
|
148
|
-
return void 0;
|
|
149
|
-
}
|
|
150
|
-
const rewritten = rewriteBrowserRuntimeImports(code, specifierMap, args.path);
|
|
151
|
-
if (rewritten === code) {
|
|
152
|
-
return void 0;
|
|
153
|
-
}
|
|
154
|
-
return {
|
|
155
|
-
contents: rewritten,
|
|
156
|
-
loader: inferLoaderFromPath(args.path),
|
|
157
|
-
resolveDir: path.dirname(args.path)
|
|
158
|
-
};
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
142
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
143
|
+
return merged;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Creates a build plugin that exposes the union of browser-runtime
|
|
147
|
+
* manifest behaviors (alias resolution, public-path matching, and source
|
|
148
|
+
* import/export rewrite). See {@link CreateBrowserRuntimePluginOptions}
|
|
149
|
+
* for per-behavior toggles.
|
|
150
|
+
*
|
|
151
|
+
* Returns `null` for an empty manifest so callers can short-circuit
|
|
152
|
+
* registration without sprinkling `if (plugin)` everywhere.
|
|
153
|
+
*/
|
|
154
|
+
export function createBrowserRuntimePlugin(options) {
|
|
155
|
+
const { manifest } = options;
|
|
156
|
+
const specifierMap = getBrowserRuntimeSpecifierMap(manifest);
|
|
157
|
+
const specifierFilter = buildSpecifierFilter(specifierMap);
|
|
158
|
+
if (!specifierFilter) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
const external = options.external ?? true;
|
|
162
|
+
const rewriteImports = options.rewriteImports ?? true;
|
|
163
|
+
const matchPublicPaths = options.matchPublicPaths ?? true;
|
|
164
|
+
const publicPathSet = new Set(specifierMap.values());
|
|
165
|
+
const specifierKeys = Array.from(specifierMap.keys());
|
|
166
|
+
const plugin = {
|
|
167
|
+
name: options.name ?? DEFAULT_BROWSER_RUNTIME_PLUGIN_NAME,
|
|
168
|
+
setup(build) {
|
|
169
|
+
build.onResolve({ filter: specifierFilter }, (args) => {
|
|
170
|
+
const mappedPath = specifierMap.get(args.path);
|
|
171
|
+
if (!mappedPath) {
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
path: mappedPath,
|
|
176
|
+
external,
|
|
177
|
+
};
|
|
178
|
+
});
|
|
179
|
+
if (matchPublicPaths) {
|
|
180
|
+
build.onResolve({ filter: /^\// }, (args) => {
|
|
181
|
+
if (!publicPathSet.has(args.path)) {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
path: args.path,
|
|
186
|
+
external: true,
|
|
187
|
+
};
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
if (rewriteImports) {
|
|
191
|
+
build.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, (args) => {
|
|
192
|
+
if (!path.isAbsolute(args.path) || !existsSync(args.path)) {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
const code = readFileSync(args.path, 'utf-8');
|
|
196
|
+
/**
|
|
197
|
+
* Fast-path optimization: skip AST parsing for files that don't contain
|
|
198
|
+
* any manifest-owned specifiers. This avoids expensive oxc-parser calls
|
|
199
|
+
* on every JS/TS file in the dependency graph.
|
|
200
|
+
*/
|
|
201
|
+
if (!specifierKeys.some((specifier) => code.includes(specifier))) {
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
const rewritten = rewriteBrowserRuntimeImports(code, specifierMap, args.path);
|
|
205
|
+
if (rewritten === code) {
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
contents: rewritten,
|
|
210
|
+
loader: inferLoaderFromPath(args.path),
|
|
211
|
+
resolveDir: path.dirname(args.path),
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
plugin[BROWSER_RUNTIME_IMPORT_REWRITE_MAP] = specifierMap;
|
|
218
|
+
return plugin;
|
|
165
219
|
}
|
|
166
|
-
export {
|
|
167
|
-
BROWSER_RUNTIME_IMPORT_REWRITE_MAP,
|
|
168
|
-
DEFAULT_BROWSER_RUNTIME_PLUGIN_NAME,
|
|
169
|
-
collectBrowserRuntimeImportRewriteMap,
|
|
170
|
-
createBrowserRuntimePlugin,
|
|
171
|
-
getBrowserRuntimeImportRewriteMap,
|
|
172
|
-
rewriteBrowserRuntimeImports
|
|
173
|
-
};
|
|
@@ -1,41 +1,55 @@
|
|
|
1
|
-
import { createForeignJsxOverridePlugin } from
|
|
2
|
-
import { collectJsxExtensions, filterJsxSourceExtensions } from
|
|
1
|
+
import { createForeignJsxOverridePlugin } from '../../plugins/foreign-jsx-override-plugin.js';
|
|
2
|
+
import { collectJsxExtensions, filterJsxSourceExtensions } from '../../plugins/jsx-import-source.utils.js';
|
|
3
3
|
function collectJsxExtensionEntries(appConfig) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
return (appConfig.integrations ?? [])
|
|
5
|
+
.filter((integration) => integration.jsxImportSource)
|
|
6
|
+
.flatMap((integration) => filterJsxSourceExtensions(integration.extensions).map((extension) => ({ integration, extension })))
|
|
7
|
+
.sort((left, right) => right.extension.length - left.extension.length);
|
|
7
8
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Foreign JSX override plugins for mixed-integration app builds.
|
|
11
|
+
*
|
|
12
|
+
* Each plugin rewrites files for one `(integration, extension)` pair with that
|
|
13
|
+
* integration's own `@jsxImportSource` so the bundler preserves the owning JSX
|
|
14
|
+
* runtime for native extension ownership.
|
|
15
|
+
*
|
|
16
|
+
* Extensions are sorted longest-first so `.page.react.tsx` wins over `.tsx`.
|
|
17
|
+
*/
|
|
18
|
+
export function getJsxOwnershipPlugins(appConfig) {
|
|
19
|
+
const jsxExtensions = collectJsxExtensionEntries(appConfig);
|
|
20
|
+
return jsxExtensions.map(({ integration, extension }) => createForeignJsxOverridePlugin({
|
|
21
|
+
hostJsxImportSource: integration.jsxImportSource,
|
|
22
|
+
foreignExtensions: [extension],
|
|
23
|
+
excludeExtensions: jsxExtensions
|
|
24
|
+
.filter((candidate) => candidate.extension.length > extension.length)
|
|
25
|
+
.filter((candidate) => candidate.extension.endsWith(extension))
|
|
26
|
+
.map((candidate) => candidate.extension),
|
|
27
|
+
name: `ecopages-jsx-ownership-${integration.name}-${extension.replace(/[^a-zA-Z0-9]+/g, '-')}`,
|
|
28
|
+
}));
|
|
18
29
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Host-scoped JSX override plugins for one integration's client bundle graph.
|
|
32
|
+
*
|
|
33
|
+
* When a host integration (for example React) bundles foreign `.tsx` files, those
|
|
34
|
+
* files must compile with the host JSX runtime instead of the project default.
|
|
35
|
+
* Use this helper for host-owned client bundles. For app-wide transpilation that
|
|
36
|
+
* should preserve each integration's native JSX runtime, use
|
|
37
|
+
* {@link getJsxOwnershipPlugins} instead.
|
|
38
|
+
*/
|
|
39
|
+
export function getHostScopedJsxOwnershipPlugins(appConfig, hostIntegrationName, options) {
|
|
40
|
+
const hostIntegration = (appConfig.integrations ?? []).find((integration) => integration.name === hostIntegrationName);
|
|
41
|
+
const hostJsxImportSource = hostIntegration?.jsxImportSource;
|
|
42
|
+
if (!hostJsxImportSource) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
const foreignExtensions = collectJsxExtensions(appConfig.integrations ?? [], {
|
|
46
|
+
excludeIntegrationName: hostIntegrationName,
|
|
47
|
+
});
|
|
48
|
+
return [
|
|
49
|
+
createForeignJsxOverridePlugin({
|
|
50
|
+
name: options?.name ?? `ecopages-jsx-ownership-host-${hostIntegrationName}`,
|
|
51
|
+
hostJsxImportSource,
|
|
52
|
+
foreignExtensions,
|
|
53
|
+
}),
|
|
54
|
+
];
|
|
37
55
|
}
|
|
38
|
-
export {
|
|
39
|
-
getHostScopedJsxOwnershipPlugins,
|
|
40
|
-
getJsxOwnershipPlugins
|
|
41
|
-
};
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/** Returns whether the current thread is the Lit static-render worker. */
|
|
2
|
+
export function isLitStaticRenderWorkerThread() {
|
|
3
|
+
return process.env.ECOPAGES_LIT_STATIC_RENDER_WORKER === 'true';
|
|
3
4
|
}
|
|
4
|
-
export {
|
|
5
|
-
isLitStaticRenderWorkerThread
|
|
6
|
-
};
|