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,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hero Errors System
|
|
3
|
+
*
|
|
4
|
+
* Provides rich, contextual error messages with:
|
|
5
|
+
* - File chain visualization
|
|
6
|
+
* - Graph explanation
|
|
7
|
+
* - Suggested fixes
|
|
8
|
+
* - Related documentation
|
|
9
|
+
*
|
|
10
|
+
* Never show "Build failed" without context.
|
|
11
|
+
*/
|
|
12
|
+
import kleur from 'kleur';
|
|
13
|
+
export class HeroError extends Error {
|
|
14
|
+
constructor(context) {
|
|
15
|
+
super(context.message);
|
|
16
|
+
this.name = 'HeroError';
|
|
17
|
+
this.context = context;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Format error for display with rich context
|
|
21
|
+
*/
|
|
22
|
+
format() {
|
|
23
|
+
const lines = [];
|
|
24
|
+
const { context } = this;
|
|
25
|
+
const width = process.stdout.columns || 80;
|
|
26
|
+
// 1. Header (Minimal & Urgent)
|
|
27
|
+
lines.push('');
|
|
28
|
+
lines.push(kleur.bgRed().bold().white(` ${context.code} `) + ' ' + kleur.red(context.message));
|
|
29
|
+
lines.push('');
|
|
30
|
+
// 2. Code Frame (The most important part)
|
|
31
|
+
if (context.file && context.line) {
|
|
32
|
+
lines.push(kleur.cyan(`╭─[${context.file}:${context.line}:${context.column || 1}]`));
|
|
33
|
+
try {
|
|
34
|
+
const fs = require('fs');
|
|
35
|
+
if (fs.existsSync(context.file)) {
|
|
36
|
+
const content = fs.readFileSync(context.file, 'utf-8');
|
|
37
|
+
const fileLines = content.split('\n');
|
|
38
|
+
const start = Math.max(0, context.line - 3);
|
|
39
|
+
const end = Math.min(fileLines.length, context.line + 2);
|
|
40
|
+
for (let i = start; i < end; i++) {
|
|
41
|
+
const lineNum = i + 1;
|
|
42
|
+
const isErrorLine = lineNum === context.line;
|
|
43
|
+
const gutter = isErrorLine ? kleur.red(` ${lineNum} │ `) : kleur.dim(` ${lineNum} │ `);
|
|
44
|
+
const code = fileLines[i];
|
|
45
|
+
if (isErrorLine) {
|
|
46
|
+
lines.push(gutter + code);
|
|
47
|
+
if (context.column) {
|
|
48
|
+
// Add pointer
|
|
49
|
+
const padding = ' '.repeat(String(lineNum).length + 3 + context.column - 1);
|
|
50
|
+
lines.push(kleur.red(padding + '^'));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
lines.push(gutter + kleur.dim(code));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
// Ignore code frame errors
|
|
61
|
+
}
|
|
62
|
+
lines.push(kleur.cyan('╰────'));
|
|
63
|
+
lines.push('');
|
|
64
|
+
}
|
|
65
|
+
// 3. Causality & Hints
|
|
66
|
+
if (context.graphExplanation) {
|
|
67
|
+
lines.push(kleur.yellow('Caused by:'));
|
|
68
|
+
lines.push(kleur.dim(` ${context.graphExplanation}`));
|
|
69
|
+
lines.push('');
|
|
70
|
+
}
|
|
71
|
+
if (context.suggestedFix) {
|
|
72
|
+
lines.push(kleur.green('💡 Suggestion:'));
|
|
73
|
+
context.suggestedFix.split('\n').forEach(line => {
|
|
74
|
+
lines.push(` ${line}`);
|
|
75
|
+
});
|
|
76
|
+
lines.push('');
|
|
77
|
+
}
|
|
78
|
+
if (context.relatedDocs && context.relatedDocs.length > 0) {
|
|
79
|
+
lines.push(kleur.blue('📚 Docs: ') + kleur.underline(context.relatedDocs[0]));
|
|
80
|
+
}
|
|
81
|
+
lines.push('');
|
|
82
|
+
return lines.join('\n');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Display error to console
|
|
86
|
+
*/
|
|
87
|
+
display() {
|
|
88
|
+
console.error(this.format());
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Error Registry - 10 High-Impact Errors
|
|
93
|
+
*/
|
|
94
|
+
// 1. Module Not Found
|
|
95
|
+
export function createModuleNotFoundError(modulePath, importedFrom, fileChain) {
|
|
96
|
+
return new HeroError({
|
|
97
|
+
code: 'MODULE_NOT_FOUND',
|
|
98
|
+
message: `Cannot resolve module '${modulePath}'`,
|
|
99
|
+
file: importedFrom,
|
|
100
|
+
fileChain,
|
|
101
|
+
graphExplanation: `The module '${modulePath}' was imported but could not be found in the dependency graph. This breaks the module resolution chain.`,
|
|
102
|
+
suggestedFix: `1. Check if the file exists at: ${modulePath}\n2. Verify the import path is correct\n3. If it's an npm package, run: npm install ${modulePath}\n4. Check your nuclie.config resolve.alias settings`,
|
|
103
|
+
relatedDocs: [
|
|
104
|
+
'https://nuclie.dev/docs/module-resolution',
|
|
105
|
+
'https://nuclie.dev/docs/troubleshooting#module-not-found'
|
|
106
|
+
],
|
|
107
|
+
severity: 'error'
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// 2. Circular Dependency Detected
|
|
111
|
+
export function createCircularDependencyError(cycle) {
|
|
112
|
+
return new HeroError({
|
|
113
|
+
code: 'CIRCULAR_DEPENDENCY',
|
|
114
|
+
message: 'Circular dependency detected in module graph',
|
|
115
|
+
fileChain: cycle,
|
|
116
|
+
graphExplanation: `A circular dependency creates an infinite loop in the module graph. This can cause runtime errors and unpredictable behavior.`,
|
|
117
|
+
suggestedFix: `1. Refactor to break the circular dependency\n2. Extract shared code into a separate module\n3. Use dependency injection or lazy loading\n4. Consider using dynamic imports: import('./module')`,
|
|
118
|
+
relatedDocs: [
|
|
119
|
+
'https://nuclie.dev/docs/circular-dependencies',
|
|
120
|
+
'https://nuclie.dev/docs/best-practices#module-design'
|
|
121
|
+
],
|
|
122
|
+
severity: 'error'
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
// 3. CSS Import Failed
|
|
126
|
+
export function createCSSImportError(cssFile, reason, importedFrom) {
|
|
127
|
+
return new HeroError({
|
|
128
|
+
code: 'CSS_IMPORT_FAILED',
|
|
129
|
+
message: `Failed to process CSS file: ${cssFile}`,
|
|
130
|
+
file: cssFile,
|
|
131
|
+
fileChain: importedFrom ? [importedFrom, cssFile] : [cssFile],
|
|
132
|
+
graphExplanation: `CSS files are first-class nodes in Nuclie's dependency graph. This CSS file could not be processed, breaking the graph.`,
|
|
133
|
+
suggestedFix: `1. Check CSS syntax: ${reason}\n2. Verify PostCSS config if using preprocessors\n3. Check for missing @import files\n4. Run: nuclie verify --explain to diagnose`,
|
|
134
|
+
relatedDocs: [
|
|
135
|
+
'https://nuclie.dev/docs/css-handling',
|
|
136
|
+
'https://nuclie.dev/docs/postcss-integration'
|
|
137
|
+
],
|
|
138
|
+
severity: 'error'
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
// 4. Framework Adapter Missing
|
|
142
|
+
export function createFrameworkAdapterMissingError(framework) {
|
|
143
|
+
return new HeroError({
|
|
144
|
+
code: 'FRAMEWORK_ADAPTER_MISSING',
|
|
145
|
+
message: `Framework adapter not found: ${framework}`,
|
|
146
|
+
graphExplanation: `Nuclie requires a framework adapter to transform framework-specific code. The adapter for '${framework}' is not installed.`,
|
|
147
|
+
suggestedFix: `1. Install the adapter: npm install @nuclie/framework-${framework.toLowerCase()}\n2. Add to nuclie.config:\n import ${framework.toLowerCase()} from '@nuclie/framework-${framework.toLowerCase()}';\n export default { framework: ${framework.toLowerCase()}() }`,
|
|
148
|
+
relatedDocs: [
|
|
149
|
+
'https://nuclie.dev/docs/framework-adapters',
|
|
150
|
+
`https://nuclie.dev/docs/frameworks/${framework.toLowerCase()}`
|
|
151
|
+
],
|
|
152
|
+
severity: 'error'
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
// 5. Invalid Config
|
|
156
|
+
export function createInvalidConfigError(configPath, validationErrors) {
|
|
157
|
+
return new HeroError({
|
|
158
|
+
code: 'INVALID_CONFIG',
|
|
159
|
+
message: 'Configuration file is invalid',
|
|
160
|
+
file: configPath,
|
|
161
|
+
graphExplanation: `The nuclie.config file failed validation. This prevents the build from starting.`,
|
|
162
|
+
suggestedFix: `Fix the following validation errors:\n${validationErrors.map((e, i) => `${i + 1}. ${e}`).join('\n')}\n\nRun: nuclie verify --explain for detailed diagnostics`,
|
|
163
|
+
relatedDocs: [
|
|
164
|
+
'https://nuclie.dev/docs/configuration',
|
|
165
|
+
'https://nuclie.dev/docs/config-schema'
|
|
166
|
+
],
|
|
167
|
+
severity: 'error'
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// 6. Build Cache Corrupted
|
|
171
|
+
export function createCacheCorruptedError(cachePath) {
|
|
172
|
+
return new HeroError({
|
|
173
|
+
code: 'CACHE_CORRUPTED',
|
|
174
|
+
message: 'Build cache is corrupted',
|
|
175
|
+
file: cachePath,
|
|
176
|
+
graphExplanation: `The SQLite build cache has become corrupted. This can happen due to interrupted builds or disk errors.`,
|
|
177
|
+
suggestedFix: `1. Delete the cache: rm -rf ${cachePath}\n2. Rebuild: nuclie build\n3. If issue persists, check disk health\n4. Consider disabling cache temporarily: nuclie build --no-cache`,
|
|
178
|
+
relatedDocs: [
|
|
179
|
+
'https://nuclie.dev/docs/caching',
|
|
180
|
+
'https://nuclie.dev/docs/troubleshooting#cache-issues'
|
|
181
|
+
],
|
|
182
|
+
severity: 'warning'
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
// 7. HMR Connection Failed
|
|
186
|
+
export function createHMRConnectionError(port, reason) {
|
|
187
|
+
return new HeroError({
|
|
188
|
+
code: 'HMR_CONNECTION_FAILED',
|
|
189
|
+
message: `Hot Module Replacement connection failed on port ${port}`,
|
|
190
|
+
graphExplanation: `The HMR WebSocket connection could not be established. This prevents live updates during development.`,
|
|
191
|
+
suggestedFix: `1. Check if port ${port} is available\n2. Verify firewall settings\n3. Try a different port: nuclie dev --port ${port + 1}\n4. Check browser console for WebSocket errors\n\nReason: ${reason}`,
|
|
192
|
+
relatedDocs: [
|
|
193
|
+
'https://nuclie.dev/docs/hmr',
|
|
194
|
+
'https://nuclie.dev/docs/dev-server#troubleshooting'
|
|
195
|
+
],
|
|
196
|
+
severity: 'warning'
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// 8. Asset Resolution Failed
|
|
200
|
+
export function createAssetResolutionError(assetPath, importedFrom) {
|
|
201
|
+
return new HeroError({
|
|
202
|
+
code: 'ASSET_RESOLUTION_FAILED',
|
|
203
|
+
message: `Cannot resolve asset: ${assetPath}`,
|
|
204
|
+
file: importedFrom,
|
|
205
|
+
fileChain: [importedFrom, assetPath],
|
|
206
|
+
graphExplanation: `Assets (images, fonts, etc.) are tracked in the dependency graph. This asset could not be found.`,
|
|
207
|
+
suggestedFix: `1. Check if file exists: ${assetPath}\n2. Verify the path is correct\n3. Check public directory configuration\n4. Ensure file extension is supported`,
|
|
208
|
+
relatedDocs: [
|
|
209
|
+
'https://nuclie.dev/docs/assets',
|
|
210
|
+
'https://nuclie.dev/docs/static-assets'
|
|
211
|
+
],
|
|
212
|
+
severity: 'error'
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
// 9. TypeScript Compilation Error
|
|
216
|
+
export function createTypeScriptError(file, line, column, message, code) {
|
|
217
|
+
return new HeroError({
|
|
218
|
+
code: 'TYPESCRIPT_ERROR',
|
|
219
|
+
message: `TypeScript compilation failed: ${message}`,
|
|
220
|
+
file,
|
|
221
|
+
line,
|
|
222
|
+
column,
|
|
223
|
+
graphExplanation: `TypeScript type checking failed. While Nuclie uses esbuild for fast transpilation, type errors indicate potential runtime issues.`,
|
|
224
|
+
suggestedFix: `1. Fix the type error at ${file}:${line}:${column}\n2. Run: npx tsc --noEmit for full type checking\n3. Check tsconfig.json settings\n4. Error code: ${code}`,
|
|
225
|
+
relatedDocs: [
|
|
226
|
+
'https://nuclie.dev/docs/typescript',
|
|
227
|
+
`https://www.typescriptlang.org/docs/handbook/error.html#${code}`
|
|
228
|
+
],
|
|
229
|
+
severity: 'error'
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
// 10. Plugin Hook Error
|
|
233
|
+
export function createPluginHookError(pluginName, hookName, error) {
|
|
234
|
+
return new HeroError({
|
|
235
|
+
code: 'PLUGIN_HOOK_ERROR',
|
|
236
|
+
message: `Plugin '${pluginName}' failed in '${hookName}' hook`,
|
|
237
|
+
graphExplanation: `A plugin hook threw an error during the build process. This indicates a bug in the plugin or incompatibility.`,
|
|
238
|
+
suggestedFix: `1. Check plugin version compatibility\n2. Review plugin configuration\n3. Try disabling the plugin temporarily\n4. Report issue to plugin author\n\nOriginal error: ${error.message}`,
|
|
239
|
+
relatedDocs: [
|
|
240
|
+
'https://nuclie.dev/docs/plugins',
|
|
241
|
+
'https://nuclie.dev/docs/plugin-api'
|
|
242
|
+
],
|
|
243
|
+
severity: 'error',
|
|
244
|
+
stack: error.stack
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Wrap any error in a HeroError with context
|
|
249
|
+
*/
|
|
250
|
+
export function wrapError(error, context) {
|
|
251
|
+
if (error instanceof HeroError) {
|
|
252
|
+
return error;
|
|
253
|
+
}
|
|
254
|
+
return new HeroError({
|
|
255
|
+
code: 'UNKNOWN_ERROR',
|
|
256
|
+
message: error.message,
|
|
257
|
+
stack: error.stack,
|
|
258
|
+
severity: 'error',
|
|
259
|
+
suggestedFix: 'This is an unexpected error. Please report it to: https://github.com/Avinash-1994/nuclie/issues',
|
|
260
|
+
relatedDocs: ['https://nuclie.dev/docs/troubleshooting'],
|
|
261
|
+
...context
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Print a Hero Error to the console
|
|
266
|
+
*/
|
|
267
|
+
export function printHeroError(error) {
|
|
268
|
+
error.display();
|
|
269
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework Detector
|
|
3
|
+
* Automatically detects which framework(s) are being used in the project
|
|
4
|
+
*/
|
|
5
|
+
export type Framework = 'react' | 'vue' | 'svelte' | 'angular' | 'solid' | 'preact' | 'qwik' | 'lit' | 'astro' | 'next' | 'nuxt' | 'remix' | 'vanilla';
|
|
6
|
+
export interface FrameworkInfo {
|
|
7
|
+
name: Framework;
|
|
8
|
+
version?: string;
|
|
9
|
+
detected: boolean;
|
|
10
|
+
confidence: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class FrameworkDetector {
|
|
13
|
+
private root;
|
|
14
|
+
private packageJson;
|
|
15
|
+
constructor(root: string);
|
|
16
|
+
detect(): Promise<FrameworkInfo[]>;
|
|
17
|
+
detectPrimary(): Promise<Framework>;
|
|
18
|
+
getFrameworkVersion(framework: Framework): Promise<string | undefined>;
|
|
19
|
+
}
|
|
20
|
+
export declare function detectFramework(root: string): Promise<Framework>;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework Detector
|
|
3
|
+
* Automatically detects which framework(s) are being used in the project
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'fs/promises';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
export class FrameworkDetector {
|
|
8
|
+
constructor(root) {
|
|
9
|
+
this.root = root;
|
|
10
|
+
}
|
|
11
|
+
async detect() {
|
|
12
|
+
// Read package.json
|
|
13
|
+
try {
|
|
14
|
+
const pkgPath = path.join(this.root, 'package.json');
|
|
15
|
+
const content = await fs.readFile(pkgPath, 'utf-8');
|
|
16
|
+
this.packageJson = JSON.parse(content);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return [{ name: 'vanilla', detected: true, confidence: 1.0 }];
|
|
20
|
+
}
|
|
21
|
+
const frameworks = [];
|
|
22
|
+
const deps = {
|
|
23
|
+
...this.packageJson.dependencies,
|
|
24
|
+
...this.packageJson.devDependencies
|
|
25
|
+
};
|
|
26
|
+
// Detect frameworks based on dependencies
|
|
27
|
+
// Meta-frameworks first (they include their base framework)
|
|
28
|
+
if (deps['next']) {
|
|
29
|
+
frameworks.push({
|
|
30
|
+
name: 'next',
|
|
31
|
+
version: deps['next'],
|
|
32
|
+
detected: true,
|
|
33
|
+
confidence: 1.0
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (deps['nuxt']) {
|
|
37
|
+
frameworks.push({
|
|
38
|
+
name: 'nuxt',
|
|
39
|
+
version: deps['nuxt'],
|
|
40
|
+
detected: true,
|
|
41
|
+
confidence: 1.0
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (deps['@remix-run/react']) {
|
|
45
|
+
frameworks.push({
|
|
46
|
+
name: 'remix',
|
|
47
|
+
version: deps['@remix-run/react'],
|
|
48
|
+
detected: true,
|
|
49
|
+
confidence: 1.0
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (deps['astro']) {
|
|
53
|
+
frameworks.push({
|
|
54
|
+
name: 'astro',
|
|
55
|
+
version: deps['astro'],
|
|
56
|
+
detected: true,
|
|
57
|
+
confidence: 1.0
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
// Base frameworks
|
|
61
|
+
if (deps['react'] && !frameworks.some(f => f.name === 'next' || f.name === 'remix')) {
|
|
62
|
+
frameworks.push({
|
|
63
|
+
name: 'react',
|
|
64
|
+
version: deps['react'],
|
|
65
|
+
detected: true,
|
|
66
|
+
confidence: 1.0
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (deps['vue'] && !frameworks.some(f => f.name === 'nuxt')) {
|
|
70
|
+
frameworks.push({
|
|
71
|
+
name: 'vue',
|
|
72
|
+
version: deps['vue'],
|
|
73
|
+
detected: true,
|
|
74
|
+
confidence: 1.0
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (deps['svelte']) {
|
|
78
|
+
frameworks.push({
|
|
79
|
+
name: 'svelte',
|
|
80
|
+
version: deps['svelte'],
|
|
81
|
+
detected: true,
|
|
82
|
+
confidence: 1.0
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (deps['@angular/core']) {
|
|
86
|
+
frameworks.push({
|
|
87
|
+
name: 'angular',
|
|
88
|
+
version: deps['@angular/core'],
|
|
89
|
+
detected: true,
|
|
90
|
+
confidence: 1.0
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (deps['solid-js']) {
|
|
94
|
+
frameworks.push({
|
|
95
|
+
name: 'solid',
|
|
96
|
+
version: deps['solid-js'],
|
|
97
|
+
detected: true,
|
|
98
|
+
confidence: 1.0
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (deps['preact']) {
|
|
102
|
+
frameworks.push({
|
|
103
|
+
name: 'preact',
|
|
104
|
+
version: deps['preact'],
|
|
105
|
+
detected: true,
|
|
106
|
+
confidence: 1.0
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if (deps['qwik'] || deps['@builder.io/qwik']) {
|
|
110
|
+
frameworks.push({
|
|
111
|
+
name: 'qwik',
|
|
112
|
+
version: deps['qwik'] || deps['@builder.io/qwik'],
|
|
113
|
+
detected: true,
|
|
114
|
+
confidence: 1.0
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (deps['lit']) {
|
|
118
|
+
frameworks.push({
|
|
119
|
+
name: 'lit',
|
|
120
|
+
version: deps['lit'],
|
|
121
|
+
detected: true,
|
|
122
|
+
confidence: 1.0
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
// If no framework detected, it's vanilla JS/TS
|
|
126
|
+
if (frameworks.length === 0) {
|
|
127
|
+
frameworks.push({
|
|
128
|
+
name: 'vanilla',
|
|
129
|
+
detected: true,
|
|
130
|
+
confidence: 1.0
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return frameworks;
|
|
134
|
+
}
|
|
135
|
+
async detectPrimary() {
|
|
136
|
+
const frameworks = await this.detect();
|
|
137
|
+
// Return the first detected framework (highest priority)
|
|
138
|
+
return frameworks[0]?.name || 'vanilla';
|
|
139
|
+
}
|
|
140
|
+
async getFrameworkVersion(framework) {
|
|
141
|
+
const frameworks = await this.detect();
|
|
142
|
+
return frameworks.find(f => f.name === framework)?.version;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export async function detectFramework(root) {
|
|
146
|
+
const detector = new FrameworkDetector(root);
|
|
147
|
+
return detector.detectPrimary();
|
|
148
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JavaScript Graph Analyzer (for benchmarking against Rust)
|
|
3
|
+
*
|
|
4
|
+
* Pure TypeScript implementation of graph algorithms
|
|
5
|
+
* Used to measure performance gains from Rust native module
|
|
6
|
+
*/
|
|
7
|
+
export interface CircularDependency {
|
|
8
|
+
cycle: string[];
|
|
9
|
+
entryPoint: string;
|
|
10
|
+
}
|
|
11
|
+
export interface GraphAnalysisResult {
|
|
12
|
+
hasCycles: boolean;
|
|
13
|
+
cycles: CircularDependency[];
|
|
14
|
+
orphanedNodes: string[];
|
|
15
|
+
entryPoints: string[];
|
|
16
|
+
totalNodes: number;
|
|
17
|
+
totalEdges: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class JSGraphAnalyzer {
|
|
20
|
+
private nodes;
|
|
21
|
+
addNode(id: string, dependencies: string[]): void;
|
|
22
|
+
/**
|
|
23
|
+
* Detect circular dependencies using DFS
|
|
24
|
+
* Time complexity: O(V + E)
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Detect circular dependencies using Iterative DFS
|
|
28
|
+
* Time complexity: O(V + E)
|
|
29
|
+
*
|
|
30
|
+
* Rewritten to be Iterative to avoid Stack Overflow on large graphs.
|
|
31
|
+
* Complies with "No Recursive Traversal" rule.
|
|
32
|
+
*/
|
|
33
|
+
detectCycles(): CircularDependency[];
|
|
34
|
+
/**
|
|
35
|
+
* Find orphaned nodes using BFS
|
|
36
|
+
* Time complexity: O(V + E)
|
|
37
|
+
*/
|
|
38
|
+
findOrphanedNodes(entryPoints: string[]): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Topological sort using Kahn's algorithm
|
|
41
|
+
* Time complexity: O(V + E)
|
|
42
|
+
*/
|
|
43
|
+
topologicalSort(): string[] | null;
|
|
44
|
+
/**
|
|
45
|
+
* Complete graph analysis
|
|
46
|
+
*/
|
|
47
|
+
analyze(entryPoints: string[]): GraphAnalysisResult;
|
|
48
|
+
nodeCount(): number;
|
|
49
|
+
edgeCount(): number;
|
|
50
|
+
clear(): void;
|
|
51
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JavaScript Graph Analyzer (for benchmarking against Rust)
|
|
3
|
+
*
|
|
4
|
+
* Pure TypeScript implementation of graph algorithms
|
|
5
|
+
* Used to measure performance gains from Rust native module
|
|
6
|
+
*/
|
|
7
|
+
export class JSGraphAnalyzer {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.nodes = new Map();
|
|
10
|
+
}
|
|
11
|
+
addNode(id, dependencies) {
|
|
12
|
+
this.nodes.set(id, dependencies);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Detect circular dependencies using DFS
|
|
16
|
+
* Time complexity: O(V + E)
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Detect circular dependencies using Iterative DFS
|
|
20
|
+
* Time complexity: O(V + E)
|
|
21
|
+
*
|
|
22
|
+
* Rewritten to be Iterative to avoid Stack Overflow on large graphs.
|
|
23
|
+
* Complies with "No Recursive Traversal" rule.
|
|
24
|
+
*/
|
|
25
|
+
detectCycles() {
|
|
26
|
+
const cycles = [];
|
|
27
|
+
const visited = new Set();
|
|
28
|
+
const onStack = new Set();
|
|
29
|
+
const path = [];
|
|
30
|
+
// Stack mimics the recursion: { node, childIndex }
|
|
31
|
+
// Using explicit stack allows scaling to heap limits instead of stack limits
|
|
32
|
+
const stack = [];
|
|
33
|
+
for (const startNode of this.nodes.keys()) {
|
|
34
|
+
if (visited.has(startNode))
|
|
35
|
+
continue;
|
|
36
|
+
// Start DFS
|
|
37
|
+
stack.push({ node: startNode, childIndex: 0 });
|
|
38
|
+
visited.add(startNode);
|
|
39
|
+
onStack.add(startNode);
|
|
40
|
+
path.push(startNode);
|
|
41
|
+
while (stack.length > 0) {
|
|
42
|
+
const peek = stack[stack.length - 1];
|
|
43
|
+
const { node, childIndex } = peek;
|
|
44
|
+
const deps = this.nodes.get(node) || [];
|
|
45
|
+
if (childIndex < deps.length) {
|
|
46
|
+
// Process next child
|
|
47
|
+
peek.childIndex++; // Move to next child for when we return
|
|
48
|
+
const dep = deps[childIndex];
|
|
49
|
+
if (!visited.has(dep)) {
|
|
50
|
+
visited.add(dep);
|
|
51
|
+
onStack.add(dep);
|
|
52
|
+
path.push(dep);
|
|
53
|
+
stack.push({ node: dep, childIndex: 0 });
|
|
54
|
+
}
|
|
55
|
+
else if (onStack.has(dep)) {
|
|
56
|
+
// Cycle detected
|
|
57
|
+
const cycleStart = path.indexOf(dep);
|
|
58
|
+
if (cycleStart !== -1) {
|
|
59
|
+
cycles.push({
|
|
60
|
+
cycle: path.slice(cycleStart),
|
|
61
|
+
entryPoint: dep
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Finished processing all children
|
|
68
|
+
onStack.delete(node);
|
|
69
|
+
path.pop();
|
|
70
|
+
stack.pop();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return cycles;
|
|
75
|
+
}
|
|
76
|
+
// Removed recursive dfsDetectCycle helper
|
|
77
|
+
/**
|
|
78
|
+
* Find orphaned nodes using BFS
|
|
79
|
+
* Time complexity: O(V + E)
|
|
80
|
+
*/
|
|
81
|
+
findOrphanedNodes(entryPoints) {
|
|
82
|
+
const reachable = new Set();
|
|
83
|
+
const queue = [...entryPoints];
|
|
84
|
+
// BFS from all entry points
|
|
85
|
+
for (const entry of entryPoints) {
|
|
86
|
+
reachable.add(entry);
|
|
87
|
+
}
|
|
88
|
+
while (queue.length > 0) {
|
|
89
|
+
const node = queue.shift();
|
|
90
|
+
const deps = this.nodes.get(node) || [];
|
|
91
|
+
for (const dep of deps) {
|
|
92
|
+
if (!reachable.has(dep)) {
|
|
93
|
+
reachable.add(dep);
|
|
94
|
+
queue.push(dep);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Find orphaned nodes
|
|
99
|
+
const orphaned = [];
|
|
100
|
+
for (const node of this.nodes.keys()) {
|
|
101
|
+
if (!reachable.has(node)) {
|
|
102
|
+
orphaned.push(node);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return orphaned;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Topological sort using Kahn's algorithm
|
|
109
|
+
* Time complexity: O(V + E)
|
|
110
|
+
*/
|
|
111
|
+
topologicalSort() {
|
|
112
|
+
const inDegree = new Map();
|
|
113
|
+
const result = [];
|
|
114
|
+
const queue = [];
|
|
115
|
+
// Calculate in-degrees
|
|
116
|
+
for (const node of this.nodes.keys()) {
|
|
117
|
+
inDegree.set(node, 0);
|
|
118
|
+
}
|
|
119
|
+
for (const deps of this.nodes.values()) {
|
|
120
|
+
for (const dep of deps) {
|
|
121
|
+
inDegree.set(dep, (inDegree.get(dep) || 0) + 1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Find nodes with in-degree 0
|
|
125
|
+
for (const [node, degree] of inDegree.entries()) {
|
|
126
|
+
if (degree === 0) {
|
|
127
|
+
queue.push(node);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Process nodes
|
|
131
|
+
while (queue.length > 0) {
|
|
132
|
+
const node = queue.shift();
|
|
133
|
+
result.push(node);
|
|
134
|
+
const deps = this.nodes.get(node) || [];
|
|
135
|
+
for (const dep of deps) {
|
|
136
|
+
const degree = inDegree.get(dep) - 1;
|
|
137
|
+
inDegree.set(dep, degree);
|
|
138
|
+
if (degree === 0) {
|
|
139
|
+
queue.push(dep);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// If result doesn't contain all nodes, there's a cycle
|
|
144
|
+
return result.length === this.nodes.size ? result : null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Complete graph analysis
|
|
148
|
+
*/
|
|
149
|
+
analyze(entryPoints) {
|
|
150
|
+
const cycles = this.detectCycles();
|
|
151
|
+
const orphanedNodes = this.findOrphanedNodes(entryPoints);
|
|
152
|
+
let totalEdges = 0;
|
|
153
|
+
for (const deps of this.nodes.values()) {
|
|
154
|
+
totalEdges += deps.length;
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
hasCycles: cycles.length > 0,
|
|
158
|
+
cycles,
|
|
159
|
+
orphanedNodes,
|
|
160
|
+
entryPoints,
|
|
161
|
+
totalNodes: this.nodes.size,
|
|
162
|
+
totalEdges
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
nodeCount() {
|
|
166
|
+
return this.nodes.size;
|
|
167
|
+
}
|
|
168
|
+
edgeCount() {
|
|
169
|
+
let count = 0;
|
|
170
|
+
for (const deps of this.nodes.values()) {
|
|
171
|
+
count += deps.length;
|
|
172
|
+
}
|
|
173
|
+
return count;
|
|
174
|
+
}
|
|
175
|
+
clear() {
|
|
176
|
+
this.nodes.clear();
|
|
177
|
+
}
|
|
178
|
+
}
|