@ecopages/core 0.2.0-beta.31 → 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,70 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalizes a comma-separated scripts string into absolute script URLs.
|
|
3
|
+
*
|
|
4
|
+
* @param scripts Comma-separated script paths.
|
|
5
|
+
* @returns Normalized script path list.
|
|
6
|
+
*/
|
|
1
7
|
function normalizeScripts(scripts) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
return scripts
|
|
9
|
+
.split(',')
|
|
10
|
+
.map((scriptPath) => scriptPath.trim())
|
|
11
|
+
.filter(Boolean)
|
|
12
|
+
.map((scriptPath) => {
|
|
13
|
+
if (scriptPath.startsWith('/')) {
|
|
14
|
+
return scriptPath;
|
|
15
|
+
}
|
|
16
|
+
const normalizedRelativePath = scriptPath.replace(/^\/+/, '').replace(/^(\.\/)+/, '');
|
|
17
|
+
return `/${normalizedRelativePath}`;
|
|
18
|
+
});
|
|
9
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Deduplicates comma-separated values while preserving first-seen order.
|
|
22
|
+
*
|
|
23
|
+
* @param values CSV value list.
|
|
24
|
+
* @returns A single normalized CSV string.
|
|
25
|
+
*/
|
|
10
26
|
function dedupeCsvValues(values) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
27
|
+
const seen = new Set();
|
|
28
|
+
for (const value of values) {
|
|
29
|
+
for (const token of value
|
|
30
|
+
.split(',')
|
|
31
|
+
.map((part) => part.trim())
|
|
32
|
+
.filter(Boolean)) {
|
|
33
|
+
seen.add(token);
|
|
34
|
+
}
|
|
15
35
|
}
|
|
16
|
-
|
|
17
|
-
return Array.from(seen).join(",");
|
|
36
|
+
return Array.from(seen).join(',');
|
|
18
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Builds a scripts-injector map config from resolved lazy script groups.
|
|
40
|
+
*
|
|
41
|
+
* @param lazyGroups Lazy script groups resolved during dependency processing.
|
|
42
|
+
* @returns Injector map config keyed by lazy trigger.
|
|
43
|
+
*/
|
|
19
44
|
function buildInjectorMap(lazyGroups) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
const map = {};
|
|
46
|
+
for (const group of lazyGroups) {
|
|
47
|
+
const scripts = normalizeScripts(group.scripts);
|
|
48
|
+
const lazy = group.lazy;
|
|
49
|
+
if ('on:idle' in lazy) {
|
|
50
|
+
map['on:idle'] = {
|
|
51
|
+
scripts: [...(map['on:idle']?.scripts ?? []), ...scripts],
|
|
52
|
+
};
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if ('on:interaction' in lazy) {
|
|
56
|
+
const currentValue = map['on:interaction']?.value;
|
|
57
|
+
const nextValue = lazy['on:interaction'];
|
|
58
|
+
map['on:interaction'] = {
|
|
59
|
+
value: typeof currentValue === 'string' ? dedupeCsvValues([currentValue, nextValue]) : nextValue,
|
|
60
|
+
scripts: [...(map['on:interaction']?.scripts ?? []), ...scripts],
|
|
61
|
+
};
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if ('on:visible' in lazy) {
|
|
65
|
+
const currentValue = map['on:visible']?.value;
|
|
66
|
+
const currentThreshold = typeof currentValue === 'string' ? currentValue : undefined;
|
|
67
|
+
const nextValue = lazy['on:visible'];
|
|
68
|
+
map['on:visible'] = {
|
|
69
|
+
...(nextValue === true
|
|
70
|
+
? currentThreshold
|
|
71
|
+
? { value: currentThreshold }
|
|
72
|
+
: {}
|
|
73
|
+
: { value: String(nextValue) }),
|
|
74
|
+
scripts: [...(map['on:visible']?.scripts ?? []), ...scripts],
|
|
75
|
+
};
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
throw new Error(`Invalid lazy options: must specify on:idle, on:interaction, or on:visible. Received: ${JSON.stringify(lazy)}`);
|
|
48
79
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
...map[key],
|
|
58
|
-
scripts: Array.from(new Set(scripts))
|
|
59
|
-
};
|
|
80
|
+
for (const key of Object.keys(map)) {
|
|
81
|
+
const scripts = map[key]?.scripts;
|
|
82
|
+
if (scripts) {
|
|
83
|
+
map[key] = {
|
|
84
|
+
...map[key],
|
|
85
|
+
scripts: Array.from(new Set(scripts)),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
60
88
|
}
|
|
61
|
-
|
|
62
|
-
return map;
|
|
89
|
+
return map;
|
|
63
90
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
91
|
+
/**
|
|
92
|
+
* Creates a safe JSON payload string for `<script type="ecopages/injector-map">`.
|
|
93
|
+
*
|
|
94
|
+
* @param lazyGroups Lazy script groups resolved during dependency processing.
|
|
95
|
+
* @returns Escaped JSON string safe for inline script embedding.
|
|
96
|
+
*/
|
|
97
|
+
export function buildInjectorMapScript(lazyGroups) {
|
|
98
|
+
const map = buildInjectorMap(lazyGroups);
|
|
99
|
+
return JSON.stringify(map).replace(/<\/script/gi, '<\\/script');
|
|
67
100
|
}
|
|
68
|
-
export {
|
|
69
|
-
buildInjectorMapScript
|
|
70
|
-
};
|
|
@@ -1,49 +1,57 @@
|
|
|
1
1
|
function normalizeImports(imports) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
if (!imports || imports.length === 0) {
|
|
3
|
+
return undefined;
|
|
4
|
+
}
|
|
5
|
+
const normalized = Array.from(new Set(imports.map((entry) => entry.trim()).filter((entry) => entry.length > 0)));
|
|
6
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
from,
|
|
29
|
-
|
|
30
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Parses a module grammar declaration into normalized object form.
|
|
10
|
+
*
|
|
11
|
+
* Supported input examples:
|
|
12
|
+
* - `react-aria-components`
|
|
13
|
+
* - `react-aria-components{Table,Select}`
|
|
14
|
+
*/
|
|
15
|
+
export function parseModuleDeclaration(value) {
|
|
16
|
+
const source = value.trim();
|
|
17
|
+
if (source.length === 0) {
|
|
18
|
+
throw new Error('Module declaration cannot be empty');
|
|
19
|
+
}
|
|
20
|
+
const openBraceIndex = source.indexOf('{');
|
|
21
|
+
if (openBraceIndex < 0) {
|
|
22
|
+
return { from: source };
|
|
23
|
+
}
|
|
24
|
+
const closeBraceIndex = source.lastIndexOf('}');
|
|
25
|
+
if (closeBraceIndex !== source.length - 1 || closeBraceIndex <= openBraceIndex) {
|
|
26
|
+
throw new Error(`Invalid module declaration '${value}'`);
|
|
27
|
+
}
|
|
28
|
+
const from = source.slice(0, openBraceIndex).trim();
|
|
29
|
+
if (from.length === 0) {
|
|
30
|
+
throw new Error(`Invalid module declaration '${value}'`);
|
|
31
|
+
}
|
|
32
|
+
const importsSlice = source.slice(openBraceIndex + 1, closeBraceIndex);
|
|
33
|
+
const imports = normalizeImports(importsSlice.split(','));
|
|
34
|
+
return {
|
|
35
|
+
from,
|
|
36
|
+
imports,
|
|
37
|
+
};
|
|
31
38
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Normalizes and deduplicates module declarations from `modules`.
|
|
41
|
+
*
|
|
42
|
+
* Returns canonical object declarations suitable for downstream bundling logic.
|
|
43
|
+
*/
|
|
44
|
+
export function normalizeModuleDeclarations(modules) {
|
|
45
|
+
const declarations = modules ?? [];
|
|
46
|
+
const output = [];
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
for (const declaration of declarations) {
|
|
49
|
+
const normalized = parseModuleDeclaration(declaration);
|
|
50
|
+
const key = `${normalized.from}::${(normalized.imports ?? []).join(',')}`;
|
|
51
|
+
if (!seen.has(key)) {
|
|
52
|
+
seen.add(key);
|
|
53
|
+
output.push(normalized);
|
|
54
|
+
}
|
|
42
55
|
}
|
|
43
|
-
|
|
44
|
-
return output;
|
|
56
|
+
return output;
|
|
45
57
|
}
|
|
46
|
-
export {
|
|
47
|
-
normalizeModuleDeclarations,
|
|
48
|
-
parseModuleDeclaration
|
|
49
|
-
};
|
|
@@ -1,59 +1,69 @@
|
|
|
1
1
|
function isLayoutSpecObject(spec) {
|
|
2
|
-
|
|
2
|
+
return typeof spec === 'object' && spec !== null && 'component' in spec;
|
|
3
3
|
}
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Normalizes `layout` page options to an outer→inner stack of layout entries.
|
|
6
|
+
*/
|
|
7
|
+
export function normalizePageLayouts(layout) {
|
|
8
|
+
if (!layout) {
|
|
9
|
+
return [];
|
|
10
|
+
}
|
|
11
|
+
const specs = Array.isArray(layout) ? layout : [layout];
|
|
12
|
+
return specs.map((spec) => {
|
|
13
|
+
if (isLayoutSpecObject(spec)) {
|
|
14
|
+
return {
|
|
15
|
+
component: spec.component,
|
|
16
|
+
props: spec.props,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
component: spec,
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Merges layout components into `dependencies.components` without duplicates.
|
|
26
|
+
*/
|
|
27
|
+
export function mergeLayoutDependencies(dependencies, layoutEntries) {
|
|
28
|
+
if (layoutEntries.length === 0) {
|
|
29
|
+
return dependencies;
|
|
30
|
+
}
|
|
31
|
+
const mergedComponents = [...(dependencies?.components ?? [])];
|
|
32
|
+
for (const entry of layoutEntries) {
|
|
33
|
+
if (!mergedComponents.includes(entry.component)) {
|
|
34
|
+
mergedComponents.push(entry.component);
|
|
35
|
+
}
|
|
15
36
|
}
|
|
16
37
|
return {
|
|
17
|
-
|
|
38
|
+
...dependencies,
|
|
39
|
+
components: mergedComponents,
|
|
18
40
|
};
|
|
19
|
-
});
|
|
20
41
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (!mergedComponents.includes(entry.component)) {
|
|
28
|
-
mergedComponents.push(entry.component);
|
|
42
|
+
/**
|
|
43
|
+
* Writes normalized layout metadata onto a page `config`.
|
|
44
|
+
*/
|
|
45
|
+
export function applyPageLayoutConfig(pageConfig, layoutEntries) {
|
|
46
|
+
if (layoutEntries.length === 0) {
|
|
47
|
+
return;
|
|
29
48
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
...dependencies,
|
|
33
|
-
components: mergedComponents
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
function applyPageLayoutConfig(pageConfig, layoutEntries) {
|
|
37
|
-
if (layoutEntries.length === 0) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
pageConfig.layouts = layoutEntries.map((entry) => entry.component);
|
|
41
|
-
pageConfig.layoutEntries = layoutEntries;
|
|
49
|
+
pageConfig.layouts = layoutEntries.map((entry) => entry.component);
|
|
50
|
+
pageConfig.layoutEntries = layoutEntries;
|
|
42
51
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Migrates MDX-exported `config.layout` values onto normalized layout metadata.
|
|
54
|
+
*
|
|
55
|
+
* @remarks
|
|
56
|
+
* `eco.page({ layout })` already normalizes at factory time. MDX modules that
|
|
57
|
+
* export `config.layout` directly still need this import-time migration.
|
|
58
|
+
*/
|
|
59
|
+
export function ensurePageConfigLayouts(config) {
|
|
60
|
+
if (!config || (config.layouts && config.layouts.length > 0)) {
|
|
61
|
+
return config;
|
|
62
|
+
}
|
|
63
|
+
const legacyLayout = config.layout;
|
|
64
|
+
if (!legacyLayout) {
|
|
65
|
+
return config;
|
|
66
|
+
}
|
|
67
|
+
applyPageLayoutConfig(config, normalizePageLayouts(legacyLayout));
|
|
49
68
|
return config;
|
|
50
|
-
}
|
|
51
|
-
applyPageLayoutConfig(config, normalizePageLayouts(legacyLayout));
|
|
52
|
-
return config;
|
|
53
69
|
}
|
|
54
|
-
export {
|
|
55
|
-
applyPageLayoutConfig,
|
|
56
|
-
ensurePageConfigLayouts,
|
|
57
|
-
mergeLayoutDependencies,
|
|
58
|
-
normalizePageLayouts
|
|
59
|
-
};
|
package/src/errors/http-error.js
CHANGED
|
@@ -1,50 +1,51 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
1
|
+
/**
|
|
2
|
+
* HTTP error class for structured error handling in route handlers.
|
|
3
|
+
* Provides static factory methods for common HTTP error responses.
|
|
4
|
+
*/
|
|
5
|
+
export class HttpError extends Error {
|
|
6
|
+
status;
|
|
7
|
+
details;
|
|
8
|
+
constructor(status, message, details) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'HttpError';
|
|
11
|
+
this.status = status;
|
|
12
|
+
this.details = details;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Serialize error to JSON for API responses.
|
|
16
|
+
*/
|
|
17
|
+
toJSON() {
|
|
18
|
+
const json = {
|
|
19
|
+
error: this.message,
|
|
20
|
+
status: this.status,
|
|
21
|
+
};
|
|
22
|
+
if (this.details) {
|
|
23
|
+
json.details = this.details;
|
|
24
|
+
}
|
|
25
|
+
return json;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create a Response object from this error.
|
|
29
|
+
*/
|
|
30
|
+
toResponse() {
|
|
31
|
+
return Response.json(this.toJSON(), { status: this.status });
|
|
32
|
+
}
|
|
33
|
+
static BadRequest(message = 'Bad Request', details) {
|
|
34
|
+
return new HttpError(400, message, details);
|
|
35
|
+
}
|
|
36
|
+
static Unauthorized(message = 'Unauthorized') {
|
|
37
|
+
return new HttpError(401, message);
|
|
38
|
+
}
|
|
39
|
+
static Forbidden(message = 'Forbidden') {
|
|
40
|
+
return new HttpError(403, message);
|
|
41
|
+
}
|
|
42
|
+
static NotFound(message = 'Not Found') {
|
|
43
|
+
return new HttpError(404, message);
|
|
44
|
+
}
|
|
45
|
+
static Conflict(message = 'Conflict', details) {
|
|
46
|
+
return new HttpError(409, message, details);
|
|
47
|
+
}
|
|
48
|
+
static InternalServerError(message = 'Internal Server Error') {
|
|
49
|
+
return new HttpError(500, message);
|
|
50
|
+
}
|
|
47
51
|
}
|
|
48
|
-
export {
|
|
49
|
-
HttpError
|
|
50
|
-
};
|
package/src/errors/index.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
UndeclaredComponentDependencyError,
|
|
5
|
-
getUndeclaredComponentDependencyMessage
|
|
6
|
-
} from "./undeclared-component-dependency-error.js";
|
|
7
|
-
export {
|
|
8
|
-
HttpError,
|
|
9
|
-
LocalsAccessError,
|
|
10
|
-
UndeclaredComponentDependencyError,
|
|
11
|
-
getUndeclaredComponentDependencyMessage
|
|
12
|
-
};
|
|
1
|
+
export { HttpError } from './http-error.js';
|
|
2
|
+
export { LocalsAccessError } from './locals-access-error.js';
|
|
3
|
+
export { UndeclaredComponentDependencyError, getUndeclaredComponentDependencyMessage, } from './undeclared-component-dependency-error.js';
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
class LocalsAccessError extends Error {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
export class LocalsAccessError extends Error {
|
|
2
|
+
name = 'LocalsAccessError';
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
}
|
|
6
6
|
}
|
|
7
|
-
export {
|
|
8
|
-
LocalsAccessError
|
|
9
|
-
};
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
function getUndeclaredComponentDependencyMessage(parentComponentFile) {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
export function getUndeclaredComponentDependencyMessage(parentComponentFile) {
|
|
2
|
+
const parentHint = parentComponentFile ? ` (declared by ${parentComponentFile})` : '';
|
|
3
|
+
return `[ecopages] dependencies.components entries must be eco.component(), eco.layout(), or eco.html() components with __eco metadata${parentHint}. Plain functions and untyped components are not valid dependency entries.`;
|
|
4
4
|
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when `dependencies.components` contains a plain function or component
|
|
7
|
+
* without plugin-injected `config.__eco` metadata.
|
|
8
|
+
*/
|
|
9
|
+
export class UndeclaredComponentDependencyError extends Error {
|
|
10
|
+
name = 'UndeclaredComponentDependencyError';
|
|
11
|
+
/** Parent component file path when the invalid entry was declared. */
|
|
12
|
+
parentComponentFile;
|
|
13
|
+
constructor(parentComponentFile) {
|
|
14
|
+
super(getUndeclaredComponentDependencyMessage(parentComponentFile));
|
|
15
|
+
this.parentComponentFile = parentComponentFile;
|
|
16
|
+
}
|
|
13
17
|
}
|
|
14
|
-
export {
|
|
15
|
-
UndeclaredComponentDependencyError,
|
|
16
|
-
getUndeclaredComponentDependencyMessage
|
|
17
|
-
};
|
package/src/global/app-logger.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import { Logger } from
|
|
2
|
-
const debug = process.env.ECOPAGES_LOGGER_DEBUG ===
|
|
3
|
-
const appLogger = new Logger(
|
|
4
|
-
export {
|
|
5
|
-
appLogger
|
|
6
|
-
};
|
|
1
|
+
import { Logger } from '@ecopages/logger';
|
|
2
|
+
const debug = process.env.ECOPAGES_LOGGER_DEBUG === 'true';
|
|
3
|
+
export const appLogger = new Logger('[@ecopages/core]', { debug });
|
package/src/hmr/README.md
CHANGED
|
@@ -24,3 +24,13 @@ It is responsible for:
|
|
|
24
24
|
Generic invalidation policy belongs in core services.
|
|
25
25
|
Framework-specific update behavior belongs in HMR strategies.
|
|
26
26
|
Runtime-specific WebSocket or event-stream transport belongs in adapters.
|
|
27
|
+
|
|
28
|
+
## Registered entrypoints and dev transform
|
|
29
|
+
|
|
30
|
+
`SharedHmrManager` in `adapters/shared/hmr/` centralizes file-change handling via `handleFileChange()`. Server invalidation, integration hooks, rebuild, and client broadcast run in one sequence.
|
|
31
|
+
|
|
32
|
+
Dev client modules are served on demand through `DevTransformServer` (`src/dev/`). `DevTransformEntrypointRegistry` tracks registered entrypoints for HMR invalidation. Registration returns a stable dev-transform URL immediately; the first request (or cache miss) runs Rolldown on demand.
|
|
33
|
+
|
|
34
|
+
`BrowserBundleService` is the sole browser-plugin resolver for HMR builds. HMR managers route `hmr-runtime` and `hmr-entrypoint` rebuilds through the `browser-hmr` executor profile.
|
|
35
|
+
|
|
36
|
+
Hosts call `prepareHmrFileChange()` before HMR dispatch (`hmr/hmr-file-change-prep.ts`) so page browser graph sessions invalidate consistently with file changes.
|