@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Dev toolbar (core)
|
|
2
|
+
|
|
3
|
+
Server-side wiring for the development-only in-browser inspector. Public docs: [Dev toolbar](/docs/core/dev-toolbar).
|
|
4
|
+
|
|
5
|
+
## Boundaries
|
|
6
|
+
|
|
7
|
+
| Layer | Owns |
|
|
8
|
+
| ----------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
9
|
+
| **Core** (`DevToolbarHost`) | Enablement, `/_dev_toolbar.js` delivery, per-route `#__ECO_DEV_MANIFEST__`, HTML script injection |
|
|
10
|
+
| **Client package** (`devToolbar.package`) | Dock UI, panels, and any extra apps |
|
|
11
|
+
| **Integrations** | Page rendering and browser assets — not toolbar dock apps |
|
|
12
|
+
|
|
13
|
+
Extend the toolbar by setting `devToolbar.package` to your own client package (or `@ecopages/dev-toolbar`). Integrations do not register dock apps.
|
|
14
|
+
|
|
15
|
+
## Module map
|
|
16
|
+
|
|
17
|
+
| File | Role |
|
|
18
|
+
| ------------------------------ | ------------------------------------------------------------------- |
|
|
19
|
+
| `dev-toolbar-host.ts` | Enablement, manifest contribution, runtime bundling, HTML injection |
|
|
20
|
+
| `dev-toolbar-manifest.ts` | Builds and serializes the per-page dev manifest |
|
|
21
|
+
| `dev-toolbar-package.ts` | Resolves `devToolbar.package` bootstrap entry from the app project |
|
|
22
|
+
| `dev-toolbar-config.ts` | `isDevToolbarEnabled` — watch mode, env var, package required |
|
|
23
|
+
| `dev-toolbar-html-response.ts` | Adapter helpers for injecting `import '/_dev_toolbar.js'` |
|
|
24
|
+
| `dev-toolbar-runtime-paths.ts` | `/_dev_toolbar.js` URL and work-dir paths |
|
|
25
|
+
| `define-dev-tool.ts` | Config helper for bring-your-own client packages |
|
|
26
|
+
|
|
27
|
+
## Injection order
|
|
28
|
+
|
|
29
|
+
1. Route HTML is finalized with `#__ECO_DEV_MANIFEST__` appended to `<body>` (`route-html-finalization.service.ts`).
|
|
30
|
+
2. The server adapter injects `import '/_dev_toolbar.js'` before `</html>` when the toolbar is enabled (`server-adapter.ts` → `DevToolbarHost.injectHtmlResponse`).
|
|
31
|
+
3. HMR manager copies or bundles the configured client package to `/_dev_toolbar.js` during watch mode (`shared-hmr-manager.ts`).
|
|
32
|
+
|
|
33
|
+
## Config
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { devToolbar } from '@ecopages/dev-toolbar/config';
|
|
37
|
+
|
|
38
|
+
.setDevToolbar(devToolbar())
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Bring-your-own client:
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import { defineDevTool } from '@ecopages/core/dev-toolbar/define-dev-tool';
|
|
45
|
+
|
|
46
|
+
.setDevToolbar(defineDevTool('@acme/my-dev-toolbar'))
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Disable per project with `devToolbar: { enabled: false }`, or per process with `ECOPAGES_DEV_TOOLBAR=false`.
|
|
50
|
+
|
|
51
|
+
Parent index: [dev/README.md](../dev/README.md).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { DevToolbarConfig } from './dev-toolbar-config.js';
|
|
2
|
+
export type DefineDevToolOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* Client package resolved from the application project.
|
|
5
|
+
*
|
|
6
|
+
* @example '@ecopages/dev-toolbar'
|
|
7
|
+
*/
|
|
8
|
+
package: string;
|
|
9
|
+
/** @default true */
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Builds a `devToolbar` config block for bring-your-own client packages.
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* Prefer importing `devToolbar` from `@ecopages/dev-toolbar/config` for the
|
|
17
|
+
* official toolbar. Keep server config limited to package resolution and
|
|
18
|
+
* enablement; UI preferences stay in the client package.
|
|
19
|
+
*/
|
|
20
|
+
export declare function defineDevTool(packageName: string): DevToolbarConfig;
|
|
21
|
+
export declare function defineDevTool(options: DefineDevToolOptions): DevToolbarConfig;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function defineDevTool(packageNameOrOptions) {
|
|
2
|
+
if (typeof packageNameOrOptions === 'string') {
|
|
3
|
+
return { package: packageNameOrOptions };
|
|
4
|
+
}
|
|
5
|
+
return {
|
|
6
|
+
package: packageNameOrOptions.package,
|
|
7
|
+
...(packageNameOrOptions.enabled === undefined ? {} : { enabled: packageNameOrOptions.enabled }),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig } from '../types/internal-types.js';
|
|
2
|
+
export type DevToolbarConfig = {
|
|
3
|
+
/**
|
|
4
|
+
* Whether the in-browser dev toolbar is enabled during development.
|
|
5
|
+
*
|
|
6
|
+
* @default true when `package` is configured
|
|
7
|
+
*/
|
|
8
|
+
enabled?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Client package entry resolved from the application project.
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* Install the package in the app (for example `@ecopages/dev-toolbar`) and
|
|
14
|
+
* point `package` at its browser bootstrap export. Core bundles that module
|
|
15
|
+
* to `/_dev_toolbar.js` during watch mode.
|
|
16
|
+
*/
|
|
17
|
+
package?: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Returns whether the dev toolbar should be injected for the current process.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isDevToolbarEnabled(appConfig: Pick<EcoPagesAppConfig, 'devToolbar'>, options: {
|
|
23
|
+
watch: boolean;
|
|
24
|
+
hostOwnsDevClient?: boolean;
|
|
25
|
+
}): boolean;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { getDevToolbarPackageSpec } from './dev-toolbar-package.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns whether the dev toolbar should be injected for the current process.
|
|
4
|
+
*/
|
|
5
|
+
export function isDevToolbarEnabled(appConfig, options) {
|
|
6
|
+
if (options.hostOwnsDevClient) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
if (!options.watch) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (process.env.ECOPAGES_DEV_TOOLBAR === 'false') {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (!getDevToolbarPackageSpec(appConfig)) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return appConfig.devToolbar?.enabled !== false;
|
|
19
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { HtmlDocumentContribution } from '../services/html/html-transformer.service.js';
|
|
2
|
+
import type { EcoPagesAppConfig } from '../types/internal-types.js';
|
|
3
|
+
import type { PagePackageResult } from '../types/public-types.js';
|
|
4
|
+
export type DevToolbarHostOptions = {
|
|
5
|
+
watch: boolean;
|
|
6
|
+
hostOwnsDevClient?: boolean;
|
|
7
|
+
};
|
|
8
|
+
type DevToolbarBundleService = {
|
|
9
|
+
bundle: (options: {
|
|
10
|
+
profile: 'hmr-runtime';
|
|
11
|
+
entrypoints: string[];
|
|
12
|
+
outdir: string;
|
|
13
|
+
naming: string;
|
|
14
|
+
minify: boolean;
|
|
15
|
+
}) => Promise<{
|
|
16
|
+
success: boolean;
|
|
17
|
+
logs: unknown;
|
|
18
|
+
outputs: Array<{
|
|
19
|
+
path: string;
|
|
20
|
+
}>;
|
|
21
|
+
}>;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Server-side entry point for dev toolbar config, HTML injection, manifest, and runtime bundling.
|
|
25
|
+
*/
|
|
26
|
+
export declare class DevToolbarHost {
|
|
27
|
+
private readonly appConfig;
|
|
28
|
+
private readonly options;
|
|
29
|
+
constructor(appConfig: EcoPagesAppConfig, options: DevToolbarHostOptions);
|
|
30
|
+
static forApp(appConfig: EcoPagesAppConfig, options: DevToolbarHostOptions): DevToolbarHost;
|
|
31
|
+
isEnabled(): boolean;
|
|
32
|
+
getRuntimeScriptUrl(): string;
|
|
33
|
+
getRuntimeScriptImport(): string;
|
|
34
|
+
resolveRuntimeWorkDir(workDir: string): string;
|
|
35
|
+
shouldInjectHtml(): boolean;
|
|
36
|
+
injectHtmlResponse(response: Response): Promise<Response>;
|
|
37
|
+
buildRouteManifestContribution(input: {
|
|
38
|
+
routeFile: string;
|
|
39
|
+
integrationName: string;
|
|
40
|
+
pagePackage?: PagePackageResult;
|
|
41
|
+
}): HtmlDocumentContribution | undefined;
|
|
42
|
+
bundleClientRuntime(options: {
|
|
43
|
+
browserBundleService: DevToolbarBundleService;
|
|
44
|
+
workDir: string;
|
|
45
|
+
onFailure: (error: unknown) => void;
|
|
46
|
+
}): Promise<boolean>;
|
|
47
|
+
readBundledRuntime(workDir: string): Response | null;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileSystem } from '@ecopages/file-system';
|
|
3
|
+
import { removeStaleHmrEntrypointOutput } from '../hmr/hmr-entrypoint-output.js';
|
|
4
|
+
import { isDevToolbarEnabled } from './dev-toolbar-config.js';
|
|
5
|
+
import { resolveConfiguredDevToolbarClient } from './dev-toolbar-package.js';
|
|
6
|
+
import { buildDevToolbarManifestPayload, serializeDevToolbarManifestScript } from './dev-toolbar-manifest.js';
|
|
7
|
+
import { DEV_TOOLBAR_RUNTIME_IMPORT, DEV_TOOLBAR_RUNTIME_SCRIPT_URL, resolveDevToolbarRuntimeWorkDir, } from './dev-toolbar-runtime-paths.js';
|
|
8
|
+
/**
|
|
9
|
+
* Server-side entry point for dev toolbar config, HTML injection, manifest, and runtime bundling.
|
|
10
|
+
*/
|
|
11
|
+
export class DevToolbarHost {
|
|
12
|
+
appConfig;
|
|
13
|
+
options;
|
|
14
|
+
constructor(appConfig, options) {
|
|
15
|
+
this.appConfig = appConfig;
|
|
16
|
+
this.options = options;
|
|
17
|
+
}
|
|
18
|
+
static forApp(appConfig, options) {
|
|
19
|
+
return new DevToolbarHost(appConfig, options);
|
|
20
|
+
}
|
|
21
|
+
isEnabled() {
|
|
22
|
+
return isDevToolbarEnabled(this.appConfig, this.options);
|
|
23
|
+
}
|
|
24
|
+
getRuntimeScriptUrl() {
|
|
25
|
+
return DEV_TOOLBAR_RUNTIME_SCRIPT_URL;
|
|
26
|
+
}
|
|
27
|
+
getRuntimeScriptImport() {
|
|
28
|
+
return DEV_TOOLBAR_RUNTIME_IMPORT;
|
|
29
|
+
}
|
|
30
|
+
resolveRuntimeWorkDir(workDir) {
|
|
31
|
+
return resolveDevToolbarRuntimeWorkDir(workDir);
|
|
32
|
+
}
|
|
33
|
+
shouldInjectHtml() {
|
|
34
|
+
return this.isEnabled();
|
|
35
|
+
}
|
|
36
|
+
async injectHtmlResponse(response) {
|
|
37
|
+
const html = await response.text();
|
|
38
|
+
const headers = new Headers(response.headers);
|
|
39
|
+
headers.set('Cache-Control', 'no-store, must-revalidate');
|
|
40
|
+
headers.delete('Content-Length');
|
|
41
|
+
if (html.includes(this.getRuntimeScriptImport())) {
|
|
42
|
+
return new Response(html, {
|
|
43
|
+
status: response.status,
|
|
44
|
+
statusText: response.statusText,
|
|
45
|
+
headers,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const script = `<script type="module">${this.getRuntimeScriptImport()};</script>`;
|
|
49
|
+
const updatedHtml = html.replace(/<\/html>/i, `${script}</html>`);
|
|
50
|
+
return new Response(updatedHtml, {
|
|
51
|
+
status: response.status,
|
|
52
|
+
statusText: response.statusText,
|
|
53
|
+
headers,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
buildRouteManifestContribution(input) {
|
|
57
|
+
if (!this.isEnabled()) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const payload = buildDevToolbarManifestPayload({
|
|
61
|
+
routeFile: input.routeFile,
|
|
62
|
+
integrationName: input.integrationName,
|
|
63
|
+
pagePackage: input.pagePackage,
|
|
64
|
+
});
|
|
65
|
+
return {
|
|
66
|
+
placement: 'body-append',
|
|
67
|
+
html: serializeDevToolbarManifestScript(payload),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
async bundleClientRuntime(options) {
|
|
71
|
+
if (!this.isEnabled()) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
const client = resolveConfiguredDevToolbarClient(this.appConfig);
|
|
75
|
+
if (!client) {
|
|
76
|
+
options.onFailure(new Error('[DevToolbar] No client package configured. Set devToolbar.package in your app config.'));
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
const runtimePath = path.join(options.workDir, path.basename(DEV_TOOLBAR_RUNTIME_SCRIPT_URL));
|
|
80
|
+
removeStaleHmrEntrypointOutput(runtimePath, 'DevToolbar');
|
|
81
|
+
try {
|
|
82
|
+
const result = await options.browserBundleService.bundle({
|
|
83
|
+
profile: 'hmr-runtime',
|
|
84
|
+
entrypoints: [client.entryPath],
|
|
85
|
+
outdir: options.workDir,
|
|
86
|
+
naming: path.basename(DEV_TOOLBAR_RUNTIME_SCRIPT_URL),
|
|
87
|
+
minify: false,
|
|
88
|
+
});
|
|
89
|
+
if (!result.success) {
|
|
90
|
+
options.onFailure(result.logs);
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
const emittedRuntime = result.outputs.find((output) => path.resolve(output.path) === path.resolve(runtimePath));
|
|
94
|
+
if (!emittedRuntime || !fileSystem.exists(runtimePath)) {
|
|
95
|
+
options.onFailure(new Error(`[DevToolbar] Runtime bundle missing expected output at ${runtimePath}`));
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
options.onFailure(error);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
readBundledRuntime(workDir) {
|
|
106
|
+
const runtimePath = path.join(workDir, path.basename(DEV_TOOLBAR_RUNTIME_SCRIPT_URL));
|
|
107
|
+
if (!fileSystem.exists(runtimePath)) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
return new Response(fileSystem.readFileAsBuffer(runtimePath), {
|
|
111
|
+
headers: {
|
|
112
|
+
'Content-Type': 'application/javascript',
|
|
113
|
+
'Cache-Control': 'no-store, must-revalidate',
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig } from '../types/internal-types.js';
|
|
2
|
+
import { type DevToolbarHostOptions } from './dev-toolbar-host.js';
|
|
3
|
+
export { DEV_TOOLBAR_RUNTIME_IMPORT } from './dev-toolbar-runtime-paths.js';
|
|
4
|
+
/**
|
|
5
|
+
* Returns whether HTML responses should receive the dev toolbar bootstrap.
|
|
6
|
+
*/
|
|
7
|
+
export declare function shouldInjectDevToolbarHtmlResponse(appConfig: EcoPagesAppConfig, options: DevToolbarHostOptions): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Injects the development dev toolbar runtime script into an HTML response if it is not already present.
|
|
10
|
+
*/
|
|
11
|
+
export declare function injectDevToolbarIntoHtmlResponse(appConfig: EcoPagesAppConfig, options: DevToolbarHostOptions, response: Response): Promise<Response>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DevToolbarHost } from './dev-toolbar-host.js';
|
|
2
|
+
export { DEV_TOOLBAR_RUNTIME_IMPORT } from './dev-toolbar-runtime-paths.js';
|
|
3
|
+
/**
|
|
4
|
+
* Returns whether HTML responses should receive the dev toolbar bootstrap.
|
|
5
|
+
*/
|
|
6
|
+
export function shouldInjectDevToolbarHtmlResponse(appConfig, options) {
|
|
7
|
+
return DevToolbarHost.forApp(appConfig, options).shouldInjectHtml();
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Injects the development dev toolbar runtime script into an HTML response if it is not already present.
|
|
11
|
+
*/
|
|
12
|
+
export async function injectDevToolbarIntoHtmlResponse(appConfig, options, response) {
|
|
13
|
+
return DevToolbarHost.forApp(appConfig, options).injectHtmlResponse(response);
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { PagePackageResult } from '../types/public-types.js';
|
|
2
|
+
export { DEV_MANIFEST_ELEMENT_ID, type DevManifestAsset as DevToolbarManifestAsset, type EcoDevManifest as DevToolbarManifestPayload, } from '@ecopages/dev-toolbar/manifest';
|
|
3
|
+
import { type EcoDevManifest } from '@ecopages/dev-toolbar/manifest';
|
|
4
|
+
/**
|
|
5
|
+
* Builds the dev toolbar manifest payload for one rendered page.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildDevToolbarManifestPayload(input: {
|
|
8
|
+
routeFile: string;
|
|
9
|
+
integrationName?: string;
|
|
10
|
+
pagePackage?: PagePackageResult;
|
|
11
|
+
}): EcoDevManifest;
|
|
12
|
+
/**
|
|
13
|
+
* Serializes the dev toolbar manifest as an HTML contribution snippet.
|
|
14
|
+
*/
|
|
15
|
+
export declare function serializeDevToolbarManifestScript(payload: EcoDevManifest): string;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { DEV_TRANSFORM_URL_PREFIX, VENDOR_URL_PREFIX } from '../hmr/hmr-asset-paths.js';
|
|
2
|
+
export { DEV_MANIFEST_ELEMENT_ID, } from '@ecopages/dev-toolbar/manifest';
|
|
3
|
+
import { DEV_MANIFEST_ELEMENT_ID } from '@ecopages/dev-toolbar/manifest';
|
|
4
|
+
function serializeAsset(asset) {
|
|
5
|
+
if (!asset.srcUrl) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
srcUrl: asset.srcUrl,
|
|
10
|
+
kind: asset.kind,
|
|
11
|
+
packageRole: asset.packageRole,
|
|
12
|
+
inline: asset.inline,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function collectUrlsFromAssets(assets, prefix) {
|
|
16
|
+
const urls = new Set();
|
|
17
|
+
for (const asset of assets) {
|
|
18
|
+
if (asset.srcUrl?.startsWith(prefix)) {
|
|
19
|
+
urls.add(asset.srcUrl);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return [...urls];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Builds the dev toolbar manifest payload for one rendered page.
|
|
26
|
+
*/
|
|
27
|
+
export function buildDevToolbarManifestPayload(input) {
|
|
28
|
+
const assets = input.pagePackage?.assets ?? [];
|
|
29
|
+
const graph = input.pagePackage?.pageBrowserGraph;
|
|
30
|
+
return {
|
|
31
|
+
route: input.routeFile,
|
|
32
|
+
integration: input.integrationName,
|
|
33
|
+
pageBrowserGraph: graph
|
|
34
|
+
? {
|
|
35
|
+
entryAssets: graph.entryAssets
|
|
36
|
+
.map((asset) => serializeAsset(asset))
|
|
37
|
+
.filter((asset) => asset !== undefined),
|
|
38
|
+
chunkAssets: graph.chunkAssets
|
|
39
|
+
.map((asset) => serializeAsset(asset))
|
|
40
|
+
.filter((asset) => asset !== undefined),
|
|
41
|
+
}
|
|
42
|
+
: undefined,
|
|
43
|
+
vendorUrls: collectUrlsFromAssets(assets, VENDOR_URL_PREFIX),
|
|
44
|
+
devTransformUrls: collectUrlsFromAssets(assets, DEV_TRANSFORM_URL_PREFIX),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Serializes the dev toolbar manifest as an HTML contribution snippet.
|
|
49
|
+
*/
|
|
50
|
+
export function serializeDevToolbarManifestScript(payload) {
|
|
51
|
+
return `<script type="application/json" id="${DEV_MANIFEST_ELEMENT_ID}">${JSON.stringify(payload)}</script>`;
|
|
52
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { EcoPagesAppConfig } from '../types/internal-types.js';
|
|
2
|
+
export type DevToolbarClientResolution = {
|
|
3
|
+
entryPath: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Returns the configured dev-toolbar client package specifier, if any.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getDevToolbarPackageSpec(appConfig: Pick<EcoPagesAppConfig, 'devToolbar'>): string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Resolves the dev-toolbar package root from an application project directory.
|
|
11
|
+
*
|
|
12
|
+
* @remarks Walks up from the package entry rather than resolving `package.json`
|
|
13
|
+
* directly so packages with strict `exports` (no `./package.json` subpath) still work.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveDevToolbarPackageRoot(rootDir: string, packageSpec: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Resolves the browser entrypoint core bundles into `/_dev_toolbar.js`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveDevToolbarClient(rootDir: string, packageSpec: string): DevToolbarClientResolution | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Resolves the configured dev-toolbar client for an app config, when present.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveConfiguredDevToolbarClient(appConfig: EcoPagesAppConfig): DevToolbarClientResolution | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Resolves a dev-toolbar client entry module from the application project root.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveDevToolbarPackageEntry(rootDir: string, packageSpec: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Resolves the configured dev-toolbar entry for an app config, when present.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveConfiguredDevToolbarEntry(appConfig: EcoPagesAppConfig): string | undefined;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileSystem } from '@ecopages/file-system';
|
|
4
|
+
const SOURCE_CLIENT_FILE = 'src/bootstrap.ts';
|
|
5
|
+
/**
|
|
6
|
+
* Returns the configured dev-toolbar client package specifier, if any.
|
|
7
|
+
*/
|
|
8
|
+
export function getDevToolbarPackageSpec(appConfig) {
|
|
9
|
+
const spec = appConfig.devToolbar?.package?.trim();
|
|
10
|
+
return spec || undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Resolves the dev-toolbar package root from an application project directory.
|
|
14
|
+
*
|
|
15
|
+
* @remarks Walks up from the package entry rather than resolving `package.json`
|
|
16
|
+
* directly so packages with strict `exports` (no `./package.json` subpath) still work.
|
|
17
|
+
*/
|
|
18
|
+
export function resolveDevToolbarPackageRoot(rootDir, packageSpec) {
|
|
19
|
+
const require = createRequire(path.join(rootDir, 'package.json'));
|
|
20
|
+
let dir = path.dirname(require.resolve(packageSpec));
|
|
21
|
+
while (dir !== path.dirname(dir)) {
|
|
22
|
+
if (fileSystem.exists(path.join(dir, 'package.json'))) {
|
|
23
|
+
return dir;
|
|
24
|
+
}
|
|
25
|
+
dir = path.dirname(dir);
|
|
26
|
+
}
|
|
27
|
+
throw new Error(`Could not resolve package root for ${packageSpec}`);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Resolves the browser entrypoint core bundles into `/_dev_toolbar.js`.
|
|
31
|
+
*/
|
|
32
|
+
export function resolveDevToolbarClient(rootDir, packageSpec) {
|
|
33
|
+
const packageRoot = resolveDevToolbarPackageRoot(rootDir, packageSpec);
|
|
34
|
+
const sourcePath = path.join(packageRoot, SOURCE_CLIENT_FILE);
|
|
35
|
+
if (fileSystem.exists(sourcePath)) {
|
|
36
|
+
return { entryPath: sourcePath };
|
|
37
|
+
}
|
|
38
|
+
const require = createRequire(path.join(rootDir, 'package.json'));
|
|
39
|
+
try {
|
|
40
|
+
return { entryPath: require.resolve(packageSpec) };
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolves the configured dev-toolbar client for an app config, when present.
|
|
48
|
+
*/
|
|
49
|
+
export function resolveConfiguredDevToolbarClient(appConfig) {
|
|
50
|
+
const packageSpec = getDevToolbarPackageSpec(appConfig);
|
|
51
|
+
if (!packageSpec) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
return resolveDevToolbarClient(appConfig.absolutePaths.projectDir, packageSpec);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolves a dev-toolbar client entry module from the application project root.
|
|
58
|
+
*/
|
|
59
|
+
export function resolveDevToolbarPackageEntry(rootDir, packageSpec) {
|
|
60
|
+
const client = resolveDevToolbarClient(rootDir, packageSpec);
|
|
61
|
+
if (!client) {
|
|
62
|
+
const require = createRequire(path.join(rootDir, 'package.json'));
|
|
63
|
+
return require.resolve(packageSpec);
|
|
64
|
+
}
|
|
65
|
+
return client.entryPath;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Resolves the configured dev-toolbar entry for an app config, when present.
|
|
69
|
+
*/
|
|
70
|
+
export function resolveConfiguredDevToolbarEntry(appConfig) {
|
|
71
|
+
return resolveConfiguredDevToolbarClient(appConfig)?.entryPath;
|
|
72
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** On-disk work directory segment for the bundled dev toolbar client runtime. */
|
|
2
|
+
export declare const DEV_TOOLBAR_RUNTIME_WORK_DIR_SEGMENT = "dev-toolbar-runtime";
|
|
3
|
+
/** Browser URL for the bundled dev toolbar client runtime script. */
|
|
4
|
+
export declare const DEV_TOOLBAR_RUNTIME_SCRIPT_URL = "/_dev_toolbar.js";
|
|
5
|
+
/** Module import emitted into dev HTML responses. */
|
|
6
|
+
export declare const DEV_TOOLBAR_RUNTIME_IMPORT = "import '/_dev_toolbar.js'";
|
|
7
|
+
/**
|
|
8
|
+
* Absolute work-directory path for dev toolbar runtime artifacts under an app work dir.
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveDevToolbarRuntimeWorkDir(workDir: string): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { RESOLVED_ASSETS_DIR } from '../config/constants.js';
|
|
2
|
+
/** On-disk work directory segment for the bundled dev toolbar client runtime. */
|
|
3
|
+
export const DEV_TOOLBAR_RUNTIME_WORK_DIR_SEGMENT = 'dev-toolbar-runtime';
|
|
4
|
+
/** Browser URL for the bundled dev toolbar client runtime script. */
|
|
5
|
+
export const DEV_TOOLBAR_RUNTIME_SCRIPT_URL = '/_dev_toolbar.js';
|
|
6
|
+
/** Module import emitted into dev HTML responses. */
|
|
7
|
+
export const DEV_TOOLBAR_RUNTIME_IMPORT = `import '${DEV_TOOLBAR_RUNTIME_SCRIPT_URL}'`;
|
|
8
|
+
/**
|
|
9
|
+
* Absolute work-directory path for dev toolbar runtime artifacts under an app work dir.
|
|
10
|
+
*/
|
|
11
|
+
export function resolveDevToolbarRuntimeWorkDir(workDir) {
|
|
12
|
+
return `${workDir}/${RESOLVED_ASSETS_DIR}/${DEV_TOOLBAR_RUNTIME_WORK_DIR_SEGMENT}`;
|
|
13
|
+
}
|
|
@@ -1,33 +1,39 @@
|
|
|
1
|
-
import { AsyncLocalStorage } from
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
/**
|
|
3
|
+
* Per-request browser build dedupe cache.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* `DedupingBuildExecutor` only coalesces concurrent identical builds. Asset
|
|
7
|
+
* processing can call the same logical bundle several times in one request
|
|
8
|
+
* (page graph, HMR, content scripts) after the first build settles. This cache
|
|
9
|
+
* reuses the settled result until the request scope ends.
|
|
10
|
+
*/
|
|
2
11
|
class RequestBuildDedupe {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
12
|
+
storage = new AsyncLocalStorage();
|
|
13
|
+
run(fn) {
|
|
14
|
+
if (this.storage.getStore()) {
|
|
15
|
+
return fn();
|
|
16
|
+
}
|
|
17
|
+
return this.storage.run(new Map(), fn);
|
|
7
18
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
19
|
+
dedupeBuild(key, build) {
|
|
20
|
+
const store = this.storage.getStore();
|
|
21
|
+
if (!store) {
|
|
22
|
+
return build();
|
|
23
|
+
}
|
|
24
|
+
const existing = store.get(key);
|
|
25
|
+
if (existing) {
|
|
26
|
+
return existing;
|
|
27
|
+
}
|
|
28
|
+
const buildPromise = build().catch((error) => {
|
|
29
|
+
store.delete(key);
|
|
30
|
+
throw error;
|
|
31
|
+
});
|
|
32
|
+
store.set(key, buildPromise);
|
|
33
|
+
return buildPromise;
|
|
14
34
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return existing;
|
|
35
|
+
getCachedCountForTests() {
|
|
36
|
+
return this.storage.getStore()?.size ?? 0;
|
|
18
37
|
}
|
|
19
|
-
const buildPromise = build().catch((error) => {
|
|
20
|
-
store.delete(key);
|
|
21
|
-
throw error;
|
|
22
|
-
});
|
|
23
|
-
store.set(key, buildPromise);
|
|
24
|
-
return buildPromise;
|
|
25
|
-
}
|
|
26
|
-
getCachedCountForTests() {
|
|
27
|
-
return this.storage.getStore()?.size ?? 0;
|
|
28
|
-
}
|
|
29
38
|
}
|
|
30
|
-
const requestBuildDedupe = new RequestBuildDedupe();
|
|
31
|
-
export {
|
|
32
|
-
requestBuildDedupe
|
|
33
|
-
};
|
|
39
|
+
export const requestBuildDedupe = new RequestBuildDedupe();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type StartupTracePhase = 'config-ready' | 'setupAppRuntimePlugins' | 'route-registry' | 'server-listen' | 'first-byte' | 'first-page-browser-graph' | 'first-request-ssr' | 'client-transfer' | 'client-hydration';
|
|
1
|
+
export type StartupTracePhase = 'config-ready' | 'setupAppRuntimePlugins' | 'route-registry' | 'server-listen' | 'first-byte' | 'first-page-browser-graph' | 'dev-client-transform' | 'first-request-ssr' | 'client-transfer' | 'client-hydration';
|
|
2
2
|
type PhaseRecord = {
|
|
3
3
|
durationMs: number;
|
|
4
4
|
wallMs: number;
|
|
@@ -30,8 +30,10 @@ declare class StartupTrace {
|
|
|
30
30
|
private firstRequestBundleCount;
|
|
31
31
|
private firstRequestClientBytes;
|
|
32
32
|
private firstRequestGraphBuildCount;
|
|
33
|
+
private firstRequestCompletedWallMs;
|
|
33
34
|
private summaryEmitted;
|
|
34
35
|
private firstPageBrowserGraphEmitted;
|
|
36
|
+
private devClientTransformEmitted;
|
|
35
37
|
private clientRequestCount;
|
|
36
38
|
private clientTransferredBytes;
|
|
37
39
|
private hmrConnected;
|
|
@@ -44,6 +46,13 @@ declare class StartupTrace {
|
|
|
44
46
|
beginServerListen(): void;
|
|
45
47
|
markFirstByte(): void;
|
|
46
48
|
beginFirstByte(): void;
|
|
49
|
+
beginDevClientTransform(): void;
|
|
50
|
+
endDevClientTransform(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Records the first Page Browser Graph completion for startup tracing.
|
|
53
|
+
*
|
|
54
|
+
* @param graphBuildCount Session graph build counter when the first Page Browser Graph finished.
|
|
55
|
+
*/
|
|
47
56
|
markFirstPageBrowserGraphReady(graphBuildCount?: number): void;
|
|
48
57
|
recordBrowserBundle(outputs: Array<{
|
|
49
58
|
path: string;
|