ddd-ts-kit 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/README.md +28 -1
  2. package/dist/check/explain/tenancy-docs.d.ts.map +1 -1
  3. package/dist/check/explain/tenancy-docs.js +3 -1
  4. package/dist/check/explain/tenancy-docs.js.map +1 -1
  5. package/dist/check/fixtures/tenancy-fixtures.d.ts.map +1 -1
  6. package/dist/check/fixtures/tenancy-fixtures.js +28 -0
  7. package/dist/check/fixtures/tenancy-fixtures.js.map +1 -1
  8. package/dist/check/tenancy/knex-unscoped.d.ts +6 -1
  9. package/dist/check/tenancy/knex-unscoped.d.ts.map +1 -1
  10. package/dist/check/tenancy/knex-unscoped.js +19 -6
  11. package/dist/check/tenancy/knex-unscoped.js.map +1 -1
  12. package/dist/check/tenancy/raw-reaches-rows.d.ts +8 -0
  13. package/dist/check/tenancy/raw-reaches-rows.d.ts.map +1 -0
  14. package/dist/check/tenancy/raw-reaches-rows.js +91 -0
  15. package/dist/check/tenancy/raw-reaches-rows.js.map +1 -0
  16. package/dist/check/tenancy/raw-sql-text.d.ts +9 -0
  17. package/dist/check/tenancy/raw-sql-text.d.ts.map +1 -0
  18. package/dist/check/tenancy/raw-sql-text.js +29 -0
  19. package/dist/check/tenancy/raw-sql-text.js.map +1 -0
  20. package/dist/commands/generate.js +2 -0
  21. package/dist/commands/generate.js.map +1 -1
  22. package/dist/commands/init.d.ts.map +1 -1
  23. package/dist/commands/init.js +11 -1
  24. package/dist/commands/init.js.map +1 -1
  25. package/dist/declared/injection/laid-out-calls.d.ts +7 -0
  26. package/dist/declared/injection/laid-out-calls.d.ts.map +1 -0
  27. package/dist/declared/injection/laid-out-calls.js +14 -0
  28. package/dist/declared/injection/laid-out-calls.js.map +1 -0
  29. package/dist/declared/render-barrel.d.ts.map +1 -1
  30. package/dist/declared/render-barrel.js +2 -1
  31. package/dist/declared/render-barrel.js.map +1 -1
  32. package/dist/declared/render-dependencies-file.d.ts.map +1 -1
  33. package/dist/declared/render-dependencies-file.js +2 -1
  34. package/dist/declared/render-dependencies-file.js.map +1 -1
  35. package/dist/generate/kind.d.ts +2 -0
  36. package/dist/generate/kind.d.ts.map +1 -1
  37. package/dist/generate/kinds/context-kind.d.ts.map +1 -1
  38. package/dist/generate/kinds/context-kind.js +13 -6
  39. package/dist/generate/kinds/context-kind.js.map +1 -1
  40. package/dist/generate/kinds/next-adr-number.d.ts +4 -0
  41. package/dist/generate/kinds/next-adr-number.d.ts.map +1 -0
  42. package/dist/generate/kinds/next-adr-number.js +7 -0
  43. package/dist/generate/kinds/next-adr-number.js.map +1 -0
  44. package/dist/generate/kinds/write-adr.js +3 -6
  45. package/dist/generate/kinds/write-adr.js.map +1 -1
  46. package/dist/help/usage.d.ts +1 -1
  47. package/dist/help/usage.d.ts.map +1 -1
  48. package/dist/help/usage.js +1 -1
  49. package/dist/init/manifest/versions.js +24 -24
  50. package/dist/init/run-init.d.ts +2 -0
  51. package/dist/init/run-init.d.ts.map +1 -1
  52. package/dist/init/run-init.js +15 -1
  53. package/dist/init/run-init.js.map +1 -1
  54. package/dist/presets/apply-preset.d.ts +15 -0
  55. package/dist/presets/apply-preset.d.ts.map +1 -0
  56. package/dist/presets/apply-preset.js +94 -0
  57. package/dist/presets/apply-preset.js.map +1 -0
  58. package/dist/presets/grant-to-signed-in.d.ts +9 -0
  59. package/dist/presets/grant-to-signed-in.d.ts.map +1 -0
  60. package/dist/presets/grant-to-signed-in.js +61 -0
  61. package/dist/presets/grant-to-signed-in.js.map +1 -0
  62. package/dist/presets/identity-preset.d.ts +9 -0
  63. package/dist/presets/identity-preset.d.ts.map +1 -0
  64. package/dist/presets/identity-preset.js +44 -0
  65. package/dist/presets/identity-preset.js.map +1 -0
  66. package/dist/presets/identity-refusal.d.ts +5 -0
  67. package/dist/presets/identity-refusal.d.ts.map +1 -0
  68. package/dist/presets/identity-refusal.js +29 -0
  69. package/dist/presets/identity-refusal.js.map +1 -0
  70. package/dist/presets/identity-terms.d.ts +4 -0
  71. package/dist/presets/identity-terms.d.ts.map +1 -0
  72. package/dist/presets/identity-terms.js +57 -0
  73. package/dist/presets/identity-terms.js.map +1 -0
  74. package/dist/presets/no-flags.d.ts +4 -0
  75. package/dist/presets/no-flags.d.ts.map +1 -0
  76. package/dist/presets/no-flags.js +18 -0
  77. package/dist/presets/no-flags.js.map +1 -0
  78. package/dist/presets/organisations-as-tenants.d.ts +9 -0
  79. package/dist/presets/organisations-as-tenants.d.ts.map +1 -0
  80. package/dist/presets/organisations-as-tenants.js +43 -0
  81. package/dist/presets/organisations-as-tenants.js.map +1 -0
  82. package/dist/presets/preset-decision.d.ts +8 -0
  83. package/dist/presets/preset-decision.d.ts.map +1 -0
  84. package/dist/presets/preset-decision.js +19 -0
  85. package/dist/presets/preset-decision.js.map +1 -0
  86. package/dist/presets/preset-file.d.ts +13 -0
  87. package/dist/presets/preset-file.d.ts.map +1 -0
  88. package/dist/presets/preset-file.js +2 -0
  89. package/dist/presets/preset-file.js.map +1 -0
  90. package/dist/presets/preset-files.d.ts +9 -0
  91. package/dist/presets/preset-files.d.ts.map +1 -0
  92. package/dist/presets/preset-files.js +34 -0
  93. package/dist/presets/preset-files.js.map +1 -0
  94. package/dist/presets/preset-named.d.ts +3 -0
  95. package/dist/presets/preset-named.d.ts.map +1 -0
  96. package/dist/presets/preset-named.js +12 -0
  97. package/dist/presets/preset-named.js.map +1 -0
  98. package/dist/presets/preset-refusal.d.ts +6 -0
  99. package/dist/presets/preset-refusal.d.ts.map +1 -0
  100. package/dist/presets/preset-refusal.js +2 -0
  101. package/dist/presets/preset-refusal.js.map +1 -0
  102. package/dist/presets/preset-step.d.ts +8 -0
  103. package/dist/presets/preset-step.d.ts.map +1 -0
  104. package/dist/presets/preset-step.js +2 -0
  105. package/dist/presets/preset-step.js.map +1 -0
  106. package/dist/presets/preset.d.ts +36 -0
  107. package/dist/presets/preset.d.ts.map +1 -0
  108. package/dist/presets/preset.js +2 -0
  109. package/dist/presets/preset.js.map +1 -0
  110. package/dist/presets/with-authorizer-import.d.ts +6 -0
  111. package/dist/presets/with-authorizer-import.d.ts.map +1 -0
  112. package/dist/presets/with-authorizer-import.js +27 -0
  113. package/dist/presets/with-authorizer-import.js.map +1 -0
  114. package/dist/version.d.ts +1 -1
  115. package/dist/version.js +1 -1
  116. package/dist/workspace/workspace.d.ts +2 -0
  117. package/dist/workspace/workspace.d.ts.map +1 -1
  118. package/dist/workspace/workspace.js +4 -0
  119. package/dist/workspace/workspace.js.map +1 -1
  120. package/package.json +2 -2
  121. package/templates/pipeline/package-scripts.json +1 -1
  122. package/templates/presets/identity/context/application/authorization/__context__.permissions.ts.tpl +23 -0
  123. package/templates/presets/identity/context/application/authorization/change-member-roles.policy.ts.tpl +17 -0
  124. package/templates/presets/identity/context/application/authorization/grant-delegations.policy.ts.tpl +17 -0
  125. package/templates/presets/identity/context/application/authorization/invite-members.policy.ts.tpl +17 -0
  126. package/templates/presets/identity/context/application/authorization/read-members.policy.ts.tpl +17 -0
  127. package/templates/presets/identity/context/application/authorization/remove-members.policy.ts.tpl +17 -0
  128. package/templates/presets/identity/context/application/authorization/revoke-delegations.policy.ts.tpl +17 -0
  129. package/templates/presets/identity/context/application/authorization/revoke-invitations.policy.ts.tpl +17 -0
  130. package/templates/presets/identity/context/application/commands/accept-invitation/accept-invitation.command.ts.tpl +14 -0
  131. package/templates/presets/identity/context/application/commands/accept-invitation/accept-invitation.handler.ts.tpl +56 -0
  132. package/templates/presets/identity/context/application/commands/change-member-role/change-member-role.command.ts.tpl +17 -0
  133. package/templates/presets/identity/context/application/commands/change-member-role/change-member-role.handler.ts.tpl +82 -0
  134. package/templates/presets/identity/context/application/commands/deactivate-account/deactivate-account.command.ts.tpl +7 -0
  135. package/templates/presets/identity/context/application/commands/deactivate-account/deactivate-account.handler.ts.tpl +69 -0
  136. package/templates/presets/identity/context/application/commands/decline-invitation/decline-invitation.command.ts.tpl +14 -0
  137. package/templates/presets/identity/context/application/commands/decline-invitation/decline-invitation.handler.ts.tpl +36 -0
  138. package/templates/presets/identity/context/application/commands/grant-delegation/grant-delegation.command.ts.tpl +21 -0
  139. package/templates/presets/identity/context/application/commands/grant-delegation/grant-delegation.handler.ts.tpl +43 -0
  140. package/templates/presets/identity/context/application/commands/invite-member/invite-member.command.ts.tpl +16 -0
  141. package/templates/presets/identity/context/application/commands/invite-member/invite-member.handler.ts.tpl +53 -0
  142. package/templates/presets/identity/context/application/commands/open-organisation/open-organisation.command.ts.tpl +14 -0
  143. package/templates/presets/identity/context/application/commands/open-organisation/open-organisation.handler.ts.tpl +50 -0
  144. package/templates/presets/identity/context/application/commands/provision-account/provision-account.command.ts.tpl +14 -0
  145. package/templates/presets/identity/context/application/commands/provision-account/provision-account.handler.ts.tpl +41 -0
  146. package/templates/presets/identity/context/application/commands/remove-member/remove-member.command.ts.tpl +15 -0
  147. package/templates/presets/identity/context/application/commands/remove-member/remove-member.handler.ts.tpl +79 -0
  148. package/templates/presets/identity/context/application/commands/revoke-delegation/revoke-delegation.command.ts.tpl +15 -0
  149. package/templates/presets/identity/context/application/commands/revoke-delegation/revoke-delegation.handler.ts.tpl +39 -0
  150. package/templates/presets/identity/context/application/commands/revoke-invitation/revoke-invitation.command.ts.tpl +15 -0
  151. package/templates/presets/identity/context/application/commands/revoke-invitation/revoke-invitation.handler.ts.tpl +42 -0
  152. package/templates/presets/identity/context/application/integration/handlers/account-deactivated.integration-handler.ts.tpl +19 -0
  153. package/templates/presets/identity/context/application/integration/handlers/member-joined.integration-handler.ts.tpl +33 -0
  154. package/templates/presets/identity/context/application/integration/handlers/member-removed.integration-handler.ts.tpl +30 -0
  155. package/templates/presets/identity/context/application/integration/handlers/organisation-opened.integration-handler.ts.tpl +19 -0
  156. package/templates/presets/identity/context/application/integration/publishers/account-deactivated.publisher.ts.tpl +24 -0
  157. package/templates/presets/identity/context/application/integration/publishers/delegation-granted.publisher.ts.tpl +36 -0
  158. package/templates/presets/identity/context/application/integration/publishers/delegation-revoked.publisher.ts.tpl +33 -0
  159. package/templates/presets/identity/context/application/integration/publishers/member-joined.publisher.ts.tpl +33 -0
  160. package/templates/presets/identity/context/application/integration/publishers/member-removed.publisher.ts.tpl +33 -0
  161. package/templates/presets/identity/context/application/integration/publishers/member-role-changed.publisher.ts.tpl +35 -0
  162. package/templates/presets/identity/context/application/integration/publishers/organisation-opened.publisher.ts.tpl +32 -0
  163. package/templates/presets/identity/context/application/ports/identity-provider-admin.port.ts.tpl +17 -0
  164. package/templates/presets/identity/context/application/ports/identity-provider-connection.port.ts.tpl +14 -0
  165. package/templates/presets/identity/context/application/ports/invitation-tokens.port.ts.tpl +7 -0
  166. package/templates/presets/identity/context/application/ports/search-members-reader.port.ts.tpl +10 -0
  167. package/templates/presets/identity/context/application/queries/search-members/search-members.handler.ts.tpl +33 -0
  168. package/templates/presets/identity/context/application/queries/search-members/search-members.query.ts.tpl +19 -0
  169. package/templates/presets/identity/context/application/queries/search-members/search-members.result.ts.tpl +17 -0
  170. package/templates/presets/identity/context/domain/aggregates/account.aggregate.ts.tpl +92 -0
  171. package/templates/presets/identity/context/domain/aggregates/delegation.aggregate.ts.tpl +117 -0
  172. package/templates/presets/identity/context/domain/aggregates/invitation.aggregate.ts.tpl +128 -0
  173. package/templates/presets/identity/context/domain/aggregates/member.aggregate.ts.tpl +149 -0
  174. package/templates/presets/identity/context/domain/aggregates/organisation.aggregate.ts.tpl +52 -0
  175. package/templates/presets/identity/context/domain/errors/account.error.ts.tpl +40 -0
  176. package/templates/presets/identity/context/domain/errors/delegation.error.ts.tpl +45 -0
  177. package/templates/presets/identity/context/domain/errors/invitation.error.ts.tpl +30 -0
  178. package/templates/presets/identity/context/domain/errors/member.error.ts.tpl +50 -0
  179. package/templates/presets/identity/context/domain/errors/organisation.error.ts.tpl +32 -0
  180. package/templates/presets/identity/context/domain/events/account-deactivated.event.ts.tpl +13 -0
  181. package/templates/presets/identity/context/domain/events/account-provisioned.event.ts.tpl +17 -0
  182. package/templates/presets/identity/context/domain/events/delegation-granted.event.ts.tpl +22 -0
  183. package/templates/presets/identity/context/domain/events/delegation-revoked.event.ts.tpl +18 -0
  184. package/templates/presets/identity/context/domain/events/invitation-accepted.event.ts.tpl +17 -0
  185. package/templates/presets/identity/context/domain/events/invitation-declined.event.ts.tpl +16 -0
  186. package/templates/presets/identity/context/domain/events/invitation-issued.event.ts.tpl +22 -0
  187. package/templates/presets/identity/context/domain/events/invitation-revoked.event.ts.tpl +16 -0
  188. package/templates/presets/identity/context/domain/events/member-joined.event.ts.tpl +19 -0
  189. package/templates/presets/identity/context/domain/events/member-removed.event.ts.tpl +19 -0
  190. package/templates/presets/identity/context/domain/events/member-role-changed.event.ts.tpl +22 -0
  191. package/templates/presets/identity/context/domain/events/organisation-opened.event.ts.tpl +17 -0
  192. package/templates/presets/identity/context/domain/repositories/account.repository.ts.tpl +5 -0
  193. package/templates/presets/identity/context/domain/repositories/delegation.repository.ts.tpl +10 -0
  194. package/templates/presets/identity/context/domain/repositories/invitation.repository.ts.tpl +7 -0
  195. package/templates/presets/identity/context/domain/repositories/member.repository.ts.tpl +13 -0
  196. package/templates/presets/identity/context/domain/repositories/organisation.repository.ts.tpl +5 -0
  197. package/templates/presets/identity/context/domain/services/role-rights.service.ts.tpl +59 -0
  198. package/templates/presets/identity/context/domain/value-objects/delegation-period.vo.ts.tpl +42 -0
  199. package/templates/presets/identity/context/domain/value-objects/display-name.vo.ts.tpl +29 -0
  200. package/templates/presets/identity/context/domain/value-objects/email-address.vo.ts.tpl +31 -0
  201. package/templates/presets/identity/context/domain/value-objects/organisation-name.vo.ts.tpl +29 -0
  202. package/templates/presets/identity/context/domain/value-objects/organisation-rights.vo.ts.tpl +43 -0
  203. package/templates/presets/identity/context/domain/value-objects/organisation-slug.vo.ts.tpl +30 -0
  204. package/templates/presets/identity/context/domain/vocabularies/account-status.vocabulary.ts.tpl +7 -0
  205. package/templates/presets/identity/context/domain/vocabularies/invitation-status.vocabulary.ts.tpl +9 -0
  206. package/templates/presets/identity/context/domain/vocabularies/member-right.vocabulary.ts.tpl +9 -0
  207. package/templates/presets/identity/context/domain/vocabularies/member-role.vocabulary.ts.tpl +8 -0
  208. package/templates/presets/identity/context/infrastructure/external/crypto-invitation-tokens.adapter.ts.tpl +20 -0
  209. package/templates/presets/identity/context/infrastructure/external/environment-identity-provider-connection.adapter.ts.tpl +37 -0
  210. package/templates/presets/identity/context/infrastructure/external/keycloak-identity-provider-admin.adapter.ts.tpl +149 -0
  211. package/templates/presets/identity/context/infrastructure/persistence/__context__.schema.drizzle.ts.tpl +102 -0
  212. package/templates/presets/identity/context/infrastructure/persistence/account-row.schema.knex.ts.tpl +15 -0
  213. package/templates/presets/identity/context/infrastructure/persistence/account.mapper.drizzle.ts.tpl +38 -0
  214. package/templates/presets/identity/context/infrastructure/persistence/account.mapper.knex.ts.tpl +33 -0
  215. package/templates/presets/identity/context/infrastructure/persistence/create-__context__-tables.schema.knex.ts.tpl +107 -0
  216. package/templates/presets/identity/context/infrastructure/persistence/delegation-row.schema.knex.ts.tpl +17 -0
  217. package/templates/presets/identity/context/infrastructure/persistence/delegation.mapper.drizzle.ts.tpl +50 -0
  218. package/templates/presets/identity/context/infrastructure/persistence/delegation.mapper.knex.ts.tpl +45 -0
  219. package/templates/presets/identity/context/infrastructure/persistence/drizzle-account.repository.drizzle.ts.tpl +59 -0
  220. package/templates/presets/identity/context/infrastructure/persistence/drizzle-delegation.repository.drizzle.ts.tpl +77 -0
  221. package/templates/presets/identity/context/infrastructure/persistence/drizzle-invitation.repository.drizzle.ts.tpl +65 -0
  222. package/templates/presets/identity/context/infrastructure/persistence/drizzle-member.repository.drizzle.ts.tpl +84 -0
  223. package/templates/presets/identity/context/infrastructure/persistence/drizzle-organisation.repository.drizzle.ts.tpl +59 -0
  224. package/templates/presets/identity/context/infrastructure/persistence/drizzle-search-members-reader.repository.drizzle.ts.tpl +53 -0
  225. package/templates/presets/identity/context/infrastructure/persistence/invitation-row.schema.knex.ts.tpl +20 -0
  226. package/templates/presets/identity/context/infrastructure/persistence/invitation.mapper.drizzle.ts.tpl +45 -0
  227. package/templates/presets/identity/context/infrastructure/persistence/invitation.mapper.knex.ts.tpl +40 -0
  228. package/templates/presets/identity/context/infrastructure/persistence/knex-account.repository.knex.ts.tpl +61 -0
  229. package/templates/presets/identity/context/infrastructure/persistence/knex-delegation.repository.knex.ts.tpl +80 -0
  230. package/templates/presets/identity/context/infrastructure/persistence/knex-invitation.repository.knex.ts.tpl +67 -0
  231. package/templates/presets/identity/context/infrastructure/persistence/knex-member.repository.knex.ts.tpl +82 -0
  232. package/templates/presets/identity/context/infrastructure/persistence/knex-organisation.repository.knex.ts.tpl +61 -0
  233. package/templates/presets/identity/context/infrastructure/persistence/knex-search-members-reader.repository.knex.ts.tpl +77 -0
  234. package/templates/presets/identity/context/infrastructure/persistence/member-row.schema.knex.ts.tpl +15 -0
  235. package/templates/presets/identity/context/infrastructure/persistence/member.mapper.drizzle.ts.tpl +36 -0
  236. package/templates/presets/identity/context/infrastructure/persistence/member.mapper.knex.ts.tpl +31 -0
  237. package/templates/presets/identity/context/infrastructure/persistence/organisation-row.schema.knex.ts.tpl +12 -0
  238. package/templates/presets/identity/context/infrastructure/persistence/organisation.mapper.drizzle.ts.tpl +28 -0
  239. package/templates/presets/identity/context/infrastructure/persistence/organisation.mapper.knex.ts.tpl +26 -0
  240. package/templates/presets/identity/context/presentation/http/accounts/deactivate-account/deactivate-account.accepted.class-validator.per-route.ts.tpl +6 -0
  241. package/templates/presets/identity/context/presentation/http/accounts/deactivate-account/deactivate-account.controller.ts.tpl +71 -0
  242. package/templates/presets/identity/context/presentation/http/accounts/provision-account/provision-account.accepted.class-validator.per-route.ts.tpl +6 -0
  243. package/templates/presets/identity/context/presentation/http/accounts/provision-account/provision-account.body.class-validator.ts.tpl +9 -0
  244. package/templates/presets/identity/context/presentation/http/accounts/provision-account/provision-account.controller.ts.tpl +85 -0
  245. package/templates/presets/identity/context/presentation/http/accounts.routes.ts.tpl +5 -0
  246. package/templates/presets/identity/context/presentation/http/invitations/accept-invitation/accept-invitation.accepted.class-validator.per-route.ts.tpl +6 -0
  247. package/templates/presets/identity/context/presentation/http/invitations/accept-invitation/accept-invitation.body.class-validator.per-route.ts.tpl +8 -0
  248. package/templates/presets/identity/context/presentation/http/invitations/accept-invitation/accept-invitation.controller.ts.tpl +100 -0
  249. package/templates/presets/identity/context/presentation/http/invitations/decline-invitation/decline-invitation.accepted.class-validator.per-route.ts.tpl +6 -0
  250. package/templates/presets/identity/context/presentation/http/invitations/decline-invitation/decline-invitation.body.class-validator.per-route.ts.tpl +8 -0
  251. package/templates/presets/identity/context/presentation/http/invitations/decline-invitation/decline-invitation.controller.ts.tpl +98 -0
  252. package/templates/presets/identity/context/presentation/http/invitations.routes.ts.tpl +5 -0
  253. package/templates/presets/identity/context/presentation/http/organisations/change-member-role/change-member-role.accepted.class-validator.per-route.ts.tpl +6 -0
  254. package/templates/presets/identity/context/presentation/http/organisations/change-member-role/change-member-role.body.class-validator.ts.tpl +7 -0
  255. package/templates/presets/identity/context/presentation/http/organisations/change-member-role/change-member-role.controller.ts.tpl +83 -0
  256. package/templates/presets/identity/context/presentation/http/organisations/change-member-role/change-member-role.params.class-validator.ts.tpl +11 -0
  257. package/templates/presets/identity/context/presentation/http/organisations/grant-delegation/grant-delegation.accepted.class-validator.per-route.ts.tpl +6 -0
  258. package/templates/presets/identity/context/presentation/http/organisations/grant-delegation/grant-delegation.body.class-validator.ts.tpl +18 -0
  259. package/templates/presets/identity/context/presentation/http/organisations/grant-delegation/grant-delegation.controller.ts.tpl +103 -0
  260. package/templates/presets/identity/context/presentation/http/organisations/grant-delegation/grant-delegation.params.class-validator.ts.tpl +7 -0
  261. package/templates/presets/identity/context/presentation/http/organisations/invite-member/invite-member.accepted.class-validator.ts.tpl +10 -0
  262. package/templates/presets/identity/context/presentation/http/organisations/invite-member/invite-member.body.class-validator.ts.tpl +10 -0
  263. package/templates/presets/identity/context/presentation/http/organisations/invite-member/invite-member.controller.ts.tpl +65 -0
  264. package/templates/presets/identity/context/presentation/http/organisations/invite-member/invite-member.params.class-validator.ts.tpl +7 -0
  265. package/templates/presets/identity/context/presentation/http/organisations/open-organisation/open-organisation.accepted.class-validator.per-route.ts.tpl +6 -0
  266. package/templates/presets/identity/context/presentation/http/organisations/open-organisation/open-organisation.body.class-validator.ts.tpl +12 -0
  267. package/templates/presets/identity/context/presentation/http/organisations/open-organisation/open-organisation.controller.ts.tpl +79 -0
  268. package/templates/presets/identity/context/presentation/http/organisations/remove-member/remove-member.accepted.class-validator.per-route.ts.tpl +6 -0
  269. package/templates/presets/identity/context/presentation/http/organisations/remove-member/remove-member.controller.ts.tpl +73 -0
  270. package/templates/presets/identity/context/presentation/http/organisations/remove-member/remove-member.params.class-validator.ts.tpl +11 -0
  271. package/templates/presets/identity/context/presentation/http/organisations/revoke-delegation/revoke-delegation.accepted.class-validator.per-route.ts.tpl +6 -0
  272. package/templates/presets/identity/context/presentation/http/organisations/revoke-delegation/revoke-delegation.controller.ts.tpl +73 -0
  273. package/templates/presets/identity/context/presentation/http/organisations/revoke-delegation/revoke-delegation.params.class-validator.ts.tpl +11 -0
  274. package/templates/presets/identity/context/presentation/http/organisations/revoke-invitation/revoke-invitation.accepted.class-validator.per-route.ts.tpl +6 -0
  275. package/templates/presets/identity/context/presentation/http/organisations/revoke-invitation/revoke-invitation.controller.ts.tpl +73 -0
  276. package/templates/presets/identity/context/presentation/http/organisations/revoke-invitation/revoke-invitation.params.class-validator.ts.tpl +11 -0
  277. package/templates/presets/identity/context/presentation/http/organisations/search-members/search-members.controller.ts.tpl +86 -0
  278. package/templates/presets/identity/context/presentation/http/organisations/search-members/search-members.line.class-validator.ts.tpl +22 -0
  279. package/templates/presets/identity/context/presentation/http/organisations/search-members/search-members.params.class-validator.ts.tpl +7 -0
  280. package/templates/presets/identity/context/presentation/http/organisations.routes.ts.tpl +5 -0
  281. package/templates/presets/identity/context/presentation/http/shared/invitation-token.schema.class-validator.shared.ts.tpl +9 -0
  282. package/templates/presets/identity/context/presentation/http/shared/invitation-token.schema.zod.shared.ts.tpl +9 -0
  283. package/templates/presets/identity/context/published-language/account-deactivated.v1.integration-event.ts.tpl +33 -0
  284. package/templates/presets/identity/context/published-language/account-deactivated.v1.payload.class-validator.ts.tpl +7 -0
  285. package/templates/presets/identity/context/published-language/delegation-granted.v1.integration-event.ts.tpl +39 -0
  286. package/templates/presets/identity/context/published-language/delegation-granted.v1.payload.class-validator.ts.tpl +28 -0
  287. package/templates/presets/identity/context/published-language/delegation-revoked.v1.integration-event.ts.tpl +36 -0
  288. package/templates/presets/identity/context/published-language/delegation-revoked.v1.payload.class-validator.ts.tpl +16 -0
  289. package/templates/presets/identity/context/published-language/member-joined.v1.integration-event.ts.tpl +36 -0
  290. package/templates/presets/identity/context/published-language/member-joined.v1.payload.class-validator.ts.tpl +16 -0
  291. package/templates/presets/identity/context/published-language/member-removed.v1.integration-event.ts.tpl +36 -0
  292. package/templates/presets/identity/context/published-language/member-removed.v1.payload.class-validator.ts.tpl +18 -0
  293. package/templates/presets/identity/context/published-language/member-role-changed.v1.integration-event.ts.tpl +38 -0
  294. package/templates/presets/identity/context/published-language/member-role-changed.v1.payload.class-validator.ts.tpl +24 -0
  295. package/templates/presets/identity/context/published-language/organisation-opened.v1.integration-event.ts.tpl +35 -0
  296. package/templates/presets/identity/context/published-language/organisation-opened.v1.payload.class-validator.ts.tpl +13 -0
  297. package/templates/presets/identity/context/test/builders/account.builder.ts.tpl +59 -0
  298. package/templates/presets/identity/context/test/builders/delegation.builder.ts.tpl +67 -0
  299. package/templates/presets/identity/context/test/builders/invitation.builder.ts.tpl +60 -0
  300. package/templates/presets/identity/context/test/builders/member.builder.ts.tpl +59 -0
  301. package/templates/presets/identity/context/test/builders/organisation.builder.ts.tpl +44 -0
  302. package/templates/presets/identity/context/test/fakes/account.repository.fake.ts.tpl +10 -0
  303. package/templates/presets/identity/context/test/fakes/delegation.repository.fake.ts.tpl +26 -0
  304. package/templates/presets/identity/context/test/fakes/identity-provider-admin.fake.ts.tpl +41 -0
  305. package/templates/presets/identity/context/test/fakes/invitation-tokens.fake.ts.tpl +18 -0
  306. package/templates/presets/identity/context/test/fakes/invitation.repository.fake.ts.tpl +14 -0
  307. package/templates/presets/identity/context/test/fakes/member.repository.fake.ts.tpl +29 -0
  308. package/templates/presets/identity/context/test/fakes/organisation.repository.fake.ts.tpl +10 -0
  309. package/templates/presets/identity/context/test/fakes/search-members-reader.fake.ts.tpl +25 -0
  310. package/templates/presets/identity/context/test/integration/account.repository.contract.spec.ts.tpl +48 -0
  311. package/templates/presets/identity/context/test/integration/delegation.repository.contract.spec.ts.tpl +84 -0
  312. package/templates/presets/identity/context/test/integration/invitation.repository.contract.spec.ts.tpl +76 -0
  313. package/templates/presets/identity/context/test/integration/keycloak-identity-provider-admin.adapter.spec.ts.tpl +123 -0
  314. package/templates/presets/identity/context/test/integration/member.repository.contract.spec.ts.tpl +92 -0
  315. package/templates/presets/identity/context/test/integration/organisation.repository.contract.spec.ts.tpl +46 -0
  316. package/templates/presets/identity/context/test/integration/search-members-reader.spec.ts.tpl +86 -0
  317. package/templates/presets/identity/context/test/unit/accept-invitation.controller.spec.ts.tpl +57 -0
  318. package/templates/presets/identity/context/test/unit/accept-invitation.handler.spec.ts.tpl +69 -0
  319. package/templates/presets/identity/context/test/unit/account-deactivated.integration-handler.spec.ts.tpl +24 -0
  320. package/templates/presets/identity/context/test/unit/account-deactivated.publisher.spec.ts.tpl +25 -0
  321. package/templates/presets/identity/context/test/unit/account.aggregate.spec.ts.tpl +72 -0
  322. package/templates/presets/identity/context/test/unit/change-member-role.controller.spec.ts.tpl +57 -0
  323. package/templates/presets/identity/context/test/unit/change-member-role.handler.spec.ts.tpl +135 -0
  324. package/templates/presets/identity/context/test/unit/crypto-invitation-tokens.adapter.spec.ts.tpl +15 -0
  325. package/templates/presets/identity/context/test/unit/deactivate-account.controller.spec.ts.tpl +44 -0
  326. package/templates/presets/identity/context/test/unit/deactivate-account.handler.spec.ts.tpl +106 -0
  327. package/templates/presets/identity/context/test/unit/decline-invitation.controller.spec.ts.tpl +57 -0
  328. package/templates/presets/identity/context/test/unit/decline-invitation.handler.spec.ts.tpl +40 -0
  329. package/templates/presets/identity/context/test/unit/delegation-granted.publisher.spec.ts.tpl +36 -0
  330. package/templates/presets/identity/context/test/unit/delegation-period.vo.spec.ts.tpl +32 -0
  331. package/templates/presets/identity/context/test/unit/delegation-revoked.publisher.spec.ts.tpl +35 -0
  332. package/templates/presets/identity/context/test/unit/delegation.aggregate.spec.ts.tpl +111 -0
  333. package/templates/presets/identity/context/test/unit/display-name.vo.spec.ts.tpl +13 -0
  334. package/templates/presets/identity/context/test/unit/email-address.vo.spec.ts.tpl +24 -0
  335. package/templates/presets/identity/context/test/unit/environment-identity-provider-connection.adapter.spec.ts.tpl +41 -0
  336. package/templates/presets/identity/context/test/unit/grant-delegation.controller.spec.ts.tpl +57 -0
  337. package/templates/presets/identity/context/test/unit/grant-delegation.handler.spec.ts.tpl +66 -0
  338. package/templates/presets/identity/context/test/unit/identity-application.ts.tpl +79 -0
  339. package/templates/presets/identity/context/test/unit/invitation.aggregate.spec.ts.tpl +118 -0
  340. package/templates/presets/identity/context/test/unit/invite-member.controller.spec.ts.tpl +57 -0
  341. package/templates/presets/identity/context/test/unit/invite-member.handler.spec.ts.tpl +110 -0
  342. package/templates/presets/identity/context/test/unit/member-joined.integration-handler.spec.ts.tpl +38 -0
  343. package/templates/presets/identity/context/test/unit/member-joined.publisher.spec.ts.tpl +36 -0
  344. package/templates/presets/identity/context/test/unit/member-removed.integration-handler.spec.ts.tpl +45 -0
  345. package/templates/presets/identity/context/test/unit/member-removed.publisher.spec.ts.tpl +35 -0
  346. package/templates/presets/identity/context/test/unit/member-role-changed.publisher.spec.ts.tpl +36 -0
  347. package/templates/presets/identity/context/test/unit/member.aggregate.spec.ts.tpl +142 -0
  348. package/templates/presets/identity/context/test/unit/open-organisation.controller.spec.ts.tpl +57 -0
  349. package/templates/presets/identity/context/test/unit/open-organisation.handler.spec.ts.tpl +52 -0
  350. package/templates/presets/identity/context/test/unit/organisation-name.vo.spec.ts.tpl +13 -0
  351. package/templates/presets/identity/context/test/unit/organisation-opened.integration-handler.spec.ts.tpl +24 -0
  352. package/templates/presets/identity/context/test/unit/organisation-opened.publisher.spec.ts.tpl +35 -0
  353. package/templates/presets/identity/context/test/unit/organisation-rights.vo.spec.ts.tpl +23 -0
  354. package/templates/presets/identity/context/test/unit/organisation-slug.vo.spec.ts.tpl +17 -0
  355. package/templates/presets/identity/context/test/unit/organisation.aggregate.spec.ts.tpl +33 -0
  356. package/templates/presets/identity/context/test/unit/provision-account.controller.spec.ts.tpl +73 -0
  357. package/templates/presets/identity/context/test/unit/provision-account.handler.spec.ts.tpl +65 -0
  358. package/templates/presets/identity/context/test/unit/remove-member.controller.spec.ts.tpl +44 -0
  359. package/templates/presets/identity/context/test/unit/remove-member.handler.spec.ts.tpl +125 -0
  360. package/templates/presets/identity/context/test/unit/revoke-delegation.controller.spec.ts.tpl +44 -0
  361. package/templates/presets/identity/context/test/unit/revoke-delegation.handler.spec.ts.tpl +51 -0
  362. package/templates/presets/identity/context/test/unit/revoke-invitation.controller.spec.ts.tpl +44 -0
  363. package/templates/presets/identity/context/test/unit/revoke-invitation.handler.spec.ts.tpl +44 -0
  364. package/templates/presets/identity/context/test/unit/role-rights.service.spec.ts.tpl +54 -0
  365. package/templates/presets/identity/context/test/unit/search-members.controller.spec.ts.tpl +43 -0
  366. package/templates/presets/identity/context/test/unit/search-members.handler.spec.ts.tpl +38 -0
  367. package/templates/presets/identity/decision.md.tpl +37 -0
  368. package/templates/presets/identity/design.md.tpl +71 -0
  369. package/templates/presets/signed-in-grants.ts.tpl +12 -0
