@ecopages/core 0.2.0-alpha.2 → 0.2.0-alpha.21
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/CHANGELOG.md +26 -64
- package/README.md +212 -14
- package/package.json +116 -66
- package/src/adapters/README.md +39 -0
- package/src/adapters/abstract/application-adapter.d.ts +28 -2
- package/src/adapters/abstract/application-adapter.js +14 -2
- package/src/adapters/abstract/router-adapter.d.ts +1 -1
- package/src/adapters/abstract/server-adapter.d.ts +2 -2
- package/src/adapters/bun/client-bridge.d.ts +1 -1
- package/src/adapters/bun/create-app.d.ts +4 -12
- package/src/adapters/bun/create-app.js +4 -5
- package/src/adapters/bun/hmr-manager.d.ts +80 -21
- package/src/adapters/bun/hmr-manager.js +168 -62
- package/src/adapters/bun/index.d.ts +2 -3
- package/src/adapters/bun/index.js +3 -3
- package/src/adapters/bun/server-adapter.d.ts +5 -5
- package/src/adapters/bun/server-adapter.js +40 -34
- package/src/adapters/bun/server-lifecycle.d.ts +28 -17
- package/src/adapters/bun/server-lifecycle.js +34 -62
- package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
- package/src/{create-app.js → adapters/create-app.js} +4 -4
- package/src/adapters/index.d.ts +2 -6
- package/src/adapters/index.js +2 -8
- package/src/adapters/node/create-app.d.ts +6 -9
- package/src/adapters/node/create-app.js +12 -6
- package/src/adapters/node/node-client-bridge.d.ts +1 -1
- package/src/adapters/node/node-hmr-manager.d.ts +89 -18
- package/src/adapters/node/node-hmr-manager.js +185 -95
- package/src/adapters/node/server-adapter.d.ts +6 -35
- package/src/adapters/node/server-adapter.js +44 -105
- package/src/adapters/node/static-content-server.d.ts +37 -1
- package/src/adapters/node/static-content-server.js +29 -1
- package/src/adapters/shared/application-adapter.d.ts +1 -1
- package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +2 -2
- package/src/adapters/shared/explicit-static-route-matcher.js +4 -1
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +1 -1
- package/src/adapters/shared/file-route-middleware-pipeline.js +1 -0
- package/src/adapters/shared/fs-server-response-factory.d.ts +2 -2
- package/src/adapters/shared/fs-server-response-factory.js +1 -1
- package/src/adapters/shared/fs-server-response-matcher.d.ts +8 -12
- package/src/adapters/shared/fs-server-response-matcher.js +10 -18
- package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
- package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
- package/src/adapters/shared/hmr-html-response.d.ts +22 -0
- package/src/adapters/shared/hmr-html-response.js +32 -0
- package/src/adapters/shared/render-context.d.ts +2 -1
- package/src/adapters/shared/render-context.js +6 -3
- package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
- package/src/adapters/shared/runtime-bootstrap.js +43 -0
- package/src/adapters/shared/server-adapter.d.ts +13 -3
- package/src/adapters/shared/server-adapter.js +42 -5
- package/src/adapters/shared/server-route-handler.d.ts +4 -4
- package/src/adapters/shared/server-route-handler.js +6 -15
- package/src/adapters/shared/server-static-builder.d.ts +38 -6
- package/src/adapters/shared/server-static-builder.js +64 -10
- package/src/build/README.md +107 -0
- package/src/build/build-adapter.d.ts +168 -3
- package/src/build/build-adapter.js +604 -16
- package/src/build/build-manifest.d.ts +27 -0
- package/src/build/build-manifest.js +30 -0
- package/src/build/dev-build-coordinator.d.ts +72 -0
- package/src/build/dev-build-coordinator.js +154 -0
- package/src/build/esbuild-build-adapter.d.ts +15 -6
- package/src/build/esbuild-build-adapter.js +189 -74
- package/src/build/runtime-build-executor.d.ts +14 -0
- package/src/build/runtime-build-executor.js +22 -0
- package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
- package/src/build/runtime-specifier-alias-plugin.js +35 -0
- package/src/build/runtime-specifier-aliases.d.ts +5 -0
- package/src/build/runtime-specifier-aliases.js +95 -0
- package/src/config/README.md +36 -0
- package/src/config/config-builder.d.ts +52 -27
- package/src/config/config-builder.js +260 -49
- package/src/{constants.d.ts → config/constants.d.ts} +13 -0
- package/src/{constants.js → config/constants.js} +4 -0
- package/src/declarations.d.ts +19 -14
- package/src/dev/sc-server.d.ts +1 -1
- package/src/dev/sc-server.js +1 -1
- package/src/eco/README.md +70 -16
- package/src/eco/eco.browser.d.ts +2 -0
- package/src/eco/eco.browser.js +83 -0
- package/src/eco/eco.js +32 -57
- package/src/eco/eco.types.d.ts +12 -4
- package/src/eco/eco.utils.d.ts +1 -40
- package/src/eco/eco.utils.js +5 -35
- package/src/eco/global-injector-map.d.ts +1 -1
- package/src/eco/lazy-injector-map.d.ts +1 -1
- package/src/hmr/README.md +26 -0
- package/src/hmr/client/hmr-runtime.d.ts +1 -6
- package/src/hmr/client/hmr-runtime.js +30 -7
- package/src/hmr/hmr-strategy.d.ts +16 -13
- package/src/hmr/hmr-strategy.js +22 -7
- package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
- package/src/hmr/hmr.postcss.test.e2e.js +31 -0
- package/src/hmr/hmr.test.e2e.js +26 -33
- package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
- package/src/hmr/strategies/default-hmr-strategy.js +1 -1
- package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -43
- package/src/hmr/strategies/js-hmr-strategy.js +72 -73
- package/src/index.browser.d.ts +2 -2
- package/src/index.browser.js +1 -1
- package/src/index.d.ts +4 -3
- package/src/index.js +16 -5
- package/src/integrations/ghtml/ghtml-renderer.d.ts +7 -2
- package/src/integrations/ghtml/ghtml-renderer.js +33 -30
- package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
- package/src/integrations/ghtml/ghtml.constants.js +4 -0
- package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
- package/src/integrations/ghtml/ghtml.plugin.js +3 -4
- package/src/plugins/README.md +35 -0
- package/src/plugins/alias-resolver-plugin.js +17 -3
- package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
- package/src/plugins/eco-component-meta-plugin.js +27 -21
- package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
- package/src/plugins/foreign-jsx-override-plugin.js +35 -0
- package/src/plugins/integration-plugin.d.ts +145 -28
- package/src/plugins/integration-plugin.js +109 -13
- package/src/plugins/processor.d.ts +15 -2
- package/src/plugins/processor.js +16 -2
- package/src/plugins/runtime-capability.d.ts +9 -0
- package/src/plugins/source-transform.d.ts +46 -0
- package/src/plugins/source-transform.js +71 -0
- package/src/route-renderer/GRAPH.md +64 -98
- package/src/route-renderer/README.md +67 -46
- package/src/route-renderer/orchestration/boundary-planning.service.d.ts +25 -0
- package/src/route-renderer/orchestration/boundary-planning.service.js +97 -0
- package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
- package/src/route-renderer/orchestration/component-render-context.js +147 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +554 -0
- package/src/route-renderer/orchestration/integration-renderer.js +957 -0
- package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +89 -0
- package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
- package/src/route-renderer/orchestration/render-execution.service.d.ts +43 -0
- package/src/route-renderer/orchestration/render-execution.service.js +106 -0
- package/src/{eco/eco.utils.ts → route-renderer/orchestration/render-output.utils.d.ts} +10 -53
- package/src/route-renderer/orchestration/render-output.utils.js +65 -0
- package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +18 -10
- package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +115 -17
- package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +50 -0
- package/src/route-renderer/orchestration/route-shell-composer.service.js +81 -0
- package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
- package/src/route-renderer/orchestration/template-serialization.js +45 -0
- package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
- package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +28 -12
- package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
- package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
- package/src/route-renderer/route-renderer.d.ts +45 -4
- package/src/route-renderer/route-renderer.js +38 -3
- package/src/router/README.md +97 -0
- package/src/router/client/link-intent.d.ts +53 -0
- package/src/router/client/link-intent.js +34 -0
- package/src/router/client/link-intent.test.browser.d.ts +1 -0
- package/src/router/client/link-intent.test.browser.js +43 -0
- package/src/router/client/navigation-coordinator.d.ts +149 -0
- package/src/router/client/navigation-coordinator.js +215 -0
- package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
- package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +14 -8
- package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
- package/src/router/{fs-router.js → server/fs-router.js} +1 -1
- package/src/services/README.md +29 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +91 -10
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +2 -1
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
- package/src/services/assets/asset-processing-service/index.d.ts +5 -0
- package/src/services/assets/asset-processing-service/index.js +5 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +9 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +5 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +15 -23
- package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
- package/src/services/assets/asset-processing-service/processors/index.js +5 -0
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +16 -4
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +6 -5
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +1 -1
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
- package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +5 -2
- package/src/services/assets/browser-bundle.service.d.ts +32 -0
- package/src/services/assets/browser-bundle.service.js +33 -0
- package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
- package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
- package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
- package/src/services/html/html-rewriter-provider.service.js +68 -0
- package/src/services/html/html-transformer.service.d.ts +77 -0
- package/src/services/html/html-transformer.service.js +215 -0
- package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
- package/src/services/invalidation/development-invalidation.service.js +190 -0
- package/src/services/module-loading/app-module-loader.service.d.ts +28 -0
- package/src/services/module-loading/app-module-loader.service.js +35 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +109 -0
- package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
- package/src/services/module-loading/host-module-loader-registry.js +15 -0
- package/src/services/module-loading/module-loading-types.d.ts +2 -0
- package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
- package/src/services/module-loading/node-bootstrap-plugin.js +204 -0
- package/src/services/module-loading/page-module-import.service.d.ts +76 -0
- package/src/services/module-loading/page-module-import.service.js +173 -0
- package/src/services/module-loading/server-module-transpiler.service.d.ts +72 -0
- package/src/services/module-loading/server-module-transpiler.service.js +64 -0
- package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
- package/src/services/runtime-state/dev-graph.service.js +162 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
- package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
- package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
- package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
- package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
- package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
- package/src/static-site-generator/README.md +26 -0
- package/src/static-site-generator/static-site-generator.d.ts +50 -3
- package/src/static-site-generator/static-site-generator.js +71 -5
- package/src/{internal-types.d.ts → types/internal-types.d.ts} +53 -22
- package/src/types/internal-types.js +0 -0
- package/src/{public-types.d.ts → types/public-types.d.ts} +146 -21
- package/src/types/public-types.js +0 -0
- package/src/utils/html-escaping.d.ts +7 -0
- package/src/utils/html-escaping.js +6 -0
- package/src/utils/locals-utils.d.ts +1 -1
- package/src/utils/parse-cli-args.d.ts +4 -1
- package/src/utils/parse-cli-args.js +16 -1
- package/src/utils/resolve-work-dir.d.ts +11 -0
- package/src/utils/resolve-work-dir.js +31 -0
- package/src/watchers/project-watcher.d.ts +40 -24
- package/src/watchers/project-watcher.js +129 -92
- package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
- package/src/watchers/project-watcher.test-helpers.js +1 -0
- package/src/adapters/abstract/application-adapter.ts +0 -337
- package/src/adapters/abstract/router-adapter.ts +0 -30
- package/src/adapters/abstract/server-adapter.ts +0 -79
- package/src/adapters/bun/client-bridge.ts +0 -62
- package/src/adapters/bun/create-app.ts +0 -189
- package/src/adapters/bun/define-api-handler.d.ts +0 -61
- package/src/adapters/bun/define-api-handler.ts +0 -114
- package/src/adapters/bun/hmr-manager.ts +0 -281
- package/src/adapters/bun/index.ts +0 -3
- package/src/adapters/bun/server-adapter.ts +0 -492
- package/src/adapters/bun/server-lifecycle.ts +0 -154
- package/src/adapters/index.ts +0 -6
- package/src/adapters/node/create-app.ts +0 -179
- package/src/adapters/node/index.d.ts +0 -4
- package/src/adapters/node/index.js +0 -8
- package/src/adapters/node/index.ts +0 -9
- package/src/adapters/node/node-client-bridge.ts +0 -79
- package/src/adapters/node/node-hmr-manager.ts +0 -271
- package/src/adapters/node/server-adapter.ts +0 -561
- package/src/adapters/node/static-content-server.ts +0 -203
- package/src/adapters/shared/api-response.ts +0 -104
- package/src/adapters/shared/application-adapter.ts +0 -199
- package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
- package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
- package/src/adapters/shared/fs-server-response-factory.ts +0 -118
- package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
- package/src/adapters/shared/render-context.ts +0 -105
- package/src/adapters/shared/server-adapter.ts +0 -442
- package/src/adapters/shared/server-route-handler.ts +0 -166
- package/src/adapters/shared/server-static-builder.ts +0 -82
- package/src/build/build-adapter.ts +0 -132
- package/src/build/build-types.ts +0 -83
- package/src/build/esbuild-build-adapter.ts +0 -510
- package/src/config/config-builder.ts +0 -474
- package/src/constants.ts +0 -39
- package/src/create-app.ts +0 -87
- package/src/define-api-handler.js +0 -15
- package/src/define-api-handler.ts +0 -66
- package/src/dev/sc-server.ts +0 -143
- package/src/eco/component-render-context.d.ts +0 -105
- package/src/eco/component-render-context.js +0 -77
- package/src/eco/component-render-context.ts +0 -202
- package/src/eco/eco.ts +0 -221
- package/src/eco/eco.types.ts +0 -202
- package/src/eco/global-injector-map.ts +0 -112
- package/src/eco/lazy-injector-map.ts +0 -120
- package/src/eco/module-dependencies.ts +0 -75
- package/src/errors/http-error.ts +0 -72
- package/src/errors/index.ts +0 -2
- package/src/errors/locals-access-error.ts +0 -7
- package/src/global/app-logger.ts +0 -4
- 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 +0 -121
- package/src/hmr/hmr-strategy.ts +0 -172
- package/src/hmr/hmr.test.e2e.ts +0 -75
- package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
- package/src/hmr/strategies/js-hmr-strategy.ts +0 -308
- package/src/index.browser.ts +0 -3
- package/src/index.ts +0 -5
- package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
- package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
- package/src/internal-types.ts +0 -212
- package/src/plugins/alias-resolver-plugin.ts +0 -45
- package/src/plugins/eco-component-meta-plugin.ts +0 -474
- package/src/plugins/integration-plugin.ts +0 -184
- package/src/plugins/processor.ts +0 -220
- package/src/public-types.ts +0 -1255
- 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-executor.ts +0 -84
- package/src/route-renderer/component-graph.d.ts +0 -42
- package/src/route-renderer/component-graph.js +0 -72
- package/src/route-renderer/component-graph.ts +0 -159
- package/src/route-renderer/component-marker.d.ts +0 -52
- package/src/route-renderer/component-marker.js +0 -46
- package/src/route-renderer/component-marker.ts +0 -117
- package/src/route-renderer/dependency-resolver.ts +0 -596
- 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/integration-renderer.ts +0 -696
- 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/marker-graph-resolver.ts +0 -153
- package/src/route-renderer/page-module-loader.d.ts +0 -61
- package/src/route-renderer/page-module-loader.ts +0 -153
- 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-execution.service.ts +0 -158
- package/src/route-renderer/render-preparation.service.ts +0 -358
- package/src/route-renderer/route-renderer.ts +0 -80
- package/src/router/fs-router-scanner.ts +0 -217
- package/src/router/fs-router.ts +0 -122
- package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
- package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
- package/src/services/asset-processing-service/asset.factory.ts +0 -105
- package/src/services/asset-processing-service/assets.types.ts +0 -112
- 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/index.ts +0 -3
- package/src/services/asset-processing-service/processor.interface.ts +0 -27
- package/src/services/asset-processing-service/processor.registry.ts +0 -18
- package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
- package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
- 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/index.ts +0 -5
- package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
- package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
- package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
- package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
- package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
- package/src/services/cache/cache.types.ts +0 -126
- package/src/services/cache/index.ts +0 -18
- package/src/services/cache/memory-cache-store.ts +0 -130
- package/src/services/cache/page-cache-service.ts +0 -202
- 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.ts +0 -128
- package/src/services/schema-validation-service.ts +0 -204
- package/src/services/validation/standard-schema.types.ts +0 -68
- package/src/static-site-generator/static-site-generator.ts +0 -359
- package/src/utils/css.d.ts +0 -1
- package/src/utils/css.js +0 -7
- package/src/utils/css.ts +0 -5
- package/src/utils/deep-merge.ts +0 -47
- package/src/utils/hash.ts +0 -5
- package/src/utils/html.ts +0 -1
- package/src/utils/invariant.ts +0 -15
- package/src/utils/locals-utils.ts +0 -37
- package/src/utils/parse-cli-args.ts +0 -83
- package/src/utils/path-utils.module.ts +0 -14
- package/src/utils/runtime.ts +0 -44
- package/src/utils/server-utils.module.ts +0 -67
- package/src/watchers/project-watcher.test-helpers.ts +0 -40
- package/src/watchers/project-watcher.ts +0 -306
- /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
- /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
- /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
- /package/src/{public-types.js → services/module-loading/module-loading-types.js} +0 -0
- /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
|
@@ -2,6 +2,7 @@ import path from "node:path";
|
|
|
2
2
|
import chokidar, {} from "chokidar";
|
|
3
3
|
import { fileSystem } from "@ecopages/file-system";
|
|
4
4
|
import { appLogger } from "../global/app-logger.js";
|
|
5
|
+
import { DevelopmentInvalidationService } from "../services/invalidation/development-invalidation.service.js";
|
|
5
6
|
class ProjectWatcher {
|
|
6
7
|
/**
|
|
7
8
|
* Duplicate identical watcher events within this window are ignored.
|
|
@@ -15,13 +16,16 @@ class ProjectWatcher {
|
|
|
15
16
|
refreshRouterRoutesCallback;
|
|
16
17
|
hmrManager;
|
|
17
18
|
bridge;
|
|
19
|
+
invalidationService;
|
|
18
20
|
watcher = null;
|
|
19
21
|
lastHandledChange = /* @__PURE__ */ new Map();
|
|
22
|
+
changeQueue = Promise.resolve();
|
|
20
23
|
constructor({ config, refreshRouterRoutesCallback, hmrManager, bridge }) {
|
|
21
24
|
this.appConfig = config;
|
|
22
25
|
this.refreshRouterRoutesCallback = refreshRouterRoutesCallback;
|
|
23
26
|
this.hmrManager = hmrManager;
|
|
24
27
|
this.bridge = bridge;
|
|
28
|
+
this.invalidationService = new DevelopmentInvalidationService(config);
|
|
25
29
|
this.triggerRouterRefresh = this.triggerRouterRefresh.bind(this);
|
|
26
30
|
this.handleError = this.handleError.bind(this);
|
|
27
31
|
this.handleFileChange = this.handleFileChange.bind(this);
|
|
@@ -41,6 +45,12 @@ class ProjectWatcher {
|
|
|
41
45
|
}
|
|
42
46
|
}
|
|
43
47
|
}
|
|
48
|
+
isRouteSourceFile(filePath) {
|
|
49
|
+
return this.invalidationService.isRouteSourceFile(filePath);
|
|
50
|
+
}
|
|
51
|
+
isIncludeSourceFile(filePath) {
|
|
52
|
+
return this.invalidationService.isIncludeSourceFile(filePath);
|
|
53
|
+
}
|
|
44
54
|
/**
|
|
45
55
|
* Handles public directory file changes by copying only the changed file.
|
|
46
56
|
* @param filePath - Absolute path of the changed file
|
|
@@ -60,19 +70,33 @@ class ProjectWatcher {
|
|
|
60
70
|
this.bridge.reload();
|
|
61
71
|
}
|
|
62
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Serializes file change handling so that concurrent chokidar events are
|
|
75
|
+
* processed one at a time, preventing overlapping builds and race conditions.
|
|
76
|
+
*/
|
|
77
|
+
enqueueChange(task) {
|
|
78
|
+
const queuedTask = this.changeQueue.then(task, task);
|
|
79
|
+
this.changeQueue = queuedTask.catch(() => void 0);
|
|
80
|
+
}
|
|
63
81
|
/**
|
|
64
82
|
* Handles file changes by uncaching modules, refreshing routes, and delegating appropriately.
|
|
65
|
-
* Follows
|
|
66
|
-
* 0. Public directory match?
|
|
67
|
-
* 1. additionalWatchPaths match?
|
|
68
|
-
* 2.
|
|
69
|
-
* 3.
|
|
83
|
+
* Follows 5-rule priority:
|
|
84
|
+
* 0. Public directory match? -> copy file and reload
|
|
85
|
+
* 1. additionalWatchPaths match? -> reload
|
|
86
|
+
* 2. Include template source? -> reload after processor notifications
|
|
87
|
+
* 3. Processor-owned asset? -> processor already handled it via notification, skip HMR
|
|
88
|
+
* 4. Otherwise -> HMR strategies
|
|
89
|
+
*
|
|
90
|
+
* Processors that watch a file extension as a dependency (e.g. PostCSS watching
|
|
91
|
+
* .tsx for Tailwind class scanning) are always notified first, but do not
|
|
92
|
+
* prevent the file from flowing through the normal HMR strategy pipeline.
|
|
70
93
|
*
|
|
71
94
|
* Duplicate identical watcher events for the same file are coalesced within a
|
|
72
95
|
* short window before any of the priority rules run.
|
|
73
96
|
* @param rawPath - Path of the changed file
|
|
97
|
+
* @param event - The type of file system event
|
|
74
98
|
*/
|
|
75
|
-
async handleFileChange(rawPath) {
|
|
99
|
+
async handleFileChange(rawPath, event = "change") {
|
|
76
100
|
const filePath = path.resolve(rawPath);
|
|
77
101
|
const now = Date.now();
|
|
78
102
|
const lastHandledAt = this.lastHandledChange.get(filePath);
|
|
@@ -81,23 +105,33 @@ class ProjectWatcher {
|
|
|
81
105
|
}
|
|
82
106
|
this.lastHandledChange.set(filePath, now);
|
|
83
107
|
try {
|
|
84
|
-
|
|
108
|
+
const plan = this.invalidationService.planFileChange(filePath);
|
|
109
|
+
if (plan.category === "public-asset") {
|
|
85
110
|
await this.handlePublicDirFileChange(filePath);
|
|
86
111
|
return;
|
|
87
112
|
}
|
|
88
113
|
this.uncacheModules();
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
114
|
+
if (plan.invalidateServerModules) {
|
|
115
|
+
this.invalidationService.invalidateServerModules([filePath]);
|
|
116
|
+
}
|
|
117
|
+
if (plan.refreshRoutes) {
|
|
118
|
+
await this.refreshRouterRoutesCallback();
|
|
92
119
|
}
|
|
93
|
-
if (
|
|
120
|
+
if (plan.category === "additional-watch") {
|
|
94
121
|
this.bridge.reload();
|
|
95
122
|
return;
|
|
96
123
|
}
|
|
97
|
-
|
|
124
|
+
await this.notifyProcessors(filePath, event);
|
|
125
|
+
if (plan.category === "include-source") {
|
|
126
|
+
this.bridge.reload();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (plan.processorHandledAsset) {
|
|
98
130
|
return;
|
|
99
131
|
}
|
|
100
|
-
|
|
132
|
+
if (plan.delegateToHmr) {
|
|
133
|
+
await this.hmrManager.handleFileChange(filePath);
|
|
134
|
+
}
|
|
101
135
|
} catch (error) {
|
|
102
136
|
if (error instanceof Error) {
|
|
103
137
|
this.bridge.error(error.message);
|
|
@@ -105,42 +139,56 @@ class ProjectWatcher {
|
|
|
105
139
|
}
|
|
106
140
|
}
|
|
107
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Notifies all processors whose watch config matches the given file extension.
|
|
144
|
+
* This is called before checking processor ownership so that dependency-only
|
|
145
|
+
* processors (e.g. PostCSS watching .tsx for class scanning) receive their
|
|
146
|
+
* notifications regardless of whether they own the file.
|
|
147
|
+
*/
|
|
148
|
+
async notifyProcessors(filePath, event) {
|
|
149
|
+
const ctx = { path: filePath, bridge: this.bridge };
|
|
150
|
+
for (const processor of this.appConfig.processors.values()) {
|
|
151
|
+
const watchConfig = processor.getWatchConfig();
|
|
152
|
+
if (!watchConfig) continue;
|
|
153
|
+
const { extensions = [] } = watchConfig;
|
|
154
|
+
if (extensions.length && !extensions.some((ext) => filePath.endsWith(ext))) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const handler = this.getProcessorHandler(watchConfig, event);
|
|
158
|
+
if (handler) {
|
|
159
|
+
await handler(ctx);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
getProcessorHandler(watchConfig, event) {
|
|
164
|
+
switch (event) {
|
|
165
|
+
case "change":
|
|
166
|
+
return watchConfig.onChange;
|
|
167
|
+
case "add":
|
|
168
|
+
return watchConfig.onCreate;
|
|
169
|
+
case "unlink":
|
|
170
|
+
return watchConfig.onDelete;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
108
173
|
/**
|
|
109
174
|
* Checks if a file is in the public directory.
|
|
110
175
|
*/
|
|
111
176
|
isPublicDirFile(filePath) {
|
|
112
|
-
return
|
|
177
|
+
return this.invalidationService.isPublicDirFile(filePath);
|
|
113
178
|
}
|
|
114
179
|
/**
|
|
115
180
|
* Checks if file path matches any additionalWatchPaths patterns.
|
|
116
181
|
*/
|
|
117
182
|
matchesAdditionalWatchPaths(filePath) {
|
|
118
|
-
|
|
119
|
-
if (!patterns.length) return false;
|
|
120
|
-
for (const pattern of patterns) {
|
|
121
|
-
if (pattern.includes("*")) {
|
|
122
|
-
const ext = pattern.replace(/\*\*?\/\*/, "");
|
|
123
|
-
if (filePath.endsWith(ext)) return true;
|
|
124
|
-
} else {
|
|
125
|
-
if (filePath.endsWith(pattern) || filePath === path.resolve(pattern)) return true;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return false;
|
|
183
|
+
return this.invalidationService.matchesAdditionalWatchPaths(filePath);
|
|
129
184
|
}
|
|
130
185
|
/**
|
|
131
186
|
* Checks if a file is handled by a processor.
|
|
132
|
-
* Processors that declare
|
|
187
|
+
* Processors that declare asset capabilities own those file types.
|
|
188
|
+
* Processors without capabilities fall back to checking watch extensions.
|
|
133
189
|
*/
|
|
134
190
|
isHandledByProcessor(filePath) {
|
|
135
|
-
|
|
136
|
-
const watchConfig = processor.getWatchConfig();
|
|
137
|
-
if (!watchConfig) continue;
|
|
138
|
-
const { extensions = [] } = watchConfig;
|
|
139
|
-
if (extensions.length && extensions.some((ext) => filePath.endsWith(ext))) {
|
|
140
|
-
return true;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return false;
|
|
191
|
+
return this.invalidationService.isProcessorOwnedAsset(filePath);
|
|
144
192
|
}
|
|
145
193
|
/**
|
|
146
194
|
* Triggers router refresh for page directory changes.
|
|
@@ -148,10 +196,11 @@ class ProjectWatcher {
|
|
|
148
196
|
*
|
|
149
197
|
* @param {string} path - Path of the changed directory
|
|
150
198
|
*/
|
|
151
|
-
triggerRouterRefresh(
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
199
|
+
async triggerRouterRefresh(changedPath) {
|
|
200
|
+
const resolvedPath = path.resolve(changedPath);
|
|
201
|
+
const isPageDir = resolvedPath.startsWith(this.appConfig.absolutePaths.pagesDir) && path.extname(resolvedPath) === "";
|
|
202
|
+
if (isPageDir || this.isRouteSourceFile(resolvedPath)) {
|
|
203
|
+
await this.refreshRouterRoutesCallback();
|
|
155
204
|
}
|
|
156
205
|
}
|
|
157
206
|
/**
|
|
@@ -165,71 +214,59 @@ class ProjectWatcher {
|
|
|
165
214
|
}
|
|
166
215
|
appLogger.error(`Watcher error: ${error}`);
|
|
167
216
|
}
|
|
168
|
-
/**
|
|
169
|
-
* Processes file changes for specific file extensions.
|
|
170
|
-
* Used by processors to handle their specific file types.
|
|
171
|
-
*
|
|
172
|
-
* @private
|
|
173
|
-
* @param {string} path - Path of the changed file
|
|
174
|
-
* @param {string[]} extensions - File extensions to process
|
|
175
|
-
* @param {(ctx: ProcessorWatchContext) => void} handler - Handler function for the file change
|
|
176
|
-
*/
|
|
177
|
-
shouldProcess(path2, extensions, handler) {
|
|
178
|
-
if (!extensions.length || extensions.some((ext) => path2.endsWith(ext))) {
|
|
179
|
-
handler({ path: path2, bridge: this.bridge });
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
217
|
/**
|
|
183
218
|
* Creates and configures the file system watcher.
|
|
184
219
|
* This sets up:
|
|
185
|
-
* 1.
|
|
186
|
-
* 2.
|
|
187
|
-
* 3.
|
|
188
|
-
*
|
|
220
|
+
* 1. Page file watching
|
|
221
|
+
* 2. Directory watching
|
|
222
|
+
* 3. Error handling
|
|
223
|
+
*
|
|
224
|
+
* Processor notifications are dispatched inside handleFileChange, ensuring
|
|
225
|
+
* a single unified event pipeline with no parallel chokidar bindings.
|
|
189
226
|
*
|
|
190
227
|
* Uses chokidar's built-in debouncing through `awaitWriteFinish` to handle
|
|
191
228
|
* rapid file changes efficiently.
|
|
192
229
|
*/
|
|
193
230
|
async createWatcherSubscription() {
|
|
194
|
-
if (
|
|
195
|
-
|
|
196
|
-
for (const processor of this.appConfig.processors.values()) {
|
|
197
|
-
const watchConfig = processor.getWatchConfig();
|
|
198
|
-
if (!watchConfig) continue;
|
|
199
|
-
processorPaths.push(...watchConfig.paths);
|
|
200
|
-
}
|
|
201
|
-
if (fileSystem.exists(this.appConfig.absolutePaths.pagesDir)) {
|
|
202
|
-
processorPaths.push(this.appConfig.absolutePaths.pagesDir);
|
|
203
|
-
}
|
|
204
|
-
if (fileSystem.exists(this.appConfig.absolutePaths.publicDir)) {
|
|
205
|
-
processorPaths.push(this.appConfig.absolutePaths.publicDir);
|
|
206
|
-
}
|
|
207
|
-
if (this.appConfig.additionalWatchPaths.length) {
|
|
208
|
-
processorPaths.push(...this.appConfig.additionalWatchPaths);
|
|
209
|
-
}
|
|
210
|
-
this.watcher = chokidar.watch(processorPaths, {
|
|
211
|
-
ignoreInitial: true,
|
|
212
|
-
ignorePermissionErrors: true,
|
|
213
|
-
awaitWriteFinish: {
|
|
214
|
-
stabilityThreshold: 50,
|
|
215
|
-
pollInterval: 50
|
|
216
|
-
}
|
|
217
|
-
});
|
|
231
|
+
if (this.watcher) {
|
|
232
|
+
return this.watcher;
|
|
218
233
|
}
|
|
234
|
+
const processorPaths = [];
|
|
219
235
|
for (const processor of this.appConfig.processors.values()) {
|
|
220
236
|
const watchConfig = processor.getWatchConfig();
|
|
221
237
|
if (!watchConfig) continue;
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
this.
|
|
232
|
-
}
|
|
238
|
+
processorPaths.push(...watchConfig.paths);
|
|
239
|
+
}
|
|
240
|
+
if (fileSystem.exists(this.appConfig.absolutePaths.includesDir)) {
|
|
241
|
+
processorPaths.push(this.appConfig.absolutePaths.includesDir);
|
|
242
|
+
}
|
|
243
|
+
if (fileSystem.exists(this.appConfig.absolutePaths.srcDir)) {
|
|
244
|
+
processorPaths.push(this.appConfig.absolutePaths.srcDir);
|
|
245
|
+
}
|
|
246
|
+
if (fileSystem.exists(this.appConfig.absolutePaths.pagesDir)) {
|
|
247
|
+
processorPaths.push(this.appConfig.absolutePaths.pagesDir);
|
|
248
|
+
}
|
|
249
|
+
if (fileSystem.exists(this.appConfig.absolutePaths.publicDir)) {
|
|
250
|
+
processorPaths.push(this.appConfig.absolutePaths.publicDir);
|
|
251
|
+
}
|
|
252
|
+
if (this.appConfig.additionalWatchPaths.length) {
|
|
253
|
+
processorPaths.push(...this.appConfig.additionalWatchPaths);
|
|
254
|
+
}
|
|
255
|
+
this.watcher = chokidar.watch(processorPaths, {
|
|
256
|
+
ignoreInitial: true,
|
|
257
|
+
ignorePermissionErrors: true,
|
|
258
|
+
awaitWriteFinish: {
|
|
259
|
+
stabilityThreshold: 50,
|
|
260
|
+
pollInterval: 50
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
this.watcher.on("change", (p) => this.enqueueChange(() => this.handleFileChange(p, "change"))).on("add", (p) => this.enqueueChange(() => this.handleFileChange(p, "add"))).on("addDir", (p) => this.enqueueChange(() => this.triggerRouterRefresh(p))).on("unlink", (p) => this.enqueueChange(() => this.handleFileChange(p, "unlink"))).on("unlinkDir", (p) => this.enqueueChange(() => this.triggerRouterRefresh(p))).on("error", (error) => this.handleError(error));
|
|
264
|
+
for (const processor of this.appConfig.processors.values()) {
|
|
265
|
+
const watchConfig = processor.getWatchConfig();
|
|
266
|
+
if (watchConfig?.onError) {
|
|
267
|
+
this.watcher.on("error", watchConfig.onError);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
233
270
|
return this.watcher;
|
|
234
271
|
}
|
|
235
272
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IHmrManager } from '../internal-types';
|
|
2
|
-
import type { ClientBridge } from '../adapters/bun/client-bridge';
|
|
1
|
+
import type { IHmrManager } from '../types/internal-types.js';
|
|
2
|
+
import type { ClientBridge } from '../adapters/bun/client-bridge.js';
|
|
3
3
|
export declare const createMockHmrManager: () => IHmrManager;
|
|
4
4
|
export declare const createMockBridge: () => ClientBridge;
|
|
@@ -1,337 +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
|
-
|
|
10
|
-
import { appLogger } from '../../global/app-logger.ts';
|
|
11
|
-
import type { EcoPagesAppConfig } from '../../internal-types.ts';
|
|
12
|
-
import { invariant } from '../../utils/invariant.ts';
|
|
13
|
-
import type {
|
|
14
|
-
ApiHandler,
|
|
15
|
-
ApiHandlerContext,
|
|
16
|
-
ErrorHandler,
|
|
17
|
-
Middleware,
|
|
18
|
-
RouteOptions,
|
|
19
|
-
StaticRoute,
|
|
20
|
-
ViewLoader,
|
|
21
|
-
} from '../../public-types.ts';
|
|
22
|
-
import { fileSystem } from '@ecopages/file-system';
|
|
23
|
-
import { parseCliArgs, type ReturnParseCliArgs } from '../../utils/parse-cli-args.ts';
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Configuration options for application adapters
|
|
27
|
-
*/
|
|
28
|
-
export interface ApplicationAdapterOptions {
|
|
29
|
-
appConfig: EcoPagesAppConfig;
|
|
30
|
-
serverOptions?: Record<string, any>;
|
|
31
|
-
/**
|
|
32
|
-
* Options for clearing the output directory before starting the server
|
|
33
|
-
* @default false
|
|
34
|
-
*/
|
|
35
|
-
clearOutput?: boolean;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Common interface for application adapters
|
|
40
|
-
*/
|
|
41
|
-
export interface ApplicationAdapter<T = any> {
|
|
42
|
-
start(): Promise<T | void>;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Handler function type for route handlers
|
|
47
|
-
*/
|
|
48
|
-
export type RouteHandler<
|
|
49
|
-
TRequest extends Request = Request,
|
|
50
|
-
TServer = any,
|
|
51
|
-
TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
|
|
52
|
-
> = (context: TContext) => Promise<Response> | Response;
|
|
53
|
-
|
|
54
|
-
export type RouteGroupDefinition<TRequest extends Request = Request, TServer = any> = {
|
|
55
|
-
prefix: string;
|
|
56
|
-
middleware?: readonly Middleware<TRequest, TServer, any>[];
|
|
57
|
-
routes: readonly ApiHandler<string, TRequest, TServer>[];
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Abstract base class for application adapters across different runtimes
|
|
62
|
-
*/
|
|
63
|
-
export abstract class AbstractApplicationAdapter<
|
|
64
|
-
TOptions extends ApplicationAdapterOptions = ApplicationAdapterOptions,
|
|
65
|
-
TServer = any,
|
|
66
|
-
TRequest extends Request = any,
|
|
67
|
-
> implements ApplicationAdapter<TServer> {
|
|
68
|
-
protected appConfig: EcoPagesAppConfig;
|
|
69
|
-
protected serverOptions: Record<string, any>;
|
|
70
|
-
protected cliArgs: ReturnParseCliArgs;
|
|
71
|
-
protected apiHandlers: ApiHandler[] = [];
|
|
72
|
-
protected staticRoutes: StaticRoute[] = [];
|
|
73
|
-
protected errorHandler?: ErrorHandler;
|
|
74
|
-
|
|
75
|
-
constructor(options: TOptions) {
|
|
76
|
-
this.appConfig = options.appConfig;
|
|
77
|
-
this.serverOptions = options.serverOptions || {};
|
|
78
|
-
this.cliArgs = parseCliArgs();
|
|
79
|
-
|
|
80
|
-
if (options.clearOutput) {
|
|
81
|
-
this.clearDistFolder().catch((error) => {
|
|
82
|
-
appLogger.error('Error clearing dist folder', error as Error);
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
private async clearDistFolder(_filter: string[] = []): Promise<void> {
|
|
88
|
-
const distPath = this.appConfig.absolutePaths.distDir;
|
|
89
|
-
const distExists = fileSystem.exists(distPath);
|
|
90
|
-
|
|
91
|
-
if (!distExists) return;
|
|
92
|
-
|
|
93
|
-
try {
|
|
94
|
-
await fileSystem.removeAsync(distPath);
|
|
95
|
-
appLogger.debug(`Cleared dist folder: ${distPath}`);
|
|
96
|
-
} catch (error) {
|
|
97
|
-
appLogger.error(`Error clearing dist folder: ${distPath}`, error as Error);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Register a GET route handler.
|
|
103
|
-
*
|
|
104
|
-
* Use verb methods for inline route definitions.
|
|
105
|
-
* For dynamic HTTP method registration, use `route(...)`.
|
|
106
|
-
*/
|
|
107
|
-
abstract get<
|
|
108
|
-
P extends string,
|
|
109
|
-
TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
|
|
110
|
-
>(
|
|
111
|
-
path: P,
|
|
112
|
-
handler: RouteHandler<TRequest, TServer, TContext>,
|
|
113
|
-
options?: RouteOptions<TRequest, TServer, TContext>,
|
|
114
|
-
): this;
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Register a POST route handler
|
|
118
|
-
*/
|
|
119
|
-
abstract post<
|
|
120
|
-
P extends string,
|
|
121
|
-
TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
|
|
122
|
-
>(
|
|
123
|
-
path: P,
|
|
124
|
-
handler: RouteHandler<TRequest, TServer, TContext>,
|
|
125
|
-
options?: RouteOptions<TRequest, TServer, TContext>,
|
|
126
|
-
): this;
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Register a PUT route handler
|
|
130
|
-
*/
|
|
131
|
-
abstract put<
|
|
132
|
-
P extends string,
|
|
133
|
-
TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
|
|
134
|
-
>(
|
|
135
|
-
path: P,
|
|
136
|
-
handler: RouteHandler<TRequest, TServer, TContext>,
|
|
137
|
-
options?: RouteOptions<TRequest, TServer, TContext>,
|
|
138
|
-
): this;
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Register a DELETE route handler
|
|
142
|
-
*/
|
|
143
|
-
abstract delete<
|
|
144
|
-
P extends string,
|
|
145
|
-
TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
|
|
146
|
-
>(
|
|
147
|
-
path: P,
|
|
148
|
-
handler: RouteHandler<TRequest, TServer, TContext>,
|
|
149
|
-
options?: RouteOptions<TRequest, TServer, TContext>,
|
|
150
|
-
): this;
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Register a PATCH route handler
|
|
154
|
-
*/
|
|
155
|
-
abstract patch<
|
|
156
|
-
P extends string,
|
|
157
|
-
TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
|
|
158
|
-
>(
|
|
159
|
-
path: P,
|
|
160
|
-
handler: RouteHandler<TRequest, TServer, TContext>,
|
|
161
|
-
options?: RouteOptions<TRequest, TServer, TContext>,
|
|
162
|
-
): this;
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Register an OPTIONS route handler
|
|
166
|
-
*/
|
|
167
|
-
abstract options<
|
|
168
|
-
P extends string,
|
|
169
|
-
TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
|
|
170
|
-
>(
|
|
171
|
-
path: P,
|
|
172
|
-
handler: RouteHandler<TRequest, TServer, TContext>,
|
|
173
|
-
options?: RouteOptions<TRequest, TServer, TContext>,
|
|
174
|
-
): this;
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Register a HEAD route handler
|
|
178
|
-
*/
|
|
179
|
-
abstract head<
|
|
180
|
-
P extends string,
|
|
181
|
-
TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
|
|
182
|
-
>(
|
|
183
|
-
path: P,
|
|
184
|
-
handler: RouteHandler<TRequest, TServer, TContext>,
|
|
185
|
-
options?: RouteOptions<TRequest, TServer, TContext>,
|
|
186
|
-
): this;
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Register a route with an explicit HTTP method.
|
|
190
|
-
*
|
|
191
|
-
* This is useful when the method is determined programmatically, or when
|
|
192
|
-
* registering a pre-built route declaration object by forwarding its
|
|
193
|
-
* `path`, `method`, and `handler` fields.
|
|
194
|
-
*/
|
|
195
|
-
abstract route<P extends string>(
|
|
196
|
-
path: P,
|
|
197
|
-
method: ApiHandler['method'],
|
|
198
|
-
handler: RouteHandler<TRequest, TServer>,
|
|
199
|
-
options?: RouteOptions<TRequest, TServer>,
|
|
200
|
-
): this;
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Register a pre-built API handler declaration.
|
|
204
|
-
*/
|
|
205
|
-
abstract add(handler: ApiHandler<string, TRequest, TServer>): this;
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Internal method to add route handlers to the API handlers array
|
|
209
|
-
*/
|
|
210
|
-
protected addRouteHandler<
|
|
211
|
-
P extends string,
|
|
212
|
-
TSpecRequest extends TRequest = TRequest,
|
|
213
|
-
TSpecServer extends TServer = TServer,
|
|
214
|
-
TContext extends ApiHandlerContext<TSpecRequest, TSpecServer> = ApiHandlerContext<TSpecRequest, TSpecServer>,
|
|
215
|
-
>(
|
|
216
|
-
path: P,
|
|
217
|
-
method: ApiHandler['method'],
|
|
218
|
-
handler: RouteHandler<TSpecRequest, TSpecServer, TContext>,
|
|
219
|
-
middleware?: Middleware<TSpecRequest, TSpecServer, TContext>[],
|
|
220
|
-
schema?: ApiHandler['schema'],
|
|
221
|
-
): this {
|
|
222
|
-
invariant(
|
|
223
|
-
typeof path === 'string',
|
|
224
|
-
`Invalid route path for ${method}: expected a string path starting with "/" but received ${Object.prototype.toString.call(path)}. If you're passing a prebuilt ApiHandler, use app.add(handler).`,
|
|
225
|
-
);
|
|
226
|
-
|
|
227
|
-
invariant(
|
|
228
|
-
path.startsWith('/'),
|
|
229
|
-
`Invalid route path for ${method}: "${path}". Route paths must start with '/'.`,
|
|
230
|
-
);
|
|
231
|
-
|
|
232
|
-
this.apiHandlers.push({
|
|
233
|
-
path,
|
|
234
|
-
method,
|
|
235
|
-
handler: handler as ApiHandler['handler'],
|
|
236
|
-
middleware: middleware as ApiHandler['middleware'],
|
|
237
|
-
schema,
|
|
238
|
-
});
|
|
239
|
-
return this;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* Create a route group with shared prefix and middleware.
|
|
244
|
-
* Routes defined within the group inherit the prefix and middleware.
|
|
245
|
-
*
|
|
246
|
-
* Each adapter implements this with its own builder type to support
|
|
247
|
-
* runtime-specific features (e.g., Bun's path parameter inference).
|
|
248
|
-
* Implementations may also support passing a pre-built group object.
|
|
249
|
-
*
|
|
250
|
-
* @param prefix - URL prefix for all routes in the group (e.g., '/api/v1')
|
|
251
|
-
* @param callback - Function that receives a builder to define routes
|
|
252
|
-
* @param options - Optional group-level middleware
|
|
253
|
-
*/
|
|
254
|
-
abstract group(
|
|
255
|
-
prefix: string,
|
|
256
|
-
callback: (builder: unknown) => void,
|
|
257
|
-
options?: {
|
|
258
|
-
middleware?: readonly Middleware<TRequest, TServer, any>[];
|
|
259
|
-
},
|
|
260
|
-
): this;
|
|
261
|
-
|
|
262
|
-
abstract group(group: RouteGroupDefinition<TRequest, TServer>): this;
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Get all registered API handlers
|
|
266
|
-
*/
|
|
267
|
-
getApiHandlers(): ApiHandler[] {
|
|
268
|
-
return this.apiHandlers;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Register a view for static generation at build time.
|
|
273
|
-
* The view must have staticPaths defined for dynamic routes.
|
|
274
|
-
*
|
|
275
|
-
* Uses a loader function to enable HMR in development.
|
|
276
|
-
*
|
|
277
|
-
* @param path - URL path pattern (e.g., '/posts/:slug')
|
|
278
|
-
* @param loader - A function that dynamically imports the eco.page view module
|
|
279
|
-
* @example
|
|
280
|
-
* ```typescript
|
|
281
|
-
* app.static('/login', () => import('./src/views/login.kita'))
|
|
282
|
-
* app.static('/posts/:slug', () => import('./src/views/post-view.kita'))
|
|
283
|
-
* ```
|
|
284
|
-
*/
|
|
285
|
-
static<P>(path: string, loader: ViewLoader<P>): this {
|
|
286
|
-
this.staticRoutes.push({ path, loader });
|
|
287
|
-
return this;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Get all registered static routes
|
|
292
|
-
*/
|
|
293
|
-
getStaticRoutes(): StaticRoute[] {
|
|
294
|
-
return this.staticRoutes;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
/**
|
|
298
|
-
* Register a global error handler for all routes.
|
|
299
|
-
* Useful for logging, monitoring integration, and custom error formatting.
|
|
300
|
-
*
|
|
301
|
-
* @example
|
|
302
|
-
* ```typescript
|
|
303
|
-
* app.onError(async (error, ctx) => {
|
|
304
|
-
* logger.error(error);
|
|
305
|
-
* return ctx.response.status(500).json({ error: 'Something went wrong' });
|
|
306
|
-
* });
|
|
307
|
-
* ```
|
|
308
|
-
*/
|
|
309
|
-
onError(handler: ErrorHandler<TRequest, TServer>): this {
|
|
310
|
-
this.errorHandler = handler as unknown as ErrorHandler;
|
|
311
|
-
return this;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Get the registered error handler
|
|
316
|
-
*/
|
|
317
|
-
getErrorHandler(): ErrorHandler | undefined {
|
|
318
|
-
return this.errorHandler;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* Initialize the server adapter based on the runtime
|
|
323
|
-
*/
|
|
324
|
-
protected abstract initializeServerAdapter(): Promise<any>;
|
|
325
|
-
|
|
326
|
-
/**
|
|
327
|
-
* Start the application server
|
|
328
|
-
*/
|
|
329
|
-
public abstract start(): Promise<TServer | void>;
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Handles a standard Web request without requiring a bound network server.
|
|
333
|
-
* This is the primary interoperability surface for embedding Ecopages inside
|
|
334
|
-
* other runtimes and frameworks.
|
|
335
|
-
*/
|
|
336
|
-
public abstract fetch(request: TRequest): Promise<Response>;
|
|
337
|
-
}
|