@mytechtoday/augment-extensions 0.1.2 → 0.4.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/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/domain-rules/wordpress/README.md +163 -0
- package/augment-extensions/domain-rules/wordpress/module.json +32 -0
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -0
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
- package/augment-extensions/writing-standards/screenplay/README.md +171 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +142 -9
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +42 -71
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +153 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +528 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +534 -70
- package/package.json +12 -3
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
# Testing Standards
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Comprehensive testing is essential for maintaining code quality and preventing regressions. This document defines standards for unit testing, integration testing, and test organization using PHPUnit.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Unit Testing
|
|
10
|
+
|
|
11
|
+
### PHPUnit Setup
|
|
12
|
+
|
|
13
|
+
**Rules:**
|
|
14
|
+
- Use PHPUnit for all PHP testing
|
|
15
|
+
- Organize tests to mirror source code structure
|
|
16
|
+
- Aim for at least 80% code coverage
|
|
17
|
+
|
|
18
|
+
**Directory Structure:**
|
|
19
|
+
```
|
|
20
|
+
project/
|
|
21
|
+
├── src/
|
|
22
|
+
│ └── Services/
|
|
23
|
+
│ └── UserService.php
|
|
24
|
+
└── tests/
|
|
25
|
+
└── Unit/
|
|
26
|
+
└── Services/
|
|
27
|
+
└── UserServiceTest.php
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Test Class Structure
|
|
31
|
+
|
|
32
|
+
**Rules:**
|
|
33
|
+
- Test classes MUST extend `PHPUnit\Framework\TestCase`
|
|
34
|
+
- Test class names MUST end with `Test`
|
|
35
|
+
- Test method names MUST start with `test` or use `@test` annotation
|
|
36
|
+
- Use descriptive test method names
|
|
37
|
+
|
|
38
|
+
**Examples:**
|
|
39
|
+
```php
|
|
40
|
+
// ✅ Good
|
|
41
|
+
use PHPUnit\Framework\TestCase;
|
|
42
|
+
|
|
43
|
+
class UserServiceTest extends TestCase
|
|
44
|
+
{
|
|
45
|
+
public function testCreateUserWithValidData(): void
|
|
46
|
+
{
|
|
47
|
+
// Test implementation
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public function testCreateUserThrowsExceptionForInvalidEmail(): void
|
|
51
|
+
{
|
|
52
|
+
// Test implementation
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** @test */
|
|
56
|
+
public function it_updates_user_successfully(): void
|
|
57
|
+
{
|
|
58
|
+
// Test implementation
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ❌ Bad
|
|
63
|
+
class UserService extends TestCase // Missing 'Test' suffix
|
|
64
|
+
{
|
|
65
|
+
public function create_user(): void // Doesn't start with 'test'
|
|
66
|
+
{
|
|
67
|
+
// Test implementation
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### AAA Pattern (Arrange-Act-Assert)
|
|
73
|
+
|
|
74
|
+
**Rules:**
|
|
75
|
+
- Structure tests using Arrange-Act-Assert pattern
|
|
76
|
+
- Keep tests focused on single behavior
|
|
77
|
+
- Use blank lines to separate AAA sections
|
|
78
|
+
|
|
79
|
+
**Examples:**
|
|
80
|
+
```php
|
|
81
|
+
// ✅ Good
|
|
82
|
+
public function testCalculateTotalPrice(): void
|
|
83
|
+
{
|
|
84
|
+
// Arrange
|
|
85
|
+
$items = [
|
|
86
|
+
['price' => 10.00, 'quantity' => 2],
|
|
87
|
+
['price' => 5.00, 'quantity' => 3],
|
|
88
|
+
];
|
|
89
|
+
$calculator = new PriceCalculator();
|
|
90
|
+
|
|
91
|
+
// Act
|
|
92
|
+
$total = $calculator->calculateTotal($items);
|
|
93
|
+
|
|
94
|
+
// Assert
|
|
95
|
+
$this->assertEquals(35.00, $total);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ❌ Bad - Mixed concerns
|
|
99
|
+
public function testMultipleThings(): void
|
|
100
|
+
{
|
|
101
|
+
$calc = new PriceCalculator();
|
|
102
|
+
$this->assertEquals(35.00, $calc->calculateTotal($items1));
|
|
103
|
+
$this->assertEquals(50.00, $calc->calculateTotal($items2));
|
|
104
|
+
$this->assertTrue($calc->isValid());
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Assertions
|
|
109
|
+
|
|
110
|
+
**Rules:**
|
|
111
|
+
- Use specific assertions over generic ones
|
|
112
|
+
- Include meaningful assertion messages
|
|
113
|
+
- Use type-specific assertions
|
|
114
|
+
|
|
115
|
+
**Common Assertions:**
|
|
116
|
+
```php
|
|
117
|
+
// ✅ Good - Specific assertions
|
|
118
|
+
$this->assertTrue($result);
|
|
119
|
+
$this->assertFalse($result);
|
|
120
|
+
$this->assertEquals($expected, $actual);
|
|
121
|
+
$this->assertSame($expected, $actual); // Strict comparison
|
|
122
|
+
$this->assertNull($value);
|
|
123
|
+
$this->assertNotNull($value);
|
|
124
|
+
$this->assertEmpty($array);
|
|
125
|
+
$this->assertCount(3, $array);
|
|
126
|
+
$this->assertInstanceOf(User::class, $user);
|
|
127
|
+
$this->assertStringContainsString('error', $message);
|
|
128
|
+
$this->assertArrayHasKey('email', $data);
|
|
129
|
+
|
|
130
|
+
// ✅ Good - With messages
|
|
131
|
+
$this->assertEquals(100, $total, 'Total price should be 100');
|
|
132
|
+
|
|
133
|
+
// ❌ Bad - Generic assertion
|
|
134
|
+
$this->assertTrue($user instanceof User); // Use assertInstanceOf instead
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Test Doubles (Mocks and Stubs)
|
|
138
|
+
|
|
139
|
+
**Rules:**
|
|
140
|
+
- Use mocks to verify behavior
|
|
141
|
+
- Use stubs to provide test data
|
|
142
|
+
- Mock external dependencies
|
|
143
|
+
- Don't mock the system under test
|
|
144
|
+
|
|
145
|
+
**Examples:**
|
|
146
|
+
```php
|
|
147
|
+
// ✅ Good - Mock external dependency
|
|
148
|
+
public function testSendEmailNotification(): void
|
|
149
|
+
{
|
|
150
|
+
// Arrange
|
|
151
|
+
$mailer = $this->createMock(MailerInterface::class);
|
|
152
|
+
$mailer->expects($this->once())
|
|
153
|
+
->method('send')
|
|
154
|
+
->with($this->equalTo('user@example.com'));
|
|
155
|
+
|
|
156
|
+
$notifier = new EmailNotifier($mailer);
|
|
157
|
+
|
|
158
|
+
// Act
|
|
159
|
+
$notifier->notify('user@example.com', 'Test message');
|
|
160
|
+
|
|
161
|
+
// Assert - Verification happens via expects()
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ✅ Good - Stub for test data
|
|
165
|
+
public function testProcessUserData(): void
|
|
166
|
+
{
|
|
167
|
+
// Arrange
|
|
168
|
+
$repository = $this->createStub(UserRepositoryInterface::class);
|
|
169
|
+
$repository->method('findById')
|
|
170
|
+
->willReturn(new User(1, 'John Doe'));
|
|
171
|
+
|
|
172
|
+
$service = new UserService($repository);
|
|
173
|
+
|
|
174
|
+
// Act
|
|
175
|
+
$result = $service->processUser(1);
|
|
176
|
+
|
|
177
|
+
// Assert
|
|
178
|
+
$this->assertEquals('John Doe', $result->name);
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Data Providers
|
|
183
|
+
|
|
184
|
+
**Rules:**
|
|
185
|
+
- Use data providers for testing multiple scenarios
|
|
186
|
+
- Keep data providers focused and readable
|
|
187
|
+
- Name data sets descriptively
|
|
188
|
+
|
|
189
|
+
**Examples:**
|
|
190
|
+
```php
|
|
191
|
+
// ✅ Good
|
|
192
|
+
/**
|
|
193
|
+
* @dataProvider emailValidationProvider
|
|
194
|
+
*/
|
|
195
|
+
public function testEmailValidation(string $email, bool $expected): void
|
|
196
|
+
{
|
|
197
|
+
$validator = new EmailValidator();
|
|
198
|
+
$result = $validator->isValid($email);
|
|
199
|
+
$this->assertEquals($expected, $result);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
public function emailValidationProvider(): array
|
|
203
|
+
{
|
|
204
|
+
return [
|
|
205
|
+
'valid email' => ['user@example.com', true],
|
|
206
|
+
'invalid - no @' => ['userexample.com', false],
|
|
207
|
+
'invalid - no domain' => ['user@', false],
|
|
208
|
+
'invalid - empty' => ['', false],
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Integration Testing
|
|
216
|
+
|
|
217
|
+
### Database Testing
|
|
218
|
+
|
|
219
|
+
**Rules:**
|
|
220
|
+
- Use transactions for test isolation
|
|
221
|
+
- Reset database state between tests
|
|
222
|
+
- Use test fixtures for consistent data
|
|
223
|
+
|
|
224
|
+
**Examples:**
|
|
225
|
+
```php
|
|
226
|
+
// ✅ Good - Transaction-based test
|
|
227
|
+
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
228
|
+
|
|
229
|
+
class UserRepositoryTest extends TestCase
|
|
230
|
+
{
|
|
231
|
+
use RefreshDatabase;
|
|
232
|
+
|
|
233
|
+
public function testFindUserById(): void
|
|
234
|
+
{
|
|
235
|
+
// Arrange
|
|
236
|
+
$user = User::factory()->create([
|
|
237
|
+
'email' => 'test@example.com'
|
|
238
|
+
]);
|
|
239
|
+
|
|
240
|
+
$repository = new UserRepository();
|
|
241
|
+
|
|
242
|
+
// Act
|
|
243
|
+
$found = $repository->findById($user->id);
|
|
244
|
+
|
|
245
|
+
// Assert
|
|
246
|
+
$this->assertNotNull($found);
|
|
247
|
+
$this->assertEquals('test@example.com', $found->email);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### API Testing
|
|
253
|
+
|
|
254
|
+
**Rules:**
|
|
255
|
+
- Test request/response contracts
|
|
256
|
+
- Verify HTTP status codes
|
|
257
|
+
- Validate response structure
|
|
258
|
+
- Test authentication and authorization
|
|
259
|
+
|
|
260
|
+
**Examples:**
|
|
261
|
+
```php
|
|
262
|
+
// ✅ Good - API endpoint test
|
|
263
|
+
public function testGetUserEndpoint(): void
|
|
264
|
+
{
|
|
265
|
+
// Arrange
|
|
266
|
+
$user = User::factory()->create();
|
|
267
|
+
|
|
268
|
+
// Act
|
|
269
|
+
$response = $this->getJson("/api/users/{$user->id}");
|
|
270
|
+
|
|
271
|
+
// Assert
|
|
272
|
+
$response->assertStatus(200)
|
|
273
|
+
->assertJson([
|
|
274
|
+
'id' => $user->id,
|
|
275
|
+
'email' => $user->email,
|
|
276
|
+
])
|
|
277
|
+
->assertJsonStructure([
|
|
278
|
+
'id',
|
|
279
|
+
'email',
|
|
280
|
+
'created_at',
|
|
281
|
+
'updated_at',
|
|
282
|
+
]);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
public function testUnauthorizedAccess(): void
|
|
286
|
+
{
|
|
287
|
+
$response = $this->getJson('/api/admin/users');
|
|
288
|
+
$response->assertStatus(401);
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Test Organization
|
|
295
|
+
|
|
296
|
+
### Test Naming
|
|
297
|
+
|
|
298
|
+
**Rules:**
|
|
299
|
+
- Use descriptive test names that explain what is being tested
|
|
300
|
+
- Include the expected outcome in the name
|
|
301
|
+
- Use snake_case or camelCase consistently
|
|
302
|
+
|
|
303
|
+
**Examples:**
|
|
304
|
+
```php
|
|
305
|
+
// ✅ Good - Descriptive names
|
|
306
|
+
public function testCreateUserWithValidDataReturnsUser(): void
|
|
307
|
+
public function testCreateUserWithInvalidEmailThrowsException(): void
|
|
308
|
+
public function testDeleteUserRemovesFromDatabase(): void
|
|
309
|
+
|
|
310
|
+
// ❌ Bad - Vague names
|
|
311
|
+
public function testUser(): void
|
|
312
|
+
public function testCreate(): void
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Test Coverage
|
|
316
|
+
|
|
317
|
+
**Rules:**
|
|
318
|
+
- Aim for at least 80% code coverage
|
|
319
|
+
- Focus on critical business logic
|
|
320
|
+
- Don't chase 100% coverage at the expense of test quality
|
|
321
|
+
|
|
322
|
+
**Generate Coverage Report:**
|
|
323
|
+
```bash
|
|
324
|
+
# ✅ Good
|
|
325
|
+
./vendor/bin/phpunit --coverage-html coverage/
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Setup and Teardown
|
|
329
|
+
|
|
330
|
+
**Rules:**
|
|
331
|
+
- Use `setUp()` for common test initialization
|
|
332
|
+
- Use `tearDown()` for cleanup
|
|
333
|
+
- Keep setup minimal and focused
|
|
334
|
+
|
|
335
|
+
**Examples:**
|
|
336
|
+
```php
|
|
337
|
+
// ✅ Good
|
|
338
|
+
class UserServiceTest extends TestCase
|
|
339
|
+
{
|
|
340
|
+
private UserService $service;
|
|
341
|
+
private UserRepositoryInterface $repository;
|
|
342
|
+
|
|
343
|
+
protected function setUp(): void
|
|
344
|
+
{
|
|
345
|
+
parent::setUp();
|
|
346
|
+
|
|
347
|
+
$this->repository = $this->createMock(UserRepositoryInterface::class);
|
|
348
|
+
$this->service = new UserService($this->repository);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
protected function tearDown(): void
|
|
352
|
+
{
|
|
353
|
+
parent::tearDown();
|
|
354
|
+
// Cleanup if needed
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
public function testSomething(): void
|
|
358
|
+
{
|
|
359
|
+
// Test uses $this->service
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## Best Practices
|
|
367
|
+
|
|
368
|
+
### Test Independence
|
|
369
|
+
|
|
370
|
+
**Rules:**
|
|
371
|
+
- Tests MUST be independent of each other
|
|
372
|
+
- Tests MUST NOT rely on execution order
|
|
373
|
+
- Each test MUST set up its own state
|
|
374
|
+
|
|
375
|
+
### Fast Tests
|
|
376
|
+
|
|
377
|
+
**Rules:**
|
|
378
|
+
- Keep unit tests fast (< 100ms each)
|
|
379
|
+
- Mock external services
|
|
380
|
+
- Use in-memory databases for integration tests when possible
|
|
381
|
+
|
|
382
|
+
### Readable Tests
|
|
383
|
+
|
|
384
|
+
**Rules:**
|
|
385
|
+
- Tests should be easy to understand
|
|
386
|
+
- Use helper methods to reduce duplication
|
|
387
|
+
- Avoid complex logic in tests
|
|
388
|
+
|
|
389
|
+
**Examples:**
|
|
390
|
+
```php
|
|
391
|
+
// ✅ Good - Helper method
|
|
392
|
+
private function createTestUser(array $attributes = []): User
|
|
393
|
+
{
|
|
394
|
+
return User::factory()->create($attributes);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
public function testUserCreation(): void
|
|
398
|
+
{
|
|
399
|
+
$user = $this->createTestUser(['email' => 'test@example.com']);
|
|
400
|
+
$this->assertEquals('test@example.com', $user->email);
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
# Type Declarations
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Modern PHP (8.0+) provides robust type declaration features. This document defines standards for using type hints, return types, and strict typing to improve code safety and clarity.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Strict Types
|
|
10
|
+
|
|
11
|
+
### Enable Strict Types
|
|
12
|
+
|
|
13
|
+
**Rule:**
|
|
14
|
+
- All PHP files SHOULD declare strict types at the top
|
|
15
|
+
- Place immediately after opening `<?php` tag
|
|
16
|
+
|
|
17
|
+
**Example:**
|
|
18
|
+
```php
|
|
19
|
+
<?php
|
|
20
|
+
|
|
21
|
+
declare(strict_types=1);
|
|
22
|
+
|
|
23
|
+
namespace App\Services;
|
|
24
|
+
|
|
25
|
+
class UserService
|
|
26
|
+
{
|
|
27
|
+
// ...
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Benefits:**
|
|
32
|
+
- Prevents implicit type coercion
|
|
33
|
+
- Catches type errors early
|
|
34
|
+
- Improves code reliability
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Function and Method Type Hints
|
|
39
|
+
|
|
40
|
+
### Parameter Type Declarations
|
|
41
|
+
|
|
42
|
+
**Rules:**
|
|
43
|
+
- Parameters SHOULD have type declarations
|
|
44
|
+
- Use scalar types: `int`, `float`, `string`, `bool`
|
|
45
|
+
- Use class/interface names for objects
|
|
46
|
+
- Use `array` for arrays (or specific array shapes in PHPDoc)
|
|
47
|
+
- Use `callable` for callbacks
|
|
48
|
+
- Use `iterable` for arrays or Traversable objects
|
|
49
|
+
|
|
50
|
+
**Examples:**
|
|
51
|
+
```php
|
|
52
|
+
// ✅ Good
|
|
53
|
+
function processUser(int $id, string $name, bool $isActive): void
|
|
54
|
+
{
|
|
55
|
+
// ...
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function saveOrder(Order $order, PaymentGatewayInterface $gateway): bool
|
|
59
|
+
{
|
|
60
|
+
// ...
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function filterItems(array $items, callable $callback): array
|
|
64
|
+
{
|
|
65
|
+
return array_filter($items, $callback);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ❌ Bad
|
|
69
|
+
function processUser($id, $name, $isActive) // No type hints
|
|
70
|
+
{
|
|
71
|
+
// ...
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Return Type Declarations
|
|
76
|
+
|
|
77
|
+
**Rules:**
|
|
78
|
+
- Return types SHOULD be declared for all methods
|
|
79
|
+
- Use `void` for methods that don't return a value
|
|
80
|
+
- Use specific types instead of `mixed` when possible
|
|
81
|
+
- Use `never` for methods that always throw or exit (PHP 8.1+)
|
|
82
|
+
|
|
83
|
+
**Examples:**
|
|
84
|
+
```php
|
|
85
|
+
// ✅ Good
|
|
86
|
+
function getUserById(int $id): ?User
|
|
87
|
+
{
|
|
88
|
+
return User::find($id);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function calculateTotal(array $items): float
|
|
92
|
+
{
|
|
93
|
+
return array_sum(array_column($items, 'price'));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function logMessage(string $message): void
|
|
97
|
+
{
|
|
98
|
+
error_log($message);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function throwError(): never
|
|
102
|
+
{
|
|
103
|
+
throw new RuntimeException('Fatal error');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ❌ Bad
|
|
107
|
+
function getUserById(int $id) // No return type
|
|
108
|
+
{
|
|
109
|
+
return User::find($id);
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Nullable Types
|
|
116
|
+
|
|
117
|
+
### Nullable Type Syntax
|
|
118
|
+
|
|
119
|
+
**Rules:**
|
|
120
|
+
- Use `?Type` syntax for nullable types
|
|
121
|
+
- Nullable types indicate the value can be `null`
|
|
122
|
+
- Place `?` before the type name
|
|
123
|
+
|
|
124
|
+
**Examples:**
|
|
125
|
+
```php
|
|
126
|
+
// ✅ Good
|
|
127
|
+
function findUser(int $id): ?User
|
|
128
|
+
{
|
|
129
|
+
return User::find($id) ?: null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function processData(?string $input): string
|
|
133
|
+
{
|
|
134
|
+
return $input ?? 'default';
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
class User
|
|
138
|
+
{
|
|
139
|
+
public function __construct(
|
|
140
|
+
public string $name,
|
|
141
|
+
public ?string $email = null,
|
|
142
|
+
public ?DateTime $birthDate = null
|
|
143
|
+
) {}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// ❌ Bad
|
|
147
|
+
function findUser(int $id): User // Should be nullable
|
|
148
|
+
{
|
|
149
|
+
return User::find($id) ?: null; // Can return null
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Union Types (PHP 8.0+)
|
|
156
|
+
|
|
157
|
+
### Union Type Syntax
|
|
158
|
+
|
|
159
|
+
**Rules:**
|
|
160
|
+
- Use `Type1|Type2` syntax for union types
|
|
161
|
+
- Union types allow multiple possible types
|
|
162
|
+
- Order types from most specific to least specific
|
|
163
|
+
- Use when a parameter or return can be multiple types
|
|
164
|
+
|
|
165
|
+
**Examples:**
|
|
166
|
+
```php
|
|
167
|
+
// ✅ Good
|
|
168
|
+
function formatValue(int|float $value): string
|
|
169
|
+
{
|
|
170
|
+
return number_format($value, 2);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function processInput(string|array $data): array
|
|
174
|
+
{
|
|
175
|
+
return is_array($data) ? $data : [$data];
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function findRecord(int|string $identifier): ?User
|
|
179
|
+
{
|
|
180
|
+
return is_int($identifier)
|
|
181
|
+
? User::find($identifier)
|
|
182
|
+
: User::where('email', $identifier)->first();
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Union with null (alternative to nullable syntax)
|
|
186
|
+
function getValue(): int|string|null
|
|
187
|
+
{
|
|
188
|
+
// ...
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// ❌ Bad
|
|
192
|
+
function formatValue($value): string // Should specify int|float
|
|
193
|
+
{
|
|
194
|
+
return number_format($value, 2);
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Intersection Types (PHP 8.1+)
|
|
201
|
+
|
|
202
|
+
### Intersection Type Syntax
|
|
203
|
+
|
|
204
|
+
**Rules:**
|
|
205
|
+
- Use `Type1&Type2` syntax for intersection types
|
|
206
|
+
- Intersection types require all types to be satisfied
|
|
207
|
+
- Commonly used with interfaces
|
|
208
|
+
|
|
209
|
+
**Examples:**
|
|
210
|
+
```php
|
|
211
|
+
// ✅ Good
|
|
212
|
+
interface Loggable
|
|
213
|
+
{
|
|
214
|
+
public function log(): void;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
interface Cacheable
|
|
218
|
+
{
|
|
219
|
+
public function cache(): void;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function processEntity(Loggable&Cacheable $entity): void
|
|
223
|
+
{
|
|
224
|
+
$entity->log();
|
|
225
|
+
$entity->cache();
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Property Type Declarations (PHP 7.4+)
|
|
232
|
+
|
|
233
|
+
### Typed Properties
|
|
234
|
+
|
|
235
|
+
**Rules:**
|
|
236
|
+
- Class properties SHOULD have type declarations
|
|
237
|
+
- Typed properties enforce type at assignment
|
|
238
|
+
- Uninitialized typed properties throw error if accessed
|
|
239
|
+
|
|
240
|
+
**Examples:**
|
|
241
|
+
```php
|
|
242
|
+
// ✅ Good
|
|
243
|
+
class User
|
|
244
|
+
{
|
|
245
|
+
private int $id;
|
|
246
|
+
private string $name;
|
|
247
|
+
private ?string $email = null;
|
|
248
|
+
private array $roles = [];
|
|
249
|
+
private DateTime $createdAt;
|
|
250
|
+
|
|
251
|
+
public function __construct(int $id, string $name)
|
|
252
|
+
{
|
|
253
|
+
$this->id = $id;
|
|
254
|
+
$this->name = $name;
|
|
255
|
+
$this->createdAt = new DateTime();
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// ❌ Bad
|
|
260
|
+
class User
|
|
261
|
+
{
|
|
262
|
+
private $id; // No type
|
|
263
|
+
private $name; // No type
|
|
264
|
+
private $email; // No type
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Readonly Properties (PHP 8.1+)
|
|
269
|
+
|
|
270
|
+
**Rules:**
|
|
271
|
+
- Use `readonly` for properties that should not change after initialization
|
|
272
|
+
- Readonly properties can only be initialized once
|
|
273
|
+
- Readonly properties must have a type declaration
|
|
274
|
+
|
|
275
|
+
**Examples:**
|
|
276
|
+
```php
|
|
277
|
+
// ✅ Good
|
|
278
|
+
class User
|
|
279
|
+
{
|
|
280
|
+
public function __construct(
|
|
281
|
+
public readonly int $id,
|
|
282
|
+
public readonly string $name,
|
|
283
|
+
public readonly DateTime $createdAt
|
|
284
|
+
) {}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// ❌ Bad - trying to modify readonly
|
|
288
|
+
$user = new User(1, 'John', new DateTime());
|
|
289
|
+
$user->name = 'Jane'; // Error: Cannot modify readonly property
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Constructor Property Promotion (PHP 8.0+)
|
|
295
|
+
|
|
296
|
+
**Rules:**
|
|
297
|
+
- Use promoted properties to reduce boilerplate
|
|
298
|
+
- Combine parameter declaration with property declaration
|
|
299
|
+
- Works with visibility modifiers and type declarations
|
|
300
|
+
|
|
301
|
+
**Examples:**
|
|
302
|
+
```php
|
|
303
|
+
// ✅ Good (PHP 8.0+)
|
|
304
|
+
class User
|
|
305
|
+
{
|
|
306
|
+
public function __construct(
|
|
307
|
+
private int $id,
|
|
308
|
+
private string $name,
|
|
309
|
+
private ?string $email = null,
|
|
310
|
+
private array $roles = []
|
|
311
|
+
) {}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// ❌ Verbose (old style)
|
|
315
|
+
class User
|
|
316
|
+
{
|
|
317
|
+
private int $id;
|
|
318
|
+
private string $name;
|
|
319
|
+
private ?string $email;
|
|
320
|
+
private array $roles;
|
|
321
|
+
|
|
322
|
+
public function __construct(int $id, string $name, ?string $email = null, array $roles = [])
|
|
323
|
+
{
|
|
324
|
+
$this->id = $id;
|
|
325
|
+
$this->name = $name;
|
|
326
|
+
$this->email = $email;
|
|
327
|
+
$this->roles = $roles;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|