@ecopages/core 0.2.0-alpha.7 → 0.2.0-alpha.8
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 +31 -0
- package/package.json +212 -92
- package/src/adapters/abstract/application-adapter.d.ts +168 -0
- package/src/adapters/abstract/application-adapter.js +109 -0
- package/src/adapters/abstract/router-adapter.d.ts +26 -0
- package/src/adapters/abstract/router-adapter.js +5 -0
- package/src/adapters/abstract/server-adapter.d.ts +69 -0
- package/src/adapters/abstract/server-adapter.js +15 -0
- package/src/adapters/bun/client-bridge.d.ts +34 -0
- package/src/adapters/bun/client-bridge.js +48 -0
- package/src/adapters/bun/create-app.d.ts +60 -0
- package/src/adapters/bun/create-app.js +117 -0
- package/src/adapters/bun/hmr-manager.d.ts +143 -0
- package/src/adapters/bun/hmr-manager.js +334 -0
- package/src/adapters/bun/index.d.ts +2 -0
- package/src/adapters/bun/index.js +8 -0
- package/src/adapters/bun/server-adapter.d.ts +155 -0
- package/src/adapters/bun/server-adapter.js +373 -0
- package/src/adapters/bun/server-lifecycle.d.ts +63 -0
- package/src/adapters/bun/server-lifecycle.js +92 -0
- package/src/adapters/index.d.ts +6 -0
- package/src/adapters/index.js +14 -0
- package/src/adapters/node/bootstrap-dependency-resolver.d.ts +44 -0
- package/src/adapters/node/bootstrap-dependency-resolver.js +172 -0
- package/src/adapters/node/create-app.d.ts +21 -0
- package/src/adapters/node/create-app.js +143 -0
- package/src/adapters/node/index.d.ts +6 -0
- package/src/adapters/node/index.js +11 -0
- package/src/adapters/node/node-client-bridge.d.ts +26 -0
- package/src/adapters/node/node-client-bridge.js +66 -0
- package/src/adapters/node/node-hmr-manager.d.ts +133 -0
- package/src/adapters/node/node-hmr-manager.js +312 -0
- package/src/adapters/node/runtime-adapter.d.ts +46 -0
- package/src/adapters/node/runtime-adapter.js +306 -0
- package/src/adapters/node/server-adapter.d.ts +161 -0
- package/src/adapters/node/server-adapter.js +358 -0
- package/src/adapters/node/static-content-server.d.ts +60 -0
- package/src/adapters/node/static-content-server.js +194 -0
- package/src/adapters/node/write-runtime-manifest.d.ts +26 -0
- package/src/adapters/node/write-runtime-manifest.js +12 -0
- package/src/adapters/shared/api-response.d.ts +52 -0
- package/src/adapters/shared/api-response.js +96 -0
- package/src/adapters/shared/application-adapter.d.ts +18 -0
- package/src/adapters/shared/application-adapter.js +90 -0
- package/src/adapters/shared/define-api-handler.d.ts +25 -0
- package/src/adapters/shared/define-api-handler.js +15 -0
- package/src/adapters/shared/explicit-static-route-matcher.d.ts +38 -0
- package/src/adapters/shared/explicit-static-route-matcher.js +103 -0
- package/src/adapters/shared/file-route-middleware-pipeline.d.ts +65 -0
- package/src/adapters/shared/file-route-middleware-pipeline.js +99 -0
- package/src/adapters/shared/fs-server-response-factory.d.ts +19 -0
- package/src/adapters/shared/fs-server-response-factory.js +97 -0
- package/src/adapters/shared/fs-server-response-matcher.d.ts +75 -0
- package/src/adapters/shared/fs-server-response-matcher.js +160 -0
- 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 +14 -0
- package/src/adapters/shared/render-context.js +70 -0
- 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 +97 -0
- package/src/adapters/shared/server-adapter.js +386 -0
- package/src/adapters/shared/server-route-handler.d.ts +89 -0
- package/src/adapters/shared/server-route-handler.js +111 -0
- package/src/adapters/shared/server-static-builder.d.ts +70 -0
- package/src/adapters/shared/server-static-builder.js +99 -0
- package/src/build/build-adapter.d.ts +186 -0
- package/src/build/build-adapter.js +168 -0
- package/src/build/build-manifest.d.ts +27 -0
- package/src/build/build-manifest.js +30 -0
- package/src/build/build-types.d.ts +57 -0
- package/src/build/build-types.js +0 -0
- package/src/build/dev-build-coordinator.d.ts +74 -0
- package/src/build/dev-build-coordinator.js +161 -0
- package/src/build/esbuild-build-adapter.d.ts +72 -0
- package/src/build/esbuild-build-adapter.js +422 -0
- package/src/build/runtime-build-executor.d.ts +13 -0
- package/src/build/runtime-build-executor.js +20 -0
- package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
- package/src/build/runtime-specifier-alias-plugin.js +31 -0
- package/src/config/config-builder.d.ts +238 -0
- package/src/config/config-builder.js +565 -0
- package/src/constants.d.ts +45 -0
- package/src/constants.js +25 -0
- package/src/create-app.d.ts +17 -0
- package/src/create-app.js +66 -0
- package/src/dev/sc-server.d.ts +30 -0
- package/src/dev/sc-server.js +111 -0
- package/src/eco/component-render-context.d.ts +105 -0
- package/src/eco/component-render-context.js +87 -0
- package/src/eco/eco.d.ts +9 -0
- package/src/eco/eco.js +114 -0
- package/src/eco/eco.types.d.ts +178 -0
- package/src/eco/eco.types.js +0 -0
- package/src/eco/eco.utils.d.ts +40 -0
- package/src/eco/eco.utils.js +40 -0
- package/src/eco/global-injector-map.d.ts +16 -0
- package/src/eco/global-injector-map.js +80 -0
- package/src/eco/lazy-injector-map.d.ts +8 -0
- package/src/eco/lazy-injector-map.js +70 -0
- package/src/eco/module-dependencies.d.ts +18 -0
- package/src/eco/module-dependencies.js +49 -0
- package/src/errors/http-error.d.ts +31 -0
- package/src/errors/http-error.js +50 -0
- package/src/errors/index.d.ts +2 -0
- package/src/errors/index.js +4 -0
- package/src/errors/locals-access-error.d.ts +4 -0
- package/src/errors/locals-access-error.js +9 -0
- package/src/global/app-logger.d.ts +2 -0
- package/src/global/app-logger.js +6 -0
- package/src/hmr/client/hmr-runtime.d.ts +5 -0
- package/src/hmr/client/hmr-runtime.js +109 -0
- package/src/hmr/hmr-strategy.d.ts +159 -0
- package/src/hmr/hmr-strategy.js +29 -0
- 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.d.ts +1 -0
- package/src/hmr/hmr.test.e2e.js +43 -0
- package/src/hmr/strategies/default-hmr-strategy.d.ts +43 -0
- package/src/hmr/strategies/default-hmr-strategy.js +34 -0
- package/src/hmr/strategies/js-hmr-strategy.d.ts +139 -0
- package/src/hmr/strategies/js-hmr-strategy.js +178 -0
- package/src/index.browser.d.ts +3 -0
- package/src/index.browser.js +4 -0
- package/src/index.d.ts +5 -0
- package/src/index.js +10 -0
- package/src/integrations/ghtml/ghtml-renderer.d.ts +15 -0
- package/src/integrations/ghtml/ghtml-renderer.js +62 -0
- package/src/integrations/ghtml/ghtml.plugin.d.ts +20 -0
- package/src/integrations/ghtml/ghtml.plugin.js +21 -0
- package/src/internal-types.d.ts +221 -0
- package/src/internal-types.js +0 -0
- package/src/plugins/alias-resolver-plugin.d.ts +2 -0
- package/src/plugins/alias-resolver-plugin.js +53 -0
- package/src/plugins/eco-component-meta-plugin.d.ts +97 -0
- package/src/plugins/eco-component-meta-plugin.js +157 -0
- package/src/plugins/integration-plugin.d.ts +136 -0
- package/src/plugins/integration-plugin.js +133 -0
- package/src/plugins/processor.d.ts +95 -0
- package/src/plugins/processor.js +136 -0
- package/src/plugins/runtime-capability.d.ts +9 -0
- package/src/plugins/runtime-capability.js +0 -0
- package/src/public-types.d.ts +1149 -0
- package/src/public-types.js +0 -0
- package/src/route-renderer/component-graph/component-graph-executor.d.ts +32 -0
- package/src/route-renderer/component-graph/component-graph-executor.js +31 -0
- package/src/route-renderer/component-graph/component-graph.d.ts +42 -0
- package/src/route-renderer/component-graph/component-graph.js +72 -0
- package/src/route-renderer/component-graph/component-marker.d.ts +52 -0
- package/src/route-renderer/component-graph/component-marker.js +46 -0
- package/src/route-renderer/component-graph/component-reference.d.ts +10 -0
- package/src/route-renderer/component-graph/component-reference.js +19 -0
- package/src/route-renderer/component-graph/marker-graph-resolver.d.ts +77 -0
- package/src/route-renderer/component-graph/marker-graph-resolver.js +95 -0
- package/src/route-renderer/orchestration/integration-renderer.d.ts +372 -0
- package/src/route-renderer/orchestration/integration-renderer.js +589 -0
- package/src/route-renderer/orchestration/render-execution.service.d.ts +103 -0
- package/src/route-renderer/orchestration/render-execution.service.js +121 -0
- package/src/route-renderer/orchestration/render-preparation.service.d.ts +121 -0
- package/src/route-renderer/orchestration/render-preparation.service.js +332 -0
- package/src/route-renderer/page-loading/dependency-resolver.d.ts +35 -0
- package/src/route-renderer/page-loading/dependency-resolver.js +442 -0
- package/src/route-renderer/page-loading/page-module-loader.d.ts +87 -0
- package/src/route-renderer/page-loading/page-module-loader.js +124 -0
- package/src/route-renderer/route-renderer.d.ts +61 -0
- package/src/route-renderer/route-renderer.js +87 -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/server/fs-router-scanner.d.ts +41 -0
- package/src/router/server/fs-router-scanner.js +156 -0
- package/src/router/server/fs-router.d.ts +26 -0
- package/src/router/server/fs-router.js +100 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
- package/src/services/assets/asset-processing-service/asset-processing.service.js +331 -0
- package/src/services/assets/asset-processing-service/asset.factory.d.ts +17 -0
- package/src/services/assets/asset-processing-service/asset.factory.js +82 -0
- package/src/services/assets/asset-processing-service/assets.types.d.ts +89 -0
- package/src/services/assets/asset-processing-service/assets.types.js +0 -0
- 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/assets/asset-processing-service/processor.interface.d.ts +22 -0
- package/src/services/assets/asset-processing-service/processor.interface.js +6 -0
- package/src/services/assets/asset-processing-service/processor.registry.d.ts +8 -0
- package/src/services/assets/asset-processing-service/processor.registry.js +15 -0
- package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +24 -0
- package/src/services/assets/asset-processing-service/processors/base/base-processor.js +64 -0
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +17 -0
- package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +72 -0
- 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/assets/asset-processing-service/processors/script/content-script.processor.d.ts +5 -0
- package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +57 -0
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +8 -0
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +76 -0
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +7 -0
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +75 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +5 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +25 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +9 -0
- package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +66 -0
- package/src/services/assets/browser-bundle.service.d.ts +32 -0
- package/src/services/assets/browser-bundle.service.js +33 -0
- package/src/services/cache/cache.types.d.ts +107 -0
- package/src/services/cache/cache.types.js +0 -0
- package/src/services/cache/index.d.ts +7 -0
- package/src/services/cache/index.js +7 -0
- package/src/services/cache/memory-cache-store.d.ts +42 -0
- package/src/services/cache/memory-cache-store.js +98 -0
- package/src/services/cache/page-cache-service.d.ts +70 -0
- package/src/services/cache/page-cache-service.js +152 -0
- package/src/services/cache/page-request-cache-coordinator.service.d.ts +75 -0
- package/src/services/cache/page-request-cache-coordinator.service.js +109 -0
- package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
- package/src/services/html/html-rewriter-provider.service.js +65 -0
- package/src/services/html/html-transformer.service.d.ts +77 -0
- package/src/services/html/html-transformer.service.js +221 -0
- package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
- package/src/services/invalidation/development-invalidation.service.js +189 -0
- package/src/services/module-loading/app-server-module-transpiler.service.d.ts +16 -0
- package/src/services/module-loading/app-server-module-transpiler.service.js +34 -0
- package/src/services/module-loading/page-module-import.service.d.ts +71 -0
- package/src/services/module-loading/page-module-import.service.js +132 -0
- package/src/services/module-loading/server-loader.service.d.ts +96 -0
- package/src/services/module-loading/server-loader.service.js +32 -0
- package/src/services/module-loading/server-module-transpiler.service.d.ts +69 -0
- package/src/services/module-loading/server-module-transpiler.service.js +61 -0
- package/src/services/runtime-manifest/node-runtime-manifest.service.d.ts +35 -0
- package/src/services/runtime-manifest/node-runtime-manifest.service.js +60 -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/validation/schema-validation-service.d.ts +122 -0
- package/src/services/validation/schema-validation-service.js +101 -0
- package/src/services/validation/standard-schema.types.d.ts +65 -0
- package/src/services/validation/standard-schema.types.js +0 -0
- package/src/static-site-generator/static-site-generator.d.ts +109 -0
- package/src/static-site-generator/static-site-generator.js +353 -0
- package/src/utils/css.d.ts +1 -0
- package/src/utils/css.js +7 -0
- package/src/utils/deep-merge.d.ts +14 -0
- package/src/utils/deep-merge.js +32 -0
- package/src/utils/hash.d.ts +1 -0
- package/src/utils/hash.js +7 -0
- package/src/utils/html.d.ts +1 -0
- package/src/utils/html.js +4 -0
- package/src/utils/invariant.d.ts +5 -0
- package/src/utils/invariant.js +11 -0
- package/src/utils/locals-utils.d.ts +15 -0
- package/src/utils/locals-utils.js +24 -0
- package/src/utils/parse-cli-args.d.ts +24 -0
- package/src/utils/parse-cli-args.js +47 -0
- package/src/utils/path-utils.module.d.ts +5 -0
- package/src/utils/path-utils.module.js +14 -0
- package/src/utils/resolve-work-dir.d.ts +11 -0
- package/src/utils/resolve-work-dir.js +31 -0
- package/src/utils/runtime.d.ts +11 -0
- package/src/utils/runtime.js +40 -0
- package/src/utils/server-utils.module.d.ts +19 -0
- package/src/utils/server-utils.module.js +56 -0
- package/src/watchers/project-watcher.d.ts +136 -0
- package/src/watchers/project-watcher.js +281 -0
- package/src/watchers/project-watcher.test-helpers.d.ts +4 -0
- package/src/watchers/project-watcher.test-helpers.js +52 -0
- package/src/adapters/bun/hmr-manager.test.ts +0 -267
- package/src/adapters/node/bootstrap-dependency-resolver.test.ts +0 -282
- package/src/adapters/node/node-client-bridge.test.ts +0 -198
- package/src/adapters/node/node-hmr-manager.test.ts +0 -322
- package/src/adapters/node/runtime-adapter.test.ts +0 -868
- package/src/adapters/node/static-content-server.test.ts +0 -60
- package/src/adapters/shared/api-response.test.ts +0 -97
- package/src/adapters/shared/explicit-static-route-matcher.test.ts +0 -381
- package/src/adapters/shared/file-route-middleware-pipeline.test.ts +0 -90
- package/src/adapters/shared/fs-server-response-factory.test.ts +0 -187
- package/src/adapters/shared/fs-server-response-matcher.test.ts +0 -286
- package/src/adapters/shared/hmr-manager.contract.test.ts +0 -196
- package/src/adapters/shared/hmr-manager.dispatch.test.ts +0 -220
- package/src/adapters/shared/render-context.test.ts +0 -146
- package/src/adapters/shared/server-adapter.test.ts +0 -77
- package/src/adapters/shared/server-route-handler.test.ts +0 -110
- package/src/adapters/shared/server-static-builder.test.ts +0 -316
- package/src/build/build-adapter-serialization.test.ts +0 -268
- package/src/build/build-adapter.test.ts +0 -815
- package/src/build/runtime-specifier-alias-plugin.test.ts +0 -43
- package/src/config/config-builder.test.ts +0 -410
- package/src/eco/eco.test.ts +0 -678
- package/src/eco/eco.utils.test.ts +0 -124
- package/src/eco/global-injector-map.test.ts +0 -42
- package/src/eco/lazy-injector-map.test.ts +0 -66
- package/src/eco/module-dependencies.test.ts +0 -30
- package/src/errors/http-error.test.ts +0 -134
- package/src/global/utils.test.ts +0 -12
- 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/hmr-strategy.test.ts +0 -124
- package/src/hmr/strategies/js-hmr-strategy.test.ts +0 -335
- package/src/integrations/ghtml/ghtml-renderer.test.ts +0 -63
- package/src/plugins/alias-resolver-plugin.test.ts +0 -41
- package/src/plugins/eco-component-meta-plugin.test.ts +0 -380
- package/src/plugins/integration-plugin.test.ts +0 -111
- package/src/plugins/processor.test.ts +0 -148
- package/src/route-renderer/component-graph/component-graph-executor.test.ts +0 -41
- package/src/route-renderer/component-graph/component-graph.test.ts +0 -63
- package/src/route-renderer/component-graph/component-marker.test.ts +0 -73
- package/src/route-renderer/component-graph/marker-graph-resolver.test.ts +0 -135
- package/src/route-renderer/orchestration/integration-renderer.test.ts +0 -936
- package/src/route-renderer/orchestration/render-execution.service.test.ts +0 -97
- package/src/route-renderer/orchestration/render-preparation.service.test.ts +0 -235
- package/src/route-renderer/page-loading/dependency-resolver.test.ts +0 -345
- package/src/route-renderer/page-loading/page-module-loader.test.ts +0 -96
- package/src/router/client/navigation-coordinator.test.ts +0 -237
- package/src/router/server/fs-router-scanner.test.ts +0 -83
- package/src/router/server/fs-router.test.ts +0 -214
- package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +0 -385
- package/src/services/assets/asset-processing-service/asset.factory.test.ts +0 -63
- package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +0 -72
- package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +0 -67
- package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +0 -59
- package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +0 -286
- package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +0 -227
- package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +0 -199
- package/src/services/assets/browser-bundle.service.test.ts +0 -36
- package/src/services/cache/memory-cache-store.test.ts +0 -225
- package/src/services/cache/page-cache-service.test.ts +0 -175
- package/src/services/cache/page-request-cache-coordinator.service.test.ts +0 -79
- package/src/services/html/html-rewriter-provider.service.test.ts +0 -183
- package/src/services/html/html-transformer.service.test.ts +0 -378
- package/src/services/invalidation/development-invalidation.service.test.ts +0 -77
- package/src/services/module-loading/page-module-import.service.test.ts +0 -253
- package/src/services/module-loading/server-loader.service.test.ts +0 -161
- package/src/services/module-loading/server-module-transpiler.service.test.ts +0 -115
- package/src/services/runtime-manifest/node-runtime-manifest.service.test.ts +0 -95
- package/src/services/validation/schema-validation-service.test.ts +0 -223
- package/src/static-site-generator/static-site-generator.test.ts +0 -307
- package/src/utils/deep-merge.test.ts +0 -114
- package/src/utils/invariant.test.ts +0 -22
- package/src/utils/path-utils.test.ts +0 -15
- package/src/utils/server-utils.test.ts +0 -38
- package/src/watchers/project-watcher.integration.test.ts +0 -337
- package/src/watchers/project-watcher.test.ts +0 -678
|
@@ -1,380 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { createEcoComponentMetaPlugin } from './eco-component-meta-plugin';
|
|
3
|
-
import type { EcoPagesAppConfig } from '../internal-types';
|
|
4
|
-
import { fileSystem } from '@ecopages/file-system';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Creates a regex pattern to match __eco injection with any id hash.
|
|
8
|
-
* The id is a base36 hash that varies, so we match it with a pattern.
|
|
9
|
-
*/
|
|
10
|
-
function ecoMetaPattern(file: string, integration: string): RegExp {
|
|
11
|
-
const escapedFile = file.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
12
|
-
return new RegExp(`__eco: \\{ id: "[a-z0-9]+", file: "${escapedFile}", integration: "${integration}" \\}`);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
describe('eco-component-meta-plugin', () => {
|
|
16
|
-
const Config = {
|
|
17
|
-
integrations: [
|
|
18
|
-
{
|
|
19
|
-
name: 'kitajs',
|
|
20
|
-
extensions: ['.kita.tsx'],
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
name: 'react',
|
|
24
|
-
extensions: ['.tsx'],
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
name: 'ghtml',
|
|
28
|
-
extensions: ['.ts', '.ghtml.ts'],
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
} as EcoPagesAppConfig;
|
|
32
|
-
|
|
33
|
-
const plugin = createEcoComponentMetaPlugin({ config: Config });
|
|
34
|
-
|
|
35
|
-
async function runPluginOnContent(content: string, filePath: string) {
|
|
36
|
-
let regexFilter: RegExp | undefined;
|
|
37
|
-
let onLoadCallback: any;
|
|
38
|
-
|
|
39
|
-
const buildMock = {
|
|
40
|
-
onLoad: (options: { filter: RegExp }, callback: any) => {
|
|
41
|
-
regexFilter = options.filter;
|
|
42
|
-
onLoadCallback = callback;
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
plugin.setup(buildMock as any);
|
|
47
|
-
|
|
48
|
-
if (!onLoadCallback || !regexFilter) {
|
|
49
|
-
throw new Error('Plugin did not register onLoad handler');
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (!regexFilter.test(filePath)) {
|
|
53
|
-
throw new Error(`File path ${filePath} does not match plugin filter ${regexFilter}`);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const fileSpy = vi.spyOn(fileSystem, 'readFileSync').mockImplementation(() => content);
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
return await onLoadCallback({ path: filePath });
|
|
60
|
-
} finally {
|
|
61
|
-
fileSpy.mockRestore();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
it('should inject __eco into X.config assignment in TSX files', async () => {
|
|
66
|
-
const content = `
|
|
67
|
-
MyComponent.config = {
|
|
68
|
-
dependencies: {}
|
|
69
|
-
};
|
|
70
|
-
`;
|
|
71
|
-
|
|
72
|
-
const result = await runPluginOnContent(content, '/path/to/component.tsx');
|
|
73
|
-
|
|
74
|
-
expect(result).toBeDefined();
|
|
75
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/component.tsx', 'react'));
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('should NOT inject __eco into config patterns in non-EcoComponent files', async () => {
|
|
79
|
-
const content = `
|
|
80
|
-
export const config = {
|
|
81
|
-
apiUrl: 'https://api.example.com',
|
|
82
|
-
theme: 'dark'
|
|
83
|
-
};
|
|
84
|
-
`;
|
|
85
|
-
|
|
86
|
-
const result = await runPluginOnContent(content, '/path/to/settings.tsx');
|
|
87
|
-
|
|
88
|
-
expect(result).toBeDefined();
|
|
89
|
-
expect(result.contents).not.toContain('__eco:');
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('should inject __eco into EcoComponent-typed object with config property', async () => {
|
|
93
|
-
const content = `
|
|
94
|
-
import type { EcoComponent } from '@ecopages/core';
|
|
95
|
-
|
|
96
|
-
export const LitCounter: EcoComponent = {
|
|
97
|
-
config: {
|
|
98
|
-
dependencies: {
|
|
99
|
-
scripts: ['lit-counter.script.ts'] } } };
|
|
100
|
-
`;
|
|
101
|
-
|
|
102
|
-
const result = await runPluginOnContent(content, '/path/to/lit-counter.ts');
|
|
103
|
-
|
|
104
|
-
expect(result).toBeDefined();
|
|
105
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/lit-counter.ts', 'ghtml'));
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('should inject __eco into eco.component() call', async () => {
|
|
109
|
-
const content = `
|
|
110
|
-
import { eco } from '@ecopages/core';
|
|
111
|
-
export const Counter = eco.component${'<CounterProps>'}({
|
|
112
|
-
dependencies: {
|
|
113
|
-
scripts: ['./counter.ts'] },
|
|
114
|
-
render: () => '${'<div>'}Counter${'</div>'}' });
|
|
115
|
-
`;
|
|
116
|
-
|
|
117
|
-
const result = await runPluginOnContent(content, '/path/to/counter.tsx');
|
|
118
|
-
|
|
119
|
-
expect(result).toBeDefined();
|
|
120
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/counter.tsx', 'react'));
|
|
121
|
-
expect(result.contents).toContain('eco.component' + '<CounterProps>({');
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it('should inject __eco into eco.page call', async () => {
|
|
125
|
-
const content = `
|
|
126
|
-
import { eco } from '@ecopages/core';
|
|
127
|
-
export default eco.page({
|
|
128
|
-
dependencies: {
|
|
129
|
-
components: [] },
|
|
130
|
-
render: () => '${'<main>'}Page${'</main>'}' });
|
|
131
|
-
`;
|
|
132
|
-
|
|
133
|
-
const result = await runPluginOnContent(content, '/path/to/pages/index.tsx');
|
|
134
|
-
|
|
135
|
-
expect(result).toBeDefined();
|
|
136
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/pages/index.tsx', 'react'));
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('should inject __eco into eco.layout call', async () => {
|
|
140
|
-
const content = `
|
|
141
|
-
import { eco } from '@ecopages/core';
|
|
142
|
-
export const MainLayout = eco.layout({
|
|
143
|
-
render: ({ children }) => '${'<main>'}' + children + '${'</main>'}' });
|
|
144
|
-
`;
|
|
145
|
-
|
|
146
|
-
const result = await runPluginOnContent(content, '/path/to/layouts/main-layout.tsx');
|
|
147
|
-
|
|
148
|
-
expect(result).toBeDefined();
|
|
149
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/layouts/main-layout.tsx', 'react'));
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
it('should inject __eco into eco.html call', async () => {
|
|
153
|
-
const content = `
|
|
154
|
-
import { eco } from '@ecopages/core';
|
|
155
|
-
export default eco.html({
|
|
156
|
-
render: ({ children }) => '${'<html><body>'}' + children + '${'</body></html>'}' });
|
|
157
|
-
`;
|
|
158
|
-
|
|
159
|
-
const result = await runPluginOnContent(content, '/path/to/html.tsx');
|
|
160
|
-
|
|
161
|
-
expect(result).toBeDefined();
|
|
162
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/html.tsx', 'react'));
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('should inject __eco into eco.component() with lazy dependencies', async () => {
|
|
166
|
-
const content = `
|
|
167
|
-
export const LazyCounter = eco.component({
|
|
168
|
-
dependencies: {
|
|
169
|
-
scripts: [{ src: './counter.ts', lazy: { 'on:interaction': 'click' } }] },
|
|
170
|
-
render: () => '${'<div>'}Lazy${'</div>'}' });
|
|
171
|
-
`;
|
|
172
|
-
|
|
173
|
-
const result = await runPluginOnContent(content, '/path/to/lazy-counter.tsx');
|
|
174
|
-
|
|
175
|
-
expect(result).toBeDefined();
|
|
176
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/lazy-counter.tsx', 'react'));
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it('should detect kitajs integration from .kita.tsx extension', async () => {
|
|
180
|
-
const content = `import { eco } from '@ecopages/core';
|
|
181
|
-
import type { PageHeadProps } from '@ecopages/core';
|
|
182
|
-
|
|
183
|
-
export const Head = eco.component<PageHeadProps<string>>({
|
|
184
|
-
dependencies: {
|
|
185
|
-
stylesheets: ['../styles/global.css'] },
|
|
186
|
-
render: ({ metadata, children }) => (
|
|
187
|
-
<head>
|
|
188
|
-
<meta charset="UTF-8" />
|
|
189
|
-
{children}
|
|
190
|
-
</head>
|
|
191
|
-
) });`;
|
|
192
|
-
|
|
193
|
-
const result = await runPluginOnContent(content, '/path/to/includes/head.kita.tsx');
|
|
194
|
-
|
|
195
|
-
expect(result).toBeDefined();
|
|
196
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/includes/head.kita.tsx', 'kitajs'));
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it('should handle eco.page with complex generic types', async () => {
|
|
200
|
-
const content = `
|
|
201
|
-
import { eco } from '@ecopages/core';
|
|
202
|
-
|
|
203
|
-
export default eco.page<{ title: string; callback: (arg: string) => void }>({
|
|
204
|
-
staticProps: async () => ({ props: { title: 'Hello', callback: () => {} } }),
|
|
205
|
-
render: (props) => '<div>' + props.title + '</div>' });
|
|
206
|
-
`;
|
|
207
|
-
|
|
208
|
-
const result = await runPluginOnContent(content, '/path/to/pages/complex.tsx');
|
|
209
|
-
|
|
210
|
-
expect(result).toBeDefined();
|
|
211
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/pages/complex.tsx', 'react'));
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
it('should handle multiple eco.component calls in same file', async () => {
|
|
215
|
-
const content = `
|
|
216
|
-
import { eco } from '@ecopages/core';
|
|
217
|
-
|
|
218
|
-
export const Button = eco.component({
|
|
219
|
-
render: () => '<button>Click</button>' });
|
|
220
|
-
|
|
221
|
-
export const Input = eco.component({
|
|
222
|
-
render: () => '<input type="text" />' });
|
|
223
|
-
`;
|
|
224
|
-
|
|
225
|
-
const result = await runPluginOnContent(content, '/path/to/components.tsx');
|
|
226
|
-
|
|
227
|
-
expect(result).toBeDefined();
|
|
228
|
-
const matches = result.contents.match(
|
|
229
|
-
/__eco: \{ id: "[a-z0-9]+", file: "\/path\/to\/components\.tsx", integration: "react" \},/g,
|
|
230
|
-
);
|
|
231
|
-
expect(matches).toHaveLength(2);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
it('should handle eco.component with empty config object', async () => {
|
|
235
|
-
const content = `
|
|
236
|
-
import { eco } from '@ecopages/core';
|
|
237
|
-
|
|
238
|
-
export const Simple = eco.component({});
|
|
239
|
-
`;
|
|
240
|
-
|
|
241
|
-
const result = await runPluginOnContent(content, '/path/to/simple.tsx');
|
|
242
|
-
|
|
243
|
-
expect(result).toBeDefined();
|
|
244
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/simple.tsx', 'react'));
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
it('should not inject into non-eco call expressions', async () => {
|
|
248
|
-
const content = `
|
|
249
|
-
import { other } from 'some-lib';
|
|
250
|
-
|
|
251
|
-
export const Thing = other.component({
|
|
252
|
-
render: () => '<div>Thing</div>' });
|
|
253
|
-
`;
|
|
254
|
-
|
|
255
|
-
const result = await runPluginOnContent(content, '/path/to/thing.tsx');
|
|
256
|
-
|
|
257
|
-
expect(result).toBeDefined();
|
|
258
|
-
expect(result.contents).not.toContain('__eco:');
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
it('should not inject into non-config variable declarations', async () => {
|
|
262
|
-
const content = `
|
|
263
|
-
const settings = {
|
|
264
|
-
theme: 'dark',
|
|
265
|
-
locale: 'en' };
|
|
266
|
-
`;
|
|
267
|
-
|
|
268
|
-
const result = await runPluginOnContent(content, '/path/to/settings.ts');
|
|
269
|
-
|
|
270
|
-
expect(result).toBeDefined();
|
|
271
|
-
expect(result.contents).not.toContain('__eco:');
|
|
272
|
-
});
|
|
273
|
-
|
|
274
|
-
it('should handle file paths with special characters in directory', async () => {
|
|
275
|
-
const content = `
|
|
276
|
-
import { eco } from '@ecopages/core';
|
|
277
|
-
|
|
278
|
-
export default eco.page({
|
|
279
|
-
render: () => '<div>Page</div>' });
|
|
280
|
-
`;
|
|
281
|
-
|
|
282
|
-
const result = await runPluginOnContent(content, '/path/to/my-app/pages/index.tsx');
|
|
283
|
-
|
|
284
|
-
expect(result).toBeDefined();
|
|
285
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/my-app/pages/index.tsx', 'react'));
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
it('should handle eco.component with nested object in dependencies', async () => {
|
|
289
|
-
const content = `
|
|
290
|
-
import { eco } from '@ecopages/core';
|
|
291
|
-
|
|
292
|
-
export const LazyComponent = eco.component({
|
|
293
|
-
dependencies: {
|
|
294
|
-
stylesheets: ['./style.css'],
|
|
295
|
-
scripts: [{ src: './script.ts', lazy: { 'on:interaction': 'click' } }],
|
|
296
|
-
components: [] },
|
|
297
|
-
render: () => '<div>Lazy</div>' });
|
|
298
|
-
`;
|
|
299
|
-
|
|
300
|
-
const result = await runPluginOnContent(content, '/path/to/lazy.tsx');
|
|
301
|
-
|
|
302
|
-
expect(result).toBeDefined();
|
|
303
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/lazy.tsx', 'react'));
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
it('should preserve original code structure after injection', async () => {
|
|
307
|
-
const content = `import { eco } from '@ecopages/core';
|
|
308
|
-
|
|
309
|
-
export const Counter = eco.component({
|
|
310
|
-
dependencies: {
|
|
311
|
-
scripts: ['./counter.ts'] },
|
|
312
|
-
render: () => '<button>0</button>' });`;
|
|
313
|
-
|
|
314
|
-
const result = await runPluginOnContent(content, '/path/to/counter.tsx');
|
|
315
|
-
|
|
316
|
-
expect(result).toBeDefined();
|
|
317
|
-
expect(result.contents).toContain("import { eco } from '@ecopages/core';");
|
|
318
|
-
expect(result.contents).toContain("scripts: ['./counter.ts']");
|
|
319
|
-
expect(result.contents).toContain("render: () => '<button>0</button>'");
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
it('should handle query string in file path for cache busting', async () => {
|
|
323
|
-
const content = `
|
|
324
|
-
import { eco } from '@ecopages/core';
|
|
325
|
-
|
|
326
|
-
export default eco.page({
|
|
327
|
-
render: () => '<div>Page</div>' });
|
|
328
|
-
`;
|
|
329
|
-
|
|
330
|
-
const result = await runPluginOnContent(content, '/path/to/pages/index.tsx?update=123456');
|
|
331
|
-
|
|
332
|
-
expect(result).toBeDefined();
|
|
333
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/pages/index.tsx', 'react'));
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
describe('Regression: eco-blog views failure', () => {
|
|
337
|
-
it('should inject __eco into a kitajs page with complex props and no manual __eco', async () => {
|
|
338
|
-
const content = `import { eco } from '@ecopages/core';
|
|
339
|
-
import { MainLayout } from '@/layouts/main-layout.kita';
|
|
340
|
-
import type { Post } from '@/lib/db';
|
|
341
|
-
|
|
342
|
-
export interface BlogListProps {
|
|
343
|
-
posts: Post[];
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
export const BlogList = eco.page<BlogListProps>({
|
|
347
|
-
layout: MainLayout,
|
|
348
|
-
metadata: () => ({
|
|
349
|
-
title: 'EcoBlog | Home',
|
|
350
|
-
description: 'A blog about sustainability and technology' }),
|
|
351
|
-
render: ({ posts }) => {
|
|
352
|
-
return (
|
|
353
|
-
<div class="max-w-3xl mx-auto space-y-12">
|
|
354
|
-
{/* content */}
|
|
355
|
-
</div>
|
|
356
|
-
);
|
|
357
|
-
} });`;
|
|
358
|
-
|
|
359
|
-
const result = await runPluginOnContent(
|
|
360
|
-
content,
|
|
361
|
-
'/path/to/playground/eco-blog/src/views/blog-list.kita.tsx',
|
|
362
|
-
);
|
|
363
|
-
|
|
364
|
-
expect(result).toBeDefined();
|
|
365
|
-
expect(result.contents).toMatch(
|
|
366
|
-
ecoMetaPattern('/path/to/playground/eco-blog/src/views/blog-list.kita.tsx', 'kitajs'),
|
|
367
|
-
);
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
it('should inject __eco even if the eco call is not at the top level', async () => {
|
|
371
|
-
const content = `
|
|
372
|
-
import { eco } from '@ecopages/core';
|
|
373
|
-
const createPage = () => eco.page({ render: () => 'hi' });
|
|
374
|
-
export default createPage();
|
|
375
|
-
`;
|
|
376
|
-
const result = await runPluginOnContent(content, '/path/to/nested.tsx');
|
|
377
|
-
expect(result.contents).toMatch(ecoMetaPattern('/path/to/nested.tsx', 'react'));
|
|
378
|
-
});
|
|
379
|
-
});
|
|
380
|
-
});
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { IntegrationPlugin, type IntegrationPluginConfig } from './integration-plugin';
|
|
3
|
-
import type { IHmrManager } from '../public-types';
|
|
4
|
-
import type { AssetDefinition } from '../services/assets/asset-processing-service';
|
|
5
|
-
|
|
6
|
-
class TestIntegrationPlugin extends IntegrationPlugin {
|
|
7
|
-
renderer = vi.fn() as any;
|
|
8
|
-
override setup(): Promise<void> {
|
|
9
|
-
return Promise.resolve();
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
override teardown(): Promise<void> {
|
|
13
|
-
return Promise.resolve();
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
describe('IntegrationPlugin', () => {
|
|
18
|
-
let plugin: TestIntegrationPlugin;
|
|
19
|
-
const config: IntegrationPluginConfig = {
|
|
20
|
-
name: 'test-plugin',
|
|
21
|
-
extensions: ['.test'],
|
|
22
|
-
integrationDependencies: [],
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
beforeEach(() => {
|
|
26
|
-
plugin = new TestIntegrationPlugin(config);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('should initialize with correct config values', () => {
|
|
30
|
-
expect(plugin.name).toBe(config.name);
|
|
31
|
-
expect(plugin.extensions).toEqual(config.extensions);
|
|
32
|
-
expect(plugin.runtimeCapability).toBeUndefined();
|
|
33
|
-
expect(plugin.getResolvedIntegrationDependencies()).toEqual(
|
|
34
|
-
config.integrationDependencies as AssetDefinition[],
|
|
35
|
-
);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('should retain runtime capability declarations', () => {
|
|
39
|
-
const pluginWithRuntimeCapability = new TestIntegrationPlugin({
|
|
40
|
-
name: 'runtime-capable',
|
|
41
|
-
extensions: ['.test'],
|
|
42
|
-
runtimeCapability: {
|
|
43
|
-
tags: ['bun-only'],
|
|
44
|
-
minRuntimeVersion: '1.0.0',
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
expect(pluginWithRuntimeCapability.runtimeCapability).toEqual({
|
|
49
|
-
tags: ['bun-only'],
|
|
50
|
-
minRuntimeVersion: '1.0.0',
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('should initialize with empty dependencies if not provided', () => {
|
|
55
|
-
const pluginWithoutDeps = new TestIntegrationPlugin({
|
|
56
|
-
name: 'test',
|
|
57
|
-
extensions: [],
|
|
58
|
-
});
|
|
59
|
-
expect(pluginWithoutDeps.getResolvedIntegrationDependencies()).toEqual([]);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('should implement setup and teardown methods', async () => {
|
|
63
|
-
await expect(plugin.setup()).resolves.toBeUndefined();
|
|
64
|
-
await expect(plugin.teardown()).resolves.toBeUndefined();
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('should not defer component boundaries by default', () => {
|
|
68
|
-
expect(
|
|
69
|
-
plugin.shouldDeferComponentBoundary({
|
|
70
|
-
currentIntegration: 'ghtml',
|
|
71
|
-
targetIntegration: 'react',
|
|
72
|
-
component: () => '<div></div>',
|
|
73
|
-
}),
|
|
74
|
-
).toBe(false);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('should register runtime specifier maps through the base HMR setup', () => {
|
|
78
|
-
const registerSpecifierMap = vi.fn();
|
|
79
|
-
const hmrManager = {
|
|
80
|
-
registerSpecifierMap,
|
|
81
|
-
registerStrategy: vi.fn(),
|
|
82
|
-
registerEntrypoint: vi.fn(),
|
|
83
|
-
registerScriptEntrypoint: vi.fn(),
|
|
84
|
-
setPlugins: vi.fn(),
|
|
85
|
-
setEnabled: vi.fn(),
|
|
86
|
-
isEnabled: vi.fn(() => true),
|
|
87
|
-
broadcast: vi.fn(),
|
|
88
|
-
getOutputUrl: vi.fn(),
|
|
89
|
-
getWatchedFiles: vi.fn(() => new Map()),
|
|
90
|
-
getSpecifierMap: vi.fn(() => new Map()),
|
|
91
|
-
getDistDir: vi.fn(() => ''),
|
|
92
|
-
getPlugins: vi.fn(() => []),
|
|
93
|
-
getDefaultContext: vi.fn(),
|
|
94
|
-
handleFileChange: vi.fn(),
|
|
95
|
-
} satisfies IHmrManager;
|
|
96
|
-
|
|
97
|
-
const pluginWithRuntimeSpecifiers = new (class extends TestIntegrationPlugin {
|
|
98
|
-
override getRuntimeSpecifierMap(): Record<string, string> {
|
|
99
|
-
return {
|
|
100
|
-
'test-runtime': '/assets/vendors/test-runtime.js',
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
})(config);
|
|
104
|
-
|
|
105
|
-
pluginWithRuntimeSpecifiers.setHmrManager(hmrManager);
|
|
106
|
-
|
|
107
|
-
expect(registerSpecifierMap).toHaveBeenCalledWith({
|
|
108
|
-
'test-runtime': '/assets/vendors/test-runtime.js',
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
});
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { afterAll, beforeEach, describe, expect, test } from 'vitest';
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import type { EcoBuildPlugin } from '../build/build-types.ts';
|
|
5
|
-
import type { EcoPagesAppConfig } from '../internal-types';
|
|
6
|
-
import { Processor, type ProcessorConfig } from './processor.ts';
|
|
7
|
-
|
|
8
|
-
class TestProcessor extends Processor {
|
|
9
|
-
override buildPlugins?: EcoBuildPlugin[] = [];
|
|
10
|
-
override plugins?: EcoBuildPlugin[] = [];
|
|
11
|
-
|
|
12
|
-
override async setup(): Promise<void> {}
|
|
13
|
-
|
|
14
|
-
override async process(input: unknown, _filePath?: string): Promise<unknown> {
|
|
15
|
-
return input;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
override async teardown(): Promise<void> {}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
describe('Processor', () => {
|
|
22
|
-
let processor: TestProcessor;
|
|
23
|
-
let config: ProcessorConfig;
|
|
24
|
-
let appConfig: EcoPagesAppConfig;
|
|
25
|
-
|
|
26
|
-
beforeEach(() => {
|
|
27
|
-
config = {
|
|
28
|
-
name: 'test-processor',
|
|
29
|
-
options: { test: true },
|
|
30
|
-
watch: {
|
|
31
|
-
paths: ['/test'],
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const testRoot = path.join(process.cwd(), '.test-tmp', 'processor-test');
|
|
36
|
-
|
|
37
|
-
if (fs.existsSync(testRoot)) {
|
|
38
|
-
fs.rmSync(testRoot, { recursive: true, force: true });
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
appConfig = {
|
|
42
|
-
rootDir: testRoot,
|
|
43
|
-
absolutePaths: {
|
|
44
|
-
srcDir: path.join(testRoot, 'src'),
|
|
45
|
-
distDir: path.join(testRoot, 'dist'),
|
|
46
|
-
},
|
|
47
|
-
} as EcoPagesAppConfig;
|
|
48
|
-
|
|
49
|
-
processor = new TestProcessor(config);
|
|
50
|
-
processor.setContext(appConfig);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
afterAll(() => {
|
|
54
|
-
fs.rmSync(path.join(process.cwd(), '.test-tmp'), { recursive: true, force: true });
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test('should initialize with correct name', () => {
|
|
58
|
-
expect(processor.getName()).toBe('test-processor');
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
test('should retain runtime capability declarations', () => {
|
|
62
|
-
const runtimeProcessor = new TestProcessor({
|
|
63
|
-
name: 'runtime-processor',
|
|
64
|
-
runtimeCapability: {
|
|
65
|
-
tags: ['requires-node-builtins'],
|
|
66
|
-
minRuntimeVersion: '18.0.0',
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
expect(runtimeProcessor.runtimeCapability).toEqual({
|
|
71
|
-
tags: ['requires-node-builtins'],
|
|
72
|
-
minRuntimeVersion: '18.0.0',
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
test('should return watch config', () => {
|
|
77
|
-
expect(processor.getWatchConfig()).toEqual({
|
|
78
|
-
paths: ['/test'],
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
describe('Processor capability matching', () => {
|
|
84
|
-
test('matches all extensions with * pattern', () => {
|
|
85
|
-
const processor = new TestProcessor({
|
|
86
|
-
name: 'wildcard-all',
|
|
87
|
-
capabilities: [{ kind: 'stylesheet', extensions: ['*'] }],
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
|
|
91
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
test('matches explicit *.ext patterns', () => {
|
|
95
|
-
const processor = new TestProcessor({
|
|
96
|
-
name: 'wildcard-explicit',
|
|
97
|
-
capabilities: [{ kind: 'stylesheet', extensions: ['*.css'] }],
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
|
|
101
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(false);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
test('matches grouped extension patterns', () => {
|
|
105
|
-
const processor = new TestProcessor({
|
|
106
|
-
name: 'wildcard-group',
|
|
107
|
-
capabilities: [{ kind: 'stylesheet', extensions: ['*.{css,scss,sass}'] }],
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
|
|
111
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
|
|
112
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.sass')).toBe(true);
|
|
113
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.less')).toBe(false);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
test('matches grouped patterns with mixed case and spacing', () => {
|
|
117
|
-
const processor = new TestProcessor({
|
|
118
|
-
name: 'wildcard-group-normalized',
|
|
119
|
-
capabilities: [{ kind: 'stylesheet', extensions: ['*.{ CSS, ScSs , .SASS }'] }],
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
|
|
123
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
|
|
124
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.sass')).toBe(true);
|
|
125
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.less')).toBe(false);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
test('matches plain extension and dotted extension forms', () => {
|
|
129
|
-
const processor = new TestProcessor({
|
|
130
|
-
name: 'plain-ext',
|
|
131
|
-
capabilities: [{ kind: 'stylesheet', extensions: ['css', '.scss'] }],
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
|
|
135
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
|
|
136
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.sass')).toBe(false);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
test('respects capability kind filtering', () => {
|
|
140
|
-
const processor = new TestProcessor({
|
|
141
|
-
name: 'kind-filter',
|
|
142
|
-
capabilities: [{ kind: 'image', extensions: ['*.png'] }],
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(false);
|
|
146
|
-
expect(processor.canProcessAsset('image', '/src/assets/logo.png')).toBe(true);
|
|
147
|
-
});
|
|
148
|
-
});
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { createComponentMarker } from './component-marker.ts';
|
|
3
|
-
import { extractComponentGraph } from './component-graph.ts';
|
|
4
|
-
import { resolveComponentGraph } from './component-graph-executor.ts';
|
|
5
|
-
|
|
6
|
-
describe('component graph executor', () => {
|
|
7
|
-
it('resolves markers bottom-up using graph levels', async () => {
|
|
8
|
-
const html = [
|
|
9
|
-
'<main>',
|
|
10
|
-
createComponentMarker({
|
|
11
|
-
nodeId: 'n_1',
|
|
12
|
-
integration: 'lit',
|
|
13
|
-
componentRef: 'c_parent',
|
|
14
|
-
propsRef: 'p_parent',
|
|
15
|
-
slotRef: 's_parent',
|
|
16
|
-
}),
|
|
17
|
-
createComponentMarker({
|
|
18
|
-
nodeId: 'n_2',
|
|
19
|
-
integration: 'react',
|
|
20
|
-
componentRef: 'c_child',
|
|
21
|
-
propsRef: 'p_child',
|
|
22
|
-
}),
|
|
23
|
-
'</main>',
|
|
24
|
-
].join('');
|
|
25
|
-
|
|
26
|
-
const graph = extractComponentGraph(html, {
|
|
27
|
-
s_parent: ['n_2'],
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
const resolved = await resolveComponentGraph(html, graph, async (marker) => {
|
|
31
|
-
if (marker.nodeId === 'n_2') {
|
|
32
|
-
return { html: '<section>child</section>' };
|
|
33
|
-
}
|
|
34
|
-
return { html: '<article>parent</article>' };
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
expect(resolved).toContain('<article>parent</article>');
|
|
38
|
-
expect(resolved).toContain('<section>child</section>');
|
|
39
|
-
expect(resolved).not.toContain('<eco-marker');
|
|
40
|
-
});
|
|
41
|
-
});
|