@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,159 +1,235 @@
|
|
|
1
|
-
import { existsSync, readFileSync, realpathSync } from
|
|
2
|
-
import path from
|
|
3
|
-
import { ResolverFactory } from
|
|
4
|
-
const RESOLVABLE_EXTENSIONS = [
|
|
5
|
-
const resolverCache =
|
|
6
|
-
const pathPrefixCache =
|
|
1
|
+
import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { ResolverFactory } from 'oxc-resolver';
|
|
4
|
+
const RESOLVABLE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mdx'];
|
|
5
|
+
const resolverCache = new Map();
|
|
6
|
+
const pathPrefixCache = new Map();
|
|
7
7
|
function stripJsonComments(source) {
|
|
8
|
-
|
|
8
|
+
return source.replace(/\/\*[\s\S]*?\*\//g, '').replace(/^\s*\/\/.*$/gm, '');
|
|
9
9
|
}
|
|
10
10
|
function findTsconfigPath(projectRoot) {
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
const candidate = path.join(projectRoot, 'tsconfig.json');
|
|
12
|
+
return existsSync(candidate) ? candidate : undefined;
|
|
13
13
|
}
|
|
14
14
|
function readJsonFile(filePath) {
|
|
15
|
-
|
|
16
|
-
try {
|
|
17
|
-
return JSON.parse(source);
|
|
18
|
-
} catch {
|
|
19
|
-
return JSON.parse(stripJsonComments(source));
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
function loadTsconfigPathPrefixes(projectRoot) {
|
|
23
|
-
const cached = pathPrefixCache.get(projectRoot);
|
|
24
|
-
if (cached) {
|
|
25
|
-
return cached;
|
|
26
|
-
}
|
|
27
|
-
const tsconfigPath = findTsconfigPath(projectRoot);
|
|
28
|
-
if (!tsconfigPath) {
|
|
29
|
-
pathPrefixCache.set(projectRoot, []);
|
|
30
|
-
return [];
|
|
31
|
-
}
|
|
32
|
-
const prefixes = /* @__PURE__ */ new Set();
|
|
33
|
-
const visited = /* @__PURE__ */ new Set();
|
|
34
|
-
const collectFromConfig = (configPath) => {
|
|
35
|
-
const normalized = path.resolve(configPath);
|
|
36
|
-
if (visited.has(normalized)) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
visited.add(normalized);
|
|
40
|
-
let config;
|
|
15
|
+
const source = readFileSync(filePath, 'utf8');
|
|
41
16
|
try {
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const parentPath = path.resolve(path.dirname(normalized), config.extends);
|
|
48
|
-
collectFromConfig(parentPath);
|
|
49
|
-
}
|
|
50
|
-
for (const key of Object.keys(config.compilerOptions?.paths ?? {})) {
|
|
51
|
-
if (key.endsWith("/*")) {
|
|
52
|
-
prefixes.add(key.slice(0, -1));
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
if (key.endsWith("*")) {
|
|
56
|
-
prefixes.add(key.slice(0, -1));
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
prefixes.add(key);
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
collectFromConfig(tsconfigPath);
|
|
63
|
-
const resolvedPrefixes = [...prefixes];
|
|
64
|
-
pathPrefixCache.set(projectRoot, resolvedPrefixes);
|
|
65
|
-
return resolvedPrefixes;
|
|
17
|
+
return JSON.parse(source);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return JSON.parse(stripJsonComments(source));
|
|
21
|
+
}
|
|
66
22
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Loads `compilerOptions.paths` keys from tsconfig, following `extends` recursively.
|
|
25
|
+
*/
|
|
26
|
+
export function loadTsconfigPathPrefixes(projectRoot) {
|
|
27
|
+
const cached = pathPrefixCache.get(projectRoot);
|
|
28
|
+
if (cached) {
|
|
29
|
+
return cached;
|
|
30
|
+
}
|
|
31
|
+
const tsconfigPath = findTsconfigPath(projectRoot);
|
|
32
|
+
if (!tsconfigPath) {
|
|
33
|
+
pathPrefixCache.set(projectRoot, []);
|
|
34
|
+
return [];
|
|
71
35
|
}
|
|
72
|
-
|
|
73
|
-
|
|
36
|
+
const prefixes = new Set();
|
|
37
|
+
const visited = new Set();
|
|
38
|
+
const collectFromConfig = (configPath) => {
|
|
39
|
+
const normalized = path.resolve(configPath);
|
|
40
|
+
if (visited.has(normalized)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
visited.add(normalized);
|
|
44
|
+
let config;
|
|
45
|
+
try {
|
|
46
|
+
config = readJsonFile(normalized);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (typeof config.extends === 'string') {
|
|
52
|
+
const parentPath = path.resolve(path.dirname(normalized), config.extends);
|
|
53
|
+
collectFromConfig(parentPath);
|
|
54
|
+
}
|
|
55
|
+
for (const key of Object.keys(config.compilerOptions?.paths ?? {})) {
|
|
56
|
+
if (key.endsWith('/*')) {
|
|
57
|
+
prefixes.add(key.slice(0, -1));
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (key.endsWith('*')) {
|
|
61
|
+
prefixes.add(key.slice(0, -1));
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
prefixes.add(key);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
collectFromConfig(tsconfigPath);
|
|
68
|
+
const resolvedPrefixes = [...prefixes];
|
|
69
|
+
pathPrefixCache.set(projectRoot, resolvedPrefixes);
|
|
70
|
+
return resolvedPrefixes;
|
|
74
71
|
}
|
|
75
|
-
function
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
72
|
+
export function matchesTsconfigPathPrefix(specifier, prefixes) {
|
|
73
|
+
return prefixes.some((prefix) => {
|
|
74
|
+
if (prefix.endsWith('/')) {
|
|
75
|
+
return specifier.startsWith(prefix);
|
|
76
|
+
}
|
|
77
|
+
return specifier === prefix || specifier.startsWith(`${prefix}/`);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Returns true when `specifier` looks like a bare npm package import rather than
|
|
82
|
+
* a relative path, absolute path, node built-in, tsconfig alias, or `#` import map.
|
|
83
|
+
*/
|
|
84
|
+
export function isBarePackageImportSpecifier(specifier, projectRoot) {
|
|
85
|
+
if (specifier.startsWith('.') || path.isAbsolute(specifier) || specifier.startsWith('/')) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
if (specifier.startsWith('node:') || specifier.startsWith('#') || specifier.includes(':')) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
if (projectRoot && matchesTsconfigPathPrefix(specifier, loadTsconfigPathPrefixes(projectRoot))) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
86
95
|
}
|
|
87
96
|
function getResolverFactory(projectRoot) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
97
|
+
const cached = resolverCache.get(projectRoot);
|
|
98
|
+
if (cached) {
|
|
99
|
+
return cached;
|
|
100
|
+
}
|
|
101
|
+
const tsconfigPath = findTsconfigPath(projectRoot);
|
|
102
|
+
if (!tsconfigPath) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
const resolver = new ResolverFactory({
|
|
106
|
+
tsconfig: {
|
|
107
|
+
configFile: tsconfigPath,
|
|
108
|
+
},
|
|
109
|
+
extensions: [...RESOLVABLE_EXTENSIONS],
|
|
110
|
+
});
|
|
111
|
+
resolverCache.set(projectRoot, resolver);
|
|
112
|
+
return resolver;
|
|
113
|
+
}
|
|
114
|
+
const BROWSER_PACKAGE_CONDITION_NAMES = ['browser', 'module', 'import', 'default'];
|
|
115
|
+
const BROWSER_PACKAGE_MAIN_FIELDS = ['browser', 'module', 'main'];
|
|
116
|
+
const browserPackageResolvers = new Map();
|
|
117
|
+
function getBrowserPackageResolver(projectRoot) {
|
|
118
|
+
const normalizedRoot = path.resolve(projectRoot);
|
|
119
|
+
const cached = browserPackageResolvers.get(normalizedRoot);
|
|
120
|
+
if (cached) {
|
|
121
|
+
return cached;
|
|
122
|
+
}
|
|
123
|
+
const resolver = new ResolverFactory({
|
|
124
|
+
conditionNames: [...BROWSER_PACKAGE_CONDITION_NAMES],
|
|
125
|
+
mainFields: [...BROWSER_PACKAGE_MAIN_FIELDS],
|
|
126
|
+
extensions: [...RESOLVABLE_EXTENSIONS],
|
|
127
|
+
});
|
|
128
|
+
browserPackageResolvers.set(normalizedRoot, resolver);
|
|
129
|
+
return resolver;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Resolves a bare npm package entry for browser vendor prebundles.
|
|
133
|
+
*
|
|
134
|
+
* @remarks
|
|
135
|
+
* Prefer package `"browser"` / `"exports.browser"` over Node `"import"` entries.
|
|
136
|
+
* `createRequire().resolve()` is wrong here — it selects the server facade for
|
|
137
|
+
* dual packages such as `@ecopages/core`.
|
|
138
|
+
*/
|
|
139
|
+
export function resolveBarePackageBrowserEntry(projectRoot, specifier) {
|
|
140
|
+
const result = getBrowserPackageResolver(projectRoot).sync(projectRoot, specifier);
|
|
141
|
+
if (result.error || !result.path) {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
return realpathSync(result.path);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return result.path;
|
|
149
|
+
}
|
|
104
150
|
}
|
|
105
151
|
function resolveAliasedBarrelTarget(resolvedPath) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
152
|
+
if (!path.basename(resolvedPath).startsWith('index.')) {
|
|
153
|
+
return resolvedPath;
|
|
154
|
+
}
|
|
155
|
+
const source = readFileSync(resolvedPath, 'utf8').trim();
|
|
156
|
+
const match = source.match(/^export\s+\*\s+from\s+['"]([^'"]+)['"]\s*;?$/);
|
|
157
|
+
if (!match?.[1]?.startsWith('.')) {
|
|
158
|
+
return resolvedPath;
|
|
159
|
+
}
|
|
160
|
+
const targetDir = path.dirname(resolvedPath);
|
|
161
|
+
const targetBase = path.resolve(targetDir, match[1]);
|
|
162
|
+
for (const extension of RESOLVABLE_EXTENSIONS) {
|
|
163
|
+
const candidate = `${targetBase}${extension}`;
|
|
164
|
+
if (existsSync(candidate)) {
|
|
165
|
+
return candidate;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
for (const extension of RESOLVABLE_EXTENSIONS) {
|
|
169
|
+
const candidate = path.join(targetBase, `index${extension}`);
|
|
170
|
+
if (existsSync(candidate)) {
|
|
171
|
+
return candidate;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
112
174
|
return resolvedPath;
|
|
113
|
-
}
|
|
114
|
-
const targetDir = path.dirname(resolvedPath);
|
|
115
|
-
const targetBase = path.resolve(targetDir, match[1]);
|
|
116
|
-
for (const extension of RESOLVABLE_EXTENSIONS) {
|
|
117
|
-
const candidate = `${targetBase}${extension}`;
|
|
118
|
-
if (existsSync(candidate)) {
|
|
119
|
-
return candidate;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
for (const extension of RESOLVABLE_EXTENSIONS) {
|
|
123
|
-
const candidate = path.join(targetBase, `index${extension}`);
|
|
124
|
-
if (existsSync(candidate)) {
|
|
125
|
-
return candidate;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return resolvedPath;
|
|
129
175
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
176
|
+
/**
|
|
177
|
+
* Resolves a relative import against the filesystem without requiring tsconfig.
|
|
178
|
+
*
|
|
179
|
+
* @remarks
|
|
180
|
+
* Used when oxc-resolver has no tsconfig (minimal fixtures / apps without paths)
|
|
181
|
+
* and as a fallback when the resolver cannot locate a relative specifier.
|
|
182
|
+
*/
|
|
183
|
+
export function resolveRelativeModulePath(fromFile, specifier) {
|
|
184
|
+
if (!specifier.startsWith('.')) {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
const targetBase = path.resolve(path.dirname(fromFile), specifier);
|
|
188
|
+
if (existsSync(targetBase)) {
|
|
189
|
+
return path.resolve(targetBase);
|
|
190
|
+
}
|
|
191
|
+
for (const candidateExtension of RESOLVABLE_EXTENSIONS) {
|
|
192
|
+
const candidate = `${targetBase}${candidateExtension}`;
|
|
193
|
+
if (existsSync(candidate)) {
|
|
194
|
+
return path.resolve(candidate);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
for (const candidateExtension of RESOLVABLE_EXTENSIONS) {
|
|
198
|
+
const candidate = path.join(targetBase, `index${candidateExtension}`);
|
|
199
|
+
if (existsSync(candidate)) {
|
|
200
|
+
return path.resolve(candidate);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return undefined;
|
|
146
204
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
205
|
+
/**
|
|
206
|
+
* Resolves a relative or tsconfig path alias import (via oxc-resolver).
|
|
207
|
+
*/
|
|
208
|
+
export function resolveProjectModulePath(projectRoot, fromFile, specifier) {
|
|
209
|
+
const prefixes = loadTsconfigPathPrefixes(projectRoot);
|
|
210
|
+
const isRelative = specifier.startsWith('.');
|
|
211
|
+
const isPathAlias = matchesTsconfigPathPrefix(specifier, prefixes);
|
|
212
|
+
if (!isRelative && !isPathAlias) {
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
const resolver = getResolverFactory(projectRoot);
|
|
216
|
+
if (resolver) {
|
|
217
|
+
const result = resolver.sync(path.dirname(fromFile), specifier);
|
|
218
|
+
if (result.path) {
|
|
219
|
+
return resolveAliasedBarrelTarget(realpathSync(result.path));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (isRelative) {
|
|
223
|
+
return resolveRelativeModulePath(fromFile, specifier);
|
|
224
|
+
}
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Resolves a TS path alias import using the app's tsconfig `paths` (via oxc-resolver).
|
|
229
|
+
*/
|
|
230
|
+
export function resolveProjectImportPath(projectRoot, fromFile, specifier) {
|
|
231
|
+
if (!matchesTsconfigPathPrefix(specifier, loadTsconfigPathPrefixes(projectRoot))) {
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
return resolveProjectModulePath(projectRoot, fromFile, specifier);
|
|
152
235
|
}
|
|
153
|
-
export {
|
|
154
|
-
isBarePackageImportSpecifier,
|
|
155
|
-
loadTsconfigPathPrefixes,
|
|
156
|
-
matchesTsconfigPathPrefix,
|
|
157
|
-
resolveProjectImportPath,
|
|
158
|
-
resolveProjectModulePath
|
|
159
|
-
};
|
|
@@ -41,6 +41,10 @@ Mixed-integration apps use two separate mechanisms:
|
|
|
41
41
|
|
|
42
42
|
See [`../build/README.md`](../build/README.md) for the JSX ownership helper split.
|
|
43
43
|
|
|
44
|
+
## Document shell composition
|
|
45
|
+
|
|
46
|
+
`composeDocumentShell` in core is the single string-shell primitive for wrapping a primary component with optional layout tiers and an Html template. Integrations may supply an optional `composeChildren` hook to replace sequential string wrapping with a unified tree (for example React element children) while still delegating foreign subtrees through `renderComponentWithForeignChildren`.
|
|
47
|
+
|
|
44
48
|
## Main Files
|
|
45
49
|
|
|
46
50
|
### `route-renderer.ts`
|
|
@@ -63,6 +67,12 @@ Domain folders:
|
|
|
63
67
|
- `route-pipeline/`: route preparation, final HTML capture, marker-artifact enforcement
|
|
64
68
|
- `page-browser-graph/`: browser asset graph build, session cache, and injector assets
|
|
65
69
|
|
|
70
|
+
**Page Browser Graph session behavior:**
|
|
71
|
+
|
|
72
|
+
- In development, each Page Browser Graph is built on first request, cached in `page-browser-graph-session` with generation-safe commits, and invalidated when a tracked dependency changes. Hosts call `prepareHmrFileChange()` before HMR dispatch and defer client broadcasts when no browser subscribers are connected.
|
|
73
|
+
- Production static export prebuilds browser graphs from the finalized route list into the in-memory `page-browser-graph-session` via `production-page-browser-graph-prebuild.ts`. Failed exports clear staged production session records so retries cannot reuse partial graph output.
|
|
74
|
+
- Integrations activate lazily on first render or graph prebuild via `ensureIntegrationRuntimeReady()`. Processors and loaders still initialize eagerly during `setupAppRuntimePlugins()`.
|
|
75
|
+
|
|
66
76
|
### `page-loading/`
|
|
67
77
|
|
|
68
78
|
- `page-module-loader.ts`: imports page modules and normalizes page exports
|
|
@@ -115,7 +125,8 @@ Not every integration needs queue-based handoff.
|
|
|
115
125
|
## React Island Notes
|
|
116
126
|
|
|
117
127
|
- React islands are emitted without synthetic wrapper elements.
|
|
118
|
-
- The React integration attaches `data-eco-component-id` to the SSR root when a single root exists.
|
|
128
|
+
- The React integration attaches island host attributes (`data-eco-island`, `data-eco-component-id`, `data-eco-component-key`, `data-eco-props`) to the SSR root when a single root exists.
|
|
129
|
+
- Other integrations call `finalizeIslandComponentRender()` from core when a component instance ships client scripts. See `packages/core/src/islands/README.md`.
|
|
119
130
|
- The island bootstrap mounts with `createRoot()` into that SSR root.
|
|
120
131
|
- Hydration bootstraps listen for `eco:after-swap` so islands hydrate after client-side navigation.
|
|
121
132
|
|