@tailor-platform/erp-kit 0.2.0 → 0.2.2
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/CHANGELOG.md +12 -0
- package/README.md +3 -26
- package/dist/cli.mjs +1613 -0
- package/package.json +14 -13
- package/schemas/app-compose/business-flow.yml +3 -0
- package/schemas/app-compose/story.yml +13 -1
- package/schemas/module/command.yml +9 -0
- package/schemas/module/module.yml +4 -0
- package/schemas/module/query.yml +9 -0
- package/skills/erp-kit-app-1-requirements/SKILL.md +8 -14
- package/skills/erp-kit-app-2-requirements-review/SKILL.md +102 -0
- package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +66 -0
- package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +69 -0
- package/skills/erp-kit-app-2-requirements-review/references/requirements-report-format.md +25 -0
- package/skills/erp-kit-app-3-plan/SKILL.md +157 -0
- package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +107 -0
- package/skills/erp-kit-app-3-plan/references/screen-extraction.md +74 -0
- package/skills/erp-kit-app-3-plan/references/story-extraction.md +86 -0
- package/skills/erp-kit-app-4-plan-review/SKILL.md +177 -0
- package/skills/erp-kit-app-4-plan-review/references/actor-flow-parity.md +73 -0
- package/skills/erp-kit-app-4-plan-review/references/business-flow-story-parity.md +86 -0
- package/skills/erp-kit-app-4-plan-review/references/orphan-detection.md +69 -0
- package/skills/erp-kit-app-4-plan-review/references/parity-report-format.md +52 -0
- package/skills/erp-kit-app-4-plan-review/references/story-resolver-parity.md +83 -0
- package/skills/erp-kit-app-4-plan-review/references/story-screen-parity.md +73 -0
- package/skills/erp-kit-app-5-impl-backend/SKILL.md +105 -0
- package/skills/erp-kit-app-5-impl-backend/references/app-config.md +38 -0
- package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +48 -0
- package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +68 -0
- package/skills/erp-kit-app-6-impl-frontend/SKILL.md +74 -0
- package/skills/erp-kit-app-6-impl-frontend/references/pages.md +160 -0
- package/skills/erp-kit-app-7-impl-review/SKILL.md +176 -0
- package/skills/erp-kit-app-7-impl-review/references/impl-parity-report-format.md +52 -0
- package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +84 -0
- package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +86 -0
- package/skills/erp-kit-app-7-impl-review/references/screen-doc-code-parity.md +86 -0
- package/skills/erp-kit-module-1-requirements/SKILL.md +126 -0
- package/skills/erp-kit-module-1-requirements/references/boundary-analysis.md +51 -0
- package/skills/erp-kit-module-1-requirements/references/erp-research.md +57 -0
- package/skills/erp-kit-module-1-requirements/references/feature-doc.md +61 -0
- package/skills/erp-kit-module-2-requirements-review/SKILL.md +112 -0
- package/skills/erp-kit-module-2-requirements-review/references/best-practices-check.md +79 -0
- package/skills/erp-kit-module-2-requirements-review/references/boundary-consistency-check.md +70 -0
- package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +25 -0
- package/skills/erp-kit-module-3-plan/SKILL.md +107 -0
- package/skills/erp-kit-module-3-plan/references/command-extraction.md +87 -0
- package/skills/erp-kit-module-3-plan/references/model-extraction.md +72 -0
- package/skills/erp-kit-module-3-plan/references/query-extraction.md +59 -0
- package/skills/erp-kit-module-4-plan-review/SKILL.md +158 -0
- package/skills/erp-kit-module-4-plan-review/references/command-model-consistency.md +46 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-command-parity.md +97 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-model-parity.md +47 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-query-parity.md +70 -0
- package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +52 -0
- package/skills/erp-kit-module-5-impl/SKILL.md +118 -0
- package/skills/erp-kit-module-5-impl/references/command-impl.md +68 -0
- package/skills/erp-kit-module-5-impl/references/exports.md +10 -0
- package/skills/erp-kit-module-5-impl/references/model-impl.md +45 -0
- package/skills/erp-kit-module-5-impl/references/query-impl.md +53 -0
- package/skills/erp-kit-module-6-impl-review/SKILL.md +187 -0
- package/skills/erp-kit-module-6-impl-review/references/command-doc-code-parity.md +92 -0
- package/skills/erp-kit-module-6-impl-review/references/command-doc-test-parity.md +93 -0
- package/skills/erp-kit-module-6-impl-review/references/error-implementation-parity.md +95 -0
- package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/errors.md +1 -1
- package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +52 -0
- package/skills/erp-kit-module-6-impl-review/references/model-doc-code-parity.md +80 -0
- package/skills/erp-kit-module-shared/SKILL.md +1 -1
- package/skills/erp-kit-module-shared/references/commands.md +1 -1
- package/skills/erp-kit-module-shared/references/errors.md +12 -9
- package/skills/erp-kit-module-shared/references/queries.md +109 -36
- package/skills/erp-kit-module-shared/references/testing.md +10 -0
- package/skills/erp-kit-update/SKILL.md +2 -2
- package/src/app.ts +1 -1
- package/src/commands/check.ts +1 -1
- package/src/commands/index.ts +16 -5
- package/src/commands/init.test.ts +22 -69
- package/src/commands/init.ts +28 -115
- package/src/commands/lib/distribute.test.ts +126 -0
- package/src/commands/lib/distribute.ts +129 -0
- package/src/commands/parse-doc-test-cases.ts +55 -0
- package/src/commands/scaffold.test.ts +74 -33
- package/src/commands/scaffold.ts +54 -18
- package/src/commands/sync-check.test.ts +173 -0
- package/src/commands/sync-check.ts +103 -2
- package/src/commands/update.test.ts +87 -0
- package/src/commands/update.ts +41 -0
- package/src/generator/generate-code.test.ts +23 -12
- package/src/generator/generate-code.ts +22 -16
- package/src/integration.test.ts +1 -1
- package/src/module.ts +20 -65
- package/src/modules/item-management/README.md +8 -0
- package/src/modules/item-management/command/activateItem.generated.ts +1 -1
- package/src/modules/item-management/command/activateItem.test.ts +12 -18
- package/src/modules/item-management/command/activateItem.ts +9 -5
- package/src/modules/item-management/command/assignItemToTaxonomy.generated.ts +1 -1
- package/src/modules/item-management/command/assignItemToTaxonomy.test.ts +10 -24
- package/src/modules/item-management/command/assignItemToTaxonomy.ts +19 -16
- package/src/modules/item-management/command/createItem.generated.ts +1 -1
- package/src/modules/item-management/command/createItem.test.ts +11 -11
- package/src/modules/item-management/command/createItem.ts +16 -7
- package/src/modules/item-management/command/createTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/createTaxonomyNode.test.ts +9 -9
- package/src/modules/item-management/command/createTaxonomyNode.ts +33 -14
- package/src/modules/item-management/command/deactivateItem.generated.ts +1 -1
- package/src/modules/item-management/command/deactivateItem.test.ts +12 -18
- package/src/modules/item-management/command/deactivateItem.ts +9 -5
- package/src/modules/item-management/command/deleteItem.generated.ts +1 -1
- package/src/modules/item-management/command/deleteItem.test.ts +10 -16
- package/src/modules/item-management/command/deleteItem.ts +9 -5
- package/src/modules/item-management/command/deleteTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/deleteTaxonomyNode.test.ts +10 -16
- package/src/modules/item-management/command/deleteTaxonomyNode.ts +22 -12
- package/src/modules/item-management/command/moveTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/moveTaxonomyNode.test.ts +10 -10
- package/src/modules/item-management/command/moveTaxonomyNode.ts +63 -19
- package/src/modules/item-management/command/reactivateItem.generated.ts +1 -1
- package/src/modules/item-management/command/reactivateItem.test.ts +12 -18
- package/src/modules/item-management/command/reactivateItem.ts +9 -5
- package/src/modules/item-management/command/removeItemFromTaxonomy.generated.ts +1 -1
- package/src/modules/item-management/command/removeItemFromTaxonomy.test.ts +9 -16
- package/src/modules/item-management/command/removeItemFromTaxonomy.ts +11 -6
- package/src/modules/item-management/command/updateItem.generated.ts +1 -1
- package/src/modules/item-management/command/updateItem.test.ts +16 -16
- package/src/modules/item-management/command/updateItem.ts +11 -6
- package/src/modules/item-management/command/updateTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/updateTaxonomyNode.test.ts +14 -20
- package/src/modules/item-management/command/updateTaxonomyNode.ts +9 -6
- package/src/modules/item-management/docs/commands/ActivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/AssignItemToTaxonomy.md +7 -0
- package/src/modules/item-management/docs/commands/CreateItem.md +10 -0
- package/src/modules/item-management/docs/commands/CreateTaxonomyNode.md +9 -0
- package/src/modules/item-management/docs/commands/DeactivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/DeleteItem.md +7 -0
- package/src/modules/item-management/docs/commands/DeleteTaxonomyNode.md +7 -0
- package/src/modules/item-management/docs/commands/MoveTaxonomyNode.md +10 -0
- package/src/modules/item-management/docs/commands/ReactivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/RemoveItemFromTaxonomy.md +5 -0
- package/src/modules/item-management/docs/commands/UpdateItem.md +15 -0
- package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +9 -0
- package/src/modules/item-management/docs/queries/CalculateNodeDepth.md +8 -0
- package/src/modules/item-management/docs/queries/CalculateSubtreeDepth.md +7 -0
- package/src/modules/item-management/docs/queries/DetectCircularReference.md +9 -0
- package/src/modules/item-management/docs/queries/GetItem.md +9 -0
- package/src/modules/item-management/docs/queries/GetItemTaxonomyAssignment.md +5 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNode.md +7 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNodeAssignments.md +5 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNodeChildren.md +6 -0
- package/src/modules/item-management/index.ts +0 -51
- package/src/modules/item-management/lib/errors.generated.ts +24 -24
- package/src/modules/item-management/lib/permissions.generated.ts +1 -1
- package/src/modules/item-management/lib/types.ts +1 -1
- package/src/modules/item-management/module.ts +1 -1
- package/src/modules/item-management/query/calculateNodeDepth.generated.ts +1 -1
- package/src/modules/item-management/query/calculateNodeDepth.test.ts +21 -6
- package/src/modules/item-management/query/calculateNodeDepth.ts +2 -2
- package/src/modules/item-management/query/calculateSubtreeDepth.generated.ts +1 -1
- package/src/modules/item-management/query/calculateSubtreeDepth.test.ts +17 -5
- package/src/modules/item-management/query/calculateSubtreeDepth.ts +2 -2
- package/src/modules/item-management/query/detectCircularReference.generated.ts +1 -1
- package/src/modules/item-management/query/detectCircularReference.test.ts +25 -7
- package/src/modules/item-management/query/detectCircularReference.ts +4 -4
- package/src/modules/item-management/query/getItem.generated.ts +1 -1
- package/src/modules/item-management/query/getItem.test.ts +25 -7
- package/src/modules/item-management/query/getItem.ts +2 -2
- package/src/modules/item-management/query/getItemTaxonomyAssignment.generated.ts +1 -1
- package/src/modules/item-management/query/getItemTaxonomyAssignment.test.ts +9 -3
- package/src/modules/item-management/query/getItemTaxonomyAssignment.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNode.test.ts +17 -5
- package/src/modules/item-management/query/getTaxonomyNode.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.test.ts +9 -3
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNodeChildren.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeChildren.test.ts +13 -4
- package/src/modules/item-management/query/getTaxonomyNodeChildren.ts +2 -2
- package/src/modules/item-management/tailor.config.ts +6 -4
- package/src/modules/item-management/tailor.d.ts +13 -0
- package/src/modules/primitives/README.md +8 -0
- package/src/modules/primitives/command/activateCategory.generated.ts +1 -1
- package/src/modules/primitives/command/activateCategory.test.ts +8 -18
- package/src/modules/primitives/command/activateCategory.ts +9 -5
- package/src/modules/primitives/command/activateCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/activateCurrency.test.ts +8 -18
- package/src/modules/primitives/command/activateCurrency.ts +9 -5
- package/src/modules/primitives/command/activateUnit.generated.ts +1 -1
- package/src/modules/primitives/command/activateUnit.test.ts +8 -15
- package/src/modules/primitives/command/activateUnit.ts +9 -5
- package/src/modules/primitives/command/createCategory.generated.ts +1 -1
- package/src/modules/primitives/command/createCategory.test.ts +29 -44
- package/src/modules/primitives/command/createCategory.ts +9 -5
- package/src/modules/primitives/command/createCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/createCurrency.test.ts +53 -78
- package/src/modules/primitives/command/createCurrency.ts +9 -6
- package/src/modules/primitives/command/createExchangeRate.generated.ts +1 -1
- package/src/modules/primitives/command/createExchangeRate.test.ts +59 -97
- package/src/modules/primitives/command/createExchangeRate.ts +13 -7
- package/src/modules/primitives/command/createUnit.generated.ts +1 -1
- package/src/modules/primitives/command/createUnit.test.ts +59 -90
- package/src/modules/primitives/command/createUnit.ts +9 -6
- package/src/modules/primitives/command/deactivateCategory.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateCategory.test.ts +15 -33
- package/src/modules/primitives/command/deactivateCategory.ts +9 -5
- package/src/modules/primitives/command/deactivateCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateCurrency.test.ts +12 -26
- package/src/modules/primitives/command/deactivateCurrency.ts +9 -5
- package/src/modules/primitives/command/deactivateUnit.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateUnit.test.ts +15 -30
- package/src/modules/primitives/command/deactivateUnit.ts +14 -7
- package/src/modules/primitives/command/setBaseCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/setBaseCurrency.test.ts +18 -40
- package/src/modules/primitives/command/setBaseCurrency.ts +15 -7
- package/src/modules/primitives/command/setReferenceUnit.generated.ts +1 -1
- package/src/modules/primitives/command/setReferenceUnit.test.ts +22 -44
- package/src/modules/primitives/command/setReferenceUnit.ts +21 -9
- package/src/modules/primitives/docs/commands/ActivateCategory.md +6 -0
- package/src/modules/primitives/docs/commands/ActivateCurrency.md +6 -0
- package/src/modules/primitives/docs/commands/ActivateUnit.md +6 -0
- package/src/modules/primitives/docs/commands/CreateCategory.md +6 -0
- package/src/modules/primitives/docs/commands/CreateCurrency.md +10 -0
- package/src/modules/primitives/docs/commands/CreateExchangeRate.md +11 -0
- package/src/modules/primitives/docs/commands/CreateUnit.md +10 -0
- package/src/modules/primitives/docs/commands/DeactivateCategory.md +7 -0
- package/src/modules/primitives/docs/commands/DeactivateCurrency.md +7 -0
- package/src/modules/primitives/docs/commands/DeactivateUnit.md +7 -0
- package/src/modules/primitives/docs/commands/SetBaseCurrency.md +7 -0
- package/src/modules/primitives/docs/commands/SetReferenceUnit.md +7 -0
- package/src/modules/primitives/docs/queries/ConvertAmount.md +14 -0
- package/src/modules/primitives/docs/queries/ConvertQuantity.md +13 -0
- package/src/modules/primitives/docs/queries/GetBaseCurrency.md +5 -0
- package/src/modules/primitives/docs/queries/GetCurrency.md +7 -0
- package/src/modules/primitives/docs/queries/GetUnit.md +7 -0
- package/src/modules/primitives/docs/queries/GetUoMCategory.md +7 -0
- package/src/modules/primitives/docs/queries/ListUnitsByCategory.md +15 -5
- package/src/modules/primitives/index.ts +0 -49
- package/src/modules/primitives/lib/errors.generated.ts +23 -23
- package/src/modules/primitives/lib/permissions.generated.ts +1 -1
- package/src/modules/primitives/lib/types.ts +1 -1
- package/src/modules/primitives/module.ts +1 -1
- package/src/modules/primitives/query/convertAmount.generated.ts +1 -1
- package/src/modules/primitives/query/convertAmount.test.ts +110 -77
- package/src/modules/primitives/query/convertAmount.ts +61 -47
- package/src/modules/primitives/query/convertQuantity.generated.ts +1 -1
- package/src/modules/primitives/query/convertQuantity.test.ts +99 -69
- package/src/modules/primitives/query/convertQuantity.ts +12 -10
- package/src/modules/primitives/query/getBaseCurrency.generated.ts +1 -1
- package/src/modules/primitives/query/getBaseCurrency.test.ts +10 -4
- package/src/modules/primitives/query/getBaseCurrency.ts +2 -2
- package/src/modules/primitives/query/getCurrency.generated.ts +1 -1
- package/src/modules/primitives/query/getCurrency.test.ts +17 -5
- package/src/modules/primitives/query/getCurrency.ts +2 -2
- package/src/modules/primitives/query/getUnit.generated.ts +1 -1
- package/src/modules/primitives/query/getUnit.test.ts +17 -5
- package/src/modules/primitives/query/getUnit.ts +2 -2
- package/src/modules/primitives/query/getUoMCategory.generated.ts +1 -1
- package/src/modules/primitives/query/getUoMCategory.test.ts +17 -5
- package/src/modules/primitives/query/getUoMCategory.ts +2 -2
- package/src/modules/primitives/query/listUnitsByCategory.generated.ts +1 -1
- package/src/modules/primitives/query/listUnitsByCategory.test.ts +80 -0
- package/src/modules/primitives/query/listUnitsByCategory.ts +19 -3
- package/src/modules/primitives/tailor.config.ts +6 -4
- package/src/modules/primitives/tailor.d.ts +13 -0
- package/src/modules/product-management/README.md +52 -0
- package/src/modules/product-management/command/activateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/activateProduct.test.ts +40 -0
- package/src/modules/product-management/command/activateProduct.ts +42 -0
- package/src/modules/product-management/command/assignProductToCategory.generated.ts +6 -0
- package/src/modules/product-management/command/assignProductToCategory.test.ts +90 -0
- package/src/modules/product-management/command/assignProductToCategory.ts +62 -0
- package/src/modules/product-management/command/createProduct.generated.ts +6 -0
- package/src/modules/product-management/command/createProduct.test.ts +149 -0
- package/src/modules/product-management/command/createProduct.ts +73 -0
- package/src/modules/product-management/command/createProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/createProductAttribute.test.ts +70 -0
- package/src/modules/product-management/command/createProductAttribute.ts +53 -0
- package/src/modules/product-management/command/createProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/createProductAttributeValue.test.ts +68 -0
- package/src/modules/product-management/command/createProductAttributeValue.ts +63 -0
- package/src/modules/product-management/command/createProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/createProductCategory.test.ts +135 -0
- package/src/modules/product-management/command/createProductCategory.ts +82 -0
- package/src/modules/product-management/command/deactivateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/deactivateProduct.test.ts +40 -0
- package/src/modules/product-management/command/deactivateProduct.ts +42 -0
- package/src/modules/product-management/command/deleteProduct.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProduct.test.ts +42 -0
- package/src/modules/product-management/command/deleteProduct.ts +42 -0
- package/src/modules/product-management/command/deleteProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductAttribute.test.ts +49 -0
- package/src/modules/product-management/command/deleteProductAttribute.ts +45 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.test.ts +71 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.ts +68 -0
- package/src/modules/product-management/command/deleteProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductCategory.test.ts +74 -0
- package/src/modules/product-management/command/deleteProductCategory.ts +53 -0
- package/src/modules/product-management/command/generateVariants.generated.ts +6 -0
- package/src/modules/product-management/command/generateVariants.test.ts +365 -0
- package/src/modules/product-management/command/generateVariants.ts +168 -0
- package/src/modules/product-management/command/moveProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/moveProductCategory.test.ts +170 -0
- package/src/modules/product-management/command/moveProductCategory.ts +124 -0
- package/src/modules/product-management/command/reactivateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/reactivateProduct.test.ts +40 -0
- package/src/modules/product-management/command/reactivateProduct.ts +42 -0
- package/src/modules/product-management/command/removeProductFromCategory.generated.ts +6 -0
- package/src/modules/product-management/command/removeProductFromCategory.test.ts +42 -0
- package/src/modules/product-management/command/removeProductFromCategory.ts +32 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.generated.ts +6 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.test.ts +206 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.ts +102 -0
- package/src/modules/product-management/command/updateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/updateProduct.test.ts +168 -0
- package/src/modules/product-management/command/updateProduct.ts +95 -0
- package/src/modules/product-management/command/updateProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductAttribute.test.ts +101 -0
- package/src/modules/product-management/command/updateProductAttribute.ts +68 -0
- package/src/modules/product-management/command/updateProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductAttributeValue.test.ts +80 -0
- package/src/modules/product-management/command/updateProductAttributeValue.ts +58 -0
- package/src/modules/product-management/command/updateProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductCategory.test.ts +80 -0
- package/src/modules/product-management/command/updateProductCategory.ts +66 -0
- package/src/modules/product-management/db/product.ts +47 -0
- package/src/modules/product-management/db/productAttribute.ts +26 -0
- package/src/modules/product-management/db/productAttributeAssignment.ts +58 -0
- package/src/modules/product-management/db/productAttributeValue.ts +39 -0
- package/src/modules/product-management/db/productCategory.ts +34 -0
- package/src/modules/product-management/db/productCategoryAssignment.ts +49 -0
- package/src/modules/product-management/db/productVariant.ts +52 -0
- package/src/modules/product-management/docs/commands/ActivateProduct.md +39 -0
- package/src/modules/product-management/docs/commands/AssignProductToCategory.md +43 -0
- package/src/modules/product-management/docs/commands/CreateProduct.md +48 -0
- package/src/modules/product-management/docs/commands/CreateProductAttribute.md +39 -0
- package/src/modules/product-management/docs/commands/CreateProductAttributeValue.md +42 -0
- package/src/modules/product-management/docs/commands/CreateProductCategory.md +54 -0
- package/src/modules/product-management/docs/commands/DeactivateProduct.md +39 -0
- package/src/modules/product-management/docs/commands/DeleteProduct.md +42 -0
- package/src/modules/product-management/docs/commands/DeleteProductAttribute.md +39 -0
- package/src/modules/product-management/docs/commands/DeleteProductAttributeValue.md +42 -0
- package/src/modules/product-management/docs/commands/DeleteProductCategory.md +43 -0
- package/src/modules/product-management/docs/commands/GenerateVariants.md +68 -0
- package/src/modules/product-management/docs/commands/MoveProductCategory.md +54 -0
- package/src/modules/product-management/docs/commands/ReactivateProduct.md +38 -0
- package/src/modules/product-management/docs/commands/RemoveProductFromCategory.md +34 -0
- package/src/modules/product-management/docs/commands/SetProductAttributeAssignment.md +62 -0
- package/src/modules/product-management/docs/commands/UpdateProduct.md +61 -0
- package/src/modules/product-management/docs/commands/UpdateProductAttribute.md +46 -0
- package/src/modules/product-management/docs/commands/UpdateProductAttributeValue.md +47 -0
- package/src/modules/product-management/docs/commands/UpdateProductCategory.md +46 -0
- package/src/modules/product-management/docs/features/attribute-management.md +48 -0
- package/src/modules/product-management/docs/features/product-category.md +71 -0
- package/src/modules/product-management/docs/features/product-lifecycle.md +66 -0
- package/src/modules/product-management/docs/features/variant-generation.md +77 -0
- package/src/modules/product-management/docs/models/Product.md +58 -0
- package/src/modules/product-management/docs/models/ProductAttribute.md +37 -0
- package/src/modules/product-management/docs/models/ProductAttributeAssignment.md +41 -0
- package/src/modules/product-management/docs/models/ProductAttributeValue.md +40 -0
- package/src/modules/product-management/docs/models/ProductCategory.md +46 -0
- package/src/modules/product-management/docs/models/ProductCategoryAssignment.md +37 -0
- package/src/modules/product-management/docs/models/ProductVariant.md +41 -0
- package/src/modules/product-management/docs/queries/CalculateCategoryDepth.md +47 -0
- package/src/modules/product-management/docs/queries/DetectCategoryCircularReference.md +51 -0
- package/src/modules/product-management/docs/queries/GetProduct.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductAttribute.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductAttributeAssignment.md +34 -0
- package/src/modules/product-management/docs/queries/GetProductAttributeValue.md +40 -0
- package/src/modules/product-management/docs/queries/GetProductCategory.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductCategoryAssignment.md +34 -0
- package/src/modules/product-management/docs/queries/GetProductVariant.md +41 -0
- package/src/modules/product-management/docs/queries/ListAttributeAssignmentsByAttribute.md +34 -0
- package/src/modules/product-management/docs/queries/ListCategoryAssignmentsByProduct.md +35 -0
- package/src/modules/product-management/docs/queries/ListProductAttributeAssignments.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductAttributeValues.md +36 -0
- package/src/modules/product-management/docs/queries/ListProductCategoryAssignments.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductCategoryChildren.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductVariants.md +34 -0
- package/src/modules/product-management/generated/enums.ts +9 -0
- package/src/modules/product-management/generated/kysely-tailordb.ts +100 -0
- package/src/modules/product-management/index.ts +2 -0
- package/src/modules/product-management/lib/_db_deps.ts +17 -0
- package/src/modules/product-management/lib/errors.generated.ts +152 -0
- package/src/modules/product-management/lib/permissions.generated.ts +25 -0
- package/src/modules/product-management/lib/types.ts +51 -0
- package/src/modules/product-management/module.ts +201 -0
- package/src/modules/product-management/query/calculateCategoryDepth.generated.ts +5 -0
- package/src/modules/product-management/query/calculateCategoryDepth.test.ts +72 -0
- package/src/modules/product-management/query/calculateCategoryDepth.ts +37 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.generated.ts +5 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.test.ts +72 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.ts +44 -0
- package/src/modules/product-management/query/getProduct.generated.ts +5 -0
- package/src/modules/product-management/query/getProduct.test.ts +59 -0
- package/src/modules/product-management/query/getProduct.ts +18 -0
- package/src/modules/product-management/query/getProductAttribute.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttribute.test.ts +59 -0
- package/src/modules/product-management/query/getProductAttribute.ts +18 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.test.ts +37 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.ts +18 -0
- package/src/modules/product-management/query/getProductAttributeValue.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttributeValue.test.ts +31 -0
- package/src/modules/product-management/query/getProductAttributeValue.ts +16 -0
- package/src/modules/product-management/query/getProductCategory.generated.ts +5 -0
- package/src/modules/product-management/query/getProductCategory.test.ts +59 -0
- package/src/modules/product-management/query/getProductCategory.ts +18 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.generated.ts +5 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.test.ts +37 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.ts +18 -0
- package/src/modules/product-management/query/getProductVariant.generated.ts +5 -0
- package/src/modules/product-management/query/getProductVariant.test.ts +43 -0
- package/src/modules/product-management/query/getProductVariant.ts +20 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.generated.ts +5 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.test.ts +31 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.ts +16 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.generated.ts +5 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.test.ts +31 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.ts +16 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.generated.ts +5 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.test.ts +31 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.ts +16 -0
- package/src/modules/product-management/query/listProductAttributeValues.generated.ts +5 -0
- package/src/modules/product-management/query/listProductAttributeValues.test.ts +31 -0
- package/src/modules/product-management/query/listProductAttributeValues.ts +17 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.generated.ts +5 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.test.ts +31 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.ts +16 -0
- package/src/modules/product-management/query/listProductCategoryChildren.generated.ts +5 -0
- package/src/modules/product-management/query/listProductCategoryChildren.test.ts +31 -0
- package/src/modules/product-management/query/listProductCategoryChildren.ts +16 -0
- package/src/modules/product-management/query/listProductVariants.generated.ts +5 -0
- package/src/modules/product-management/query/listProductVariants.test.ts +31 -0
- package/src/modules/product-management/query/listProductVariants.ts +16 -0
- package/src/modules/product-management/tailor.config.ts +13 -0
- package/src/modules/product-management/tailor.d.ts +13 -0
- package/src/modules/product-management/testing/fixtures.ts +151 -0
- package/src/modules/user-management/README.md +9 -3
- package/src/modules/user-management/command/activateUser.generated.ts +1 -1
- package/src/modules/user-management/command/activateUser.test.ts +12 -65
- package/src/modules/user-management/command/activateUser.ts +5 -20
- package/src/modules/user-management/command/assignPermissionToRole.generated.ts +1 -1
- package/src/modules/user-management/command/assignPermissionToRole.test.ts +25 -60
- package/src/modules/user-management/command/assignPermissionToRole.ts +5 -24
- package/src/modules/user-management/command/assignRoleToUser.generated.ts +1 -1
- package/src/modules/user-management/command/assignRoleToUser.test.ts +35 -87
- package/src/modules/user-management/command/assignRoleToUser.ts +5 -24
- package/src/modules/user-management/command/createPermission.generated.ts +1 -1
- package/src/modules/user-management/command/createPermission.test.ts +23 -33
- package/src/modules/user-management/command/createPermission.ts +4 -5
- package/src/modules/user-management/command/createRole.generated.ts +1 -1
- package/src/modules/user-management/command/createRole.test.ts +17 -27
- package/src/modules/user-management/command/createRole.ts +4 -5
- package/src/modules/user-management/command/createUser.generated.ts +1 -1
- package/src/modules/user-management/command/createUser.test.ts +31 -118
- package/src/modules/user-management/command/createUser.ts +7 -25
- package/src/modules/user-management/command/deactivateUser.generated.ts +1 -1
- package/src/modules/user-management/command/deactivateUser.test.ts +12 -65
- package/src/modules/user-management/command/deactivateUser.ts +6 -21
- package/src/modules/user-management/command/reactivateUser.generated.ts +1 -1
- package/src/modules/user-management/command/reactivateUser.test.ts +13 -66
- package/src/modules/user-management/command/reactivateUser.ts +5 -20
- package/src/modules/user-management/command/revokePermissionFromRole.generated.ts +1 -1
- package/src/modules/user-management/command/revokePermissionFromRole.test.ts +24 -62
- package/src/modules/user-management/command/revokePermissionFromRole.ts +5 -24
- package/src/modules/user-management/command/revokeRoleFromUser.generated.ts +1 -1
- package/src/modules/user-management/command/revokeRoleFromUser.test.ts +24 -60
- package/src/modules/user-management/command/revokeRoleFromUser.ts +5 -24
- package/src/modules/user-management/docs/commands/ActivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/AssignPermissionToRole.md +7 -0
- package/src/modules/user-management/docs/commands/AssignRoleToUser.md +9 -0
- package/src/modules/user-management/docs/commands/CreatePermission.md +12 -0
- package/src/modules/user-management/docs/commands/CreateRole.md +9 -0
- package/src/modules/user-management/docs/commands/CreateUser.md +11 -0
- package/src/modules/user-management/docs/commands/DeactivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/ReactivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/RevokePermissionFromRole.md +7 -0
- package/src/modules/user-management/docs/commands/RevokeRoleFromUser.md +7 -0
- package/src/modules/user-management/index.ts +0 -30
- package/src/modules/user-management/lib/errors.generated.ts +14 -14
- package/src/modules/user-management/lib/permissions.generated.ts +1 -2
- package/src/modules/user-management/lib/recomputeUserPermissions.ts +4 -3
- package/src/modules/user-management/lib/types.ts +1 -1
- package/src/modules/user-management/module.ts +2 -7
- package/src/modules/user-management/tailor.config.ts +6 -4
- package/src/modules/user-management/tailor.d.ts +13 -0
- package/src/modules/user-management/testing/fixtures.ts +1 -20
- package/src/schemas.ts +1 -1
- package/src/{modules/shared → shared}/defineCommand.test.ts +23 -7
- package/src/{modules/shared → shared}/defineCommand.ts +19 -10
- package/src/{modules/shared/internal.ts → shared/index.ts} +9 -1
- package/src/shared/pagination.test.ts +43 -0
- package/src/shared/pagination.ts +22 -0
- package/src/{modules/shared → shared}/types.ts +13 -0
- package/src/{modules/testing → testing}/index.ts +14 -7
- package/src/testing.ts +1 -1
- package/src/util.ts +8 -0
- package/templates/config/license.config.json +4 -0
- package/templates/scaffold/app/backend/.env.example +1 -0
- package/templates/scaffold/app/backend/__dot__gitignore +4 -0
- package/templates/scaffold/app/backend/eslint.config.js +32 -0
- package/templates/scaffold/app/backend/package.json +31 -0
- package/templates/scaffold/app/backend/seed/data/AuditEvent.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Permission.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Permission.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/Role.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Role.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/RolePermission.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/RolePermission.schema.ts +24 -0
- package/templates/scaffold/app/backend/seed/data/User.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/User.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/UserRole.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/UserRole.schema.ts +24 -0
- package/templates/scaffold/app/backend/seed/data/_User.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/_User.schema.ts +30 -0
- package/templates/scaffold/app/backend/seed/exec.mjs +659 -0
- package/templates/scaffold/app/backend/src/executors/permissionCreated.ts +3 -0
- package/templates/scaffold/app/backend/src/executors/permissionDeleted.ts +3 -0
- package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +83 -0
- package/templates/scaffold/app/backend/src/modules.ts +9 -0
- package/templates/scaffold/app/backend/src/resolvers/createUser.ts +46 -0
- package/templates/scaffold/app/backend/tailor.config.ts +68 -0
- package/templates/scaffold/app/backend/tailor.d.ts +15 -0
- package/templates/scaffold/app/backend/tsconfig.json +19 -0
- package/templates/scaffold/app/docs/actors/.gitkeep +0 -0
- package/templates/scaffold/app/docs/business-flow/.gitkeep +0 -0
- package/templates/scaffold/app/docs/resolver/.gitkeep +0 -0
- package/templates/scaffold/app/docs/screen/.gitkeep +0 -0
- package/templates/scaffold/app/frontend/.env.example +2 -0
- package/templates/scaffold/app/frontend/__dot__gitignore +3 -0
- package/templates/scaffold/app/frontend/components.json +23 -0
- package/templates/scaffold/app/frontend/eslint.config.js +48 -0
- package/templates/scaffold/app/frontend/index.html +13 -0
- package/templates/scaffold/app/frontend/package.json +53 -0
- package/templates/scaffold/app/frontend/scripts/generate-graphql.mjs +6 -0
- package/templates/scaffold/app/frontend/src/App.tsx +58 -0
- package/templates/scaffold/app/frontend/src/components/composed/empty-state.tsx +26 -0
- package/templates/scaffold/app/frontend/src/components/composed/error-fallback.tsx +28 -0
- package/templates/scaffold/app/frontend/src/components/composed/loading.tsx +13 -0
- package/templates/scaffold/app/frontend/src/components/ui/badge.tsx +39 -0
- package/templates/scaffold/app/frontend/src/components/ui/button.tsx +60 -0
- package/templates/scaffold/app/frontend/src/components/ui/card.tsx +75 -0
- package/templates/scaffold/app/frontend/src/components/ui/form.tsx +152 -0
- package/templates/scaffold/app/frontend/src/components/ui/input.tsx +21 -0
- package/templates/scaffold/app/frontend/src/components/ui/label.tsx +21 -0
- package/templates/scaffold/app/frontend/src/components/ui/spinner.tsx +16 -0
- package/templates/scaffold/app/frontend/src/components/ui/table.tsx +90 -0
- package/templates/scaffold/app/frontend/src/graphql/generated/graphql-env.d.ts +103 -0
- package/templates/scaffold/app/frontend/src/graphql/generated/schema.graphql +1235 -0
- package/templates/scaffold/app/frontend/src/graphql/index.ts +15 -0
- package/templates/scaffold/app/frontend/src/index.css +5 -0
- package/templates/scaffold/app/frontend/src/lib/auth-client.ts +17 -0
- package/templates/scaffold/app/frontend/src/lib/utils.ts +6 -0
- package/templates/scaffold/app/frontend/src/main.tsx +10 -0
- package/templates/scaffold/app/frontend/src/pages/page.tsx +20 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/page.tsx +97 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-detail.tsx +58 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/page.tsx +51 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/components/users-table.tsx +101 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +99 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/page.tsx +61 -0
- package/templates/scaffold/app/frontend/src/providers/graphql-provider.tsx +21 -0
- package/templates/scaffold/app/frontend/tsconfig.app.json +35 -0
- package/templates/scaffold/app/frontend/tsconfig.json +16 -0
- package/templates/scaffold/app/frontend/tsconfig.node.json +23 -0
- package/templates/scaffold/app/frontend/vite.config.ts +23 -0
- package/templates/scaffold/module/command/.gitkeep +0 -0
- package/templates/scaffold/module/db/.gitkeep +0 -0
- package/templates/scaffold/module/executor/.gitkeep +0 -0
- package/templates/scaffold/module/generated/.gitkeep +0 -0
- package/templates/scaffold/module/index.ts +2 -0
- package/templates/scaffold/module/lib/errors.ts +1 -0
- package/templates/scaffold/module/lib/types.ts +4 -0
- package/templates/scaffold/module/module.ts +7 -0
- package/templates/scaffold/module/permissions.ts +3 -0
- package/templates/scaffold/module/query/.gitkeep +0 -0
- package/templates/scaffold/module/tailor.config.ts +13 -0
- package/templates/scaffold/module/testing/fixtures.ts +1 -0
- package/templates/workflows/erp-kit-check.yml +37 -0
- package/dist/cli.js +0 -1654
- package/skills/erp-kit-app-1-requirements/references/structure.md +0 -27
- package/skills/erp-kit-app-2-breakdown/SKILL.md +0 -95
- package/skills/erp-kit-app-2-breakdown/references/screen-detailview.md +0 -106
- package/skills/erp-kit-app-2-breakdown/references/screen-form.md +0 -139
- package/skills/erp-kit-app-2-breakdown/references/screen-listview.md +0 -153
- package/skills/erp-kit-app-2-breakdown/references/structure.md +0 -27
- package/skills/erp-kit-app-3-doc-review/SKILL.md +0 -116
- package/skills/erp-kit-app-3-doc-review/references/structure.md +0 -27
- package/skills/erp-kit-app-4-design/SKILL.md +0 -256
- package/skills/erp-kit-app-4-design/references/component.md +0 -50
- package/skills/erp-kit-app-4-design/references/screen-detailview.md +0 -106
- package/skills/erp-kit-app-4-design/references/screen-form.md +0 -139
- package/skills/erp-kit-app-4-design/references/screen-listview.md +0 -153
- package/skills/erp-kit-app-4-design/references/structure.md +0 -27
- package/skills/erp-kit-app-5-design-review/SKILL.md +0 -290
- package/skills/erp-kit-app-5-design-review/references/component.md +0 -50
- package/skills/erp-kit-app-5-design-review/references/screen-detailview.md +0 -106
- package/skills/erp-kit-app-5-design-review/references/screen-form.md +0 -139
- package/skills/erp-kit-app-5-design-review/references/screen-listview.md +0 -153
- package/skills/erp-kit-app-6-impl-spec/SKILL.md +0 -127
- package/skills/erp-kit-app-6-impl-spec/references/auth.md +0 -72
- package/skills/erp-kit-app-6-impl-spec/references/structure.md +0 -27
- package/skills/erp-kit-module-1-docs/SKILL.md +0 -111
- package/skills/erp-kit-module-2-feature-breakdown/SKILL.md +0 -76
- package/skills/erp-kit-module-3-doc-review/SKILL.md +0 -294
- package/skills/erp-kit-module-4-tdd/SKILL.md +0 -94
- package/skills/erp-kit-module-4-tdd/references/exports.md +0 -8
- package/skills/erp-kit-module-5-impl-review/SKILL.md +0 -410
- package/src/commands/scaffold-templates.ts +0 -65
- package/src/modules/shared/index.ts +0 -1
- package/src/modules/user-management/command/logAuditEvent.generated.ts +0 -6
- package/src/modules/user-management/command/logAuditEvent.test.ts +0 -187
- package/src/modules/user-management/command/logAuditEvent.ts +0 -56
- package/src/modules/user-management/db/auditEvent.ts +0 -47
- package/src/modules/user-management/docs/commands/LogAuditEvent.md +0 -37
- package/src/modules/user-management/docs/features/audit-trail.md +0 -80
- package/src/modules/user-management/docs/models/AuditEvent.md +0 -36
- /package/skills/{erp-kit-module-2-feature-breakdown → erp-kit-module-3-plan}/references/naming.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/cross-module-dependency.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/db-relations.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/generated-code.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/models.md +0 -0
- /package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/commands.md +0 -0
- /package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/testing.md +0 -0
- /package/src/modules/{product-management → audit}/.gitkeep +0 -0
- /package/src/{modules/shared → shared}/createContext.test.ts +0 -0
- /package/src/{modules/shared → shared}/createContext.ts +0 -0
- /package/src/{modules/shared → shared}/definePermissions.test.ts +0 -0
- /package/src/{modules/shared → shared}/definePermissions.ts +0 -0
- /package/src/{modules/shared → shared}/defineQuery.test.ts +0 -0
- /package/src/{modules/shared → shared}/defineQuery.ts +0 -0
- /package/src/{modules/shared → shared}/entityTypes.ts +0 -0
- /package/src/{modules/shared → shared}/errors.ts +0 -0
- /package/src/{modules/shared → shared}/requirePermission.test.ts +0 -0
- /package/src/{modules/shared → shared}/requirePermission.ts +0 -0
- /package/src/{modules/shared → shared}/result.ts +0 -0
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: erp-kit-module-5-impl-review
|
|
3
|
-
description: Review implementation parity between documentation and code. Use when validating that TDD implementation (step 4) matches model docs, command docs, and test coverage requirements.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Implementation Parity Review Workflow
|
|
7
|
-
|
|
8
|
-
Review **implementation consistency** between documentation and actual code.
|
|
9
|
-
|
|
10
|
-
## Purpose
|
|
11
|
-
|
|
12
|
-
Verify that TDD implementation (models, commands, tests) properly implements what's documented in model docs and command docs.
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
Model Docs (Schema) →db/*.ts (Implementation)
|
|
16
|
-
↓ ↓
|
|
17
|
-
Fields createEntityType()
|
|
18
|
-
Relationships Foreign keys
|
|
19
|
-
State Transitions Status enums
|
|
20
|
-
|
|
21
|
-
Command Docs (Spec) →command/*.ts (Implementation)
|
|
22
|
-
↓ ↓
|
|
23
|
-
Business Rules Validation logic
|
|
24
|
-
Error Scenarios Error classes
|
|
25
|
-
Process Flows Branching logic
|
|
26
|
-
|
|
27
|
-
Command Docs (Spec) →command/*.test.ts (Tests)
|
|
28
|
-
↓ ↓
|
|
29
|
-
Process Flow branches Test cases
|
|
30
|
-
Error scenarios Error assertions
|
|
31
|
-
Idempotent paths Return existing tests
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## When to Use
|
|
35
|
-
|
|
36
|
-
- After TDD implementation (step 4), verify it matches documentation
|
|
37
|
-
- Before merging feature branches
|
|
38
|
-
- Quality check during code review
|
|
39
|
-
|
|
40
|
-
## Workflow
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
MODEL DOCS → MODEL CODE → COMMAND DOCS → COMMAND CODE → TESTS → COMPARE → REPORT
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Step-by-Step
|
|
47
|
-
|
|
48
|
-
### 1. Read Model Documentation
|
|
49
|
-
|
|
50
|
-
Read ALL model docs:
|
|
51
|
-
|
|
52
|
-
```
|
|
53
|
-
modules/<module-name>/docs/models/*.md
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
Extract for each model:
|
|
57
|
-
|
|
58
|
-
- Field names and types
|
|
59
|
-
- Required vs optional fields
|
|
60
|
-
- Relationships (foreign keys)
|
|
61
|
-
- State transitions (if stateful)
|
|
62
|
-
- Constraints
|
|
63
|
-
|
|
64
|
-
### 2. Read Model Implementation
|
|
65
|
-
|
|
66
|
-
Read ALL model files:
|
|
67
|
-
|
|
68
|
-
```
|
|
69
|
-
modules/<module-name>/db/*.ts
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
Extract for each model:
|
|
73
|
-
|
|
74
|
-
- Fields in `createEntityType()`
|
|
75
|
-
- Status enums (base + additional)
|
|
76
|
-
- Foreign key references
|
|
77
|
-
- Field descriptions
|
|
78
|
-
|
|
79
|
-
### 3. Read Command Documentation
|
|
80
|
-
|
|
81
|
-
Read ALL command docs:
|
|
82
|
-
|
|
83
|
-
```
|
|
84
|
-
modules/<module-name>/docs/commands/*.md
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
Extract for each command:
|
|
88
|
-
|
|
89
|
-
- Business rules
|
|
90
|
-
- Error scenarios (with codes)
|
|
91
|
-
- Process flow branches
|
|
92
|
-
- Input/output types
|
|
93
|
-
|
|
94
|
-
### 4. Read Command Implementation
|
|
95
|
-
|
|
96
|
-
Read ALL command files:
|
|
97
|
-
|
|
98
|
-
```
|
|
99
|
-
modules/<module-name>/command/*.ts
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
Extract for each command:
|
|
103
|
-
|
|
104
|
-
- Validation logic implemented
|
|
105
|
-
- Error classes returned via Result
|
|
106
|
-
- Branching paths (if/else, early returns)
|
|
107
|
-
- Input interface fields
|
|
108
|
-
- Return type structure
|
|
109
|
-
|
|
110
|
-
### 5. Read Error Implementation
|
|
111
|
-
|
|
112
|
-
Read generated error definitions:
|
|
113
|
-
|
|
114
|
-
```
|
|
115
|
-
modules/<module-name>/lib/errors.generated.ts
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
Extract:
|
|
119
|
-
|
|
120
|
-
- Error class names (generated from doc error codes)
|
|
121
|
-
- Error codes
|
|
122
|
-
- Error message patterns
|
|
123
|
-
|
|
124
|
-
### 6. Read Test Implementation
|
|
125
|
-
|
|
126
|
-
Read ALL test files:
|
|
127
|
-
|
|
128
|
-
```
|
|
129
|
-
modules/<module-name>/command/*.test.ts
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
Extract for each command:
|
|
133
|
-
|
|
134
|
-
- Test case descriptions
|
|
135
|
-
- Error assertions
|
|
136
|
-
- Happy path coverage
|
|
137
|
-
- Edge case coverage
|
|
138
|
-
|
|
139
|
-
### 7. Model Doc → Model Code Parity Check
|
|
140
|
-
|
|
141
|
-
| Check Item | Question |
|
|
142
|
-
| ------------------ | ---------------------------------------------------------------- |
|
|
143
|
-
| Field coverage | Does code include all fields from model doc? |
|
|
144
|
-
| Type accuracy | Do field types match doc specification? |
|
|
145
|
-
| Required fields | Are required fields enforced (no default, not nullable)? |
|
|
146
|
-
| Relationship impl | Are foreign key fields implemented for documented relationships? |
|
|
147
|
-
| State transitions | Does status enum include all documented states? |
|
|
148
|
-
| Field descriptions | Do `.description()` calls match doc field descriptions? |
|
|
149
|
-
|
|
150
|
-
### 8. Command Doc → Command Code Parity Check
|
|
151
|
-
|
|
152
|
-
| Check Item | Question |
|
|
153
|
-
| ----------------------- | ----------------------------------------------------------- |
|
|
154
|
-
| Business rule impl | Is each documented business rule implemented in code? |
|
|
155
|
-
| Error scenario coverage | Does code return errors for all documented error scenarios? |
|
|
156
|
-
| Error code accuracy | Do error codes in code match documented codes? |
|
|
157
|
-
| Process flow alignment | Do code branches match documented process flow? |
|
|
158
|
-
| Input type coverage | Does input interface include all documented inputs? |
|
|
159
|
-
| Return type accuracy | Does return type match documented output? |
|
|
160
|
-
| Generated shell pattern | Does command export `run` with a `.generated.ts` shell? |
|
|
161
|
-
|
|
162
|
-
### 9. Command Doc → Test Coverage Check
|
|
163
|
-
|
|
164
|
-
| Check Item | Question |
|
|
165
|
-
| --------------------- | ---------------------------------------------------------- |
|
|
166
|
-
| Process flow coverage | Does each branch in process flow have a test case? |
|
|
167
|
-
| Error scenario tests | Does each documented error scenario have a test assertion? |
|
|
168
|
-
| Happy path tests | Are success paths tested? |
|
|
169
|
-
| Idempotent path tests | If doc shows "already exists → return", is this tested? |
|
|
170
|
-
|
|
171
|
-
### 10. Report Findings
|
|
172
|
-
|
|
173
|
-
```markdown
|
|
174
|
-
## Implementation Parity Review Report
|
|
175
|
-
|
|
176
|
-
**Module:** <module-name>
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
### 1. Model Doc → Model Code Coverage
|
|
181
|
-
|
|
182
|
-
| Model Doc | Fields Documented | Fields Implemented | Gap |
|
|
183
|
-
| --------- | ----------------- | ------------------ | ------------------- |
|
|
184
|
-
| <Model-A> | N fields | N fields | ✅ |
|
|
185
|
-
| <Model-B> | N fields | N-1 fields | ❌ `fieldX` missing |
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
### 2. Model State Transitions
|
|
190
|
-
|
|
191
|
-
| Model | Documented States | Implemented States | Gap |
|
|
192
|
-
| --------- | ------------------------ | ------------------ | ------------------ |
|
|
193
|
-
| <Model-A> | PENDING, ACTIVE, REMOVED | PENDING, ACTIVE | ❌ REMOVED missing |
|
|
194
|
-
| <Model-B> | ACTIVE, INACTIVE | ACTIVE, INACTIVE | ✅ |
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
### 3. Command Doc → Command Code Coverage
|
|
199
|
-
|
|
200
|
-
| Command Doc | Business Rules | Implemented | Gap |
|
|
201
|
-
| ----------- | -------------- | ----------- | -------------------------------- |
|
|
202
|
-
| <cmd-a> | 3 rules | 3 rules | ✅ |
|
|
203
|
-
| <cmd-b> | 4 rules | 3 rules | ❌ "rule X validation" not found |
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
|
-
### 4. Error Scenario Implementation
|
|
208
|
-
|
|
209
|
-
| Command Doc | Error Code | Generated in errors.generated.ts | Returned in command | Test assertion |
|
|
210
|
-
| ----------- | ---------------- | -------------------------------- | ------------------- | -------------- |
|
|
211
|
-
| <cmd-a> | ENTITY_NOT_FOUND | ✅ EntityNotFoundError | ✅ | ✅ |
|
|
212
|
-
| <cmd-a> | INVALID_STATE | ❌ Not defined | ❌ | ❌ |
|
|
213
|
-
| <cmd-b> | DUPLICATE_ENTRY | ✅ DuplicateEntryError | ✅ | ❌ No test |
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
### 5. Process Flow → Test Coverage
|
|
218
|
-
|
|
219
|
-
| Command Doc | Process Flow Branches | Test Cases | Gap |
|
|
220
|
-
| ----------- | --------------------- | ---------- | -------------------------------- |
|
|
221
|
-
| <cmd-a> | 3 branches | 3 tests | ✅ |
|
|
222
|
-
| <cmd-b> | 4 branches | 2 tests | ❌ Missing "already exists" test |
|
|
223
|
-
|
|
224
|
-
---
|
|
225
|
-
|
|
226
|
-
### 6. Implementation Pattern Compliance
|
|
227
|
-
|
|
228
|
-
| Command | Generated Shell | Input Interface Exported | JSDoc Present |
|
|
229
|
-
| ------- | ------------------------- | ------------------------ | ------------- |
|
|
230
|
-
| <cmd-a> | ✅ `.generated.ts` exists | ✅ | ✅ |
|
|
231
|
-
| <cmd-b> | ❌ Missing shell | ✅ | ❌ |
|
|
232
|
-
|
|
233
|
-
---
|
|
234
|
-
|
|
235
|
-
### 7. Missing Implementation
|
|
236
|
-
|
|
237
|
-
#### Missing in Model Code
|
|
238
|
-
|
|
239
|
-
| Model Doc | Missing Item | Type | Doc Reference |
|
|
240
|
-
| --------- | ------------ | ------ | --------------------------- |
|
|
241
|
-
| <Model-A> | `fieldX` | Field | "fieldX: uuid, required" |
|
|
242
|
-
| <Model-A> | `REMOVED` | Status | State diagram shows REMOVED |
|
|
243
|
-
|
|
244
|
-
#### Missing in Command Code
|
|
245
|
-
|
|
246
|
-
| Command Doc | Missing Item | Type | Doc Reference |
|
|
247
|
-
| ----------- | ---------------- | ------------- | ------------------------ |
|
|
248
|
-
| <cmd-b> | validation for X | Business rule | "Rule: X must be unique" |
|
|
249
|
-
|
|
250
|
-
#### Missing Error Classes
|
|
251
|
-
|
|
252
|
-
| Command Doc | Error Code | Expected Class |
|
|
253
|
-
| ----------- | ------------- | ----------------- |
|
|
254
|
-
| <cmd-a> | INVALID_STATE | InvalidStateError |
|
|
255
|
-
|
|
256
|
-
#### Missing Tests
|
|
257
|
-
|
|
258
|
-
| Command Doc | Missing Test Case | Doc Reference |
|
|
259
|
-
| ----------- | -------------------------------- | --------------------- |
|
|
260
|
-
| <cmd-b> | "entity already exists → return" | Process flow branch 2 |
|
|
261
|
-
| <cmd-b> | "returns DUPLICATE_ENTRY" | Error scenario 3 |
|
|
262
|
-
|
|
263
|
-
---
|
|
264
|
-
|
|
265
|
-
### 8. Inconsistencies
|
|
266
|
-
|
|
267
|
-
| Type | Location | Issue |
|
|
268
|
-
| ------------------- | -------------- | ------------------------------------------- |
|
|
269
|
-
| Type mismatch | Model-A.fieldX | Doc: string, Code: number |
|
|
270
|
-
| Error code mismatch | cmd-a | Doc: USER_NOT_FOUND, Code: ENTITY_NOT_FOUND |
|
|
271
|
-
| Missing description | Model-B.fieldY | No `.description()` but doc has description |
|
|
272
|
-
|
|
273
|
-
---
|
|
274
|
-
|
|
275
|
-
### 9. Summary
|
|
276
|
-
|
|
277
|
-
| Aspect | Status | Details |
|
|
278
|
-
| ----------------------------- | ------ | --------------------------------- |
|
|
279
|
-
| Model Doc → Code Coverage | ⚠️ | X/Y models fully implemented |
|
|
280
|
-
| Command Doc → Code Coverage | ⚠️ | X/Y commands fully implemented |
|
|
281
|
-
| Error Scenario Implementation | ❌ | X/Y errors defined and returned |
|
|
282
|
-
| Test Coverage | ⚠️ | X/Y process branches have tests |
|
|
283
|
-
| Pattern Compliance | ✅ | All commands use generated shells |
|
|
284
|
-
|
|
285
|
-
### 10. Recommendations
|
|
286
|
-
|
|
287
|
-
1. **Add missing model fields:**
|
|
288
|
-
- Model-A: add `fieldX` field
|
|
289
|
-
|
|
290
|
-
2. **Add missing status values:**
|
|
291
|
-
- Model-A: add `REMOVED` to status enum
|
|
292
|
-
|
|
293
|
-
3. **Implement missing business rules:**
|
|
294
|
-
- cmd-b: add validation for "X must be unique"
|
|
295
|
-
|
|
296
|
-
4. **Define missing error classes:**
|
|
297
|
-
- Add `INVALID_STATE` error scenario to command doc + re-run `erp-kit module generate code`
|
|
298
|
-
|
|
299
|
-
5. **Add missing test cases:**
|
|
300
|
-
- cmd-b: test "entity already exists → return existing"
|
|
301
|
-
- cmd-b: test "throws DUPLICATE_ENTRY on duplicate"
|
|
302
|
-
|
|
303
|
-
6. **Fix inconsistencies:**
|
|
304
|
-
- Model-A.fieldX: change type to string per doc
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
## Common Gaps
|
|
308
|
-
|
|
309
|
-
### Model Doc → Model Code
|
|
310
|
-
|
|
311
|
-
- **Missing fields**: Doc specifies field but not in code
|
|
312
|
-
- **Type mismatches**: Doc says string, code uses number
|
|
313
|
-
- **Missing status values**: State diagram shows state not in enum
|
|
314
|
-
- **Missing relationships**: Doc shows FK but not implemented
|
|
315
|
-
- **Missing descriptions**: Doc has field description but no `.description()`
|
|
316
|
-
|
|
317
|
-
### Command Doc → Command Code
|
|
318
|
-
|
|
319
|
-
- **Unimplemented business rules**: Rule in doc but no validation code
|
|
320
|
-
- **Missing error returns**: Error scenario documented but not returned
|
|
321
|
-
- **Wrong error codes**: Code and doc use different error codes
|
|
322
|
-
- **Missing process branches**: Flowchart branch not in code logic
|
|
323
|
-
- **Missing generated shell**: No `.generated.ts` file for command
|
|
324
|
-
|
|
325
|
-
### Command Doc → Tests
|
|
326
|
-
|
|
327
|
-
- **Uncovered process branches**: Flowchart branch has no test
|
|
328
|
-
- **Missing error tests**: Error scenario has no assertion
|
|
329
|
-
- **Missing idempotent tests**: "Return existing" path untested
|
|
330
|
-
- **Missing edge cases**: Boundary conditions not tested
|
|
331
|
-
|
|
332
|
-
## Quick Reference: Extraction Patterns
|
|
333
|
-
|
|
334
|
-
### From Model Docs
|
|
335
|
-
|
|
336
|
-
```markdown
|
|
337
|
-
## Fields
|
|
338
|
-
|
|
339
|
-
| Field | Type | Required |
|
|
340
|
-
| -------- | ------ | -------- | ---------------------------------------- |
|
|
341
|
-
| id | uuid | yes | → Check: field exists, type matches |
|
|
342
|
-
| name | string | yes | → Check: not nullable |
|
|
343
|
-
| status | enum | yes | → Check: enum values match state diagram |
|
|
344
|
-
| parentId | uuid | yes | → Check: foreign key implemented |
|
|
345
|
-
|
|
346
|
-
## State Diagram
|
|
347
|
-
|
|
348
|
-
PENDING → ACTIVE → REMOVED
|
|
349
|
-
→ Check: all states in enum
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
### From Command Docs
|
|
353
|
-
|
|
354
|
-
```markdown
|
|
355
|
-
## Business Rules
|
|
356
|
-
|
|
357
|
-
1. Entity must exist → Check: validation in code
|
|
358
|
-
2. Status must be ACTIVE → Check: status check in code
|
|
359
|
-
|
|
360
|
-
## Error Scenarios
|
|
361
|
-
|
|
362
|
-
| Code | Condition |
|
|
363
|
-
| -------------- | -------------- | ------------------------------------------ |
|
|
364
|
-
| NOT_FOUND | Entity missing | → Check: error class + return err() + test |
|
|
365
|
-
| INVALID_STATUS | Wrong status | → Check: error class + return err() + test |
|
|
366
|
-
|
|
367
|
-
## Process Flow (mermaid)
|
|
368
|
-
|
|
369
|
-
graph TD
|
|
370
|
-
A[Start] --> B{Exists?}
|
|
371
|
-
B -->|Yes| C[Return] → Check: test for "already exists"
|
|
372
|
-
B -->|No| D[Create] → Check: test for "create new"
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
### From Implementation
|
|
376
|
-
|
|
377
|
-
```typescript
|
|
378
|
-
// Model: check fields match doc
|
|
379
|
-
export function createEntityType(params) {
|
|
380
|
-
return {
|
|
381
|
-
fields: {
|
|
382
|
-
/* verify each field */
|
|
383
|
-
},
|
|
384
|
-
};
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// Command: check business rules (run function pattern)
|
|
388
|
-
export async function run(db, input, ctx) {
|
|
389
|
-
// Check: validation for each business rule
|
|
390
|
-
if (!entity) return err(new EntityNotFoundError()); // Check: matches doc error
|
|
391
|
-
// Check: each branch matches process flow
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// Generated shell: check it exists
|
|
395
|
-
// myCommand.generated.ts
|
|
396
|
-
export const myCommand = defineCommand(permissions.myCommand, run);
|
|
397
|
-
|
|
398
|
-
// Test: check coverage
|
|
399
|
-
describe("myCommand", () => {
|
|
400
|
-
it("creates entity when valid"); // Check: happy path
|
|
401
|
-
it("returns existing if found"); // Check: idempotent path
|
|
402
|
-
it("returns NOT_FOUND when missing"); // Check: error scenario
|
|
403
|
-
});
|
|
404
|
-
```
|
|
405
|
-
|
|
406
|
-
## References
|
|
407
|
-
|
|
408
|
-
- [Command patterns](references/commands.md)
|
|
409
|
-
- [Error patterns](references/errors.md)
|
|
410
|
-
- [Testing patterns](references/testing.md)
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
export type TemplateEntry =
|
|
2
|
-
| { type: "dir"; path: string }
|
|
3
|
-
| { type: "file"; path: string; content: (moduleName: string) => string };
|
|
4
|
-
|
|
5
|
-
export function getModuleSrcTemplates(): TemplateEntry[] {
|
|
6
|
-
return [
|
|
7
|
-
{ type: "dir", path: "db" },
|
|
8
|
-
{ type: "dir", path: "command" },
|
|
9
|
-
{ type: "dir", path: "executor" },
|
|
10
|
-
{ type: "dir", path: "generated" },
|
|
11
|
-
{ type: "dir", path: "query" },
|
|
12
|
-
{ type: "file", path: "module.ts", content: () => MODULE_TEMPLATE },
|
|
13
|
-
{ type: "file", path: "index.ts", content: () => INDEX_TEMPLATE },
|
|
14
|
-
{ type: "file", path: "permissions.ts", content: (n) => permissionsTemplate(n) },
|
|
15
|
-
{ type: "file", path: "tailor.config.ts", content: (n) => tailorConfigTemplate(n) },
|
|
16
|
-
{ type: "file", path: "lib/errors.ts", content: () => ERRORS_TEMPLATE },
|
|
17
|
-
{ type: "file", path: "lib/types.ts", content: () => TYPES_TEMPLATE },
|
|
18
|
-
{ type: "file", path: "testing/fixtures.ts", content: () => FIXTURES_TEMPLATE },
|
|
19
|
-
];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const MODULE_TEMPLATE = `export const defineModule = () => {
|
|
23
|
-
return {
|
|
24
|
-
db: {},
|
|
25
|
-
commands: {},
|
|
26
|
-
queries: {},
|
|
27
|
-
};
|
|
28
|
-
};
|
|
29
|
-
`;
|
|
30
|
-
|
|
31
|
-
const INDEX_TEMPLATE = `export { defineModule } from "./module";
|
|
32
|
-
export { permissions, own, all } from "./permissions";
|
|
33
|
-
`;
|
|
34
|
-
|
|
35
|
-
const ERRORS_TEMPLATE = `import { createDomainError } from "../../shared/internal";\n`;
|
|
36
|
-
|
|
37
|
-
const TYPES_TEMPLATE = `import type { InferSchema, Selectable, Insertable, Updateable } from "../../shared/internal";
|
|
38
|
-
import type { DB } from "../generated/kysely-tailordb";
|
|
39
|
-
|
|
40
|
-
export type Schema = InferSchema<DB>;
|
|
41
|
-
`;
|
|
42
|
-
|
|
43
|
-
const FIXTURES_TEMPLATE = `// Add test fixtures here\n`;
|
|
44
|
-
|
|
45
|
-
function permissionsTemplate(moduleName: string): string {
|
|
46
|
-
return `import { definePermissions } from "../shared/internal";
|
|
47
|
-
|
|
48
|
-
export const { permissions, own, all } = definePermissions("${moduleName}", [] as const);
|
|
49
|
-
`;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function tailorConfigTemplate(moduleName: string): string {
|
|
53
|
-
return `import { defineConfig, defineGenerators } from "@tailor-platform/sdk";
|
|
54
|
-
|
|
55
|
-
export default defineConfig({
|
|
56
|
-
name: "${moduleName}",
|
|
57
|
-
db: { "main-db": { files: [\`./db/*.ts\`] } },
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
export const generators = defineGenerators(
|
|
61
|
-
["@tailor-platform/kysely-type", { distPath: \`./generated/kysely-tailordb.ts\` }],
|
|
62
|
-
["@tailor-platform/enum-constants", { distPath: "./generated/enums.ts" }],
|
|
63
|
-
);
|
|
64
|
-
`;
|
|
65
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { createContext } from "./createContext";
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { type CommandContext } from "../../shared/internal";
|
|
3
|
-
import { createMockDb } from "../../testing/index";
|
|
4
|
-
import { DB } from "../generated/kysely-tailordb";
|
|
5
|
-
import { InvalidEventTypeError, MissingRequiredFieldError } from "../lib/errors.generated";
|
|
6
|
-
import { baseAuditEvent } from "../testing/fixtures";
|
|
7
|
-
import { run } from "./logAuditEvent";
|
|
8
|
-
|
|
9
|
-
describe("logAuditEvent", () => {
|
|
10
|
-
const ctx: CommandContext = {
|
|
11
|
-
actorId: "test-actor",
|
|
12
|
-
permissions: ["user-management:logAuditEvent"],
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
it("throws when actorId is empty", async () => {
|
|
16
|
-
const { db } = createMockDb<DB>();
|
|
17
|
-
|
|
18
|
-
const result = await run(
|
|
19
|
-
db,
|
|
20
|
-
{
|
|
21
|
-
eventType: "USER_CREATED",
|
|
22
|
-
actorId: "",
|
|
23
|
-
},
|
|
24
|
-
ctx,
|
|
25
|
-
);
|
|
26
|
-
expect(result.ok).toBe(false);
|
|
27
|
-
if (!result.ok) {
|
|
28
|
-
expect(result.error).toBeInstanceOf(MissingRequiredFieldError);
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it("throws when eventType is invalid", async () => {
|
|
33
|
-
const { db } = createMockDb<DB>();
|
|
34
|
-
|
|
35
|
-
const result = await run(
|
|
36
|
-
db,
|
|
37
|
-
{
|
|
38
|
-
eventType: "INVALID_EVENT" as "USER_CREATED",
|
|
39
|
-
actorId: "user-1",
|
|
40
|
-
},
|
|
41
|
-
ctx,
|
|
42
|
-
);
|
|
43
|
-
expect(result.ok).toBe(false);
|
|
44
|
-
if (!result.ok) {
|
|
45
|
-
expect(result.error).toBeInstanceOf(InvalidEventTypeError);
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it("creates audit event with minimal fields", async () => {
|
|
50
|
-
const { db, spies } = createMockDb<DB>();
|
|
51
|
-
const createdEvent = {
|
|
52
|
-
...baseAuditEvent,
|
|
53
|
-
id: "new-event-id",
|
|
54
|
-
eventType: "USER_CREATED" as const,
|
|
55
|
-
actorId: "user-1",
|
|
56
|
-
targetId: null,
|
|
57
|
-
targetType: null,
|
|
58
|
-
payload: null,
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
spies.insert.mockReturnValue(createdEvent);
|
|
62
|
-
|
|
63
|
-
const result = await run(
|
|
64
|
-
db,
|
|
65
|
-
{
|
|
66
|
-
eventType: "USER_CREATED",
|
|
67
|
-
actorId: "user-1",
|
|
68
|
-
},
|
|
69
|
-
ctx,
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
expect(result.ok).toBe(true);
|
|
73
|
-
if (result.ok) {
|
|
74
|
-
expect(result.value.auditEvent.eventType).toBe("USER_CREATED");
|
|
75
|
-
expect(result.value.auditEvent.actorId).toBe("user-1");
|
|
76
|
-
}
|
|
77
|
-
expect(spies.insert).toHaveBeenCalled();
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it("creates audit event with target info", async () => {
|
|
81
|
-
const { db, spies } = createMockDb<DB>();
|
|
82
|
-
const createdEvent = {
|
|
83
|
-
...baseAuditEvent,
|
|
84
|
-
id: "new-event-id",
|
|
85
|
-
eventType: "ROLE_ASSIGNED" as const,
|
|
86
|
-
actorId: "user-1",
|
|
87
|
-
targetId: "user-2",
|
|
88
|
-
targetType: "User",
|
|
89
|
-
payload: null,
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
spies.insert.mockReturnValue(createdEvent);
|
|
93
|
-
|
|
94
|
-
const result = await run(
|
|
95
|
-
db,
|
|
96
|
-
{
|
|
97
|
-
eventType: "ROLE_ASSIGNED",
|
|
98
|
-
actorId: "user-1",
|
|
99
|
-
targetId: "user-2",
|
|
100
|
-
targetType: "User",
|
|
101
|
-
},
|
|
102
|
-
ctx,
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
expect(result.ok).toBe(true);
|
|
106
|
-
if (result.ok) {
|
|
107
|
-
expect(result.value.auditEvent.eventType).toBe("ROLE_ASSIGNED");
|
|
108
|
-
expect(result.value.auditEvent.targetId).toBe("user-2");
|
|
109
|
-
expect(result.value.auditEvent.targetType).toBe("User");
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it("creates audit event with payload", async () => {
|
|
114
|
-
const { db, spies } = createMockDb<DB>();
|
|
115
|
-
const payload = JSON.stringify({ roleId: "role-1", userId: "user-2" });
|
|
116
|
-
const createdEvent = {
|
|
117
|
-
...baseAuditEvent,
|
|
118
|
-
id: "new-event-id",
|
|
119
|
-
eventType: "ROLE_ASSIGNED" as const,
|
|
120
|
-
actorId: "user-1",
|
|
121
|
-
targetId: "user-2",
|
|
122
|
-
targetType: "User",
|
|
123
|
-
payload,
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
spies.insert.mockReturnValue(createdEvent);
|
|
127
|
-
|
|
128
|
-
const result = await run(
|
|
129
|
-
db,
|
|
130
|
-
{
|
|
131
|
-
eventType: "ROLE_ASSIGNED",
|
|
132
|
-
actorId: "user-1",
|
|
133
|
-
targetId: "user-2",
|
|
134
|
-
targetType: "User",
|
|
135
|
-
payload,
|
|
136
|
-
},
|
|
137
|
-
ctx,
|
|
138
|
-
);
|
|
139
|
-
|
|
140
|
-
expect(result.ok).toBe(true);
|
|
141
|
-
if (result.ok) {
|
|
142
|
-
expect(result.value.auditEvent.payload).toBe(payload);
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
it("creates audit event for each valid event type", async () => {
|
|
147
|
-
const eventTypes = [
|
|
148
|
-
"USER_CREATED",
|
|
149
|
-
"USER_ACTIVATED",
|
|
150
|
-
"USER_DEACTIVATED",
|
|
151
|
-
"USER_REACTIVATED",
|
|
152
|
-
"ROLE_ASSIGNED",
|
|
153
|
-
"ROLE_REVOKED",
|
|
154
|
-
"PERMISSION_ASSIGNED",
|
|
155
|
-
"PERMISSION_REVOKED",
|
|
156
|
-
] as const;
|
|
157
|
-
|
|
158
|
-
for (const eventType of eventTypes) {
|
|
159
|
-
const { db, spies } = createMockDb<DB>();
|
|
160
|
-
const createdEvent = {
|
|
161
|
-
...baseAuditEvent,
|
|
162
|
-
id: "new-event-id",
|
|
163
|
-
eventType,
|
|
164
|
-
actorId: "user-1",
|
|
165
|
-
targetId: null,
|
|
166
|
-
targetType: null,
|
|
167
|
-
payload: null,
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
spies.insert.mockReturnValue(createdEvent);
|
|
171
|
-
|
|
172
|
-
const result = await run(
|
|
173
|
-
db,
|
|
174
|
-
{
|
|
175
|
-
eventType,
|
|
176
|
-
actorId: "user-1",
|
|
177
|
-
},
|
|
178
|
-
ctx,
|
|
179
|
-
);
|
|
180
|
-
|
|
181
|
-
expect(result.ok).toBe(true);
|
|
182
|
-
if (result.ok) {
|
|
183
|
-
expect(result.value.auditEvent.eventType).toBe(eventType);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
});
|