@tailor-platform/erp-kit 0.1.2 → 0.2.1
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 +80 -12
- package/dist/cli.js +1070 -450
- package/package.json +11 -8
- package/schemas/app-compose/business-flow.yml +3 -0
- package/schemas/app-compose/story.yml +1 -1
- package/schemas/module/model.yml +5 -0
- package/skills/{app-compose-1-requirement-analysis → erp-kit-app-1-requirements}/SKILL.md +8 -14
- package/skills/{app-compose-2-requirements-breakdown → erp-kit-app-2-breakdown}/SKILL.md +6 -13
- package/skills/{app-compose-3-doc-review → erp-kit-app-3-doc-review}/SKILL.md +2 -6
- package/skills/{app-compose-6-implementation-spec → erp-kit-app-4-impl-spec}/SKILL.md +11 -22
- package/skills/erp-kit-app-5-implementation/SKILL.md +149 -0
- package/skills/erp-kit-app-5-implementation/references/backend.md +232 -0
- package/skills/erp-kit-app-5-implementation/references/frontend.md +242 -0
- package/skills/{mock-scenario → erp-kit-mock-scenario}/SKILL.md +1 -1
- package/skills/{1-module-docs → erp-kit-module-1-docs}/SKILL.md +2 -2
- package/skills/{2-module-feature-breakdown → erp-kit-module-2-feature-breakdown}/SKILL.md +13 -9
- package/skills/erp-kit-module-2-feature-breakdown/references/naming.md +59 -0
- package/skills/{3-module-doc-review → erp-kit-module-3-doc-review}/SKILL.md +83 -25
- package/skills/erp-kit-module-4-tdd/SKILL.md +94 -0
- package/skills/erp-kit-module-4-tdd/references/cross-module-dependency.md +133 -0
- package/skills/{4-module-tdd-implementation → erp-kit-module-4-tdd}/references/db-relations.md +5 -1
- package/skills/{4-module-tdd-implementation → erp-kit-module-4-tdd}/references/exports.md +1 -1
- package/skills/erp-kit-module-4-tdd/references/generated-code.md +32 -0
- package/skills/{5-module-implementation-review → erp-kit-module-5-impl-review}/SKILL.md +46 -44
- package/skills/erp-kit-module-5-impl-review/references/commands.md +62 -0
- package/skills/erp-kit-module-5-impl-review/references/errors.md +10 -0
- package/skills/{5-module-implementation-review → erp-kit-module-5-impl-review}/references/testing.md +1 -1
- package/skills/erp-kit-module-shared/SKILL.md +16 -0
- package/skills/erp-kit-module-shared/references/commands.md +203 -0
- package/skills/erp-kit-module-shared/references/errors.md +35 -0
- package/skills/erp-kit-module-shared/references/queries.md +168 -0
- package/skills/erp-kit-module-shared/references/structure.md +36 -0
- package/skills/{3-module-doc-review → erp-kit-module-shared}/references/testing.md +4 -3
- package/skills/erp-kit-update/SKILL.md +64 -0
- package/src/cli.doc.test.ts +65 -0
- package/src/cli.ts +3 -35
- package/src/commands/app/index.ts +3 -3
- package/src/commands/check.test.ts +1 -1
- package/src/commands/check.ts +2 -2
- package/src/commands/index.ts +73 -0
- package/src/commands/init.test.ts +22 -5
- package/src/commands/init.ts +25 -16
- package/src/commands/license.ts +193 -0
- package/src/commands/mock/index.ts +2 -2
- package/src/commands/mock/start.ts +1 -1
- package/src/commands/mock/validate.test.ts +1 -1
- package/src/commands/module/generate.ts +35 -0
- package/src/commands/module/index.ts +6 -4
- package/src/commands/module/list.test.ts +7 -12
- package/src/commands/module/list.ts +1 -1
- package/src/commands/scaffold-templates.ts +65 -0
- package/src/commands/scaffold.test.ts +92 -2
- package/src/commands/scaffold.ts +22 -2
- package/src/commands/sync-check.test.ts +60 -1
- package/src/commands/sync-check.ts +35 -2
- package/src/generator/generate-code.test.ts +200 -0
- package/src/generator/generate-code.ts +260 -0
- package/src/generator/parse-command-doc.test.ts +159 -0
- package/src/generator/parse-command-doc.ts +116 -0
- package/src/integration.test.ts +2 -2
- package/src/module.ts +44 -6
- package/src/modules/item-management/README.md +38 -0
- package/src/modules/item-management/command/activateItem.generated.ts +6 -0
- package/src/modules/item-management/command/activateItem.test.ts +76 -0
- package/src/modules/item-management/command/activateItem.ts +42 -0
- package/src/modules/item-management/command/assignItemToTaxonomy.generated.ts +6 -0
- package/src/modules/item-management/command/assignItemToTaxonomy.test.ts +88 -0
- package/src/modules/item-management/command/assignItemToTaxonomy.ts +63 -0
- package/src/modules/item-management/command/createItem.generated.ts +6 -0
- package/src/modules/item-management/command/createItem.test.ts +152 -0
- package/src/modules/item-management/command/createItem.ts +72 -0
- package/src/modules/item-management/command/createTaxonomyNode.generated.ts +6 -0
- package/src/modules/item-management/command/createTaxonomyNode.test.ts +126 -0
- package/src/modules/item-management/command/createTaxonomyNode.ts +70 -0
- package/src/modules/item-management/command/deactivateItem.generated.ts +6 -0
- package/src/modules/item-management/command/deactivateItem.test.ts +76 -0
- package/src/modules/item-management/command/deactivateItem.ts +42 -0
- package/src/modules/item-management/command/deleteItem.generated.ts +6 -0
- package/src/modules/item-management/command/deleteItem.test.ts +61 -0
- package/src/modules/item-management/command/deleteItem.ts +38 -0
- package/src/modules/item-management/command/deleteTaxonomyNode.generated.ts +6 -0
- package/src/modules/item-management/command/deleteTaxonomyNode.test.ts +73 -0
- package/src/modules/item-management/command/deleteTaxonomyNode.ts +50 -0
- package/src/modules/item-management/command/moveTaxonomyNode.generated.ts +6 -0
- package/src/modules/item-management/command/moveTaxonomyNode.test.ts +136 -0
- package/src/modules/item-management/command/moveTaxonomyNode.ts +85 -0
- package/src/modules/item-management/command/reactivateItem.generated.ts +6 -0
- package/src/modules/item-management/command/reactivateItem.test.ts +76 -0
- package/src/modules/item-management/command/reactivateItem.ts +42 -0
- package/src/modules/item-management/command/removeItemFromTaxonomy.generated.ts +6 -0
- package/src/modules/item-management/command/removeItemFromTaxonomy.test.ts +43 -0
- package/src/modules/item-management/command/removeItemFromTaxonomy.ts +30 -0
- package/src/modules/item-management/command/updateItem.generated.ts +6 -0
- package/src/modules/item-management/command/updateItem.test.ts +178 -0
- package/src/modules/item-management/command/updateItem.ts +103 -0
- package/src/modules/item-management/command/updateTaxonomyNode.generated.ts +6 -0
- package/src/modules/item-management/command/updateTaxonomyNode.test.ts +88 -0
- package/src/modules/item-management/command/updateTaxonomyNode.ts +62 -0
- package/src/modules/item-management/db/item.ts +47 -0
- package/src/modules/item-management/db/itemTaxonomyAssignment.ts +49 -0
- package/src/modules/item-management/db/taxonomyNode.ts +34 -0
- package/src/modules/item-management/docs/commands/ActivateItem.md +32 -0
- package/src/modules/item-management/docs/commands/AssignItemToTaxonomy.md +38 -0
- package/src/modules/item-management/docs/commands/CreateItem.md +44 -0
- package/src/modules/item-management/docs/commands/CreateTaxonomyNode.md +44 -0
- package/src/modules/item-management/docs/commands/DeactivateItem.md +34 -0
- package/src/modules/item-management/docs/commands/DeleteItem.md +35 -0
- package/src/modules/item-management/docs/commands/DeleteTaxonomyNode.md +39 -0
- package/src/modules/item-management/docs/commands/MoveTaxonomyNode.md +45 -0
- package/src/modules/item-management/docs/commands/ReactivateItem.md +34 -0
- package/src/modules/item-management/docs/commands/RemoveItemFromTaxonomy.md +30 -0
- package/src/modules/item-management/docs/commands/UpdateItem.md +55 -0
- package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +36 -0
- package/src/modules/item-management/docs/features/item-lifecycle.md +60 -0
- package/src/modules/item-management/docs/features/item-taxonomy.md +65 -0
- package/src/modules/item-management/docs/models/ItemTaxonomyAssignment.md +36 -0
- package/src/modules/item-management/docs/models/TaxonomyNode.md +47 -0
- package/src/modules/item-management/docs/models/item.md +59 -0
- package/src/modules/item-management/docs/queries/CalculateNodeDepth.md +36 -0
- package/src/modules/item-management/docs/queries/CalculateSubtreeDepth.md +40 -0
- package/src/modules/item-management/docs/queries/DetectCircularReference.md +41 -0
- package/src/modules/item-management/docs/queries/GetItem.md +38 -0
- package/src/modules/item-management/docs/queries/GetItemTaxonomyAssignment.md +29 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNode.md +35 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNodeAssignments.md +29 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNodeChildren.md +29 -0
- package/src/modules/item-management/generated/enums.ts +9 -0
- package/src/modules/item-management/generated/kysely-tailordb.ts +62 -0
- package/src/modules/item-management/index.ts +53 -0
- package/src/modules/item-management/lib/_db_deps.ts +13 -0
- package/src/modules/item-management/lib/errors.generated.ts +117 -0
- package/src/modules/item-management/lib/permissions.generated.ts +17 -0
- package/src/modules/item-management/lib/types.ts +19 -0
- package/src/modules/item-management/module.ts +97 -0
- package/src/modules/item-management/query/calculateNodeDepth.generated.ts +5 -0
- package/src/modules/item-management/query/calculateNodeDepth.test.ts +56 -0
- package/src/modules/item-management/query/calculateNodeDepth.ts +28 -0
- package/src/modules/item-management/query/calculateSubtreeDepth.generated.ts +5 -0
- package/src/modules/item-management/query/calculateSubtreeDepth.test.ts +75 -0
- package/src/modules/item-management/query/calculateSubtreeDepth.ts +29 -0
- package/src/modules/item-management/query/detectCircularReference.generated.ts +5 -0
- package/src/modules/item-management/query/detectCircularReference.test.ts +61 -0
- package/src/modules/item-management/query/detectCircularReference.ts +32 -0
- package/src/modules/item-management/query/getItem.generated.ts +5 -0
- package/src/modules/item-management/query/getItem.test.ts +67 -0
- package/src/modules/item-management/query/getItem.ts +20 -0
- package/src/modules/item-management/query/getItemTaxonomyAssignment.generated.ts +5 -0
- package/src/modules/item-management/query/getItemTaxonomyAssignment.test.ts +25 -0
- package/src/modules/item-management/query/getItemTaxonomyAssignment.ts +18 -0
- package/src/modules/item-management/query/getTaxonomyNode.generated.ts +5 -0
- package/src/modules/item-management/query/getTaxonomyNode.test.ts +47 -0
- package/src/modules/item-management/query/getTaxonomyNode.ts +18 -0
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.generated.ts +5 -0
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.test.ts +25 -0
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.ts +16 -0
- package/src/modules/item-management/query/getTaxonomyNodeChildren.generated.ts +5 -0
- package/src/modules/item-management/query/getTaxonomyNodeChildren.test.ts +34 -0
- package/src/modules/item-management/query/getTaxonomyNodeChildren.ts +16 -0
- package/src/modules/item-management/tailor.config.ts +11 -0
- package/src/modules/item-management/testing/fixtures.ts +81 -0
- package/src/modules/primitives/command/activateCategory.generated.ts +6 -0
- package/src/modules/primitives/command/activateCategory.test.ts +11 -29
- package/src/modules/primitives/command/activateCategory.ts +27 -34
- package/src/modules/primitives/command/activateCurrency.generated.ts +6 -0
- package/src/modules/primitives/command/activateCurrency.test.ts +11 -29
- package/src/modules/primitives/command/activateCurrency.ts +27 -34
- package/src/modules/primitives/command/activateUnit.generated.ts +6 -0
- package/src/modules/primitives/command/activateUnit.test.ts +11 -15
- package/src/modules/primitives/command/activateUnit.ts +27 -34
- package/src/modules/primitives/command/createCategory.generated.ts +6 -0
- package/src/modules/primitives/command/createCategory.test.ts +27 -39
- package/src/modules/primitives/command/createCategory.ts +53 -62
- package/src/modules/primitives/command/createCurrency.generated.ts +6 -0
- package/src/modules/primitives/command/createCurrency.test.ts +78 -71
- package/src/modules/primitives/command/createCurrency.ts +43 -48
- package/src/modules/primitives/command/createExchangeRate.generated.ts +6 -0
- package/src/modules/primitives/command/createExchangeRate.test.ts +101 -100
- package/src/modules/primitives/command/createExchangeRate.ts +50 -59
- package/src/modules/primitives/command/createUnit.generated.ts +6 -0
- package/src/modules/primitives/command/createUnit.test.ts +92 -95
- package/src/modules/primitives/command/createUnit.ts +54 -57
- package/src/modules/primitives/command/deactivateCategory.generated.ts +6 -0
- package/src/modules/primitives/command/deactivateCategory.test.ts +27 -28
- package/src/modules/primitives/command/deactivateCategory.ts +43 -50
- package/src/modules/primitives/command/deactivateCurrency.generated.ts +6 -0
- package/src/modules/primitives/command/deactivateCurrency.test.ts +23 -38
- package/src/modules/primitives/command/deactivateCurrency.ts +31 -38
- package/src/modules/primitives/command/deactivateUnit.generated.ts +6 -0
- package/src/modules/primitives/command/deactivateUnit.test.ts +27 -23
- package/src/modules/primitives/command/deactivateUnit.ts +39 -49
- package/src/modules/primitives/command/setBaseCurrency.generated.ts +6 -0
- package/src/modules/primitives/command/setBaseCurrency.test.ts +40 -33
- package/src/modules/primitives/command/setBaseCurrency.ts +43 -50
- package/src/modules/primitives/command/setReferenceUnit.generated.ts +6 -0
- package/src/modules/primitives/command/setReferenceUnit.test.ts +39 -35
- package/src/modules/primitives/command/setReferenceUnit.ts +46 -59
- package/src/modules/primitives/db/unit.ts +13 -3
- package/src/modules/primitives/docs/commands/ActivateCategory.md +1 -2
- package/src/modules/primitives/docs/commands/ActivateCurrency.md +1 -2
- package/src/modules/primitives/docs/commands/ActivateUnit.md +1 -2
- package/src/modules/primitives/docs/commands/CreateCategory.md +1 -4
- package/src/modules/primitives/docs/commands/CreateCurrency.md +3 -4
- package/src/modules/primitives/docs/commands/CreateExchangeRate.md +4 -5
- package/src/modules/primitives/docs/commands/CreateUnit.md +5 -5
- package/src/modules/primitives/docs/commands/DeactivateCategory.md +2 -3
- package/src/modules/primitives/docs/commands/DeactivateCurrency.md +2 -3
- package/src/modules/primitives/docs/commands/DeactivateUnit.md +2 -3
- package/src/modules/primitives/docs/commands/SetBaseCurrency.md +2 -3
- package/src/modules/primitives/docs/commands/SetReferenceUnit.md +2 -3
- package/src/modules/primitives/docs/queries/ConvertAmount.md +3 -5
- package/src/modules/primitives/docs/queries/ConvertQuantity.md +3 -5
- package/src/modules/primitives/docs/queries/GetBaseCurrency.md +32 -0
- package/src/modules/primitives/docs/queries/GetCurrency.md +36 -0
- package/src/modules/primitives/docs/queries/GetUnit.md +36 -0
- package/src/modules/primitives/docs/queries/GetUoMCategory.md +36 -0
- package/src/modules/primitives/docs/queries/ListUnitsByCategory.md +26 -0
- package/src/modules/primitives/generated/kysely-tailordb.ts +24 -45
- package/src/modules/primitives/index.ts +15 -4
- package/src/modules/primitives/lib/errors.generated.ts +112 -0
- package/src/modules/primitives/{permissions.ts → lib/permissions.generated.ts} +9 -8
- package/src/modules/primitives/module.ts +37 -27
- package/src/modules/primitives/query/convertAmount.generated.ts +5 -0
- package/src/modules/primitives/query/convertAmount.test.ts +2 -2
- package/src/modules/primitives/query/convertAmount.ts +27 -28
- package/src/modules/primitives/query/convertQuantity.generated.ts +5 -0
- package/src/modules/primitives/query/convertQuantity.test.ts +6 -2
- package/src/modules/primitives/query/convertQuantity.ts +49 -57
- package/src/modules/primitives/query/getBaseCurrency.generated.ts +5 -0
- package/src/modules/primitives/query/getBaseCurrency.test.ts +28 -0
- package/src/modules/primitives/query/getBaseCurrency.ts +16 -0
- package/src/modules/primitives/query/getCurrency.generated.ts +5 -0
- package/src/modules/primitives/query/getCurrency.test.ts +47 -0
- package/src/modules/primitives/query/getCurrency.ts +18 -0
- package/src/modules/primitives/query/getUnit.generated.ts +5 -0
- package/src/modules/primitives/query/getUnit.test.ts +47 -0
- package/src/modules/primitives/query/getUnit.ts +18 -0
- package/src/modules/primitives/query/getUoMCategory.generated.ts +5 -0
- package/src/modules/primitives/query/getUoMCategory.test.ts +47 -0
- package/src/modules/primitives/query/getUoMCategory.ts +18 -0
- package/src/modules/primitives/query/listUnitsByCategory.generated.ts +5 -0
- package/src/modules/primitives/query/listUnitsByCategory.ts +16 -0
- package/src/modules/primitives/tailor.config.ts +3 -3
- package/src/modules/shared/defineCommand.test.ts +23 -10
- package/src/modules/shared/defineCommand.ts +23 -10
- package/src/modules/shared/internal.ts +1 -0
- package/src/modules/shared/requirePermission.test.ts +22 -21
- package/src/modules/shared/requirePermission.ts +8 -2
- package/src/modules/shared/result.ts +12 -0
- package/src/modules/testing/index.ts +36 -11
- package/src/modules/user-management/command/activateUser.generated.ts +6 -0
- package/src/modules/user-management/command/activateUser.test.ts +27 -27
- package/src/modules/user-management/command/activateUser.ts +40 -48
- package/src/modules/user-management/command/assignPermissionToRole.generated.ts +6 -0
- package/src/modules/user-management/command/assignPermissionToRole.test.ts +42 -43
- package/src/modules/user-management/command/assignPermissionToRole.ts +59 -62
- package/src/modules/user-management/command/assignRoleToUser.generated.ts +6 -0
- package/src/modules/user-management/command/assignRoleToUser.test.ts +70 -63
- package/src/modules/user-management/command/assignRoleToUser.ts +63 -66
- package/src/modules/user-management/command/createPermission.generated.ts +6 -0
- package/src/modules/user-management/command/createPermission.test.ts +45 -38
- package/src/modules/user-management/command/createPermission.ts +42 -46
- package/src/modules/user-management/command/createRole.generated.ts +6 -0
- package/src/modules/user-management/command/createRole.test.ts +30 -29
- package/src/modules/user-management/command/createRole.ts +33 -33
- package/src/modules/user-management/command/createUser.generated.ts +6 -0
- package/src/modules/user-management/command/createUser.test.ts +64 -42
- package/src/modules/user-management/command/createUser.ts +54 -56
- package/src/modules/user-management/command/deactivateUser.generated.ts +6 -0
- package/src/modules/user-management/command/deactivateUser.test.ts +27 -27
- package/src/modules/user-management/command/deactivateUser.ts +40 -48
- package/src/modules/user-management/command/logAuditEvent.generated.ts +6 -0
- package/src/modules/user-management/command/logAuditEvent.test.ts +50 -42
- package/src/modules/user-management/command/logAuditEvent.ts +25 -28
- package/src/modules/user-management/command/reactivateUser.generated.ts +6 -0
- package/src/modules/user-management/command/reactivateUser.test.ts +31 -27
- package/src/modules/user-management/command/reactivateUser.ts +40 -48
- package/src/modules/user-management/command/revokePermissionFromRole.generated.ts +6 -0
- package/src/modules/user-management/command/revokePermissionFromRole.test.ts +52 -51
- package/src/modules/user-management/command/revokePermissionFromRole.ts +60 -57
- package/src/modules/user-management/command/revokeRoleFromUser.generated.ts +6 -0
- package/src/modules/user-management/command/revokeRoleFromUser.test.ts +53 -48
- package/src/modules/user-management/command/revokeRoleFromUser.ts +58 -57
- package/src/modules/user-management/docs/commands/CreatePermission.md +2 -2
- package/src/modules/user-management/docs/commands/CreateRole.md +1 -1
- package/src/modules/user-management/generated/enums.ts +11 -11
- package/src/modules/user-management/generated/kysely-tailordb.ts +27 -56
- package/src/modules/user-management/index.ts +2 -2
- package/src/modules/user-management/lib/errors.generated.ts +67 -0
- package/src/modules/user-management/{permissions.ts → lib/permissions.generated.ts} +8 -7
- package/src/modules/user-management/module.ts +22 -22
- package/src/modules/user-management/tailor.config.ts +3 -3
- package/src/schemas.ts +1 -1
- package/skills/1-module-docs/references/structure.md +0 -22
- package/skills/2-module-feature-breakdown/references/commands.md +0 -48
- package/skills/2-module-feature-breakdown/references/structure.md +0 -22
- package/skills/3-module-doc-review/references/commands.md +0 -54
- package/skills/3-module-doc-review/references/models.md +0 -29
- package/skills/4-module-tdd-implementation/SKILL.md +0 -74
- package/skills/4-module-tdd-implementation/references/commands.md +0 -45
- package/skills/4-module-tdd-implementation/references/errors.md +0 -7
- package/skills/4-module-tdd-implementation/references/models.md +0 -30
- package/skills/4-module-tdd-implementation/references/structure.md +0 -22
- package/skills/4-module-tdd-implementation/references/testing.md +0 -37
- package/skills/5-module-implementation-review/references/commands.md +0 -45
- package/skills/5-module-implementation-review/references/errors.md +0 -7
- package/skills/5-module-implementation-review/references/exports.md +0 -8
- package/skills/5-module-implementation-review/references/models.md +0 -30
- package/skills/app-compose-1-requirement-analysis/references/structure.md +0 -27
- package/skills/app-compose-2-requirements-breakdown/references/screen-detailview.md +0 -106
- package/skills/app-compose-2-requirements-breakdown/references/screen-form.md +0 -139
- package/skills/app-compose-2-requirements-breakdown/references/screen-listview.md +0 -153
- package/skills/app-compose-2-requirements-breakdown/references/structure.md +0 -27
- package/skills/app-compose-3-doc-review/references/structure.md +0 -27
- package/skills/app-compose-4-design-mock/SKILL.md +0 -256
- package/skills/app-compose-4-design-mock/references/component.md +0 -50
- package/skills/app-compose-4-design-mock/references/screen-detailview.md +0 -106
- package/skills/app-compose-4-design-mock/references/screen-form.md +0 -139
- package/skills/app-compose-4-design-mock/references/screen-listview.md +0 -153
- package/skills/app-compose-4-design-mock/references/structure.md +0 -27
- package/skills/app-compose-5-design-mock-review/SKILL.md +0 -290
- package/skills/app-compose-5-design-mock-review/references/component.md +0 -50
- package/skills/app-compose-5-design-mock-review/references/screen-detailview.md +0 -106
- package/skills/app-compose-5-design-mock-review/references/screen-form.md +0 -139
- package/skills/app-compose-5-design-mock-review/references/screen-listview.md +0 -153
- package/skills/app-compose-6-implementation-spec/references/auth.md +0 -72
- package/skills/app-compose-6-implementation-spec/references/structure.md +0 -27
- package/src/modules/primitives/lib/errors.ts +0 -138
- package/src/modules/user-management/lib/errors.ts +0 -81
- /package/skills/{2-module-feature-breakdown → erp-kit-module-4-tdd}/references/models.md +0 -0
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
# ListView Screen Implementation
|
|
2
|
-
|
|
3
|
-
Implementation pattern for screens with `Screen Type: ListView`.
|
|
4
|
-
Assumes `page.md` and `component.md` rules.
|
|
5
|
-
|
|
6
|
-
## File Structure
|
|
7
|
-
|
|
8
|
-
```
|
|
9
|
-
{screen-path}/
|
|
10
|
-
├── components/
|
|
11
|
-
│ └── {screen-name}-table.tsx # Table component with fragments
|
|
12
|
-
└── page.tsx
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Page Component (page.tsx)
|
|
16
|
-
|
|
17
|
-
Data fetching and `Layout` must be co-located in the same page component.
|
|
18
|
-
Do NOT split into an inner Content component — `Layout` requires `Layout.Column` as direct children.
|
|
19
|
-
|
|
20
|
-
```tsx
|
|
21
|
-
const ResourcesQuery = graphql(
|
|
22
|
-
`
|
|
23
|
-
query Resources {
|
|
24
|
-
resources {
|
|
25
|
-
...ResourceTable
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
`,
|
|
29
|
-
[ResourceTableFragment],
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
const ResourcesPage = () => {
|
|
33
|
-
const [{ data, error, fetching }, reexecuteQuery] = useQuery({
|
|
34
|
-
query: ResourcesQuery,
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
if (fetching) return <Loading />;
|
|
38
|
-
|
|
39
|
-
if (error || !data) {
|
|
40
|
-
return (
|
|
41
|
-
<ErrorFallback
|
|
42
|
-
title="Failed to load resources"
|
|
43
|
-
message="An error occurred while fetching the list."
|
|
44
|
-
onReset={() => reexecuteQuery({ requestPolicy: "network-only" })}
|
|
45
|
-
/>
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return (
|
|
50
|
-
<Layout
|
|
51
|
-
columns={1}
|
|
52
|
-
title="Resources"
|
|
53
|
-
actions={[
|
|
54
|
-
<Button key="create" asChild>
|
|
55
|
-
<Link to="create">Create</Link>
|
|
56
|
-
</Button>,
|
|
57
|
-
]}
|
|
58
|
-
>
|
|
59
|
-
<Layout.Column>
|
|
60
|
-
<ResourceTable data={data.resources} />
|
|
61
|
-
</Layout.Column>
|
|
62
|
-
</Layout>
|
|
63
|
-
);
|
|
64
|
-
};
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## Table Component (components/{screen-name}-table.tsx)
|
|
68
|
-
|
|
69
|
-
### Fragment Collocation
|
|
70
|
-
|
|
71
|
-
Define a row fragment and a table fragment wrapping the Connection type.
|
|
72
|
-
|
|
73
|
-
```tsx
|
|
74
|
-
const ResourceRowFragment = graphql(`
|
|
75
|
-
fragment ResourceRow on Resource {
|
|
76
|
-
id
|
|
77
|
-
title
|
|
78
|
-
status
|
|
79
|
-
createdAt
|
|
80
|
-
}
|
|
81
|
-
`);
|
|
82
|
-
|
|
83
|
-
export const ResourceTableFragment = graphql(
|
|
84
|
-
`
|
|
85
|
-
fragment ResourceTable on ResourceConnection {
|
|
86
|
-
edges {
|
|
87
|
-
node {
|
|
88
|
-
...ResourceRow
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
`,
|
|
93
|
-
[ResourceRowFragment],
|
|
94
|
-
);
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### Row Component
|
|
98
|
-
|
|
99
|
-
```tsx
|
|
100
|
-
const ResourceRow = ({ resource: resourceFragment }: ResourceRowProps) => {
|
|
101
|
-
const resource = readFragment(ResourceRowFragment, resourceFragment);
|
|
102
|
-
return (
|
|
103
|
-
<TableRow>
|
|
104
|
-
<TableCell>{resource.title}</TableCell>
|
|
105
|
-
<TableCell>
|
|
106
|
-
<Badge variant={resource.status === "ACTIVE" ? "default" : "secondary"}>
|
|
107
|
-
{resource.status}
|
|
108
|
-
</Badge>
|
|
109
|
-
</TableCell>
|
|
110
|
-
<TableCell>
|
|
111
|
-
<Button variant="ghost" size="sm" asChild>
|
|
112
|
-
<Link to={resource.id}>View</Link>
|
|
113
|
-
</Button>
|
|
114
|
-
</TableCell>
|
|
115
|
-
</TableRow>
|
|
116
|
-
);
|
|
117
|
-
};
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### Empty State
|
|
121
|
-
|
|
122
|
-
```tsx
|
|
123
|
-
if (connection.edges.length === 0) {
|
|
124
|
-
return (
|
|
125
|
-
<EmptyState
|
|
126
|
-
title="No resources"
|
|
127
|
-
message="Get started by creating a new resource."
|
|
128
|
-
action={
|
|
129
|
-
<Button asChild>
|
|
130
|
-
<Link to="create">Create</Link>
|
|
131
|
-
</Button>
|
|
132
|
-
}
|
|
133
|
-
/>
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
## Column Property Mapping
|
|
139
|
-
|
|
140
|
-
| Property | Implementation |
|
|
141
|
-
| --------------- | ----------------------------------------------------------- |
|
|
142
|
-
| Hideable: Yes | Column visibility state to toggle show/hide |
|
|
143
|
-
| Sortable: Yes | Sort icon on `<TableHead>` + onClick to toggle query vars |
|
|
144
|
-
| Filterable: Yes | Filter UI above table (`<Select />`) |
|
|
145
|
-
| Searchable: Yes | Search input above table (`<Input placeholder="Search" />`) |
|
|
146
|
-
|
|
147
|
-
## Key Points
|
|
148
|
-
|
|
149
|
-
- Use `<Badge />` for status columns
|
|
150
|
-
- Format dates with `toLocaleDateString()`
|
|
151
|
-
- Use `<EmptyState />` with Create action for empty lists
|
|
152
|
-
- Add a View button per row to navigate to the detail page
|
|
153
|
-
- Iterate data using Connection type `edges.node` pattern
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# Backend Auth Configuration
|
|
2
|
-
|
|
3
|
-
Use Tailor SDK auth resources as the default pattern for backend authentication setup.
|
|
4
|
-
|
|
5
|
-
## Standard Auth Shape
|
|
6
|
-
|
|
7
|
-
In `tailor.config.ts`:
|
|
8
|
-
|
|
9
|
-
- Define IdP with `defineIdp(...)`
|
|
10
|
-
- Define Auth with `defineAuth(...)`
|
|
11
|
-
- Define static website with `defineStaticWebSite(...)` when frontend is deployed as static hosting
|
|
12
|
-
- Wire `idProvider` via `idp.provider(...)`
|
|
13
|
-
- Set exactly one OAuth2 client for frontend login (default client name: `default`)
|
|
14
|
-
- Export config with `auth: auth` and `idp: [idp]`
|
|
15
|
-
- Include static website URL in CORS when using deployed frontend (for example, `cors: ["http://localhost:5173", website.url]`)
|
|
16
|
-
|
|
17
|
-
Prefer this stable naming unless there is a clear reason to change:
|
|
18
|
-
|
|
19
|
-
- Auth name: `default`
|
|
20
|
-
- IdP name: `default`
|
|
21
|
-
- OAuth2 client name: `default`
|
|
22
|
-
|
|
23
|
-
## User Mapping
|
|
24
|
-
|
|
25
|
-
Use `userProfile` to map authenticated identities to the application user type.
|
|
26
|
-
|
|
27
|
-
- `type`: module-provided user type
|
|
28
|
-
- `usernameField`: stable unique field (for example, `email`)
|
|
29
|
-
- `attributes`: explicitly list required attributes
|
|
30
|
-
|
|
31
|
-
Avoid implicit attribute assumptions.
|
|
32
|
-
|
|
33
|
-
## CORS for Static Website Login
|
|
34
|
-
|
|
35
|
-
When frontend is deployed via `staticWebsites`, OAuth metadata and query calls are cross-origin from `https://<name>-<workspace>.web.erp.dev` to app backend.
|
|
36
|
-
|
|
37
|
-
- Always include the deployed static website origin via `website.url` in backend `cors`
|
|
38
|
-
- Keep local development origin in `cors` as well (for example, `http://localhost:5173`)
|
|
39
|
-
- If your template uses IP allow lists, set `allowedIpAddresses` appropriately for Tailor internal access
|
|
40
|
-
|
|
41
|
-
If `website.url` is missing from `cors`, login may fail with browser CORS errors before authentication starts.
|
|
42
|
-
|
|
43
|
-
## Seed Permission Alignment
|
|
44
|
-
|
|
45
|
-
Seeded login users in `seed/data/User.jsonl` must receive module permissions required by guarded commands/resolvers.
|
|
46
|
-
|
|
47
|
-
- Do not assume `ADMIN` is automatically privileged unless your permission evaluator explicitly supports it
|
|
48
|
-
- Grant concrete permission keys defined by the module (for example, `user-management:createUser`)
|
|
49
|
-
- Keep `User.jsonl` permissions aligned with the module currently wired in `src/modules.ts`
|
|
50
|
-
|
|
51
|
-
## Workspace and CLI Inputs
|
|
52
|
-
|
|
53
|
-
Use `TAILOR_PLATFORM_WORKSPACE_ID` in backend `.env` for CLI operations.
|
|
54
|
-
|
|
55
|
-
Required for non-interactive resource lookup and automation:
|
|
56
|
-
|
|
57
|
-
- `tailor-sdk oauth2client list`
|
|
58
|
-
- `tailor-sdk oauth2client get <name>`
|
|
59
|
-
|
|
60
|
-
Use `--env-file <backend/.env>` for deterministic command execution in local/dev scripts.
|
|
61
|
-
|
|
62
|
-
## OAuth Client ID Source of Truth
|
|
63
|
-
|
|
64
|
-
Frontend `VITE_TAILOR_CLIENT_ID` must come from backend-managed OAuth2 client data.
|
|
65
|
-
|
|
66
|
-
Canonical retrieval flow:
|
|
67
|
-
|
|
68
|
-
1. `tailor-sdk oauth2client get default --json`
|
|
69
|
-
2. Copy `clientId` from command output
|
|
70
|
-
3. Set it in frontend env
|
|
71
|
-
|
|
72
|
-
Do not hardcode OAuth client IDs in source code.
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# Application Directory Structure
|
|
2
|
-
|
|
3
|
-
```
|
|
4
|
-
{app_name}/
|
|
5
|
-
├── backend/
|
|
6
|
-
│ ├── src/
|
|
7
|
-
│ │ ├── modules.ts # Declaring module usage
|
|
8
|
-
│ │ ├── modules/
|
|
9
|
-
│ │ │ └── {module-name}/ # Module-specific directory
|
|
10
|
-
│ │ │ ├── resolvers/ # API Definition to expose graphql apis
|
|
11
|
-
│ │ │ └── executors/ # PubSub Automation (one file per declaration)
|
|
12
|
-
│ │ └── generated/ # Auto-generated code (do not edit)
|
|
13
|
-
│ └── tailor.config.ts # tailor application config
|
|
14
|
-
│
|
|
15
|
-
└── frontend/
|
|
16
|
-
└── src/
|
|
17
|
-
├── pages/ # File-based routing (auto-discovered by Vite plugin)
|
|
18
|
-
│ └── {page-path}/
|
|
19
|
-
│ ├── page.tsx
|
|
20
|
-
│ └── {page-path}/
|
|
21
|
-
│ ├── components/
|
|
22
|
-
│ └── page.tsx
|
|
23
|
-
├── components/
|
|
24
|
-
│ └── ui/ # Generic UI components
|
|
25
|
-
├── graphql/ # gql.tada settings
|
|
26
|
-
└── providers/ # react providers
|
|
27
|
-
```
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { createDomainError } from "../../shared/internal";
|
|
2
|
-
|
|
3
|
-
export const UoMCategoryNotFoundError = createDomainError(
|
|
4
|
-
"UoMCategoryNotFoundError",
|
|
5
|
-
"UOM_CATEGORY_NOT_FOUND",
|
|
6
|
-
(identifier: string) => `UoM category not found: ${identifier}`,
|
|
7
|
-
);
|
|
8
|
-
|
|
9
|
-
export const UnitNotFoundError = createDomainError(
|
|
10
|
-
"UnitNotFoundError",
|
|
11
|
-
"UNIT_NOT_FOUND",
|
|
12
|
-
(symbol: string) => `Unit not found: ${symbol}`,
|
|
13
|
-
);
|
|
14
|
-
|
|
15
|
-
export const IncompatibleUnitsError = createDomainError(
|
|
16
|
-
"IncompatibleUnitsError",
|
|
17
|
-
"INCOMPATIBLE_UNITS",
|
|
18
|
-
(sourceSymbol: string, targetSymbol: string) =>
|
|
19
|
-
`Cannot convert between incompatible units: ${sourceSymbol} and ${targetSymbol} belong to different categories`,
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
export const InactiveUnitError = createDomainError(
|
|
23
|
-
"InactiveUnitError",
|
|
24
|
-
"INACTIVE_UNIT",
|
|
25
|
-
(symbol: string) => `Unit is inactive: ${symbol}`,
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
export const CurrencyNotFoundError = createDomainError(
|
|
29
|
-
"CurrencyNotFoundError",
|
|
30
|
-
"CURRENCY_NOT_FOUND",
|
|
31
|
-
(code: string) => `Currency not found: ${code}`,
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
export const InactiveCurrencyError = createDomainError(
|
|
35
|
-
"InactiveCurrencyError",
|
|
36
|
-
"INACTIVE_CURRENCY",
|
|
37
|
-
(code: string) => `Currency is inactive: ${code}`,
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
export const ExchangeRateNotFoundError = createDomainError(
|
|
41
|
-
"ExchangeRateNotFoundError",
|
|
42
|
-
"EXCHANGE_RATE_NOT_FOUND",
|
|
43
|
-
(sourceCode: string, targetCode: string, date: string) =>
|
|
44
|
-
`No exchange rate found for ${sourceCode} to ${targetCode} on or before ${date}`,
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
export const CannotDeactivateReferenceUnitError = createDomainError(
|
|
48
|
-
"CannotDeactivateReferenceUnitError",
|
|
49
|
-
"CANNOT_DEACTIVATE_REFERENCE_UNIT",
|
|
50
|
-
(unitId: string) => `Cannot deactivate reference unit: ${unitId}. Change reference unit first.`,
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
export const CategoryNotActiveError = createDomainError(
|
|
54
|
-
"CategoryNotActiveError",
|
|
55
|
-
"CATEGORY_NOT_ACTIVE",
|
|
56
|
-
(categoryId: string) => `Category is not active: ${categoryId}`,
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
export const DuplicateUnitSymbolError = createDomainError(
|
|
60
|
-
"DuplicateUnitSymbolError",
|
|
61
|
-
"DUPLICATE_UNIT_SYMBOL",
|
|
62
|
-
(symbol: string, categoryId: string) =>
|
|
63
|
-
`Unit with symbol "${symbol}" already exists in category ${categoryId}`,
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
export const InvalidConversionFactorError = createDomainError(
|
|
67
|
-
"InvalidConversionFactorError",
|
|
68
|
-
"INVALID_CONVERSION_FACTOR",
|
|
69
|
-
(factor: number) => `Conversion factor must be positive: ${factor}`,
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
export const InvalidRoundingPrecisionError = createDomainError(
|
|
73
|
-
"InvalidRoundingPrecisionError",
|
|
74
|
-
"INVALID_ROUNDING_PRECISION",
|
|
75
|
-
(precision: number) => `Rounding precision must be non-negative: ${precision}`,
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
export const DuplicateCategoryNameError = createDomainError(
|
|
79
|
-
"DuplicateCategoryNameError",
|
|
80
|
-
"DUPLICATE_CATEGORY_NAME",
|
|
81
|
-
(name: string) => `Category with name "${name}" already exists`,
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
export const CategoryHasActiveUnitsError = createDomainError(
|
|
85
|
-
"CategoryHasActiveUnitsError",
|
|
86
|
-
"CATEGORY_HAS_ACTIVE_UNITS",
|
|
87
|
-
(categoryId: string) => `Cannot deactivate category ${categoryId}: has active units`,
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
export const UnitNotInCategoryError = createDomainError(
|
|
91
|
-
"UnitNotInCategoryError",
|
|
92
|
-
"UNIT_NOT_IN_CATEGORY",
|
|
93
|
-
(unitId: string, categoryId: string) =>
|
|
94
|
-
`Unit ${unitId} does not belong to category ${categoryId}`,
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
export const InvalidISOCodeError = createDomainError(
|
|
98
|
-
"InvalidISOCodeError",
|
|
99
|
-
"INVALID_ISO_CODE",
|
|
100
|
-
(code: string) => `Invalid ISO 4217 code: "${code}". Must be exactly 3 uppercase letters.`,
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
export const DuplicateCurrencyCodeError = createDomainError(
|
|
104
|
-
"DuplicateCurrencyCodeError",
|
|
105
|
-
"DUPLICATE_CURRENCY_CODE",
|
|
106
|
-
(code: string) => `Currency with code "${code}" already exists`,
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
export const InvalidDecimalPlacesError = createDomainError(
|
|
110
|
-
"InvalidDecimalPlacesError",
|
|
111
|
-
"INVALID_DECIMAL_PLACES",
|
|
112
|
-
(decimalPlaces: number) => `Decimal places must be between 0 and 4: ${decimalPlaces}`,
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
export const CannotDeactivateBaseCurrencyError = createDomainError(
|
|
116
|
-
"CannotDeactivateBaseCurrencyError",
|
|
117
|
-
"CANNOT_DEACTIVATE_BASE_CURRENCY",
|
|
118
|
-
(currencyId: string) =>
|
|
119
|
-
`Cannot deactivate base currency: ${currencyId}. Change base currency first.`,
|
|
120
|
-
);
|
|
121
|
-
|
|
122
|
-
export const CannotSetInactiveAsBaseCurrencyError = createDomainError(
|
|
123
|
-
"CannotSetInactiveAsBaseCurrencyError",
|
|
124
|
-
"CANNOT_SET_INACTIVE_AS_BASE_CURRENCY",
|
|
125
|
-
(currencyId: string) => `Cannot set inactive currency as base: ${currencyId}. Activate it first.`,
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
export const SameCurrencyPairError = createDomainError(
|
|
129
|
-
"SameCurrencyPairError",
|
|
130
|
-
"SAME_CURRENCY_PAIR",
|
|
131
|
-
(currencyId: string) => `Source and target currency cannot be the same: ${currencyId}`,
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
export const InvalidExchangeRateError = createDomainError(
|
|
135
|
-
"InvalidExchangeRateError",
|
|
136
|
-
"INVALID_EXCHANGE_RATE",
|
|
137
|
-
(rate: number) => `Exchange rate must be positive: ${rate}`,
|
|
138
|
-
);
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { createDomainError } from "../../shared/internal";
|
|
2
|
-
|
|
3
|
-
export const UserNotFoundError = createDomainError(
|
|
4
|
-
"UserNotFoundError",
|
|
5
|
-
"USER_NOT_FOUND",
|
|
6
|
-
(userId: string) => `User not found: ${userId}`,
|
|
7
|
-
);
|
|
8
|
-
|
|
9
|
-
export const UserAlreadyExistsError = createDomainError(
|
|
10
|
-
"UserAlreadyExistsError",
|
|
11
|
-
"USER_ALREADY_EXISTS",
|
|
12
|
-
(email: string) => `User with email "${email}" already exists`,
|
|
13
|
-
);
|
|
14
|
-
|
|
15
|
-
export const UserNotActiveError = createDomainError(
|
|
16
|
-
"UserNotActiveError",
|
|
17
|
-
"USER_NOT_ACTIVE",
|
|
18
|
-
(userId: string, status: string) => `User ${userId} is not active (current status: ${status})`,
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
export const InvalidEmailError = createDomainError(
|
|
22
|
-
"InvalidEmailError",
|
|
23
|
-
"INVALID_EMAIL",
|
|
24
|
-
(email: string) => `Invalid email format: ${email}`,
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
export const MissingRequiredFieldError = createDomainError(
|
|
28
|
-
"MissingRequiredFieldError",
|
|
29
|
-
"MISSING_REQUIRED_FIELD",
|
|
30
|
-
(field: string) => `Missing required field: ${field}`,
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
export const InvalidStatusTransitionError = createDomainError(
|
|
34
|
-
"InvalidStatusTransitionError",
|
|
35
|
-
"INVALID_STATUS_TRANSITION",
|
|
36
|
-
(currentStatus: string, targetStatus: string) =>
|
|
37
|
-
`Invalid status transition from ${currentStatus} to ${targetStatus}`,
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
export const PermissionNotFoundError = createDomainError(
|
|
41
|
-
"PermissionNotFoundError",
|
|
42
|
-
"PERMISSION_NOT_FOUND",
|
|
43
|
-
(permissionId: string) => `Permission not found: ${permissionId}`,
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
export const DuplicatePermissionKeyError = createDomainError(
|
|
47
|
-
"DuplicatePermissionKeyError",
|
|
48
|
-
"DUPLICATE_PERMISSION_KEY",
|
|
49
|
-
(key: string) => `Permission with key "${key}" already exists`,
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
export const InvalidPermissionKeyFormatError = createDomainError(
|
|
53
|
-
"InvalidPermissionKeyFormatError",
|
|
54
|
-
"INVALID_PERMISSION_KEY_FORMAT",
|
|
55
|
-
(key: string) => `Invalid permission key format: "${key}". Expected format: resource:action`,
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
export const RoleNotFoundError = createDomainError(
|
|
59
|
-
"RoleNotFoundError",
|
|
60
|
-
"ROLE_NOT_FOUND",
|
|
61
|
-
(roleId: string) => `Role not found: ${roleId}`,
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
export const DuplicateRoleNameError = createDomainError(
|
|
65
|
-
"DuplicateRoleNameError",
|
|
66
|
-
"DUPLICATE_ROLE_NAME",
|
|
67
|
-
(name: string) => `Role with name "${name}" already exists`,
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
export const AssignmentNotFoundError = createDomainError(
|
|
71
|
-
"AssignmentNotFoundError",
|
|
72
|
-
"ASSIGNMENT_NOT_FOUND",
|
|
73
|
-
(sourceType: string, sourceId: string, targetType: string, targetId: string) =>
|
|
74
|
-
`Assignment not found: ${sourceType} ${sourceId} -> ${targetType} ${targetId}`,
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
export const InvalidEventTypeError = createDomainError(
|
|
78
|
-
"InvalidEventTypeError",
|
|
79
|
-
"INVALID_EVENT_TYPE",
|
|
80
|
-
(eventType: string) => `Invalid event type: ${eventType}`,
|
|
81
|
-
);
|
|
File without changes
|