@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,223 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect } from 'vitest';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import * as v from 'valibot';
|
|
4
|
-
import { type } from 'arktype';
|
|
5
|
-
import { SchemaValidationService } from './schema-validation-service.ts';
|
|
6
|
-
|
|
7
|
-
describe('SchemaValidationService', () => {
|
|
8
|
-
const service = new SchemaValidationService();
|
|
9
|
-
|
|
10
|
-
describe('Zod validation', () => {
|
|
11
|
-
test('validates body with Zod schema', async () => {
|
|
12
|
-
const schema = z.object({
|
|
13
|
-
title: z.string().min(1),
|
|
14
|
-
count: z.number(),
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
const result = await service.validateRequest(
|
|
18
|
-
{ body: { title: 'Hello', count: 42 } },
|
|
19
|
-
{ body: schema as unknown as Parameters<typeof service.validateRequest>[1]['body'] },
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
expect(result.success).toBe(true);
|
|
23
|
-
expect(result.data?.body).toEqual({ title: 'Hello', count: 42 });
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
test('rejects invalid body with Zod schema', async () => {
|
|
27
|
-
const schema = z.object({
|
|
28
|
-
title: z.string().min(1),
|
|
29
|
-
count: z.number(),
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
const result = await service.validateRequest(
|
|
33
|
-
{ body: { title: '', count: 'not-a-number' } },
|
|
34
|
-
{ body: schema as unknown as Parameters<typeof service.validateRequest>[1]['body'] },
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
expect(result.success).toBe(false);
|
|
38
|
-
expect(result.errors).toBeDefined();
|
|
39
|
-
expect(result.errors!.length).toBeGreaterThan(0);
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
describe('Valibot validation', () => {
|
|
44
|
-
test('validates query with Valibot schema', async () => {
|
|
45
|
-
const schema = v.object({
|
|
46
|
-
page: v.string(),
|
|
47
|
-
limit: v.string(),
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
const result = await service.validateRequest(
|
|
51
|
-
{ query: { page: '1', limit: '10' } },
|
|
52
|
-
{ query: schema as unknown as Parameters<typeof service.validateRequest>[1]['query'] },
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
expect(result.success).toBe(true);
|
|
56
|
-
expect(result.data?.query).toEqual({ page: '1', limit: '10' });
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
test('rejects invalid query with Valibot schema', async () => {
|
|
60
|
-
const schema = v.object({
|
|
61
|
-
page: v.pipe(v.string(), v.minLength(1)),
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
const result = await service.validateRequest(
|
|
65
|
-
{ query: { page: '' } },
|
|
66
|
-
{ query: schema as unknown as Parameters<typeof service.validateRequest>[1]['query'] },
|
|
67
|
-
);
|
|
68
|
-
|
|
69
|
-
expect(result.success).toBe(false);
|
|
70
|
-
expect(result.errors).toBeDefined();
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
describe('ArkType validation', () => {
|
|
75
|
-
test('validates headers with ArkType schema', async () => {
|
|
76
|
-
const schema = type({
|
|
77
|
-
'content-type': 'string',
|
|
78
|
-
authorization: 'string',
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
const result = await service.validateRequest(
|
|
82
|
-
{
|
|
83
|
-
headers: {
|
|
84
|
-
'content-type': 'application/json',
|
|
85
|
-
authorization: 'Bearer token',
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
{ headers: schema as unknown as Parameters<typeof service.validateRequest>[1]['headers'] },
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
expect(result.success).toBe(true);
|
|
92
|
-
expect(result.data?.headers).toEqual({
|
|
93
|
-
'content-type': 'application/json',
|
|
94
|
-
authorization: 'Bearer token',
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
test('rejects invalid headers with ArkType schema', async () => {
|
|
99
|
-
const schema = type({
|
|
100
|
-
'content-type': 'string',
|
|
101
|
-
'x-custom': 'string>5',
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
const result = await service.validateRequest(
|
|
105
|
-
{
|
|
106
|
-
headers: {
|
|
107
|
-
'content-type': 'application/json',
|
|
108
|
-
'x-custom': 'ab',
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
{ headers: schema as unknown as Parameters<typeof service.validateRequest>[1]['headers'] },
|
|
112
|
-
);
|
|
113
|
-
|
|
114
|
-
expect(result.success).toBe(false);
|
|
115
|
-
expect(result.errors).toBeDefined();
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
describe('Combined validation', () => {
|
|
120
|
-
test('validates multiple sources at once', async () => {
|
|
121
|
-
const bodySchema = z.object({
|
|
122
|
-
title: z.string(),
|
|
123
|
-
});
|
|
124
|
-
const querySchema = v.object({
|
|
125
|
-
format: v.string(),
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
const result = await service.validateRequest(
|
|
129
|
-
{
|
|
130
|
-
body: { title: 'Post Title' },
|
|
131
|
-
query: { format: 'json' },
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
body: bodySchema as unknown as Parameters<typeof service.validateRequest>[1]['body'],
|
|
135
|
-
query: querySchema as unknown as Parameters<typeof service.validateRequest>[1]['query'],
|
|
136
|
-
},
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
expect(result.success).toBe(true);
|
|
140
|
-
expect(result.data?.body).toEqual({ title: 'Post Title' });
|
|
141
|
-
expect(result.data?.query).toEqual({ format: 'json' });
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
test('validates route params with schema', async () => {
|
|
145
|
-
const paramsSchema = z.object({
|
|
146
|
-
id: z.coerce.number().int(),
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
const result = await service.validateRequest(
|
|
150
|
-
{
|
|
151
|
-
params: { id: '42' },
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
params: paramsSchema as unknown as Parameters<typeof service.validateRequest>[1]['params'],
|
|
155
|
-
},
|
|
156
|
-
);
|
|
157
|
-
|
|
158
|
-
expect(result.success).toBe(true);
|
|
159
|
-
expect(result.data?.params).toEqual({ id: 42 });
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
test('aggregates errors from multiple sources', async () => {
|
|
163
|
-
const bodySchema = z.object({
|
|
164
|
-
title: z.string().min(5),
|
|
165
|
-
});
|
|
166
|
-
const querySchema = v.object({
|
|
167
|
-
page: v.pipe(v.string(), v.regex(/^\d+$/)),
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
const result = await service.validateRequest(
|
|
171
|
-
{
|
|
172
|
-
body: { title: 'ab' },
|
|
173
|
-
query: { page: 'invalid' },
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
body: bodySchema as unknown as Parameters<typeof service.validateRequest>[1]['body'],
|
|
177
|
-
query: querySchema as unknown as Parameters<typeof service.validateRequest>[1]['query'],
|
|
178
|
-
},
|
|
179
|
-
);
|
|
180
|
-
|
|
181
|
-
expect(result.success).toBe(false);
|
|
182
|
-
expect(result.errors).toBeDefined();
|
|
183
|
-
expect(result.errors!.length).toBeGreaterThan(1);
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
describe('Edge cases', () => {
|
|
188
|
-
test('handles missing optional schemas', async () => {
|
|
189
|
-
const result = await service.validateRequest({ body: { data: 'test' } }, {});
|
|
190
|
-
|
|
191
|
-
expect(result.success).toBe(true);
|
|
192
|
-
expect(result.data).toEqual({});
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
test('handles undefined source data', async () => {
|
|
196
|
-
const schema = z.object({ name: z.string() });
|
|
197
|
-
|
|
198
|
-
const result = await service.validateRequest(
|
|
199
|
-
{ body: undefined },
|
|
200
|
-
{ body: schema as unknown as Parameters<typeof service.validateRequest>[1]['body'] },
|
|
201
|
-
);
|
|
202
|
-
|
|
203
|
-
expect(result.success).toBe(true);
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
test('catches validation exceptions', async () => {
|
|
207
|
-
const brokenSchema = {
|
|
208
|
-
'~standard': {
|
|
209
|
-
version: 1,
|
|
210
|
-
vendor: 'test',
|
|
211
|
-
validate: () => {
|
|
212
|
-
throw new Error('Validation crashed');
|
|
213
|
-
},
|
|
214
|
-
},
|
|
215
|
-
} as const;
|
|
216
|
-
|
|
217
|
-
const result = await service.validateRequest({ body: { test: true } }, { body: brokenSchema });
|
|
218
|
-
|
|
219
|
-
expect(result.success).toBe(false);
|
|
220
|
-
expect(result.errors?.[0]?.message).toBe('Validation crashed');
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
});
|
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import { fileSystem } from '@ecopages/file-system';
|
|
3
|
-
import { StaticSiteGenerator } from './static-site-generator';
|
|
4
|
-
import type { EcoPagesAppConfig } from '../internal-types';
|
|
5
|
-
import type { FSRouter } from '../router/server/fs-router';
|
|
6
|
-
import type { RouteRendererFactory } from '../route-renderer/route-renderer';
|
|
7
|
-
import { appLogger } from '../global/app-logger.ts';
|
|
8
|
-
import { PageModuleImportService } from '../services/module-loading/page-module-import.service';
|
|
9
|
-
import { DEFAULT_ECOPAGES_WORK_DIR } from '../constants.ts';
|
|
10
|
-
|
|
11
|
-
const originalEnsureDir = fileSystem.ensureDir;
|
|
12
|
-
const originalWrite = fileSystem.write;
|
|
13
|
-
|
|
14
|
-
const createMockConfig = (overrides: Partial<EcoPagesAppConfig> = {}): EcoPagesAppConfig =>
|
|
15
|
-
({
|
|
16
|
-
rootDir: '/test/project',
|
|
17
|
-
distDir: 'dist',
|
|
18
|
-
workDir: DEFAULT_ECOPAGES_WORK_DIR,
|
|
19
|
-
srcDir: 'src',
|
|
20
|
-
robotsTxt: {
|
|
21
|
-
preferences: {
|
|
22
|
-
'*': ['/admin', '/private'],
|
|
23
|
-
Googlebot: ['/no-google'],
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
absolutePaths: {
|
|
27
|
-
distDir: '/test/project/dist',
|
|
28
|
-
workDir: '/test/project/.eco',
|
|
29
|
-
} as EcoPagesAppConfig['absolutePaths'],
|
|
30
|
-
integrations: [],
|
|
31
|
-
...overrides,
|
|
32
|
-
}) as EcoPagesAppConfig;
|
|
33
|
-
|
|
34
|
-
describe('StaticSiteGenerator', () => {
|
|
35
|
-
let ensureDirMock: any;
|
|
36
|
-
let writeMock: any;
|
|
37
|
-
|
|
38
|
-
beforeEach(() => {
|
|
39
|
-
ensureDirMock = vi.fn(() => {});
|
|
40
|
-
writeMock = vi.fn(() => {});
|
|
41
|
-
fileSystem.ensureDir = ensureDirMock;
|
|
42
|
-
fileSystem.write = writeMock;
|
|
43
|
-
vi.spyOn(PageModuleImportService.prototype, 'importModule').mockResolvedValue({
|
|
44
|
-
default: Object.assign(() => null, { cache: 'static' }),
|
|
45
|
-
});
|
|
46
|
-
vi.spyOn(appLogger, 'warn').mockReturnValue(appLogger);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
afterEach(() => {
|
|
50
|
-
fileSystem.ensureDir = originalEnsureDir;
|
|
51
|
-
fileSystem.write = originalWrite;
|
|
52
|
-
vi.restoreAllMocks();
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe('constructor', () => {
|
|
56
|
-
test('should create instance with appConfig', () => {
|
|
57
|
-
const config = createMockConfig();
|
|
58
|
-
const ssg = new StaticSiteGenerator({ appConfig: config });
|
|
59
|
-
expect(ssg.appConfig).toBe(config);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
describe('isRootDir', () => {
|
|
64
|
-
test('should return true for root path /', () => {
|
|
65
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
66
|
-
expect(ssg.isRootDir('/')).toBe(true);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test('should return false for nested path /foo/bar', () => {
|
|
70
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
71
|
-
expect(ssg.isRootDir('/foo/bar')).toBe(false);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test('should return false for deeply nested paths', () => {
|
|
75
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
76
|
-
expect(ssg.isRootDir('/a/b/c/d')).toBe(false);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test('should return null (falsy) for paths without slashes', () => {
|
|
80
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
81
|
-
expect(ssg.isRootDir('no-slashes')).toBeFalsy();
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
describe('getDirectories', () => {
|
|
86
|
-
test('should return empty array for root-level routes', () => {
|
|
87
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
88
|
-
const dirs = ssg.getDirectories(['/about', '/contact']);
|
|
89
|
-
expect(dirs).toEqual([]);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
test('should extract directories from nested routes', () => {
|
|
93
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
94
|
-
const dirs = ssg.getDirectories(['/blog/post-1', '/blog/post-2', '/docs/api']);
|
|
95
|
-
expect(dirs).toContain('/blog');
|
|
96
|
-
expect(dirs).toContain('/docs');
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
test('should handle HTTP URLs and extract pathname', () => {
|
|
100
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
101
|
-
const dirs = ssg.getDirectories(['http://localhost:3000/blog/post']);
|
|
102
|
-
expect(dirs).toContain('/blog');
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
test('should deduplicate directories', () => {
|
|
106
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
107
|
-
const dirs = ssg.getDirectories(['/blog/a', '/blog/b', '/blog/c']);
|
|
108
|
-
expect(dirs.filter((d) => d === '/blog').length).toBe(1);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
test('should handle deeply nested paths', () => {
|
|
112
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
113
|
-
const dirs = ssg.getDirectories(['/a/b/c/page']);
|
|
114
|
-
expect(dirs).toContain('/a/b/c');
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
describe('generateRobotsTxt', () => {
|
|
119
|
-
test('should generate robots.txt with preferences from config', () => {
|
|
120
|
-
const config = createMockConfig();
|
|
121
|
-
const ssg = new StaticSiteGenerator({ appConfig: config });
|
|
122
|
-
|
|
123
|
-
ssg.generateRobotsTxt();
|
|
124
|
-
|
|
125
|
-
expect(ensureDirMock).toHaveBeenCalledWith('/test/project/dist');
|
|
126
|
-
expect(writeMock).toHaveBeenCalledWith('/test/project/dist/robots.txt', expect.any(String));
|
|
127
|
-
|
|
128
|
-
const writtenContent = writeMock.mock.calls[0][1] as string;
|
|
129
|
-
expect(writtenContent).toContain('user-agent: *');
|
|
130
|
-
expect(writtenContent).toContain('disallow: /admin');
|
|
131
|
-
expect(writtenContent).toContain('disallow: /private');
|
|
132
|
-
expect(writtenContent).toContain('user-agent: Googlebot');
|
|
133
|
-
expect(writtenContent).toContain('disallow: /no-google');
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
test('should handle empty preferences', () => {
|
|
137
|
-
const config = createMockConfig({
|
|
138
|
-
robotsTxt: { preferences: {} },
|
|
139
|
-
});
|
|
140
|
-
const ssg = new StaticSiteGenerator({ appConfig: config });
|
|
141
|
-
|
|
142
|
-
ssg.generateRobotsTxt();
|
|
143
|
-
|
|
144
|
-
expect(writeMock).toHaveBeenCalledWith('/test/project/dist/robots.txt', '');
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
describe('generateStaticPages', () => {
|
|
149
|
-
const createMockRouter = (routes: Record<string, { filePath: string; pathname: string }>) =>
|
|
150
|
-
({
|
|
151
|
-
routes: Object.fromEntries(
|
|
152
|
-
Object.entries(routes).map(([key, value]) => [key, { ...value, kind: 'exact' }]),
|
|
153
|
-
),
|
|
154
|
-
origin: 'http://localhost:3000',
|
|
155
|
-
}) as unknown as FSRouter;
|
|
156
|
-
|
|
157
|
-
test('should filter out dynamic routes containing [', async () => {
|
|
158
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
159
|
-
const Router = createMockRouter({
|
|
160
|
-
'/static': { filePath: '/src/pages/static.ghtml.ts', pathname: '/static' },
|
|
161
|
-
'/dynamic/[id]': { filePath: '/src/pages/dynamic/[id].ghtml.ts', pathname: '/dynamic/[id]' },
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
const RendererFactory = {
|
|
165
|
-
createRenderer: vi.fn(() => ({
|
|
166
|
-
createRoute: vi.fn(async () => ({ body: '<html>Static</html>' })),
|
|
167
|
-
})),
|
|
168
|
-
} as unknown as RouteRendererFactory;
|
|
169
|
-
|
|
170
|
-
await ssg.generateStaticPages(Router, 'http://localhost:3000', RendererFactory);
|
|
171
|
-
|
|
172
|
-
expect(writeMock).toHaveBeenCalledTimes(1);
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
test('should create directories for nested routes', async () => {
|
|
176
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
177
|
-
const Router = createMockRouter({
|
|
178
|
-
'/blog/post': { filePath: '/src/pages/blog/post.ghtml.ts', pathname: '/blog/post' },
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
const RendererFactory = {
|
|
182
|
-
createRenderer: vi.fn(() => ({
|
|
183
|
-
createRoute: vi.fn(async () => ({ body: '<html>Blog Post</html>' })),
|
|
184
|
-
})),
|
|
185
|
-
} as unknown as RouteRendererFactory;
|
|
186
|
-
|
|
187
|
-
await ssg.generateStaticPages(Router, 'http://localhost:3000', RendererFactory);
|
|
188
|
-
|
|
189
|
-
expect(ensureDirMock).toHaveBeenCalled();
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
test('should throw error when routeRendererFactory is missing for render strategy', async () => {
|
|
193
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
194
|
-
const Router = createMockRouter({
|
|
195
|
-
'/page': { filePath: '/src/pages/page.ghtml.ts', pathname: '/page' },
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
await ssg.generateStaticPages(Router, 'http://localhost:3000', undefined);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
test('should write index.html for root path', async () => {
|
|
202
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
203
|
-
const Router = createMockRouter({
|
|
204
|
-
'/': { filePath: '/src/pages/index.ghtml.ts', pathname: '/' },
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
const RendererFactory = {
|
|
208
|
-
createRenderer: vi.fn(() => ({
|
|
209
|
-
createRoute: vi.fn(async () => ({ body: '<html>Home</html>' })),
|
|
210
|
-
})),
|
|
211
|
-
} as unknown as RouteRendererFactory;
|
|
212
|
-
|
|
213
|
-
await ssg.generateStaticPages(Router, 'http://localhost:3000', RendererFactory);
|
|
214
|
-
|
|
215
|
-
expect(writeMock).toHaveBeenCalledWith(expect.stringContaining('index.html'), '<html>Home</html>');
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
test('should handle Buffer content from renderer', async () => {
|
|
219
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
220
|
-
const Router = createMockRouter({
|
|
221
|
-
'/': { filePath: '/src/pages/index.ghtml.ts', pathname: '/' },
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
const bufferContent = Buffer.from('<html>Buffer Content</html>');
|
|
225
|
-
const RendererFactory = {
|
|
226
|
-
createRenderer: vi.fn(() => ({
|
|
227
|
-
createRoute: vi.fn(async () => ({ body: bufferContent })),
|
|
228
|
-
})),
|
|
229
|
-
} as unknown as RouteRendererFactory;
|
|
230
|
-
|
|
231
|
-
await ssg.generateStaticPages(Router, 'http://localhost:3000', RendererFactory);
|
|
232
|
-
|
|
233
|
-
expect(writeMock).toHaveBeenCalledWith(expect.stringContaining('index.html'), bufferContent);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
test('should skip cache dynamic pages during static generation and log a warning', async () => {
|
|
237
|
-
vi.spyOn(PageModuleImportService.prototype, 'importModule').mockResolvedValue({
|
|
238
|
-
default: Object.assign(() => null, { cache: 'dynamic' }),
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
242
|
-
const Router = createMockRouter({
|
|
243
|
-
'/dashboard': { filePath: '/src/pages/dashboard.tsx', pathname: '/dashboard' },
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
const RendererFactory = {
|
|
247
|
-
createRenderer: vi.fn(() => ({
|
|
248
|
-
createRoute: vi.fn(async () => ({ body: '<html>Dashboard</html>' })),
|
|
249
|
-
})),
|
|
250
|
-
} as unknown as RouteRendererFactory;
|
|
251
|
-
|
|
252
|
-
await ssg.generateStaticPages(Router, 'http://localhost:3000', RendererFactory);
|
|
253
|
-
|
|
254
|
-
expect(RendererFactory.createRenderer).not.toHaveBeenCalled();
|
|
255
|
-
expect(writeMock).not.toHaveBeenCalled();
|
|
256
|
-
expect(appLogger.warn).toHaveBeenCalledWith(
|
|
257
|
-
"Pages with cache: 'dynamic' are not supported in static generation or preview, so they will be skipped\n",
|
|
258
|
-
'➤ /src/pages/dashboard.tsx',
|
|
259
|
-
);
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
describe('run', () => {
|
|
264
|
-
test('should call generateRobotsTxt and generateStaticPages', async () => {
|
|
265
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
266
|
-
const Router = {
|
|
267
|
-
routes: {},
|
|
268
|
-
origin: 'http://localhost:3000',
|
|
269
|
-
} as unknown as FSRouter;
|
|
270
|
-
|
|
271
|
-
await ssg.run({
|
|
272
|
-
router: Router,
|
|
273
|
-
baseUrl: 'http://localhost:3000',
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
expect(ensureDirMock).toHaveBeenCalled();
|
|
277
|
-
expect(writeMock).toHaveBeenCalledWith('/test/project/dist/robots.txt', expect.any(String));
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
test('should skip explicit static routes backed by cache dynamic views', async () => {
|
|
281
|
-
const ssg = new StaticSiteGenerator({ appConfig: createMockConfig() });
|
|
282
|
-
const dynamicView = Object.assign(() => null, { cache: 'dynamic' }) as any;
|
|
283
|
-
|
|
284
|
-
await ssg.run({
|
|
285
|
-
router: {
|
|
286
|
-
routes: {},
|
|
287
|
-
origin: 'http://localhost:3000',
|
|
288
|
-
} as unknown as FSRouter,
|
|
289
|
-
baseUrl: 'http://localhost:3000',
|
|
290
|
-
routeRendererFactory: {
|
|
291
|
-
getRendererByIntegration: vi.fn(),
|
|
292
|
-
} as unknown as RouteRendererFactory,
|
|
293
|
-
staticRoutes: [
|
|
294
|
-
{
|
|
295
|
-
path: '/dashboard',
|
|
296
|
-
loader: async () => ({ default: dynamicView }),
|
|
297
|
-
},
|
|
298
|
-
],
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
expect(appLogger.warn).toHaveBeenCalledWith(
|
|
302
|
-
"Pages with cache: 'dynamic' are not supported in static generation or preview, so they will be skipped\n",
|
|
303
|
-
'➤ /dashboard',
|
|
304
|
-
);
|
|
305
|
-
});
|
|
306
|
-
});
|
|
307
|
-
});
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { deepMerge } from './deep-merge.ts';
|
|
3
|
-
|
|
4
|
-
describe('deepMerge', () => {
|
|
5
|
-
it('should merge two objects with nested properties', () => {
|
|
6
|
-
const target = { a: 1, b: { c: 2 } };
|
|
7
|
-
const source = { b: { d: 3 }, e: 4 };
|
|
8
|
-
const expected = { a: 1, b: { c: 2, d: 3 }, e: 4 };
|
|
9
|
-
const result = deepMerge(target, source);
|
|
10
|
-
expect(result).toEqual(expected);
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it('should merge two objects with overlapping properties', () => {
|
|
14
|
-
const target = { a: 1, b: 2 };
|
|
15
|
-
const source = { b: 3, c: 4 };
|
|
16
|
-
const expected = { a: 1, b: 3, c: 4 };
|
|
17
|
-
const result = deepMerge(target, source);
|
|
18
|
-
expect(result).toEqual(expected);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('should merge two objects with arrays', () => {
|
|
22
|
-
const target = { a: [1, 2], b: { c: [3, 4] } };
|
|
23
|
-
const source = { a: [5, 6], b: { c: [7, 8] } };
|
|
24
|
-
const expected = { a: [1, 2, 5, 6], b: { c: [3, 4, 7, 8] } };
|
|
25
|
-
const result = deepMerge(target, source);
|
|
26
|
-
expect(result).toEqual(expected);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('should merge two objects with nested objects', () => {
|
|
30
|
-
const target = { a: { b: 1, c: 2 }, d: 3 };
|
|
31
|
-
const source = { a: { c: 3, d: 4 }, e: 5 };
|
|
32
|
-
const expected = { a: { b: 1, c: 3, d: 4 }, d: 3, e: 5 };
|
|
33
|
-
const result = deepMerge(target, source);
|
|
34
|
-
expect(result).toEqual(expected);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('should overwrite non-object properties in the target', () => {
|
|
38
|
-
const target = { a: 1, b: 2 };
|
|
39
|
-
const source = { a: 3, c: 4 };
|
|
40
|
-
const expected = { a: 3, b: 2, c: 4 };
|
|
41
|
-
const result = deepMerge(target, source);
|
|
42
|
-
expect(result).toEqual(expected);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('should add properties from the source that are not in the target', () => {
|
|
46
|
-
const target = { a: 1 };
|
|
47
|
-
const source = { b: 2 };
|
|
48
|
-
const expected = { a: 1, b: 2 };
|
|
49
|
-
const result = deepMerge(target, source);
|
|
50
|
-
expect(result).toEqual(expected);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('should return an empty object when both inputs are empty', () => {
|
|
54
|
-
const target = {};
|
|
55
|
-
const source = {};
|
|
56
|
-
const expected = {};
|
|
57
|
-
const result = deepMerge(target, source);
|
|
58
|
-
expect(result).toEqual(expected);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('should ignore properties in the source that are undefined', () => {
|
|
62
|
-
const target = { a: 1, b: 2 };
|
|
63
|
-
const source = { a: undefined, c: 3 } as Partial<typeof target>;
|
|
64
|
-
const expected = { a: 1, b: 2, c: 3 };
|
|
65
|
-
const result = deepMerge(target, source);
|
|
66
|
-
expect(result).toEqual(expected);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('should merge dependencies', () => {
|
|
70
|
-
const depsA = {
|
|
71
|
-
stylesheets: ['/components/radiant-counter/radiant-counter.css'],
|
|
72
|
-
scripts: ['/components/radiant-counter/radiant-counter.script.ts'],
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
const depsB = {
|
|
76
|
-
stylesheets: [
|
|
77
|
-
'/layouts/docs-layout/docs-layout.css',
|
|
78
|
-
'/layouts/base-layout/base-layout.css',
|
|
79
|
-
'/components/header/header.css',
|
|
80
|
-
'/components/navigation/navigation.css',
|
|
81
|
-
'/components/logo/logo.css',
|
|
82
|
-
'/components/code-block/code-block.css',
|
|
83
|
-
],
|
|
84
|
-
scripts: ['/layouts/base-layout/base-layout.script.ts'],
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const expected = {
|
|
88
|
-
stylesheets: [
|
|
89
|
-
'/components/radiant-counter/radiant-counter.css',
|
|
90
|
-
'/layouts/docs-layout/docs-layout.css',
|
|
91
|
-
'/layouts/base-layout/base-layout.css',
|
|
92
|
-
'/components/header/header.css',
|
|
93
|
-
'/components/navigation/navigation.css',
|
|
94
|
-
'/components/logo/logo.css',
|
|
95
|
-
'/components/code-block/code-block.css',
|
|
96
|
-
],
|
|
97
|
-
scripts: [
|
|
98
|
-
'/components/radiant-counter/radiant-counter.script.ts',
|
|
99
|
-
'/layouts/base-layout/base-layout.script.ts',
|
|
100
|
-
],
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
const result = deepMerge(depsA, depsB);
|
|
104
|
-
expect(result).toEqual(expected);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('should merge two arrays', () => {
|
|
108
|
-
const target = [1, 2, 3];
|
|
109
|
-
const source = [4, 5, 6];
|
|
110
|
-
const expected = [1, 2, 3, 4, 5, 6];
|
|
111
|
-
const result = deepMerge(target, source);
|
|
112
|
-
expect(result).toEqual(expected);
|
|
113
|
-
});
|
|
114
|
-
});
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'vitest';
|
|
2
|
-
import { invariant } from './invariant.ts';
|
|
3
|
-
|
|
4
|
-
describe('invariant', () => {
|
|
5
|
-
test('should not throw an error when the condition is true', () => {
|
|
6
|
-
expect(() => {
|
|
7
|
-
invariant(true);
|
|
8
|
-
}).not.toThrow();
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
test('should throw an error with the default message when the condition is false', () => {
|
|
12
|
-
expect(() => {
|
|
13
|
-
invariant(false);
|
|
14
|
-
}).toThrowError('[ecopages] An error occurred');
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
test('should throw an error with the provided message when the condition is false', () => {
|
|
18
|
-
expect(() => {
|
|
19
|
-
invariant(false, 'Custom error message');
|
|
20
|
-
}).toThrowError('[ecopages] Custom error message');
|
|
21
|
-
});
|
|
22
|
-
});
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'vitest';
|
|
2
|
-
import { PathUtils } from './path-utils.module.ts';
|
|
3
|
-
|
|
4
|
-
describe('PathUtils', () => {
|
|
5
|
-
test.each([
|
|
6
|
-
['packages/core/src/utils/file-name-analyzer.ts', '.ts'],
|
|
7
|
-
['packages/playground/src/pages/blog/author/%5Bid%5D.kita.tsx', '.kita.tsx'],
|
|
8
|
-
['packages/core/src/component-utils/deps-manager.ts', '.ts'],
|
|
9
|
-
['/packages/core/src/plugins/build-html-pages/build-html-pages.plugin.ts', '.plugin.ts'],
|
|
10
|
-
['packages/core/src/ecopages.fake.descriptor.ts', '.descriptor.ts'],
|
|
11
|
-
])('getEcoTemplateExtension: %p should return %p', (filePath, expected) => {
|
|
12
|
-
const result = PathUtils.getEcoTemplateExtension(filePath);
|
|
13
|
-
expect(result).toBe(expected);
|
|
14
|
-
});
|
|
15
|
-
});
|