@planu/cli 0.24.0 → 0.25.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/dist/config/ai-model-pricing.json +81 -0
- package/dist/config/framework-registry/csharp-aspnet.json +67 -0
- package/dist/config/framework-registry/dart-flutter.json +61 -0
- package/dist/config/framework-registry/go-gin.json +62 -0
- package/dist/config/framework-registry/index.json +164 -0
- package/dist/config/framework-registry/java-springboot.json +67 -0
- package/dist/config/framework-registry/php-laravel.json +67 -0
- package/dist/config/framework-registry/python-django.json +72 -0
- package/dist/config/framework-registry/python-fastapi.json +72 -0
- package/dist/config/framework-registry/ruby-rails.json +67 -0
- package/dist/config/framework-registry/rust-actix.json +61 -0
- package/dist/config/framework-registry/swift-swiftui.json +67 -0
- package/dist/config/framework-registry/typescript-angular.json +67 -0
- package/dist/config/framework-registry/typescript-astro.json +61 -0
- package/dist/config/framework-registry/typescript-express.json +67 -0
- package/dist/config/framework-registry/typescript-nestjs.json +62 -0
- package/dist/config/framework-registry/typescript-nextjs.json +82 -0
- package/dist/config/framework-registry/typescript-nuxt.json +67 -0
- package/dist/config/framework-registry/typescript-react.json +77 -0
- package/dist/config/framework-registry/typescript-remix.json +61 -0
- package/dist/config/framework-registry/typescript-sveltekit.json +67 -0
- package/dist/config/framework-registry/typescript-vue.json +72 -0
- package/dist/config/license-plans.json +23 -3
- package/dist/engine/agile-config-builder.d.ts.map +1 -1
- package/dist/engine/agile-config-builder.js +3 -0
- package/dist/engine/agile-config-builder.js.map +1 -1
- package/dist/engine/ai-cost-estimator/core.d.ts +8 -0
- package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/core.js +257 -0
- package/dist/engine/ai-cost-estimator/core.js.map +1 -0
- package/dist/engine/ai-cost-estimator/index.d.ts +4 -0
- package/dist/engine/ai-cost-estimator/index.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/index.js +5 -0
- package/dist/engine/ai-cost-estimator/index.js.map +1 -0
- package/dist/engine/ai-cost-estimator/model-pricing.d.ts +31 -0
- package/dist/engine/ai-cost-estimator/model-pricing.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/model-pricing.js +96 -0
- package/dist/engine/ai-cost-estimator/model-pricing.js.map +1 -0
- package/dist/engine/ai-cost-estimator/token-estimator.d.ts +37 -0
- package/dist/engine/ai-cost-estimator/token-estimator.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/token-estimator.js +194 -0
- package/dist/engine/ai-cost-estimator/token-estimator.js.map +1 -0
- package/dist/engine/ci-generator/context-builders.d.ts +4 -0
- package/dist/engine/ci-generator/context-builders.d.ts.map +1 -0
- package/dist/engine/ci-generator/context-builders.js +129 -0
- package/dist/engine/ci-generator/context-builders.js.map +1 -0
- package/dist/engine/ci-generator/index.d.ts +7 -0
- package/dist/engine/ci-generator/index.d.ts.map +1 -0
- package/dist/engine/ci-generator/index.js +44 -0
- package/dist/engine/ci-generator/index.js.map +1 -0
- package/dist/engine/ci-generator/stack-detector.d.ts +21 -0
- package/dist/engine/ci-generator/stack-detector.d.ts.map +1 -0
- package/dist/engine/ci-generator/stack-detector.js +203 -0
- package/dist/engine/ci-generator/stack-detector.js.map +1 -0
- package/dist/engine/ci-generator/yaml-builder.d.ts +8 -0
- package/dist/engine/ci-generator/yaml-builder.d.ts.map +1 -0
- package/dist/engine/ci-generator/yaml-builder.js +285 -0
- package/dist/engine/ci-generator/yaml-builder.js.map +1 -0
- package/dist/engine/dashboard/data-loader.d.ts +21 -0
- package/dist/engine/dashboard/data-loader.d.ts.map +1 -0
- package/dist/engine/dashboard/data-loader.js +196 -0
- package/dist/engine/dashboard/data-loader.js.map +1 -0
- package/dist/engine/dashboard/index.d.ts +5 -0
- package/dist/engine/dashboard/index.d.ts.map +1 -0
- package/dist/engine/dashboard/index.js +6 -0
- package/dist/engine/dashboard/index.js.map +1 -0
- package/dist/engine/dashboard/routes.d.ts +4 -0
- package/dist/engine/dashboard/routes.d.ts.map +1 -0
- package/dist/engine/dashboard/routes.js +120 -0
- package/dist/engine/dashboard/routes.js.map +1 -0
- package/dist/engine/dashboard/server.d.ts +14 -0
- package/dist/engine/dashboard/server.d.ts.map +1 -0
- package/dist/engine/dashboard/server.js +88 -0
- package/dist/engine/dashboard/server.js.map +1 -0
- package/dist/engine/dashboard/templates-layout.d.ts +11 -0
- package/dist/engine/dashboard/templates-layout.d.ts.map +1 -0
- package/dist/engine/dashboard/templates-layout.js +305 -0
- package/dist/engine/dashboard/templates-layout.js.map +1 -0
- package/dist/engine/dashboard/templates-project.d.ts +10 -0
- package/dist/engine/dashboard/templates-project.d.ts.map +1 -0
- package/dist/engine/dashboard/templates-project.js +163 -0
- package/dist/engine/dashboard/templates-project.js.map +1 -0
- package/dist/engine/dashboard/templates.d.ts +3 -0
- package/dist/engine/dashboard/templates.d.ts.map +1 -0
- package/dist/engine/dashboard/templates.js +4 -0
- package/dist/engine/dashboard/templates.js.map +1 -0
- package/dist/engine/focus-tracker.d.ts.map +1 -1
- package/dist/engine/focus-tracker.js +1 -0
- package/dist/engine/focus-tracker.js.map +1 -1
- package/dist/engine/hooks/core.d.ts +26 -0
- package/dist/engine/hooks/core.d.ts.map +1 -0
- package/dist/engine/hooks/core.js +164 -0
- package/dist/engine/hooks/core.js.map +1 -0
- package/dist/engine/hooks/git-hook-generator.d.ts +14 -0
- package/dist/engine/hooks/git-hook-generator.d.ts.map +1 -0
- package/dist/engine/hooks/git-hook-generator.js +119 -0
- package/dist/engine/hooks/git-hook-generator.js.map +1 -0
- package/dist/engine/hooks/index.d.ts +5 -0
- package/dist/engine/hooks/index.d.ts.map +1 -0
- package/dist/engine/hooks/index.js +6 -0
- package/dist/engine/hooks/index.js.map +1 -0
- package/dist/engine/hooks/templates.d.ts +14 -0
- package/dist/engine/hooks/templates.d.ts.map +1 -0
- package/dist/engine/hooks/templates.js +138 -0
- package/dist/engine/hooks/templates.js.map +1 -0
- package/dist/engine/hooks/triggers.d.ts +27 -0
- package/dist/engine/hooks/triggers.d.ts.map +1 -0
- package/dist/engine/hooks/triggers.js +104 -0
- package/dist/engine/hooks/triggers.js.map +1 -0
- package/dist/engine/registry/core.d.ts +32 -0
- package/dist/engine/registry/core.d.ts.map +1 -0
- package/dist/engine/registry/core.js +85 -0
- package/dist/engine/registry/core.js.map +1 -0
- package/dist/engine/registry/index.d.ts +6 -0
- package/dist/engine/registry/index.d.ts.map +1 -0
- package/dist/engine/registry/index.js +8 -0
- package/dist/engine/registry/index.js.map +1 -0
- package/dist/engine/registry/loader.d.ts +18 -0
- package/dist/engine/registry/loader.d.ts.map +1 -0
- package/dist/engine/registry/loader.js +81 -0
- package/dist/engine/registry/loader.js.map +1 -0
- package/dist/engine/registry/matcher.d.ts +19 -0
- package/dist/engine/registry/matcher.d.ts.map +1 -0
- package/dist/engine/registry/matcher.js +150 -0
- package/dist/engine/registry/matcher.js.map +1 -0
- package/dist/engine/registry/reporter.d.ts +10 -0
- package/dist/engine/registry/reporter.d.ts.map +1 -0
- package/dist/engine/registry/reporter.js +132 -0
- package/dist/engine/registry/reporter.js.map +1 -0
- package/dist/engine/registry/validator.d.ts +17 -0
- package/dist/engine/registry/validator.d.ts.map +1 -0
- package/dist/engine/registry/validator.js +103 -0
- package/dist/engine/registry/validator.js.map +1 -0
- package/dist/engine/spec-changelog/core.d.ts +16 -0
- package/dist/engine/spec-changelog/core.d.ts.map +1 -0
- package/dist/engine/spec-changelog/core.js +175 -0
- package/dist/engine/spec-changelog/core.js.map +1 -0
- package/dist/engine/spec-changelog/diff.d.ts +18 -0
- package/dist/engine/spec-changelog/diff.d.ts.map +1 -0
- package/dist/engine/spec-changelog/diff.js +116 -0
- package/dist/engine/spec-changelog/diff.js.map +1 -0
- package/dist/engine/spec-changelog/index.d.ts +3 -0
- package/dist/engine/spec-changelog/index.d.ts.map +1 -0
- package/dist/engine/spec-changelog/index.js +4 -0
- package/dist/engine/spec-changelog/index.js.map +1 -0
- package/dist/engine/spec-coverage/core.d.ts +14 -0
- package/dist/engine/spec-coverage/core.d.ts.map +1 -0
- package/dist/engine/spec-coverage/core.js +132 -0
- package/dist/engine/spec-coverage/core.js.map +1 -0
- package/dist/engine/spec-coverage/criteria-mapper.d.ts +18 -0
- package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -0
- package/dist/engine/spec-coverage/criteria-mapper.js +306 -0
- package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -0
- package/dist/engine/spec-coverage/index.d.ts +4 -0
- package/dist/engine/spec-coverage/index.d.ts.map +1 -0
- package/dist/engine/spec-coverage/index.js +5 -0
- package/dist/engine/spec-coverage/index.js.map +1 -0
- package/dist/engine/spec-coverage/test-finder.d.ts +17 -0
- package/dist/engine/spec-coverage/test-finder.d.ts.map +1 -0
- package/dist/engine/spec-coverage/test-finder.js +250 -0
- package/dist/engine/spec-coverage/test-finder.js.map +1 -0
- package/dist/engine/spec-templates/catalog-extra.d.ts +4 -0
- package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -0
- package/dist/engine/spec-templates/catalog-extra.js +367 -0
- package/dist/engine/spec-templates/catalog-extra.js.map +1 -0
- package/dist/engine/spec-templates/catalog.d.ts +4 -0
- package/dist/engine/spec-templates/catalog.d.ts.map +1 -0
- package/dist/engine/spec-templates/catalog.js +386 -0
- package/dist/engine/spec-templates/catalog.js.map +1 -0
- package/dist/engine/spec-templates/index.d.ts +4 -0
- package/dist/engine/spec-templates/index.d.ts.map +1 -0
- package/dist/engine/spec-templates/index.js +5 -0
- package/dist/engine/spec-templates/index.js.map +1 -0
- package/dist/engine/spec-templates/query.d.ts +14 -0
- package/dist/engine/spec-templates/query.d.ts.map +1 -0
- package/dist/engine/spec-templates/query.js +56 -0
- package/dist/engine/spec-templates/query.js.map +1 -0
- package/dist/engine/spec-templates/renderer.d.ts +19 -0
- package/dist/engine/spec-templates/renderer.d.ts.map +1 -0
- package/dist/engine/spec-templates/renderer.js +45 -0
- package/dist/engine/spec-templates/renderer.js.map +1 -0
- package/dist/engine/usage-tracker/trial.d.ts +4 -4
- package/dist/engine/usage-tracker/trial.d.ts.map +1 -1
- package/dist/engine/usage-tracker/trial.js +4 -4
- package/dist/engine/usage-tracker/trial.js.map +1 -1
- package/dist/engine/webhook/event-handlers.d.ts +25 -0
- package/dist/engine/webhook/event-handlers.d.ts.map +1 -0
- package/dist/engine/webhook/event-handlers.js +89 -0
- package/dist/engine/webhook/event-handlers.js.map +1 -0
- package/dist/engine/webhook/index.d.ts +4 -0
- package/dist/engine/webhook/index.d.ts.map +1 -0
- package/dist/engine/webhook/index.js +5 -0
- package/dist/engine/webhook/index.js.map +1 -0
- package/dist/engine/webhook/server.d.ts +18 -0
- package/dist/engine/webhook/server.d.ts.map +1 -0
- package/dist/engine/webhook/server.js +187 -0
- package/dist/engine/webhook/server.js.map +1 -0
- package/dist/engine/webhook/signature.d.ts +16 -0
- package/dist/engine/webhook/signature.d.ts.map +1 -0
- package/dist/engine/webhook/signature.js +49 -0
- package/dist/engine/webhook/signature.js.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/hooks-store.d.ts +34 -0
- package/dist/storage/hooks-store.d.ts.map +1 -0
- package/dist/storage/hooks-store.js +128 -0
- package/dist/storage/hooks-store.js.map +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/tools/check-spec-accuracy.d.ts +7 -0
- package/dist/tools/check-spec-accuracy.d.ts.map +1 -0
- package/dist/tools/check-spec-accuracy.js +28 -0
- package/dist/tools/check-spec-accuracy.js.map +1 -0
- package/dist/tools/ci-generator.d.ts +7 -0
- package/dist/tools/ci-generator.d.ts.map +1 -0
- package/dist/tools/ci-generator.js +49 -0
- package/dist/tools/ci-generator.js.map +1 -0
- package/dist/tools/create-spec.d.ts.map +1 -1
- package/dist/tools/create-spec.js +4 -0
- package/dist/tools/create-spec.js.map +1 -1
- package/dist/tools/dashboard.d.ts +6 -0
- package/dist/tools/dashboard.d.ts.map +1 -0
- package/dist/tools/dashboard.js +48 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/detect-drift.d.ts.map +1 -1
- package/dist/tools/detect-drift.js +6 -0
- package/dist/tools/detect-drift.js.map +1 -1
- package/dist/tools/estimate-ai-cost.d.ts +8 -0
- package/dist/tools/estimate-ai-cost.d.ts.map +1 -0
- package/dist/tools/estimate-ai-cost.js +29 -0
- package/dist/tools/estimate-ai-cost.js.map +1 -0
- package/dist/tools/list-specs.d.ts.map +1 -1
- package/dist/tools/list-specs.js +15 -0
- package/dist/tools/list-specs.js.map +1 -1
- package/dist/tools/manage-hooks.d.ts +5 -0
- package/dist/tools/manage-hooks.d.ts.map +1 -0
- package/dist/tools/manage-hooks.js +247 -0
- package/dist/tools/manage-hooks.js.map +1 -0
- package/dist/tools/reconcile-spec.d.ts.map +1 -1
- package/dist/tools/reconcile-spec.js +24 -0
- package/dist/tools/reconcile-spec.js.map +1 -1
- package/dist/tools/register-ai-cost-tools.d.ts +3 -0
- package/dist/tools/register-ai-cost-tools.d.ts.map +1 -0
- package/dist/tools/register-ai-cost-tools.js +25 -0
- package/dist/tools/register-ai-cost-tools.js.map +1 -0
- package/dist/tools/register-changelog-tools.d.ts +3 -0
- package/dist/tools/register-changelog-tools.d.ts.map +1 -0
- package/dist/tools/register-changelog-tools.js +23 -0
- package/dist/tools/register-changelog-tools.js.map +1 -0
- package/dist/tools/register-ci-tools.d.ts +3 -0
- package/dist/tools/register-ci-tools.d.ts.map +1 -0
- package/dist/tools/register-ci-tools.js +50 -0
- package/dist/tools/register-ci-tools.js.map +1 -0
- package/dist/tools/register-coverage-tools.d.ts +7 -0
- package/dist/tools/register-coverage-tools.d.ts.map +1 -0
- package/dist/tools/register-coverage-tools.js +27 -0
- package/dist/tools/register-coverage-tools.js.map +1 -0
- package/dist/tools/register-dashboard-tools.d.ts +3 -0
- package/dist/tools/register-dashboard-tools.d.ts.map +1 -0
- package/dist/tools/register-dashboard-tools.js +29 -0
- package/dist/tools/register-dashboard-tools.js.map +1 -0
- package/dist/tools/register-hooks-tools.d.ts +3 -0
- package/dist/tools/register-hooks-tools.d.ts.map +1 -0
- package/dist/tools/register-hooks-tools.js +107 -0
- package/dist/tools/register-hooks-tools.js.map +1 -0
- package/dist/tools/register-registry-tools.d.ts +3 -0
- package/dist/tools/register-registry-tools.d.ts.map +1 -0
- package/dist/tools/register-registry-tools.js +43 -0
- package/dist/tools/register-registry-tools.js.map +1 -0
- package/dist/tools/register-template-tools.d.ts +8 -0
- package/dist/tools/register-template-tools.d.ts.map +1 -0
- package/dist/tools/register-template-tools.js +71 -0
- package/dist/tools/register-template-tools.js.map +1 -0
- package/dist/tools/register-webhook-tools.d.ts +3 -0
- package/dist/tools/register-webhook-tools.d.ts.map +1 -0
- package/dist/tools/register-webhook-tools.js +49 -0
- package/dist/tools/register-webhook-tools.js.map +1 -0
- package/dist/tools/schemas/index.d.ts +1 -0
- package/dist/tools/schemas/index.d.ts.map +1 -1
- package/dist/tools/schemas/index.js +1 -0
- package/dist/tools/schemas/index.js.map +1 -1
- package/dist/tools/schemas/registry.d.ts +41 -0
- package/dist/tools/schemas/registry.d.ts.map +1 -0
- package/dist/tools/schemas/registry.js +62 -0
- package/dist/tools/schemas/registry.js.map +1 -0
- package/dist/tools/spec-coverage.d.ts +3 -0
- package/dist/tools/spec-coverage.d.ts.map +1 -0
- package/dist/tools/spec-coverage.js +176 -0
- package/dist/tools/spec-coverage.js.map +1 -0
- package/dist/tools/spec-history.d.ts +3 -0
- package/dist/tools/spec-history.d.ts.map +1 -0
- package/dist/tools/spec-history.js +67 -0
- package/dist/tools/spec-history.js.map +1 -0
- package/dist/tools/spec-templates.d.ts +10 -0
- package/dist/tools/spec-templates.d.ts.map +1 -0
- package/dist/tools/spec-templates.js +155 -0
- package/dist/tools/spec-templates.js.map +1 -0
- package/dist/tools/update-registry.d.ts +8 -0
- package/dist/tools/update-registry.d.ts.map +1 -0
- package/dist/tools/update-registry.js +53 -0
- package/dist/tools/update-registry.js.map +1 -0
- package/dist/tools/update-status.d.ts.map +1 -1
- package/dist/tools/update-status.js +24 -0
- package/dist/tools/update-status.js.map +1 -1
- package/dist/tools/webhook.d.ts +6 -0
- package/dist/tools/webhook.d.ts.map +1 -0
- package/dist/tools/webhook.js +150 -0
- package/dist/tools/webhook.js.map +1 -0
- package/dist/types/ai-cost.d.ts +98 -0
- package/dist/types/ai-cost.d.ts.map +1 -0
- package/dist/types/ai-cost.js +4 -0
- package/dist/types/ai-cost.js.map +1 -0
- package/dist/types/analysis.d.ts +64 -0
- package/dist/types/analysis.d.ts.map +1 -1
- package/dist/types/changelog.d.ts +49 -0
- package/dist/types/changelog.d.ts.map +1 -0
- package/dist/types/changelog.js +3 -0
- package/dist/types/changelog.js.map +1 -0
- package/dist/types/ci.d.ts +105 -0
- package/dist/types/ci.d.ts.map +1 -0
- package/dist/types/ci.js +3 -0
- package/dist/types/ci.js.map +1 -0
- package/dist/types/coverage.d.ts +95 -0
- package/dist/types/coverage.d.ts.map +1 -0
- package/dist/types/coverage.js +4 -0
- package/dist/types/coverage.js.map +1 -0
- package/dist/types/hooks.d.ts +139 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/hooks.js +3 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/registry.d.ts +90 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +5 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/types/spec-templates.d.ts +87 -0
- package/dist/types/spec-templates.d.ts.map +1 -0
- package/dist/types/spec-templates.js +3 -0
- package/dist/types/spec-templates.js.map +1 -0
- package/dist/types/ui.d.ts +76 -0
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/types/webhook.d.ts +62 -0
- package/dist/types/webhook.d.ts.map +1 -0
- package/dist/types/webhook.js +4 -0
- package/dist/types/webhook.js.map +1 -0
- package/package.json +1 -1
- package/src/config/ai-model-pricing.json +81 -0
- package/src/config/framework-registry/csharp-aspnet.json +67 -0
- package/src/config/framework-registry/dart-flutter.json +61 -0
- package/src/config/framework-registry/go-gin.json +62 -0
- package/src/config/framework-registry/index.json +164 -0
- package/src/config/framework-registry/java-springboot.json +67 -0
- package/src/config/framework-registry/php-laravel.json +67 -0
- package/src/config/framework-registry/python-django.json +72 -0
- package/src/config/framework-registry/python-fastapi.json +72 -0
- package/src/config/framework-registry/ruby-rails.json +67 -0
- package/src/config/framework-registry/rust-actix.json +61 -0
- package/src/config/framework-registry/swift-swiftui.json +67 -0
- package/src/config/framework-registry/typescript-angular.json +67 -0
- package/src/config/framework-registry/typescript-astro.json +61 -0
- package/src/config/framework-registry/typescript-express.json +67 -0
- package/src/config/framework-registry/typescript-nestjs.json +62 -0
- package/src/config/framework-registry/typescript-nextjs.json +82 -0
- package/src/config/framework-registry/typescript-nuxt.json +67 -0
- package/src/config/framework-registry/typescript-react.json +77 -0
- package/src/config/framework-registry/typescript-remix.json +61 -0
- package/src/config/framework-registry/typescript-sveltekit.json +67 -0
- package/src/config/framework-registry/typescript-vue.json +72 -0
- package/src/config/license-plans.json +23 -3
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"framework": "fastapi",
|
|
3
|
+
"displayName": "FastAPI",
|
|
4
|
+
"frameworkVersion": "0.100+",
|
|
5
|
+
"lastUpdated": "2026-03-04",
|
|
6
|
+
"ecosystem": "python",
|
|
7
|
+
"customEntry": false,
|
|
8
|
+
"correctPatterns": [
|
|
9
|
+
{
|
|
10
|
+
"pattern": "Pydantic v2 BaseModel para request/response schemas",
|
|
11
|
+
"example": "class UserCreate(BaseModel): name: str; email: EmailStr; model_config = ConfigDict(str_strip_whitespace=True)",
|
|
12
|
+
"since": "0.100"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"pattern": "Depends() para dependency injection",
|
|
16
|
+
"example": "async def get_current_user(token: str = Depends(oauth2_scheme)): ...",
|
|
17
|
+
"since": "0.1"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"pattern": "async/await para rutas de I/O",
|
|
21
|
+
"example": "@app.get('/users') async def read_users(db: AsyncSession = Depends(get_db)): ...",
|
|
22
|
+
"since": "0.1"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"pattern": "HTTPException para errores HTTP",
|
|
26
|
+
"example": "raise HTTPException(status_code=404, detail='User not found')",
|
|
27
|
+
"since": "0.1"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"pattern": "lifespan context manager para startup/shutdown en FastAPI 0.93+",
|
|
31
|
+
"example": "@asynccontextmanager async def lifespan(app: FastAPI): await db.connect(); yield; await db.disconnect()",
|
|
32
|
+
"since": "0.93"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"deprecatedPatterns": [
|
|
36
|
+
{
|
|
37
|
+
"pattern": "on_event('startup') / on_event('shutdown') decorators",
|
|
38
|
+
"replacedBy": "lifespan context manager en FastAPI 0.93+",
|
|
39
|
+
"severity": "warning"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"pattern": "Pydantic v1 validator() decorator",
|
|
43
|
+
"replacedBy": "Pydantic v2 field_validator() con mode='before'/'after'",
|
|
44
|
+
"severity": "error"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"pattern": "Pydantic v1 .dict() en lugar de .model_dump()",
|
|
48
|
+
"replacedBy": ".model_dump() de Pydantic v2",
|
|
49
|
+
"severity": "error"
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"commonMistakes": [
|
|
53
|
+
{
|
|
54
|
+
"pattern": "Ruta sincrona para operaciones de I/O",
|
|
55
|
+
"example": "@app.get('/data') def read_data(): return requests.get('...').json() — bloquea el event loop",
|
|
56
|
+
"replacedBy": "@app.get('/data') async def read_data(): return await httpx.get('...')",
|
|
57
|
+
"severity": "error"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"pattern": "No validar el response_model — retornar datos sensibles",
|
|
61
|
+
"example": "@app.get('/users') async def get_user(): return user_from_db — puede exponer password_hash",
|
|
62
|
+
"replacedBy": "@app.get('/users', response_model=UserPublic) — filtrar con Pydantic",
|
|
63
|
+
"severity": "error"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"pattern": "spring.datasource.url con formato antiguo de Spring Boot 3",
|
|
67
|
+
"example": "spring.datasource.url=jdbc:mysql://localhost:3306/db (formato Spring Boot 2)",
|
|
68
|
+
"replacedBy": "spring.datasource.url=jdbc:mysql://localhost:3306/db (sigue igual pero con driver actualizado)",
|
|
69
|
+
"severity": "info"
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"framework": "rails",
|
|
3
|
+
"displayName": "Rails",
|
|
4
|
+
"frameworkVersion": "7.x",
|
|
5
|
+
"lastUpdated": "2026-03-04",
|
|
6
|
+
"ecosystem": "ruby",
|
|
7
|
+
"customEntry": false,
|
|
8
|
+
"correctPatterns": [
|
|
9
|
+
{
|
|
10
|
+
"pattern": "Hotwire (Turbo + Stimulus) para interactividad sin SPA",
|
|
11
|
+
"example": "turbo_stream_from @room — subscripcion a Turbo Stream desde el view",
|
|
12
|
+
"since": "7.0"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"pattern": "Strong Parameters con require y permit",
|
|
16
|
+
"example": "def user_params; params.require(:user).permit(:name, :email); end",
|
|
17
|
+
"since": "4.0"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"pattern": "ActiveRecord scopes para queries reutilizables",
|
|
21
|
+
"example": "scope :active, -> { where(status: 'active') }",
|
|
22
|
+
"since": "3.0"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"pattern": "Importmap para JavaScript sin Node/npm en produccion",
|
|
26
|
+
"example": "pin 'stimulus', to: 'https://cdn.jsdelivr.net/npm/@hotwired/stimulus@3/dist/stimulus.js'",
|
|
27
|
+
"since": "7.0"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"pattern": "credentials.yml.enc para secrets",
|
|
31
|
+
"example": "Rails.application.credentials.aws[:access_key_id]",
|
|
32
|
+
"since": "5.2"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"deprecatedPatterns": [
|
|
36
|
+
{
|
|
37
|
+
"pattern": "Webpacker para asset bundling en Rails 7",
|
|
38
|
+
"replacedBy": "Importmap (default) o jsbundling-rails con esbuild/rollup",
|
|
39
|
+
"severity": "error"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"pattern": "protect_from_forgery :null_session para APIs",
|
|
43
|
+
"replacedBy": "Heredar de ActionController::API para controllers de solo API",
|
|
44
|
+
"severity": "warning"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"commonMistakes": [
|
|
48
|
+
{
|
|
49
|
+
"pattern": "N+1 queries sin eager loading",
|
|
50
|
+
"example": "Post.all.each { |p| p.author.name } — N+1",
|
|
51
|
+
"replacedBy": "Post.includes(:author).each { |p| p.author.name }",
|
|
52
|
+
"severity": "warning"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"pattern": "Logica de negocio en el controller",
|
|
56
|
+
"example": "def create; @user = User.new(user_params); @user.send_welcome_email; @user.save; end — logica en controller",
|
|
57
|
+
"replacedBy": "Mover a Service Objects o Concerns",
|
|
58
|
+
"severity": "warning"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"pattern": "Secrets en el codigo fuente en lugar de credentials",
|
|
62
|
+
"example": "API_KEY = 'sk-hardcoded-key' en el codigo",
|
|
63
|
+
"replacedBy": "Rails.application.credentials.my_api[:key]",
|
|
64
|
+
"severity": "error"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"framework": "actix",
|
|
3
|
+
"displayName": "Actix-web",
|
|
4
|
+
"frameworkVersion": "4.x",
|
|
5
|
+
"lastUpdated": "2026-03-04",
|
|
6
|
+
"ecosystem": "rust",
|
|
7
|
+
"customEntry": false,
|
|
8
|
+
"correctPatterns": [
|
|
9
|
+
{
|
|
10
|
+
"pattern": "web::Data para estado compartido entre handlers",
|
|
11
|
+
"example": "let data = web::Data::new(AppState { db: pool }); App::new().app_data(data.clone())",
|
|
12
|
+
"since": "4.0"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"pattern": "HttpResponse::Ok().json() para respuestas JSON",
|
|
16
|
+
"example": "async fn handler() -> impl Responder { HttpResponse::Ok().json(User { name: 'Alice' }) }",
|
|
17
|
+
"since": "4.0"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"pattern": "Extractors para parsear request (Path, Query, Json)",
|
|
21
|
+
"example": "async fn get_user(path: web::Path<u32>, db: web::Data<DbPool>) -> impl Responder { ... }",
|
|
22
|
+
"since": "4.0"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"pattern": "App::new().service() para registrar rutas",
|
|
26
|
+
"example": "App::new().service(web::resource('/users').route(web::get().to(list_users)))",
|
|
27
|
+
"since": "4.0"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"pattern": "ResponseError trait para errores tipados",
|
|
31
|
+
"example": "impl ResponseError for AppError { fn error_response(&self) -> HttpResponse { ... } }",
|
|
32
|
+
"since": "4.0"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"deprecatedPatterns": [
|
|
36
|
+
{
|
|
37
|
+
"pattern": "actix_web::web::ServiceConfig con firma antigua de Actix 3",
|
|
38
|
+
"replacedBy": "Actix 4: fn configure(cfg: &mut web::ServiceConfig) — misma firma pero el trait configure() cambio",
|
|
39
|
+
"severity": "error"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"pattern": "System::new().block_on() de Actix 1/2 para async runtime",
|
|
43
|
+
"replacedBy": "#[actix_web::main] macro o tokio runtime directamente",
|
|
44
|
+
"severity": "error"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"commonMistakes": [
|
|
48
|
+
{
|
|
49
|
+
"pattern": "Compartir estado no-Send entre threads con Arc sin Mutex",
|
|
50
|
+
"example": "let data = Arc::new(state); — si state no es Sync, falla en compilacion",
|
|
51
|
+
"replacedBy": "Arc<Mutex<State>> o Arc<RwLock<State>> para estado mutable compartido",
|
|
52
|
+
"severity": "error"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"pattern": "Olvidar .await en handlers async",
|
|
56
|
+
"example": "async fn handler() -> impl Responder { fetch_data() } — sin await devuelve un Future",
|
|
57
|
+
"replacedBy": "async fn handler() -> impl Responder { fetch_data().await }",
|
|
58
|
+
"severity": "error"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"framework": "swiftui",
|
|
3
|
+
"displayName": "SwiftUI",
|
|
4
|
+
"frameworkVersion": "5.x",
|
|
5
|
+
"lastUpdated": "2026-03-04",
|
|
6
|
+
"ecosystem": "swift",
|
|
7
|
+
"customEntry": false,
|
|
8
|
+
"correctPatterns": [
|
|
9
|
+
{
|
|
10
|
+
"pattern": "@State para estado local del view",
|
|
11
|
+
"example": "@State private var isPresented = false",
|
|
12
|
+
"since": "1.0"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"pattern": "@ObservedObject o @StateObject para ViewModels",
|
|
16
|
+
"example": "@StateObject private var viewModel = UserViewModel()",
|
|
17
|
+
"since": "1.0"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"pattern": "NavigationStack para navegacion en iOS 16+",
|
|
21
|
+
"example": "NavigationStack { List(items) { item in NavigationLink(item.title, value: item) }.navigationDestination(for: Item.self) { item in DetailView(item: item) } }",
|
|
22
|
+
"since": "4.0"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"pattern": "@Query de SwiftData para data fetching en iOS 17+",
|
|
26
|
+
"example": "@Query var items: [Item]",
|
|
27
|
+
"since": "5.0"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"pattern": "task() modifier para async work asociado al view lifecycle",
|
|
31
|
+
"example": ".task { await viewModel.load() }",
|
|
32
|
+
"since": "3.0"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"deprecatedPatterns": [
|
|
36
|
+
{
|
|
37
|
+
"pattern": "NavigationView para navegacion en iOS 16+",
|
|
38
|
+
"replacedBy": "NavigationStack (iOS 16+) o NavigationSplitView para iPad",
|
|
39
|
+
"severity": "warning"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"pattern": "CoreData directamente en SwiftUI sin SwiftData",
|
|
43
|
+
"replacedBy": "SwiftData con @Model macro en iOS 17+",
|
|
44
|
+
"severity": "info"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"commonMistakes": [
|
|
48
|
+
{
|
|
49
|
+
"pattern": "Mutar @State desde un thread secundario",
|
|
50
|
+
"example": "DispatchQueue.global().async { self.isLoading = false } — debe ser en main thread",
|
|
51
|
+
"replacedBy": "DispatchQueue.main.async { self.isLoading = false } o usar @MainActor",
|
|
52
|
+
"severity": "error"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"pattern": "Crear @StateObject en el body del view",
|
|
56
|
+
"example": "var body: some View { let vm = ViewModel(); ... } — se crea en cada render",
|
|
57
|
+
"replacedBy": "@StateObject private var vm = ViewModel() — fuera del body",
|
|
58
|
+
"severity": "error"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"pattern": "Usar @ObservedObject cuando deberia ser @StateObject",
|
|
62
|
+
"example": "@ObservedObject var vm = ViewModel() — vm se puede perder al rerender",
|
|
63
|
+
"replacedBy": "@StateObject var vm = ViewModel() — SwiftUI gestiona el lifecycle",
|
|
64
|
+
"severity": "warning"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"framework": "angular",
|
|
3
|
+
"displayName": "Angular",
|
|
4
|
+
"frameworkVersion": "17.x",
|
|
5
|
+
"lastUpdated": "2026-03-04",
|
|
6
|
+
"ecosystem": "typescript",
|
|
7
|
+
"customEntry": false,
|
|
8
|
+
"correctPatterns": [
|
|
9
|
+
{
|
|
10
|
+
"pattern": "Standalone Components sin NgModule",
|
|
11
|
+
"example": "@Component({ standalone: true, imports: [CommonModule], template: '...' }) export class MyComponent {}",
|
|
12
|
+
"since": "15.0"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"pattern": "Signals para estado reactivo en Angular 17+",
|
|
16
|
+
"example": "const count = signal(0); const doubled = computed(() => count() * 2);",
|
|
17
|
+
"since": "16.0"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"pattern": "inject() en lugar de constructor DI en funciones",
|
|
21
|
+
"example": "const service = inject(MyService);",
|
|
22
|
+
"since": "14.0"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"pattern": "provideRouter() en lugar de RouterModule.forRoot()",
|
|
26
|
+
"example": "bootstrapApplication(AppComponent, { providers: [provideRouter(routes)] });",
|
|
27
|
+
"since": "15.0"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"pattern": "HttpClient con provideHttpClient()",
|
|
31
|
+
"example": "bootstrapApplication(App, { providers: [provideHttpClient(withFetch())] });",
|
|
32
|
+
"since": "17.0"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"deprecatedPatterns": [
|
|
36
|
+
{
|
|
37
|
+
"pattern": "NgModule-based architecture para nuevos proyectos",
|
|
38
|
+
"replacedBy": "Standalone Components (Angular 15+)",
|
|
39
|
+
"severity": "warning"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"pattern": "HttpClientModule en imports del modulo",
|
|
43
|
+
"replacedBy": "provideHttpClient() en bootstrapApplication providers",
|
|
44
|
+
"severity": "warning"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"commonMistakes": [
|
|
48
|
+
{
|
|
49
|
+
"pattern": "Olvidar el decorador @Injectable() en servicios",
|
|
50
|
+
"example": "export class UserService { } — sin @Injectable({ providedIn: 'root' })",
|
|
51
|
+
"replacedBy": "@Injectable({ providedIn: 'root' }) export class UserService {}",
|
|
52
|
+
"severity": "error"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"pattern": "Suscribirse a Observables sin unsubscribe en componentes",
|
|
56
|
+
"example": "ngOnInit() { this.service.getUsers().subscribe(...) } — memory leak",
|
|
57
|
+
"replacedBy": "Usar takeUntilDestroyed() o async pipe en el template",
|
|
58
|
+
"severity": "warning"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"pattern": "Usar ChangeDetectorRef.markForCheck() en lugar de signals",
|
|
62
|
+
"example": "this.cdr.markForCheck() — anti-patron con signals",
|
|
63
|
+
"replacedBy": "Usar signals y computed() para reactividad automatica",
|
|
64
|
+
"severity": "warning"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"framework": "astro",
|
|
3
|
+
"displayName": "Astro",
|
|
4
|
+
"frameworkVersion": "4.x",
|
|
5
|
+
"lastUpdated": "2026-03-04",
|
|
6
|
+
"ecosystem": "typescript",
|
|
7
|
+
"customEntry": false,
|
|
8
|
+
"correctPatterns": [
|
|
9
|
+
{
|
|
10
|
+
"pattern": "client:load para Islands con hidratacion inmediata",
|
|
11
|
+
"example": "<ReactComponent client:load /> — hidrata al cargar la pagina",
|
|
12
|
+
"since": "1.0"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"pattern": "getCollection() para Content Collections",
|
|
16
|
+
"example": "const posts = await getCollection('blog');",
|
|
17
|
+
"since": "2.0"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"pattern": "Astro.props para acceder a props del componente",
|
|
21
|
+
"example": "const { title, author } = Astro.props;",
|
|
22
|
+
"since": "1.0"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"pattern": "SSR con output: 'server' en astro.config.mjs",
|
|
26
|
+
"example": "export default defineConfig({ output: 'server', adapter: node() });",
|
|
27
|
+
"since": "1.0"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"pattern": "Frontmatter en .astro para logica server-side",
|
|
31
|
+
"example": "---\\nconst data = await fetch('...').then(r => r.json());\\n---",
|
|
32
|
+
"since": "1.0"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"deprecatedPatterns": [
|
|
36
|
+
{
|
|
37
|
+
"pattern": "Astro.fetchContent() de Astro 1",
|
|
38
|
+
"replacedBy": "getCollection() de Content Collections (Astro 2+)",
|
|
39
|
+
"severity": "error"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"pattern": "import.meta.glob para colecciones de contenido",
|
|
43
|
+
"replacedBy": "getCollection() con defineSSchema de Zod",
|
|
44
|
+
"severity": "warning"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"commonMistakes": [
|
|
48
|
+
{
|
|
49
|
+
"pattern": "Usar hooks de React en un componente .astro",
|
|
50
|
+
"example": "const [state, setState] = useState() — en archivo .astro sin client directive",
|
|
51
|
+
"replacedBy": "Mover logica interactiva a un componente React/Vue con client:* directive",
|
|
52
|
+
"severity": "error"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"pattern": "client:visible sin justificacion de performance",
|
|
56
|
+
"example": "Usar client:load para todo en lugar de client:visible para contenido fuera del viewport",
|
|
57
|
+
"replacedBy": "client:visible para componentes debajo del fold, client:idle para no urgentes",
|
|
58
|
+
"severity": "warning"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"framework": "express",
|
|
3
|
+
"displayName": "Express",
|
|
4
|
+
"frameworkVersion": "4.x",
|
|
5
|
+
"lastUpdated": "2026-03-04",
|
|
6
|
+
"ecosystem": "typescript",
|
|
7
|
+
"customEntry": false,
|
|
8
|
+
"correctPatterns": [
|
|
9
|
+
{
|
|
10
|
+
"pattern": "Router modular para organizar rutas",
|
|
11
|
+
"example": "const router = express.Router(); router.get('/users', handler); app.use('/api', router);",
|
|
12
|
+
"since": "4.0"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"pattern": "Middleware de error con 4 parametros (err, req, res, next)",
|
|
16
|
+
"example": "app.use((err: Error, req: Request, res: Response, next: NextFunction) => { res.status(500).json({ error: err.message }); });",
|
|
17
|
+
"since": "4.0"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"pattern": "express.json() para parsear body JSON",
|
|
21
|
+
"example": "app.use(express.json()); app.use(express.urlencoded({ extended: true }));",
|
|
22
|
+
"since": "4.16"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"pattern": "next(error) para pasar errores al error handler",
|
|
26
|
+
"example": "try { ... } catch (err) { next(err); }",
|
|
27
|
+
"since": "4.0"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"pattern": "Tipos TypeScript con @types/express",
|
|
31
|
+
"example": "import type { Request, Response, NextFunction } from 'express';",
|
|
32
|
+
"since": "4.0"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"deprecatedPatterns": [
|
|
36
|
+
{
|
|
37
|
+
"pattern": "bodyParser npm package separado",
|
|
38
|
+
"replacedBy": "express.json() y express.urlencoded() incluidos en Express 4.16+",
|
|
39
|
+
"severity": "warning"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"pattern": "res.send() con objetos sin res.json()",
|
|
43
|
+
"replacedBy": "res.json({ data }) para respuestas JSON con Content-Type correcto",
|
|
44
|
+
"severity": "warning"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"commonMistakes": [
|
|
48
|
+
{
|
|
49
|
+
"pattern": "Olvidar next() en middleware — la request se cuelga",
|
|
50
|
+
"example": "app.use((req, res, next) => { console.log(req.path); }); — sin next() el request queda pendiente",
|
|
51
|
+
"replacedBy": "Llamar next() al final del middleware: app.use((req, res, next) => { ...; next(); });",
|
|
52
|
+
"severity": "error"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"pattern": "Definir error handler ANTES de las rutas",
|
|
56
|
+
"example": "app.use(errorHandler); app.get('/users', handler); — el error handler debe ir al final",
|
|
57
|
+
"replacedBy": "Definir el error handler DESPUES de todas las rutas",
|
|
58
|
+
"severity": "error"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"pattern": "Async route handler sin try/catch ni wrapper",
|
|
62
|
+
"example": "app.get('/data', async (req, res) => { const data = await getDb(); res.json(data); }) — errores no llegaran al error handler",
|
|
63
|
+
"replacedBy": "Wrap async con try/catch y next(err) o usar express-async-errors",
|
|
64
|
+
"severity": "error"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"framework": "nestjs",
|
|
3
|
+
"displayName": "NestJS",
|
|
4
|
+
"frameworkVersion": "10.x",
|
|
5
|
+
"lastUpdated": "2026-03-04",
|
|
6
|
+
"ecosystem": "typescript",
|
|
7
|
+
"customEntry": false,
|
|
8
|
+
"correctPatterns": [
|
|
9
|
+
{
|
|
10
|
+
"pattern": "@Injectable() para servicios con inyeccion de dependencias",
|
|
11
|
+
"example": "@Injectable() export class UserService { constructor(private readonly db: DatabaseService) {} }",
|
|
12
|
+
"since": "6.0"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"pattern": "@Controller() y @Get()/@Post() para definir rutas",
|
|
16
|
+
"example": "@Controller('users') export class UserController { @Get() findAll() { return this.service.findAll(); } }",
|
|
17
|
+
"since": "6.0"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"pattern": "@Module() para organizar la aplicacion en modulos",
|
|
21
|
+
"example": "@Module({ imports: [TypeOrmModule.forFeature([User])], controllers: [UserController], providers: [UserService] }) export class UserModule {}",
|
|
22
|
+
"since": "6.0"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"pattern": "Guards con @UseGuards() para autorizacion",
|
|
26
|
+
"example": "@UseGuards(JwtAuthGuard) @Get('profile') getProfile(@Request() req) { return req.user; }",
|
|
27
|
+
"since": "6.0"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"pattern": "Pipes para validacion de DTOs con class-validator",
|
|
31
|
+
"example": "@Body() createUserDto: CreateUserDto // con ValidationPipe global",
|
|
32
|
+
"since": "6.0"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"deprecatedPatterns": [
|
|
36
|
+
{
|
|
37
|
+
"pattern": "@nestjs/swagger sin versionado de API",
|
|
38
|
+
"replacedBy": "Usar versionado: app.enableVersioning({ type: VersioningType.URI })",
|
|
39
|
+
"severity": "warning"
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"commonMistakes": [
|
|
43
|
+
{
|
|
44
|
+
"pattern": "Olvidar registrar un Provider en el Module",
|
|
45
|
+
"example": "Inyectar UserService sin agregarlo a providers: [UserService] en UserModule",
|
|
46
|
+
"replacedBy": "Agregar todos los providers en el @Module() correspondiente",
|
|
47
|
+
"severity": "error"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"pattern": "Circular dependency entre modulos sin forwardRef",
|
|
51
|
+
"example": "ModuleA imports ModuleB y ModuleB imports ModuleA — error de circular dependency",
|
|
52
|
+
"replacedBy": "Usar forwardRef(() => ModuleB) en los imports",
|
|
53
|
+
"severity": "error"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"pattern": "Crear instancias de servicios con new en lugar de DI",
|
|
57
|
+
"example": "const service = new UserService() — rompe la inyeccion de dependencias",
|
|
58
|
+
"replacedBy": "Inyectar via constructor: constructor(private userService: UserService) {}",
|
|
59
|
+
"severity": "error"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"framework": "nextjs",
|
|
3
|
+
"displayName": "Next.js",
|
|
4
|
+
"frameworkVersion": "14.x",
|
|
5
|
+
"lastUpdated": "2026-03-04",
|
|
6
|
+
"ecosystem": "typescript",
|
|
7
|
+
"customEntry": false,
|
|
8
|
+
"correctPatterns": [
|
|
9
|
+
{
|
|
10
|
+
"pattern": "App Router usa directorios page.tsx para definir rutas",
|
|
11
|
+
"example": "app/dashboard/page.tsx exporta un React component como ruta /dashboard",
|
|
12
|
+
"since": "13.4"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"pattern": "Server Components son async por defecto en App Router",
|
|
16
|
+
"example": "export default async function Page() { const data = await fetch('...'); return <div>{data}</div>; }",
|
|
17
|
+
"since": "13.4"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"pattern": "useRouter de next/navigation para App Router",
|
|
21
|
+
"example": "import { useRouter } from 'next/navigation'; const router = useRouter();",
|
|
22
|
+
"since": "13.0"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"pattern": "Server Actions para mutaciones de datos",
|
|
26
|
+
"example": "async function create(formData: FormData) { 'use server'; ... }",
|
|
27
|
+
"since": "14.0"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"pattern": "generateStaticParams para rutas estaticas dinamicas",
|
|
31
|
+
"example": "export async function generateStaticParams() { return [{ slug: 'post-1' }]; }",
|
|
32
|
+
"since": "13.4"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"pattern": "next/image para imagenes optimizadas",
|
|
36
|
+
"example": "import Image from 'next/image'; <Image src='/logo.png' width={100} height={100} alt='logo' />",
|
|
37
|
+
"since": "10.0"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"pattern": "metadata export para SEO en App Router",
|
|
41
|
+
"example": "export const metadata: Metadata = { title: 'Page Title', description: '...' };",
|
|
42
|
+
"since": "13.4"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"deprecatedPatterns": [
|
|
46
|
+
{
|
|
47
|
+
"pattern": "getServerSideProps en App Router",
|
|
48
|
+
"replacedBy": "Server Components con fetch() directo o generateStaticParams()",
|
|
49
|
+
"severity": "error"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"pattern": "getStaticProps / getStaticPaths en App Router",
|
|
53
|
+
"replacedBy": "generateStaticParams() + Server Components async",
|
|
54
|
+
"severity": "error"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"pattern": "pages/ directory para nuevas rutas cuando ya se usa app/",
|
|
58
|
+
"replacedBy": "app/ directory con page.tsx, layout.tsx, loading.tsx",
|
|
59
|
+
"severity": "warning"
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"commonMistakes": [
|
|
63
|
+
{
|
|
64
|
+
"pattern": "Usar useRouter() de next/router en App Router",
|
|
65
|
+
"example": "import { useRouter } from 'next/router' — INCORRECTO en App Router",
|
|
66
|
+
"replacedBy": "import { useRouter } from 'next/navigation'",
|
|
67
|
+
"severity": "error"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"pattern": "app.useRouter() — API que no existe en Next.js",
|
|
71
|
+
"example": "const router = app.useRouter() — nunca existio en ninguna version",
|
|
72
|
+
"replacedBy": "import { useRouter } from 'next/navigation' (App Router) o 'next/router' (Pages Router)",
|
|
73
|
+
"severity": "error"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"pattern": "Llamar fetch() dentro de un Client Component sin useEffect o SWR",
|
|
77
|
+
"example": "const data = await fetch('/api/data') — dentro de un 'use client' component sin hook",
|
|
78
|
+
"replacedBy": "Usar Server Component o usar SWR/TanStack Query en Client Components",
|
|
79
|
+
"severity": "warning"
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
}
|