@ruaruababa/vibe-kit 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/CATALOG.md +317 -0
- package/README.md +121 -0
- package/aliases.json +65 -0
- package/bin/vibe.js +2 -0
- package/bundles.json +265 -0
- package/catalog.json +1560 -0
- package/dist/antigravity-skills/bin/cli.js +438 -0
- package/dist/antigravity-skills/lib/skill-utils.js +158 -0
- package/dist/antigravity-skills/scripts/build-catalog.js +305 -0
- package/dist/antigravity-skills/scripts/normalize-frontmatter.js +144 -0
- package/dist/antigravity-skills/scripts/validate-skills.js +230 -0
- package/dist/bin/vibe.js +2 -0
- package/dist/dist/src/cli/index.js +26 -0
- package/dist/lib/skill-utils.js +158 -0
- package/dist/scripts/build-catalog.js +50 -0
- package/dist/scripts/normalize-frontmatter.js +144 -0
- package/dist/scripts/validate-skills.js +56 -0
- package/dist/src/cli/index.js +146 -0
- package/dist/src/types/index.js +13 -0
- package/dist/src/utils/fs.js +1 -0
- package/package.json +43 -0
- package/skills/accessibility-compliance-accessibility-audit/SKILL.md +42 -0
- package/skills/accessibility-compliance-accessibility-audit/resources/implementation-playbook.md +502 -0
- package/skills/agent-orchestration-improve-agent/SKILL.md +349 -0
- package/skills/agent-orchestration-multi-agent-optimize/SKILL.md +239 -0
- package/skills/agent-orchestrator/SKILL.md +24 -0
- package/skills/ai-engineer/SKILL.md +171 -0
- package/skills/airflow-dag-patterns/SKILL.md +41 -0
- package/skills/airflow-dag-patterns/resources/implementation-playbook.md +509 -0
- package/skills/angular-migration/SKILL.md +428 -0
- package/skills/anti-reversing-techniques/SKILL.md +42 -0
- package/skills/anti-reversing-techniques/resources/implementation-playbook.md +539 -0
- package/skills/api-design-principles/SKILL.md +37 -0
- package/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/skills/api-documenter/SKILL.md +184 -0
- package/skills/api-testing-observability-api-mock/SKILL.md +46 -0
- package/skills/api-testing-observability-api-mock/resources/implementation-playbook.md +1327 -0
- package/skills/application-performance-performance-optimization/SKILL.md +154 -0
- package/skills/architect-review/SKILL.md +174 -0
- package/skills/architecture-decision-records/SKILL.md +441 -0
- package/skills/architecture-patterns/SKILL.md +37 -0
- package/skills/architecture-patterns/resources/implementation-playbook.md +479 -0
- package/skills/arm-cortex-expert/SKILL.md +306 -0
- package/skills/async-python-patterns/SKILL.md +39 -0
- package/skills/async-python-patterns/resources/implementation-playbook.md +678 -0
- package/skills/attack-tree-construction/SKILL.md +38 -0
- package/skills/attack-tree-construction/resources/implementation-playbook.md +671 -0
- package/skills/auth-implementation-patterns/SKILL.md +39 -0
- package/skills/auth-implementation-patterns/resources/implementation-playbook.md +618 -0
- package/skills/backend-architect/SKILL.md +333 -0
- package/skills/backend-development-feature-development/SKILL.md +180 -0
- package/skills/backend-security-coder/SKILL.md +156 -0
- package/skills/backtesting-frameworks/SKILL.md +39 -0
- package/skills/backtesting-frameworks/resources/implementation-playbook.md +647 -0
- package/skills/bash-defensive-patterns/SKILL.md +43 -0
- package/skills/bash-defensive-patterns/resources/implementation-playbook.md +517 -0
- package/skills/bash-pro/SKILL.md +310 -0
- package/skills/bats-testing-patterns/SKILL.md +34 -0
- package/skills/bats-testing-patterns/resources/implementation-playbook.md +614 -0
- package/skills/bazel-build-optimization/SKILL.md +397 -0
- package/skills/billing-automation/SKILL.md +42 -0
- package/skills/billing-automation/resources/implementation-playbook.md +544 -0
- package/skills/binary-analysis-patterns/SKILL.md +450 -0
- package/skills/blockchain-developer/SKILL.md +208 -0
- package/skills/business-analyst/SKILL.md +182 -0
- package/skills/c-pro/SKILL.md +56 -0
- package/skills/c4-architecture-c4-architecture/SKILL.md +389 -0
- package/skills/c4-code/SKILL.md +244 -0
- package/skills/c4-component/SKILL.md +153 -0
- package/skills/c4-container/SKILL.md +171 -0
- package/skills/c4-context/SKILL.md +150 -0
- package/skills/changelog-automation/SKILL.md +38 -0
- package/skills/changelog-automation/resources/implementation-playbook.md +538 -0
- package/skills/cicd-automation-workflow-automate/SKILL.md +51 -0
- package/skills/cicd-automation-workflow-automate/resources/implementation-playbook.md +1333 -0
- package/skills/clean-markdown/SKILL.md +23 -0
- package/skills/cloud-architect/SKILL.md +135 -0
- package/skills/code-documentation-code-explain/SKILL.md +46 -0
- package/skills/code-documentation-code-explain/resources/implementation-playbook.md +802 -0
- package/skills/code-documentation-doc-generate/SKILL.md +48 -0
- package/skills/code-documentation-doc-generate/resources/implementation-playbook.md +640 -0
- package/skills/code-refactoring-context-restore/SKILL.md +179 -0
- package/skills/code-refactoring-refactor-clean/SKILL.md +51 -0
- package/skills/code-refactoring-refactor-clean/resources/implementation-playbook.md +879 -0
- package/skills/code-refactoring-tech-debt/SKILL.md +386 -0
- package/skills/code-review-ai-ai-review/SKILL.md +450 -0
- package/skills/code-review-excellence/SKILL.md +40 -0
- package/skills/code-review-excellence/resources/implementation-playbook.md +515 -0
- package/skills/code-reviewer/SKILL.md +178 -0
- package/skills/codebase-cleanup-deps-audit/SKILL.md +51 -0
- package/skills/codebase-cleanup-deps-audit/resources/implementation-playbook.md +766 -0
- package/skills/codebase-cleanup-refactor-clean/SKILL.md +51 -0
- package/skills/codebase-cleanup-refactor-clean/resources/implementation-playbook.md +879 -0
- package/skills/codebase-cleanup-tech-debt/SKILL.md +386 -0
- package/skills/competitive-landscape/SKILL.md +34 -0
- package/skills/competitive-landscape/resources/implementation-playbook.md +494 -0
- package/skills/comprehensive-review-full-review/SKILL.md +146 -0
- package/skills/comprehensive-review-pr-enhance/SKILL.md +46 -0
- package/skills/comprehensive-review-pr-enhance/resources/implementation-playbook.md +691 -0
- package/skills/conductor-implement/SKILL.md +388 -0
- package/skills/conductor-manage/SKILL.md +39 -0
- package/skills/conductor-manage/resources/implementation-playbook.md +1120 -0
- package/skills/conductor-new-track/SKILL.md +433 -0
- package/skills/conductor-revert/SKILL.md +372 -0
- package/skills/conductor-setup/SKILL.md +426 -0
- package/skills/conductor-status/SKILL.md +338 -0
- package/skills/conductor-validator/SKILL.md +62 -0
- package/skills/content-marketer/SKILL.md +170 -0
- package/skills/context-driven-development/SKILL.md +400 -0
- package/skills/context-management-context-restore/SKILL.md +179 -0
- package/skills/context-management-context-save/SKILL.md +177 -0
- package/skills/context-manager/SKILL.md +185 -0
- package/skills/cost-optimization/SKILL.md +286 -0
- package/skills/cpp-pro/SKILL.md +59 -0
- package/skills/cqrs-implementation/SKILL.md +35 -0
- package/skills/cqrs-implementation/resources/implementation-playbook.md +540 -0
- package/skills/csharp-pro/SKILL.md +59 -0
- package/skills/customer-support/SKILL.md +170 -0
- package/skills/data-engineer/SKILL.md +224 -0
- package/skills/data-engineering-data-driven-feature/SKILL.md +182 -0
- package/skills/data-engineering-data-pipeline/SKILL.md +201 -0
- package/skills/data-quality-frameworks/SKILL.md +40 -0
- package/skills/data-quality-frameworks/resources/implementation-playbook.md +573 -0
- package/skills/data-scientist/SKILL.md +199 -0
- package/skills/data-storytelling/SKILL.md +465 -0
- package/skills/database-admin/SKILL.md +165 -0
- package/skills/database-architect/SKILL.md +268 -0
- package/skills/database-cloud-optimization-cost-optimize/SKILL.md +44 -0
- package/skills/database-cloud-optimization-cost-optimize/resources/implementation-playbook.md +1441 -0
- package/skills/database-migration/SKILL.md +436 -0
- package/skills/database-migrations-migration-observability/SKILL.md +420 -0
- package/skills/database-migrations-sql-migrations/SKILL.md +53 -0
- package/skills/database-migrations-sql-migrations/resources/implementation-playbook.md +499 -0
- package/skills/database-optimizer/SKILL.md +167 -0
- package/skills/dbt-transformation-patterns/SKILL.md +34 -0
- package/skills/dbt-transformation-patterns/resources/implementation-playbook.md +547 -0
- package/skills/debugger/SKILL.md +49 -0
- package/skills/debugging-strategies/SKILL.md +34 -0
- package/skills/debugging-strategies/resources/implementation-playbook.md +511 -0
- package/skills/debugging-toolkit-smart-debug/SKILL.md +197 -0
- package/skills/defi-protocol-templates/SKILL.md +466 -0
- package/skills/dependency-management-deps-audit/SKILL.md +44 -0
- package/skills/dependency-management-deps-audit/resources/implementation-playbook.md +766 -0
- package/skills/dependency-upgrade/SKILL.md +421 -0
- package/skills/deployment-engineer/SKILL.md +170 -0
- package/skills/deployment-pipeline-design/SKILL.md +371 -0
- package/skills/deployment-validation-config-validate/SKILL.md +496 -0
- package/skills/devops-troubleshooter/SKILL.md +161 -0
- package/skills/distributed-debugging-debug-trace/SKILL.md +44 -0
- package/skills/distributed-debugging-debug-trace/resources/implementation-playbook.md +1307 -0
- package/skills/distributed-tracing/SKILL.md +450 -0
- package/skills/django-pro/SKILL.md +180 -0
- package/skills/docs-architect/SKILL.md +98 -0
- package/skills/documentation-generation-doc-generate/SKILL.md +48 -0
- package/skills/documentation-generation-doc-generate/resources/implementation-playbook.md +640 -0
- package/skills/dotnet-architect/SKILL.md +197 -0
- package/skills/dotnet-backend-patterns/SKILL.md +37 -0
- package/skills/dotnet-backend-patterns/assets/repository-template.cs +523 -0
- package/skills/dotnet-backend-patterns/assets/service-template.cs +336 -0
- package/skills/dotnet-backend-patterns/references/dapper-patterns.md +544 -0
- package/skills/dotnet-backend-patterns/references/ef-core-best-practices.md +355 -0
- package/skills/dotnet-backend-patterns/resources/implementation-playbook.md +799 -0
- package/skills/dummy-skill/SKILL.md +5 -0
- package/skills/dx-optimizer/SKILL.md +83 -0
- package/skills/e2e-testing-patterns/SKILL.md +41 -0
- package/skills/e2e-testing-patterns/resources/implementation-playbook.md +531 -0
- package/skills/elixir-pro/SKILL.md +59 -0
- package/skills/embedding-strategies/SKILL.md +491 -0
- package/skills/employment-contract-templates/SKILL.md +39 -0
- package/skills/employment-contract-templates/resources/implementation-playbook.md +493 -0
- package/skills/error-debugging-error-analysis/SKILL.md +47 -0
- package/skills/error-debugging-error-analysis/resources/implementation-playbook.md +1143 -0
- package/skills/error-debugging-error-trace/SKILL.md +43 -0
- package/skills/error-debugging-error-trace/resources/implementation-playbook.md +1361 -0
- package/skills/error-debugging-multi-agent-review/SKILL.md +216 -0
- package/skills/error-detective/SKILL.md +53 -0
- package/skills/error-diagnostics-error-analysis/SKILL.md +47 -0
- package/skills/error-diagnostics-error-analysis/resources/implementation-playbook.md +1143 -0
- package/skills/error-diagnostics-error-trace/SKILL.md +48 -0
- package/skills/error-diagnostics-error-trace/resources/implementation-playbook.md +1371 -0
- package/skills/error-diagnostics-smart-debug/SKILL.md +197 -0
- package/skills/error-handling-patterns/SKILL.md +35 -0
- package/skills/error-handling-patterns/resources/implementation-playbook.md +635 -0
- package/skills/event-sourcing-architect/SKILL.md +58 -0
- package/skills/event-store-design/SKILL.md +449 -0
- package/skills/fastapi-pro/SKILL.md +192 -0
- package/skills/fastapi-templates/SKILL.md +32 -0
- package/skills/fastapi-templates/resources/implementation-playbook.md +566 -0
- package/skills/final-test/SKILL.md +5 -0
- package/skills/firmware-analyst/SKILL.md +320 -0
- package/skills/flutter-expert/SKILL.md +200 -0
- package/skills/framework-migration-code-migrate/SKILL.md +48 -0
- package/skills/framework-migration-code-migrate/resources/implementation-playbook.md +1052 -0
- package/skills/framework-migration-deps-upgrade/SKILL.md +48 -0
- package/skills/framework-migration-deps-upgrade/resources/implementation-playbook.md +755 -0
- package/skills/framework-migration-legacy-modernize/SKILL.md +132 -0
- package/skills/frontend-developer/SKILL.md +171 -0
- package/skills/frontend-mobile-development-component-scaffold/SKILL.md +403 -0
- package/skills/frontend-mobile-security-xss-scan/SKILL.md +322 -0
- package/skills/frontend-security-coder/SKILL.md +170 -0
- package/skills/full-stack-orchestration-full-stack-feature/SKILL.md +135 -0
- package/skills/gdpr-data-handling/SKILL.md +33 -0
- package/skills/gdpr-data-handling/resources/implementation-playbook.md +615 -0
- package/skills/git-advanced-workflows/SKILL.md +412 -0
- package/skills/git-pr-workflows-git-workflow/SKILL.md +140 -0
- package/skills/git-pr-workflows-onboard/SKILL.md +416 -0
- package/skills/git-pr-workflows-pr-enhance/SKILL.md +48 -0
- package/skills/git-pr-workflows-pr-enhance/resources/implementation-playbook.md +701 -0
- package/skills/github-actions-templates/SKILL.md +345 -0
- package/skills/gitlab-ci-patterns/SKILL.md +283 -0
- package/skills/gitops-workflow/SKILL.md +303 -0
- package/skills/gitops-workflow/references/argocd-setup.md +134 -0
- package/skills/gitops-workflow/references/sync-policies.md +131 -0
- package/skills/go-concurrency-patterns/SKILL.md +33 -0
- package/skills/go-concurrency-patterns/resources/implementation-playbook.md +654 -0
- package/skills/godot-gdscript-patterns/SKILL.md +33 -0
- package/skills/godot-gdscript-patterns/resources/implementation-playbook.md +804 -0
- package/skills/golang-pro/SKILL.md +179 -0
- package/skills/grafana-dashboards/SKILL.md +381 -0
- package/skills/graphql-architect/SKILL.md +182 -0
- package/skills/haskell-pro/SKILL.md +56 -0
- package/skills/helm-chart-scaffolding/SKILL.md +34 -0
- package/skills/helm-chart-scaffolding/assets/Chart.yaml.template +42 -0
- package/skills/helm-chart-scaffolding/assets/values.yaml.template +185 -0
- package/skills/helm-chart-scaffolding/references/chart-structure.md +500 -0
- package/skills/helm-chart-scaffolding/resources/implementation-playbook.md +543 -0
- package/skills/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
- package/skills/hr-pro/SKILL.md +126 -0
- package/skills/hybrid-cloud-architect/SKILL.md +168 -0
- package/skills/hybrid-cloud-networking/SKILL.md +238 -0
- package/skills/hybrid-search-implementation/SKILL.md +32 -0
- package/skills/hybrid-search-implementation/resources/implementation-playbook.md +567 -0
- package/skills/incident-responder/SKILL.md +213 -0
- package/skills/incident-response-incident-response/SKILL.md +168 -0
- package/skills/incident-response-smart-fix/SKILL.md +29 -0
- package/skills/incident-response-smart-fix/resources/implementation-playbook.md +838 -0
- package/skills/incident-runbook-templates/SKILL.md +395 -0
- package/skills/ios-developer/SKILL.md +219 -0
- package/skills/istio-traffic-management/SKILL.md +337 -0
- package/skills/java-pro/SKILL.md +177 -0
- package/skills/javascript-pro/SKILL.md +57 -0
- package/skills/javascript-testing-patterns/SKILL.md +35 -0
- package/skills/javascript-testing-patterns/resources/implementation-playbook.md +1024 -0
- package/skills/javascript-typescript-typescript-scaffold/SKILL.md +361 -0
- package/skills/julia-pro/SKILL.md +209 -0
- package/skills/k8s-manifest-generator/SKILL.md +35 -0
- package/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
- package/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
- package/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
- package/skills/k8s-manifest-generator/references/deployment-spec.md +753 -0
- package/skills/k8s-manifest-generator/references/service-spec.md +724 -0
- package/skills/k8s-manifest-generator/resources/implementation-playbook.md +510 -0
- package/skills/k8s-security-policies/SKILL.md +346 -0
- package/skills/k8s-security-policies/assets/network-policy-template.yaml +177 -0
- package/skills/k8s-security-policies/references/rbac-patterns.md +187 -0
- package/skills/kpi-dashboard-design/SKILL.md +440 -0
- package/skills/kubernetes-architect/SKILL.md +170 -0
- package/skills/langchain-architecture/SKILL.md +350 -0
- package/skills/legacy-modernizer/SKILL.md +53 -0
- package/skills/legal-advisor/SKILL.md +70 -0
- package/skills/linkerd-patterns/SKILL.md +321 -0
- package/skills/llm-application-dev-ai-assistant/SKILL.md +35 -0
- package/skills/llm-application-dev-ai-assistant/resources/implementation-playbook.md +1236 -0
- package/skills/llm-application-dev-langchain-agent/SKILL.md +246 -0
- package/skills/llm-application-dev-prompt-optimize/SKILL.md +37 -0
- package/skills/llm-application-dev-prompt-optimize/resources/implementation-playbook.md +591 -0
- package/skills/llm-evaluation/SKILL.md +483 -0
- package/skills/machine-learning-ops-ml-pipeline/SKILL.md +314 -0
- package/skills/malware-analyst/SKILL.md +247 -0
- package/skills/market-sizing-analysis/SKILL.md +425 -0
- package/skills/market-sizing-analysis/examples/saas-market-sizing.md +349 -0
- package/skills/market-sizing-analysis/references/data-sources.md +360 -0
- package/skills/memory-forensics/SKILL.md +491 -0
- package/skills/memory-safety-patterns/SKILL.md +33 -0
- package/skills/memory-safety-patterns/resources/implementation-playbook.md +603 -0
- package/skills/mermaid-expert/SKILL.md +59 -0
- package/skills/microservices-patterns/SKILL.md +35 -0
- package/skills/microservices-patterns/resources/implementation-playbook.md +607 -0
- package/skills/minecraft-bukkit-pro/SKILL.md +126 -0
- package/skills/ml-engineer/SKILL.md +168 -0
- package/skills/ml-pipeline-workflow/SKILL.md +257 -0
- package/skills/mlops-engineer/SKILL.md +219 -0
- package/skills/mobile-developer/SKILL.md +205 -0
- package/skills/mobile-security-coder/SKILL.md +184 -0
- package/skills/modern-javascript-patterns/SKILL.md +35 -0
- package/skills/modern-javascript-patterns/resources/implementation-playbook.md +910 -0
- package/skills/monorepo-architect/SKILL.md +61 -0
- package/skills/monorepo-management/SKILL.md +35 -0
- package/skills/monorepo-management/resources/implementation-playbook.md +621 -0
- package/skills/mtls-configuration/SKILL.md +359 -0
- package/skills/multi-cloud-architecture/SKILL.md +189 -0
- package/skills/multi-platform-apps-multi-platform/SKILL.md +203 -0
- package/skills/network-engineer/SKILL.md +169 -0
- package/skills/nextjs-app-router-patterns/SKILL.md +33 -0
- package/skills/nextjs-app-router-patterns/resources/implementation-playbook.md +543 -0
- package/skills/nft-standards/SKILL.md +395 -0
- package/skills/node-expert/SKILL.md +23 -0
- package/skills/nodejs-backend-patterns/SKILL.md +35 -0
- package/skills/nodejs-backend-patterns/resources/implementation-playbook.md +1019 -0
- package/skills/nx-workspace-patterns/SKILL.md +464 -0
- package/skills/observability-engineer/SKILL.md +237 -0
- package/skills/observability-monitoring-monitor-setup/SKILL.md +48 -0
- package/skills/observability-monitoring-monitor-setup/resources/implementation-playbook.md +505 -0
- package/skills/observability-monitoring-slo-implement/SKILL.md +43 -0
- package/skills/observability-monitoring-slo-implement/resources/implementation-playbook.md +1077 -0
- package/skills/on-call-handoff-patterns/SKILL.md +453 -0
- package/skills/openapi-spec-generation/SKILL.md +33 -0
- package/skills/openapi-spec-generation/resources/implementation-playbook.md +1027 -0
- package/skills/payment-integration/SKILL.md +77 -0
- package/skills/paypal-integration/SKILL.md +479 -0
- package/skills/pci-compliance/SKILL.md +478 -0
- package/skills/performance-engineer/SKILL.md +180 -0
- package/skills/performance-testing-review-ai-review/SKILL.md +450 -0
- package/skills/performance-testing-review-multi-agent-review/SKILL.md +216 -0
- package/skills/php-pro/SKILL.md +63 -0
- package/skills/posix-shell-pro/SKILL.md +304 -0
- package/skills/postgresql/SKILL.md +230 -0
- package/skills/postmortem-writing/SKILL.md +386 -0
- package/skills/projection-patterns/SKILL.md +33 -0
- package/skills/projection-patterns/resources/implementation-playbook.md +501 -0
- package/skills/prometheus-configuration/SKILL.md +404 -0
- package/skills/prompt-engineer/SKILL.md +272 -0
- package/skills/prompt-engineering-patterns/SKILL.md +213 -0
- package/skills/prompt-engineering-patterns/assets/few-shot-examples.json +106 -0
- package/skills/prompt-engineering-patterns/assets/prompt-template-library.md +246 -0
- package/skills/prompt-engineering-patterns/references/chain-of-thought.md +399 -0
- package/skills/prompt-engineering-patterns/references/few-shot-learning.md +369 -0
- package/skills/prompt-engineering-patterns/references/prompt-optimization.md +414 -0
- package/skills/prompt-engineering-patterns/references/prompt-templates.md +470 -0
- package/skills/prompt-engineering-patterns/references/system-prompts.md +189 -0
- package/skills/prompt-engineering-patterns/scripts/optimize-prompt.py +279 -0
- package/skills/protocol-reverse-engineering/SKILL.md +29 -0
- package/skills/protocol-reverse-engineering/resources/implementation-playbook.md +509 -0
- package/skills/python-development-python-scaffold/SKILL.md +331 -0
- package/skills/python-packaging/SKILL.md +36 -0
- package/skills/python-packaging/resources/implementation-playbook.md +869 -0
- package/skills/python-performance-optimization/SKILL.md +36 -0
- package/skills/python-performance-optimization/resources/implementation-playbook.md +868 -0
- package/skills/python-pro/SKILL.md +158 -0
- package/skills/python-testing-patterns/SKILL.md +37 -0
- package/skills/python-testing-patterns/resources/implementation-playbook.md +906 -0
- package/skills/quant-analyst/SKILL.md +53 -0
- package/skills/rag-implementation/SKILL.md +421 -0
- package/skills/react-modernization/SKILL.md +34 -0
- package/skills/react-modernization/resources/implementation-playbook.md +512 -0
- package/skills/react-native-architecture/SKILL.md +33 -0
- package/skills/react-native-architecture/resources/implementation-playbook.md +670 -0
- package/skills/react-state-management/SKILL.md +441 -0
- package/skills/reference-builder/SKILL.md +188 -0
- package/skills/reverse-engineer/SKILL.md +173 -0
- package/skills/risk-manager/SKILL.md +61 -0
- package/skills/risk-metrics-calculation/SKILL.md +33 -0
- package/skills/risk-metrics-calculation/resources/implementation-playbook.md +554 -0
- package/skills/ruby-pro/SKILL.md +56 -0
- package/skills/rust-async-patterns/SKILL.md +33 -0
- package/skills/rust-async-patterns/resources/implementation-playbook.md +516 -0
- package/skills/rust-pro/SKILL.md +178 -0
- package/skills/saga-orchestration/SKILL.md +496 -0
- package/skills/sales-automator/SKILL.md +55 -0
- package/skills/sast-configuration/SKILL.md +212 -0
- package/skills/scala-pro/SKILL.md +82 -0
- package/skills/screen-reader-testing/SKILL.md +33 -0
- package/skills/screen-reader-testing/resources/implementation-playbook.md +544 -0
- package/skills/search-specialist/SKILL.md +80 -0
- package/skills/secrets-management/SKILL.md +364 -0
- package/skills/security-auditor/SKILL.md +169 -0
- package/skills/security-compliance-compliance-check/SKILL.md +55 -0
- package/skills/security-compliance-compliance-check/resources/implementation-playbook.md +963 -0
- package/skills/security-requirement-extraction/SKILL.md +33 -0
- package/skills/security-requirement-extraction/resources/implementation-playbook.md +676 -0
- package/skills/security-scanning-security-dependencies/SKILL.md +43 -0
- package/skills/security-scanning-security-dependencies/resources/implementation-playbook.md +544 -0
- package/skills/security-scanning-security-hardening/SKILL.md +147 -0
- package/skills/security-scanning-security-sast/SKILL.md +495 -0
- package/skills/seo-authority-builder/SKILL.md +136 -0
- package/skills/seo-cannibalization-detector/SKILL.md +123 -0
- package/skills/seo-content-auditor/SKILL.md +83 -0
- package/skills/seo-content-planner/SKILL.md +108 -0
- package/skills/seo-content-refresher/SKILL.md +118 -0
- package/skills/seo-content-writer/SKILL.md +96 -0
- package/skills/seo-keyword-strategist/SKILL.md +95 -0
- package/skills/seo-meta-optimizer/SKILL.md +92 -0
- package/skills/seo-snippet-hunter/SKILL.md +114 -0
- package/skills/seo-structure-architect/SKILL.md +108 -0
- package/skills/service-mesh-expert/SKILL.md +58 -0
- package/skills/service-mesh-observability/SKILL.md +395 -0
- package/skills/shellcheck-configuration/SKILL.md +466 -0
- package/skills/similarity-search-patterns/SKILL.md +33 -0
- package/skills/similarity-search-patterns/resources/implementation-playbook.md +557 -0
- package/skills/slo-implementation/SKILL.md +341 -0
- package/skills/solidity-security/SKILL.md +34 -0
- package/skills/solidity-security/resources/implementation-playbook.md +524 -0
- package/skills/spark-optimization/SKILL.md +427 -0
- package/skills/sql-optimization-patterns/SKILL.md +35 -0
- package/skills/sql-optimization-patterns/resources/implementation-playbook.md +504 -0
- package/skills/sql-pro/SKILL.md +173 -0
- package/skills/startup-analyst/SKILL.md +328 -0
- package/skills/startup-business-analyst-business-case/SKILL.md +487 -0
- package/skills/startup-business-analyst-financial-projections/SKILL.md +353 -0
- package/skills/startup-business-analyst-market-opportunity/SKILL.md +240 -0
- package/skills/startup-financial-modeling/SKILL.md +467 -0
- package/skills/startup-metrics-framework/SKILL.md +34 -0
- package/skills/startup-metrics-framework/resources/implementation-playbook.md +500 -0
- package/skills/stride-analysis-patterns/SKILL.md +33 -0
- package/skills/stride-analysis-patterns/resources/implementation-playbook.md +655 -0
- package/skills/stripe-integration/SKILL.md +454 -0
- package/skills/systems-programming-rust-project/SKILL.md +440 -0
- package/skills/tailwind-design-system/SKILL.md +33 -0
- package/skills/tailwind-design-system/resources/implementation-playbook.md +665 -0
- package/skills/tdd-orchestrator/SKILL.md +205 -0
- package/skills/tdd-workflows-tdd-cycle/SKILL.md +221 -0
- package/skills/tdd-workflows-tdd-green/SKILL.md +73 -0
- package/skills/tdd-workflows-tdd-green/resources/implementation-playbook.md +870 -0
- package/skills/tdd-workflows-tdd-red/SKILL.md +164 -0
- package/skills/tdd-workflows-tdd-refactor/SKILL.md +187 -0
- package/skills/team-collaboration-issue/SKILL.md +37 -0
- package/skills/team-collaboration-issue/resources/implementation-playbook.md +640 -0
- package/skills/team-collaboration-standup-notes/SKILL.md +44 -0
- package/skills/team-collaboration-standup-notes/resources/implementation-playbook.md +768 -0
- package/skills/team-composition-analysis/SKILL.md +413 -0
- package/skills/temporal-python-pro/SKILL.md +370 -0
- package/skills/temporal-python-testing/SKILL.md +170 -0
- package/skills/temporal-python-testing/resources/integration-testing.md +455 -0
- package/skills/temporal-python-testing/resources/local-setup.md +553 -0
- package/skills/temporal-python-testing/resources/replay-testing.md +462 -0
- package/skills/temporal-python-testing/resources/unit-testing.md +328 -0
- package/skills/terraform-module-library/SKILL.md +261 -0
- package/skills/terraform-module-library/references/aws-modules.md +63 -0
- package/skills/terraform-specialist/SKILL.md +166 -0
- package/skills/test-automator/SKILL.md +224 -0
- package/skills/threat-mitigation-mapping/SKILL.md +33 -0
- package/skills/threat-mitigation-mapping/resources/implementation-playbook.md +744 -0
- package/skills/threat-modeling-expert/SKILL.md +60 -0
- package/skills/track-management/SKILL.md +38 -0
- package/skills/track-management/resources/implementation-playbook.md +591 -0
- package/skills/turborepo-caching/SKILL.md +419 -0
- package/skills/tutorial-engineer/SKILL.md +139 -0
- package/skills/typescript-advanced-types/SKILL.md +35 -0
- package/skills/typescript-advanced-types/resources/implementation-playbook.md +716 -0
- package/skills/typescript-pro/SKILL.md +55 -0
- package/skills/ui-minimal/SKILL.md +23 -0
- package/skills/ui-ux-designer/SKILL.md +209 -0
- package/skills/ui-visual-validator/SKILL.md +214 -0
- package/skills/unit-testing-test-generate/SKILL.md +319 -0
- package/skills/unity-developer/SKILL.md +230 -0
- package/skills/unity-ecs-patterns/SKILL.md +33 -0
- package/skills/unity-ecs-patterns/resources/implementation-playbook.md +625 -0
- package/skills/uv-package-manager/SKILL.md +37 -0
- package/skills/uv-package-manager/resources/implementation-playbook.md +830 -0
- package/skills/vector-database-engineer/SKILL.md +60 -0
- package/skills/vector-index-tuning/SKILL.md +42 -0
- package/skills/vector-index-tuning/resources/implementation-playbook.md +507 -0
- package/skills/wcag-audit-patterns/SKILL.md +41 -0
- package/skills/wcag-audit-patterns/resources/implementation-playbook.md +541 -0
- package/skills/web3-testing/SKILL.md +427 -0
- package/skills/workflow-orchestration-patterns/SKILL.md +333 -0
- package/skills/workflow-patterns/SKILL.md +38 -0
- package/skills/workflow-patterns/resources/implementation-playbook.md +621 -0
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
# Dapper Patterns and Best Practices
|
|
2
|
+
|
|
3
|
+
Advanced patterns for high-performance data access with Dapper in .NET.
|
|
4
|
+
|
|
5
|
+
## Why Dapper?
|
|
6
|
+
|
|
7
|
+
| Aspect | Dapper | EF Core |
|
|
8
|
+
|--------|--------|---------|
|
|
9
|
+
| Performance | ~10x faster for simple queries | Good with optimization |
|
|
10
|
+
| Control | Full SQL control | Abstracted |
|
|
11
|
+
| Learning curve | Low (just SQL) | Higher |
|
|
12
|
+
| Complex mappings | Manual | Automatic |
|
|
13
|
+
| Change tracking | None | Built-in |
|
|
14
|
+
| Migrations | External tools | Built-in |
|
|
15
|
+
|
|
16
|
+
**Use Dapper when:**
|
|
17
|
+
- Performance is critical (hot paths)
|
|
18
|
+
- You need complex SQL (CTEs, window functions)
|
|
19
|
+
- Read-heavy workloads
|
|
20
|
+
- Legacy database schemas
|
|
21
|
+
|
|
22
|
+
**Use EF Core when:**
|
|
23
|
+
- Rich domain models with relationships
|
|
24
|
+
- Need change tracking
|
|
25
|
+
- Want LINQ-to-SQL translation
|
|
26
|
+
- Complex object graphs
|
|
27
|
+
|
|
28
|
+
## Connection Management
|
|
29
|
+
|
|
30
|
+
### 1. Proper Connection Handling
|
|
31
|
+
|
|
32
|
+
```csharp
|
|
33
|
+
// Register connection factory
|
|
34
|
+
services.AddScoped<IDbConnection>(sp =>
|
|
35
|
+
{
|
|
36
|
+
var connectionString = sp.GetRequiredService<IConfiguration>()
|
|
37
|
+
.GetConnectionString("Default");
|
|
38
|
+
return new SqlConnection(connectionString);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Or use a factory for more control
|
|
42
|
+
public interface IDbConnectionFactory
|
|
43
|
+
{
|
|
44
|
+
IDbConnection CreateConnection();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public class SqlConnectionFactory : IDbConnectionFactory
|
|
48
|
+
{
|
|
49
|
+
private readonly string _connectionString;
|
|
50
|
+
|
|
51
|
+
public SqlConnectionFactory(IConfiguration configuration)
|
|
52
|
+
{
|
|
53
|
+
_connectionString = configuration.GetConnectionString("Default")
|
|
54
|
+
?? throw new InvalidOperationException("Connection string not found");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public IDbConnection CreateConnection() => new SqlConnection(_connectionString);
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 2. Connection Lifecycle
|
|
62
|
+
|
|
63
|
+
```csharp
|
|
64
|
+
public class ProductRepository
|
|
65
|
+
{
|
|
66
|
+
private readonly IDbConnectionFactory _factory;
|
|
67
|
+
|
|
68
|
+
public ProductRepository(IDbConnectionFactory factory)
|
|
69
|
+
{
|
|
70
|
+
_factory = factory;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public async Task<Product?> GetByIdAsync(string id, CancellationToken ct)
|
|
74
|
+
{
|
|
75
|
+
// Connection opens automatically, closes on dispose
|
|
76
|
+
using var connection = _factory.CreateConnection();
|
|
77
|
+
|
|
78
|
+
return await connection.QueryFirstOrDefaultAsync<Product>(
|
|
79
|
+
new CommandDefinition(
|
|
80
|
+
"SELECT * FROM Products WHERE Id = @Id",
|
|
81
|
+
new { Id = id },
|
|
82
|
+
cancellationToken: ct));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Query Patterns
|
|
88
|
+
|
|
89
|
+
### 3. Basic CRUD Operations
|
|
90
|
+
|
|
91
|
+
```csharp
|
|
92
|
+
// SELECT single
|
|
93
|
+
var product = await connection.QueryFirstOrDefaultAsync<Product>(
|
|
94
|
+
"SELECT * FROM Products WHERE Id = @Id",
|
|
95
|
+
new { Id = id });
|
|
96
|
+
|
|
97
|
+
// SELECT multiple
|
|
98
|
+
var products = await connection.QueryAsync<Product>(
|
|
99
|
+
"SELECT * FROM Products WHERE CategoryId = @CategoryId",
|
|
100
|
+
new { CategoryId = categoryId });
|
|
101
|
+
|
|
102
|
+
// INSERT with identity return
|
|
103
|
+
var newId = await connection.QuerySingleAsync<int>(
|
|
104
|
+
"""
|
|
105
|
+
INSERT INTO Products (Name, Price, CategoryId)
|
|
106
|
+
VALUES (@Name, @Price, @CategoryId);
|
|
107
|
+
SELECT CAST(SCOPE_IDENTITY() AS INT);
|
|
108
|
+
""",
|
|
109
|
+
product);
|
|
110
|
+
|
|
111
|
+
// INSERT with OUTPUT clause (returns full entity)
|
|
112
|
+
var inserted = await connection.QuerySingleAsync<Product>(
|
|
113
|
+
"""
|
|
114
|
+
INSERT INTO Products (Name, Price, CategoryId)
|
|
115
|
+
OUTPUT INSERTED.*
|
|
116
|
+
VALUES (@Name, @Price, @CategoryId);
|
|
117
|
+
""",
|
|
118
|
+
product);
|
|
119
|
+
|
|
120
|
+
// UPDATE
|
|
121
|
+
var rowsAffected = await connection.ExecuteAsync(
|
|
122
|
+
"""
|
|
123
|
+
UPDATE Products
|
|
124
|
+
SET Name = @Name, Price = @Price, UpdatedAt = @UpdatedAt
|
|
125
|
+
WHERE Id = @Id
|
|
126
|
+
""",
|
|
127
|
+
new { product.Id, product.Name, product.Price, UpdatedAt = DateTime.UtcNow });
|
|
128
|
+
|
|
129
|
+
// DELETE
|
|
130
|
+
await connection.ExecuteAsync(
|
|
131
|
+
"DELETE FROM Products WHERE Id = @Id",
|
|
132
|
+
new { Id = id });
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### 4. Dynamic Query Building
|
|
136
|
+
|
|
137
|
+
```csharp
|
|
138
|
+
public async Task<IReadOnlyList<Product>> SearchAsync(ProductSearchCriteria criteria)
|
|
139
|
+
{
|
|
140
|
+
var sql = new StringBuilder("SELECT * FROM Products WHERE 1=1");
|
|
141
|
+
var parameters = new DynamicParameters();
|
|
142
|
+
|
|
143
|
+
if (!string.IsNullOrWhiteSpace(criteria.SearchTerm))
|
|
144
|
+
{
|
|
145
|
+
sql.Append(" AND (Name LIKE @SearchTerm OR Sku LIKE @SearchTerm)");
|
|
146
|
+
parameters.Add("SearchTerm", $"%{criteria.SearchTerm}%");
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (criteria.CategoryId.HasValue)
|
|
150
|
+
{
|
|
151
|
+
sql.Append(" AND CategoryId = @CategoryId");
|
|
152
|
+
parameters.Add("CategoryId", criteria.CategoryId.Value);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (criteria.MinPrice.HasValue)
|
|
156
|
+
{
|
|
157
|
+
sql.Append(" AND Price >= @MinPrice");
|
|
158
|
+
parameters.Add("MinPrice", criteria.MinPrice.Value);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (criteria.MaxPrice.HasValue)
|
|
162
|
+
{
|
|
163
|
+
sql.Append(" AND Price <= @MaxPrice");
|
|
164
|
+
parameters.Add("MaxPrice", criteria.MaxPrice.Value);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Pagination
|
|
168
|
+
sql.Append(" ORDER BY Name");
|
|
169
|
+
sql.Append(" OFFSET @Offset ROWS FETCH NEXT @PageSize ROWS ONLY");
|
|
170
|
+
parameters.Add("Offset", (criteria.Page - 1) * criteria.PageSize);
|
|
171
|
+
parameters.Add("PageSize", criteria.PageSize);
|
|
172
|
+
|
|
173
|
+
using var connection = _factory.CreateConnection();
|
|
174
|
+
var results = await connection.QueryAsync<Product>(sql.ToString(), parameters);
|
|
175
|
+
return results.ToList();
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 5. Multi-Mapping (Joins)
|
|
180
|
+
|
|
181
|
+
```csharp
|
|
182
|
+
// One-to-One mapping
|
|
183
|
+
public async Task<Product?> GetProductWithCategoryAsync(string id)
|
|
184
|
+
{
|
|
185
|
+
const string sql = """
|
|
186
|
+
SELECT p.*, c.*
|
|
187
|
+
FROM Products p
|
|
188
|
+
INNER JOIN Categories c ON p.CategoryId = c.Id
|
|
189
|
+
WHERE p.Id = @Id
|
|
190
|
+
""";
|
|
191
|
+
|
|
192
|
+
using var connection = _factory.CreateConnection();
|
|
193
|
+
|
|
194
|
+
var result = await connection.QueryAsync<Product, Category, Product>(
|
|
195
|
+
sql,
|
|
196
|
+
(product, category) =>
|
|
197
|
+
{
|
|
198
|
+
product.Category = category;
|
|
199
|
+
return product;
|
|
200
|
+
},
|
|
201
|
+
new { Id = id },
|
|
202
|
+
splitOn: "Id"); // Column where split occurs
|
|
203
|
+
|
|
204
|
+
return result.FirstOrDefault();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// One-to-Many mapping
|
|
208
|
+
public async Task<Order?> GetOrderWithItemsAsync(int orderId)
|
|
209
|
+
{
|
|
210
|
+
const string sql = """
|
|
211
|
+
SELECT o.*, oi.*, p.*
|
|
212
|
+
FROM Orders o
|
|
213
|
+
LEFT JOIN OrderItems oi ON o.Id = oi.OrderId
|
|
214
|
+
LEFT JOIN Products p ON oi.ProductId = p.Id
|
|
215
|
+
WHERE o.Id = @OrderId
|
|
216
|
+
""";
|
|
217
|
+
|
|
218
|
+
var orderDictionary = new Dictionary<int, Order>();
|
|
219
|
+
|
|
220
|
+
using var connection = _factory.CreateConnection();
|
|
221
|
+
|
|
222
|
+
await connection.QueryAsync<Order, OrderItem, Product, Order>(
|
|
223
|
+
sql,
|
|
224
|
+
(order, item, product) =>
|
|
225
|
+
{
|
|
226
|
+
if (!orderDictionary.TryGetValue(order.Id, out var existingOrder))
|
|
227
|
+
{
|
|
228
|
+
existingOrder = order;
|
|
229
|
+
existingOrder.Items = new List<OrderItem>();
|
|
230
|
+
orderDictionary.Add(order.Id, existingOrder);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (item != null)
|
|
234
|
+
{
|
|
235
|
+
item.Product = product;
|
|
236
|
+
existingOrder.Items.Add(item);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return existingOrder;
|
|
240
|
+
},
|
|
241
|
+
new { OrderId = orderId },
|
|
242
|
+
splitOn: "Id,Id");
|
|
243
|
+
|
|
244
|
+
return orderDictionary.Values.FirstOrDefault();
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### 6. Multiple Result Sets
|
|
249
|
+
|
|
250
|
+
```csharp
|
|
251
|
+
public async Task<(IReadOnlyList<Product> Products, int TotalCount)> SearchWithCountAsync(
|
|
252
|
+
ProductSearchCriteria criteria)
|
|
253
|
+
{
|
|
254
|
+
const string sql = """
|
|
255
|
+
-- First result set: count
|
|
256
|
+
SELECT COUNT(*) FROM Products WHERE CategoryId = @CategoryId;
|
|
257
|
+
|
|
258
|
+
-- Second result set: data
|
|
259
|
+
SELECT * FROM Products
|
|
260
|
+
WHERE CategoryId = @CategoryId
|
|
261
|
+
ORDER BY Name
|
|
262
|
+
OFFSET @Offset ROWS FETCH NEXT @PageSize ROWS ONLY;
|
|
263
|
+
""";
|
|
264
|
+
|
|
265
|
+
using var connection = _factory.CreateConnection();
|
|
266
|
+
using var multi = await connection.QueryMultipleAsync(sql, new
|
|
267
|
+
{
|
|
268
|
+
CategoryId = criteria.CategoryId,
|
|
269
|
+
Offset = (criteria.Page - 1) * criteria.PageSize,
|
|
270
|
+
PageSize = criteria.PageSize
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
var totalCount = await multi.ReadSingleAsync<int>();
|
|
274
|
+
var products = (await multi.ReadAsync<Product>()).ToList();
|
|
275
|
+
|
|
276
|
+
return (products, totalCount);
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Advanced Patterns
|
|
281
|
+
|
|
282
|
+
### 7. Table-Valued Parameters (Bulk Operations)
|
|
283
|
+
|
|
284
|
+
```csharp
|
|
285
|
+
// SQL Server TVP for bulk operations
|
|
286
|
+
public async Task<IReadOnlyList<Product>> GetByIdsAsync(IEnumerable<string> ids)
|
|
287
|
+
{
|
|
288
|
+
// Create DataTable matching TVP structure
|
|
289
|
+
var table = new DataTable();
|
|
290
|
+
table.Columns.Add("Id", typeof(string));
|
|
291
|
+
|
|
292
|
+
foreach (var id in ids)
|
|
293
|
+
{
|
|
294
|
+
table.Rows.Add(id);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
using var connection = _factory.CreateConnection();
|
|
298
|
+
|
|
299
|
+
var results = await connection.QueryAsync<Product>(
|
|
300
|
+
"SELECT p.* FROM Products p INNER JOIN @Ids i ON p.Id = i.Id",
|
|
301
|
+
new { Ids = table.AsTableValuedParameter("dbo.StringIdList") });
|
|
302
|
+
|
|
303
|
+
return results.ToList();
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// SQL to create the TVP type:
|
|
307
|
+
// CREATE TYPE dbo.StringIdList AS TABLE (Id NVARCHAR(40));
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### 8. Stored Procedures
|
|
311
|
+
|
|
312
|
+
```csharp
|
|
313
|
+
public async Task<IReadOnlyList<Product>> GetTopProductsAsync(int categoryId, int count)
|
|
314
|
+
{
|
|
315
|
+
using var connection = _factory.CreateConnection();
|
|
316
|
+
|
|
317
|
+
var results = await connection.QueryAsync<Product>(
|
|
318
|
+
"dbo.GetTopProductsByCategory",
|
|
319
|
+
new { CategoryId = categoryId, TopN = count },
|
|
320
|
+
commandType: CommandType.StoredProcedure);
|
|
321
|
+
|
|
322
|
+
return results.ToList();
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// With output parameters
|
|
326
|
+
public async Task<(Order Order, string ConfirmationCode)> CreateOrderAsync(Order order)
|
|
327
|
+
{
|
|
328
|
+
var parameters = new DynamicParameters(new
|
|
329
|
+
{
|
|
330
|
+
order.CustomerId,
|
|
331
|
+
order.Total
|
|
332
|
+
});
|
|
333
|
+
parameters.Add("OrderId", dbType: DbType.Int32, direction: ParameterDirection.Output);
|
|
334
|
+
parameters.Add("ConfirmationCode", dbType: DbType.String, size: 20, direction: ParameterDirection.Output);
|
|
335
|
+
|
|
336
|
+
using var connection = _factory.CreateConnection();
|
|
337
|
+
|
|
338
|
+
await connection.ExecuteAsync(
|
|
339
|
+
"dbo.CreateOrder",
|
|
340
|
+
parameters,
|
|
341
|
+
commandType: CommandType.StoredProcedure);
|
|
342
|
+
|
|
343
|
+
order.Id = parameters.Get<int>("OrderId");
|
|
344
|
+
var confirmationCode = parameters.Get<string>("ConfirmationCode");
|
|
345
|
+
|
|
346
|
+
return (order, confirmationCode);
|
|
347
|
+
}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### 9. Transactions
|
|
351
|
+
|
|
352
|
+
```csharp
|
|
353
|
+
public async Task<Order> CreateOrderWithItemsAsync(Order order, List<OrderItem> items)
|
|
354
|
+
{
|
|
355
|
+
using var connection = _factory.CreateConnection();
|
|
356
|
+
await connection.OpenAsync();
|
|
357
|
+
|
|
358
|
+
using var transaction = await connection.BeginTransactionAsync();
|
|
359
|
+
|
|
360
|
+
try
|
|
361
|
+
{
|
|
362
|
+
// Insert order
|
|
363
|
+
order.Id = await connection.QuerySingleAsync<int>(
|
|
364
|
+
"""
|
|
365
|
+
INSERT INTO Orders (CustomerId, Total, CreatedAt)
|
|
366
|
+
OUTPUT INSERTED.Id
|
|
367
|
+
VALUES (@CustomerId, @Total, @CreatedAt)
|
|
368
|
+
""",
|
|
369
|
+
order,
|
|
370
|
+
transaction);
|
|
371
|
+
|
|
372
|
+
// Insert items
|
|
373
|
+
foreach (var item in items)
|
|
374
|
+
{
|
|
375
|
+
item.OrderId = order.Id;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
await connection.ExecuteAsync(
|
|
379
|
+
"""
|
|
380
|
+
INSERT INTO OrderItems (OrderId, ProductId, Quantity, UnitPrice)
|
|
381
|
+
VALUES (@OrderId, @ProductId, @Quantity, @UnitPrice)
|
|
382
|
+
""",
|
|
383
|
+
items,
|
|
384
|
+
transaction);
|
|
385
|
+
|
|
386
|
+
await transaction.CommitAsync();
|
|
387
|
+
|
|
388
|
+
order.Items = items;
|
|
389
|
+
return order;
|
|
390
|
+
}
|
|
391
|
+
catch
|
|
392
|
+
{
|
|
393
|
+
await transaction.RollbackAsync();
|
|
394
|
+
throw;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### 10. Custom Type Handlers
|
|
400
|
+
|
|
401
|
+
```csharp
|
|
402
|
+
// Register custom type handler for JSON columns
|
|
403
|
+
public class JsonTypeHandler<T> : SqlMapper.TypeHandler<T>
|
|
404
|
+
{
|
|
405
|
+
public override T Parse(object value)
|
|
406
|
+
{
|
|
407
|
+
if (value is string json)
|
|
408
|
+
{
|
|
409
|
+
return JsonSerializer.Deserialize<T>(json)!;
|
|
410
|
+
}
|
|
411
|
+
return default!;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
public override void SetValue(IDbDataParameter parameter, T value)
|
|
415
|
+
{
|
|
416
|
+
parameter.Value = JsonSerializer.Serialize(value);
|
|
417
|
+
parameter.DbType = DbType.String;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// Register at startup
|
|
422
|
+
SqlMapper.AddTypeHandler(new JsonTypeHandler<ProductMetadata>());
|
|
423
|
+
|
|
424
|
+
// Now you can query directly
|
|
425
|
+
var product = await connection.QueryFirstAsync<Product>(
|
|
426
|
+
"SELECT Id, Name, Metadata FROM Products WHERE Id = @Id",
|
|
427
|
+
new { Id = id });
|
|
428
|
+
// product.Metadata is automatically deserialized from JSON
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
## Performance Tips
|
|
432
|
+
|
|
433
|
+
### 11. Use CommandDefinition for Cancellation
|
|
434
|
+
|
|
435
|
+
```csharp
|
|
436
|
+
// Always use CommandDefinition for async operations
|
|
437
|
+
var result = await connection.QueryAsync<Product>(
|
|
438
|
+
new CommandDefinition(
|
|
439
|
+
commandText: "SELECT * FROM Products WHERE CategoryId = @CategoryId",
|
|
440
|
+
parameters: new { CategoryId = categoryId },
|
|
441
|
+
cancellationToken: ct,
|
|
442
|
+
commandTimeout: 30));
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### 12. Buffered vs Unbuffered Queries
|
|
446
|
+
|
|
447
|
+
```csharp
|
|
448
|
+
// Buffered (default) - loads all results into memory
|
|
449
|
+
var products = await connection.QueryAsync<Product>(sql); // Returns list
|
|
450
|
+
|
|
451
|
+
// Unbuffered - streams results (lower memory for large result sets)
|
|
452
|
+
var products = await connection.QueryUnbufferedAsync<Product>(sql); // Returns IAsyncEnumerable
|
|
453
|
+
|
|
454
|
+
await foreach (var product in products)
|
|
455
|
+
{
|
|
456
|
+
// Process one at a time
|
|
457
|
+
}
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
### 13. Connection Pooling Settings
|
|
461
|
+
|
|
462
|
+
```json
|
|
463
|
+
{
|
|
464
|
+
"ConnectionStrings": {
|
|
465
|
+
"Default": "Server=localhost;Database=MyDb;User Id=sa;Password=xxx;TrustServerCertificate=True;Min Pool Size=5;Max Pool Size=100;Connection Timeout=30;"
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
## Common Patterns
|
|
471
|
+
|
|
472
|
+
### Repository Base Class
|
|
473
|
+
|
|
474
|
+
```csharp
|
|
475
|
+
public abstract class DapperRepositoryBase<T> where T : class
|
|
476
|
+
{
|
|
477
|
+
protected readonly IDbConnectionFactory ConnectionFactory;
|
|
478
|
+
protected readonly ILogger Logger;
|
|
479
|
+
protected abstract string TableName { get; }
|
|
480
|
+
|
|
481
|
+
protected DapperRepositoryBase(IDbConnectionFactory factory, ILogger logger)
|
|
482
|
+
{
|
|
483
|
+
ConnectionFactory = factory;
|
|
484
|
+
Logger = logger;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
protected async Task<T?> GetByIdAsync<TId>(TId id, CancellationToken ct = default)
|
|
488
|
+
{
|
|
489
|
+
var sql = $"SELECT * FROM {TableName} WHERE Id = @Id";
|
|
490
|
+
|
|
491
|
+
using var connection = ConnectionFactory.CreateConnection();
|
|
492
|
+
return await connection.QueryFirstOrDefaultAsync<T>(
|
|
493
|
+
new CommandDefinition(sql, new { Id = id }, cancellationToken: ct));
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
protected async Task<IReadOnlyList<T>> GetAllAsync(CancellationToken ct = default)
|
|
497
|
+
{
|
|
498
|
+
var sql = $"SELECT * FROM {TableName}";
|
|
499
|
+
|
|
500
|
+
using var connection = ConnectionFactory.CreateConnection();
|
|
501
|
+
var results = await connection.QueryAsync<T>(
|
|
502
|
+
new CommandDefinition(sql, cancellationToken: ct));
|
|
503
|
+
|
|
504
|
+
return results.ToList();
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
protected async Task<int> ExecuteAsync(
|
|
508
|
+
string sql,
|
|
509
|
+
object? parameters = null,
|
|
510
|
+
CancellationToken ct = default)
|
|
511
|
+
{
|
|
512
|
+
using var connection = ConnectionFactory.CreateConnection();
|
|
513
|
+
return await connection.ExecuteAsync(
|
|
514
|
+
new CommandDefinition(sql, parameters, cancellationToken: ct));
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
## Anti-Patterns to Avoid
|
|
520
|
+
|
|
521
|
+
```csharp
|
|
522
|
+
// ❌ Bad - SQL injection risk
|
|
523
|
+
var sql = $"SELECT * FROM Products WHERE Name = '{userInput}'";
|
|
524
|
+
|
|
525
|
+
// ✅ Good - Parameterized query
|
|
526
|
+
var sql = "SELECT * FROM Products WHERE Name = @Name";
|
|
527
|
+
await connection.QueryAsync<Product>(sql, new { Name = userInput });
|
|
528
|
+
|
|
529
|
+
// ❌ Bad - Not disposing connection
|
|
530
|
+
var connection = new SqlConnection(connectionString);
|
|
531
|
+
var result = await connection.QueryAsync<Product>(sql);
|
|
532
|
+
// Connection leak!
|
|
533
|
+
|
|
534
|
+
// ✅ Good - Using statement
|
|
535
|
+
using var connection = new SqlConnection(connectionString);
|
|
536
|
+
var result = await connection.QueryAsync<Product>(sql);
|
|
537
|
+
|
|
538
|
+
// ❌ Bad - Opening connection manually when not needed
|
|
539
|
+
await connection.OpenAsync(); // Dapper does this automatically
|
|
540
|
+
var result = await connection.QueryAsync<Product>(sql);
|
|
541
|
+
|
|
542
|
+
// ✅ Good - Let Dapper manage connection
|
|
543
|
+
var result = await connection.QueryAsync<Product>(sql);
|
|
544
|
+
```
|