package/README.md CHANGED
@@ -58,6 +58,7 @@ ddd-ts-kit init [--http express|fastify|hono|nest|none]
58
58
  [--allow-no-outbox "<reason>"] [--import-alias '$<name>/']
59
59
  [--import-extension none|js] [--sdk]
60
60
  [--context <name>:<core|supporting|generic>]...
61
+ [--preset identity]...
61
62
  [--dry-run] [--force]
62
63
  ```
63
64
 
@@ -262,6 +263,32 @@ and `@typescript/native` (`npm:typescript@~7.0.2`), which `build` and `typecheck
262
263
  `init` and `generate context` start with the language: the first entry of `next` is the glossary
263
264
  of the context to fill in.
264
265
 
266
+ ### Presets
267
+
268
+ `--preset identity` (on `init`, or on `generate context`; once per project) writes a whole bounded
269
+ context instead of an empty one: who the people of the application are, the organisations they
270
+ belong to and in which role. Accounts are provisioned from the identity provider at the first
271
+ sign-in (no password is kept), organisations (the tenants under `--tenancy shared-table`),
272
+ members with roles of a declared vocabulary, invitations by token with an expiry, delegations of
273
+ rights for a period; permissions, policies, the published language (member joined, role changed,
274
+ account deactivated...), a search, controllers, specs with builders and fakes, the adapters of
275
+ the ORM, and the port to the administration API of the identity provider, kept in line at least
276
+ once by the consumers of the published facts, with a Keycloak adapter given as a recipe (proven
277
+ against a server that answers as Keycloak does, not against Keycloak in the pipeline). Nobody
278
+ changes their own role or acts above it, whatever a delegation lends; a deactivated account
279
+ leaves its organisations; an address the provider did not verify provisions no account. On `init` without a `--context` of its name, the context `identity` is declared
280
+ `generic`. Every signed-in person holds the permissions of the context whatever `--authz` says:
281
+ the grant `'identity:*'` of `platform/auth/signed-in-grants.ts`, answered by
282
+ `SignedInGrantsAuthorizer` before the model in `createAuthorizer`. With tenants, the tables of
283
+ the context belong to none, under a decision record the preset writes, and with `--authn
284
+ keycloak` the authenticator reads the `organization` claim as the tenants of the person
285
+ (another authenticator gets a next step saying what to map). The preset is written for
286
+ `declared` with `signature` dependencies, `factories`, `throwing` value objects, `controllers`,
287
+ Knex or Drizzle on PostgreSQL, Zod or class-validator, Express or Fastify, and a token verifier
288
+ (`jwt` or `keycloak`); another stack is refused with what to change, and so is a second context
289
+ written from the same preset. Why, and which other contexts deserve one:
290
+ [Bootstrap with well-designed contexts](../../docs/guides/bootstrap-with-well-designed-contexts.md).
291
+
265
292
  ## generate (alias g)
