@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
|
@@ -9,9 +9,15 @@ import { fileSystem } from '@ecopages/file-system';
|
|
|
9
9
|
import { SharedServerAdapter } from '../shared/server-adapter.ts';
|
|
10
10
|
import type { ServerAdapterResult } from '../abstract/server-adapter.ts';
|
|
11
11
|
import { ApiResponseBuilder } from '../shared/api-response.ts';
|
|
12
|
+
import { installSharedRuntimeBuildExecutor } from '../shared/runtime-bootstrap.ts';
|
|
12
13
|
|
|
13
14
|
import { ServerRouteHandler, type ServerRouteHandlerParams } from '../shared/server-route-handler.ts';
|
|
14
15
|
import { ServerStaticBuilder, type ServerStaticBuilderParams } from '../shared/server-static-builder';
|
|
16
|
+
import {
|
|
17
|
+
injectHmrRuntimeIntoHtmlResponse,
|
|
18
|
+
isHtmlResponse,
|
|
19
|
+
shouldInjectHmrHtmlResponse,
|
|
20
|
+
} from '../shared/hmr-html-response';
|
|
15
21
|
import { ClientBridge } from './client-bridge';
|
|
16
22
|
import { HmrManager } from './hmr-manager';
|
|
17
23
|
import { ServerLifecycle } from './server-lifecycle.ts';
|
|
@@ -108,15 +114,14 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
|
|
|
108
114
|
* Only injects in watch mode when HMR manager is enabled.
|
|
109
115
|
*/
|
|
110
116
|
private shouldInjectHmrScript(): boolean {
|
|
111
|
-
return this.options?.watch === true
|
|
117
|
+
return shouldInjectHmrHtmlResponse(this.options?.watch === true, this.hmrManager);
|
|
112
118
|
}
|
|
113
119
|
|
|
114
120
|
/**
|
|
115
121
|
* Checks if a response contains HTML content.
|
|
116
122
|
*/
|
|
117
123
|
private isHtmlResponse(response: Response): boolean {
|
|
118
|
-
|
|
119
|
-
return contentType !== null && contentType.startsWith('text/html');
|
|
124
|
+
return isHtmlResponse(response);
|
|
120
125
|
}
|
|
121
126
|
|
|
122
127
|
/**
|
|
@@ -125,18 +130,7 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
|
|
|
125
130
|
*/
|
|
126
131
|
private async maybeInjectHmrScript(response: Response): Promise<Response> {
|
|
127
132
|
if (this.shouldInjectHmrScript() && this.isHtmlResponse(response)) {
|
|
128
|
-
|
|
129
|
-
const hmrScript = `<script type="module">import '/_hmr_runtime.js';</script>`;
|
|
130
|
-
const updatedHtml = html.replace(/<\/html>/i, `${hmrScript}</html>`);
|
|
131
|
-
|
|
132
|
-
const headers = new Headers(response.headers);
|
|
133
|
-
headers.delete('Content-Length');
|
|
134
|
-
|
|
135
|
-
return new Response(updatedHtml, {
|
|
136
|
-
status: response.status,
|
|
137
|
-
statusText: response.statusText,
|
|
138
|
-
headers,
|
|
139
|
-
});
|
|
133
|
+
return injectHmrRuntimeIntoHtmlResponse(response);
|
|
140
134
|
}
|
|
141
135
|
return response;
|
|
142
136
|
}
|
|
@@ -146,6 +140,10 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
|
|
|
146
140
|
* Delegates to ServerLifecycle for setup.
|
|
147
141
|
*/
|
|
148
142
|
public async initialize(): Promise<void> {
|
|
143
|
+
installSharedRuntimeBuildExecutor(this.appConfig, {
|
|
144
|
+
development: this.options?.watch === true,
|
|
145
|
+
});
|
|
146
|
+
|
|
149
147
|
this.bridge = this.bridgeFactory ?? new ClientBridge();
|
|
150
148
|
this.hmrManager = this.hmrManagerFactory ?? new HmrManager({ appConfig: this.appConfig, bridge: this.bridge });
|
|
151
149
|
this.lifecycle =
|
|
@@ -163,6 +161,7 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
|
|
|
163
161
|
appConfig: this.appConfig,
|
|
164
162
|
staticSiteGenerator: this.staticSiteGenerator,
|
|
165
163
|
serveOptions: this.serveOptions,
|
|
164
|
+
apiHandlers: this.apiHandlers,
|
|
166
165
|
};
|
|
167
166
|
|
|
168
167
|
this.staticBuilder = this.staticBuilderFactory
|
|
@@ -176,22 +175,24 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
|
|
|
176
175
|
* Refreshes the router routes during watch mode.
|
|
177
176
|
*/
|
|
178
177
|
private async refreshRouterRoutes(): Promise<void> {
|
|
179
|
-
if (this.serverInstance
|
|
180
|
-
try {
|
|
181
|
-
await this.initSharedRouter();
|
|
182
|
-
this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager);
|
|
183
|
-
const options = this.getServerOptions({ enableHmr: true });
|
|
184
|
-
this.serverInstance.reload(options as BunNativeServeOptions);
|
|
185
|
-
appLogger.debug('Server routes updated with dynamic routes');
|
|
186
|
-
} catch (error) {
|
|
187
|
-
if (error instanceof Error) {
|
|
188
|
-
this.hmrManager.broadcast({ type: 'error', message: error.message });
|
|
189
|
-
appLogger.error('Failed to refresh router routes:', error);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
} else {
|
|
178
|
+
if (!this.serverInstance || typeof this.serverInstance.reload !== 'function') {
|
|
193
179
|
appLogger.error('Server instance is not available for reloading');
|
|
180
|
+
return;
|
|
194
181
|
}
|
|
182
|
+
|
|
183
|
+
await this.createSharedWatchRefreshCallback({
|
|
184
|
+
staticRoutes: this.staticRoutes,
|
|
185
|
+
hmrManager: this.hmrManager,
|
|
186
|
+
onRoutesReady: () => {
|
|
187
|
+
const options = this.getServerOptions({ enableHmr: true });
|
|
188
|
+
this.serverInstance!.reload(options as BunNativeServeOptions);
|
|
189
|
+
appLogger.debug('Server routes updated with dynamic routes');
|
|
190
|
+
},
|
|
191
|
+
onError: (error) => {
|
|
192
|
+
this.hmrManager.broadcast({ type: 'error', message: error.message });
|
|
193
|
+
appLogger.error('Failed to refresh router routes:', error);
|
|
194
|
+
},
|
|
195
|
+
})();
|
|
195
196
|
}
|
|
196
197
|
|
|
197
198
|
private async watch(): Promise<void> {
|
|
@@ -344,8 +345,10 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
|
|
|
344
345
|
*/
|
|
345
346
|
public async buildStatic(options?: { preview?: boolean }): Promise<void> {
|
|
346
347
|
if (!this.fullyInitialized) {
|
|
347
|
-
await this.
|
|
348
|
-
|
|
348
|
+
await this.initializeSharedRouteHandling({
|
|
349
|
+
staticRoutes: this.staticRoutes,
|
|
350
|
+
hmrManager: this.hmrManager,
|
|
351
|
+
});
|
|
349
352
|
}
|
|
350
353
|
|
|
351
354
|
await this.staticBuilder.build(options, {
|
|
@@ -382,8 +385,10 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
|
|
|
382
385
|
this.serverInstance = server;
|
|
383
386
|
appLogger.debug('Completing server initialization with dynamic routes');
|
|
384
387
|
|
|
385
|
-
await this.
|
|
386
|
-
|
|
388
|
+
await this.initializeSharedRouteHandling({
|
|
389
|
+
staticRoutes: this.staticRoutes,
|
|
390
|
+
hmrManager: this.hmrManager,
|
|
391
|
+
});
|
|
387
392
|
|
|
388
393
|
this.fullyInitialized = true;
|
|
389
394
|
|
|
@@ -422,7 +427,9 @@ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams
|
|
|
422
427
|
hmrManager: this.hmrManager,
|
|
423
428
|
});
|
|
424
429
|
|
|
425
|
-
//
|
|
430
|
+
// Filesystem page responses are wrapped by ServerRouteHandler. This adapter-
|
|
431
|
+
// level pass only covers HTML returned by explicit API handlers, which bypass
|
|
432
|
+
// that route-layer wrapper and would otherwise miss the dev HMR runtime.
|
|
426
433
|
return await this.maybeInjectHmrScript(response);
|
|
427
434
|
}
|
|
428
435
|
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
1
|
import { getBunRuntime } from '../../utils/runtime.ts';
|
|
3
|
-
import { RESOLVED_ASSETS_DIR } from '../../constants';
|
|
4
|
-
import { defaultBuildAdapter } from '../../build/build-adapter.ts';
|
|
5
2
|
import { appLogger } from '../../global/app-logger';
|
|
6
3
|
import type { EcoPagesAppConfig } from '../../internal-types';
|
|
7
4
|
import type { EcoBuildPlugin } from '../../build/build-types.ts';
|
|
8
|
-
import { fileSystem } from '@ecopages/file-system';
|
|
9
5
|
import { StaticSiteGenerator } from '../../static-site-generator/static-site-generator';
|
|
10
|
-
import { ProjectWatcher } from '../../watchers/project-watcher';
|
|
11
6
|
import type { ClientBridge } from './client-bridge';
|
|
12
7
|
import type { HmrManager } from './hmr-manager';
|
|
8
|
+
import {
|
|
9
|
+
bindSharedRuntimeHmrManager,
|
|
10
|
+
initializeSharedRuntimePlugins,
|
|
11
|
+
prepareSharedRuntimePublicDir,
|
|
12
|
+
startSharedProjectWatching,
|
|
13
|
+
} from '../shared/runtime-bootstrap.ts';
|
|
13
14
|
|
|
14
15
|
export interface WatcherCallbacks {
|
|
15
16
|
refreshRouterRoutesCallback: () => Promise<void>;
|
|
@@ -23,7 +24,13 @@ export interface ServerLifecycleParams {
|
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
|
-
*
|
|
27
|
+
* Coordinates Bun-runtime server startup side effects for one app instance.
|
|
28
|
+
*
|
|
29
|
+
* @remarks
|
|
30
|
+
* This class keeps runtime-only concerns together: build-runtime bootstrapping,
|
|
31
|
+
* Bun loader registration, public asset preparation, plugin setup, and file
|
|
32
|
+
* watching. Core config/build state is expected to already be finalized before
|
|
33
|
+
* this lifecycle runs.
|
|
27
34
|
*/
|
|
28
35
|
export class ServerLifecycle {
|
|
29
36
|
private readonly appConfig: EcoPagesAppConfig;
|
|
@@ -40,94 +47,55 @@ export class ServerLifecycle {
|
|
|
40
47
|
}
|
|
41
48
|
|
|
42
49
|
/**
|
|
43
|
-
* Initializes the
|
|
44
|
-
*
|
|
50
|
+
* Initializes the runtime services that Bun startup depends on.
|
|
51
|
+
*
|
|
52
|
+
* @returns The static-site generator instance reused by the adapter.
|
|
45
53
|
*/
|
|
46
54
|
async initialize(): Promise<StaticSiteGenerator> {
|
|
47
55
|
this.staticSiteGenerator = new StaticSiteGenerator({ appConfig: this.appConfig });
|
|
48
56
|
await this.hmrManager.buildRuntime();
|
|
49
57
|
|
|
50
58
|
this.setupLoaders();
|
|
51
|
-
this.
|
|
59
|
+
prepareSharedRuntimePublicDir(this.appConfig);
|
|
52
60
|
|
|
53
61
|
return this.staticSiteGenerator;
|
|
54
62
|
}
|
|
55
63
|
|
|
56
64
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
65
|
+
* Registers config-owned build loaders with Bun's runtime plugin API.
|
|
66
|
+
*
|
|
67
|
+
* @remarks
|
|
68
|
+
* Bun remains responsible only for transport-level plugin registration here.
|
|
69
|
+
* Loader ownership and composition were already finalized during config build.
|
|
59
70
|
*/
|
|
60
71
|
setupLoaders(): void {
|
|
61
72
|
const loaders = this.appConfig.loaders;
|
|
62
73
|
for (const loader of loaders.values()) {
|
|
63
|
-
defaultBuildAdapter.registerPlugin(loader);
|
|
64
74
|
getBunRuntime()?.plugin(loader as any);
|
|
65
75
|
}
|
|
66
76
|
}
|
|
67
77
|
|
|
68
78
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
try {
|
|
74
|
-
const srcPublicDir = path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.publicDir);
|
|
75
|
-
|
|
76
|
-
if (fileSystem.exists(srcPublicDir)) {
|
|
77
|
-
fileSystem.copyDir(srcPublicDir, path.join(this.appConfig.rootDir, this.appConfig.distDir));
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
fileSystem.ensureDir(path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
|
|
81
|
-
} catch (error) {
|
|
82
|
-
appLogger.error(
|
|
83
|
-
`Failed to copy public directory: ${error instanceof Error ? error.message : String(error)}`,
|
|
84
|
-
);
|
|
85
|
-
throw error;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Initializes processors and integrations.
|
|
91
|
-
* @param options.watch - Whether watch mode is enabled
|
|
79
|
+
* Runs runtime-only processor and integration setup for this Bun app session.
|
|
80
|
+
*
|
|
81
|
+
* @param options.watch Whether watch mode is enabled.
|
|
82
|
+
* @returns The browser build plugins visible to HMR after runtime setup.
|
|
92
83
|
*/
|
|
93
84
|
async initializePlugins(options?: { watch?: boolean }): Promise<EcoBuildPlugin[]> {
|
|
94
85
|
try {
|
|
95
86
|
const hmrEnabled = !!options?.watch;
|
|
96
87
|
this.hmrManager.setEnabled(hmrEnabled);
|
|
97
88
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
for (const plugin of processor.plugins) {
|
|
104
|
-
defaultBuildAdapter.registerPlugin(plugin);
|
|
105
|
-
getBunRuntime()?.plugin(plugin as any);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
if (processor.buildPlugins) {
|
|
109
|
-
processorBuildPlugins.push(...processor.buildPlugins);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
const integrationPromises = this.appConfig.integrations.map(async (integration) => {
|
|
114
|
-
integration.setConfig(this.appConfig);
|
|
115
|
-
integration.setRuntimeOrigin(this.runtimeOrigin);
|
|
116
|
-
integration.setHmrManager(this.hmrManager);
|
|
117
|
-
await integration.setup();
|
|
118
|
-
|
|
119
|
-
for (const plugin of integration.plugins) {
|
|
120
|
-
defaultBuildAdapter.registerPlugin(plugin);
|
|
89
|
+
await initializeSharedRuntimePlugins({
|
|
90
|
+
appConfig: this.appConfig,
|
|
91
|
+
runtimeOrigin: this.runtimeOrigin,
|
|
92
|
+
hmrManager: this.hmrManager,
|
|
93
|
+
onRuntimePlugin: (plugin) => {
|
|
121
94
|
getBunRuntime()?.plugin(plugin as any);
|
|
122
|
-
}
|
|
95
|
+
},
|
|
123
96
|
});
|
|
124
97
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const loaderPlugins = Array.from(this.appConfig.loaders.values());
|
|
128
|
-
const allBuildPlugins = [...loaderPlugins, ...processorBuildPlugins];
|
|
129
|
-
this.hmrManager.setPlugins(allBuildPlugins);
|
|
130
|
-
return allBuildPlugins;
|
|
98
|
+
return bindSharedRuntimeHmrManager(this.appConfig, this.hmrManager);
|
|
131
99
|
} catch (error) {
|
|
132
100
|
appLogger.error(`Failed to initialize plugins: ${error instanceof Error ? error.message : String(error)}`);
|
|
133
101
|
throw error;
|
|
@@ -135,19 +103,21 @@ export class ServerLifecycle {
|
|
|
135
103
|
}
|
|
136
104
|
|
|
137
105
|
/**
|
|
138
|
-
* Starts file watching
|
|
106
|
+
* Starts file watching and wires change events back into the adapter refresh
|
|
107
|
+
* callback.
|
|
139
108
|
*/
|
|
140
109
|
async startWatching(callbacks: WatcherCallbacks): Promise<void> {
|
|
141
|
-
|
|
142
|
-
|
|
110
|
+
await startSharedProjectWatching({
|
|
111
|
+
appConfig: this.appConfig,
|
|
143
112
|
refreshRouterRoutesCallback: callbacks.refreshRouterRoutesCallback,
|
|
144
113
|
hmrManager: this.hmrManager,
|
|
145
114
|
bridge: this.bridge,
|
|
146
115
|
});
|
|
147
|
-
|
|
148
|
-
await watcherInstance.createWatcherSubscription();
|
|
149
116
|
}
|
|
150
117
|
|
|
118
|
+
/**
|
|
119
|
+
* Returns the static-site generator created during initialization.
|
|
120
|
+
*/
|
|
151
121
|
getStaticSiteGenerator(): StaticSiteGenerator {
|
|
152
122
|
return this.staticSiteGenerator;
|
|
153
123
|
}
|
package/src/adapters/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { EcopagesApp, createApp } from './bun/create-app.ts';
|
|
2
|
-
export { defineApiHandler, defineGroupHandler } from './
|
|
2
|
+
export { defineApiHandler, defineGroupHandler, type GroupHandler } from './shared/define-api-handler.ts';
|
|
3
3
|
export { NodeServerAdapter, createNodeServerAdapter } from './node/server-adapter.ts';
|
|
4
4
|
export { EcopagesApp as NodeAdapterEcopagesApp, createNodeApp } from './node/create-app.ts';
|
|
5
5
|
export type { NodeServerAdapterParams, NodeServerAdapterResult } from './node/server-adapter.ts';
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { test } from 'vitest';
|
|
6
|
+
import {
|
|
7
|
+
createNodeBootstrapPlugin,
|
|
8
|
+
getNodeUnsupportedBuiltinError,
|
|
9
|
+
resolveNodeBootstrapDependency,
|
|
10
|
+
} from './bootstrap-dependency-resolver.ts';
|
|
11
|
+
|
|
12
|
+
function writePackage(packageDir: string, options: { name: string; main?: string }) {
|
|
13
|
+
fs.mkdirSync(packageDir, { recursive: true });
|
|
14
|
+
fs.writeFileSync(
|
|
15
|
+
path.join(packageDir, 'package.json'),
|
|
16
|
+
JSON.stringify({
|
|
17
|
+
name: options.name,
|
|
18
|
+
main: options.main ?? 'index.js',
|
|
19
|
+
}),
|
|
20
|
+
'utf8',
|
|
21
|
+
);
|
|
22
|
+
const entryFilePath = path.join(packageDir, options.main ?? 'index.js');
|
|
23
|
+
fs.mkdirSync(path.dirname(entryFilePath), { recursive: true });
|
|
24
|
+
fs.writeFileSync(entryFilePath, 'export default null;\n', 'utf8');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
test('resolveNodeBootstrapDependency keeps relative, node, and workspace specifiers in the bundle graph', () => {
|
|
28
|
+
const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
|
|
29
|
+
fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
const options = {
|
|
33
|
+
projectDir: rootDir,
|
|
34
|
+
runtimeNodeModulesDir: path.join(rootDir, '.eco', 'node_modules'),
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
assert.equal(resolveNodeBootstrapDependency({ path: './local.ts' }, options), undefined);
|
|
38
|
+
assert.equal(resolveNodeBootstrapDependency({ path: 'node:path' }, options), undefined);
|
|
39
|
+
assert.equal(resolveNodeBootstrapDependency({ path: '@/data/demo-data' }, options), undefined);
|
|
40
|
+
assert.deepEqual(resolveNodeBootstrapDependency({ path: '@ecopages/core' }, options), {
|
|
41
|
+
path: require.resolve('@ecopages/core'),
|
|
42
|
+
});
|
|
43
|
+
} finally {
|
|
44
|
+
fs.rmSync(rootDir, { recursive: true, force: true });
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('resolveNodeBootstrapDependency externalizes third-party packages and links them into runtime node_modules', () => {
|
|
49
|
+
const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
|
|
50
|
+
fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
|
|
51
|
+
const importerPath = path.join(rootDir, 'packages', 'example', 'src', 'index.ts');
|
|
52
|
+
fs.mkdirSync(path.dirname(importerPath), { recursive: true });
|
|
53
|
+
fs.writeFileSync(importerPath, 'export default null;\n', 'utf8');
|
|
54
|
+
writePackage(path.join(rootDir, 'node_modules', 'fast-glob'), { name: 'fast-glob', main: 'out/index.js' });
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
const runtimeNodeModulesDir = path.join(rootDir, '.eco', 'node_modules');
|
|
58
|
+
const result = resolveNodeBootstrapDependency(
|
|
59
|
+
{ path: 'fast-glob', importer: importerPath },
|
|
60
|
+
{ projectDir: rootDir, runtimeNodeModulesDir },
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
assert.deepEqual(result, { path: 'fast-glob', external: true });
|
|
64
|
+
assert.equal(
|
|
65
|
+
fs.realpathSync(path.join(runtimeNodeModulesDir, 'fast-glob')),
|
|
66
|
+
fs.realpathSync(path.join(rootDir, 'node_modules', 'fast-glob')),
|
|
67
|
+
);
|
|
68
|
+
} finally {
|
|
69
|
+
fs.rmSync(rootDir, { recursive: true, force: true });
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test('resolveNodeBootstrapDependency resolves workspace-source third-party imports from the app project boundary', () => {
|
|
74
|
+
const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
|
|
75
|
+
fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
|
|
76
|
+
const importerPath = path.join(rootDir, 'packages', 'react-plugin', 'src', 'plugin.ts');
|
|
77
|
+
fs.mkdirSync(path.dirname(importerPath), { recursive: true });
|
|
78
|
+
fs.writeFileSync(importerPath, 'export default null;\n', 'utf8');
|
|
79
|
+
writePackage(path.join(rootDir, 'node_modules', 'react'), { name: 'react', main: 'index.js' });
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
const runtimeNodeModulesDir = path.join(rootDir, '.eco', 'node_modules');
|
|
83
|
+
const result = resolveNodeBootstrapDependency(
|
|
84
|
+
{ path: 'react', importer: importerPath },
|
|
85
|
+
{ projectDir: rootDir, runtimeNodeModulesDir },
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
assert.deepEqual(result, { path: 'react', external: true });
|
|
89
|
+
assert.equal(
|
|
90
|
+
fs.realpathSync(path.join(runtimeNodeModulesDir, 'react')),
|
|
91
|
+
fs.realpathSync(path.join(rootDir, 'node_modules', 'react')),
|
|
92
|
+
);
|
|
93
|
+
} finally {
|
|
94
|
+
fs.rmSync(rootDir, { recursive: true, force: true });
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('resolveNodeBootstrapDependency resolves nested third-party dependencies from the importer package context', () => {
|
|
99
|
+
const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
|
|
100
|
+
fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
|
|
101
|
+
const importerPackageDir = path.join(rootDir, 'node_modules', 'dep-a');
|
|
102
|
+
writePackage(importerPackageDir, { name: 'dep-a' });
|
|
103
|
+
const nestedDependencyDir = path.join(importerPackageDir, 'node_modules', 'dep-b');
|
|
104
|
+
writePackage(nestedDependencyDir, { name: 'dep-b' });
|
|
105
|
+
const importerPath = path.join(importerPackageDir, 'index.js');
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
const runtimeNodeModulesDir = path.join(rootDir, '.eco', 'node_modules');
|
|
109
|
+
const result = resolveNodeBootstrapDependency(
|
|
110
|
+
{ path: 'dep-b', importer: importerPath },
|
|
111
|
+
{ projectDir: rootDir, runtimeNodeModulesDir },
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
assert.deepEqual(result, { path: 'dep-b', external: true });
|
|
115
|
+
assert.equal(fs.realpathSync(path.join(runtimeNodeModulesDir, 'dep-b')), fs.realpathSync(nestedDependencyDir));
|
|
116
|
+
} finally {
|
|
117
|
+
fs.rmSync(rootDir, { recursive: true, force: true });
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test('createNodeBootstrapPlugin wires the shared resolution policy into an Eco build plugin', async () => {
|
|
122
|
+
const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
|
|
123
|
+
fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
|
|
124
|
+
writePackage(path.join(rootDir, 'node_modules', 'fast-glob'), { name: 'fast-glob', main: 'out/index.js' });
|
|
125
|
+
|
|
126
|
+
try {
|
|
127
|
+
const plugin = createNodeBootstrapPlugin({
|
|
128
|
+
projectDir: rootDir,
|
|
129
|
+
runtimeNodeModulesDir: path.join(rootDir, '.eco', 'node_modules'),
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
let onResolveCallback: ((args: { path: string; importer?: string; namespace?: string }) => unknown) | undefined;
|
|
133
|
+
|
|
134
|
+
await plugin.setup({
|
|
135
|
+
onResolve(_options, callback) {
|
|
136
|
+
onResolveCallback = callback;
|
|
137
|
+
},
|
|
138
|
+
onLoad() {},
|
|
139
|
+
module() {},
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
assert.ok(onResolveCallback);
|
|
143
|
+
assert.deepEqual(onResolveCallback?.({ path: 'fast-glob' }), {
|
|
144
|
+
path: 'fast-glob',
|
|
145
|
+
external: true,
|
|
146
|
+
});
|
|
147
|
+
} finally {
|
|
148
|
+
fs.rmSync(rootDir, { recursive: true, force: true });
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test('createNodeBootstrapPlugin rewrites import.meta only for declared bootstrap files', async () => {
|
|
153
|
+
const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
|
|
154
|
+
fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
|
|
155
|
+
const bootstrapFile = path.join(rootDir, 'eco.config.ts');
|
|
156
|
+
const regularFile = path.join(rootDir, 'src', 'page.kita.tsx');
|
|
157
|
+
fs.mkdirSync(path.dirname(regularFile), { recursive: true });
|
|
158
|
+
fs.writeFileSync(bootstrapFile, 'export default import.meta.dirname;\n', 'utf8');
|
|
159
|
+
fs.writeFileSync(regularFile, 'export default import.meta.dirname;\n', 'utf8');
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
const plugin = createNodeBootstrapPlugin({
|
|
163
|
+
projectDir: rootDir,
|
|
164
|
+
runtimeNodeModulesDir: path.join(rootDir, '.eco', 'node_modules'),
|
|
165
|
+
preserveImportMetaPaths: [bootstrapFile],
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
let onLoadCallback: ((args: { path: string; namespace?: string }) => Promise<unknown> | unknown) | undefined;
|
|
169
|
+
|
|
170
|
+
await plugin.setup({
|
|
171
|
+
onResolve() {},
|
|
172
|
+
onLoad(_options, callback) {
|
|
173
|
+
onLoadCallback = callback;
|
|
174
|
+
},
|
|
175
|
+
module() {},
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
assert.ok(onLoadCallback);
|
|
179
|
+
const bootstrapResult = await onLoadCallback?.({ path: bootstrapFile });
|
|
180
|
+
const regularResult = await onLoadCallback?.({ path: regularFile });
|
|
181
|
+
|
|
182
|
+
assert.equal(typeof (bootstrapResult as { contents?: string } | undefined)?.contents, 'string');
|
|
183
|
+
assert.equal(
|
|
184
|
+
bootstrapResult && typeof bootstrapResult === 'object' && 'contents' in bootstrapResult
|
|
185
|
+
? String((bootstrapResult as { contents: string }).contents).includes(
|
|
186
|
+
JSON.stringify(path.dirname(bootstrapFile)),
|
|
187
|
+
)
|
|
188
|
+
: false,
|
|
189
|
+
true,
|
|
190
|
+
);
|
|
191
|
+
assert.equal(regularResult, undefined);
|
|
192
|
+
} finally {
|
|
193
|
+
fs.rmSync(rootDir, { recursive: true, force: true });
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test('createNodeBootstrapPlugin injects side-effect imports for project re-export barrels', async () => {
|
|
198
|
+
const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
|
|
199
|
+
fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
|
|
200
|
+
const barrelFile = path.join(rootDir, 'src', 'layouts', 'base-layout', 'index.ts');
|
|
201
|
+
fs.mkdirSync(path.dirname(barrelFile), { recursive: true });
|
|
202
|
+
fs.writeFileSync(
|
|
203
|
+
barrelFile,
|
|
204
|
+
[
|
|
205
|
+
"export * from './base-layout.kita';",
|
|
206
|
+
"export { BaseLayout } from './base-layout.kita';",
|
|
207
|
+
"export type { BaseLayoutProps } from './base-layout.kita';",
|
|
208
|
+
].join('\n'),
|
|
209
|
+
'utf8',
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
try {
|
|
213
|
+
const plugin = createNodeBootstrapPlugin({
|
|
214
|
+
projectDir: rootDir,
|
|
215
|
+
runtimeNodeModulesDir: path.join(rootDir, '.eco', 'node_modules'),
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
let onLoadCallback: ((args: { path: string; namespace?: string }) => Promise<unknown> | unknown) | undefined;
|
|
219
|
+
|
|
220
|
+
await plugin.setup({
|
|
221
|
+
onResolve() {},
|
|
222
|
+
onLoad(_options, callback) {
|
|
223
|
+
onLoadCallback = callback;
|
|
224
|
+
},
|
|
225
|
+
module() {},
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
assert.ok(onLoadCallback);
|
|
229
|
+
const result = await onLoadCallback?.({ path: barrelFile });
|
|
230
|
+
const contents =
|
|
231
|
+
result && typeof result === 'object' && 'contents' in result
|
|
232
|
+
? String((result as { contents: string }).contents)
|
|
233
|
+
: '';
|
|
234
|
+
|
|
235
|
+
assert.match(contents, /^import \* as __eco_bootstrap_reexport_0 from '\.\/base-layout\.kita';/m);
|
|
236
|
+
assert.match(contents, /^void __eco_bootstrap_reexport_0;$/m);
|
|
237
|
+
assert.match(contents, /export \* from '\.\/base-layout\.kita';/);
|
|
238
|
+
assert.match(contents, /export \{ BaseLayout \} from '\.\/base-layout\.kita';/);
|
|
239
|
+
assert.match(contents, /export type \{ BaseLayoutProps \} from '\.\/base-layout\.kita';/);
|
|
240
|
+
assert.equal(
|
|
241
|
+
contents.match(/import \* as __eco_bootstrap_reexport_0 from '\.\/base-layout\.kita';/g)?.length,
|
|
242
|
+
1,
|
|
243
|
+
);
|
|
244
|
+
} finally {
|
|
245
|
+
fs.rmSync(rootDir, { recursive: true, force: true });
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
test('createNodeBootstrapPlugin fails fast on Bun-only builtins', async () => {
|
|
250
|
+
const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-node-bootstrap-'));
|
|
251
|
+
fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
|
|
252
|
+
const importerPath = path.join(rootDir, 'src', 'db.server.ts');
|
|
253
|
+
|
|
254
|
+
try {
|
|
255
|
+
const plugin = createNodeBootstrapPlugin({
|
|
256
|
+
projectDir: rootDir,
|
|
257
|
+
runtimeNodeModulesDir: path.join(rootDir, '.eco', 'node_modules'),
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
let onResolveCallback: ((args: { path: string; importer?: string; namespace?: string }) => unknown) | undefined;
|
|
261
|
+
|
|
262
|
+
await plugin.setup({
|
|
263
|
+
onResolve(options, callback) {
|
|
264
|
+
if (String(options.filter) === String(/^bun:/)) {
|
|
265
|
+
onResolveCallback = callback;
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
onLoad() {},
|
|
269
|
+
module() {},
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
assert.ok(onResolveCallback);
|
|
273
|
+
assert.throws(
|
|
274
|
+
() => onResolveCallback?.({ path: 'bun:sqlite', importer: importerPath }),
|
|
275
|
+
new RegExp(
|
|
276
|
+
getNodeUnsupportedBuiltinError('bun:sqlite', importerPath).replace(/[.*+?^${}()|[\]\\]/g, '\\$&'),
|
|
277
|
+
),
|
|
278
|
+
);
|
|
279
|
+
} finally {
|
|
280
|
+
fs.rmSync(rootDir, { recursive: true, force: true });
|
|
281
|
+
}
|
|
282
|
+
});
|