@ecopages/core 0.2.0-alpha.4 → 0.2.0-alpha.6
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 +181 -68
- 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 +208 -116
- 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 +235 -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 -83
- 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 +115 -115
- 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 -16
- 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 -1
- package/src/watchers/project-watcher.test.ts +678 -0
- package/src/watchers/project-watcher.ts +130 -111
- package/CHANGELOG.md +0 -91
- 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 -85
- package/src/adapters/bun/hmr-manager.js +0 -240
- 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 -63
- package/src/adapters/node/node-hmr-manager.js +0 -237
- 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 -74
- 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 -390
- 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 -188
- 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 -1098
- 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 -125
- package/src/watchers/project-watcher.js +0 -265
- package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
- package/src/watchers/project-watcher.test-helpers.js +0 -52
- /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
|
@@ -3,7 +3,8 @@ import chokidar, { type FSWatcher } from 'chokidar';
|
|
|
3
3
|
import { fileSystem } from '@ecopages/file-system';
|
|
4
4
|
import { appLogger } from '../global/app-logger.ts';
|
|
5
5
|
import type { EcoPagesAppConfig, IHmrManager, IClientBridge } from '../internal-types.ts';
|
|
6
|
-
import type { ProcessorWatchContext } from '../plugins/processor.ts';
|
|
6
|
+
import type { ProcessorWatchConfig, ProcessorWatchContext } from '../plugins/processor.ts';
|
|
7
|
+
import { DevelopmentInvalidationService } from '../services/invalidation/development-invalidation.service.ts';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Configuration options for the ProjectWatcher
|
|
@@ -48,14 +49,17 @@ export class ProjectWatcher {
|
|
|
48
49
|
private refreshRouterRoutesCallback: () => void;
|
|
49
50
|
private hmrManager: IHmrManager;
|
|
50
51
|
private bridge: IClientBridge;
|
|
52
|
+
private readonly invalidationService: DevelopmentInvalidationService;
|
|
51
53
|
private watcher: FSWatcher | null = null;
|
|
52
54
|
private lastHandledChange = new Map<string, number>();
|
|
55
|
+
private changeQueue: Promise<void> = Promise.resolve();
|
|
53
56
|
|
|
54
57
|
constructor({ config, refreshRouterRoutesCallback, hmrManager, bridge }: ProjectWatcherConfig) {
|
|
55
58
|
this.appConfig = config;
|
|
56
59
|
this.refreshRouterRoutesCallback = refreshRouterRoutesCallback;
|
|
57
60
|
this.hmrManager = hmrManager;
|
|
58
61
|
this.bridge = bridge;
|
|
62
|
+
this.invalidationService = new DevelopmentInvalidationService(config);
|
|
59
63
|
this.triggerRouterRefresh = this.triggerRouterRefresh.bind(this);
|
|
60
64
|
this.handleError = this.handleError.bind(this);
|
|
61
65
|
this.handleFileChange = this.handleFileChange.bind(this);
|
|
@@ -79,6 +83,14 @@ export class ProjectWatcher {
|
|
|
79
83
|
}
|
|
80
84
|
}
|
|
81
85
|
|
|
86
|
+
private isRouteSourceFile(filePath: string): boolean {
|
|
87
|
+
return this.invalidationService.isRouteSourceFile(filePath);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
private isIncludeSourceFile(filePath: string): boolean {
|
|
91
|
+
return this.invalidationService.isIncludeSourceFile(filePath);
|
|
92
|
+
}
|
|
93
|
+
|
|
82
94
|
/**
|
|
83
95
|
* Handles public directory file changes by copying only the changed file.
|
|
84
96
|
* @param filePath - Absolute path of the changed file
|
|
@@ -101,19 +113,34 @@ export class ProjectWatcher {
|
|
|
101
113
|
}
|
|
102
114
|
}
|
|
103
115
|
|
|
116
|
+
/**
|
|
117
|
+
* Serializes file change handling so that concurrent chokidar events are
|
|
118
|
+
* processed one at a time, preventing overlapping builds and race conditions.
|
|
119
|
+
*/
|
|
120
|
+
private enqueueChange(task: () => Promise<void>): void {
|
|
121
|
+
const queuedTask = this.changeQueue.then(task, task);
|
|
122
|
+
this.changeQueue = queuedTask.catch(() => undefined);
|
|
123
|
+
}
|
|
124
|
+
|
|
104
125
|
/**
|
|
105
126
|
* Handles file changes by uncaching modules, refreshing routes, and delegating appropriately.
|
|
106
|
-
* Follows
|
|
107
|
-
* 0. Public directory match?
|
|
108
|
-
* 1. additionalWatchPaths match?
|
|
109
|
-
* 2.
|
|
110
|
-
* 3.
|
|
127
|
+
* Follows 5-rule priority:
|
|
128
|
+
* 0. Public directory match? -> copy file and reload
|
|
129
|
+
* 1. additionalWatchPaths match? -> reload
|
|
130
|
+
* 2. Include template source? -> reload after processor notifications
|
|
131
|
+
* 3. Processor-owned asset? -> processor already handled it via notification, skip HMR
|
|
132
|
+
* 4. Otherwise -> HMR strategies
|
|
133
|
+
*
|
|
134
|
+
* Processors that watch a file extension as a dependency (e.g. PostCSS watching
|
|
135
|
+
* .tsx for Tailwind class scanning) are always notified first, but do not
|
|
136
|
+
* prevent the file from flowing through the normal HMR strategy pipeline.
|
|
111
137
|
*
|
|
112
138
|
* Duplicate identical watcher events for the same file are coalesced within a
|
|
113
139
|
* short window before any of the priority rules run.
|
|
114
140
|
* @param rawPath - Path of the changed file
|
|
141
|
+
* @param event - The type of file system event
|
|
115
142
|
*/
|
|
116
|
-
private async handleFileChange(rawPath: string): Promise<void> {
|
|
143
|
+
private async handleFileChange(rawPath: string, event: 'change' | 'add' | 'unlink' = 'change'): Promise<void> {
|
|
117
144
|
const filePath = path.resolve(rawPath);
|
|
118
145
|
const now = Date.now();
|
|
119
146
|
const lastHandledAt = this.lastHandledChange.get(filePath);
|
|
@@ -123,33 +150,41 @@ export class ProjectWatcher {
|
|
|
123
150
|
this.lastHandledChange.set(filePath, now);
|
|
124
151
|
|
|
125
152
|
try {
|
|
126
|
-
|
|
153
|
+
const plan = this.invalidationService.planFileChange(filePath);
|
|
154
|
+
|
|
155
|
+
if (plan.category === 'public-asset') {
|
|
127
156
|
await this.handlePublicDirFileChange(filePath);
|
|
128
157
|
return;
|
|
129
158
|
}
|
|
130
159
|
|
|
131
160
|
this.uncacheModules();
|
|
132
|
-
|
|
161
|
+
if (plan.invalidateServerModules) {
|
|
162
|
+
this.invalidationService.invalidateServerModules([filePath]);
|
|
163
|
+
}
|
|
133
164
|
|
|
134
|
-
if (
|
|
165
|
+
if (plan.refreshRoutes) {
|
|
135
166
|
this.refreshRouterRoutesCallback();
|
|
136
167
|
}
|
|
137
168
|
|
|
138
|
-
if (
|
|
169
|
+
if (plan.category === 'additional-watch') {
|
|
139
170
|
this.bridge.reload();
|
|
140
171
|
return;
|
|
141
172
|
}
|
|
142
173
|
|
|
143
|
-
|
|
174
|
+
await this.notifyProcessors(filePath, event);
|
|
175
|
+
|
|
176
|
+
if (plan.category === 'include-source') {
|
|
177
|
+
this.bridge.reload();
|
|
144
178
|
return;
|
|
145
179
|
}
|
|
146
180
|
|
|
147
|
-
if (
|
|
148
|
-
this.hmrManager.broadcast({ type: 'layout-update' });
|
|
181
|
+
if (plan.processorHandledAsset) {
|
|
149
182
|
return;
|
|
150
183
|
}
|
|
151
184
|
|
|
152
|
-
|
|
185
|
+
if (plan.delegateToHmr) {
|
|
186
|
+
await this.hmrManager.handleFileChange(filePath);
|
|
187
|
+
}
|
|
153
188
|
} catch (error) {
|
|
154
189
|
if (error instanceof Error) {
|
|
155
190
|
this.bridge.error(error.message);
|
|
@@ -159,78 +194,65 @@ export class ProjectWatcher {
|
|
|
159
194
|
}
|
|
160
195
|
|
|
161
196
|
/**
|
|
162
|
-
*
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Checks if file path matches any additionalWatchPaths patterns.
|
|
197
|
+
* Notifies all processors whose watch config matches the given file extension.
|
|
198
|
+
* This is called before checking processor ownership so that dependency-only
|
|
199
|
+
* processors (e.g. PostCSS watching .tsx for class scanning) receive their
|
|
200
|
+
* notifications regardless of whether they own the file.
|
|
170
201
|
*/
|
|
171
|
-
private
|
|
172
|
-
const
|
|
173
|
-
if (!patterns.length) return false;
|
|
174
|
-
|
|
175
|
-
for (const pattern of patterns) {
|
|
176
|
-
if (pattern.includes('*')) {
|
|
177
|
-
const ext = pattern.replace(/\*\*?\/\*/, '');
|
|
178
|
-
if (filePath.endsWith(ext)) return true;
|
|
179
|
-
} else {
|
|
180
|
-
if (filePath.endsWith(pattern) || filePath === path.resolve(pattern)) return true;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return false;
|
|
184
|
-
}
|
|
202
|
+
private async notifyProcessors(filePath: string, event: 'change' | 'add' | 'unlink'): Promise<void> {
|
|
203
|
+
const ctx: ProcessorWatchContext = { path: filePath, bridge: this.bridge };
|
|
185
204
|
|
|
186
|
-
/**
|
|
187
|
-
* Checks whether a file is watched by any processor, even if that processor
|
|
188
|
-
* does not own the file as a primary asset.
|
|
189
|
-
*/
|
|
190
|
-
private isWatchedByProcessor(filePath: string): boolean {
|
|
191
205
|
for (const processor of this.appConfig.processors.values()) {
|
|
192
206
|
const watchConfig = processor.getWatchConfig();
|
|
193
207
|
if (!watchConfig) continue;
|
|
194
208
|
|
|
195
209
|
const { extensions = [] } = watchConfig;
|
|
196
|
-
if (extensions.length && extensions.some((ext) => filePath.endsWith(ext))) {
|
|
197
|
-
|
|
210
|
+
if (extensions.length && !extensions.some((ext) => filePath.endsWith(ext))) {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const handler = this.getProcessorHandler(watchConfig, event);
|
|
215
|
+
if (handler) {
|
|
216
|
+
await handler(ctx);
|
|
198
217
|
}
|
|
199
218
|
}
|
|
219
|
+
}
|
|
200
220
|
|
|
201
|
-
|
|
221
|
+
private getProcessorHandler(
|
|
222
|
+
watchConfig: ProcessorWatchConfig,
|
|
223
|
+
event: 'change' | 'add' | 'unlink',
|
|
224
|
+
): ((ctx: ProcessorWatchContext) => Promise<void>) | undefined {
|
|
225
|
+
switch (event) {
|
|
226
|
+
case 'change':
|
|
227
|
+
return watchConfig.onChange;
|
|
228
|
+
case 'add':
|
|
229
|
+
return watchConfig.onCreate;
|
|
230
|
+
case 'unlink':
|
|
231
|
+
return watchConfig.onDelete;
|
|
232
|
+
}
|
|
202
233
|
}
|
|
203
234
|
|
|
204
235
|
/**
|
|
205
|
-
* Checks if a file is
|
|
206
|
-
* Processors that declare extensions own those file types.
|
|
236
|
+
* Checks if a file is in the public directory.
|
|
207
237
|
*/
|
|
208
|
-
private
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
if (capabilities.length > 0) {
|
|
212
|
-
const matchesConfiguredAsset =
|
|
213
|
-
typeof processor.matchesFileFilter !== 'function' || processor.matchesFileFilter(filePath);
|
|
214
|
-
|
|
215
|
-
if (
|
|
216
|
-
matchesConfiguredAsset &&
|
|
217
|
-
capabilities.some((capability) => processor.canProcessAsset?.(capability.kind, filePath))
|
|
218
|
-
) {
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
continue;
|
|
223
|
-
}
|
|
238
|
+
private isPublicDirFile(filePath: string): boolean {
|
|
239
|
+
return this.invalidationService.isPublicDirFile(filePath);
|
|
240
|
+
}
|
|
224
241
|
|
|
225
|
-
|
|
226
|
-
|
|
242
|
+
/**
|
|
243
|
+
* Checks if file path matches any additionalWatchPaths patterns.
|
|
244
|
+
*/
|
|
245
|
+
private matchesAdditionalWatchPaths(filePath: string): boolean {
|
|
246
|
+
return this.invalidationService.matchesAdditionalWatchPaths(filePath);
|
|
247
|
+
}
|
|
227
248
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
249
|
+
/**
|
|
250
|
+
* Checks if a file is handled by a processor.
|
|
251
|
+
* Processors that declare asset capabilities own those file types.
|
|
252
|
+
* Processors without capabilities fall back to checking watch extensions.
|
|
253
|
+
*/
|
|
254
|
+
private isHandledByProcessor(filePath: string): boolean {
|
|
255
|
+
return this.invalidationService.isProcessorOwnedAsset(filePath);
|
|
234
256
|
}
|
|
235
257
|
|
|
236
258
|
/**
|
|
@@ -239,9 +261,12 @@ export class ProjectWatcher {
|
|
|
239
261
|
*
|
|
240
262
|
* @param {string} path - Path of the changed directory
|
|
241
263
|
*/
|
|
242
|
-
triggerRouterRefresh(
|
|
243
|
-
const
|
|
244
|
-
|
|
264
|
+
triggerRouterRefresh(changedPath: string) {
|
|
265
|
+
const resolvedPath = path.resolve(changedPath);
|
|
266
|
+
const isPageDir =
|
|
267
|
+
resolvedPath.startsWith(this.appConfig.absolutePaths.pagesDir) && path.extname(resolvedPath) === '';
|
|
268
|
+
|
|
269
|
+
if (isPageDir || this.isRouteSourceFile(resolvedPath)) {
|
|
245
270
|
this.refreshRouterRoutesCallback();
|
|
246
271
|
}
|
|
247
272
|
}
|
|
@@ -258,28 +283,15 @@ export class ProjectWatcher {
|
|
|
258
283
|
appLogger.error(`Watcher error: ${error}`);
|
|
259
284
|
}
|
|
260
285
|
|
|
261
|
-
/**
|
|
262
|
-
* Processes file changes for specific file extensions.
|
|
263
|
-
* Used by processors to handle their specific file types.
|
|
264
|
-
*
|
|
265
|
-
* @private
|
|
266
|
-
* @param {string} path - Path of the changed file
|
|
267
|
-
* @param {string[]} extensions - File extensions to process
|
|
268
|
-
* @param {(ctx: ProcessorWatchContext) => void} handler - Handler function for the file change
|
|
269
|
-
*/
|
|
270
|
-
private shouldProcess(path: string, extensions: string[], handler: (ctx: ProcessorWatchContext) => void) {
|
|
271
|
-
if (!extensions.length || extensions.some((ext) => path.endsWith(ext))) {
|
|
272
|
-
handler({ path, bridge: this.bridge });
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
|
|
276
286
|
/**
|
|
277
287
|
* Creates and configures the file system watcher.
|
|
278
288
|
* This sets up:
|
|
279
|
-
* 1.
|
|
280
|
-
* 2.
|
|
281
|
-
* 3.
|
|
282
|
-
*
|
|
289
|
+
* 1. Page file watching
|
|
290
|
+
* 2. Directory watching
|
|
291
|
+
* 3. Error handling
|
|
292
|
+
*
|
|
293
|
+
* Processor notifications are dispatched inside handleFileChange, ensuring
|
|
294
|
+
* a single unified event pipeline with no parallel chokidar bindings.
|
|
283
295
|
*
|
|
284
296
|
* Uses chokidar's built-in debouncing through `awaitWriteFinish` to handle
|
|
285
297
|
* rapid file changes efficiently.
|
|
@@ -293,6 +305,14 @@ export class ProjectWatcher {
|
|
|
293
305
|
processorPaths.push(...watchConfig.paths);
|
|
294
306
|
}
|
|
295
307
|
|
|
308
|
+
if (fileSystem.exists(this.appConfig.absolutePaths.includesDir)) {
|
|
309
|
+
processorPaths.push(this.appConfig.absolutePaths.includesDir);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
if (fileSystem.exists(this.appConfig.absolutePaths.srcDir)) {
|
|
313
|
+
processorPaths.push(this.appConfig.absolutePaths.srcDir);
|
|
314
|
+
}
|
|
315
|
+
|
|
296
316
|
if (fileSystem.exists(this.appConfig.absolutePaths.pagesDir)) {
|
|
297
317
|
processorPaths.push(this.appConfig.absolutePaths.pagesDir);
|
|
298
318
|
}
|
|
@@ -315,30 +335,29 @@ export class ProjectWatcher {
|
|
|
315
335
|
});
|
|
316
336
|
}
|
|
317
337
|
|
|
318
|
-
for (const processor of this.appConfig.processors.values()) {
|
|
319
|
-
const watchConfig = processor.getWatchConfig();
|
|
320
|
-
if (!watchConfig) continue;
|
|
321
|
-
const { extensions = [], onCreate, onChange, onDelete, onError } = watchConfig;
|
|
322
|
-
|
|
323
|
-
if (onCreate) this.watcher.on('add', (path) => this.shouldProcess(path, extensions, onCreate));
|
|
324
|
-
if (onChange) this.watcher.on('change', (path) => this.shouldProcess(path, extensions, onChange));
|
|
325
|
-
if (onDelete) this.watcher.on('unlink', (path) => this.shouldProcess(path, extensions, onDelete));
|
|
326
|
-
if (onError) this.watcher.on('error', onError as (error: unknown) => void);
|
|
327
|
-
}
|
|
328
|
-
|
|
329
338
|
this.watcher.add(this.appConfig.absolutePaths.srcDir);
|
|
330
339
|
|
|
331
340
|
this.watcher
|
|
332
|
-
.on('change', (
|
|
333
|
-
.on('add', (
|
|
334
|
-
this.handleFileChange(
|
|
335
|
-
this.triggerRouterRefresh(
|
|
341
|
+
.on('change', (p) => this.enqueueChange(() => this.handleFileChange(p, 'change')))
|
|
342
|
+
.on('add', (p) => {
|
|
343
|
+
this.enqueueChange(() => this.handleFileChange(p, 'add'));
|
|
344
|
+
this.triggerRouterRefresh(p);
|
|
345
|
+
})
|
|
346
|
+
.on('addDir', (p) => this.triggerRouterRefresh(p))
|
|
347
|
+
.on('unlink', (p) => {
|
|
348
|
+
this.enqueueChange(() => this.handleFileChange(p, 'unlink'));
|
|
349
|
+
this.triggerRouterRefresh(p);
|
|
336
350
|
})
|
|
337
|
-
.on('
|
|
338
|
-
.on('unlink', (path) => this.triggerRouterRefresh(path))
|
|
339
|
-
.on('unlinkDir', (path) => this.triggerRouterRefresh(path))
|
|
351
|
+
.on('unlinkDir', (p) => this.triggerRouterRefresh(p))
|
|
340
352
|
.on('error', (error) => this.handleError(error));
|
|
341
353
|
|
|
354
|
+
for (const processor of this.appConfig.processors.values()) {
|
|
355
|
+
const watchConfig = processor.getWatchConfig();
|
|
356
|
+
if (watchConfig?.onError) {
|
|
357
|
+
this.watcher.on('error', watchConfig.onError as (error: unknown) => void);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
342
361
|
return this.watcher;
|
|
343
362
|
}
|
|
344
363
|
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to `@ecopages/core` are documented here.
|
|
4
|
-
|
|
5
|
-
> **Note:** Changelog tracking begins at version `0.2.0`. Changes prior to this release are not recorded here but are available in the git history.
|
|
6
|
-
|
|
7
|
-
## [UNRELEASED] — TBD
|
|
8
|
-
|
|
9
|
-
### Features
|
|
10
|
-
|
|
11
|
-
#### Node.js Runtime Support
|
|
12
|
-
|
|
13
|
-
- **Node server adapter** — Full HTTP server adapter for Node.js via `packages/core/src/adapters/node/`, including request bridging, route handling, static content serving, and graceful shutdown.
|
|
14
|
-
- **Node static build pipeline** — Static-site build and preview server for Node.js runtime (`ab22f167`, `a47b4da3`, `435dc250`).
|
|
15
|
-
- **Node API handler pipeline** — `define-api-handler` now works cross-runtime; Node adapter wires API handler execution end-to-end (`73e57d87`, `f46aa528`).
|
|
16
|
-
- **Node client bridge** — `NodeClientBridge` with SSE-based HMR stream and heartbeat mechanism for connection health (`3361445f`).
|
|
17
|
-
- **Node HMR manager** — `NodeHmrManager` that mirrors Bun HMR capabilities on the Node runtime.
|
|
18
|
-
- **`createApp` universal factory** — Top-level `createApp` export that selects the correct adapter (Bun or Node) at runtime (`ce691bdf`, `2f1b1109`).
|
|
19
|
-
|
|
20
|
-
#### Build System
|
|
21
|
-
|
|
22
|
-
- **`EsbuildBuildAdapter`** — A new build backend backed by esbuild, replacing the Bun-only transpilation path. Includes module resolution routing, plugin registration, and transpilation defaults (`f503e86e`, `94c37d38`, `e4e124a1`).
|
|
23
|
-
- **Build dependency graph** — `BuildDependencyGraph` interface for tracking entrypoints and their asset dependencies, enabling more accurate HMR invalidation (`e7653c9b`).
|
|
24
|
-
- **Build adapter abstraction** — `build-adapter.ts` and `build-types.ts` decouple build and plugin contracts from Bun-specific types (`11b03bcc`).
|
|
25
|
-
|
|
26
|
-
#### Rendering & Orchestration
|
|
27
|
-
|
|
28
|
-
- **Boundary rendering policy** — Cross-integration component boundaries are now explicitly enforced (`ec1e4d66`).
|
|
29
|
-
- **Full orchestration mode** — Legacy rendering mode branches removed; the engine always runs in unified orchestration mode (`f652fa0a`).
|
|
30
|
-
- **Extracted render services** — The render pipeline is decomposed into focused services:
|
|
31
|
-
- `RenderExecutionService`
|
|
32
|
-
- `HtmlPostProcessingService`
|
|
33
|
-
- `RenderPreparationService`
|
|
34
|
-
- `MarkerGraphResolver`
|
|
35
|
-
- `FileRouteMiddlewarePipeline`
|
|
36
|
-
- `PageRequestCacheCoordinator`
|
|
37
|
-
- `PageModuleImportService`
|
|
38
|
-
- **Component render context** — New `ComponentRenderContext` consolidates component-level state during rendering (`eco/component-render-context.ts`).
|
|
39
|
-
- **Worker-tools HTML rewriter fallback** — `html-transformer` adopts `@worker-tools/html-rewriter` as a fallback for non-Bun environments (`54056d4f`).
|
|
40
|
-
|
|
41
|
-
#### Dependency & Injection
|
|
42
|
-
|
|
43
|
-
- **Global injector map** — `GlobalInjectorMap` and `LazyInjectorMap` provide structured, testable dependency injection for global and lazy assets (`c3a25072`).
|
|
44
|
-
- **Lazy dependency resolution** — SSR lazy script resolution now uses dedicated utility functions for dependency entry attributes and content generation (`71ce2f4f`).
|
|
45
|
-
- **Dependency entry type refactor** — Unified types for script and stylesheet dependency entries, with improved error messages (`1e02dba6`).
|
|
46
|
-
- **Module dependencies** — New `module-dependencies.ts` tracks explicit module-level asset relationships.
|
|
47
|
-
- **Eco utils extraction** — Shared utilities moved to `eco.utils.ts` to remove runtime metadata fallbacks (`bdc60d50`).
|
|
48
|
-
|
|
49
|
-
#### API Handlers
|
|
50
|
-
|
|
51
|
-
- **Unified typed API handler context** — `defineApiHandler` now exposes a fully typed, runtime-agnostic context object. The Bun-specific adapter is slimmed down to a thin wrapper (`2f1b1109`, `08e194b4`).
|
|
52
|
-
- **Portable root runtime API** — Core exposes a portable API surface that avoids runtime escape hatches (`ce691bdf`, `1ec42c02`).
|
|
53
|
-
|
|
54
|
-
### Refactoring
|
|
55
|
-
|
|
56
|
-
- **Bun adapter isolation** — Bun-specific types (`serve` options, file reads, env access, argv/hash helpers) are routed through dedicated helpers, making the remaining adapter code portable (`73668f52`, `0c90ced1`, `73fb904a`, `5eb0957b`, `4bdc74a9`, `e9ce163c`, `22f9de4a`, `f7b3d95e`).
|
|
57
|
-
- **Shared server adapter** — Common server adapter logic extracted to `adapters/shared/application-adapter.ts` and `adapters/shared/server-adapter.ts`, shared between Bun and Node adapters (`5a872eda`).
|
|
58
|
-
- **Route assets isolation** — Route-level assets are now isolated per-request, hardening dependency processing (`3fd76a12`).
|
|
59
|
-
- **Shared matcher error constants** — Matcher error strings are now constants shared across test and source (`ff4db106`).
|
|
60
|
-
- **App registration & fetch pipeline** — App creation and request handling consolidated into a single unified pipeline (`86e20a3d`).
|
|
61
|
-
- **Adapter escape hatch surface** trimmed — Public adapter API is narrowed to reduce surface area (`1ec42c02`).
|
|
62
|
-
|
|
63
|
-
### Bug Fixes
|
|
64
|
-
|
|
65
|
-
- Fixed invariant checks for route paths with improved error messaging in `AbstractApplicationAdapter` (`9c2a6242`).
|
|
66
|
-
- Fixed dependency import name extraction in `extractEcopagesVirtualImports` (`39bbc472`).
|
|
67
|
-
- Removed an invalid npm export entry that pointed to a non-existent `utils/ecopages-url-resolver` declaration target.
|
|
68
|
-
- Kept source module HMR active when stylesheet processors also watch TSX and JSX files for Tailwind-driven CSS rebuilds.
|
|
69
|
-
- Triggered HMR current-page refreshes instead of fallback reload suppression for processor-watched TSX and JSX changes that are not client entrypoints.
|
|
70
|
-
|
|
71
|
-
### Tests
|
|
72
|
-
|
|
73
|
-
- Added node static content server test coverage (`435dc250`).
|
|
74
|
-
- Strengthened HTML transformer mode matrix coverage (`286c1253`).
|
|
75
|
-
- Aligned integration and dependency processing tests to new orchestration model (`7cc73316`).
|
|
76
|
-
- Added `EsbuildBuildAdapter` test suite with 500+ lines (`build-adapter.test.ts`).
|
|
77
|
-
- Added `file-route-middleware-pipeline` tests.
|
|
78
|
-
|
|
79
|
-
### Documentation
|
|
80
|
-
|
|
81
|
-
- Updated rendering graph documentation to cover extracted rendering services (`8bfcfd21`).
|
|
82
|
-
- Refreshed server handler and module dependency guidance (`3494f44d`).
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Migration Notes
|
|
87
|
-
|
|
88
|
-
- **`createApp`** is now the recommended entrypoint (previously `EcopagesApp`). Import from `@ecopages/core`.
|
|
89
|
-
- **`defineApiHandler`** signature is unchanged but the handler context object now carries explicit runtime-agnostic types. No breaking changes for existing handlers.
|
|
90
|
-
- Bun adapter still works as before; the new Node adapter is additive.
|
|
91
|
-
- The old explicit `renderingMode` config option has been removed — full orchestration is always active.
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This file defines the abstract class for application adapters in EcoPages.
|
|
3
|
-
* It provides a common interface for different runtimes (e.g., Node.js, Deno) to implement.
|
|
4
|
-
* The class includes methods for handling HTTP requests and managing application state.
|
|
5
|
-
* It also includes a method for parsing command-line arguments.
|
|
6
|
-
*
|
|
7
|
-
* @module ApplicationAdapter
|
|
8
|
-
*/
|
|
9
|
-
import type { EcoPagesAppConfig } from '../../internal-types.js';
|
|
10
|
-
import type { ApiHandler, ApiHandlerContext, ErrorHandler, Middleware, RouteOptions, StaticRoute, ViewLoader } from '../../public-types.js';
|
|
11
|
-
import { type ReturnParseCliArgs } from '../../utils/parse-cli-args.js';
|
|
12
|
-
/**
|
|
13
|
-
* Configuration options for application adapters
|
|
14
|
-
*/
|
|
15
|
-
export interface ApplicationAdapterOptions {
|
|
16
|
-
appConfig: EcoPagesAppConfig;
|
|
17
|
-
serverOptions?: Record<string, any>;
|
|
18
|
-
/**
|
|
19
|
-
* Options for clearing the output directory before starting the server
|
|
20
|
-
* @default false
|
|
21
|
-
*/
|
|
22
|
-
clearOutput?: boolean;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Common interface for application adapters
|
|
26
|
-
*/
|
|
27
|
-
export interface ApplicationAdapter<T = any> {
|
|
28
|
-
start(): Promise<T | void>;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Handler function type for route handlers
|
|
32
|
-
*/
|
|
33
|
-
export type RouteHandler<TRequest extends Request = Request, TServer = any, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>> = (context: TContext) => Promise<Response> | Response;
|
|
34
|
-
export type RouteGroupDefinition<TRequest extends Request = Request, TServer = any> = {
|
|
35
|
-
prefix: string;
|
|
36
|
-
middleware?: readonly Middleware<TRequest, TServer, any>[];
|
|
37
|
-
routes: readonly ApiHandler<string, TRequest, TServer>[];
|
|
38
|
-
};
|
|
39
|
-
/**
|
|
40
|
-
* Abstract base class for application adapters across different runtimes
|
|
41
|
-
*/
|
|
42
|
-
export declare abstract class AbstractApplicationAdapter<TOptions extends ApplicationAdapterOptions = ApplicationAdapterOptions, TServer = any, TRequest extends Request = any> implements ApplicationAdapter<TServer> {
|
|
43
|
-
protected appConfig: EcoPagesAppConfig;
|
|
44
|
-
protected serverOptions: Record<string, any>;
|
|
45
|
-
protected cliArgs: ReturnParseCliArgs;
|
|
46
|
-
protected apiHandlers: ApiHandler[];
|
|
47
|
-
protected staticRoutes: StaticRoute[];
|
|
48
|
-
protected errorHandler?: ErrorHandler;
|
|
49
|
-
constructor(options: TOptions);
|
|
50
|
-
private clearDistFolder;
|
|
51
|
-
/**
|
|
52
|
-
* Register a GET route handler.
|
|
53
|
-
*
|
|
54
|
-
* Use verb methods for inline route definitions.
|
|
55
|
-
* For dynamic HTTP method registration, use `route(...)`.
|
|
56
|
-
*/
|
|
57
|
-
abstract get<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
|
|
58
|
-
/**
|
|
59
|
-
* Register a POST route handler
|
|
60
|
-
*/
|
|
61
|
-
abstract post<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
|
|
62
|
-
/**
|
|
63
|
-
* Register a PUT route handler
|
|
64
|
-
*/
|
|
65
|
-
abstract put<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
|
|
66
|
-
/**
|
|
67
|
-
* Register a DELETE route handler
|
|
68
|
-
*/
|
|
69
|
-
abstract delete<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
|
|
70
|
-
/**
|
|
71
|
-
* Register a PATCH route handler
|
|
72
|
-
*/
|
|
73
|
-
abstract patch<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
|
|
74
|
-
/**
|
|
75
|
-
* Register an OPTIONS route handler
|
|
76
|
-
*/
|
|
77
|
-
abstract options<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
|
|
78
|
-
/**
|
|
79
|
-
* Register a HEAD route handler
|
|
80
|
-
*/
|
|
81
|
-
abstract head<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
|
|
82
|
-
/**
|
|
83
|
-
* Register a route with an explicit HTTP method.
|
|
84
|
-
*
|
|
85
|
-
* This is useful when the method is determined programmatically, or when
|
|
86
|
-
* registering a pre-built route declaration object by forwarding its
|
|
87
|
-
* `path`, `method`, and `handler` fields.
|
|
88
|
-
*/
|
|
89
|
-
abstract route<P extends string>(path: P, method: ApiHandler['method'], handler: RouteHandler<TRequest, TServer>, options?: RouteOptions<TRequest, TServer>): this;
|
|
90
|
-
/**
|
|
91
|
-
* Register a pre-built API handler declaration.
|
|
92
|
-
*/
|
|
93
|
-
abstract add(handler: ApiHandler<string, TRequest, TServer>): this;
|
|
94
|
-
/**
|
|
95
|
-
* Internal method to add route handlers to the API handlers array
|
|
96
|
-
*/
|
|
97
|
-
protected addRouteHandler<P extends string, TSpecRequest extends TRequest = TRequest, TSpecServer extends TServer = TServer, TContext extends ApiHandlerContext<TSpecRequest, TSpecServer> = ApiHandlerContext<TSpecRequest, TSpecServer>>(path: P, method: ApiHandler['method'], handler: RouteHandler<TSpecRequest, TSpecServer, TContext>, middleware?: Middleware<TSpecRequest, TSpecServer, TContext>[], schema?: ApiHandler['schema']): this;
|
|
98
|
-
/**
|
|
99
|
-
* Create a route group with shared prefix and middleware.
|
|
100
|
-
* Routes defined within the group inherit the prefix and middleware.
|
|
101
|
-
*
|
|
102
|
-
* Each adapter implements this with its own builder type to support
|
|
103
|
-
* runtime-specific features (e.g., Bun's path parameter inference).
|
|
104
|
-
* Implementations may also support passing a pre-built group object.
|
|
105
|
-
*
|
|
106
|
-
* @param prefix - URL prefix for all routes in the group (e.g., '/api/v1')
|
|
107
|
-
* @param callback - Function that receives a builder to define routes
|
|
108
|
-
* @param options - Optional group-level middleware
|
|
109
|
-
*/
|
|
110
|
-
abstract group(prefix: string, callback: (builder: unknown) => void, options?: {
|
|
111
|
-
middleware?: readonly Middleware<TRequest, TServer, any>[];
|
|
112
|
-
}): this;
|
|
113
|
-
abstract group(group: RouteGroupDefinition<TRequest, TServer>): this;
|
|
114
|
-
/**
|
|
115
|
-
* Get all registered API handlers
|
|
116
|
-
*/
|
|
117
|
-
getApiHandlers(): ApiHandler[];
|
|
118
|
-
/**
|
|
119
|
-
* Register a view for static generation at build time.
|
|
120
|
-
* The view must have staticPaths defined for dynamic routes.
|
|
121
|
-
*
|
|
122
|
-
* Uses a loader function to enable HMR in development.
|
|
123
|
-
*
|
|
124
|
-
* @param path - URL path pattern (e.g., '/posts/:slug')
|
|
125
|
-
* @param loader - A function that dynamically imports the eco.page view module
|
|
126
|
-
* @example
|
|
127
|
-
* ```typescript
|
|
128
|
-
* app.static('/login', () => import('./src/views/login.kita'))
|
|
129
|
-
* app.static('/posts/:slug', () => import('./src/views/post-view.kita'))
|
|
130
|
-
* ```
|
|
131
|
-
*/
|
|
132
|
-
static<P>(path: string, loader: ViewLoader<P>): this;
|
|
133
|
-
/**
|
|
134
|
-
* Get all registered static routes
|
|
135
|
-
*/
|
|
136
|
-
getStaticRoutes(): StaticRoute[];
|
|
137
|
-
/**
|
|
138
|
-
* Register a global error handler for all routes.
|
|
139
|
-
* Useful for logging, monitoring integration, and custom error formatting.
|
|
140
|
-
*
|
|
141
|
-
* @example
|
|
142
|
-
* ```typescript
|
|
143
|
-
* app.onError(async (error, ctx) => {
|
|
144
|
-
* logger.error(error);
|
|
145
|
-
* return ctx.response.status(500).json({ error: 'Something went wrong' });
|
|
146
|
-
* });
|
|
147
|
-
* ```
|
|
148
|
-
*/
|
|
149
|
-
onError(handler: ErrorHandler<TRequest, TServer>): this;
|
|
150
|
-
/**
|
|
151
|
-
* Get the registered error handler
|
|
152
|
-
*/
|
|
153
|
-
getErrorHandler(): ErrorHandler | undefined;
|
|
154
|
-
/**
|
|
155
|
-
* Initialize the server adapter based on the runtime
|
|
156
|
-
*/
|
|
157
|
-
protected abstract initializeServerAdapter(): Promise<any>;
|
|
158
|
-
/**
|
|
159
|
-
* Start the application server
|
|
160
|
-
*/
|
|
161
|
-
abstract start(): Promise<TServer | void>;
|
|
162
|
-
/**
|
|
163
|
-
* Handles a standard Web request without requiring a bound network server.
|
|
164
|
-
* This is the primary interoperability surface for embedding Ecopages inside
|
|
165
|
-
* other runtimes and frameworks.
|
|
166
|
-
*/
|
|
167
|
-
abstract fetch(request: TRequest): Promise<Response>;
|
|
168
|
-
}
|