266
293
 
267
294
  ```
@@ -271,7 +298,7 @@ ddd-ts-kit generate --help --json
271
298
 
272
299
  | Kind | Arguments | Writes |
273
300
  |---|---|---|
274
- | `context` | `<name> --classification <c> [--purpose "<two sentences>"] [--term ...]... [--upstream <ctx>[:relationship]]...` | `CONTEXT.md` with its glossary, `published-language/index.ts`, config entry, registration in `platform/compose-application.ts` and in `test/architecture/extractable.spec.ts`; on tsyringe, with HTTP, `presentation/http/<name>.routes.ts` (a function of the two buses, in both styles); declared: the barrel `<name>.declarations.ts`; explicit and hand wiring: `<name>.module.ts`. `application/authorization/<name>.permissions.ts` is born with the first permission, or at once when `platform/auth/permissions.ts` lists the permission sets (rebac, custom) |
301
+ | `context` | `<name> --classification <c> [--purpose "<two sentences>"] [--term ...]... [--upstream <ctx>[:relationship]]... [--preset identity]` | `CONTEXT.md` with its glossary, `published-language/index.ts`, config entry, registration in `platform/compose-application.ts` and in `test/architecture/extractable.spec.ts`; on tsyringe, with HTTP, `presentation/http/<name>.routes.ts` (a function of the two buses, in both styles); declared: the barrel `<name>.declarations.ts`; explicit and hand wiring: `<name>.module.ts`. `application/authorization/<name>.permissions.ts` is born with the first permission, or at once when `platform/auth/permissions.ts` lists the permission sets (rebac, custom). With `--preset`, the context is then written whole from that preset, its classification and purpose those of the preset unless the flags say otherwise ([Presets](#presets)) |
275
302
  | `aggregate` | `<context> <Name>` | aggregate, builder, spec in given / when / then |
276
303
  | `builder` | `<context> <Aggregate>` | `test/builders/<name>.builder.ts`, a class extending `Builder` |
277
304
  | `entity` | `<context> <Name>` | entity, spec |
@@ -1 +1 @@
1
- {"version":3,"file":"tenancy-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/tenancy-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa1D,CAAC"}
1
+ {"version":3,"file":"tenancy-docs.d.ts","sourceRoot":"","sources":["../../../src/check/explain/tenancy-docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAe1D,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export const TENANCY_DOCS = {
2
2
  'tenancy/scoped-statement': {
3
- why: 'On shared tables, one statement without its tenant condition reads or overwrites the data of every tenant: the most common and the most damaging leak of a multi-tenant application. The kit puts the condition in one place, the helpers of the ORM package, which read the tenant from the execution scope, refuse work that names none, widen reads only under an audited elevation and never widen writes. A table reached straight from the executor bypasses all of it. Judged in a project whose "stack.tenancy" is not "none": the infrastructure of the contexts, tests aside. Checked by text, statement by statement: on Knex the executor used other than as the argument of a helper, and raw SQL; on Drizzle a read, update or delete whose where carries no tenant condition (inline or in the local it is given), an insert whose row names no tenant, a relational query or a raw execute; on both, a read model store built without its tenant option. A where built by another function is not followed: inline it, or record a deviation.',
3
+ why: 'On shared tables, one statement without its tenant condition reads or overwrites the data of every tenant: the most common and the most damaging leak of a multi-tenant application. The kit puts the condition in one place, the helpers of the ORM package, which read the tenant from the execution scope, refuse work that names none, widen reads only under an audited elevation and never widen writes. A table reached straight from the executor bypasses all of it. Judged in a project whose "stack.tenancy" is not "none": the infrastructure of the contexts, tests aside. Checked by text, statement by statement: on Knex the executor used other than as the argument of a helper, and raw SQL that may reach rows by itself: a word that reads or writes rows (`select`, `from`, `join`, `insert`, `update`, `delete`, `values`, `call`...) or starts a statement (`table`, `with`, `do`...), a call to a function that is not a known expression (an aggregate, a cast, arithmetic, text), a text that is not a literal or a template that interpolates; a statement of the schema (`create`, `alter`, `drop`, `comment`) with no word of rows, and an aggregate in a select, reach no row by themselves; on Drizzle a read, update or delete whose where carries no tenant condition (inline or in the local it is given), an insert whose row names no tenant, a relational query or a raw execute; on both, a read model store built without its tenant option. A where built by another function is not followed: inline it, or record a deviation.',
4
4
  bad: `// infrastructure/persistence/knex-invoice.repository.ts
