@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
|
@@ -4,17 +4,49 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import path from 'node:path';
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
DEFAULT_ECOPAGES_DIST_DIR,
|
|
9
|
+
DEFAULT_ECOPAGES_HOSTNAME,
|
|
10
|
+
DEFAULT_ECOPAGES_PORT,
|
|
11
|
+
DEFAULT_ECOPAGES_WORK_DIR,
|
|
12
|
+
} from '../constants.ts';
|
|
13
|
+
import {
|
|
14
|
+
collectConfiguredAppBuildManifestContributions,
|
|
15
|
+
createBuildAdapter,
|
|
16
|
+
getAppServerBuildPlugins,
|
|
17
|
+
setAppBuildAdapter,
|
|
18
|
+
setAppBuildExecutor,
|
|
19
|
+
updateAppBuildManifest,
|
|
20
|
+
} from '../build/build-adapter.ts';
|
|
8
21
|
import type { EcoBuildPlugin } from '../build/build-types.ts';
|
|
22
|
+
import { createAppBuildExecutor } from '../build/dev-build-coordinator.ts';
|
|
9
23
|
import { GHTML_PLUGIN_NAME, ghtmlPlugin } from '../integrations/ghtml/ghtml.plugin.ts';
|
|
10
|
-
import type { EcoPagesAppConfig,
|
|
24
|
+
import type { EcoPagesAppConfig, RobotsPreference } from '../internal-types.ts';
|
|
11
25
|
import { createEcoComponentMetaPlugin } from '../plugins/eco-component-meta-plugin.ts';
|
|
12
26
|
import type { IntegrationPlugin } from '../plugins/integration-plugin.ts';
|
|
13
27
|
import type { Processor } from '../plugins/processor.ts';
|
|
28
|
+
import type { RuntimeCapabilityDeclaration, RuntimeCapabilityTag } from '../plugins/runtime-capability.ts';
|
|
14
29
|
import type { PageMetadataProps } from '../public-types.ts';
|
|
15
30
|
import type { CacheConfig } from '../services/cache/cache.types.ts';
|
|
31
|
+
import {
|
|
32
|
+
NoopEntrypointDependencyGraph,
|
|
33
|
+
setAppEntrypointDependencyGraph,
|
|
34
|
+
} from '../services/runtime-state/entrypoint-dependency-graph.service.ts';
|
|
35
|
+
import {
|
|
36
|
+
createNodeRuntimeManifest,
|
|
37
|
+
setAppNodeRuntimeManifest,
|
|
38
|
+
} from '../services/runtime-manifest/node-runtime-manifest.service.ts';
|
|
39
|
+
import {
|
|
40
|
+
InMemoryRuntimeSpecifierRegistry,
|
|
41
|
+
setAppRuntimeSpecifierRegistry,
|
|
42
|
+
} from '../services/runtime-state/runtime-specifier-registry.service.ts';
|
|
43
|
+
import {
|
|
44
|
+
CounterServerInvalidationState,
|
|
45
|
+
setAppServerInvalidationState,
|
|
46
|
+
} from '../services/runtime-state/server-invalidation-state.service.ts';
|
|
16
47
|
import { invariant } from '../utils/invariant.ts';
|
|
17
48
|
import { appLogger } from '../global/app-logger.ts';
|
|
49
|
+
import { fileSystem } from '@ecopages/file-system';
|
|
18
50
|
|
|
19
51
|
export const CONFIG_BUILDER_ERRORS = {
|
|
20
52
|
DUPLICATE_INTEGRATION_NAMES: 'Integrations names must be unique',
|
|
@@ -23,8 +55,39 @@ export const CONFIG_BUILDER_ERRORS = {
|
|
|
23
55
|
'Both kitajs and react integrations are enabled. Use per-file JSX import source/pragma consistently (e.g. `/** @jsxImportSource react */` for React files and `/** @jsxImportSource @kitajs/html */` for Kita files).',
|
|
24
56
|
duplicateProcessorName: (name: string) => `Processor with name "${name}" already exists`,
|
|
25
57
|
duplicateLoaderName: (name: string) => `Loader with name "${name}" already exists`,
|
|
58
|
+
duplicateSemanticTemplate: (kind: 'html' | '404', matches: string[]) =>
|
|
59
|
+
`Multiple ${kind} templates found: ${matches.join(', ')}`,
|
|
60
|
+
incompatibleRuntimeCapability: (
|
|
61
|
+
kind: 'integration' | 'processor',
|
|
62
|
+
name: string,
|
|
63
|
+
runtime: RuntimeKind,
|
|
64
|
+
reason: string,
|
|
65
|
+
) => `Cannot enable ${kind} "${name}" on ${runtime}: ${reason}`,
|
|
66
|
+
unsupportedRuntimeVersion: (
|
|
67
|
+
kind: 'integration' | 'processor',
|
|
68
|
+
name: string,
|
|
69
|
+
runtime: RuntimeKind,
|
|
70
|
+
current: string,
|
|
71
|
+
min: string,
|
|
72
|
+
) => `Cannot enable ${kind} "${name}" on ${runtime} ${current}: requires runtime version ${min} or newer`,
|
|
73
|
+
invalidRuntimeVersion: (kind: 'integration' | 'processor', name: string, version: string) =>
|
|
74
|
+
`Cannot validate ${kind} "${name}" runtimeCapability.minRuntimeVersion "${version}" because it is not a dot-separated numeric version`,
|
|
26
75
|
} as const;
|
|
27
76
|
|
|
77
|
+
type RuntimeKind = 'node' | 'bun';
|
|
78
|
+
|
|
79
|
+
type RuntimeEnvironment = {
|
|
80
|
+
runtime: RuntimeKind;
|
|
81
|
+
version: string;
|
|
82
|
+
supportedTags: Set<RuntimeCapabilityTag>;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
type RuntimeCapabilityOwner = {
|
|
86
|
+
kind: 'integration' | 'processor';
|
|
87
|
+
name: string;
|
|
88
|
+
runtimeCapability?: RuntimeCapabilityDeclaration;
|
|
89
|
+
};
|
|
90
|
+
|
|
28
91
|
/**
|
|
29
92
|
* A builder class for creating and configuring EcoPages application configuration.
|
|
30
93
|
* Provides a fluent interface for setting various configuration options and managing
|
|
@@ -65,12 +128,6 @@ export class ConfigBuilder {
|
|
|
65
128
|
componentsDir: 'components',
|
|
66
129
|
layoutsDir: 'layouts',
|
|
67
130
|
publicDir: 'public',
|
|
68
|
-
includesTemplates: {
|
|
69
|
-
head: 'head.ghtml.ts',
|
|
70
|
-
html: 'html.ghtml.ts',
|
|
71
|
-
seo: 'seo.ghtml.ts',
|
|
72
|
-
},
|
|
73
|
-
error404Template: '404.ghtml.ts',
|
|
74
131
|
robotsTxt: {
|
|
75
132
|
preferences: {
|
|
76
133
|
'*': [],
|
|
@@ -78,7 +135,7 @@ export class ConfigBuilder {
|
|
|
78
135
|
},
|
|
79
136
|
integrations: [],
|
|
80
137
|
integrationsDependencies: [],
|
|
81
|
-
distDir:
|
|
138
|
+
distDir: DEFAULT_ECOPAGES_DIST_DIR,
|
|
82
139
|
defaultMetadata: {
|
|
83
140
|
title: 'Ecopages',
|
|
84
141
|
description: 'This is a static site generated with Ecopages',
|
|
@@ -89,6 +146,7 @@ export class ConfigBuilder {
|
|
|
89
146
|
config: '',
|
|
90
147
|
componentsDir: '',
|
|
91
148
|
distDir: '',
|
|
149
|
+
workDir: '',
|
|
92
150
|
includesDir: '',
|
|
93
151
|
layoutsDir: '',
|
|
94
152
|
pagesDir: '',
|
|
@@ -100,6 +158,7 @@ export class ConfigBuilder {
|
|
|
100
158
|
},
|
|
101
159
|
processors: new Map(),
|
|
102
160
|
loaders: new Map(),
|
|
161
|
+
workDir: DEFAULT_ECOPAGES_WORK_DIR,
|
|
103
162
|
};
|
|
104
163
|
|
|
105
164
|
/**
|
|
@@ -198,29 +257,6 @@ export class ConfigBuilder {
|
|
|
198
257
|
return this;
|
|
199
258
|
}
|
|
200
259
|
|
|
201
|
-
/**
|
|
202
|
-
* Sets the templates used for includes.
|
|
203
|
-
* These templates are used to build the HTML structure of pages.
|
|
204
|
-
*
|
|
205
|
-
* @param includesTemplates - An object containing the template file names
|
|
206
|
-
* @returns The ConfigBuilder instance for method chaining
|
|
207
|
-
*/
|
|
208
|
-
setIncludesTemplates(includesTemplates: IncludesTemplates): this {
|
|
209
|
-
this.config.includesTemplates = includesTemplates;
|
|
210
|
-
return this;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Sets the template file for the 404 error page.
|
|
215
|
-
*
|
|
216
|
-
* @param error404Template - The file name of the 404 error template (default: '404.ghtml.ts')
|
|
217
|
-
* @returns The ConfigBuilder instance for method chaining
|
|
218
|
-
*/
|
|
219
|
-
setError404Template(error404Template: string): this {
|
|
220
|
-
this.config.error404Template = error404Template;
|
|
221
|
-
return this;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
260
|
/**
|
|
225
261
|
* Sets the robots.txt configuration.
|
|
226
262
|
* This determines which paths are allowed/disallowed for search engines.
|
|
@@ -248,7 +284,7 @@ export class ConfigBuilder {
|
|
|
248
284
|
/**
|
|
249
285
|
* Sets the output directory for the built application.
|
|
250
286
|
*
|
|
251
|
-
* @param distDir - The distribution directory name (default: '
|
|
287
|
+
* @param distDir - The distribution directory name (default: 'dist')
|
|
252
288
|
* @returns The ConfigBuilder instance for method chaining
|
|
253
289
|
*/
|
|
254
290
|
setDistDir(distDir: string): this {
|
|
@@ -256,6 +292,22 @@ export class ConfigBuilder {
|
|
|
256
292
|
return this;
|
|
257
293
|
}
|
|
258
294
|
|
|
295
|
+
/**
|
|
296
|
+
* Sets the internal work directory for runtime-only artifacts.
|
|
297
|
+
*
|
|
298
|
+
* @remarks
|
|
299
|
+
* Use this when deployable output should stay clean while Ecopages still
|
|
300
|
+
* needs a separate workspace for server transpilation caches, runtime
|
|
301
|
+
* manifests, and other internal build products.
|
|
302
|
+
*
|
|
303
|
+
* @param workDir - The internal work directory name
|
|
304
|
+
* @returns The ConfigBuilder instance for method chaining
|
|
305
|
+
*/
|
|
306
|
+
setWorkDir(workDir: string): this {
|
|
307
|
+
this.config.workDir = workDir;
|
|
308
|
+
return this;
|
|
309
|
+
}
|
|
310
|
+
|
|
259
311
|
/**
|
|
260
312
|
* Sets the default metadata for pages.
|
|
261
313
|
* This is used when a page doesn't specify its own metadata.
|
|
@@ -360,40 +412,56 @@ export class ConfigBuilder {
|
|
|
360
412
|
}
|
|
361
413
|
|
|
362
414
|
private createAbsolutePaths(config: EcoPagesAppConfig): this {
|
|
363
|
-
const {
|
|
364
|
-
srcDir,
|
|
365
|
-
componentsDir,
|
|
366
|
-
includesDir,
|
|
367
|
-
layoutsDir,
|
|
368
|
-
pagesDir,
|
|
369
|
-
publicDir,
|
|
370
|
-
distDir,
|
|
371
|
-
includesTemplates,
|
|
372
|
-
error404Template,
|
|
373
|
-
} = config;
|
|
415
|
+
const { srcDir, componentsDir, includesDir, layoutsDir, pagesDir, publicDir, distDir, workDir } = config;
|
|
374
416
|
|
|
375
417
|
const projectDir = config.rootDir;
|
|
376
418
|
|
|
377
419
|
const absoluteSrcDir = path.resolve(projectDir, srcDir);
|
|
378
420
|
const absoluteDistDir = path.resolve(projectDir, distDir);
|
|
421
|
+
const absoluteWorkDir = path.resolve(projectDir, workDir);
|
|
422
|
+
|
|
423
|
+
const absoluteIncludesDir = path.join(absoluteSrcDir, includesDir);
|
|
424
|
+
const absolutePagesDir = path.join(absoluteSrcDir, pagesDir);
|
|
379
425
|
|
|
380
426
|
this.config.absolutePaths = {
|
|
381
427
|
config: path.join(projectDir, 'eco.config.ts'),
|
|
382
428
|
projectDir: projectDir,
|
|
383
429
|
srcDir: absoluteSrcDir,
|
|
384
430
|
distDir: absoluteDistDir,
|
|
431
|
+
workDir: absoluteWorkDir,
|
|
385
432
|
componentsDir: path.join(absoluteSrcDir, componentsDir),
|
|
386
|
-
includesDir:
|
|
433
|
+
includesDir: absoluteIncludesDir,
|
|
387
434
|
layoutsDir: path.join(absoluteSrcDir, layoutsDir),
|
|
388
|
-
pagesDir:
|
|
435
|
+
pagesDir: absolutePagesDir,
|
|
389
436
|
publicDir: path.join(absoluteSrcDir, publicDir),
|
|
390
|
-
htmlTemplatePath:
|
|
391
|
-
|
|
437
|
+
htmlTemplatePath: this.resolveSemanticTemplatePath({
|
|
438
|
+
dirPath: absoluteIncludesDir,
|
|
439
|
+
basename: 'html',
|
|
440
|
+
}),
|
|
441
|
+
error404TemplatePath: this.resolveSemanticTemplatePath({
|
|
442
|
+
dirPath: absolutePagesDir,
|
|
443
|
+
basename: '404',
|
|
444
|
+
}),
|
|
392
445
|
};
|
|
393
446
|
|
|
394
447
|
return this;
|
|
395
448
|
}
|
|
396
449
|
|
|
450
|
+
private resolveSemanticTemplatePath({ dirPath, basename }: { dirPath: string; basename: 'html' | '404' }): string {
|
|
451
|
+
const extensions = this.config.templatesExt.length > 0 ? this.config.templatesExt : ['.ghtml.ts'];
|
|
452
|
+
const matches = extensions
|
|
453
|
+
.map((extension) => path.join(dirPath, `${basename}${extension}`))
|
|
454
|
+
.filter((candidate) => fileSystem.exists(candidate));
|
|
455
|
+
|
|
456
|
+
invariant(matches.length <= 1, CONFIG_BUILDER_ERRORS.duplicateSemanticTemplate(basename, matches));
|
|
457
|
+
|
|
458
|
+
if (matches.length === 1) {
|
|
459
|
+
return matches[0]!;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
return path.join(dirPath, `${basename}${extensions[0]}`);
|
|
463
|
+
}
|
|
464
|
+
|
|
397
465
|
private createIntegrationTemplatesExt(integrations: EcoPagesAppConfig['integrations']) {
|
|
398
466
|
const integrationName = integrations.map((integration) => integration.name);
|
|
399
467
|
const uniqueName = new Set(integrationName);
|
|
@@ -423,6 +491,154 @@ export class ConfigBuilder {
|
|
|
423
491
|
}
|
|
424
492
|
}
|
|
425
493
|
|
|
494
|
+
private validateRuntimeCapabilities(): void {
|
|
495
|
+
const runtimeEnvironment = this.detectRuntimeEnvironment();
|
|
496
|
+
const contributors: RuntimeCapabilityOwner[] = [
|
|
497
|
+
...this.config.integrations.map((integration) => ({
|
|
498
|
+
kind: 'integration' as const,
|
|
499
|
+
name: integration.name,
|
|
500
|
+
runtimeCapability: integration.runtimeCapability,
|
|
501
|
+
})),
|
|
502
|
+
...Array.from(this.config.processors.values(), (processor) => ({
|
|
503
|
+
kind: 'processor' as const,
|
|
504
|
+
name: processor.name,
|
|
505
|
+
runtimeCapability: processor.runtimeCapability,
|
|
506
|
+
})),
|
|
507
|
+
];
|
|
508
|
+
|
|
509
|
+
for (const contributor of contributors) {
|
|
510
|
+
this.validateRuntimeCapability(contributor, runtimeEnvironment);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
private validateRuntimeCapability(contributor: RuntimeCapabilityOwner, environment: RuntimeEnvironment): void {
|
|
515
|
+
const declaration = contributor.runtimeCapability;
|
|
516
|
+
if (!declaration) {
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
for (const tag of declaration.tags) {
|
|
521
|
+
if (environment.supportedTags.has(tag)) {
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
throw new Error(
|
|
526
|
+
CONFIG_BUILDER_ERRORS.incompatibleRuntimeCapability(
|
|
527
|
+
contributor.kind,
|
|
528
|
+
contributor.name,
|
|
529
|
+
environment.runtime,
|
|
530
|
+
this.describeUnsupportedRuntimeTag(tag),
|
|
531
|
+
),
|
|
532
|
+
);
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
if (!declaration.minRuntimeVersion) {
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
const minVersion = this.parseVersion(declaration.minRuntimeVersion);
|
|
540
|
+
if (!minVersion) {
|
|
541
|
+
throw new Error(
|
|
542
|
+
CONFIG_BUILDER_ERRORS.invalidRuntimeVersion(
|
|
543
|
+
contributor.kind,
|
|
544
|
+
contributor.name,
|
|
545
|
+
declaration.minRuntimeVersion,
|
|
546
|
+
),
|
|
547
|
+
);
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
const currentVersion = this.parseVersion(environment.version);
|
|
551
|
+
if (!currentVersion) {
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
if (this.compareVersions(currentVersion, minVersion) >= 0) {
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
throw new Error(
|
|
560
|
+
CONFIG_BUILDER_ERRORS.unsupportedRuntimeVersion(
|
|
561
|
+
contributor.kind,
|
|
562
|
+
contributor.name,
|
|
563
|
+
environment.runtime,
|
|
564
|
+
environment.version,
|
|
565
|
+
declaration.minRuntimeVersion,
|
|
566
|
+
),
|
|
567
|
+
);
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
private detectRuntimeEnvironment(): RuntimeEnvironment {
|
|
571
|
+
const bunVersion = this.getBunVersion();
|
|
572
|
+
if (bunVersion) {
|
|
573
|
+
return {
|
|
574
|
+
runtime: 'bun',
|
|
575
|
+
version: bunVersion,
|
|
576
|
+
supportedTags: new Set<RuntimeCapabilityTag>([
|
|
577
|
+
'bun-only',
|
|
578
|
+
'node-compatible',
|
|
579
|
+
'requires-native-bun-api',
|
|
580
|
+
'requires-node-builtins',
|
|
581
|
+
]),
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
return {
|
|
586
|
+
runtime: 'node',
|
|
587
|
+
version: process.versions.node,
|
|
588
|
+
supportedTags: new Set<RuntimeCapabilityTag>(['node-compatible', 'requires-node-builtins']),
|
|
589
|
+
};
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
private getBunVersion(): string | undefined {
|
|
593
|
+
const bun = globalThis as typeof globalThis & {
|
|
594
|
+
Bun?: {
|
|
595
|
+
version?: string;
|
|
596
|
+
};
|
|
597
|
+
};
|
|
598
|
+
|
|
599
|
+
return typeof bun.Bun?.version === 'string' ? bun.Bun.version : undefined;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
private describeUnsupportedRuntimeTag(tag: RuntimeCapabilityTag): string {
|
|
603
|
+
switch (tag) {
|
|
604
|
+
case 'bun-only':
|
|
605
|
+
return 'it is Bun-only';
|
|
606
|
+
case 'requires-native-bun-api':
|
|
607
|
+
return 'it requires the native Bun API';
|
|
608
|
+
case 'requires-node-builtins':
|
|
609
|
+
return 'it requires Node builtins';
|
|
610
|
+
case 'node-compatible':
|
|
611
|
+
return 'it requires a Node-compatible runtime';
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
private parseVersion(version: string): number[] | undefined {
|
|
616
|
+
const normalized = version.trim().replace(/^v/i, '');
|
|
617
|
+
if (!/^\d+(?:\.\d+)*$/.test(normalized)) {
|
|
618
|
+
return undefined;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
return normalized.split('.').map((segment) => Number(segment));
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
private compareVersions(left: number[], right: number[]): number {
|
|
625
|
+
const maxLength = Math.max(left.length, right.length);
|
|
626
|
+
for (let index = 0; index < maxLength; index += 1) {
|
|
627
|
+
const leftValue = left[index] ?? 0;
|
|
628
|
+
const rightValue = right[index] ?? 0;
|
|
629
|
+
|
|
630
|
+
if (leftValue > rightValue) {
|
|
631
|
+
return 1;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
if (leftValue < rightValue) {
|
|
635
|
+
return -1;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
return 0;
|
|
640
|
+
}
|
|
641
|
+
|
|
426
642
|
/**
|
|
427
643
|
* Initializes default loaders that are required for EcoPages to function.
|
|
428
644
|
* This includes the eco-component-meta-plugin which auto-injects __eco metadata into component configs.
|
|
@@ -463,11 +679,27 @@ export class ConfigBuilder {
|
|
|
463
679
|
this.config.integrations.push(ghtmlPlugin());
|
|
464
680
|
}
|
|
465
681
|
|
|
466
|
-
this.createAbsolutePaths(this.config);
|
|
467
682
|
this.createIntegrationTemplatesExt(this.config.integrations);
|
|
683
|
+
this.createAbsolutePaths(this.config);
|
|
468
684
|
|
|
469
685
|
await this.initializeDefaultLoaders();
|
|
470
686
|
this.initializeProcessors();
|
|
687
|
+
this.validateRuntimeCapabilities();
|
|
688
|
+
const buildAdapter = createBuildAdapter();
|
|
689
|
+
setAppBuildAdapter(this.config, buildAdapter);
|
|
690
|
+
updateAppBuildManifest(this.config, await collectConfiguredAppBuildManifestContributions(this.config));
|
|
691
|
+
setAppServerInvalidationState(this.config, new CounterServerInvalidationState());
|
|
692
|
+
setAppEntrypointDependencyGraph(this.config, new NoopEntrypointDependencyGraph());
|
|
693
|
+
setAppRuntimeSpecifierRegistry(this.config, new InMemoryRuntimeSpecifierRegistry());
|
|
694
|
+
setAppBuildExecutor(
|
|
695
|
+
this.config,
|
|
696
|
+
createAppBuildExecutor({
|
|
697
|
+
development: false,
|
|
698
|
+
adapter: buildAdapter,
|
|
699
|
+
getPlugins: () => getAppServerBuildPlugins(this.config),
|
|
700
|
+
}),
|
|
701
|
+
);
|
|
702
|
+
setAppNodeRuntimeManifest(this.config, createNodeRuntimeManifest(this.config));
|
|
471
703
|
|
|
472
704
|
return this.config;
|
|
473
705
|
}
|
package/src/constants.ts
CHANGED
|
@@ -37,3 +37,18 @@ export const GENERATED_BASE_PATHS = {
|
|
|
37
37
|
export const DEFAULT_ECOPAGES_PORT = 3000;
|
|
38
38
|
|
|
39
39
|
export const DEFAULT_ECOPAGES_HOSTNAME = 'localhost';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Default directory used for deployable output.
|
|
43
|
+
*/
|
|
44
|
+
export const DEFAULT_ECOPAGES_DIST_DIR = 'dist';
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Default internal working directory used for runtime-only artifacts.
|
|
48
|
+
*
|
|
49
|
+
* @remarks
|
|
50
|
+
* This directory is a local tool workspace and is not intended for deployment.
|
|
51
|
+
* It owns transpiled server modules, runtime manifests, and processor caches
|
|
52
|
+
* so the export directory can remain a clean deployable tree.
|
|
53
|
+
*/
|
|
54
|
+
export const DEFAULT_ECOPAGES_WORK_DIR = '.eco';
|
package/src/declarations.d.ts
CHANGED
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
import type { EcoPagesAppConfig } from './internal-types';
|
|
2
|
+
import type { EcoNavigationRuntime } from './router/client/navigation-coordinator';
|
|
2
3
|
|
|
3
4
|
type HMRHandler = (url: string) => Promise<void>;
|
|
4
|
-
|
|
5
|
-
type
|
|
5
|
+
type CleanupPageRootFunction = () => void;
|
|
6
|
+
type EcoPageRoot = { render: (node: unknown) => void; unmount: () => void };
|
|
7
|
+
type EcoPageData = {
|
|
8
|
+
module: string;
|
|
9
|
+
props: Record<string, unknown>;
|
|
10
|
+
};
|
|
11
|
+
type EcoPagesWindowRuntime = {
|
|
12
|
+
hmrHandlers?: Record<string, HMRHandler>;
|
|
13
|
+
navigation?: EcoNavigationRuntime;
|
|
14
|
+
react?: {
|
|
15
|
+
cleanupPageRoot?: CleanupPageRootFunction;
|
|
16
|
+
pageRoot?: EcoPageRoot | null;
|
|
17
|
+
};
|
|
18
|
+
page?: EcoPageData;
|
|
19
|
+
};
|
|
6
20
|
|
|
7
21
|
declare global {
|
|
8
|
-
var ecoConfig: EcoPagesAppConfig;
|
|
9
|
-
|
|
10
22
|
interface Window {
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
/** Function to reload the current page, used for layout updates */
|
|
14
|
-
__ecopages_reload_current_page__?: ReloadPageFunction;
|
|
15
|
-
/** Page data registry - contains module path and props for current page */
|
|
16
|
-
__ECO_PAGE__?: {
|
|
17
|
-
module: string;
|
|
18
|
-
props: Record<string, unknown>;
|
|
19
|
-
};
|
|
23
|
+
/** Shared Ecopages browser runtime state */
|
|
24
|
+
__ECO_PAGES__?: EcoPagesWindowRuntime;
|
|
20
25
|
}
|
|
21
26
|
}
|
|
22
27
|
|
package/src/eco/README.md
CHANGED
|
@@ -7,10 +7,12 @@ A unified API for defining components, pages, and page data in EcoPages.
|
|
|
7
7
|
The `eco` namespace provides a consistent, type-safe interface for:
|
|
8
8
|
|
|
9
9
|
1. **`eco.component()`** - Factory for defining reusable components with dependencies and optional lazy-loading
|
|
10
|
-
2. **`eco.
|
|
11
|
-
3. **`eco.
|
|
12
|
-
4. **`eco.
|
|
13
|
-
5. **`eco.
|
|
10
|
+
2. **`eco.html()`** - Semantic alias for the document shell component (the outermost HTML wrapper)
|
|
11
|
+
3. **`eco.layout()`** - Semantic alias for route layout components (page-level wrappers)
|
|
12
|
+
4. **`eco.page()`** - Factory for defining page components with optional inline `staticPaths`, `staticProps`, and `metadata`
|
|
13
|
+
5. **`eco.metadata()`** - Type-safe wrapper for page metadata (legacy pattern)
|
|
14
|
+
6. **`eco.staticPaths()`** - Type-safe wrapper for dynamic route generation (legacy pattern)
|
|
15
|
+
7. **`eco.staticProps()`** - Type-safe wrapper for static data fetching (legacy pattern)
|
|
14
16
|
|
|
15
17
|
## Component Patterns
|
|
16
18
|
|
|
@@ -42,9 +44,9 @@ export function Card({ children, class: className }: CardProps) {
|
|
|
42
44
|
|
|
43
45
|
> **Note:** If your component requires a dedicated CSS file, use `eco.component()` instead to manage the stylesheet dependency.
|
|
44
46
|
|
|
45
|
-
### Plain React Components
|
|
47
|
+
### Plain React Components
|
|
46
48
|
|
|
47
|
-
|
|
49
|
+
React components with hooks and Tailwind CSS work out of the box without `eco.component()`. Standard React components can be used directly:
|
|
48
50
|
|
|
49
51
|
```tsx
|
|
50
52
|
import { useEffect, useState } from 'react';
|
|
@@ -99,7 +101,6 @@ export function ThemeToggle() {
|
|
|
99
101
|
- React components with hooks (`useState`, `useEffect`, etc.)
|
|
100
102
|
- Components styled with Tailwind CSS classes
|
|
101
103
|
- Interactive UI that doesn't require external scripts or dedicated stylesheets
|
|
102
|
-
- Bun handles all imports automatically
|
|
103
104
|
|
|
104
105
|
> **Note:** Use `eco.component()` only when you need to manage external stylesheets, scripts, or lazy loading. For React components relying solely on hooks and Tailwind, plain functions are simpler and sufficient.
|
|
105
106
|
|
|
@@ -128,14 +129,14 @@ export const Counter = eco.component({
|
|
|
128
129
|
|
|
129
130
|
### Comparison
|
|
130
131
|
|
|
131
|
-
| Aspect | Simple JSX | Plain React
|
|
132
|
-
| -------------------- | ---------- |
|
|
133
|
-
| React hooks | No | Yes
|
|
134
|
-
| Scripts/Stylesheets | No | No
|
|
135
|
-
| Lazy loading | No | No
|
|
136
|
-
| Hydration strategies | No | No
|
|
137
|
-
| Runtime cost | Zero | Minimal
|
|
138
|
-
| Use case | Static UI | Interactive UI
|
|
132
|
+
| Aspect | Simple JSX | Plain React | `eco.component()` |
|
|
133
|
+
| -------------------- | ---------- | -------------- | ----------------- |
|
|
134
|
+
| React hooks | No | Yes | Yes |
|
|
135
|
+
| Scripts/Stylesheets | No | No | Yes |
|
|
136
|
+
| Lazy loading | No | No | Yes |
|
|
137
|
+
| Hydration strategies | No | No | Yes |
|
|
138
|
+
| Runtime cost | Zero | Minimal | Minimal |
|
|
139
|
+
| Use case | Static UI | Interactive UI | Advanced UI |
|
|
139
140
|
|
|
140
141
|
All patterns can coexist in the same project. Use the right tool for the job.
|
|
141
142
|
|
|
@@ -231,6 +232,53 @@ Both patterns work and can be mixed - the renderer checks for attached propertie
|
|
|
231
232
|
|
|
232
233
|
## API Reference
|
|
233
234
|
|
|
235
|
+
### `eco.html()`
|
|
236
|
+
|
|
237
|
+
Creates the document shell component — the outermost HTML wrapper rendered once per page. Semantically equivalent to `eco.component()` but signals intent to tooling and readers that this component owns the full document structure (`<html>`, `<head>`, `<body>`).
|
|
238
|
+
|
|
239
|
+
```tsx
|
|
240
|
+
import { eco } from '@ecopages/core';
|
|
241
|
+
|
|
242
|
+
export const Document = eco.html({
|
|
243
|
+
dependencies: {
|
|
244
|
+
stylesheets: ['./document.css'],
|
|
245
|
+
},
|
|
246
|
+
render: ({ children, metadata }) => (
|
|
247
|
+
<html lang="en">
|
|
248
|
+
<head>
|
|
249
|
+
<title>{metadata?.title ?? 'EcoPages'}</title>
|
|
250
|
+
</head>
|
|
251
|
+
<body>{children}</body>
|
|
252
|
+
</html>
|
|
253
|
+
),
|
|
254
|
+
});
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### `eco.layout()`
|
|
258
|
+
|
|
259
|
+
Creates a route layout component — a wrapper rendered around page content. Semantically equivalent to `eco.component()` but clearly communicates that the component is intended to be used as a `layout` in `eco.page()`.
|
|
260
|
+
|
|
261
|
+
```tsx
|
|
262
|
+
import { eco } from '@ecopages/core';
|
|
263
|
+
|
|
264
|
+
export const BaseLayout = eco.layout({
|
|
265
|
+
dependencies: {
|
|
266
|
+
stylesheets: ['./base-layout.css'],
|
|
267
|
+
scripts: ['./base-layout.script.ts'],
|
|
268
|
+
},
|
|
269
|
+
render: ({ children }) => <main>{children}</main>,
|
|
270
|
+
});
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Use `eco.layout()` components as the `layout` option in `eco.page()`:
|
|
274
|
+
|
|
275
|
+
```tsx
|
|
276
|
+
export default eco.page({
|
|
277
|
+
layout: BaseLayout,
|
|
278
|
+
render: () => <h1>Hello</h1>,
|
|
279
|
+
});
|
|
280
|
+
```
|
|
281
|
+
|
|
234
282
|
### `eco.component()`
|
|
235
283
|
|
|
236
284
|
Define a reusable component with dependencies.
|
|
@@ -516,12 +564,18 @@ interface EcoComponentDependencies {
|
|
|
516
564
|
components?: EcoComponent[];
|
|
517
565
|
}
|
|
518
566
|
|
|
567
|
+
// Shared base option shape used by component(), html(), and layout()
|
|
519
568
|
interface ComponentOptions<P, E = EcoPagesElement> {
|
|
520
569
|
componentDir?: string;
|
|
521
570
|
dependencies?: EcoComponentDependencies;
|
|
522
571
|
render: (props: P) => E;
|
|
523
572
|
}
|
|
524
573
|
|
|
574
|
+
// html() and layout() accept the same options as component() but return
|
|
575
|
+
// narrower types to signal intent (EcoHtmlComponent / EcoLayoutComponent).
|
|
576
|
+
type HtmlOptions<E = EcoPagesElement> = ComponentOptions<Record<string, unknown>, E>;
|
|
577
|
+
type LayoutOptions<E = EcoPagesElement> = ComponentOptions<{ children: E }, E>;
|
|
578
|
+
|
|
525
579
|
interface PageOptions<T, E = EcoPagesElement> {
|
|
526
580
|
componentDir?: string;
|
|
527
581
|
dependencies?: EcoComponentDependencies;
|
|
@@ -551,7 +605,7 @@ type PagePropsFor<T> =
|
|
|
551
605
|
```tsx
|
|
552
606
|
import { eco } from '@ecopages/core';
|
|
553
607
|
|
|
554
|
-
eco. // IDE shows: component, page, metadata, staticPaths, staticProps
|
|
608
|
+
eco. // IDE shows: component, html, layout, page, metadata, staticPaths, staticProps
|
|
555
609
|
```
|
|
556
610
|
|
|
557
611
|
### 2. Type Safety
|