@ecopages/core 0.2.0-beta.31 → 0.2.0-beta.33
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 +90 -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/README.md +23 -0
- 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/client/navigation-lifecycle.d.ts +55 -0
- package/src/router/client/navigation-lifecycle.js +50 -0
- package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
- package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
- 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,63 +1,79 @@
|
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
1
|
+
/**
|
|
2
|
+
* FIFO-serialized build executor wrapper.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Wraps any `BuildExecutor` and ensures that no two builds run
|
|
6
|
+
* concurrently. The next build waits for the previous one to finish
|
|
7
|
+
* (success or failure) before starting.
|
|
8
|
+
*
|
|
9
|
+
* This is a bundler-agnostic primitive. It is unaware of bundler
|
|
10
|
+
* lifecycle events and exists purely to enforce one build at a time.
|
|
11
|
+
* Use it from the dev watch pipeline, the static preview path, or any
|
|
12
|
+
* caller that issues builds concurrently.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* FIFO-serialized wrapper around a {@link BuildExecutor}.
|
|
16
|
+
*
|
|
17
|
+
* Every `build()` call enqueues onto the wrapper's internal queue. A
|
|
18
|
+
* build only starts after the previous build's promise has settled.
|
|
19
|
+
*/
|
|
20
|
+
export class SerializedBuildExecutor {
|
|
21
|
+
inner;
|
|
22
|
+
tail = Promise.resolve();
|
|
23
|
+
constructor(inner) {
|
|
24
|
+
this.inner = inner;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Run a build through the serialized queue. The returned promise
|
|
28
|
+
* resolves with the inner executor's `BuildResult`. A rejected
|
|
29
|
+
* inner build does not block the queue — the next caller can
|
|
30
|
+
* proceed.
|
|
31
|
+
*/
|
|
32
|
+
build(options) {
|
|
33
|
+
return this.run(() => this.inner.build(options));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Run an arbitrary async operation through the serialized queue.
|
|
37
|
+
*
|
|
38
|
+
* Use this when the work is not a `build()` call against a wrapped
|
|
39
|
+
* executor (e.g. when composing with a coordinator that needs to
|
|
40
|
+
* inject recovery around the inner call). The returned promise
|
|
41
|
+
* resolves with the operation's result. A rejected operation does
|
|
42
|
+
* not block the queue.
|
|
43
|
+
*/
|
|
44
|
+
run(operation) {
|
|
45
|
+
const next = this.tail.catch(() => undefined).then(() => operation());
|
|
46
|
+
this.tail = next.catch(() => undefined);
|
|
47
|
+
return next;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Returns the wrapped executor. Tests use this to assert the
|
|
51
|
+
* delegation chain.
|
|
52
|
+
*/
|
|
53
|
+
unwrap() {
|
|
54
|
+
return this.inner;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Reset the queue to an empty state. Tests use this to recover
|
|
58
|
+
* from a poisoned tail.
|
|
59
|
+
*/
|
|
60
|
+
resetForTests() {
|
|
61
|
+
this.tail = Promise.resolve();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Overrides the internal queue tail for fault-recovery tests. The
|
|
65
|
+
* supplied promise is awaited before the next enqueued operation
|
|
66
|
+
* starts.
|
|
67
|
+
*/
|
|
68
|
+
setBuildQueueForTests(queue) {
|
|
69
|
+
this.tail = queue;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Returns the current internal queue tail for fault-recovery
|
|
73
|
+
* tests. Tests await this to assert that recovery has cleared a
|
|
74
|
+
* wedged queue.
|
|
75
|
+
*/
|
|
76
|
+
getBuildQueueForTests() {
|
|
77
|
+
return this.tail;
|
|
78
|
+
}
|
|
60
79
|
}
|
|
61
|
-
export {
|
|
62
|
-
SerializedBuildExecutor
|
|
63
|
-
};
|
package/src/cache/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Public cache exports for the bundler plugin chain.
|
|
3
|
+
*
|
|
4
|
+
* @module @ecopages/core/cache
|
|
5
|
+
*/
|
|
6
|
+
export { ModuleParseCache, moduleParseCache, cachedParseSync } from './module-parse-cache.js';
|
|
@@ -1,75 +1,106 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Process-wide parse cache for `oxc-parser.parseSync`.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Several build plugins (eco-component-meta, client-graph-boundary,
|
|
6
|
+
* browser-runtime) each call `parseSync` on the same source file with
|
|
7
|
+
* overlapping options. This cache memoizes the parse result keyed by
|
|
8
|
+
* `(absolute path, source, options)`. When the source is unchanged,
|
|
9
|
+
* subsequent calls return the cached result without re-parsing.
|
|
10
|
+
*
|
|
11
|
+
* The cache is LRU-bounded (10 000 entries) and key-stable across a
|
|
12
|
+
* single HMR session. It is **content-hashed** rather than
|
|
13
|
+
* mtime-hashed so that `touch`/`utimes` does not invalidate a
|
|
14
|
+
* still-valid parse.
|
|
15
|
+
*/
|
|
16
|
+
import { parseSync } from 'oxc-parser';
|
|
17
|
+
import { rapidhash } from '../utils/hash.js';
|
|
18
|
+
const DEFAULT_MAX_ENTRIES = 10_000;
|
|
19
|
+
/**
|
|
20
|
+
* LRU-bounded module parse cache.
|
|
21
|
+
*
|
|
22
|
+
* Single instance shared across the process. Constructed lazily; use
|
|
23
|
+
* {@link moduleParseCache} for the default shared instance.
|
|
24
|
+
*/
|
|
25
|
+
export class ModuleParseCache {
|
|
26
|
+
entries = new Map();
|
|
27
|
+
maxEntries;
|
|
28
|
+
hits = 0;
|
|
29
|
+
misses = 0;
|
|
30
|
+
constructor(maxEntries = DEFAULT_MAX_ENTRIES) {
|
|
31
|
+
if (maxEntries <= 0) {
|
|
32
|
+
throw new Error(`ModuleParseCache: maxEntries must be > 0, got ${maxEntries}`);
|
|
33
|
+
}
|
|
34
|
+
this.maxEntries = maxEntries;
|
|
12
35
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Parse `source` for `filePath`, memoizing by (filePath, source, options).
|
|
38
|
+
*
|
|
39
|
+
* @returns the {@link ParseResult} from `oxc-parser.parseSync`.
|
|
40
|
+
*/
|
|
41
|
+
getOrParse(filePath, source, options = {}) {
|
|
42
|
+
const hash = rapidhash(source);
|
|
43
|
+
const key = makeKey(filePath, hash, options);
|
|
44
|
+
const existing = this.entries.get(key);
|
|
45
|
+
if (existing && existing.hash === hash) {
|
|
46
|
+
this.hits += 1;
|
|
47
|
+
// Refresh LRU position.
|
|
48
|
+
this.entries.delete(key);
|
|
49
|
+
this.entries.set(key, existing);
|
|
50
|
+
return existing.result;
|
|
51
|
+
}
|
|
52
|
+
this.misses += 1;
|
|
53
|
+
const result = parseSync(filePath, source, options);
|
|
54
|
+
this.entries.set(key, { hash, result });
|
|
55
|
+
if (this.entries.size > this.maxEntries) {
|
|
56
|
+
// Map iteration order is insertion order; the first key is the
|
|
57
|
+
// least recently used (we delete-then-set on hits, so the
|
|
58
|
+
// oldest still-present entry is the LRU one).
|
|
59
|
+
const oldestKey = this.entries.keys().next().value;
|
|
60
|
+
if (oldestKey !== undefined) {
|
|
61
|
+
this.entries.delete(oldestKey);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
29
65
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
66
|
+
/** Clear all cached entries. Useful in tests and on full-rebuild signals. */
|
|
67
|
+
clear() {
|
|
68
|
+
this.entries.clear();
|
|
69
|
+
this.hits = 0;
|
|
70
|
+
this.misses = 0;
|
|
71
|
+
}
|
|
72
|
+
/** Current cache size (for observability). */
|
|
73
|
+
get size() {
|
|
74
|
+
return this.entries.size;
|
|
75
|
+
}
|
|
76
|
+
/** Cumulative hit/miss counters (for observability). */
|
|
77
|
+
stats() {
|
|
78
|
+
const total = this.hits + this.misses;
|
|
79
|
+
return {
|
|
80
|
+
hits: this.hits,
|
|
81
|
+
misses: this.misses,
|
|
82
|
+
size: this.entries.size,
|
|
83
|
+
hitRate: total === 0 ? 0 : this.hits / total,
|
|
84
|
+
};
|
|
38
85
|
}
|
|
39
|
-
return result;
|
|
40
|
-
}
|
|
41
|
-
/** Clear all cached entries. Useful in tests and on full-rebuild signals. */
|
|
42
|
-
clear() {
|
|
43
|
-
this.entries.clear();
|
|
44
|
-
this.hits = 0;
|
|
45
|
-
this.misses = 0;
|
|
46
|
-
}
|
|
47
|
-
/** Current cache size (for observability). */
|
|
48
|
-
get size() {
|
|
49
|
-
return this.entries.size;
|
|
50
|
-
}
|
|
51
|
-
/** Cumulative hit/miss counters (for observability). */
|
|
52
|
-
stats() {
|
|
53
|
-
const total = this.hits + this.misses;
|
|
54
|
-
return {
|
|
55
|
-
hits: this.hits,
|
|
56
|
-
misses: this.misses,
|
|
57
|
-
size: this.entries.size,
|
|
58
|
-
hitRate: total === 0 ? 0 : this.hits / total
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
86
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Default shared cache. Use this from plugin code so the cache is
|
|
89
|
+
* amortized across plugins and build invocations.
|
|
90
|
+
*/
|
|
91
|
+
export const moduleParseCache = new ModuleParseCache();
|
|
92
|
+
/**
|
|
93
|
+
* Drop-in replacement for `oxc-parser.parseSync` that uses the shared
|
|
94
|
+
* {@link moduleParseCache}. Use everywhere we currently call `parseSync`
|
|
95
|
+
* on user/source files during a build.
|
|
96
|
+
*/
|
|
97
|
+
export function cachedParseSync(filePath, source, options = {}) {
|
|
98
|
+
return moduleParseCache.getOrParse(filePath, source, options);
|
|
65
99
|
}
|
|
66
100
|
function makeKey(filePath, sourceHash, options) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
101
|
+
// Stringify only the option keys we actually use; `parseSync` does
|
|
102
|
+
// not deeply equal-check options so any extra keys would be noise.
|
|
103
|
+
const lang = options.lang ?? '';
|
|
104
|
+
const sourceType = options.sourceType ?? '';
|
|
105
|
+
return `${filePath} ${sourceHash.toString(36)} ${lang} ${sourceType}`;
|
|
70
106
|
}
|
|
71
|
-
export {
|
|
72
|
-
ModuleParseCache,
|
|
73
|
-
cachedParseSync,
|
|
74
|
-
moduleParseCache
|
|
75
|
-
};
|
|
@@ -1,41 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Classifies head scripts for navigation-time persistence and execution.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
const EXECUTABLE_SCRIPT_TYPES = new Set([
|
|
6
|
+
'application/javascript',
|
|
7
|
+
'application/ecmascript',
|
|
8
|
+
'module',
|
|
9
|
+
'text/ecmascript',
|
|
10
|
+
'text/javascript',
|
|
7
11
|
]);
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Returns whether a script tag carries non-executable data (for example JSON-LD).
|
|
14
|
+
*/
|
|
15
|
+
export function isNonExecutableHeadScript(element) {
|
|
16
|
+
if (element.tagName !== 'SCRIPT') {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const type = (element.getAttribute('type') ?? '').trim().toLowerCase();
|
|
20
|
+
if (!type) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return !EXECUTABLE_SCRIPT_TYPES.has(type);
|
|
17
24
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Returns whether an identified inline head script should survive head diffing.
|
|
27
|
+
*/
|
|
28
|
+
export function shouldPersistExecutableInlineHeadScript(element) {
|
|
29
|
+
if (element.tagName !== 'SCRIPT') {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const scriptId = element.getAttribute('data-eco-script-id') || element.getAttribute('id');
|
|
33
|
+
if (!scriptId) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (element.hasAttribute('data-eco-rerun')) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (element.src) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return !isNonExecutableHeadScript(element);
|
|
33
43
|
}
|
|
34
|
-
|
|
35
|
-
|
|
44
|
+
/**
|
|
45
|
+
* Returns whether a script is queued for rerun after navigation commit.
|
|
46
|
+
*/
|
|
47
|
+
export function isRerunScript(element) {
|
|
48
|
+
return element.tagName === 'SCRIPT' && element.hasAttribute('data-eco-rerun');
|
|
36
49
|
}
|
|
37
|
-
export {
|
|
38
|
-
isNonExecutableHeadScript,
|
|
39
|
-
isRerunScript,
|
|
40
|
-
shouldPersistExecutableInlineHeadScript
|
|
41
|
-
};
|
|
@@ -1,23 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
collectRerunScripts,
|
|
5
|
-
createRerunScriptUrl,
|
|
6
|
-
findExistingRerunScript,
|
|
7
|
-
flushPendingRerunScripts,
|
|
8
|
-
isExternalModuleRerunScript,
|
|
9
|
-
resetRerunNonceForTests
|
|
10
|
-
} from "./rerun-queue.js";
|
|
11
|
-
export {
|
|
12
|
-
RERUN_SRC_ATTR,
|
|
13
|
-
collectRerunScripts,
|
|
14
|
-
createRerunScriptUrl,
|
|
15
|
-
findExistingRerunScript,
|
|
16
|
-
flushPendingRerunScripts,
|
|
17
|
-
getRegisteredRerunScript,
|
|
18
|
-
isExternalModuleRerunScript,
|
|
19
|
-
isNonExecutableHeadScript,
|
|
20
|
-
isRerunScript,
|
|
21
|
-
resetRerunNonceForTests,
|
|
22
|
-
shouldPersistExecutableInlineHeadScript
|
|
23
|
-
};
|
|
1
|
+
export { isNonExecutableHeadScript, isRerunScript, shouldPersistExecutableInlineHeadScript } from './classification.js';
|
|
2
|
+
export { RERUN_SRC_ATTR, getRegisteredRerunScript } from './registry.js';
|
|
3
|
+
export { collectRerunScripts, createRerunScriptUrl, findExistingRerunScript, flushPendingRerunScripts, isExternalModuleRerunScript, resetRerunNonceForTests, } from './rerun-queue.js';
|
|
@@ -1,65 +1,61 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it, vi } from
|
|
2
|
-
import { isNonExecutableHeadScript } from
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
});
|
|
16
|
-
it("treats untyped scripts as executable", () => {
|
|
17
|
-
const script = document.createElement("script");
|
|
18
|
-
expect(isNonExecutableHeadScript(script)).toBe(false);
|
|
19
|
-
});
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { isNonExecutableHeadScript } from './classification.js';
|
|
3
|
+
import { collectRerunScripts, createRerunScriptUrl, flushPendingRerunScripts, resetRerunNonceForTests, } from './rerun-queue.js';
|
|
4
|
+
import { RERUN_SRC_ATTR } from './registry.js';
|
|
5
|
+
describe('isNonExecutableHeadScript', () => {
|
|
6
|
+
it('treats JSON-LD scripts as non-executable', () => {
|
|
7
|
+
const script = document.createElement('script');
|
|
8
|
+
script.type = 'application/ld+json';
|
|
9
|
+
expect(isNonExecutableHeadScript(script)).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
it('treats untyped scripts as executable', () => {
|
|
12
|
+
const script = document.createElement('script');
|
|
13
|
+
expect(isNonExecutableHeadScript(script)).toBe(false);
|
|
14
|
+
});
|
|
20
15
|
});
|
|
21
|
-
describe(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
16
|
+
describe('collectRerunScripts and flushPendingRerunScripts', () => {
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
document.head.replaceChildren();
|
|
19
|
+
document.body.replaceChildren();
|
|
20
|
+
resetRerunNonceForTests();
|
|
21
|
+
});
|
|
22
|
+
it('replays registered rerun callbacks without duplicating script tags', () => {
|
|
23
|
+
const callback = vi.fn();
|
|
24
|
+
window.__ECO_PAGES__ = {
|
|
25
|
+
rerunScripts: { 'eco-test': callback },
|
|
26
|
+
};
|
|
27
|
+
try {
|
|
28
|
+
flushPendingRerunScripts([
|
|
29
|
+
{
|
|
30
|
+
parent: 'head',
|
|
31
|
+
attributes: [
|
|
32
|
+
['data-eco-rerun', ''],
|
|
33
|
+
['data-eco-script-id', 'eco-test'],
|
|
34
|
+
],
|
|
35
|
+
textContent: '',
|
|
36
|
+
src: null,
|
|
37
|
+
scriptId: 'eco-test',
|
|
38
|
+
},
|
|
39
|
+
]);
|
|
40
|
+
expect(callback).toHaveBeenCalledOnce();
|
|
41
|
+
expect(document.head.querySelector('script[data-eco-script-id="eco-test"]')).toBeNull();
|
|
43
42
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const second = createRerunScriptUrl("/app.js");
|
|
63
|
-
expect(first).not.toBe(second);
|
|
64
|
-
});
|
|
43
|
+
finally {
|
|
44
|
+
delete window.__ECO_PAGES__;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
it('cache-busts external module rerun scripts', () => {
|
|
48
|
+
const html = '<html><head><script data-eco-rerun src="/app.js" type="module"></script></head></html>';
|
|
49
|
+
const parsed = new DOMParser().parseFromString(html, 'text/html');
|
|
50
|
+
const scripts = collectRerunScripts(parsed);
|
|
51
|
+
flushPendingRerunScripts(scripts);
|
|
52
|
+
const inserted = document.head.querySelector(`script[${RERUN_SRC_ATTR}]`);
|
|
53
|
+
expect(inserted?.getAttribute('src')).toMatch(/__eco_rerun=1/);
|
|
54
|
+
expect(inserted?.getAttribute(RERUN_SRC_ATTR)).toBe('/app.js');
|
|
55
|
+
});
|
|
56
|
+
it('appends a unique nonce on each module rerun url', () => {
|
|
57
|
+
const first = createRerunScriptUrl('/app.js');
|
|
58
|
+
const second = createRerunScriptUrl('/app.js');
|
|
59
|
+
expect(first).not.toBe(second);
|
|
60
|
+
});
|
|
65
61
|
});
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
/**
|
|
2
|
+
* `__ECO_PAGES__.rerunScripts` registry access for navigation reruns.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
/** Attribute storing the original module `src` after cache-busting. */
|
|
6
|
+
export const RERUN_SRC_ATTR = 'data-eco-rerun-src';
|
|
7
|
+
/**
|
|
8
|
+
* Returns a registered in-memory rerun callback for the given script id.
|
|
9
|
+
*/
|
|
10
|
+
export function getRegisteredRerunScript(scriptId) {
|
|
11
|
+
if (!scriptId) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const runtimeWindow = window;
|
|
15
|
+
return runtimeWindow.__ECO_PAGES__?.rerunScripts?.[scriptId] ?? null;
|
|
8
16
|
}
|
|
9
|
-
export {
|
|
10
|
-
RERUN_SRC_ATTR,
|
|
11
|
-
getRegisteredRerunScript
|
|
12
|
-
};
|