5
5
  const row = await this.database.executor()<InvoiceRow, InvoiceRow[]>('invoices').where({ id }).first();
6
6
  const all = await this.database.executor().from('invoices').where({ status }); // the executor chained
@@ -9,6 +9,8 @@ await this.database.executor().select().from(invoices).where(eq(invoices.id, id)
9
9
  await this.database.executor().query.invoices.findMany(); // a relational query cannot carry the condition`,
10
10
  good: `const row = await tenantTable<InvoiceRow>(this.database, this.scope, INVOICES).where({ id }).first();
11
11
  await ownTenantTable<InvoiceRow>(this.database, this.scope, INVOICES).where({ id, version }).update(changes);
12
+ const grouped = tenantTable(this.database, this.scope, INVOICES).select('status', this.database.executor().raw('sum(amount) as due')).groupBy('status');
13
+ const pages = await derivedTable(this.database, grouped, 'dues').orderBy('due', 'desc').limit(20);
12
14
  await this.database.executor().select().from(invoices).where(and(eq(invoices.id, id), tenantCondition(invoices.tenantId, this.scope)));`,
13
15
  },
14
16
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tenancy-docs.js","sourceRoot":"","sources":["../../../src/check/explain/tenancy-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAsC;IAC7D,0BAA0B,EAAE;QAC1B,GAAG,EAAE,+/BAA+/B;QACpgC,GAAG,EAAE;;;;;2GAKkG;QACvG,IAAI,EAAE;;wIAE8H;KACrI;CACF,CAAC"}
1
+ {"version":3,"file":"tenancy-docs.js","sourceRoot":"","sources":["../../../src/check/explain/tenancy-docs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAsC;IAC7D,0BAA0B,EAAE;QAC1B,GAAG,EAAE,2+CAA2+C;QACh/C,GAAG,EAAE;;;;;2GAKkG;QACvG,IAAI,EAAE;;;;wIAI8H;KACrI;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tenancy-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/tenancy-fixtures.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAsF5C,eAAO,MAAM,gBAAgB,EAAE,SAAS,OAAO,EAwF9C,CAAC"}
1
+ {"version":3,"file":"tenancy-fixtures.d.ts","sourceRoot":"","sources":["../../../src/check/fixtures/tenancy-fixtures.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAkG5C,eAAO,MAAM,gBAAgB,EAAE,SAAS,OAAO,EAqH9C,CAAC"}
@@ -53,6 +53,17 @@ const DRIZZLE_UNSCOPED = `export class DrizzleInvoiceRepository {
53
53
  }
54
54
  }
55
55
  `;
56
+ /** Aggregates over the rows `tenantTable` confines: raw expressions that reach no table themselves. */
57
+ const RAW_EXPRESSIONS = `export class KnexInvoiceRepository {
58
+ totals() {
59
+ return tenantTable(this.database, this.scope, INVOICES).select(
60
+ this.database.executor().raw('(count(*) filter (where paid))::integer as paid'),
61
+ this.database.executor().raw('coalesce(sum(round(amount)) filter (where state = any(?)), 0)::numeric(12, 2) as due', [states]),
62
+ this.database.executor().raw("customer_id || ' from ' || day as label"),
63
+ );
64
+ }
65
+ }
66
+ `;
56
67
  const tenancy = (orm, value = 'shared-table') => ({
57
68
  [CONFIG_FILE]: config({ stack: { orm, tenancy: value } }),
58
69
  });
@@ -99,6 +110,23 @@ export const TENANCY_FIXTURES = [
99
110
  bypass('knex', 'a select chained on the executor', "return this.database.executor().select('id').from('invoices');"),
100
111
  bypass('knex', 'a table reached by table()', "return this.database.executor().table('invoices');"),
101
112
  bypass('knex', 'raw SQL', "return this.database.executor().raw('select * from invoices');"),
113
+ bypass('knex', 'raw SQL in a template', 'return this.database.executor().raw(`select * from ${INVOICES}`);'),
114
+ bypass('knex', 'raw SQL whose text is not a literal', 'return this.database.executor().raw(statement);'),
115
+ bypass('knex', 'raw SQL completed by an interpolation', 'return this.database.executor().raw(`${statement} where id = ?`, [id]);'),
116
+ bypass('knex', 'raw SQL that names a table alone', "return this.database.executor().raw('table invoices');"),
117
+ bypass('knex', 'raw SQL that starts with a common table', "return this.database.executor().raw('with due as (table invoices) table due');"),
118
+ bypass('knex', 'raw SQL of values', "return this.database.executor().raw('values (1), (2)');"),
119
+ bypass('knex', 'raw SQL that calls a procedure', "return this.database.executor().raw('call purge_invoices()');"),
120
+ bypass('knex', 'raw SQL that calls a function', "return this.database.executor().raw('purge_all()');"),
121
+ {
122
+ ruleId: RULE,
123
+ name: 'knex: a raw expression in the select of a confined statement, and a constraint of the schema',
124
+ expect: 'pass',
125
+ files: project({
126
+ [KNEX_ADAPTER]: RAW_EXPRESSIONS,
127
+ [`${PATHS.BILLING}/infrastructure/persistence/create-billing-tables.schema.ts`]: "export const holdOnce = (knex: Knex) => knex.raw('alter table ??.?? add constraint held_once exclude using gist (desk with =)', [S, T]);\n",
128
+ }, tenancy('knex')),
129
+ },
102
130
  bypass('knex', 'the executor held in a variable', "const db = this.database.executor();\n\n return db('invoices');"),
103
131
  {
104
132
  ruleId: RULE,
@@ -1 +1 @@
1
- {"version":3,"file":"tenancy-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/tenancy-fixtures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tenancy-fixtures.js","sourceRoot":"","sources":["../../../src/check/fixtures/tenancy-fixtures.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,10 @@
1
1
  import type { SourceFile } from '../model/source-file.js';
2
- /** What a Knex adapter of tenant data reaches without the helpers: the executor called, chained or held, and raw SQL. */
2
+ /**
3
+ * What a Knex adapter of tenant data reaches without the helpers: the executor called, chained or
4
+ * held, and raw SQL. A raw call whose first argument is a literal that reaches no row by itself
5
+ * (an aggregate in a select, a constraint of the schema: `rawReachesRows`) is not reported, since
6
+ * the statement it is put in is what the tenant confines; any other raw call is.
7
+ */
3
8
  export declare function knexUnscoped(file: SourceFile): readonly {
4
9
  offset: number;
5
10
  message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"knex-unscoped.d.ts","sourceRoot":"","sources":["../../../src/check/tenancy/knex-unscoped.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAM1D,yHAAyH;AACzH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAgB7F"}
1
+ {"version":3,"file":"knex-unscoped.d.ts","sourceRoot":"","sources":["../../../src/check/tenancy/knex-unscoped.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAW1D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAe7F"}
@@ -1,19 +1,32 @@
1
1
  import { executorUses } from './executor-uses.js';
2
+ import { rawReachesRows } from './raw-reaches-rows.js';
3
+ import { rawSqlText } from './raw-sql-text.js';
2
4
  /** Raw SQL, which no helper confines. */
3
5
  const RAW = /\.raw\s*\(/g;
4
- /** What a Knex adapter of tenant data reaches without the helpers: the executor called, chained or held, and raw SQL. */
6
+ /** A raw use of the executor: judged by what its SQL says, as any raw SQL. */
7
+ const RAW_STATEMENT = /^\s*\.raw\s*\(/;
8
+ /**
9
+ * What a Knex adapter of tenant data reaches without the helpers: the executor called, chained or
10
+ * held, and raw SQL. A raw call whose first argument is a literal that reaches no row by itself
11
+ * (an aggregate in a select, a constraint of the schema: `rawReachesRows`) is not reported, since
12
+ * the statement it is put in is what the tenant confines; any other raw call is.
13
+ */
5
14
  export function knexUnscoped(file) {
6
15
  const { code } = file.scan;
7
16
  const straight = executorUses(code)
8
- .filter((use) => !use.handedOver)
17
+ .filter((use) => !use.handedOver && !RAW_STATEMENT.test(use.statement))
9
18
  .map((use) => ({
10
19
  offset: use.offset,
11
20
  message: 'The executor is used straight (called, chained or held): no tenant condition confines it.',
12
21
  }));
13
- const raw = [...code.matchAll(RAW)].map((match) => ({
14
- offset: match.index,
15
- message: 'Raw SQL reaches the tables with no tenant condition.',
16
- }));
22
+ const raw = [...code.matchAll(RAW)]
23
+ .filter((match) => reachesRows(file, match.index + match[0].length))
24
+ .map((match) => ({ offset: match.index, message: 'Raw SQL reaches the tables with no tenant condition.' }));
17
25
  return [...straight, ...raw];
18
26
  }
27
+ /** True unless the first argument is a literal whose SQL reaches no row by itself. */
28
+ function reachesRows(file, argumentsStart) {
29
+ const text = rawSqlText(file, argumentsStart);
30
+ return text === undefined || rawReachesRows(text);
31
+ }
19
32
  //# sourceMappingURL=knex-unscoped.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"knex-unscoped.js","sourceRoot":"","sources":["../../../src/check/tenancy/knex-unscoped.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,yCAAyC;AACzC,MAAM,GAAG,GAAG,aAAa,CAAC;AAE1B,yHAAyH;AACzH,MAAM,UAAU,YAAY,CAAC,IAAgB;IAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;IAE3B,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC;SAChC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;SAChC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACb,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,2FAA2F;KACrG,CAAC,CAAC,CAAC;IAEN,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,EAAE,KAAK,CAAC,KAAK;QACnB,OAAO,EAAE,sDAAsD;KAChE,CAAC,CAAC,CAAC;IAEJ,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"knex-unscoped.js","sourceRoot":"","sources":["../../../src/check/tenancy/knex-unscoped.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,yCAAyC;AACzC,MAAM,GAAG,GAAG,aAAa,CAAC;AAE1B,8EAA8E;AAC9E,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAgB;IAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;IAE3B,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC;SAChC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;SACtE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACb,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,2FAA2F;KACrG,CAAC,CAAC,CAAC;IAEN,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;SAChC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;SACnE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,sDAAsD,EAAE,CAAC,CAAC,CAAC;IAE9G,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,sFAAsF;AACtF,SAAS,WAAW,CAAC,IAAgB,EAAE,cAAsB;IAC3D,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAE9C,OAAO,IAAI,KAAK,SAAS,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Whether the literal SQL of a raw call can reach rows by itself. A statement of the schema that
3
+ * holds no word of rows cannot; an expression can only if it holds a word that reads or writes
4
+ * rows, starts a statement, or calls a function outside the expressions known to work on the
5
+ * rows already confined (a function call may run any statement).
6
+ */
7
+ export declare function rawReachesRows(sql: string): boolean;
8
+ //# sourceMappingURL=raw-reaches-rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-reaches-rows.d.ts","sourceRoot":"","sources":["../../../src/check/tenancy/raw-reaches-rows.ts"],"names":[],"mappings":"AAuEA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYnD"}
@@ -0,0 +1,91 @@
1
+ /** A statement of the schema: it changes tables, never reads or writes their rows. */
2
+ const SCHEMA_STATEMENT = /^\s*(?:create|alter|drop|comment)\b/i;
3
+ /** The words of SQL that read or write rows, whatever the statement they are in. */
4
+ const ROW_WORDS = /\b(?:select|insert|update|delete|from|join|into|truncate|merge|copy|values|call|execute|returning)\b/i;
5
+ /** Further words that start a statement or name a table in an expression: `table invoices`, `with ...`, `do ...`, `lock ...`. */
6
+ const STATEMENT_WORDS = /\b(?:table|with|do|lock|using|exists)\b/i;
7
+ /** What may be called in an expression over the rows a confined statement reads: aggregates, casts, arithmetic, text. */
8
+ const EXPRESSION_FUNCTIONS = new Set([
9
+ 'count',
10
+ 'sum',
11
+ 'avg',
12
+ 'min',
13
+ 'max',
14
+ 'coalesce',
15
+ 'nullif',
16
+ 'greatest',
17
+ 'least',
18
+ 'round',
19
+ 'floor',
20
+ 'ceil',
21
+ 'abs',
22
+ 'date_part',
23
+ 'date_trunc',
24
+ 'extract',
25
+ 'lower',
26
+ 'upper',
27
+ 'length',
28
+ 'concat',
29
+ 'to_char',
30
+ 'cast',
31
+ 'string_agg',
32
+ 'array_agg',
33
+ 'bool_and',
34
+ 'bool_or',
35
+ 'json_agg',
36
+ 'jsonb_agg',
37
+ 'json_build_object',
38
+ 'jsonb_build_object',
39
+ 'numeric',
40
+ 'decimal',
41
+ 'varchar',
42
+ 'char',
43
+ 'timestamp',
44
+ 'interval',
45
+ ]);
46
+ /** Words of SQL followed by a parenthesis that call nothing. */
47
+ const SYNTAX_BEFORE_PARENTHESIS = new Set([
48
+ 'in',
49
+ 'filter',
50
+ 'over',
51
+ 'any',
52
+ 'all',
53
+ 'and',
54
+ 'or',
55
+ 'not',
56
+ 'as',
57
+ 'by',
58
+ 'when',
59
+ 'then',
60
+ 'else',
61
+ 'where',
62
+ 'is',
63
+ ]);
64
+ const CALL = /([A-Za-z_][\w$]*)\s*\(/g;
65
+ /**
66
+ * Whether the literal SQL of a raw call can reach rows by itself. A statement of the schema that
67
+ * holds no word of rows cannot; an expression can only if it holds a word that reads or writes
68
+ * rows, starts a statement, or calls a function outside the expressions known to work on the
69
+ * rows already confined (a function call may run any statement).
70
+ */
71
+ export function rawReachesRows(sql) {
72
+ const text = withoutQuotedText(sql);
73
+ if (ROW_WORDS.test(text)) {
74
+ return true;
75
+ }
76
+ if (SCHEMA_STATEMENT.test(text)) {
77
+ return false;
78
+ }
79
+ return STATEMENT_WORDS.test(text) || callsAnUnknownFunction(text);
80
+ }
81
+ function callsAnUnknownFunction(text) {
82
+ return [...text.matchAll(CALL)].some(([, name = '']) => {
83
+ const word = name.toLowerCase();
84
+ return !EXPRESSION_FUNCTIONS.has(word) && !SYNTAX_BEFORE_PARENTHESIS.has(word);
85
+ });
86
+ }
87
+ /** Text in quotes says nothing of what the SQL does: `'.'`, `'epoch'`, a quoted identifier. */
88
+ function withoutQuotedText(sql) {
89
+ return sql.replace(/'(?:[^']|'')*'/g, "''").replace(/"(?:[^"]|"")*"/g, '""');
90
+ }
91
+ //# sourceMappingURL=raw-reaches-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-reaches-rows.js","sourceRoot":"","sources":["../../../src/check/tenancy/raw-reaches-rows.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AAEhE,oFAAoF;AACpF,MAAM,SAAS,GACb,uGAAuG,CAAC;AAE1G,iIAAiI;AACjI,MAAM,eAAe,GAAG,0CAA0C,CAAC;AAEnE,yHAAyH;AACzH,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,UAAU;IACV,QAAQ;IACR,UAAU;IACV,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,KAAK;IACL,WAAW;IACX,YAAY;IACZ,SAAS;IACT,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,YAAY;IACZ,WAAW;IACX,UAAU;IACV,SAAS;IACT,UAAU;IACV,WAAW;IACX,mBAAmB;IACnB,oBAAoB;IACpB,SAAS;IACT,SAAS;IACT,SAAS;IACT,MAAM;IACN,WAAW;IACX,UAAU;CACX,CAAC,CAAC;AAEH,gEAAgE;AAChE,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC;IACxC,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,IAAI;CACL,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,yBAAyB,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAEpC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEhC,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+FAA+F;AAC/F,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SourceFile } from '../model/source-file.js';
2
+ /**
3
+ * The SQL text of the first argument of a raw call, from the source: a string literal, or a
4
+ * template without interpolation. `undefined` when the argument is not a literal (a variable, a
5
+ * call) or is a template that interpolates: what an interpolation holds may be SQL of its own,
6
+ * and cannot be read here.
7
+ */
8
+ export declare function rawSqlText(file: SourceFile, argumentsStart: number): string | undefined;
9
+ //# sourceMappingURL=raw-sql-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-sql-text.d.ts","sourceRoot":"","sources":["../../../src/check/tenancy/raw-sql-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAK1D;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAgBvF"}
@@ -0,0 +1,29 @@
1
+ const QUOTES = new Set(["'", '"']);
2
+ const BACKTICK = '`';
3
+ /**
4
+ * The SQL text of the first argument of a raw call, from the source: a string literal, or a
5
+ * template without interpolation. `undefined` when the argument is not a literal (a variable, a
6
+ * call) or is a template that interpolates: what an interpolation holds may be SQL of its own,
7
+ * and cannot be read here.
8
+ */
9
+ export function rawSqlText(file, argumentsStart) {
10
+ const start = firstArgument(file.scan.code, argumentsStart);
11
+ const opening = file.scan.code.charAt(start);
12
+ if (QUOTES.has(opening)) {
13
+ return file.scan.strings.find((literal) => literal.start === start)?.value;
14
+ }
15
+ if (opening !== BACKTICK) {
16
+ return undefined;
17
+ }
18
+ const end = file.scan.code.indexOf(BACKTICK, start + 1);
19
+ const template = end === -1 ? undefined : file.text.slice(start + 1, end);
20
+ return template === undefined || template.includes('${') ? undefined : template;
21
+ }
22
+ function firstArgument(code, from) {
23
+ let index = from;
24
+ while (/\s/.test(code.charAt(index))) {
25
+ index += 1;
26
+ }
27
+ return index;
28
+ }
29
+ //# sourceMappingURL=raw-sql-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-sql-text.js","sourceRoot":"","sources":["../../../src/check/tenancy/raw-sql-text.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACnC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,cAAsB;IACjE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE7C,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC;IAC7E,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAE1E,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClF,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY;IAC/C,IAAI,KAAK,GAAG,IAAI,CAAC;IAEjB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACrC,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -40,6 +40,7 @@ const TEXTS = { type: 'string', multiple: true };
40
40
  const OPTIONS = {
41
41
  classification: TEXT,
42
42
  purpose: TEXT,
43
+ preset: TEXT,
43
44
  upstream: TEXTS,
44
45
  term: TEXTS,
45
46
  value: TEXTS,
@@ -109,6 +110,7 @@ function requestedKind(name, rest) {
109
110
  const TEXT_FLAGS = [
110
111
  'classification',
111
112
  'purpose',
113
+ 'preset',
112
114
  'code',
113
115
  'aggregate',
114
116
  'method',
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AA4C5C,eAAO,MAAM,WAAW,EAAE,OA8BzB,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AA4C5C,eAAO,MAAM,WAAW,EAAE,OA2BzB,CAAC"}
@@ -47,6 +47,7 @@ export const initCommand = (argv, io) => {
47
47
  const args = Arguments.parse(argv, {
48
48
  ...Object.fromEntries([...STACK_FLAGS, ...OTHER_TEXT_FLAGS].map((flag) => [flag, { type: 'string' }])),
49
49
  context: { type: 'string', multiple: true },
50
+ preset: { type: 'string', multiple: true },
50
51
  'dry-run': { type: 'boolean', default: false },
51
52
  force: { type: 'boolean', default: false },
52
53
  sdk: { type: 'boolean', default: false },
@@ -59,9 +60,18 @@ export const initCommand = (argv, io) => {
59
60
  if (!dryRun) {
60
61
  fs.mkdirSync(root, { recursive: true });
61
62
  }
62
- printReport(io, args, runInit(root, { ...stackOptions(args), contexts: args.many('context'), dryRun, force: args.flag('force') }));
63
+ printReport(io, args, runInit(root, initOptions(args, dryRun)));
63
64
  return 0;
64
65
  };
66
+ function initOptions(args, dryRun) {
67
+ return {
68
+ ...stackOptions(args),
69
+ contexts: args.many('context'),
70
+ presets: args.many('preset'),
71
+ dryRun,
72
+ force: args.flag('force'),
73
+ };
74
+ }
65
75
  function stackOptions(args) {
66
76
  const docsUi = args.text('docs-ui');
67
77
  const httpCache = args.text('http-cache');
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The `injected(..)` statements one under the other, as the layout rules of a generated project
3
+ * want them: a statement the width broke over several lines is set apart by a blank line, before
4
+ * and after it (`clean/blank-lines`).
5
+ */
6
+ export declare function laidOutCalls(calls: readonly string[]): string;
7
+ //# sourceMappingURL=laid-out-calls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laid-out-calls.d.ts","sourceRoot":"","sources":["../../../src/declared/injection/laid-out-calls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAQ7D"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The `injected(..)` statements one under the other, as the layout rules of a generated project
3
+ * want them: a statement the width broke over several lines is set apart by a blank line, before
4
+ * and after it (`clean/blank-lines`).
5
+ */
6
+ export function laidOutCalls(calls) {
7
+ return calls
8
+ .map((call, index) => {
9
+ const apart = index > 0 && (call.includes('\n') || (calls[index - 1]?.includes('\n') ?? false));
10
+ return apart ? `\n${call}` : call;
11
+ })
12
+ .join('\n');
13
+ }
14
+ //# sourceMappingURL=laid-out-calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laid-out-calls.js","sourceRoot":"","sources":["../../../src/declared/injection/laid-out-calls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAEhG,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"render-barrel.d.ts","sourceRoot":"","sources":["../../src/declared/render-barrel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAI7E;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACrC,QAAQ,GAAE,kBAA4B,GACrC,MAAM,CAcR"}
1
+ {"version":3,"file":"render-barrel.d.ts","sourceRoot":"","sources":["../../src/declared/render-barrel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAI7E;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACrC,QAAQ,GAAE,kBAA4B,GACrC,MAAM,CAcR"}
@@ -1,4 +1,5 @@
1
1
  import { declaredRoleOf } from './declared-role-of.js';
2
+ import { laidOutCalls } from './injection/laid-out-calls.js';
2
3
  const NOTHING = { imports: [], calls: [] };
3
4
  /**
4
5
  * The barrel of a context: one `export *` per role file, named by the specifier `specifierOf`
@@ -17,7 +18,7 @@ export function renderBarrel(files, specifierOf, injected = NOTHING) {
17
18
  if (injected.calls.length === 0) {
18
19
  return `${exported}\n`;
19
20
  }
20
- return `${injected.imports.join('\n')}\n\n${exported}\n\n${injected.calls.join('\n')}\n`;
21
+ return `${injected.imports.join('\n')}\n\n${exported}\n\n${laidOutCalls(injected.calls)}\n`;
21
22
  }
22
23
  function byPath(left, right) {
23
24
  if (left === right) {
@@ -1 +1 @@
1
- {"version":3,"file":"render-barrel.js","sourceRoot":"","sources":["../../src/declared/render-barrel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,MAAM,OAAO,GAAuB,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAE/D;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAwB,EACxB,WAAqC,EACrC,QAAQ,GAAuB,OAAO;IAEtC,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAExG,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7F,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,QAAQ,IAAI,CAAC;IACzB,CAAC;IAED,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,QAAQ,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3F,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,KAAa;IACzC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"render-barrel.js","sourceRoot":"","sources":["../../src/declared/render-barrel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D,MAAM,OAAO,GAAuB,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAE/D;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAwB,EACxB,WAAqC,EACrC,QAAQ,GAAuB,OAAO;IAEtC,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAExG,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7F,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,QAAQ,IAAI,CAAC;IACzB,CAAC;IAED,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,QAAQ,OAAO,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9F,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,KAAa;IACzC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"render-dependencies-file.d.ts","sourceRoot":"","sources":["../../src/declared/render-dependencies-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAM3E"}
1
+ {"version":3,"file":"render-dependencies-file.d.ts","sourceRoot":"","sources":["../../src/declared/render-dependencies-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAM3E"}
@@ -1,3 +1,4 @@
1
+ import { laidOutCalls } from './injection/laid-out-calls.js';
1
2
  /**
2
3
  * What `<context>.dependencies.ts` holds under discovery: the imports and the
3
4
  * `injected(Class, [Tokens])` statements read from the constructor signatures, and nothing
@@ -7,6 +8,6 @@ export function renderDependenciesFile(injected) {
7
8
  if (injected.calls.length === 0) {
8
9
  return 'export {};\n';
9
10
  }
10
- return `${injected.imports.join('\n')}\n\n${injected.calls.join('\n')}\n`;
11
+ return `${injected.imports.join('\n')}\n\n${laidOutCalls(injected.calls)}\n`;
11
12
  }
12
13
  //# sourceMappingURL=render-dependencies-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-dependencies-file.js","sourceRoot":"","sources":["../../src/declared/render-dependencies-file.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA4B;IACjE,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5E,CAAC"}
1
+ {"version":3,"file":"render-dependencies-file.js","sourceRoot":"","sources":["../../src/declared/render-dependencies-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA4B;IACjE,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;AAC/E,CAAC"}
@@ -6,6 +6,8 @@ export interface KindFlags {
6
6
  readonly upstream: readonly string[];
7
7
  /** `<Term>=<meaning>` rows to add to the glossary of the context. */
8
8
  readonly term: readonly string[];
9
+ /** `generate context --preset <name>`: the context is written whole from that preset. */
10
+ readonly preset?: string;
9
11
  /** The values of a closed vocabulary, one per `--value`. */
10
12
  readonly value: readonly string[];
11
13
  /** The transitions of a state machine, one per `--transition "<intention>:<from>[,<from>]...[><to>]"`. */
@@ -1 +1 @@
1
- {"version":3,"file":"kind.d.ts","sourceRoot":"","sources":["../../src/generate/kind.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kind.d.ts","sourceRoot":"","sources":["../../src/generate/kind.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"context-kind.d.ts","sourceRoot":"","sources":["../../../src/generate/kinds/context-kind.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,eAAO,MAAM,WAAW,EAAE,IAkBzB,CAAC"}
1
+ {"version":3,"file":"context-kind.d.ts","sourceRoot":"","sources":["../../../src/generate/kinds/context-kind.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAMvC,eAAO,MAAM,WAAW,EAAE,IAyBzB,CAAC"}