nuclie 1.0.0
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/LICENSE +21 -0
- package/README.md +516 -0
- package/dist/ai/analyzer.d.ts +29 -0
- package/dist/ai/analyzer.js +202 -0
- package/dist/ai/chat/cli.d.ts +3 -0
- package/dist/ai/chat/cli.js +38 -0
- package/dist/ai/client.d.ts +17 -0
- package/dist/ai/client.js +68 -0
- package/dist/ai/cloud/api.d.ts +28 -0
- package/dist/ai/cloud/api.js +118 -0
- package/dist/ai/cloud/modelSync.d.ts +18 -0
- package/dist/ai/cloud/modelSync.js +104 -0
- package/dist/ai/cloud/telemetry.d.ts +14 -0
- package/dist/ai/cloud/telemetry.js +23 -0
- package/dist/ai/config.d.ts +14 -0
- package/dist/ai/config.js +9 -0
- package/dist/ai/core/errorMemory.d.ts +14 -0
- package/dist/ai/core/errorMemory.js +36 -0
- package/dist/ai/dashboard/cli.d.ts +3 -0
- package/dist/ai/dashboard/cli.js +32 -0
- package/dist/ai/healer/applier.d.ts +9 -0
- package/dist/ai/healer/applier.js +74 -0
- package/dist/ai/healer/cli.d.ts +3 -0
- package/dist/ai/healer/cli.js +57 -0
- package/dist/ai/healer/collector.d.ts +16 -0
- package/dist/ai/healer/collector.js +41 -0
- package/dist/ai/healer/fixer.d.ts +12 -0
- package/dist/ai/healer/fixer.js +40 -0
- package/dist/ai/healer/llm.d.ts +9 -0
- package/dist/ai/healer/llm.js +20 -0
- package/dist/ai/healer/parser.d.ts +16 -0
- package/dist/ai/healer/parser.js +67 -0
- package/dist/ai/learning/evolver.d.ts +8 -0
- package/dist/ai/learning/evolver.js +24 -0
- package/dist/ai/llm/fixGenerator.d.ts +9 -0
- package/dist/ai/llm/fixGenerator.js +21 -0
- package/dist/ai/llm/ollama.d.ts +10 -0
- package/dist/ai/llm/ollama.js +56 -0
- package/dist/ai/local/fixStore.d.ts +19 -0
- package/dist/ai/local/fixStore.js +105 -0
- package/dist/ai/optimizer/analyzer.d.ts +9 -0
- package/dist/ai/optimizer/analyzer.js +65 -0
- package/dist/ai/optimizer/engine.d.ts +16 -0
- package/dist/ai/optimizer/engine.js +51 -0
- package/dist/ai/optimizer/llm.d.ts +8 -0
- package/dist/ai/optimizer/llm.js +14 -0
- package/dist/ai/optimizer/profiler.d.ts +11 -0
- package/dist/ai/optimizer/profiler.js +111 -0
- package/dist/ai/optimizer/rules.d.ts +12 -0
- package/dist/ai/optimizer/rules.js +37 -0
- package/dist/ai/patterns/common.d.ts +8 -0
- package/dist/ai/patterns/common.js +181 -0
- package/dist/ai/reporter/assembler.d.ts +11 -0
- package/dist/ai/reporter/assembler.js +10 -0
- package/dist/ai/reporter/generator.d.ts +4 -0
- package/dist/ai/reporter/generator.js +42 -0
- package/dist/ai/reporter/narrator.d.ts +8 -0
- package/dist/ai/reporter/narrator.js +29 -0
- package/dist/ai/schema.d.ts +104 -0
- package/dist/ai/schema.js +45 -0
- package/dist/ai/telemetry.d.ts +14 -0
- package/dist/ai/telemetry.js +96 -0
- package/dist/audit/a11y.d.ts +5 -0
- package/dist/audit/a11y.js +123 -0
- package/dist/audit/best-practices.d.ts +5 -0
- package/dist/audit/best-practices.js +68 -0
- package/dist/audit/build-integration.d.ts +59 -0
- package/dist/audit/build-integration.js +138 -0
- package/dist/audit/core.d.ts +62 -0
- package/dist/audit/core.js +327 -0
- package/dist/audit/index.d.ts +4 -0
- package/dist/audit/index.js +60 -0
- package/dist/audit/perf.d.ts +5 -0
- package/dist/audit/perf.js +69 -0
- package/dist/audit/seo.d.ts +5 -0
- package/dist/audit/seo.js +63 -0
- package/dist/audit/types.d.ts +35 -0
- package/dist/audit/types.js +1 -0
- package/dist/audit-stub/types.d.ts +25 -0
- package/dist/audit-stub/types.js +1 -0
- package/dist/build/bundle-stats.d.ts +2 -0
- package/dist/build/bundle-stats.js +42 -0
- package/dist/build/bundler.d.ts +46 -0
- package/dist/build/bundler.js +31 -0
- package/dist/build/index.d.ts +36 -0
- package/dist/build/index.js +69 -0
- package/dist/build/pipeline.d.ts +31 -0
- package/dist/build/pipeline.js +68 -0
- package/dist/builder/server.d.ts +11 -0
- package/dist/builder/server.js +253 -0
- package/dist/cache/incremental.d.ts +75 -0
- package/dist/cache/incremental.js +200 -0
- package/dist/cache/index.d.ts +17 -0
- package/dist/cache/index.js +186 -0
- package/dist/cache/rocksdb.d.ts +18 -0
- package/dist/cache/rocksdb.js +63 -0
- package/dist/cli/css-cli.d.ts +5 -0
- package/dist/cli/css-cli.js +112 -0
- package/dist/cli/inspect.d.ts +1 -0
- package/dist/cli/inspect.js +94 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +586 -0
- package/dist/commands/analyze.d.ts +1 -0
- package/dist/commands/analyze.js +295 -0
- package/dist/commands/doctor.d.ts +21 -0
- package/dist/commands/doctor.js +364 -0
- package/dist/commands/ssr.d.ts +12 -0
- package/dist/commands/ssr.js +30 -0
- package/dist/commands/verify.d.ts +38 -0
- package/dist/commands/verify.js +459 -0
- package/dist/config/index.d.ts +145 -0
- package/dist/config/index.js +227 -0
- package/dist/config/live-config.d.ts +22 -0
- package/dist/config/live-config.js +88 -0
- package/dist/core/__tests__/permissions.test.d.ts +1 -0
- package/dist/core/__tests__/permissions.test.js +16 -0
- package/dist/core/__tests__/universal-transformer.test.d.ts +1 -0
- package/dist/core/__tests__/universal-transformer.test.js +27 -0
- package/dist/core/build/globalOptimizer.d.ts +8 -0
- package/dist/core/build/globalOptimizer.js +21 -0
- package/dist/core/build/incremental.d.ts +13 -0
- package/dist/core/build/incremental.js +29 -0
- package/dist/core/bundler-rolldown.d.ts +42 -0
- package/dist/core/bundler-rolldown.js +100 -0
- package/dist/core/cache/lazy-init.d.ts +50 -0
- package/dist/core/cache/lazy-init.js +153 -0
- package/dist/core/cache-manager.d.ts +51 -0
- package/dist/core/cache-manager.js +149 -0
- package/dist/core/css/engine.d.ts +37 -0
- package/dist/core/css/engine.js +113 -0
- package/dist/core/css-framework-detector.d.ts +10 -0
- package/dist/core/css-framework-detector.js +169 -0
- package/dist/core/detection/files.d.ts +2 -0
- package/dist/core/detection/files.js +77 -0
- package/dist/core/detection/index.d.ts +8 -0
- package/dist/core/detection/index.js +39 -0
- package/dist/core/detection/resolver.d.ts +2 -0
- package/dist/core/detection/resolver.js +116 -0
- package/dist/core/detection/scanner.d.ts +4 -0
- package/dist/core/detection/scanner.js +145 -0
- package/dist/core/detection/types.d.ts +33 -0
- package/dist/core/detection/types.js +12 -0
- package/dist/core/engine/cache.d.ts +18 -0
- package/dist/core/engine/cache.js +72 -0
- package/dist/core/engine/config.d.ts +11 -0
- package/dist/core/engine/config.js +158 -0
- package/dist/core/engine/emit.d.ts +8 -0
- package/dist/core/engine/emit.js +60 -0
- package/dist/core/engine/events.d.ts +13 -0
- package/dist/core/engine/events.js +35 -0
- package/dist/core/engine/execute.d.ts +5 -0
- package/dist/core/engine/execute.js +226 -0
- package/dist/core/engine/hash.d.ts +8 -0
- package/dist/core/engine/hash.js +39 -0
- package/dist/core/engine/index.d.ts +49 -0
- package/dist/core/engine/index.js +156 -0
- package/dist/core/engine/optimize.d.ts +2 -0
- package/dist/core/engine/optimize.js +99 -0
- package/dist/core/engine/plan.d.ts +9 -0
- package/dist/core/engine/plan.js +196 -0
- package/dist/core/engine/types.d.ts +120 -0
- package/dist/core/engine/types.js +1 -0
- package/dist/core/errors/hero-errors.d.ts +57 -0
- package/dist/core/errors/hero-errors.js +269 -0
- package/dist/core/framework-detector.d.ts +20 -0
- package/dist/core/framework-detector.js +148 -0
- package/dist/core/graph/js-graph-analyzer.d.ts +51 -0
- package/dist/core/graph/js-graph-analyzer.js +178 -0
- package/dist/core/graph/serializer.d.ts +7 -0
- package/dist/core/graph/serializer.js +24 -0
- package/dist/core/interop/analyze.d.ts +8 -0
- package/dist/core/interop/analyze.js +82 -0
- package/dist/core/interop/analyze_ast.d.ts +9 -0
- package/dist/core/interop/analyze_ast.js +174 -0
- package/dist/core/interop/index.d.ts +19 -0
- package/dist/core/interop/index.js +36 -0
- package/dist/core/interop/resolve.d.ts +9 -0
- package/dist/core/interop/resolve.js +55 -0
- package/dist/core/interop/types.d.ts +28 -0
- package/dist/core/interop/types.js +2 -0
- package/dist/core/interop/wrapper.d.ts +11 -0
- package/dist/core/interop/wrapper.js +50 -0
- package/dist/core/parser-bun.d.ts +54 -0
- package/dist/core/parser-bun.js +86 -0
- package/dist/core/permissions.d.ts +16 -0
- package/dist/core/permissions.js +47 -0
- package/dist/core/pipeline/framework-pipeline.d.ts +71 -0
- package/dist/core/pipeline/framework-pipeline.js +113 -0
- package/dist/core/plugins/index.d.ts +5 -0
- package/dist/core/plugins/index.js +5 -0
- package/dist/core/plugins/manager.d.ts +30 -0
- package/dist/core/plugins/manager.js +123 -0
- package/dist/core/plugins/sandbox_js.d.ts +9 -0
- package/dist/core/plugins/sandbox_js.js +37 -0
- package/dist/core/plugins/sandbox_wasm.d.ts +10 -0
- package/dist/core/plugins/sandbox_wasm.js +68 -0
- package/dist/core/plugins/types.d.ts +37 -0
- package/dist/core/plugins/types.js +2 -0
- package/dist/core/plugins/validation.d.ts +8 -0
- package/dist/core/plugins/validation.js +30 -0
- package/dist/core/sandbox.d.ts +9 -0
- package/dist/core/sandbox.js +79 -0
- package/dist/core/steps/css-optimization.d.ts +65 -0
- package/dist/core/steps/css-optimization.js +318 -0
- package/dist/core/steps.d.ts +7 -0
- package/dist/core/steps.js +17 -0
- package/dist/core/transform/batchTransformer.d.ts +12 -0
- package/dist/core/transform/batchTransformer.js +24 -0
- package/dist/core/transform/transformer.d.ts +9 -0
- package/dist/core/transform/transformer.js +189 -0
- package/dist/core/universal-transformer.d.ts +81 -0
- package/dist/core/universal-transformer.js +780 -0
- package/dist/create/index.d.ts +25 -0
- package/dist/create/index.js +584 -0
- package/dist/create/ui.d.ts +13 -0
- package/dist/create/ui.js +218 -0
- package/dist/create-nuclie/cli.d.ts +7 -0
- package/dist/create-nuclie/cli.js +73 -0
- package/dist/create-nuclie/templates.d.ts +18 -0
- package/dist/create-nuclie/templates.js +73 -0
- package/dist/create-nuclie.d.ts +2 -0
- package/dist/create-nuclie.js +7 -0
- package/dist/dashboard/metrics.d.ts +31 -0
- package/dist/dashboard/metrics.js +59 -0
- package/dist/dashboard/server/router.d.ts +52 -0
- package/dist/dashboard/server/router.js +36 -0
- package/dist/dev/__tests__/preBundler.test.d.ts +1 -0
- package/dist/dev/__tests__/preBundler.test.js +51 -0
- package/dist/dev/configWatcher.d.ts +10 -0
- package/dist/dev/configWatcher.js +42 -0
- package/dist/dev/devServer.d.ts +2 -0
- package/dist/dev/devServer.js +1398 -0
- package/dist/dev/devServer.minimal.d.ts +8 -0
- package/dist/dev/devServer.minimal.js +122 -0
- package/dist/dev/federation-dev.d.ts +14 -0
- package/dist/dev/federation-dev.js +69 -0
- package/dist/dev/hmr-engine.d.ts +12 -0
- package/dist/dev/hmr-engine.js +66 -0
- package/dist/dev/hmr-v2.d.ts +40 -0
- package/dist/dev/hmr-v2.js +87 -0
- package/dist/dev/hmrThrottle.d.ts +13 -0
- package/dist/dev/hmrThrottle.js +56 -0
- package/dist/dev/overlay/overlay-client.d.ts +7 -0
- package/dist/dev/overlay/overlay-client.js +53 -0
- package/dist/dev/overlay/overlay-ui.d.ts +17 -0
- package/dist/dev/overlay/overlay-ui.js +133 -0
- package/dist/dev/preBundler.d.ts +17 -0
- package/dist/dev/preBundler.js +343 -0
- package/dist/dev/statusHandler.d.ts +11 -0
- package/dist/dev/statusHandler.js +44 -0
- package/dist/dev/types.d.ts +30 -0
- package/dist/dev/types.js +1 -0
- package/dist/dev/watcher.d.ts +11 -0
- package/dist/dev/watcher.js +40 -0
- package/dist/dev-server-manual.d.ts +5 -0
- package/dist/dev-server-manual.js +24 -0
- package/dist/dev-server.d.ts +25 -0
- package/dist/dev-server.js +255 -0
- package/dist/env/api.d.ts +27 -0
- package/dist/env/api.js +36 -0
- package/dist/fix/ast-transforms.d.ts +81 -0
- package/dist/fix/ast-transforms.js +449 -0
- package/dist/hmr/classifier.d.ts +51 -0
- package/dist/hmr/classifier.js +232 -0
- package/dist/hmr/index.d.ts +5 -0
- package/dist/hmr/index.js +5 -0
- package/dist/hmr/overlay.d.ts +39 -0
- package/dist/hmr/overlay.js +285 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.js +57 -0
- package/dist/init/bootstrap.d.ts +1 -0
- package/dist/init/bootstrap.js +106 -0
- package/dist/init/index.d.ts +1 -0
- package/dist/init/index.js +74 -0
- package/dist/init/templates.d.ts +2 -0
- package/dist/init/templates.js +227 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +3 -0
- package/dist/marketplace/client.d.ts +25 -0
- package/dist/marketplace/client.js +73 -0
- package/dist/marketplace/db.d.ts +24 -0
- package/dist/marketplace/db.js +57 -0
- package/dist/marketplace/plugin-adapter.d.ts +14 -0
- package/dist/marketplace/plugin-adapter.js +85 -0
- package/dist/marketplace/server.d.ts +66 -0
- package/dist/marketplace/server.js +97 -0
- package/dist/meta-frameworks/base-router.d.ts +63 -0
- package/dist/meta-frameworks/base-router.js +259 -0
- package/dist/meta-frameworks/index.d.ts +8 -0
- package/dist/meta-frameworks/index.js +8 -0
- package/dist/meta-frameworks/nextjs/router.d.ts +35 -0
- package/dist/meta-frameworks/nextjs/router.js +176 -0
- package/dist/meta-frameworks/nuxt/router.d.ts +22 -0
- package/dist/meta-frameworks/nuxt/router.js +84 -0
- package/dist/meta-frameworks/remix/router.d.ts +28 -0
- package/dist/meta-frameworks/remix/router.js +136 -0
- package/dist/meta-frameworks/ssr/react-renderer.d.ts +24 -0
- package/dist/meta-frameworks/ssr/react-renderer.js +53 -0
- package/dist/meta-frameworks/ssr/server.d.ts +92 -0
- package/dist/meta-frameworks/ssr/server.js +312 -0
- package/dist/meta-frameworks/ssr/vue-renderer.d.ts +11 -0
- package/dist/meta-frameworks/ssr/vue-renderer.js +35 -0
- package/dist/meta-frameworks/types.d.ts +76 -0
- package/dist/meta-frameworks/types.js +5 -0
- package/dist/migrate/analyzer.d.ts +46 -0
- package/dist/migrate/analyzer.js +254 -0
- package/dist/migrate/cli.d.ts +10 -0
- package/dist/migrate/cli.js +63 -0
- package/dist/migrate/generator.d.ts +32 -0
- package/dist/migrate/generator.js +214 -0
- package/dist/native/cache.d.ts +86 -0
- package/dist/native/cache.js +154 -0
- package/dist/native/index.d.ts +4 -0
- package/dist/native/index.js +56 -0
- package/dist/native/orchestrator.d.ts +78 -0
- package/dist/native/orchestrator.js +107 -0
- package/dist/native/wasm.d.ts +22 -0
- package/dist/native/wasm.js +33 -0
- package/dist/nuclie_native.node +0 -0
- package/dist/plugins/assets.d.ts +2 -0
- package/dist/plugins/assets.js +50 -0
- package/dist/plugins/compat/adapter.d.ts +33 -0
- package/dist/plugins/compat/adapter.js +102 -0
- package/dist/plugins/compat/deferred.d.ts +17 -0
- package/dist/plugins/compat/deferred.js +28 -0
- package/dist/plugins/compat/index.d.ts +11 -0
- package/dist/plugins/compat/index.js +11 -0
- package/dist/plugins/compat/rollup.d.ts +19 -0
- package/dist/plugins/compat/rollup.js +76 -0
- package/dist/plugins/compat/tier-a.d.ts +60 -0
- package/dist/plugins/compat/tier-a.js +132 -0
- package/dist/plugins/compat/tier-b.d.ts +34 -0
- package/dist/plugins/compat/tier-b.js +90 -0
- package/dist/plugins/compat/tier-c.d.ts +48 -0
- package/dist/plugins/compat/tier-c.js +49 -0
- package/dist/plugins/compat/webpack.d.ts +26 -0
- package/dist/plugins/compat/webpack.js +77 -0
- package/dist/plugins/core/linker.d.ts +8 -0
- package/dist/plugins/core/linker.js +51 -0
- package/dist/plugins/css/bootstrap.d.ts +25 -0
- package/dist/plugins/css/bootstrap.js +110 -0
- package/dist/plugins/css/bulma.d.ts +23 -0
- package/dist/plugins/css/bulma.js +75 -0
- package/dist/plugins/css/css-modules.d.ts +19 -0
- package/dist/plugins/css/css-modules.js +96 -0
- package/dist/plugins/css/css-optimizer.d.ts +43 -0
- package/dist/plugins/css/css-optimizer.js +155 -0
- package/dist/plugins/css/emotion.d.ts +35 -0
- package/dist/plugins/css/emotion.js +109 -0
- package/dist/plugins/css/less.d.ts +6 -0
- package/dist/plugins/css/less.js +33 -0
- package/dist/plugins/css/material.d.ts +24 -0
- package/dist/plugins/css/material.js +97 -0
- package/dist/plugins/css/postcss.d.ts +2 -0
- package/dist/plugins/css/postcss.js +96 -0
- package/dist/plugins/css/sass.d.ts +6 -0
- package/dist/plugins/css/sass.js +36 -0
- package/dist/plugins/css/styled-components.d.ts +33 -0
- package/dist/plugins/css/styled-components.js +94 -0
- package/dist/plugins/css/stylus.d.ts +6 -0
- package/dist/plugins/css/stylus.js +41 -0
- package/dist/plugins/css/tailwind.d.ts +9 -0
- package/dist/plugins/css/tailwind.js +132 -0
- package/dist/plugins/css-in-js.d.ts +10 -0
- package/dist/plugins/css-in-js.js +24 -0
- package/dist/plugins/edge.d.ts +7 -0
- package/dist/plugins/edge.js +38 -0
- package/dist/plugins/esbuildAdapter.d.ts +3 -0
- package/dist/plugins/esbuildAdapter.js +77 -0
- package/dist/plugins/federation_next.d.ts +16 -0
- package/dist/plugins/federation_next.js +78 -0
- package/dist/plugins/framework-plugins.d.ts +3 -0
- package/dist/plugins/framework-plugins.js +40 -0
- package/dist/plugins/frameworks/index.d.ts +8 -0
- package/dist/plugins/frameworks/index.js +10 -0
- package/dist/plugins/frameworks/lit.d.ts +36 -0
- package/dist/plugins/frameworks/lit.js +114 -0
- package/dist/plugins/frameworks/react.d.ts +38 -0
- package/dist/plugins/frameworks/react.js +144 -0
- package/dist/plugins/frameworks/solid.d.ts +36 -0
- package/dist/plugins/frameworks/solid.js +108 -0
- package/dist/plugins/frameworks/svelte.d.ts +43 -0
- package/dist/plugins/frameworks/svelte.js +144 -0
- package/dist/plugins/frameworks/vue.d.ts +43 -0
- package/dist/plugins/frameworks/vue.js +240 -0
- package/dist/plugins/governance.d.ts +36 -0
- package/dist/plugins/governance.js +50 -0
- package/dist/plugins/html.d.ts +2 -0
- package/dist/plugins/html.js +49 -0
- package/dist/plugins/implementations/analytics.d.ts +7 -0
- package/dist/plugins/implementations/analytics.js +15 -0
- package/dist/plugins/implementations/apollo.d.ts +7 -0
- package/dist/plugins/implementations/apollo.js +15 -0
- package/dist/plugins/implementations/audit.d.ts +7 -0
- package/dist/plugins/implementations/audit.js +30 -0
- package/dist/plugins/implementations/auto-fix.d.ts +7 -0
- package/dist/plugins/implementations/auto-fix.js +15 -0
- package/dist/plugins/implementations/avif.d.ts +7 -0
- package/dist/plugins/implementations/avif.js +27 -0
- package/dist/plugins/implementations/babel.d.ts +7 -0
- package/dist/plugins/implementations/babel.js +15 -0
- package/dist/plugins/implementations/bundle-analyzer.d.ts +7 -0
- package/dist/plugins/implementations/bundle-analyzer.js +21 -0
- package/dist/plugins/implementations/bundle-size.d.ts +7 -0
- package/dist/plugins/implementations/bundle-size.js +21 -0
- package/dist/plugins/implementations/checker.d.ts +7 -0
- package/dist/plugins/implementations/checker.js +15 -0
- package/dist/plugins/implementations/chromatic.d.ts +7 -0
- package/dist/plugins/implementations/chromatic.js +15 -0
- package/dist/plugins/implementations/cloudflare.d.ts +7 -0
- package/dist/plugins/implementations/cloudflare.js +15 -0
- package/dist/plugins/implementations/code-split.d.ts +7 -0
- package/dist/plugins/implementations/code-split.js +21 -0
- package/dist/plugins/implementations/compression.d.ts +7 -0
- package/dist/plugins/implementations/compression.js +21 -0
- package/dist/plugins/implementations/copy.d.ts +7 -0
- package/dist/plugins/implementations/copy.js +15 -0
- package/dist/plugins/implementations/critical-css.d.ts +7 -0
- package/dist/plugins/implementations/critical-css.js +25 -0
- package/dist/plugins/implementations/crypto-sign.d.ts +7 -0
- package/dist/plugins/implementations/crypto-sign.js +30 -0
- package/dist/plugins/implementations/css-framework.d.ts +7 -0
- package/dist/plugins/implementations/css-framework.js +25 -0
- package/dist/plugins/implementations/css.d.ts +7 -0
- package/dist/plugins/implementations/css.js +25 -0
- package/dist/plugins/implementations/cypress.d.ts +7 -0
- package/dist/plugins/implementations/cypress.js +15 -0
- package/dist/plugins/implementations/determinism.d.ts +7 -0
- package/dist/plugins/implementations/determinism.js +21 -0
- package/dist/plugins/implementations/edge.d.ts +8 -0
- package/dist/plugins/implementations/edge.js +35 -0
- package/dist/plugins/implementations/env-validation.d.ts +7 -0
- package/dist/plugins/implementations/env-validation.js +30 -0
- package/dist/plugins/implementations/eslint.d.ts +7 -0
- package/dist/plugins/implementations/eslint.js +15 -0
- package/dist/plugins/implementations/federation.d.ts +7 -0
- package/dist/plugins/implementations/federation.js +15 -0
- package/dist/plugins/implementations/file.d.ts +7 -0
- package/dist/plugins/implementations/file.js +27 -0
- package/dist/plugins/implementations/font-subset.d.ts +7 -0
- package/dist/plugins/implementations/font-subset.js +27 -0
- package/dist/plugins/implementations/fonts.d.ts +7 -0
- package/dist/plugins/implementations/fonts.js +27 -0
- package/dist/plugins/implementations/formatjs.d.ts +7 -0
- package/dist/plugins/implementations/formatjs.js +18 -0
- package/dist/plugins/implementations/graphql.d.ts +7 -0
- package/dist/plugins/implementations/graphql.js +15 -0
- package/dist/plugins/implementations/hmr-classify.d.ts +7 -0
- package/dist/plugins/implementations/hmr-classify.js +21 -0
- package/dist/plugins/implementations/html.d.ts +7 -0
- package/dist/plugins/implementations/html.js +15 -0
- package/dist/plugins/implementations/i18n.d.ts +7 -0
- package/dist/plugins/implementations/i18n.js +15 -0
- package/dist/plugins/implementations/icon.d.ts +7 -0
- package/dist/plugins/implementations/icon.js +27 -0
- package/dist/plugins/implementations/imagemin.d.ts +7 -0
- package/dist/plugins/implementations/imagemin.js +27 -0
- package/dist/plugins/implementations/inspect.d.ts +7 -0
- package/dist/plugins/implementations/inspect.js +15 -0
- package/dist/plugins/implementations/jest.d.ts +7 -0
- package/dist/plugins/implementations/jest.js +19 -0
- package/dist/plugins/implementations/jotai.d.ts +8 -0
- package/dist/plugins/implementations/jotai.js +35 -0
- package/dist/plugins/implementations/lazy-load.d.ts +7 -0
- package/dist/plugins/implementations/lazy-load.js +21 -0
- package/dist/plugins/implementations/legacy.d.ts +7 -0
- package/dist/plugins/implementations/legacy.js +15 -0
- package/dist/plugins/implementations/lighthouse.d.ts +7 -0
- package/dist/plugins/implementations/lighthouse.js +21 -0
- package/dist/plugins/implementations/manifest.d.ts +7 -0
- package/dist/plugins/implementations/manifest.js +15 -0
- package/dist/plugins/implementations/markdown.d.ts +7 -0
- package/dist/plugins/implementations/markdown.js +15 -0
- package/dist/plugins/implementations/md.d.ts +7 -0
- package/dist/plugins/implementations/md.js +15 -0
- package/dist/plugins/implementations/mdx.d.ts +7 -0
- package/dist/plugins/implementations/mdx.js +15 -0
- package/dist/plugins/implementations/meta-tags.d.ts +7 -0
- package/dist/plugins/implementations/meta-tags.js +15 -0
- package/dist/plugins/implementations/mini-css-extract-plugin.d.ts +7 -0
- package/dist/plugins/implementations/mini-css-extract-plugin.js +25 -0
- package/dist/plugins/implementations/mobx.d.ts +8 -0
- package/dist/plugins/implementations/mobx.js +35 -0
- package/dist/plugins/implementations/mock.d.ts +7 -0
- package/dist/plugins/implementations/mock.js +15 -0
- package/dist/plugins/implementations/msw.d.ts +7 -0
- package/dist/plugins/implementations/msw.js +19 -0
- package/dist/plugins/implementations/nanostores.d.ts +7 -0
- package/dist/plugins/implementations/nanostores.js +18 -0
- package/dist/plugins/implementations/netlify.d.ts +7 -0
- package/dist/plugins/implementations/netlify.js +15 -0
- package/dist/plugins/implementations/observability.d.ts +7 -0
- package/dist/plugins/implementations/observability.js +15 -0
- package/dist/plugins/implementations/og-image.d.ts +7 -0
- package/dist/plugins/implementations/og-image.js +15 -0
- package/dist/plugins/implementations/pages.d.ts +7 -0
- package/dist/plugins/implementations/pages.js +15 -0
- package/dist/plugins/implementations/pinia.d.ts +8 -0
- package/dist/plugins/implementations/pinia.js +35 -0
- package/dist/plugins/implementations/plausible.d.ts +7 -0
- package/dist/plugins/implementations/plausible.js +18 -0
- package/dist/plugins/implementations/playwright.d.ts +7 -0
- package/dist/plugins/implementations/playwright.js +15 -0
- package/dist/plugins/implementations/postcss.d.ts +7 -0
- package/dist/plugins/implementations/postcss.js +25 -0
- package/dist/plugins/implementations/posthog.d.ts +7 -0
- package/dist/plugins/implementations/posthog.js +18 -0
- package/dist/plugins/implementations/prebundle.d.ts +7 -0
- package/dist/plugins/implementations/prebundle.js +21 -0
- package/dist/plugins/implementations/prefetch.d.ts +7 -0
- package/dist/plugins/implementations/prefetch.js +21 -0
- package/dist/plugins/implementations/preload.d.ts +7 -0
- package/dist/plugins/implementations/preload.js +21 -0
- package/dist/plugins/implementations/prisma.d.ts +7 -0
- package/dist/plugins/implementations/prisma.js +15 -0
- package/dist/plugins/implementations/pwa.d.ts +7 -0
- package/dist/plugins/implementations/pwa.js +15 -0
- package/dist/plugins/implementations/qr-code.d.ts +7 -0
- package/dist/plugins/implementations/qr-code.js +19 -0
- package/dist/plugins/implementations/razorpay.d.ts +7 -0
- package/dist/plugins/implementations/razorpay.js +19 -0
- package/dist/plugins/implementations/react-i18next.d.ts +7 -0
- package/dist/plugins/implementations/react-i18next.js +18 -0
- package/dist/plugins/implementations/react-query.d.ts +8 -0
- package/dist/plugins/implementations/react-query.js +35 -0
- package/dist/plugins/implementations/react.d.ts +8 -0
- package/dist/plugins/implementations/react.js +35 -0
- package/dist/plugins/implementations/recoil.d.ts +8 -0
- package/dist/plugins/implementations/recoil.js +35 -0
- package/dist/plugins/implementations/redux.d.ts +8 -0
- package/dist/plugins/implementations/redux.js +35 -0
- package/dist/plugins/implementations/relay.d.ts +7 -0
- package/dist/plugins/implementations/relay.js +15 -0
- package/dist/plugins/implementations/repro.d.ts +7 -0
- package/dist/plugins/implementations/repro.js +15 -0
- package/dist/plugins/implementations/robots.d.ts +7 -0
- package/dist/plugins/implementations/robots.js +15 -0
- package/dist/plugins/implementations/root-cause.d.ts +7 -0
- package/dist/plugins/implementations/root-cause.js +15 -0
- package/dist/plugins/implementations/rss.d.ts +7 -0
- package/dist/plugins/implementations/rss.js +15 -0
- package/dist/plugins/implementations/sass.d.ts +7 -0
- package/dist/plugins/implementations/sass.js +25 -0
- package/dist/plugins/implementations/sentry.d.ts +7 -0
- package/dist/plugins/implementations/sentry.js +15 -0
- package/dist/plugins/implementations/sitemap.d.ts +7 -0
- package/dist/plugins/implementations/sitemap.js +15 -0
- package/dist/plugins/implementations/solid.d.ts +8 -0
- package/dist/plugins/implementations/solid.js +35 -0
- package/dist/plugins/implementations/sprite.d.ts +7 -0
- package/dist/plugins/implementations/sprite.js +27 -0
- package/dist/plugins/implementations/ssr.d.ts +8 -0
- package/dist/plugins/implementations/ssr.js +35 -0
- package/dist/plugins/implementations/storybook.d.ts +7 -0
- package/dist/plugins/implementations/storybook.js +15 -0
- package/dist/plugins/implementations/stripe.d.ts +7 -0
- package/dist/plugins/implementations/stripe.js +19 -0
- package/dist/plugins/implementations/style.d.ts +7 -0
- package/dist/plugins/implementations/style.js +25 -0
- package/dist/plugins/implementations/svelte.d.ts +8 -0
- package/dist/plugins/implementations/svelte.js +35 -0
- package/dist/plugins/implementations/tailwind.d.ts +7 -0
- package/dist/plugins/implementations/tailwind.js +25 -0
- package/dist/plugins/implementations/tanstack-query.d.ts +7 -0
- package/dist/plugins/implementations/tanstack-query.js +18 -0
- package/dist/plugins/implementations/terser.d.ts +7 -0
- package/dist/plugins/implementations/terser.js +21 -0
- package/dist/plugins/implementations/testing-library-react.d.ts +7 -0
- package/dist/plugins/implementations/testing-library-react.js +19 -0
- package/dist/plugins/implementations/testing-library.d.ts +7 -0
- package/dist/plugins/implementations/testing-library.js +15 -0
- package/dist/plugins/implementations/tree-shake.d.ts +7 -0
- package/dist/plugins/implementations/tree-shake.js +21 -0
- package/dist/plugins/implementations/trpc.d.ts +7 -0
- package/dist/plugins/implementations/trpc.js +15 -0
- package/dist/plugins/implementations/ts.d.ts +7 -0
- package/dist/plugins/implementations/ts.js +15 -0
- package/dist/plugins/implementations/typescript.d.ts +7 -0
- package/dist/plugins/implementations/typescript.js +15 -0
- package/dist/plugins/implementations/unocss.d.ts +7 -0
- package/dist/plugins/implementations/unocss.js +25 -0
- package/dist/plugins/implementations/upi-payment.d.ts +7 -0
- package/dist/plugins/implementations/upi-payment.js +19 -0
- package/dist/plugins/implementations/url.d.ts +7 -0
- package/dist/plugins/implementations/url.js +27 -0
- package/dist/plugins/implementations/vercel.d.ts +7 -0
- package/dist/plugins/implementations/vercel.js +15 -0
- package/dist/plugins/implementations/visualizer.d.ts +7 -0
- package/dist/plugins/implementations/visualizer.js +15 -0
- package/dist/plugins/implementations/vite-svg-loader.d.ts +7 -0
- package/dist/plugins/implementations/vite-svg-loader.js +27 -0
- package/dist/plugins/implementations/vitest.d.ts +7 -0
- package/dist/plugins/implementations/vitest.js +15 -0
- package/dist/plugins/implementations/vue-i18n-next.d.ts +7 -0
- package/dist/plugins/implementations/vue-i18n-next.js +18 -0
- package/dist/plugins/implementations/vue-i18n.d.ts +7 -0
- package/dist/plugins/implementations/vue-i18n.js +15 -0
- package/dist/plugins/implementations/vue-layouts.d.ts +8 -0
- package/dist/plugins/implementations/vue-layouts.js +35 -0
- package/dist/plugins/implementations/vue.d.ts +8 -0
- package/dist/plugins/implementations/vue.js +35 -0
- package/dist/plugins/implementations/vuex.d.ts +8 -0
- package/dist/plugins/implementations/vuex.js +35 -0
- package/dist/plugins/implementations/wasm-sandbox.d.ts +7 -0
- package/dist/plugins/implementations/wasm-sandbox.js +30 -0
- package/dist/plugins/implementations/webp.d.ts +7 -0
- package/dist/plugins/implementations/webp.js +27 -0
- package/dist/plugins/implementations/windicss.d.ts +7 -0
- package/dist/plugins/implementations/windicss.js +25 -0
- package/dist/plugins/implementations/workbox.d.ts +7 -0
- package/dist/plugins/implementations/workbox.js +15 -0
- package/dist/plugins/implementations/xstate.d.ts +7 -0
- package/dist/plugins/implementations/xstate.js +18 -0
- package/dist/plugins/implementations/zod.d.ts +7 -0
- package/dist/plugins/implementations/zod.js +15 -0
- package/dist/plugins/implementations/zustand-devtools.d.ts +7 -0
- package/dist/plugins/implementations/zustand-devtools.js +18 -0
- package/dist/plugins/implementations/zustand.d.ts +8 -0
- package/dist/plugins/implementations/zustand.js +35 -0
- package/dist/plugins/index.d.ts +49 -0
- package/dist/plugins/index.js +117 -0
- package/dist/plugins/js-transform.d.ts +2 -0
- package/dist/plugins/js-transform.js +49 -0
- package/dist/plugins/json.d.ts +2 -0
- package/dist/plugins/json.js +34 -0
- package/dist/plugins/pluginWorker.mjs +95 -0
- package/dist/plugins/ported/adapter.d.ts +92 -0
- package/dist/plugins/ported/adapter.js +226 -0
- package/dist/plugins/registry.d.ts +51 -0
- package/dist/plugins/registry.js +151 -0
- package/dist/plugins/reporter.d.ts +5 -0
- package/dist/plugins/reporter.js +47 -0
- package/dist/plugins/samplePlugin.mjs +4 -0
- package/dist/plugins/sandbox.d.ts +12 -0
- package/dist/plugins/sandbox.js +126 -0
- package/dist/plugins/signer.d.ts +53 -0
- package/dist/plugins/signer.js +109 -0
- package/dist/plugins/static.d.ts +2 -0
- package/dist/plugins/static.js +47 -0
- package/dist/plugins/svelte.d.ts +7 -0
- package/dist/plugins/svelte.js +27 -0
- package/dist/plugins/testSandbox.d.ts +1 -0
- package/dist/plugins/testSandbox.js +14 -0
- package/dist/plugins/verify.d.ts +3 -0
- package/dist/plugins/verify.js +113 -0
- package/dist/plugins/vue.d.ts +7 -0
- package/dist/plugins/vue.js +86 -0
- package/dist/plugins/wasm-runtime.d.ts +15 -0
- package/dist/plugins/wasm-runtime.js +33 -0
- package/dist/plugins/wasm.d.ts +5 -0
- package/dist/plugins/wasm.js +44 -0
- package/dist/polyfills/corejs.d.ts +9 -0
- package/dist/polyfills/corejs.js +18 -0
- package/dist/presets/core.d.ts +111 -0
- package/dist/presets/core.js +239 -0
- package/dist/presets/frameworks.d.ts +34 -0
- package/dist/presets/frameworks.js +270 -0
- package/dist/presets/index.d.ts +8 -0
- package/dist/presets/index.js +3 -0
- package/dist/presets/infrastructure.d.ts +2 -0
- package/dist/presets/infrastructure.js +33 -0
- package/dist/presets/spa.d.ts +2 -0
- package/dist/presets/spa.js +15 -0
- package/dist/presets/ssg.d.ts +2 -0
- package/dist/presets/ssg.js +9 -0
- package/dist/presets/ssr.d.ts +2 -0
- package/dist/presets/ssr.js +13 -0
- package/dist/repro/dashboard.d.ts +83 -0
- package/dist/repro/dashboard.js +251 -0
- package/dist/repro/github.d.ts +26 -0
- package/dist/repro/github.js +73 -0
- package/dist/resolve/css-precedence.d.ts +16 -0
- package/dist/resolve/css-precedence.js +56 -0
- package/dist/resolve/graph.d.ts +48 -0
- package/dist/resolve/graph.js +232 -0
- package/dist/resolve/utils.d.ts +13 -0
- package/dist/resolve/utils.js +53 -0
- package/dist/runtime/client.d.ts +9 -0
- package/dist/runtime/client.js +218 -0
- package/dist/runtime/error-overlay.d.ts +15 -0
- package/dist/runtime/error-overlay.js +327 -0
- package/dist/runtime/federation-fallback.d.ts +67 -0
- package/dist/runtime/federation-fallback.js +225 -0
- package/dist/runtime/federation.d.ts +27 -0
- package/dist/runtime/federation.js +210 -0
- package/dist/runtime/federation_runtime.js +90 -0
- package/dist/runtime/hmr-client.d.ts +5 -0
- package/dist/runtime/hmr-client.js +70 -0
- package/dist/security/anomaly.d.ts +41 -0
- package/dist/security/anomaly.js +77 -0
- package/dist/server/security-headers.d.ts +37 -0
- package/dist/server/security-headers.js +110 -0
- package/dist/ssr/adapters/edge.d.ts +12 -0
- package/dist/ssr/adapters/edge.js +26 -0
- package/dist/ssr/adapters/index.d.ts +23 -0
- package/dist/ssr/adapters/index.js +58 -0
- package/dist/ssr/app-router.d.ts +24 -0
- package/dist/ssr/app-router.js +70 -0
- package/dist/ssr/edge/handlers.d.ts +24 -0
- package/dist/ssr/edge/handlers.js +48 -0
- package/dist/ssr/image.d.ts +24 -0
- package/dist/ssr/image.js +38 -0
- package/dist/ssr/isr.d.ts +14 -0
- package/dist/ssr/isr.js +29 -0
- package/dist/ssr/rsc.d.ts +19 -0
- package/dist/ssr/rsc.js +33 -0
- package/dist/ssr/streaming.d.ts +31 -0
- package/dist/ssr/streaming.js +78 -0
- package/dist/ssr/universal-engine.d.ts +36 -0
- package/dist/ssr/universal-engine.js +139 -0
- package/dist/templates/manager.d.ts +28 -0
- package/dist/templates/manager.js +162 -0
- package/dist/templates/starters/angular-spa.d.ts +6 -0
- package/dist/templates/starters/angular-spa.js +149 -0
- package/dist/templates/starters/edge.d.ts +6 -0
- package/dist/templates/starters/edge.js +93 -0
- package/dist/templates/starters/fintech.d.ts +6 -0
- package/dist/templates/starters/fintech.js +211 -0
- package/dist/templates/starters/monorepo.d.ts +6 -0
- package/dist/templates/starters/monorepo.js +133 -0
- package/dist/templates/starters/nextjs-app.d.ts +13 -0
- package/dist/templates/starters/nextjs-app.js +116 -0
- package/dist/templates/starters/preact-spa.d.ts +6 -0
- package/dist/templates/starters/preact-spa.js +97 -0
- package/dist/templates/starters/premium-dashboard.d.ts +6 -0
- package/dist/templates/starters/premium-dashboard.js +762 -0
- package/dist/templates/starters/react-spa.d.ts +6 -0
- package/dist/templates/starters/react-spa.js +152 -0
- package/dist/templates/starters/react-ssr.d.ts +6 -0
- package/dist/templates/starters/react-ssr.js +190 -0
- package/dist/templates/starters/remix-app.d.ts +12 -0
- package/dist/templates/starters/remix-app.js +108 -0
- package/dist/templates/starters/solid-spa.d.ts +6 -0
- package/dist/templates/starters/solid-spa.js +158 -0
- package/dist/templates/starters/svelte-spa.d.ts +6 -0
- package/dist/templates/starters/svelte-spa.js +147 -0
- package/dist/templates/starters/vue-spa.d.ts +6 -0
- package/dist/templates/starters/vue-spa.js +136 -0
- package/dist/test/api.d.ts +58 -0
- package/dist/test/api.js +154 -0
- package/dist/test/coverage.d.ts +1 -0
- package/dist/test/coverage.js +134 -0
- package/dist/test/determinism.d.ts +1 -0
- package/dist/test/determinism.js +122 -0
- package/dist/test/regression.d.ts +1 -0
- package/dist/test/regression.js +30 -0
- package/dist/test/runner.d.ts +1 -0
- package/dist/test/runner.js +159 -0
- package/dist/test-server.d.ts +1 -0
- package/dist/test-server.js +22 -0
- package/dist/ui/terminal-warnings.d.ts +10 -0
- package/dist/ui/terminal-warnings.js +26 -0
- package/dist/ui/types.d.ts +13 -0
- package/dist/ui/types.js +5 -0
- package/dist/ui/warning-detector.d.ts +46 -0
- package/dist/ui/warning-detector.js +178 -0
- package/dist/ui/warning-library.d.ts +51 -0
- package/dist/ui/warning-library.js +283 -0
- package/dist/utils/interactive.d.ts +2 -0
- package/dist/utils/interactive.js +37 -0
- package/dist/utils/logger.d.ts +26 -0
- package/dist/utils/logger.js +130 -0
- package/dist/utils/path-normalize.d.ts +24 -0
- package/dist/utils/path-normalize.js +37 -0
- package/dist/visual/chart-generator.d.ts +11 -0
- package/dist/visual/chart-generator.js +30 -0
- package/dist/visual/client/renderer.d.ts +31 -0
- package/dist/visual/client/renderer.js +98 -0
- package/dist/visual/federation-editor.d.ts +1 -0
- package/dist/visual/federation-editor.js +231 -0
- package/dist/visual/graph-engine.d.ts +38 -0
- package/dist/visual/graph-engine.js +64 -0
- package/dist/visual/graph-ui.d.ts +2 -0
- package/dist/visual/graph-ui.js +119 -0
- package/dist/visual/graph-visualizer.d.ts +69 -0
- package/dist/visual/graph-visualizer.js +282 -0
- package/dist/visual/root-cause.d.ts +83 -0
- package/dist/visual/root-cause.js +265 -0
- package/package.json +169 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { WarningDetector } from '../ui/warning-detector.js';
|
|
2
|
+
import { AutoFixEngine } from '../fix/ast-transforms.js';
|
|
3
|
+
export class BuildIntegration {
|
|
4
|
+
constructor(config = {}) {
|
|
5
|
+
this.auditCache = new Map();
|
|
6
|
+
this.config = {
|
|
7
|
+
enableWarnings: true,
|
|
8
|
+
enableAutoFix: false,
|
|
9
|
+
enableIncrementalAudit: true,
|
|
10
|
+
autoFixThreshold: 0.8,
|
|
11
|
+
...config
|
|
12
|
+
};
|
|
13
|
+
this.warningDetector = new WarningDetector();
|
|
14
|
+
this.autoFixEngine = new AutoFixEngine();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Run audit pipeline hook
|
|
18
|
+
*/
|
|
19
|
+
async runAuditPipeline(ctx) {
|
|
20
|
+
const startTime = Date.now();
|
|
21
|
+
let warnings = [];
|
|
22
|
+
let fixesApplied = 0;
|
|
23
|
+
let cacheHits = 0;
|
|
24
|
+
// Check if audit should be skipped
|
|
25
|
+
if (this.config.skipAudit) {
|
|
26
|
+
return {
|
|
27
|
+
warnings: [],
|
|
28
|
+
fixesApplied: 0,
|
|
29
|
+
buildTime: 0,
|
|
30
|
+
cacheHits: 0
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// Check cache for incremental audit (unless forced)
|
|
34
|
+
if (this.config.enableIncrementalAudit && !this.config.forceAudit) {
|
|
35
|
+
const cacheKey = this.generateCacheKey(ctx);
|
|
36
|
+
const cached = this.auditCache.get(cacheKey);
|
|
37
|
+
if (cached) {
|
|
38
|
+
cacheHits++;
|
|
39
|
+
return {
|
|
40
|
+
...cached,
|
|
41
|
+
cacheHits
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Step 1: Detect warnings
|
|
46
|
+
if (this.config.enableWarnings) {
|
|
47
|
+
warnings = this.warningDetector.analyzeContext(ctx);
|
|
48
|
+
}
|
|
49
|
+
// Step 2: Apply auto-fixes if enabled
|
|
50
|
+
if (this.config.enableAutoFix && warnings.length > 0) {
|
|
51
|
+
const fixableWarnings = warnings.filter(w => w.fix && w.severity !== 'info');
|
|
52
|
+
for (const warning of fixableWarnings) {
|
|
53
|
+
// Apply fix based on warning type
|
|
54
|
+
if (warning.category === 'Performance' && warning.fix) {
|
|
55
|
+
fixesApplied++;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const buildTime = Date.now() - startTime;
|
|
60
|
+
const result = {
|
|
61
|
+
warnings,
|
|
62
|
+
fixesApplied,
|
|
63
|
+
buildTime,
|
|
64
|
+
cacheHits
|
|
65
|
+
};
|
|
66
|
+
// Check CI thresholds
|
|
67
|
+
if (this.config.ciThresholds) {
|
|
68
|
+
this.checkCIThresholds(warnings);
|
|
69
|
+
}
|
|
70
|
+
// Cache result (unless forced)
|
|
71
|
+
if (this.config.enableIncrementalAudit && !this.config.forceAudit) {
|
|
72
|
+
const cacheKey = this.generateCacheKey(ctx);
|
|
73
|
+
this.auditCache.set(cacheKey, result);
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if warnings exceed CI thresholds
|
|
79
|
+
*/
|
|
80
|
+
checkCIThresholds(warnings) {
|
|
81
|
+
if (!this.config.ciThresholds)
|
|
82
|
+
return;
|
|
83
|
+
const criticalCount = warnings.filter(w => w.severity === 'critical').length;
|
|
84
|
+
const warningCount = warnings.filter(w => w.severity === 'warning').length;
|
|
85
|
+
const { criticalMax, warningMax, failOnCritical } = this.config.ciThresholds;
|
|
86
|
+
if (failOnCritical && criticalCount > 0) {
|
|
87
|
+
throw new Error(`CI FAILED: Found ${criticalCount} critical issue(s)`);
|
|
88
|
+
}
|
|
89
|
+
if (criticalCount > criticalMax) {
|
|
90
|
+
throw new Error(`CI FAILED: Critical issues (${criticalCount}) exceed threshold (${criticalMax})`);
|
|
91
|
+
}
|
|
92
|
+
if (warningCount > warningMax) {
|
|
93
|
+
throw new Error(`CI FAILED: Warnings (${warningCount}) exceed threshold (${warningMax})`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Incremental audit for changed files
|
|
98
|
+
*/
|
|
99
|
+
async incrementalAudit(ctx, changedFiles) {
|
|
100
|
+
const startTime = Date.now();
|
|
101
|
+
// Only audit changed files
|
|
102
|
+
const warnings = [];
|
|
103
|
+
for (const file of changedFiles) {
|
|
104
|
+
// Analyze individual file
|
|
105
|
+
// In production, this would do actual file analysis
|
|
106
|
+
if (file.endsWith('.ts') || file.endsWith('.js')) {
|
|
107
|
+
// Check for common issues
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
warnings,
|
|
112
|
+
fixesApplied: 0,
|
|
113
|
+
buildTime: Date.now() - startTime,
|
|
114
|
+
cacheHits: 0
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Generate cache key for audit results
|
|
119
|
+
*/
|
|
120
|
+
generateCacheKey(ctx) {
|
|
121
|
+
return `${ctx.mode}-${ctx.config.minify}-${ctx.config.sourceMaps}`;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Clear audit cache
|
|
125
|
+
*/
|
|
126
|
+
clearCache() {
|
|
127
|
+
this.auditCache.clear();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get cache statistics
|
|
131
|
+
*/
|
|
132
|
+
getCacheStats() {
|
|
133
|
+
return {
|
|
134
|
+
size: this.auditCache.size,
|
|
135
|
+
hitRate: 0 // Would track this in production
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module 5 Day 29: Enhanced Audit Engine Core
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Parallel Puppeteer workers for faster audits
|
|
6
|
+
* - axe-core integration for comprehensive A11y
|
|
7
|
+
* - Lighthouse integration for performance
|
|
8
|
+
* - Framework-aware auditing (React, Vue, Angular)
|
|
9
|
+
* - BundlePhobia integration for bundle analysis
|
|
10
|
+
*/
|
|
11
|
+
import { AuditReport, FrameworkType } from './types.js';
|
|
12
|
+
export interface AuditOptions {
|
|
13
|
+
parallel?: boolean;
|
|
14
|
+
framework?: FrameworkType;
|
|
15
|
+
bundleAnalysis?: boolean;
|
|
16
|
+
lighthouseMode?: boolean;
|
|
17
|
+
timeout?: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class AuditEngine {
|
|
20
|
+
private static workerPool;
|
|
21
|
+
private static readonly MAX_WORKERS;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize worker pool for parallel audits
|
|
24
|
+
*/
|
|
25
|
+
static initWorkerPool(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Cleanup worker pool
|
|
28
|
+
*/
|
|
29
|
+
static cleanupWorkerPool(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Get an available worker from the pool
|
|
32
|
+
*/
|
|
33
|
+
private static getWorker;
|
|
34
|
+
/**
|
|
35
|
+
* Detect framework from page content
|
|
36
|
+
*/
|
|
37
|
+
private static detectFramework;
|
|
38
|
+
/**
|
|
39
|
+
* Run all audits with enhanced features
|
|
40
|
+
*/
|
|
41
|
+
static runAll(urlOrPath: string, options?: AuditOptions): Promise<AuditReport>;
|
|
42
|
+
/**
|
|
43
|
+
* Run framework-specific audits
|
|
44
|
+
*/
|
|
45
|
+
static runFrameworkAudit(urlOrPath: string, framework: FrameworkType): Promise<AuditReport>;
|
|
46
|
+
/**
|
|
47
|
+
* Check React hydration issues
|
|
48
|
+
*/
|
|
49
|
+
private static checkReactHydration;
|
|
50
|
+
/**
|
|
51
|
+
* Check Vue SSR issues
|
|
52
|
+
*/
|
|
53
|
+
private static checkVueSSR;
|
|
54
|
+
/**
|
|
55
|
+
* Check Angular Ivy optimizations
|
|
56
|
+
*/
|
|
57
|
+
private static checkAngularIvy;
|
|
58
|
+
/**
|
|
59
|
+
* Get Lighthouse correlation score (for validation)
|
|
60
|
+
*/
|
|
61
|
+
static calculateLighthouseCorrelation(report: AuditReport): number;
|
|
62
|
+
}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module 5 Day 29: Enhanced Audit Engine Core
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Parallel Puppeteer workers for faster audits
|
|
6
|
+
* - axe-core integration for comprehensive A11y
|
|
7
|
+
* - Lighthouse integration for performance
|
|
8
|
+
* - Framework-aware auditing (React, Vue, Angular)
|
|
9
|
+
* - BundlePhobia integration for bundle analysis
|
|
10
|
+
*/
|
|
11
|
+
import puppeteer from 'puppeteer';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import { AccessibilityAudit } from './a11y.js';
|
|
14
|
+
import { PerformanceAudit } from './perf.js';
|
|
15
|
+
import { SEOAudit } from './seo.js';
|
|
16
|
+
import { BestPracticesAudit } from './best-practices.js';
|
|
17
|
+
import { log } from '../utils/logger.js';
|
|
18
|
+
export class AuditEngine {
|
|
19
|
+
/**
|
|
20
|
+
* Initialize worker pool for parallel audits
|
|
21
|
+
*/
|
|
22
|
+
static async initWorkerPool() {
|
|
23
|
+
if (this.workerPool.length > 0)
|
|
24
|
+
return;
|
|
25
|
+
log.info('🚀 Initializing audit worker pool...');
|
|
26
|
+
for (let i = 0; i < this.MAX_WORKERS; i++) {
|
|
27
|
+
const browser = await puppeteer.launch({
|
|
28
|
+
headless: true,
|
|
29
|
+
args: [
|
|
30
|
+
'--no-sandbox',
|
|
31
|
+
'--disable-setuid-sandbox',
|
|
32
|
+
'--disable-dev-shm-usage', // Prevent memory issues in CI
|
|
33
|
+
'--disable-gpu'
|
|
34
|
+
]
|
|
35
|
+
});
|
|
36
|
+
this.workerPool.push(browser);
|
|
37
|
+
}
|
|
38
|
+
log.info(`✅ Worker pool initialized with ${this.MAX_WORKERS} workers`);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Cleanup worker pool
|
|
42
|
+
*/
|
|
43
|
+
static async cleanupWorkerPool() {
|
|
44
|
+
for (const browser of this.workerPool) {
|
|
45
|
+
await browser.close();
|
|
46
|
+
}
|
|
47
|
+
this.workerPool = [];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get an available worker from the pool
|
|
51
|
+
*/
|
|
52
|
+
static async getWorker() {
|
|
53
|
+
if (this.workerPool.length === 0) {
|
|
54
|
+
await this.initWorkerPool();
|
|
55
|
+
}
|
|
56
|
+
return this.workerPool[0]; // Simple round-robin can be improved
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Detect framework from page content
|
|
60
|
+
*/
|
|
61
|
+
static async detectFramework(page) {
|
|
62
|
+
const framework = await page.evaluate(() => {
|
|
63
|
+
// Check for React
|
|
64
|
+
if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__)
|
|
65
|
+
return 'react';
|
|
66
|
+
if (window.React)
|
|
67
|
+
return 'react';
|
|
68
|
+
// Check for Vue
|
|
69
|
+
if (window.__VUE__)
|
|
70
|
+
return 'vue';
|
|
71
|
+
if (window.Vue)
|
|
72
|
+
return 'vue';
|
|
73
|
+
// Check for Angular
|
|
74
|
+
if (window.ng)
|
|
75
|
+
return 'angular';
|
|
76
|
+
if (window.getAllAngularRootElements)
|
|
77
|
+
return 'angular';
|
|
78
|
+
// Check for Svelte
|
|
79
|
+
if (document.querySelector('[data-svelte]'))
|
|
80
|
+
return 'svelte';
|
|
81
|
+
// Check for Solid
|
|
82
|
+
if (window._$HY)
|
|
83
|
+
return 'solid';
|
|
84
|
+
return 'vanilla';
|
|
85
|
+
});
|
|
86
|
+
return framework;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Run all audits with enhanced features
|
|
90
|
+
*/
|
|
91
|
+
static async runAll(urlOrPath, options = {}) {
|
|
92
|
+
const { parallel = true, framework: userFramework, bundleAnalysis = false, lighthouseMode = false, timeout = 30000 } = options;
|
|
93
|
+
let targetUrl = urlOrPath;
|
|
94
|
+
// Handle file paths
|
|
95
|
+
if (!urlOrPath.startsWith('http')) {
|
|
96
|
+
if (!path.isAbsolute(urlOrPath)) {
|
|
97
|
+
targetUrl = path.resolve(process.cwd(), urlOrPath);
|
|
98
|
+
}
|
|
99
|
+
if (!targetUrl.endsWith('.html')) {
|
|
100
|
+
targetUrl = path.join(targetUrl, 'index.html');
|
|
101
|
+
}
|
|
102
|
+
targetUrl = 'file://' + targetUrl;
|
|
103
|
+
}
|
|
104
|
+
log.info(`🔍 Starting enhanced audit for ${targetUrl}...`);
|
|
105
|
+
const browser = parallel ? await this.getWorker() : await puppeteer.launch({
|
|
106
|
+
headless: true,
|
|
107
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox']
|
|
108
|
+
});
|
|
109
|
+
try {
|
|
110
|
+
const page = await browser.newPage();
|
|
111
|
+
// Set viewport
|
|
112
|
+
await page.setViewport({ width: 1280, height: 800 });
|
|
113
|
+
// Navigate
|
|
114
|
+
await page.goto(targetUrl, {
|
|
115
|
+
waitUntil: 'networkidle0',
|
|
116
|
+
timeout
|
|
117
|
+
});
|
|
118
|
+
log.info('✅ Page loaded. Analyzing...');
|
|
119
|
+
// Detect framework
|
|
120
|
+
const detectedFramework = userFramework || await this.detectFramework(page);
|
|
121
|
+
log.info(`📦 Framework detected: ${detectedFramework}`);
|
|
122
|
+
// Create audit context
|
|
123
|
+
const context = {
|
|
124
|
+
page,
|
|
125
|
+
url: targetUrl,
|
|
126
|
+
framework: detectedFramework,
|
|
127
|
+
lighthouseMode,
|
|
128
|
+
bundleAnalysis
|
|
129
|
+
};
|
|
130
|
+
// Run audits in parallel
|
|
131
|
+
const startTime = Date.now();
|
|
132
|
+
const [a11y, perf, seo, bestPractices] = await Promise.all([
|
|
133
|
+
AccessibilityAudit.run(page, context),
|
|
134
|
+
PerformanceAudit.run(page, context),
|
|
135
|
+
SEOAudit.run(page, context),
|
|
136
|
+
BestPracticesAudit.run(page, context)
|
|
137
|
+
]);
|
|
138
|
+
const duration = Date.now() - startTime;
|
|
139
|
+
log.info(`✅ Audit completed in ${duration}ms`);
|
|
140
|
+
// Calculate overall score (weighted average)
|
|
141
|
+
const overallScore = Math.round((a11y.score * 0.25) +
|
|
142
|
+
(perf.score * 0.35) +
|
|
143
|
+
(seo.score * 0.20) +
|
|
144
|
+
(bestPractices.score * 0.20));
|
|
145
|
+
return {
|
|
146
|
+
timestamp: Date.now(),
|
|
147
|
+
duration,
|
|
148
|
+
url: targetUrl,
|
|
149
|
+
framework: detectedFramework,
|
|
150
|
+
overallScore,
|
|
151
|
+
groups: {
|
|
152
|
+
a11y,
|
|
153
|
+
perf,
|
|
154
|
+
seo,
|
|
155
|
+
bestPractices
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
log.error('❌ Audit execution failed:', e.message);
|
|
161
|
+
throw e;
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
if (!parallel) {
|
|
165
|
+
await browser.close();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Run framework-specific audits
|
|
171
|
+
*/
|
|
172
|
+
static async runFrameworkAudit(urlOrPath, framework) {
|
|
173
|
+
log.info(`🎯 Running ${framework}-specific audit...`);
|
|
174
|
+
const report = await this.runAll(urlOrPath, { framework });
|
|
175
|
+
// Add framework-specific results to the report
|
|
176
|
+
const frameworkResults = [];
|
|
177
|
+
if (framework === 'react') {
|
|
178
|
+
// Check for React hydration issues
|
|
179
|
+
log.info(' - Checking React hydration...');
|
|
180
|
+
const hydrationCheck = await this.checkReactHydration(report.url);
|
|
181
|
+
frameworkResults.push(hydrationCheck);
|
|
182
|
+
}
|
|
183
|
+
else if (framework === 'vue') {
|
|
184
|
+
// Check for Vue SSR issues
|
|
185
|
+
log.info(' - Checking Vue SSR...');
|
|
186
|
+
const ssrCheck = await this.checkVueSSR(report.url);
|
|
187
|
+
frameworkResults.push(ssrCheck);
|
|
188
|
+
}
|
|
189
|
+
else if (framework === 'angular') {
|
|
190
|
+
// Check for Angular Ivy optimizations
|
|
191
|
+
log.info(' - Checking Angular Ivy...');
|
|
192
|
+
const ivyCheck = await this.checkAngularIvy(report.url);
|
|
193
|
+
frameworkResults.push(ivyCheck);
|
|
194
|
+
}
|
|
195
|
+
// Add framework-specific results to best practices
|
|
196
|
+
if (frameworkResults.length > 0 && report.groups.bestPractices) {
|
|
197
|
+
report.groups.bestPractices.results.push(...frameworkResults);
|
|
198
|
+
// Recalculate score
|
|
199
|
+
report.groups.bestPractices.score = Math.round(report.groups.bestPractices.results.reduce((acc, r) => acc + r.score, 0) /
|
|
200
|
+
report.groups.bestPractices.results.length);
|
|
201
|
+
}
|
|
202
|
+
return report;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Check React hydration issues
|
|
206
|
+
*/
|
|
207
|
+
static async checkReactHydration(url) {
|
|
208
|
+
const browser = await this.getWorker();
|
|
209
|
+
const page = await browser.newPage();
|
|
210
|
+
try {
|
|
211
|
+
await page.goto(url, { waitUntil: 'networkidle0' });
|
|
212
|
+
const hydrationIssues = await page.evaluate(() => {
|
|
213
|
+
// Check for hydration mismatch warnings in console
|
|
214
|
+
const issues = [];
|
|
215
|
+
// Check if React DevTools hook exists
|
|
216
|
+
if (!window.__REACT_DEVTOOLS_GLOBAL_HOOK__) {
|
|
217
|
+
issues.push('React DevTools hook not found');
|
|
218
|
+
}
|
|
219
|
+
// Check for common hydration issues
|
|
220
|
+
const suspiciousElements = document.querySelectorAll('[data-reactroot]');
|
|
221
|
+
if (suspiciousElements.length > 1) {
|
|
222
|
+
issues.push(`Multiple React roots detected: ${suspiciousElements.length}`);
|
|
223
|
+
}
|
|
224
|
+
return issues;
|
|
225
|
+
});
|
|
226
|
+
return {
|
|
227
|
+
id: 'react-hydration',
|
|
228
|
+
title: 'React Hydration Check',
|
|
229
|
+
status: hydrationIssues.length === 0 ? 'PASS' : 'WARN',
|
|
230
|
+
score: hydrationIssues.length === 0 ? 100 : 70,
|
|
231
|
+
details: hydrationIssues.length === 0
|
|
232
|
+
? 'No hydration issues detected'
|
|
233
|
+
: `Potential issues: ${hydrationIssues.join(', ')}`,
|
|
234
|
+
fix: 'Ensure server and client render the same content'
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
await page.close();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Check Vue SSR issues
|
|
243
|
+
*/
|
|
244
|
+
static async checkVueSSR(url) {
|
|
245
|
+
const browser = await this.getWorker();
|
|
246
|
+
const page = await browser.newPage();
|
|
247
|
+
try {
|
|
248
|
+
await page.goto(url, { waitUntil: 'networkidle0' });
|
|
249
|
+
const ssrIssues = await page.evaluate(() => {
|
|
250
|
+
const issues = [];
|
|
251
|
+
// Check if Vue is present
|
|
252
|
+
if (!window.__VUE__ && !window.Vue) {
|
|
253
|
+
issues.push('Vue instance not found');
|
|
254
|
+
}
|
|
255
|
+
// Check for SSR attributes
|
|
256
|
+
const ssrElements = document.querySelectorAll('[data-server-rendered]');
|
|
257
|
+
if (ssrElements.length === 0) {
|
|
258
|
+
issues.push('No SSR markers found');
|
|
259
|
+
}
|
|
260
|
+
return issues;
|
|
261
|
+
});
|
|
262
|
+
return {
|
|
263
|
+
id: 'vue-ssr',
|
|
264
|
+
title: 'Vue SSR Check',
|
|
265
|
+
status: ssrIssues.length === 0 ? 'PASS' : 'WARN',
|
|
266
|
+
score: ssrIssues.length === 0 ? 100 : 70,
|
|
267
|
+
details: ssrIssues.length === 0
|
|
268
|
+
? 'Vue SSR configured correctly'
|
|
269
|
+
: `Potential issues: ${ssrIssues.join(', ')}`,
|
|
270
|
+
fix: 'Ensure Vue SSR is properly configured with data-server-rendered attribute'
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
finally {
|
|
274
|
+
await page.close();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Check Angular Ivy optimizations
|
|
279
|
+
*/
|
|
280
|
+
static async checkAngularIvy(url) {
|
|
281
|
+
const browser = await this.getWorker();
|
|
282
|
+
const page = await browser.newPage();
|
|
283
|
+
try {
|
|
284
|
+
await page.goto(url, { waitUntil: 'networkidle0' });
|
|
285
|
+
const ivyIssues = await page.evaluate(() => {
|
|
286
|
+
const issues = [];
|
|
287
|
+
// Check if Angular is present
|
|
288
|
+
if (!window.ng && !window.getAllAngularRootElements) {
|
|
289
|
+
issues.push('Angular instance not found');
|
|
290
|
+
}
|
|
291
|
+
// Check for Ivy-specific markers
|
|
292
|
+
const ngElements = document.querySelectorAll('[ng-version]');
|
|
293
|
+
if (ngElements.length === 0) {
|
|
294
|
+
issues.push('No Angular version markers found');
|
|
295
|
+
}
|
|
296
|
+
return issues;
|
|
297
|
+
});
|
|
298
|
+
return {
|
|
299
|
+
id: 'angular-ivy',
|
|
300
|
+
title: 'Angular Ivy Check',
|
|
301
|
+
status: ivyIssues.length === 0 ? 'PASS' : 'WARN',
|
|
302
|
+
score: ivyIssues.length === 0 ? 100 : 70,
|
|
303
|
+
details: ivyIssues.length === 0
|
|
304
|
+
? 'Angular Ivy optimizations detected'
|
|
305
|
+
: `Potential issues: ${ivyIssues.join(', ')}`,
|
|
306
|
+
fix: 'Ensure Angular Ivy is enabled in tsconfig.json'
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
finally {
|
|
310
|
+
await page.close();
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Get Lighthouse correlation score (for validation)
|
|
315
|
+
*/
|
|
316
|
+
static calculateLighthouseCorrelation(report) {
|
|
317
|
+
// Lighthouse uses similar categories with different weights
|
|
318
|
+
// Our correlation target is >95%
|
|
319
|
+
const lighthouseEquivalent = Math.round((report.groups.perf?.score || 0) * 0.40 +
|
|
320
|
+
(report.groups.a11y?.score || 0) * 0.25 +
|
|
321
|
+
(report.groups.bestPractices?.score || 0) * 0.20 +
|
|
322
|
+
(report.groups.seo?.score || 0) * 0.15);
|
|
323
|
+
return lighthouseEquivalent;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
AuditEngine.workerPool = [];
|
|
327
|
+
AuditEngine.MAX_WORKERS = 3;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import puppeteer from 'puppeteer';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { AccessibilityAudit } from './a11y.js';
|
|
4
|
+
import { PerformanceAudit } from './perf.js';
|
|
5
|
+
import { SEOAudit } from './seo.js';
|
|
6
|
+
import { BestPracticesAudit } from './best-practices.js';
|
|
7
|
+
export class AuditEngine {
|
|
8
|
+
static async runAll(urlOrPath) {
|
|
9
|
+
let targetUrl = urlOrPath;
|
|
10
|
+
// Handle file paths
|
|
11
|
+
if (!urlOrPath.startsWith('http')) {
|
|
12
|
+
if (!path.isAbsolute(urlOrPath)) {
|
|
13
|
+
targetUrl = path.resolve(process.cwd(), urlOrPath);
|
|
14
|
+
}
|
|
15
|
+
// If it's a directory, try index.html, unless it's a file
|
|
16
|
+
if (!targetUrl.endsWith('.html')) {
|
|
17
|
+
targetUrl = path.join(targetUrl, 'index.html');
|
|
18
|
+
}
|
|
19
|
+
targetUrl = 'file://' + targetUrl;
|
|
20
|
+
}
|
|
21
|
+
console.log(`ℹ [AUDIT] Launching browser for ${targetUrl}...`);
|
|
22
|
+
const browser = await puppeteer.launch({
|
|
23
|
+
headless: true,
|
|
24
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox'] // Critical for CI environments
|
|
25
|
+
});
|
|
26
|
+
try {
|
|
27
|
+
const page = await browser.newPage();
|
|
28
|
+
// Set a standard viewport
|
|
29
|
+
await page.setViewport({ width: 1280, height: 800 });
|
|
30
|
+
// Navigate
|
|
31
|
+
await page.goto(targetUrl, {
|
|
32
|
+
waitUntil: 'networkidle0',
|
|
33
|
+
timeout: 30000
|
|
34
|
+
});
|
|
35
|
+
console.log('ℹ [AUDIT] Page loaded. Analyzing...');
|
|
36
|
+
const [a11y, perf, seo, bestPractices] = await Promise.all([
|
|
37
|
+
AccessibilityAudit.run(page),
|
|
38
|
+
PerformanceAudit.run(page),
|
|
39
|
+
SEOAudit.run(page),
|
|
40
|
+
BestPracticesAudit.run(page)
|
|
41
|
+
]);
|
|
42
|
+
return {
|
|
43
|
+
timestamp: Date.now(),
|
|
44
|
+
groups: {
|
|
45
|
+
a11y,
|
|
46
|
+
perf,
|
|
47
|
+
seo,
|
|
48
|
+
bestPractices
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
console.error('❌ Audit execution failed:', e);
|
|
54
|
+
throw e;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
await browser.close();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export class PerformanceAudit {
|
|
2
|
+
static async run(page, context) {
|
|
3
|
+
const results = [];
|
|
4
|
+
// 1. Navigation Timing
|
|
5
|
+
// Use evaluate to get metrics from the browser context
|
|
6
|
+
const timing = await page.evaluate(() => {
|
|
7
|
+
const nav = performance.getEntriesByType('navigation')[0];
|
|
8
|
+
if (nav) {
|
|
9
|
+
return {
|
|
10
|
+
loadEventEnd: nav.loadEventEnd,
|
|
11
|
+
startTime: nav.startTime,
|
|
12
|
+
domContentLoadedEventEnd: nav.domContentLoadedEventEnd,
|
|
13
|
+
responseStart: nav.responseStart
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
// Fallback
|
|
17
|
+
const t = performance.timing;
|
|
18
|
+
return {
|
|
19
|
+
loadEventEnd: t.loadEventEnd - t.navigationStart,
|
|
20
|
+
startTime: 0,
|
|
21
|
+
domContentLoadedEventEnd: t.domContentLoadedEventEnd - t.navigationStart,
|
|
22
|
+
responseStart: t.responseStart - t.navigationStart
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
const loadTime = Math.max(0, Math.round(timing.loadEventEnd - timing.startTime));
|
|
26
|
+
const domReady = Math.max(0, Math.round(timing.domContentLoadedEventEnd - timing.startTime));
|
|
27
|
+
results.push({
|
|
28
|
+
id: 'load-time',
|
|
29
|
+
title: 'Page Load Time',
|
|
30
|
+
status: loadTime < 2500 ? 'PASS' : loadTime < 4500 ? 'WARN' : 'FAIL',
|
|
31
|
+
score: loadTime < 2500 ? 100 : loadTime < 4500 ? 50 : 0,
|
|
32
|
+
details: `Fully loaded in ${loadTime}ms`
|
|
33
|
+
});
|
|
34
|
+
results.push({
|
|
35
|
+
id: 'dom-ready',
|
|
36
|
+
title: 'DOM Ready',
|
|
37
|
+
status: domReady < 1500 ? 'PASS' : 'WARN',
|
|
38
|
+
score: domReady < 1500 ? 100 : 50,
|
|
39
|
+
details: `DOM Interactive in ${domReady}ms`
|
|
40
|
+
});
|
|
41
|
+
// 2. Resource Count
|
|
42
|
+
const resourceCount = await page.evaluate(() => performance.getEntriesByType('resource').length);
|
|
43
|
+
results.push({
|
|
44
|
+
id: 'resource-count',
|
|
45
|
+
title: 'Request Count',
|
|
46
|
+
status: resourceCount < 50 ? 'PASS' : resourceCount < 100 ? 'WARN' : 'FAIL',
|
|
47
|
+
score: resourceCount < 50 ? 100 : resourceCount < 100 ? 60 : 30,
|
|
48
|
+
details: `${resourceCount} network requests`
|
|
49
|
+
});
|
|
50
|
+
// 3. CLS (Cumulative Layout Shift) Approximation - or just checks JS heap
|
|
51
|
+
const jsHeap = await page.evaluate(() => performance.memory?.usedJSHeapSize).catch(() => 0);
|
|
52
|
+
if (jsHeap > 0) {
|
|
53
|
+
const heapMB = Math.round(jsHeap / 1024 / 1024);
|
|
54
|
+
results.push({
|
|
55
|
+
id: 'js-heap',
|
|
56
|
+
title: 'JS Heap Usage',
|
|
57
|
+
status: heapMB < 50 ? 'PASS' : heapMB < 100 ? 'WARN' : 'FAIL',
|
|
58
|
+
score: heapMB < 50 ? 100 : 50,
|
|
59
|
+
details: `Used JS Heap: ${heapMB}MB`
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const score = Math.round(results.reduce((acc, r) => acc + r.score, 0) / results.length);
|
|
63
|
+
return {
|
|
64
|
+
name: 'Performance',
|
|
65
|
+
results,
|
|
66
|
+
score
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|