@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
|
@@ -1,17 +1,51 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
DEFAULT_ECOPAGES_DIST_DIR,
|
|
4
|
+
DEFAULT_ECOPAGES_HOSTNAME,
|
|
5
|
+
DEFAULT_ECOPAGES_PORT,
|
|
6
|
+
DEFAULT_ECOPAGES_WORK_DIR
|
|
7
|
+
} from "../config/constants.js";
|
|
8
|
+
import {
|
|
9
|
+
collectConfiguredAppBuildManifestContributions,
|
|
10
|
+
createBuildAdapter,
|
|
11
|
+
getAppServerBuildPlugins,
|
|
12
|
+
setAppBuildAdapter,
|
|
13
|
+
setAppBuildExecutor,
|
|
14
|
+
updateAppBuildManifest
|
|
15
|
+
} from "../build/build-adapter.js";
|
|
16
|
+
import { createAppBuildExecutor } from "../build/dev-build-coordinator.js";
|
|
17
|
+
import { GHTML_PLUGIN_NAME } from "../integrations/ghtml/ghtml.constants.js";
|
|
18
|
+
import { ghtmlPlugin } from "../integrations/ghtml/ghtml.plugin.js";
|
|
4
19
|
import { createEcoComponentMetaPlugin } from "../plugins/eco-component-meta-plugin.js";
|
|
20
|
+
import { createEcoComponentMetaTransform } from "../plugins/eco-component-meta-plugin.js";
|
|
21
|
+
import {
|
|
22
|
+
NoopEntrypointDependencyGraph,
|
|
23
|
+
setAppEntrypointDependencyGraph
|
|
24
|
+
} from "../services/runtime-state/entrypoint-dependency-graph.service.js";
|
|
25
|
+
import {
|
|
26
|
+
InMemoryRuntimeSpecifierRegistry,
|
|
27
|
+
setAppRuntimeSpecifierRegistry
|
|
28
|
+
} from "../services/runtime-state/runtime-specifier-registry.service.js";
|
|
29
|
+
import {
|
|
30
|
+
CounterServerInvalidationState,
|
|
31
|
+
setAppServerInvalidationState
|
|
32
|
+
} from "../services/runtime-state/server-invalidation-state.service.js";
|
|
5
33
|
import { invariant } from "../utils/invariant.js";
|
|
6
34
|
import { appLogger } from "../global/app-logger.js";
|
|
35
|
+
import { fileSystem } from "@ecopages/file-system";
|
|
7
36
|
const CONFIG_BUILDER_ERRORS = {
|
|
8
37
|
DUPLICATE_INTEGRATION_NAMES: "Integrations names must be unique",
|
|
9
38
|
DUPLICATE_INTEGRATION_EXTENSIONS: "Integrations extensions must be unique",
|
|
10
39
|
MIXED_JSX_ENGINES: "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).",
|
|
11
40
|
duplicateProcessorName: (name) => `Processor with name "${name}" already exists`,
|
|
12
|
-
duplicateLoaderName: (name) => `Loader with name "${name}" already exists
|
|
41
|
+
duplicateLoaderName: (name) => `Loader with name "${name}" already exists`,
|
|
42
|
+
duplicateSemanticTemplate: (kind, matches) => `Multiple ${kind} templates found: ${matches.join(", ")}`,
|
|
43
|
+
incompatibleRuntimeCapability: (kind, name, runtime, reason) => `Cannot enable ${kind} "${name}" on ${runtime}: ${reason}`,
|
|
44
|
+
unsupportedRuntimeVersion: (kind, name, runtime, current, min) => `Cannot enable ${kind} "${name}" on ${runtime} ${current}: requires runtime version ${min} or newer`,
|
|
45
|
+
invalidRuntimeVersion: (kind, name, version) => `Cannot validate ${kind} "${name}" runtimeCapability.minRuntimeVersion "${version}" because it is not a dot-separated numeric version`
|
|
13
46
|
};
|
|
14
47
|
class ConfigBuilder {
|
|
48
|
+
buildOwnership = "bun-native";
|
|
15
49
|
config = {
|
|
16
50
|
baseUrl: "",
|
|
17
51
|
rootDir: ".",
|
|
@@ -21,12 +55,6 @@ class ConfigBuilder {
|
|
|
21
55
|
componentsDir: "components",
|
|
22
56
|
layoutsDir: "layouts",
|
|
23
57
|
publicDir: "public",
|
|
24
|
-
includesTemplates: {
|
|
25
|
-
head: "head.ghtml.ts",
|
|
26
|
-
html: "html.ghtml.ts",
|
|
27
|
-
seo: "seo.ghtml.ts"
|
|
28
|
-
},
|
|
29
|
-
error404Template: "404.ghtml.ts",
|
|
30
58
|
robotsTxt: {
|
|
31
59
|
preferences: {
|
|
32
60
|
"*": []
|
|
@@ -34,7 +62,7 @@ class ConfigBuilder {
|
|
|
34
62
|
},
|
|
35
63
|
integrations: [],
|
|
36
64
|
integrationsDependencies: [],
|
|
37
|
-
distDir:
|
|
65
|
+
distDir: DEFAULT_ECOPAGES_DIST_DIR,
|
|
38
66
|
defaultMetadata: {
|
|
39
67
|
title: "Ecopages",
|
|
40
68
|
description: "This is a static site generated with Ecopages"
|
|
@@ -45,6 +73,7 @@ class ConfigBuilder {
|
|
|
45
73
|
config: "",
|
|
46
74
|
componentsDir: "",
|
|
47
75
|
distDir: "",
|
|
76
|
+
workDir: "",
|
|
48
77
|
includesDir: "",
|
|
49
78
|
layoutsDir: "",
|
|
50
79
|
pagesDir: "",
|
|
@@ -55,7 +84,9 @@ class ConfigBuilder {
|
|
|
55
84
|
error404TemplatePath: ""
|
|
56
85
|
},
|
|
57
86
|
processors: /* @__PURE__ */ new Map(),
|
|
58
|
-
loaders: /* @__PURE__ */ new Map()
|
|
87
|
+
loaders: /* @__PURE__ */ new Map(),
|
|
88
|
+
sourceTransforms: /* @__PURE__ */ new Map(),
|
|
89
|
+
workDir: DEFAULT_ECOPAGES_WORK_DIR
|
|
59
90
|
};
|
|
60
91
|
/**
|
|
61
92
|
* Sets the base URL for the application.
|
|
@@ -79,6 +110,18 @@ class ConfigBuilder {
|
|
|
79
110
|
this.config.rootDir = rootDir;
|
|
80
111
|
return this;
|
|
81
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Sets which runtime path owns build execution for the finalized app config.
|
|
115
|
+
*
|
|
116
|
+
* @remarks
|
|
117
|
+
* Bun-native remains the default. Vite-host ownership should be selected only
|
|
118
|
+
* for host-driven compatibility flows where core must not silently fall back to
|
|
119
|
+
* Bun build execution.
|
|
120
|
+
*/
|
|
121
|
+
setBuildOwnership(buildOwnership) {
|
|
122
|
+
this.buildOwnership = buildOwnership;
|
|
123
|
+
return this;
|
|
124
|
+
}
|
|
82
125
|
/**
|
|
83
126
|
* Sets the source directory relative to the root directory.
|
|
84
127
|
* This directory contains all the source files for the application.
|
|
@@ -145,27 +188,6 @@ class ConfigBuilder {
|
|
|
145
188
|
this.config.publicDir = publicDir;
|
|
146
189
|
return this;
|
|
147
190
|
}
|
|
148
|
-
/**
|
|
149
|
-
* Sets the templates used for includes.
|
|
150
|
-
* These templates are used to build the HTML structure of pages.
|
|
151
|
-
*
|
|
152
|
-
* @param includesTemplates - An object containing the template file names
|
|
153
|
-
* @returns The ConfigBuilder instance for method chaining
|
|
154
|
-
*/
|
|
155
|
-
setIncludesTemplates(includesTemplates) {
|
|
156
|
-
this.config.includesTemplates = includesTemplates;
|
|
157
|
-
return this;
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Sets the template file for the 404 error page.
|
|
161
|
-
*
|
|
162
|
-
* @param error404Template - The file name of the 404 error template (default: '404.ghtml.ts')
|
|
163
|
-
* @returns The ConfigBuilder instance for method chaining
|
|
164
|
-
*/
|
|
165
|
-
setError404Template(error404Template) {
|
|
166
|
-
this.config.error404Template = error404Template;
|
|
167
|
-
return this;
|
|
168
|
-
}
|
|
169
191
|
/**
|
|
170
192
|
* Sets the robots.txt configuration.
|
|
171
193
|
* This determines which paths are allowed/disallowed for search engines.
|
|
@@ -191,13 +213,28 @@ class ConfigBuilder {
|
|
|
191
213
|
/**
|
|
192
214
|
* Sets the output directory for the built application.
|
|
193
215
|
*
|
|
194
|
-
* @param distDir - The distribution directory name (default: '
|
|
216
|
+
* @param distDir - The distribution directory name (default: 'dist')
|
|
195
217
|
* @returns The ConfigBuilder instance for method chaining
|
|
196
218
|
*/
|
|
197
219
|
setDistDir(distDir) {
|
|
198
220
|
this.config.distDir = distDir;
|
|
199
221
|
return this;
|
|
200
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Sets the internal work directory for runtime-only artifacts.
|
|
225
|
+
*
|
|
226
|
+
* @remarks
|
|
227
|
+
* Use this when deployable output should stay clean while Ecopages still
|
|
228
|
+
* needs a separate workspace for server transpilation caches, runtime
|
|
229
|
+
* manifests, and other internal build products.
|
|
230
|
+
*
|
|
231
|
+
* @param workDir - The internal work directory name
|
|
232
|
+
* @returns The ConfigBuilder instance for method chaining
|
|
233
|
+
*/
|
|
234
|
+
setWorkDir(workDir) {
|
|
235
|
+
this.config.workDir = workDir;
|
|
236
|
+
return this;
|
|
237
|
+
}
|
|
201
238
|
/**
|
|
202
239
|
* Sets the default metadata for pages.
|
|
203
240
|
* This is used when a page doesn't specify its own metadata.
|
|
@@ -264,6 +301,17 @@ class ConfigBuilder {
|
|
|
264
301
|
}
|
|
265
302
|
return this;
|
|
266
303
|
}
|
|
304
|
+
/**
|
|
305
|
+
* Sets the source transforms to use for transform-first bundlers such as Vite.
|
|
306
|
+
* This replaces any existing source transforms.
|
|
307
|
+
*/
|
|
308
|
+
setSourceTransforms(sourceTransforms) {
|
|
309
|
+
this.config.sourceTransforms.clear();
|
|
310
|
+
for (const sourceTransform of sourceTransforms) {
|
|
311
|
+
this.addSourceTransform(sourceTransform.name, sourceTransform);
|
|
312
|
+
}
|
|
313
|
+
return this;
|
|
314
|
+
}
|
|
267
315
|
/**
|
|
268
316
|
* Adds a loader to the application.
|
|
269
317
|
*
|
|
@@ -279,6 +327,18 @@ class ConfigBuilder {
|
|
|
279
327
|
this.config.loaders.set(name, loader);
|
|
280
328
|
return this;
|
|
281
329
|
}
|
|
330
|
+
/**
|
|
331
|
+
* Adds a source transform to the application.
|
|
332
|
+
*
|
|
333
|
+
* @throws Error if a source transform with the same name already exists.
|
|
334
|
+
*/
|
|
335
|
+
addSourceTransform(name, sourceTransform) {
|
|
336
|
+
if (this.config.sourceTransforms.has(name)) {
|
|
337
|
+
throw new Error(CONFIG_BUILDER_ERRORS.duplicateLoaderName(name));
|
|
338
|
+
}
|
|
339
|
+
this.config.sourceTransforms.set(name, sourceTransform);
|
|
340
|
+
return this;
|
|
341
|
+
}
|
|
282
342
|
/**
|
|
283
343
|
* Sets the cache configuration for ISR and page caching.
|
|
284
344
|
*
|
|
@@ -294,35 +354,44 @@ class ConfigBuilder {
|
|
|
294
354
|
return this;
|
|
295
355
|
}
|
|
296
356
|
createAbsolutePaths(config) {
|
|
297
|
-
const {
|
|
298
|
-
srcDir,
|
|
299
|
-
componentsDir,
|
|
300
|
-
includesDir,
|
|
301
|
-
layoutsDir,
|
|
302
|
-
pagesDir,
|
|
303
|
-
publicDir,
|
|
304
|
-
distDir,
|
|
305
|
-
includesTemplates,
|
|
306
|
-
error404Template
|
|
307
|
-
} = config;
|
|
357
|
+
const { srcDir, componentsDir, includesDir, layoutsDir, pagesDir, publicDir, distDir, workDir } = config;
|
|
308
358
|
const projectDir = config.rootDir;
|
|
309
359
|
const absoluteSrcDir = path.resolve(projectDir, srcDir);
|
|
310
360
|
const absoluteDistDir = path.resolve(projectDir, distDir);
|
|
361
|
+
const absoluteWorkDir = path.resolve(projectDir, workDir);
|
|
362
|
+
const absoluteIncludesDir = path.join(absoluteSrcDir, includesDir);
|
|
363
|
+
const absolutePagesDir = path.join(absoluteSrcDir, pagesDir);
|
|
311
364
|
this.config.absolutePaths = {
|
|
312
365
|
config: path.join(projectDir, "eco.config.ts"),
|
|
313
366
|
projectDir,
|
|
314
367
|
srcDir: absoluteSrcDir,
|
|
315
368
|
distDir: absoluteDistDir,
|
|
369
|
+
workDir: absoluteWorkDir,
|
|
316
370
|
componentsDir: path.join(absoluteSrcDir, componentsDir),
|
|
317
|
-
includesDir:
|
|
371
|
+
includesDir: absoluteIncludesDir,
|
|
318
372
|
layoutsDir: path.join(absoluteSrcDir, layoutsDir),
|
|
319
|
-
pagesDir:
|
|
373
|
+
pagesDir: absolutePagesDir,
|
|
320
374
|
publicDir: path.join(absoluteSrcDir, publicDir),
|
|
321
|
-
htmlTemplatePath:
|
|
322
|
-
|
|
375
|
+
htmlTemplatePath: this.resolveSemanticTemplatePath({
|
|
376
|
+
dirPath: absoluteIncludesDir,
|
|
377
|
+
basename: "html"
|
|
378
|
+
}),
|
|
379
|
+
error404TemplatePath: this.resolveSemanticTemplatePath({
|
|
380
|
+
dirPath: absolutePagesDir,
|
|
381
|
+
basename: "404"
|
|
382
|
+
})
|
|
323
383
|
};
|
|
324
384
|
return this;
|
|
325
385
|
}
|
|
386
|
+
resolveSemanticTemplatePath({ dirPath, basename }) {
|
|
387
|
+
const extensions = this.config.templatesExt.length > 0 ? this.config.templatesExt : [".ghtml.ts"];
|
|
388
|
+
const matches = extensions.map((extension) => path.join(dirPath, `${basename}${extension}`)).filter((candidate) => fileSystem.exists(candidate));
|
|
389
|
+
invariant(matches.length <= 1, CONFIG_BUILDER_ERRORS.duplicateSemanticTemplate(basename, matches));
|
|
390
|
+
if (matches.length === 1) {
|
|
391
|
+
return matches[0];
|
|
392
|
+
}
|
|
393
|
+
return path.join(dirPath, `${basename}${extensions[0]}`);
|
|
394
|
+
}
|
|
326
395
|
createIntegrationTemplatesExt(integrations) {
|
|
327
396
|
const integrationName = integrations.map((integration) => integration.name);
|
|
328
397
|
const uniqueName = new Set(integrationName);
|
|
@@ -345,11 +414,138 @@ class ConfigBuilder {
|
|
|
345
414
|
processor.setContext(this.config);
|
|
346
415
|
}
|
|
347
416
|
}
|
|
417
|
+
validateRuntimeCapabilities() {
|
|
418
|
+
const runtimeEnvironment = this.detectRuntimeEnvironment();
|
|
419
|
+
const contributors = [
|
|
420
|
+
...this.config.integrations.map((integration) => ({
|
|
421
|
+
kind: "integration",
|
|
422
|
+
name: integration.name,
|
|
423
|
+
runtimeCapability: integration.runtimeCapability
|
|
424
|
+
})),
|
|
425
|
+
...Array.from(this.config.processors.values(), (processor) => ({
|
|
426
|
+
kind: "processor",
|
|
427
|
+
name: processor.name,
|
|
428
|
+
runtimeCapability: processor.runtimeCapability
|
|
429
|
+
}))
|
|
430
|
+
];
|
|
431
|
+
for (const contributor of contributors) {
|
|
432
|
+
this.validateRuntimeCapability(contributor, runtimeEnvironment);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
validateRuntimeCapability(contributor, environment) {
|
|
436
|
+
const declaration = contributor.runtimeCapability;
|
|
437
|
+
if (!declaration) {
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
for (const tag of declaration.tags) {
|
|
441
|
+
if (environment.supportedTags.has(tag)) {
|
|
442
|
+
continue;
|
|
443
|
+
}
|
|
444
|
+
throw new Error(
|
|
445
|
+
CONFIG_BUILDER_ERRORS.incompatibleRuntimeCapability(
|
|
446
|
+
contributor.kind,
|
|
447
|
+
contributor.name,
|
|
448
|
+
environment.runtime,
|
|
449
|
+
this.describeUnsupportedRuntimeTag(tag)
|
|
450
|
+
)
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
if (!declaration.minRuntimeVersion) {
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
const minVersion = this.parseVersion(declaration.minRuntimeVersion);
|
|
457
|
+
if (!minVersion) {
|
|
458
|
+
throw new Error(
|
|
459
|
+
CONFIG_BUILDER_ERRORS.invalidRuntimeVersion(
|
|
460
|
+
contributor.kind,
|
|
461
|
+
contributor.name,
|
|
462
|
+
declaration.minRuntimeVersion
|
|
463
|
+
)
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
const currentVersion = this.parseVersion(environment.version);
|
|
467
|
+
if (!currentVersion) {
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
if (this.compareVersions(currentVersion, minVersion) >= 0) {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
throw new Error(
|
|
474
|
+
CONFIG_BUILDER_ERRORS.unsupportedRuntimeVersion(
|
|
475
|
+
contributor.kind,
|
|
476
|
+
contributor.name,
|
|
477
|
+
environment.runtime,
|
|
478
|
+
environment.version,
|
|
479
|
+
declaration.minRuntimeVersion
|
|
480
|
+
)
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
detectRuntimeEnvironment() {
|
|
484
|
+
const bunVersion = this.getBunVersion();
|
|
485
|
+
if (bunVersion) {
|
|
486
|
+
return {
|
|
487
|
+
runtime: "bun",
|
|
488
|
+
version: bunVersion,
|
|
489
|
+
supportedTags: /* @__PURE__ */ new Set([
|
|
490
|
+
"bun-only",
|
|
491
|
+
"node-compatible",
|
|
492
|
+
"requires-native-bun-api",
|
|
493
|
+
"requires-node-builtins"
|
|
494
|
+
])
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
return {
|
|
498
|
+
runtime: "node",
|
|
499
|
+
version: process.versions.node,
|
|
500
|
+
supportedTags: /* @__PURE__ */ new Set(["node-compatible", "requires-node-builtins"])
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
getBunVersion() {
|
|
504
|
+
const bun = globalThis;
|
|
505
|
+
return typeof bun.Bun?.version === "string" ? bun.Bun.version : void 0;
|
|
506
|
+
}
|
|
507
|
+
describeUnsupportedRuntimeTag(tag) {
|
|
508
|
+
switch (tag) {
|
|
509
|
+
case "bun-only":
|
|
510
|
+
return "it is Bun-only";
|
|
511
|
+
case "requires-native-bun-api":
|
|
512
|
+
return "it requires the native Bun API";
|
|
513
|
+
case "requires-node-builtins":
|
|
514
|
+
return "it requires Node builtins";
|
|
515
|
+
case "node-compatible":
|
|
516
|
+
return "it requires a Node-compatible runtime";
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
parseVersion(version) {
|
|
520
|
+
const normalized = version.trim().replace(/^v/i, "");
|
|
521
|
+
if (!/^\d+(?:\.\d+)*$/.test(normalized)) {
|
|
522
|
+
return void 0;
|
|
523
|
+
}
|
|
524
|
+
return normalized.split(".").map((segment) => Number(segment));
|
|
525
|
+
}
|
|
526
|
+
compareVersions(left, right) {
|
|
527
|
+
const maxLength = Math.max(left.length, right.length);
|
|
528
|
+
for (let index = 0; index < maxLength; index += 1) {
|
|
529
|
+
const leftValue = left[index] ?? 0;
|
|
530
|
+
const rightValue = right[index] ?? 0;
|
|
531
|
+
if (leftValue > rightValue) {
|
|
532
|
+
return 1;
|
|
533
|
+
}
|
|
534
|
+
if (leftValue < rightValue) {
|
|
535
|
+
return -1;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
return 0;
|
|
539
|
+
}
|
|
348
540
|
/**
|
|
349
541
|
* Initializes default loaders that are required for EcoPages to function.
|
|
350
542
|
* This includes the eco-component-meta-plugin which auto-injects __eco metadata into component configs.
|
|
351
543
|
*/
|
|
352
544
|
async initializeDefaultLoaders() {
|
|
545
|
+
const componentMetaTransform = createEcoComponentMetaTransform({ config: this.config });
|
|
546
|
+
if (!this.config.sourceTransforms.has(componentMetaTransform.name)) {
|
|
547
|
+
this.config.sourceTransforms.set(componentMetaTransform.name, componentMetaTransform);
|
|
548
|
+
}
|
|
353
549
|
const componentMetaPlugin = createEcoComponentMetaPlugin({ config: this.config });
|
|
354
550
|
if (!this.config.loaders.has(componentMetaPlugin.name)) {
|
|
355
551
|
this.config.loaders.set(componentMetaPlugin.name, componentMetaPlugin);
|
|
@@ -379,10 +575,25 @@ class ConfigBuilder {
|
|
|
379
575
|
if (!this.config.integrations.some((integration) => integration.name === GHTML_PLUGIN_NAME)) {
|
|
380
576
|
this.config.integrations.push(ghtmlPlugin());
|
|
381
577
|
}
|
|
382
|
-
this.createAbsolutePaths(this.config);
|
|
383
578
|
this.createIntegrationTemplatesExt(this.config.integrations);
|
|
579
|
+
this.createAbsolutePaths(this.config);
|
|
384
580
|
await this.initializeDefaultLoaders();
|
|
385
581
|
this.initializeProcessors();
|
|
582
|
+
this.validateRuntimeCapabilities();
|
|
583
|
+
const buildAdapter = createBuildAdapter({ ownership: this.buildOwnership });
|
|
584
|
+
setAppBuildAdapter(this.config, buildAdapter);
|
|
585
|
+
updateAppBuildManifest(this.config, await collectConfiguredAppBuildManifestContributions(this.config));
|
|
586
|
+
setAppServerInvalidationState(this.config, new CounterServerInvalidationState());
|
|
587
|
+
setAppEntrypointDependencyGraph(this.config, new NoopEntrypointDependencyGraph());
|
|
588
|
+
setAppRuntimeSpecifierRegistry(this.config, new InMemoryRuntimeSpecifierRegistry());
|
|
589
|
+
setAppBuildExecutor(
|
|
590
|
+
this.config,
|
|
591
|
+
createAppBuildExecutor({
|
|
592
|
+
development: false,
|
|
593
|
+
adapter: buildAdapter,
|
|
594
|
+
getPlugins: () => getAppServerBuildPlugins(this.config)
|
|
595
|
+
})
|
|
596
|
+
);
|
|
386
597
|
return this.config;
|
|
387
598
|
}
|
|
388
599
|
}
|
|
@@ -30,3 +30,16 @@ export declare const GENERATED_BASE_PATHS: {
|
|
|
30
30
|
};
|
|
31
31
|
export declare const DEFAULT_ECOPAGES_PORT = 3000;
|
|
32
32
|
export declare const DEFAULT_ECOPAGES_HOSTNAME = "localhost";
|
|
33
|
+
/**
|
|
34
|
+
* Default directory used for deployable output.
|
|
35
|
+
*/
|
|
36
|
+
export declare const DEFAULT_ECOPAGES_DIST_DIR = "dist";
|
|
37
|
+
/**
|
|
38
|
+
* Default internal working directory used for runtime-only artifacts.
|
|
39
|
+
*
|
|
40
|
+
* @remarks
|
|
41
|
+
* This directory is a local tool workspace and is not intended for deployment.
|
|
42
|
+
* It owns transpiled server modules, runtime manifests, and processor caches
|
|
43
|
+
* so the export directory can remain a clean deployable tree.
|
|
44
|
+
*/
|
|
45
|
+
export declare const DEFAULT_ECOPAGES_WORK_DIR = ".eco";
|
|
@@ -10,9 +10,13 @@ const GENERATED_BASE_PATHS = {
|
|
|
10
10
|
};
|
|
11
11
|
const DEFAULT_ECOPAGES_PORT = 3e3;
|
|
12
12
|
const DEFAULT_ECOPAGES_HOSTNAME = "localhost";
|
|
13
|
+
const DEFAULT_ECOPAGES_DIST_DIR = "dist";
|
|
14
|
+
const DEFAULT_ECOPAGES_WORK_DIR = ".eco";
|
|
13
15
|
export {
|
|
16
|
+
DEFAULT_ECOPAGES_DIST_DIR,
|
|
14
17
|
DEFAULT_ECOPAGES_HOSTNAME,
|
|
15
18
|
DEFAULT_ECOPAGES_PORT,
|
|
19
|
+
DEFAULT_ECOPAGES_WORK_DIR,
|
|
16
20
|
GENERATED_BASE_PATHS,
|
|
17
21
|
IS_BUN,
|
|
18
22
|
RESOLVED_ASSETS_DIR,
|
package/src/declarations.d.ts
CHANGED
|
@@ -1,22 +1,27 @@
|
|
|
1
|
-
import type { EcoPagesAppConfig } from './internal-types';
|
|
1
|
+
import type { EcoPagesAppConfig } from './types/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/dev/sc-server.d.ts
CHANGED
package/src/dev/sc-server.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { extname, join } from "node:path";
|
|
2
|
-
import { STATUS_MESSAGE } from "../constants.js";
|
|
2
|
+
import { STATUS_MESSAGE } from "../config/constants.js";
|
|
3
3
|
import { fileSystem } from "@ecopages/file-system";
|
|
4
4
|
import { ServerUtils } from "../utils/server-utils.module.js";
|
|
5
5
|
import { getRequiredBunRuntime } from "../utils/runtime.js";
|
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
|