@ecopages/core 0.2.0-alpha.5 → 0.2.0-alpha.7
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 +213 -12
- package/package.json +100 -188
- package/src/adapters/README.md +39 -0
- package/src/adapters/bun/hmr-manager.test.ts +267 -0
- package/src/adapters/bun/hmr-manager.ts +180 -47
- package/src/adapters/bun/index.ts +1 -2
- package/src/adapters/bun/server-adapter.ts +41 -34
- package/src/adapters/bun/server-lifecycle.ts +40 -70
- package/src/adapters/index.ts +1 -1
- package/src/adapters/node/bootstrap-dependency-resolver.test.ts +282 -0
- package/src/adapters/node/bootstrap-dependency-resolver.ts +301 -0
- package/src/adapters/node/index.ts +7 -0
- package/src/adapters/node/node-client-bridge.test.ts +198 -0
- package/src/adapters/node/node-hmr-manager.test.ts +322 -0
- package/src/adapters/node/node-hmr-manager.ts +207 -97
- package/src/adapters/node/runtime-adapter.test.ts +868 -0
- package/src/adapters/node/runtime-adapter.ts +439 -0
- package/src/adapters/node/server-adapter.ts +31 -104
- package/src/adapters/node/static-content-server.test.ts +60 -0
- package/src/adapters/node/static-content-server.ts +36 -0
- package/src/adapters/node/write-runtime-manifest.ts +38 -0
- package/src/adapters/shared/api-response.test.ts +97 -0
- package/src/{define-api-handler.ts → adapters/shared/define-api-handler.ts} +1 -1
- package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
- package/src/adapters/shared/explicit-static-route-matcher.ts +7 -1
- package/src/adapters/shared/file-route-middleware-pipeline.test.ts +90 -0
- package/src/adapters/shared/file-route-middleware-pipeline.ts +6 -2
- package/src/adapters/shared/fs-server-response-factory.test.ts +187 -0
- package/src/adapters/shared/fs-server-response-matcher.test.ts +286 -0
- package/src/adapters/shared/fs-server-response-matcher.ts +17 -10
- package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
- package/src/adapters/shared/hmr-html-response.ts +52 -0
- package/src/adapters/shared/hmr-manager.contract.test.ts +196 -0
- package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
- package/src/adapters/shared/render-context.test.ts +146 -0
- package/src/adapters/shared/render-context.ts +21 -6
- package/src/adapters/shared/runtime-bootstrap.ts +79 -0
- package/src/adapters/shared/server-adapter.test.ts +77 -0
- package/src/adapters/shared/server-adapter.ts +51 -4
- package/src/adapters/shared/server-route-handler.test.ts +110 -0
- package/src/adapters/shared/server-route-handler.ts +5 -18
- package/src/adapters/shared/server-static-builder.test.ts +316 -0
- package/src/adapters/shared/server-static-builder.ts +92 -8
- package/src/build/README.md +101 -0
- package/src/build/build-adapter-serialization.test.ts +268 -0
- package/src/build/build-adapter.test.ts +815 -0
- package/src/build/build-adapter.ts +234 -6
- package/src/build/build-manifest.ts +54 -0
- package/src/build/dev-build-coordinator.ts +221 -0
- package/src/build/esbuild-build-adapter.ts +132 -84
- package/src/build/runtime-build-executor.ts +34 -0
- package/src/build/runtime-specifier-alias-plugin.test.ts +43 -0
- package/src/build/runtime-specifier-alias-plugin.ts +58 -0
- package/src/config/README.md +33 -0
- package/src/config/config-builder.test.ts +410 -0
- package/src/config/config-builder.ts +281 -49
- package/src/constants.ts +15 -0
- package/src/declarations.d.ts +18 -13
- package/src/eco/README.md +70 -16
- package/src/eco/component-render-context.ts +39 -17
- package/src/eco/eco.test.ts +678 -0
- package/src/eco/eco.ts +29 -8
- package/src/eco/eco.types.ts +20 -1
- package/src/eco/eco.utils.test.ts +124 -0
- package/src/eco/global-injector-map.test.ts +42 -0
- package/src/eco/lazy-injector-map.test.ts +66 -0
- package/src/eco/module-dependencies.test.ts +30 -0
- package/src/errors/http-error.test.ts +134 -0
- package/src/global/utils.test.ts +12 -0
- package/src/hmr/README.md +26 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
- package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
- package/src/hmr/client/hmr-runtime.ts +38 -7
- package/src/hmr/hmr-strategy.test.ts +124 -0
- package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
- package/src/hmr/hmr.test.e2e.ts +29 -38
- package/src/hmr/strategies/js-hmr-strategy.test.ts +335 -0
- package/src/hmr/strategies/js-hmr-strategy.ts +71 -78
- package/src/index.ts +1 -1
- package/src/integrations/ghtml/ghtml-renderer.test.ts +63 -0
- package/src/integrations/ghtml/ghtml-renderer.ts +4 -1
- package/src/internal-types.ts +39 -19
- package/src/plugins/README.md +34 -0
- package/src/plugins/alias-resolver-plugin.test.ts +41 -0
- package/src/plugins/alias-resolver-plugin.ts +21 -3
- package/src/plugins/eco-component-meta-plugin.test.ts +380 -0
- package/src/plugins/eco-component-meta-plugin.ts +10 -3
- package/src/plugins/integration-plugin.test.ts +111 -0
- package/src/plugins/integration-plugin.ts +45 -3
- package/src/plugins/processor.test.ts +148 -0
- package/src/plugins/processor.ts +22 -2
- package/src/plugins/runtime-capability.ts +14 -0
- package/src/public-types.ts +73 -11
- package/src/route-renderer/GRAPH.md +16 -20
- package/src/route-renderer/README.md +8 -21
- package/src/route-renderer/component-graph/component-graph-executor.test.ts +41 -0
- package/src/route-renderer/component-graph/component-graph.test.ts +63 -0
- package/src/route-renderer/component-graph/component-marker.test.ts +73 -0
- package/src/route-renderer/component-graph/component-reference.ts +29 -0
- package/src/route-renderer/component-graph/marker-graph-resolver.test.ts +135 -0
- package/src/route-renderer/{marker-graph-resolver.ts → component-graph/marker-graph-resolver.ts} +11 -9
- package/src/route-renderer/orchestration/integration-renderer.test.ts +936 -0
- package/src/route-renderer/{integration-renderer.ts → orchestration/integration-renderer.ts} +113 -19
- package/src/route-renderer/orchestration/render-execution.service.test.ts +97 -0
- package/src/route-renderer/{render-execution.service.ts → orchestration/render-execution.service.ts} +109 -37
- package/src/route-renderer/orchestration/render-preparation.service.test.ts +235 -0
- package/src/route-renderer/{render-preparation.service.ts → orchestration/render-preparation.service.ts} +127 -9
- package/src/route-renderer/page-loading/dependency-resolver.test.ts +345 -0
- package/src/route-renderer/{dependency-resolver.ts → page-loading/dependency-resolver.ts} +28 -12
- package/src/route-renderer/page-loading/page-module-loader.test.ts +96 -0
- package/src/route-renderer/{page-module-loader.ts → page-loading/page-module-loader.ts} +49 -21
- package/src/route-renderer/route-renderer.ts +36 -1
- package/src/router/README.md +26 -0
- package/src/router/client/link-intent.d.ts +53 -0
- package/src/router/client/link-intent.test.browser.ts +51 -0
- package/src/router/client/link-intent.ts +92 -0
- package/src/router/client/navigation-coordinator.test.ts +237 -0
- package/src/router/client/navigation-coordinator.ts +433 -0
- package/src/router/server/fs-router-scanner.test.ts +83 -0
- package/src/router/{fs-router-scanner.ts → server/fs-router-scanner.ts} +12 -10
- package/src/router/server/fs-router.test.ts +214 -0
- package/src/router/{fs-router.ts → server/fs-router.ts} +2 -2
- package/src/services/README.md +29 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +385 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.ts +101 -6
- package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.ts +2 -1
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +72 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +95 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/index.ts +2 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.ts +1 -1
- package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.ts +11 -5
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.ts +17 -27
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +286 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.ts +3 -3
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.ts +5 -4
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +199 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.ts +4 -1
- package/src/services/assets/browser-bundle.service.test.ts +36 -0
- package/src/services/assets/browser-bundle.service.ts +53 -0
- package/src/services/cache/index.ts +3 -3
- package/src/services/cache/memory-cache-store.test.ts +225 -0
- package/src/services/cache/memory-cache-store.ts +1 -1
- package/src/services/cache/page-cache-service.test.ts +175 -0
- package/src/services/cache/page-cache-service.ts +3 -3
- package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
- package/src/services/{page-request-cache-coordinator.service.ts → cache/page-request-cache-coordinator.service.ts} +9 -6
- package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
- package/src/services/html/html-rewriter-provider.service.ts +103 -0
- package/src/services/html/html-transformer.service.test.ts +378 -0
- package/src/services/html/html-transformer.service.ts +279 -0
- package/src/services/invalidation/development-invalidation.service.test.ts +77 -0
- package/src/services/invalidation/development-invalidation.service.ts +261 -0
- package/src/services/module-loading/app-server-module-transpiler.service.ts +52 -0
- package/src/services/module-loading/page-module-import.service.test.ts +253 -0
- package/src/services/module-loading/page-module-import.service.ts +200 -0
- package/src/services/module-loading/server-loader.service.test.ts +161 -0
- package/src/services/module-loading/server-loader.service.ts +130 -0
- package/src/services/module-loading/server-module-transpiler.service.test.ts +115 -0
- package/src/services/module-loading/server-module-transpiler.service.ts +105 -0
- package/src/services/runtime-manifest/node-runtime-manifest.service.test.ts +95 -0
- package/src/services/runtime-manifest/node-runtime-manifest.service.ts +101 -0
- package/src/services/runtime-state/dev-graph.service.ts +217 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.ts +96 -0
- package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
- package/src/services/validation/schema-validation-service.test.ts +223 -0
- package/src/services/{schema-validation-service.ts → validation/schema-validation-service.ts} +1 -1
- package/src/static-site-generator/README.md +26 -0
- package/src/static-site-generator/static-site-generator.test.ts +307 -0
- package/src/static-site-generator/static-site-generator.ts +109 -6
- package/src/utils/deep-merge.test.ts +114 -0
- package/src/utils/invariant.test.ts +22 -0
- package/src/utils/path-utils.test.ts +15 -0
- package/src/utils/resolve-work-dir.ts +45 -0
- package/src/utils/server-utils.test.ts +38 -0
- package/src/watchers/project-watcher.integration.test.ts +337 -0
- package/src/watchers/project-watcher.test-helpers.ts +1 -0
- package/src/watchers/project-watcher.test.ts +678 -0
- package/src/watchers/project-watcher.ts +49 -50
- package/CHANGELOG.md +0 -94
- package/src/adapters/abstract/application-adapter.d.ts +0 -168
- package/src/adapters/abstract/application-adapter.js +0 -109
- package/src/adapters/abstract/router-adapter.d.ts +0 -26
- package/src/adapters/abstract/router-adapter.js +0 -5
- package/src/adapters/abstract/server-adapter.d.ts +0 -69
- package/src/adapters/abstract/server-adapter.js +0 -15
- package/src/adapters/bun/client-bridge.d.ts +0 -34
- package/src/adapters/bun/client-bridge.js +0 -48
- package/src/adapters/bun/create-app.d.ts +0 -60
- package/src/adapters/bun/create-app.js +0 -117
- package/src/adapters/bun/define-api-handler.d.ts +0 -61
- package/src/adapters/bun/define-api-handler.js +0 -15
- package/src/adapters/bun/define-api-handler.ts +0 -114
- package/src/adapters/bun/hmr-manager.d.ts +0 -79
- package/src/adapters/bun/hmr-manager.js +0 -222
- package/src/adapters/bun/index.d.ts +0 -3
- package/src/adapters/bun/index.js +0 -8
- package/src/adapters/bun/server-adapter.d.ts +0 -155
- package/src/adapters/bun/server-adapter.js +0 -368
- package/src/adapters/bun/server-lifecycle.d.ts +0 -52
- package/src/adapters/bun/server-lifecycle.js +0 -120
- package/src/adapters/index.d.ts +0 -6
- package/src/adapters/index.js +0 -14
- package/src/adapters/node/create-app.d.ts +0 -21
- package/src/adapters/node/create-app.js +0 -143
- package/src/adapters/node/index.d.ts +0 -4
- package/src/adapters/node/index.js +0 -8
- package/src/adapters/node/node-client-bridge.d.ts +0 -26
- package/src/adapters/node/node-client-bridge.js +0 -66
- package/src/adapters/node/node-hmr-manager.d.ts +0 -62
- package/src/adapters/node/node-hmr-manager.js +0 -221
- package/src/adapters/node/server-adapter.d.ts +0 -190
- package/src/adapters/node/server-adapter.js +0 -420
- package/src/adapters/node/static-content-server.d.ts +0 -24
- package/src/adapters/node/static-content-server.js +0 -166
- package/src/adapters/shared/api-response.d.ts +0 -52
- package/src/adapters/shared/api-response.js +0 -96
- package/src/adapters/shared/application-adapter.d.ts +0 -18
- package/src/adapters/shared/application-adapter.js +0 -90
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
- package/src/adapters/shared/explicit-static-route-matcher.js +0 -100
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
- package/src/adapters/shared/file-route-middleware-pipeline.js +0 -98
- package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
- package/src/adapters/shared/fs-server-response-factory.js +0 -97
- package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -71
- package/src/adapters/shared/fs-server-response-matcher.js +0 -155
- package/src/adapters/shared/render-context.d.ts +0 -14
- package/src/adapters/shared/render-context.js +0 -69
- package/src/adapters/shared/server-adapter.d.ts +0 -87
- package/src/adapters/shared/server-adapter.js +0 -353
- package/src/adapters/shared/server-route-handler.d.ts +0 -89
- package/src/adapters/shared/server-route-handler.js +0 -120
- package/src/adapters/shared/server-static-builder.d.ts +0 -38
- package/src/adapters/shared/server-static-builder.js +0 -46
- package/src/build/build-adapter.d.ts +0 -75
- package/src/build/build-adapter.js +0 -54
- package/src/build/build-types.d.ts +0 -57
- package/src/build/build-types.js +0 -0
- package/src/build/esbuild-build-adapter.d.ts +0 -69
- package/src/build/esbuild-build-adapter.js +0 -391
- package/src/config/config-builder.d.ts +0 -227
- package/src/config/config-builder.js +0 -392
- package/src/constants.d.ts +0 -32
- package/src/constants.js +0 -21
- package/src/create-app.d.ts +0 -17
- package/src/create-app.js +0 -66
- package/src/define-api-handler.d.ts +0 -25
- package/src/define-api-handler.js +0 -15
- package/src/dev/sc-server.d.ts +0 -30
- package/src/dev/sc-server.js +0 -111
- package/src/eco/component-render-context.d.ts +0 -105
- package/src/eco/component-render-context.js +0 -77
- package/src/eco/eco.d.ts +0 -9
- package/src/eco/eco.js +0 -110
- package/src/eco/eco.types.d.ts +0 -170
- package/src/eco/eco.types.js +0 -0
- package/src/eco/eco.utils.d.ts +0 -40
- package/src/eco/eco.utils.js +0 -40
- package/src/eco/global-injector-map.d.ts +0 -16
- package/src/eco/global-injector-map.js +0 -80
- package/src/eco/lazy-injector-map.d.ts +0 -8
- package/src/eco/lazy-injector-map.js +0 -70
- package/src/eco/module-dependencies.d.ts +0 -18
- package/src/eco/module-dependencies.js +0 -49
- package/src/errors/http-error.d.ts +0 -31
- package/src/errors/http-error.js +0 -50
- package/src/errors/index.d.ts +0 -2
- package/src/errors/index.js +0 -4
- package/src/errors/locals-access-error.d.ts +0 -4
- package/src/errors/locals-access-error.js +0 -9
- package/src/global/app-logger.d.ts +0 -2
- package/src/global/app-logger.js +0 -6
- package/src/hmr/client/hmr-runtime.d.ts +0 -10
- package/src/hmr/client/hmr-runtime.js +0 -86
- package/src/hmr/hmr-strategy.d.ts +0 -159
- package/src/hmr/hmr-strategy.js +0 -29
- package/src/hmr/hmr.test.e2e.d.ts +0 -1
- package/src/hmr/hmr.test.e2e.js +0 -50
- package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
- package/src/hmr/strategies/default-hmr-strategy.js +0 -34
- package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -136
- package/src/hmr/strategies/js-hmr-strategy.js +0 -192
- package/src/index.browser.d.ts +0 -3
- package/src/index.browser.js +0 -4
- package/src/index.d.ts +0 -5
- package/src/index.js +0 -10
- package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -15
- package/src/integrations/ghtml/ghtml-renderer.js +0 -60
- package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -20
- package/src/integrations/ghtml/ghtml.plugin.js +0 -21
- package/src/internal-types.d.ts +0 -200
- package/src/internal-types.js +0 -0
- package/src/plugins/alias-resolver-plugin.d.ts +0 -2
- package/src/plugins/alias-resolver-plugin.js +0 -39
- package/src/plugins/eco-component-meta-plugin.d.ts +0 -95
- package/src/plugins/eco-component-meta-plugin.js +0 -157
- package/src/plugins/integration-plugin.d.ts +0 -102
- package/src/plugins/integration-plugin.js +0 -100
- package/src/plugins/processor.d.ts +0 -82
- package/src/plugins/processor.js +0 -122
- package/src/public-types.d.ts +0 -1094
- package/src/public-types.js +0 -0
- package/src/route-renderer/component-graph-executor.d.ts +0 -32
- package/src/route-renderer/component-graph-executor.js +0 -31
- package/src/route-renderer/component-graph.d.ts +0 -42
- package/src/route-renderer/component-graph.js +0 -72
- package/src/route-renderer/component-marker.d.ts +0 -52
- package/src/route-renderer/component-marker.js +0 -46
- package/src/route-renderer/dependency-resolver.d.ts +0 -24
- package/src/route-renderer/dependency-resolver.js +0 -428
- package/src/route-renderer/html-post-processing.service.d.ts +0 -40
- package/src/route-renderer/html-post-processing.service.js +0 -86
- package/src/route-renderer/html-post-processing.service.ts +0 -103
- package/src/route-renderer/integration-renderer.d.ts +0 -339
- package/src/route-renderer/integration-renderer.js +0 -526
- package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
- package/src/route-renderer/marker-graph-resolver.js +0 -93
- package/src/route-renderer/page-module-loader.d.ts +0 -61
- package/src/route-renderer/page-module-loader.js +0 -102
- package/src/route-renderer/render-execution.service.d.ts +0 -69
- package/src/route-renderer/render-execution.service.js +0 -91
- package/src/route-renderer/render-preparation.service.d.ts +0 -112
- package/src/route-renderer/render-preparation.service.js +0 -243
- package/src/route-renderer/route-renderer.d.ts +0 -26
- package/src/route-renderer/route-renderer.js +0 -68
- package/src/router/fs-router-scanner.d.ts +0 -41
- package/src/router/fs-router-scanner.js +0 -155
- package/src/router/fs-router.d.ts +0 -26
- package/src/router/fs-router.js +0 -100
- package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
- package/src/services/asset-processing-service/asset-processing.service.js +0 -250
- package/src/services/asset-processing-service/asset.factory.d.ts +0 -17
- package/src/services/asset-processing-service/asset.factory.js +0 -82
- package/src/services/asset-processing-service/assets.types.d.ts +0 -88
- package/src/services/asset-processing-service/assets.types.js +0 -0
- package/src/services/asset-processing-service/index.d.ts +0 -3
- package/src/services/asset-processing-service/index.js +0 -3
- package/src/services/asset-processing-service/processor.interface.d.ts +0 -22
- package/src/services/asset-processing-service/processor.interface.js +0 -6
- package/src/services/asset-processing-service/processor.registry.d.ts +0 -8
- package/src/services/asset-processing-service/processor.registry.js +0 -15
- package/src/services/asset-processing-service/processors/base/base-processor.d.ts +0 -24
- package/src/services/asset-processing-service/processors/base/base-processor.js +0 -59
- package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
- package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
- package/src/services/asset-processing-service/processors/index.d.ts +0 -5
- package/src/services/asset-processing-service/processors/index.js +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.d.ts +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
- package/src/services/asset-processing-service/processors/script/file-script.processor.d.ts +0 -8
- package/src/services/asset-processing-service/processors/script/file-script.processor.js +0 -76
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -5
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -63
- package/src/services/cache/cache.types.d.ts +0 -107
- package/src/services/cache/cache.types.js +0 -0
- package/src/services/cache/index.d.ts +0 -7
- package/src/services/cache/index.js +0 -7
- package/src/services/cache/memory-cache-store.d.ts +0 -42
- package/src/services/cache/memory-cache-store.js +0 -98
- package/src/services/cache/page-cache-service.d.ts +0 -70
- package/src/services/cache/page-cache-service.js +0 -152
- package/src/services/html-transformer.service.d.ts +0 -50
- package/src/services/html-transformer.service.js +0 -163
- package/src/services/html-transformer.service.ts +0 -217
- package/src/services/page-module-import.service.d.ts +0 -37
- package/src/services/page-module-import.service.js +0 -88
- package/src/services/page-module-import.service.ts +0 -129
- package/src/services/page-request-cache-coordinator.service.d.ts +0 -75
- package/src/services/page-request-cache-coordinator.service.js +0 -107
- package/src/services/schema-validation-service.d.ts +0 -122
- package/src/services/schema-validation-service.js +0 -101
- package/src/services/validation/standard-schema.types.d.ts +0 -65
- package/src/services/validation/standard-schema.types.js +0 -0
- package/src/static-site-generator/static-site-generator.d.ts +0 -57
- package/src/static-site-generator/static-site-generator.js +0 -272
- package/src/utils/css.d.ts +0 -1
- package/src/utils/css.js +0 -7
- package/src/utils/deep-merge.d.ts +0 -14
- package/src/utils/deep-merge.js +0 -32
- package/src/utils/hash.d.ts +0 -1
- package/src/utils/hash.js +0 -7
- package/src/utils/html.d.ts +0 -1
- package/src/utils/html.js +0 -4
- package/src/utils/invariant.d.ts +0 -5
- package/src/utils/invariant.js +0 -11
- package/src/utils/locals-utils.d.ts +0 -15
- package/src/utils/locals-utils.js +0 -24
- package/src/utils/parse-cli-args.d.ts +0 -24
- package/src/utils/parse-cli-args.js +0 -47
- package/src/utils/path-utils.module.d.ts +0 -5
- package/src/utils/path-utils.module.js +0 -14
- package/src/utils/runtime.d.ts +0 -11
- package/src/utils/runtime.js +0 -40
- package/src/utils/server-utils.module.d.ts +0 -19
- package/src/utils/server-utils.module.js +0 -56
- package/src/watchers/project-watcher.d.ts +0 -132
- package/src/watchers/project-watcher.js +0 -281
- package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
- package/src/watchers/project-watcher.test-helpers.js +0 -51
- /package/src/route-renderer/{component-graph-executor.ts → component-graph/component-graph-executor.ts} +0 -0
- /package/src/route-renderer/{component-graph.ts → component-graph/component-graph.ts} +0 -0
- /package/src/route-renderer/{component-marker.ts → component-graph/component-marker.ts} +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.ts +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.ts +0 -0
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* JavaScript HMR Strategy
|
|
3
3
|
*
|
|
4
4
|
* Handles hot module replacement for JavaScript and TypeScript entrypoints.
|
|
5
|
-
* Bundles files,
|
|
5
|
+
* Bundles files, inspects the emitted output, and decides whether the browser
|
|
6
|
+
* can hot-accept the change or must reload.
|
|
6
7
|
*
|
|
7
8
|
* @module
|
|
8
9
|
*/
|
|
@@ -11,8 +12,9 @@ import path from 'node:path';
|
|
|
11
12
|
import { fileSystem } from '@ecopages/file-system';
|
|
12
13
|
import { HmrStrategy, HmrStrategyType, type HmrAction } from '../hmr-strategy';
|
|
13
14
|
import { appLogger } from '../../global/app-logger';
|
|
14
|
-
import { defaultBuildAdapter } from '../../build/build-adapter.ts';
|
|
15
15
|
import type { EcoBuildPlugin } from '../../build/build-types.ts';
|
|
16
|
+
import type { BrowserBundleExecutor } from '../../services/assets/browser-bundle.service.ts';
|
|
17
|
+
import type { EntrypointDependencyGraph } from '../../services/runtime-state/entrypoint-dependency-graph.service.ts';
|
|
16
18
|
|
|
17
19
|
/**
|
|
18
20
|
* Context interface providing access to HmrManager state.
|
|
@@ -29,24 +31,7 @@ export interface JsHmrContext {
|
|
|
29
31
|
*/
|
|
30
32
|
getSpecifierMap(): Map<string, string>;
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
* Returns entrypoints impacted by a changed dependency path.
|
|
34
|
-
*
|
|
35
|
-
* @remarks
|
|
36
|
-
* This hook is currently provided by the Node HMR manager where dependency
|
|
37
|
-
* graph metadata is extracted from the Node/esbuild build adapter.
|
|
38
|
-
*/
|
|
39
|
-
getDependencyEntrypoints?(filePath: string): Set<string>;
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Stores latest dependency set for an entrypoint.
|
|
43
|
-
*
|
|
44
|
-
* @remarks
|
|
45
|
-
* This hook is currently used only by the Node HMR manager to maintain a
|
|
46
|
-
* reverse invalidation index. Runtimes that do not provide it keep rebuild-all
|
|
47
|
-
* fallback semantics.
|
|
48
|
-
*/
|
|
49
|
-
setEntrypointDependencies?(entrypointPath: string, dependencies: string[]): void;
|
|
34
|
+
getEntrypointDependencyGraph(): EntrypointDependencyGraph;
|
|
50
35
|
|
|
51
36
|
/**
|
|
52
37
|
* Directory where HMR bundles are written.
|
|
@@ -62,24 +47,53 @@ export interface JsHmrContext {
|
|
|
62
47
|
* Absolute path to the source directory.
|
|
63
48
|
*/
|
|
64
49
|
getSrcDir(): string;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Absolute path to the pages directory.
|
|
53
|
+
*/
|
|
54
|
+
getPagesDir(): string;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Absolute path to the layouts directory.
|
|
58
|
+
*/
|
|
59
|
+
getLayoutsDir(): string;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* All configured route-template extensions across integrations.
|
|
63
|
+
*/
|
|
64
|
+
getTemplateExtensions(): string[];
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Browser bundler used to rebuild changed entrypoints.
|
|
68
|
+
*/
|
|
69
|
+
getBrowserBundleService(): BrowserBundleExecutor;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Returns whether a watched entrypoint should be rebuilt by the generic JS strategy.
|
|
73
|
+
*
|
|
74
|
+
* @remarks
|
|
75
|
+
* Integrations with higher-priority HMR strategies can use this to keep the
|
|
76
|
+
* generic JS strategy from overwriting their emitted entrypoints when a shared
|
|
77
|
+
* dependency changes.
|
|
78
|
+
*/
|
|
79
|
+
shouldProcessEntrypoint?(entrypointPath: string): boolean;
|
|
65
80
|
}
|
|
66
81
|
|
|
67
82
|
/**
|
|
68
83
|
* Strategy for handling JavaScript/TypeScript file changes with hot reloading.
|
|
69
84
|
*
|
|
70
|
-
* This strategy rebuilds all registered entrypoints when any file changes,
|
|
71
|
-
* as we don't currently track dependencies. This is safe but inefficient.
|
|
72
|
-
*
|
|
73
85
|
* The processing steps are:
|
|
74
86
|
* 1. Check if any entrypoints are registered
|
|
75
|
-
* 2. Rebuild
|
|
76
|
-
*
|
|
87
|
+
* 2. Rebuild impacted entrypoints, or all watched entrypoints when no runtime
|
|
88
|
+
* dependency graph is available
|
|
89
|
+
* 3. Emit rebuilt entrypoint bundles for browser delivery
|
|
77
90
|
* 4. Inject generic HMR boilerplate
|
|
78
91
|
* 5. Broadcast update events for each rebuilt entrypoint
|
|
79
92
|
*
|
|
80
93
|
* @remarks
|
|
81
|
-
*
|
|
82
|
-
*
|
|
94
|
+
* Node can provide dependency-graph metadata, so this strategy can rebuild only
|
|
95
|
+
* the entrypoints impacted by a changed dependency. Runtimes that do not expose
|
|
96
|
+
* that metadata intentionally keep the rebuild-all fallback.
|
|
83
97
|
*
|
|
84
98
|
* @see https://bun.sh/docs/runtime/transpiler
|
|
85
99
|
*
|
|
@@ -97,9 +111,11 @@ export interface JsHmrContext {
|
|
|
97
111
|
*/
|
|
98
112
|
export class JsHmrStrategy extends HmrStrategy {
|
|
99
113
|
readonly type = HmrStrategyType.SCRIPT;
|
|
114
|
+
private context: JsHmrContext;
|
|
100
115
|
|
|
101
|
-
constructor(
|
|
116
|
+
constructor(context: JsHmrContext) {
|
|
102
117
|
super();
|
|
118
|
+
this.context = context;
|
|
103
119
|
}
|
|
104
120
|
|
|
105
121
|
/**
|
|
@@ -116,6 +132,10 @@ export class JsHmrStrategy extends HmrStrategy {
|
|
|
116
132
|
const watchedFiles = this.context.getWatchedFiles();
|
|
117
133
|
const isJsTs = /\.(ts|tsx|js|jsx)$/.test(filePath);
|
|
118
134
|
const isInSrc = filePath.startsWith(this.context.getSrcDir());
|
|
135
|
+
const isRouteTemplate =
|
|
136
|
+
filePath.startsWith(this.context.getPagesDir()) || filePath.startsWith(this.context.getLayoutsDir());
|
|
137
|
+
const isIntegrationTemplate =
|
|
138
|
+
isRouteTemplate && this.context.getTemplateExtensions().some((extension) => filePath.endsWith(extension));
|
|
119
139
|
|
|
120
140
|
if (watchedFiles.size === 0) {
|
|
121
141
|
return false;
|
|
@@ -125,12 +145,17 @@ export class JsHmrStrategy extends HmrStrategy {
|
|
|
125
145
|
return false;
|
|
126
146
|
}
|
|
127
147
|
|
|
148
|
+
if (isIntegrationTemplate) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
|
|
128
152
|
if (watchedFiles.has(filePath)) {
|
|
129
153
|
return true;
|
|
130
154
|
}
|
|
131
155
|
|
|
132
|
-
|
|
133
|
-
|
|
156
|
+
const entrypointDependencyGraph = this.context.getEntrypointDependencyGraph();
|
|
157
|
+
if (entrypointDependencyGraph.supportsSelectiveInvalidation()) {
|
|
158
|
+
return entrypointDependencyGraph.getDependencyEntrypoints(filePath).size > 0;
|
|
134
159
|
}
|
|
135
160
|
|
|
136
161
|
return true;
|
|
@@ -157,21 +182,24 @@ export class JsHmrStrategy extends HmrStrategy {
|
|
|
157
182
|
return { type: 'none' };
|
|
158
183
|
}
|
|
159
184
|
|
|
160
|
-
const dependencyHits = this.context.getDependencyEntrypoints
|
|
185
|
+
const dependencyHits = this.context.getEntrypointDependencyGraph().getDependencyEntrypoints(filePath);
|
|
161
186
|
const hasDependencyHit = dependencyHits.size > 0;
|
|
162
187
|
const impactedEntrypoints = hasDependencyHit
|
|
163
188
|
? Array.from(dependencyHits).filter((entrypoint) => watchedFiles.has(entrypoint))
|
|
164
189
|
: Array.from(watchedFiles.keys());
|
|
190
|
+
const buildableEntrypoints = impactedEntrypoints.filter(
|
|
191
|
+
(entrypoint) => this.context.shouldProcessEntrypoint?.(entrypoint) ?? true,
|
|
192
|
+
);
|
|
165
193
|
|
|
166
194
|
if (!hasDependencyHit) {
|
|
167
195
|
appLogger.debug('[JsHmrStrategy] Dependency graph miss, rebuilding all watched entrypoints');
|
|
168
196
|
}
|
|
169
197
|
|
|
170
|
-
if (
|
|
198
|
+
if (buildableEntrypoints.length === 0) {
|
|
171
199
|
return { type: 'none' };
|
|
172
200
|
}
|
|
173
201
|
|
|
174
|
-
const buildResult = await this.bundleEntrypoints(
|
|
202
|
+
const buildResult = await this.bundleEntrypoints(buildableEntrypoints);
|
|
175
203
|
|
|
176
204
|
if (!buildResult.success) {
|
|
177
205
|
return { type: 'none' };
|
|
@@ -180,18 +208,18 @@ export class JsHmrStrategy extends HmrStrategy {
|
|
|
180
208
|
const updates: string[] = [];
|
|
181
209
|
let reloadRequired = false;
|
|
182
210
|
|
|
183
|
-
for (const entrypoint of
|
|
211
|
+
for (const entrypoint of buildableEntrypoints) {
|
|
184
212
|
const outputUrl = watchedFiles.get(entrypoint);
|
|
185
213
|
if (!outputUrl) continue;
|
|
186
214
|
|
|
187
|
-
if (buildResult.dependencies
|
|
215
|
+
if (buildResult.dependencies) {
|
|
188
216
|
const entrypointDeps = buildResult.dependencies.get(path.resolve(entrypoint)) ?? [];
|
|
189
|
-
this.context.setEntrypointDependencies(entrypoint, entrypointDeps);
|
|
217
|
+
this.context.getEntrypointDependencyGraph().setEntrypointDependencies(entrypoint, entrypointDeps);
|
|
190
218
|
}
|
|
191
219
|
|
|
192
220
|
const srcDir = this.context.getSrcDir();
|
|
193
221
|
const relativePath = path.relative(srcDir, entrypoint);
|
|
194
|
-
const relativePathJs = relativePath.replace(/\.(tsx?|jsx?)$/, '.js');
|
|
222
|
+
const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
|
|
195
223
|
const outputPath = path.join(this.context.getDistDir(), relativePathJs);
|
|
196
224
|
|
|
197
225
|
const result = await this.processOutput(outputPath, outputUrl);
|
|
@@ -234,15 +262,14 @@ export class JsHmrStrategy extends HmrStrategy {
|
|
|
234
262
|
entrypoints: string[],
|
|
235
263
|
): Promise<{ success: boolean; dependencies?: Map<string, string[]> }> {
|
|
236
264
|
try {
|
|
237
|
-
const result = await
|
|
265
|
+
const result = await this.context.getBrowserBundleService().bundle({
|
|
266
|
+
profile: 'hmr-entrypoint',
|
|
238
267
|
entrypoints,
|
|
239
268
|
outdir: this.context.getDistDir(),
|
|
240
269
|
outbase: this.context.getSrcDir(),
|
|
241
270
|
naming: '[dir]/[name]',
|
|
242
|
-
...defaultBuildAdapter.getTranspileOptions('hmr-entrypoint'),
|
|
243
271
|
plugins: this.context.getPlugins(),
|
|
244
272
|
minify: false,
|
|
245
|
-
external: ['react', 'react-dom'],
|
|
246
273
|
});
|
|
247
274
|
|
|
248
275
|
if (!result.success) {
|
|
@@ -265,7 +292,8 @@ export class JsHmrStrategy extends HmrStrategy {
|
|
|
265
292
|
}
|
|
266
293
|
|
|
267
294
|
/**
|
|
268
|
-
* Processes bundled output
|
|
295
|
+
* Processes bundled output and determines whether the browser can hot-accept
|
|
296
|
+
* the update or must fall back to a full reload.
|
|
269
297
|
*
|
|
270
298
|
* @param filepath - Path to the bundled output file
|
|
271
299
|
* @param url - URL path for the bundled file
|
|
@@ -273,25 +301,15 @@ export class JsHmrStrategy extends HmrStrategy {
|
|
|
273
301
|
*/
|
|
274
302
|
private async processOutput(filepath: string, url: string): Promise<{ success: boolean; requiresReload: boolean }> {
|
|
275
303
|
try {
|
|
276
|
-
|
|
304
|
+
const code = await fileSystem.readFile(filepath);
|
|
277
305
|
|
|
278
306
|
if (code.includes('/* [ecopages] hmr */')) {
|
|
279
|
-
|
|
280
|
-
* Already processed, assume it supports HMR if it has the header (legacy safety)
|
|
281
|
-
* or check specifically for accept
|
|
282
|
-
*/
|
|
307
|
+
// Legacy safety: previously processed bundles already carry the marker.
|
|
283
308
|
return { success: true, requiresReload: !code.includes('import.meta.hot.accept') };
|
|
284
309
|
}
|
|
285
310
|
|
|
286
|
-
code = this.replaceBareSpecifiers(code);
|
|
287
|
-
await fileSystem.writeAsync(filepath, code);
|
|
288
|
-
|
|
289
311
|
appLogger.debug(`[JsHmrStrategy] Processed ${url}`);
|
|
290
312
|
|
|
291
|
-
/**
|
|
292
|
-
* Implicit HMR check: if the code explicitly accepts HMR, we broadcast update.
|
|
293
|
-
* Otherwise, we must reload the page to ensure fresh execution (e.g. for Custom Elements or side effects).
|
|
294
|
-
*/
|
|
295
313
|
const hasHmrAccept = code.includes('import.meta.hot.accept');
|
|
296
314
|
return { success: true, requiresReload: !hasHmrAccept };
|
|
297
315
|
} catch (error) {
|
|
@@ -299,29 +317,4 @@ export class JsHmrStrategy extends HmrStrategy {
|
|
|
299
317
|
return { success: false, requiresReload: false };
|
|
300
318
|
}
|
|
301
319
|
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Replaces bare specifiers with vendor URLs.
|
|
305
|
-
*
|
|
306
|
-
* Handles both static imports and dynamic imports.
|
|
307
|
-
*
|
|
308
|
-
* @param code - The bundled code to transform
|
|
309
|
-
* @returns The transformed code with vendor URLs
|
|
310
|
-
*/
|
|
311
|
-
private replaceBareSpecifiers(code: string): string {
|
|
312
|
-
const specifierMap = this.context.getSpecifierMap();
|
|
313
|
-
|
|
314
|
-
if (specifierMap.size === 0) {
|
|
315
|
-
return code;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
let result = code;
|
|
319
|
-
for (const [bareSpec, vendorUrl] of specifierMap.entries()) {
|
|
320
|
-
const escaped = bareSpec.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
321
|
-
result = result.replace(new RegExp(`from\\s*["']${escaped}["']`, 'g'), `from "${vendorUrl}"`);
|
|
322
|
-
result = result.replace(new RegExp(`import\\(["']${escaped}["']\\)`, 'g'), `import("${vendorUrl}")`);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
return result;
|
|
326
|
-
}
|
|
327
320
|
}
|
package/src/index.ts
CHANGED
|
@@ -2,4 +2,4 @@ export type * from './public-types.ts';
|
|
|
2
2
|
export type * from './eco/eco.types.ts';
|
|
3
3
|
export { eco } from './eco/eco.ts';
|
|
4
4
|
export { EcopagesApp, createApp, type EcopagesAppOptions } from './create-app.ts';
|
|
5
|
-
export { defineApiHandler, defineGroupHandler, type GroupHandler } from './define-api-handler.ts';
|
|
5
|
+
export { defineApiHandler, defineGroupHandler, type GroupHandler } from './adapters/shared/define-api-handler.ts';
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import HtmlTemplate from '../../../__fixtures__/app/src/includes/html.ghtml.js';
|
|
3
|
+
import { FIXTURE_APP_PROJECT_DIR } from '../../../__fixtures__/constants.js';
|
|
4
|
+
import { ConfigBuilder } from '../../config/config-builder.ts';
|
|
5
|
+
import { GhtmlRenderer } from './ghtml-renderer.ts';
|
|
6
|
+
|
|
7
|
+
const appConfig = await new ConfigBuilder().setRootDir(FIXTURE_APP_PROJECT_DIR).build();
|
|
8
|
+
|
|
9
|
+
const metadata = {
|
|
10
|
+
title: 'Ecopages',
|
|
11
|
+
description: 'Ecopages',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const pageBody = '<body>Hello World</body>';
|
|
15
|
+
|
|
16
|
+
const rendererContext = {
|
|
17
|
+
appConfig,
|
|
18
|
+
} as unknown as any;
|
|
19
|
+
|
|
20
|
+
describe('GhtmlRenderer', () => {
|
|
21
|
+
it('should render the page', async () => {
|
|
22
|
+
const renderer = new GhtmlRenderer(rendererContext);
|
|
23
|
+
|
|
24
|
+
renderer
|
|
25
|
+
.render({
|
|
26
|
+
params: {},
|
|
27
|
+
query: {},
|
|
28
|
+
props: {},
|
|
29
|
+
file: 'file',
|
|
30
|
+
metadata,
|
|
31
|
+
Page: async () => pageBody,
|
|
32
|
+
resolvedDependencies: [],
|
|
33
|
+
HtmlTemplate,
|
|
34
|
+
})
|
|
35
|
+
.then((body) => {
|
|
36
|
+
expect(body).toContain('<!DOCTYPE html>');
|
|
37
|
+
expect(body).toContain('<body>Hello World</body>');
|
|
38
|
+
expect(body).toContain('<title>Ecopages</title>');
|
|
39
|
+
expect(body).toContain('<meta name="description" content="Ecopages" />');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should throw an error if the page fails to render', async () => {
|
|
44
|
+
const renderer = new GhtmlRenderer(rendererContext);
|
|
45
|
+
|
|
46
|
+
renderer
|
|
47
|
+
.render({
|
|
48
|
+
params: {},
|
|
49
|
+
query: {},
|
|
50
|
+
props: {},
|
|
51
|
+
file: 'file',
|
|
52
|
+
resolvedDependencies: [],
|
|
53
|
+
metadata,
|
|
54
|
+
Page: async () => {
|
|
55
|
+
throw new Error('Page failed to render');
|
|
56
|
+
},
|
|
57
|
+
HtmlTemplate,
|
|
58
|
+
})
|
|
59
|
+
.catch((error) => {
|
|
60
|
+
expect(error.message).toBe('Error rendering page: Page failed to render');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|
|
@@ -10,7 +10,10 @@ import type {
|
|
|
10
10
|
PageMetadataProps,
|
|
11
11
|
RouteRendererBody,
|
|
12
12
|
} from '../../public-types.ts';
|
|
13
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
IntegrationRenderer,
|
|
15
|
+
type RenderToResponseContext,
|
|
16
|
+
} from '../../route-renderer/orchestration/integration-renderer.ts';
|
|
14
17
|
import { GHTML_PLUGIN_NAME } from './ghtml.plugin.ts';
|
|
15
18
|
|
|
16
19
|
/**
|
package/src/internal-types.ts
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import type { EcoBuildPlugin } from './build/build-types.ts';
|
|
2
|
+
import type { AppBuildManifest } from './build/build-manifest.ts';
|
|
3
|
+
import type { BuildAdapter, BuildExecutor } from './build/build-adapter.ts';
|
|
2
4
|
import type { IntegrationPlugin } from './plugins/integration-plugin.ts';
|
|
3
5
|
import type { Processor } from './plugins/processor.ts';
|
|
4
6
|
import type { PageMetadataProps } from './public-types.ts';
|
|
5
|
-
import type { FSRouter } from './router/fs-router.ts';
|
|
7
|
+
import type { FSRouter } from './router/server/fs-router.ts';
|
|
6
8
|
import type { CacheConfig } from './services/cache/cache.types.ts';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
html: string;
|
|
14
|
-
seo: string;
|
|
15
|
-
};
|
|
9
|
+
import type { DevGraphService } from './services/runtime-state/dev-graph.service.ts';
|
|
10
|
+
import type { EntrypointDependencyGraph } from './services/runtime-state/entrypoint-dependency-graph.service.ts';
|
|
11
|
+
import type { NodeRuntimeManifest } from './services/runtime-manifest/node-runtime-manifest.service.ts';
|
|
12
|
+
import type { RuntimeSpecifierRegistry } from './services/runtime-state/runtime-specifier-registry.service.ts';
|
|
13
|
+
import type { ServerInvalidationState } from './services/runtime-state/server-invalidation-state.service.ts';
|
|
14
|
+
import type { ServerModuleTranspiler } from './services/module-loading/server-module-transpiler.service.ts';
|
|
16
15
|
|
|
17
16
|
export interface RobotsPreference {
|
|
18
17
|
/**
|
|
@@ -61,20 +60,22 @@ export type EcoPagesAppConfig = {
|
|
|
61
60
|
* @default "layouts"
|
|
62
61
|
*/
|
|
63
62
|
layoutsDir: string;
|
|
64
|
-
/**
|
|
65
|
-
* The templates used for the pages
|
|
66
|
-
* @default "{head: 'head.kita.tsx', html: 'html.kita.tsx', seo: 'seo.kita.tsx'}"
|
|
67
|
-
*/
|
|
68
|
-
includesTemplates: IncludesTemplates;
|
|
69
|
-
/** Error 404 page
|
|
70
|
-
* @default "404.kita.tsx"
|
|
71
|
-
*/
|
|
72
|
-
error404Template: string;
|
|
73
63
|
/**
|
|
74
64
|
* The directory where the output will be located
|
|
75
65
|
* @default "dist"
|
|
76
66
|
*/
|
|
77
67
|
distDir: string;
|
|
68
|
+
/**
|
|
69
|
+
* The directory where internal runtime and build artifacts are stored.
|
|
70
|
+
*
|
|
71
|
+
* @remarks
|
|
72
|
+
* This directory is not intended for deployment. It owns transpiled server
|
|
73
|
+
* modules, runtime manifests, and processor caches so `distDir` can remain a
|
|
74
|
+
* clean export tree.
|
|
75
|
+
*
|
|
76
|
+
* @default ".eco"
|
|
77
|
+
*/
|
|
78
|
+
workDir: string;
|
|
78
79
|
/**
|
|
79
80
|
* The templates extensions based on the integrations
|
|
80
81
|
*/
|
|
@@ -109,6 +110,7 @@ export type EcoPagesAppConfig = {
|
|
|
109
110
|
config: string;
|
|
110
111
|
componentsDir: string;
|
|
111
112
|
distDir: string;
|
|
113
|
+
workDir: string;
|
|
112
114
|
includesDir: string;
|
|
113
115
|
layoutsDir: string;
|
|
114
116
|
pagesDir: string;
|
|
@@ -131,6 +133,24 @@ export type EcoPagesAppConfig = {
|
|
|
131
133
|
* @default { store: 'memory', defaultStrategy: 'static', enabled: true }
|
|
132
134
|
*/
|
|
133
135
|
cache?: CacheConfig;
|
|
136
|
+
/**
|
|
137
|
+
* Runtime-owned services attached after config construction.
|
|
138
|
+
*
|
|
139
|
+
* These values are internal implementation details used to thread per-app
|
|
140
|
+
* executors and similar runtime state through the system without relying on
|
|
141
|
+
* process-global registries.
|
|
142
|
+
*/
|
|
143
|
+
runtime?: {
|
|
144
|
+
buildAdapter?: BuildAdapter;
|
|
145
|
+
buildManifest?: AppBuildManifest;
|
|
146
|
+
buildExecutor?: BuildExecutor;
|
|
147
|
+
devGraphService?: DevGraphService;
|
|
148
|
+
entrypointDependencyGraph?: EntrypointDependencyGraph;
|
|
149
|
+
nodeRuntimeManifest?: NodeRuntimeManifest;
|
|
150
|
+
runtimeSpecifierRegistry?: RuntimeSpecifierRegistry;
|
|
151
|
+
serverInvalidationState?: ServerInvalidationState;
|
|
152
|
+
serverModuleTranspiler?: ServerModuleTranspiler;
|
|
153
|
+
};
|
|
134
154
|
/**
|
|
135
155
|
* Experimental features.
|
|
136
156
|
*/
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Plugin Contracts
|
|
2
|
+
|
|
3
|
+
This directory contains the authoring contracts for Ecopages integrations, processors, and related plugin-facing runtime declarations.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
The plugin layer defines what packages are allowed to declare about themselves, while core retains orchestration ownership.
|
|
8
|
+
|
|
9
|
+
These contracts are responsible for:
|
|
10
|
+
|
|
11
|
+
- integration registration and lifecycle hooks
|
|
12
|
+
- processor registration and asset capability declaration
|
|
13
|
+
- runtime capability declaration and validation input
|
|
14
|
+
- shared build-plugin bridge types used by integrations and processors
|
|
15
|
+
|
|
16
|
+
## Main Files
|
|
17
|
+
|
|
18
|
+
- `integration-plugin.ts`: framework-semantics contract for render integrations
|
|
19
|
+
- `processor.ts`: asset-transformation contract for processors
|
|
20
|
+
- `runtime-capability.ts`: runtime compatibility declaration types
|
|
21
|
+
- `eco-component-meta-plugin.ts`: shared metadata transform used by core loading/build paths
|
|
22
|
+
|
|
23
|
+
## Ownership Rules
|
|
24
|
+
|
|
25
|
+
- Integrations own rendering semantics, hydration behavior, and integration-specific HMR strategy.
|
|
26
|
+
- Processors own asset semantics, cache ownership, and processor-specific watch behavior.
|
|
27
|
+
- Core owns lifecycle ordering, startup orchestration, and manifest assembly.
|
|
28
|
+
|
|
29
|
+
## Lifecycle Summary
|
|
30
|
+
|
|
31
|
+
1. Config build validates and prepares plugin contributions.
|
|
32
|
+
2. Core seals the app-owned build manifest.
|
|
33
|
+
3. Runtime startup calls runtime-only setup hooks.
|
|
34
|
+
4. Request-time rendering and development invalidation reuse those finalized contracts.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { test } from 'vitest';
|
|
6
|
+
import type { EcoBuildOnResolveResult } from '../build/build-types.ts';
|
|
7
|
+
import { createAliasResolverPlugin } from './alias-resolver-plugin.ts';
|
|
8
|
+
|
|
9
|
+
test('createAliasResolverPlugin resolves @ aliases to concrete barrel targets', async () => {
|
|
10
|
+
const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'ecopages-alias-resolver-'));
|
|
11
|
+
const srcDir = path.join(rootDir, 'src');
|
|
12
|
+
const layoutDir = path.join(srcDir, 'layouts', 'base-layout');
|
|
13
|
+
fs.mkdirSync(layoutDir, { recursive: true });
|
|
14
|
+
fs.writeFileSync(path.join(layoutDir, 'base-layout.kita.tsx'), 'export const BaseLayout = {};\n', 'utf8');
|
|
15
|
+
fs.writeFileSync(path.join(layoutDir, 'index.ts'), "export * from './base-layout.kita';\n", 'utf8');
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
const registrations: Array<{
|
|
19
|
+
filter: RegExp;
|
|
20
|
+
callback: (args: {
|
|
21
|
+
path: string;
|
|
22
|
+
}) => EcoBuildOnResolveResult | undefined | Promise<EcoBuildOnResolveResult | undefined>;
|
|
23
|
+
}> = [];
|
|
24
|
+
const plugin = createAliasResolverPlugin(srcDir);
|
|
25
|
+
|
|
26
|
+
plugin.setup({
|
|
27
|
+
onResolve(options, callback) {
|
|
28
|
+
registrations.push({ filter: options.filter, callback });
|
|
29
|
+
},
|
|
30
|
+
onLoad() {},
|
|
31
|
+
module() {},
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
assert.equal(registrations.length, 1);
|
|
35
|
+
assert.deepEqual(await registrations[0]?.callback({ path: '@/layouts/base-layout' }), {
|
|
36
|
+
path: path.join(layoutDir, 'base-layout.kita.tsx'),
|
|
37
|
+
});
|
|
38
|
+
} finally {
|
|
39
|
+
fs.rmSync(rootDir, { recursive: true, force: true });
|
|
40
|
+
}
|
|
41
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import type { EcoBuildPlugin } from '../build/build-types.ts';
|
|
4
4
|
|
|
@@ -6,7 +6,9 @@ const RESOLVABLE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.m
|
|
|
6
6
|
|
|
7
7
|
function findResolvablePath(candidate: string): string | undefined {
|
|
8
8
|
if (path.extname(candidate)) {
|
|
9
|
-
|
|
9
|
+
if (existsSync(candidate)) {
|
|
10
|
+
return candidate;
|
|
11
|
+
}
|
|
10
12
|
}
|
|
11
13
|
|
|
12
14
|
for (const extension of RESOLVABLE_EXTENSIONS) {
|
|
@@ -26,6 +28,22 @@ function findResolvablePath(candidate: string): string | undefined {
|
|
|
26
28
|
return undefined;
|
|
27
29
|
}
|
|
28
30
|
|
|
31
|
+
function resolveAliasedBarrelTarget(resolvedPath: string): string {
|
|
32
|
+
if (!path.basename(resolvedPath).startsWith('index.')) {
|
|
33
|
+
return resolvedPath;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const source = readFileSync(resolvedPath, 'utf8').trim();
|
|
37
|
+
const match = source.match(/^export\s+\*\s+from\s+['"]([^'"]+)['"]\s*;?$/);
|
|
38
|
+
|
|
39
|
+
if (!match?.[1]?.startsWith('.')) {
|
|
40
|
+
return resolvedPath;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const target = findResolvablePath(path.resolve(path.dirname(resolvedPath), match[1]));
|
|
44
|
+
return target ?? resolvedPath;
|
|
45
|
+
}
|
|
46
|
+
|
|
29
47
|
export function createAliasResolverPlugin(srcDir: string): EcoBuildPlugin {
|
|
30
48
|
return {
|
|
31
49
|
name: 'ecopages-alias-resolver',
|
|
@@ -35,7 +53,7 @@ export function createAliasResolverPlugin(srcDir: string): EcoBuildPlugin {
|
|
|
35
53
|
const resolved = findResolvablePath(candidate);
|
|
36
54
|
|
|
37
55
|
if (resolved) {
|
|
38
|
-
return { path: resolved };
|
|
56
|
+
return { path: resolveAliasedBarrelTarget(resolved) };
|
|
39
57
|
}
|
|
40
58
|
|
|
41
59
|
return {};
|