@m5kdev/backend 0.8.7 → 0.8.8

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 (386) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +33 -0
  2. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/api/index.d.cts +1 -0
  3. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/factory.d.cts +1 -0
  4. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/get-field-attributes.d.cts +1 -0
  5. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/get-id-field.d.cts +1 -0
  6. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/index.d.cts +1 -0
  7. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/types.d.cts +1 -0
  8. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/get-tables.d.cts +1 -0
  9. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/index.d.cts +1 -0
  10. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/account.d.cts +1 -0
  11. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/rate-limit.d.cts +1 -0
  12. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/session.d.cts +1 -0
  13. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/shared.d.cts +1 -0
  14. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/user.d.cts +1 -0
  15. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/verification.d.cts +1 -0
  16. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/index.d.cts +1 -0
  17. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/social-providers/index.d.cts +1 -0
  18. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/context.d.cts +1 -0
  19. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/helper.d.cts +7 -0
  20. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/init-options.d.cts +1 -0
  21. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/plugin-client.d.cts +1 -0
  22. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/plugin.d.cts +1 -0
  23. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect-adapter-base.d.cts +1 -0
  24. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect-adapter.d.cts +1 -0
  25. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect.d.cts +1 -0
  26. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-adapter.d.cts +1 -0
  27. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-dialect.d.cts +1 -0
  28. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-introspector.d.cts +1 -0
  29. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-adapter.d.cts +1 -0
  30. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-dialect.d.cts +1 -0
  31. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-introspector.d.cts +1 -0
  32. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-adapter.d.cts +1 -0
  33. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-dialect.d.cts +1 -0
  34. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-introspector.d.cts +1 -0
  35. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-adapter.d.cts +1 -0
  36. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-dialect.d.cts +1 -0
  37. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-introspector.d.cts +1 -0
  38. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/expression/expression-builder.d.cts +1 -0
  39. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/index.d.cts +1 -0
  40. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/kysely.d.cts +38 -0
  41. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/migration/file-migration-provider.d.cts +1 -0
  42. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/migration/migrator.d.cts +1 -0
  43. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/binary-operation-parser.d.cts +1 -0
  44. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/delete-from-parser.d.cts +1 -0
  45. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/expression-parser.d.cts +1 -0
  46. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/group-by-parser.d.cts +1 -0
  47. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/insert-values-parser.d.cts +1 -0
  48. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/join-parser.d.cts +1 -0
  49. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/merge-into-parser.d.cts +1 -0
  50. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/reference-parser.d.cts +1 -0
  51. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/returning-parser.d.cts +1 -0
  52. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/select-from-parser.d.cts +1 -0
  53. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/select-parser.d.cts +1 -0
  54. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/set-operation-parser.d.cts +1 -0
  55. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/tuple-parser.d.cts +1 -0
  56. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/unary-operation-parser.d.cts +1 -0
  57. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/update-parser.d.cts +1 -0
  58. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/update-set-parser.d.cts +1 -0
  59. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/value-parser.d.cts +1 -0
  60. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/with-parser.d.cts +1 -0
  61. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/case-builder.d.cts +1 -0
  62. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/delete-query-builder.d.cts +1 -0
  63. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/having-interface.d.cts +1 -0
  64. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/insert-query-builder.d.cts +1 -0
  65. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/join-builder.d.cts +1 -0
  66. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/merge-query-builder.d.cts +1 -0
  67. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/on-conflict-builder.d.cts +1 -0
  68. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/output-interface.d.cts +1 -0
  69. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/returning-interface.d.cts +1 -0
  70. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/select-query-builder.d.cts +1 -0
  71. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/update-query-builder.d.cts +1 -0
  72. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/where-interface.d.cts +1 -0
  73. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-creator.d.cts +1 -0
  74. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/default-query-executor.d.cts +1 -0
  75. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/noop-query-executor.d.cts +1 -0
  76. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor-base.d.cts +1 -0
  77. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor-provider.d.cts +1 -0
  78. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor.d.cts +1 -0
  79. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/raw-builder/raw-builder.d.cts +1 -0
  80. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/raw-builder/sql.d.cts +1 -0
  81. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.d.cts +1 -0
  82. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-add-index-builder.d.cts +1 -0
  83. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-builder.d.cts +1 -0
  84. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-drop-constraint-builder.d.cts +1 -0
  85. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-executor.d.cts +1 -0
  86. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-index-builder.d.cts +1 -0
  87. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-schema-builder.d.cts +1 -0
  88. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-table-builder.d.cts +1 -0
  89. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-type-builder.d.cts +1 -0
  90. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-view-builder.d.cts +1 -0
  91. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-index-builder.d.cts +1 -0
  92. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-schema-builder.d.cts +1 -0
  93. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-table-builder.d.cts +1 -0
  94. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-type-builder.d.cts +1 -0
  95. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-view-builder.d.cts +1 -0
  96. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/refresh-materialized-view-builder.d.cts +1 -0
  97. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/schema.d.cts +1 -0
  98. package/dist/src/lib/posthog.cjs +8 -0
  99. package/dist/src/lib/posthog.cjs.map +1 -0
  100. package/dist/src/lib/posthog.d.cts +7 -0
  101. package/dist/src/lib/sentry.cjs +11 -0
  102. package/dist/src/lib/sentry.cjs.map +1 -0
  103. package/dist/src/lib/sentry.d.cts +1 -0
  104. package/dist/src/modules/access/access.repository.cjs +26 -0
  105. package/dist/src/modules/access/access.repository.cjs.map +1 -0
  106. package/dist/src/modules/access/access.repository.d.cts +2352 -0
  107. package/dist/src/modules/access/access.service.cjs +42 -0
  108. package/dist/src/modules/access/access.service.cjs.map +1 -0
  109. package/dist/src/modules/access/access.service.d.cts +25 -0
  110. package/dist/src/modules/access/access.utils.cjs +23 -0
  111. package/dist/src/modules/access/access.utils.cjs.map +1 -0
  112. package/dist/src/modules/access/access.utils.d.cts +19 -0
  113. package/dist/src/modules/ai/ai.db.cjs +46 -0
  114. package/dist/src/modules/ai/ai.db.cjs.map +1 -0
  115. package/dist/src/modules/ai/ai.db.d.cts +401 -0
  116. package/dist/src/modules/ai/ai.prompt.cjs +33 -0
  117. package/dist/src/modules/ai/ai.prompt.cjs.map +1 -0
  118. package/dist/src/modules/ai/ai.prompt.d.cts +30 -0
  119. package/dist/src/modules/ai/ai.prompts.cjs +18 -0
  120. package/dist/src/modules/ai/ai.prompts.cjs.map +1 -0
  121. package/dist/src/modules/ai/ai.prompts.d.cts +10 -0
  122. package/dist/src/modules/ai/ai.repository.cjs +25 -0
  123. package/dist/src/modules/ai/ai.repository.cjs.map +1 -0
  124. package/dist/src/modules/ai/ai.repository.d.cts +428 -0
  125. package/dist/src/modules/ai/ai.router.cjs +0 -0
  126. package/dist/src/modules/ai/ai.router.d.cts +1 -0
  127. package/dist/src/modules/ai/ai.service.cjs +312 -0
  128. package/dist/src/modules/ai/ai.service.cjs.map +1 -0
  129. package/dist/src/modules/ai/ai.service.d.cts +141 -0
  130. package/dist/src/modules/ai/ai.trpc.cjs +19 -0
  131. package/dist/src/modules/ai/ai.trpc.cjs.map +1 -0
  132. package/dist/src/modules/ai/ai.trpc.d.cts +31 -0
  133. package/dist/src/modules/ai/ideogram/ideogram.constants.cjs +191 -0
  134. package/dist/src/modules/ai/ideogram/ideogram.constants.cjs.map +1 -0
  135. package/dist/src/modules/ai/ideogram/ideogram.constants.d.cts +11 -0
  136. package/dist/src/modules/ai/ideogram/ideogram.dto.cjs +49 -0
  137. package/dist/src/modules/ai/ideogram/ideogram.dto.cjs.map +1 -0
  138. package/dist/src/modules/ai/ideogram/ideogram.dto.d.cts +234 -0
  139. package/dist/src/modules/ai/ideogram/ideogram.prompt.cjs +862 -0
  140. package/dist/src/modules/ai/ideogram/ideogram.prompt.cjs.map +1 -0
  141. package/dist/src/modules/ai/ideogram/ideogram.prompt.d.cts +7 -0
  142. package/dist/src/modules/ai/ideogram/ideogram.repository.cjs +34 -0
  143. package/dist/src/modules/ai/ideogram/ideogram.repository.cjs.map +1 -0
  144. package/dist/src/modules/ai/ideogram/ideogram.repository.d.cts +11 -0
  145. package/dist/src/modules/ai/ideogram/ideogram.service.cjs +12 -0
  146. package/dist/src/modules/ai/ideogram/ideogram.service.cjs.map +1 -0
  147. package/dist/src/modules/ai/ideogram/ideogram.service.d.cts +14 -0
  148. package/dist/src/modules/auth/auth.db.cjs +187 -0
  149. package/dist/src/modules/auth/auth.db.cjs.map +1 -0
  150. package/dist/src/modules/auth/auth.db.d.cts +2341 -0
  151. package/dist/src/modules/auth/auth.dto.cjs +50 -0
  152. package/dist/src/modules/auth/auth.dto.cjs.map +1 -0
  153. package/dist/src/modules/auth/auth.dto.d.cts +70 -0
  154. package/dist/src/modules/auth/auth.dto.d.mts +2 -2
  155. package/dist/src/modules/auth/auth.lib.cjs +234 -0
  156. package/dist/src/modules/auth/auth.lib.cjs.map +1 -0
  157. package/dist/src/modules/auth/auth.lib.d.cts +4894 -0
  158. package/dist/src/modules/auth/auth.lib.d.mts +1 -1
  159. package/dist/src/modules/auth/auth.middleware.cjs +41 -0
  160. package/dist/src/modules/auth/auth.middleware.cjs.map +1 -0
  161. package/dist/src/modules/auth/auth.middleware.d.cts +619 -0
  162. package/dist/src/modules/auth/auth.repository.cjs +403 -0
  163. package/dist/src/modules/auth/auth.repository.cjs.map +1 -0
  164. package/dist/src/modules/auth/auth.repository.d.cts +2453 -0
  165. package/dist/src/modules/auth/auth.service.cjs +229 -0
  166. package/dist/src/modules/auth/auth.service.cjs.map +1 -0
  167. package/dist/src/modules/auth/auth.service.d.cts +105 -0
  168. package/dist/src/modules/auth/auth.trpc.cjs +110 -0
  169. package/dist/src/modules/auth/auth.trpc.cjs.map +1 -0
  170. package/dist/src/modules/auth/auth.trpc.d.cts +303 -0
  171. package/dist/src/modules/auth/auth.trpc.d.mts +6 -6
  172. package/dist/src/modules/auth/auth.utils.cjs +80 -0
  173. package/dist/src/modules/auth/auth.utils.cjs.map +1 -0
  174. package/dist/src/modules/auth/auth.utils.d.cts +2356 -0
  175. package/dist/src/modules/base/base.abstract.cjs +62 -0
  176. package/dist/src/modules/base/base.abstract.cjs.map +1 -0
  177. package/dist/src/modules/base/base.abstract.d.cts +29 -0
  178. package/dist/src/modules/base/base.actor.cjs +83 -0
  179. package/dist/src/modules/base/base.actor.cjs.map +1 -0
  180. package/dist/src/modules/base/base.actor.d.cts +73 -0
  181. package/dist/src/modules/base/base.dto.cjs +98 -0
  182. package/dist/src/modules/base/base.dto.cjs.map +1 -0
  183. package/dist/src/modules/base/base.dto.d.cts +67 -0
  184. package/dist/src/modules/base/base.grants.cjs +107 -0
  185. package/dist/src/modules/base/base.grants.cjs.map +1 -0
  186. package/dist/src/modules/base/base.grants.d.cts +28 -0
  187. package/dist/src/modules/base/base.procedure.cjs +255 -0
  188. package/dist/src/modules/base/base.procedure.cjs.map +1 -0
  189. package/dist/src/modules/base/base.procedure.d.cts +111 -0
  190. package/dist/src/modules/base/base.repository.cjs +269 -0
  191. package/dist/src/modules/base/base.repository.cjs.map +1 -0
  192. package/dist/src/modules/base/base.repository.d.cts +125 -0
  193. package/dist/src/modules/base/base.repository.d.mts +2 -0
  194. package/dist/src/modules/base/base.repository.mjs +12 -0
  195. package/dist/src/modules/base/base.repository.mjs.map +1 -1
  196. package/dist/src/modules/base/base.service.cjs +119 -0
  197. package/dist/src/modules/base/base.service.cjs.map +1 -0
  198. package/dist/src/modules/base/base.service.d.cts +44 -0
  199. package/dist/src/modules/base/base.types.cjs +0 -0
  200. package/dist/src/modules/base/base.types.d.cts +5 -0
  201. package/dist/src/modules/billing/billing.db.cjs +38 -0
  202. package/dist/src/modules/billing/billing.db.cjs.map +1 -0
  203. package/dist/src/modules/billing/billing.db.d.cts +371 -0
  204. package/dist/src/modules/billing/billing.repository.cjs +190 -0
  205. package/dist/src/modules/billing/billing.repository.cjs.map +1 -0
  206. package/dist/src/modules/billing/billing.repository.d.cts +2787 -0
  207. package/dist/src/modules/billing/billing.router.cjs +43 -0
  208. package/dist/src/modules/billing/billing.router.cjs.map +1 -0
  209. package/dist/src/modules/billing/billing.router.d.cts +9 -0
  210. package/dist/src/modules/billing/billing.service.cjs +127 -0
  211. package/dist/src/modules/billing/billing.service.cjs.map +1 -0
  212. package/dist/src/modules/billing/billing.service.d.cts +53 -0
  213. package/dist/src/modules/billing/billing.trpc.cjs +19 -0
  214. package/dist/src/modules/billing/billing.trpc.cjs.map +1 -0
  215. package/dist/src/modules/billing/billing.trpc.d.cts +48 -0
  216. package/dist/src/modules/clay/clay.repository.cjs +29 -0
  217. package/dist/src/modules/clay/clay.repository.cjs.map +1 -0
  218. package/dist/src/modules/clay/clay.repository.d.cts +10 -0
  219. package/dist/src/modules/clay/clay.service.cjs +24 -0
  220. package/dist/src/modules/clay/clay.service.cjs.map +1 -0
  221. package/dist/src/modules/clay/clay.service.d.cts +32 -0
  222. package/dist/src/modules/connect/connect.db.cjs +37 -0
  223. package/dist/src/modules/connect/connect.db.cjs.map +1 -0
  224. package/dist/src/modules/connect/connect.db.d.cts +362 -0
  225. package/dist/src/modules/connect/connect.dto.cjs +45 -0
  226. package/dist/src/modules/connect/connect.dto.cjs.map +1 -0
  227. package/dist/src/modules/connect/connect.dto.d.cts +79 -0
  228. package/dist/src/modules/connect/connect.dto.d.mts +2 -2
  229. package/dist/src/modules/connect/connect.linkedin.cjs +48 -0
  230. package/dist/src/modules/connect/connect.linkedin.cjs.map +1 -0
  231. package/dist/src/modules/connect/connect.linkedin.d.cts +7 -0
  232. package/dist/src/modules/connect/connect.oauth.cjs +153 -0
  233. package/dist/src/modules/connect/connect.oauth.cjs.map +1 -0
  234. package/dist/src/modules/connect/connect.oauth.d.cts +32 -0
  235. package/dist/src/modules/connect/connect.repository.cjs +42 -0
  236. package/dist/src/modules/connect/connect.repository.cjs.map +1 -0
  237. package/dist/src/modules/connect/connect.repository.d.cts +419 -0
  238. package/dist/src/modules/connect/connect.repository.d.mts +1 -1
  239. package/dist/src/modules/connect/connect.router.cjs +48 -0
  240. package/dist/src/modules/connect/connect.router.cjs.map +1 -0
  241. package/dist/src/modules/connect/connect.router.d.cts +9 -0
  242. package/dist/src/modules/connect/connect.service.cjs +90 -0
  243. package/dist/src/modules/connect/connect.service.cjs.map +1 -0
  244. package/dist/src/modules/connect/connect.service.d.cts +103 -0
  245. package/dist/src/modules/connect/connect.service.d.mts +2 -2
  246. package/dist/src/modules/connect/connect.trpc.cjs +18 -0
  247. package/dist/src/modules/connect/connect.trpc.cjs.map +1 -0
  248. package/dist/src/modules/connect/connect.trpc.d.cts +53 -0
  249. package/dist/src/modules/connect/connect.types.cjs +0 -0
  250. package/dist/src/modules/connect/connect.types.d.cts +29 -0
  251. package/dist/src/modules/crypto/crypto.db.cjs +26 -0
  252. package/dist/src/modules/crypto/crypto.db.cjs.map +1 -0
  253. package/dist/src/modules/crypto/crypto.db.d.cts +157 -0
  254. package/dist/src/modules/crypto/crypto.repository.cjs +9 -0
  255. package/dist/src/modules/crypto/crypto.repository.cjs.map +1 -0
  256. package/dist/src/modules/crypto/crypto.repository.d.cts +163 -0
  257. package/dist/src/modules/crypto/crypto.service.cjs +46 -0
  258. package/dist/src/modules/crypto/crypto.service.cjs.map +1 -0
  259. package/dist/src/modules/crypto/crypto.service.d.cts +15 -0
  260. package/dist/src/modules/email/email.service.cjs +107 -0
  261. package/dist/src/modules/email/email.service.cjs.map +1 -0
  262. package/dist/src/modules/email/email.service.d.cts +62 -0
  263. package/dist/src/modules/file/file.repository.cjs +74 -0
  264. package/dist/src/modules/file/file.repository.cjs.map +1 -0
  265. package/dist/src/modules/file/file.repository.d.cts +17 -0
  266. package/dist/src/modules/file/file.router.cjs +94 -0
  267. package/dist/src/modules/file/file.router.cjs.map +1 -0
  268. package/dist/src/modules/file/file.router.d.cts +7 -0
  269. package/dist/src/modules/file/file.service.cjs +120 -0
  270. package/dist/src/modules/file/file.service.cjs.map +1 -0
  271. package/dist/src/modules/file/file.service.d.cts +30 -0
  272. package/dist/src/modules/recurrence/recurrence.db.cjs +55 -0
  273. package/dist/src/modules/recurrence/recurrence.db.cjs.map +1 -0
  274. package/dist/src/modules/recurrence/recurrence.db.d.cts +568 -0
  275. package/dist/src/modules/recurrence/recurrence.repository.cjs +31 -0
  276. package/dist/src/modules/recurrence/recurrence.repository.cjs.map +1 -0
  277. package/dist/src/modules/recurrence/recurrence.repository.d.cts +588 -0
  278. package/dist/src/modules/recurrence/recurrence.service.cjs +66 -0
  279. package/dist/src/modules/recurrence/recurrence.service.cjs.map +1 -0
  280. package/dist/src/modules/recurrence/recurrence.service.d.cts +88 -0
  281. package/dist/src/modules/recurrence/recurrence.service.d.mts +3 -2
  282. package/dist/src/modules/recurrence/recurrence.service.mjs +1 -1
  283. package/dist/src/modules/recurrence/recurrence.service.mjs.map +1 -1
  284. package/dist/src/modules/recurrence/recurrence.trpc.cjs +46 -0
  285. package/dist/src/modules/recurrence/recurrence.trpc.cjs.map +1 -0
  286. package/dist/src/modules/recurrence/recurrence.trpc.d.cts +216 -0
  287. package/dist/src/modules/recurrence/recurrence.trpc.d.mts +1 -0
  288. package/dist/src/modules/social/social.dto.cjs +26 -0
  289. package/dist/src/modules/social/social.dto.cjs.map +1 -0
  290. package/dist/src/modules/social/social.dto.d.cts +39 -0
  291. package/dist/src/modules/social/social.linkedin.cjs +349 -0
  292. package/dist/src/modules/social/social.linkedin.cjs.map +1 -0
  293. package/dist/src/modules/social/social.linkedin.d.cts +15 -0
  294. package/dist/src/modules/social/social.service.cjs +57 -0
  295. package/dist/src/modules/social/social.service.cjs.map +1 -0
  296. package/dist/src/modules/social/social.service.d.cts +34 -0
  297. package/dist/src/modules/social/social.types.cjs +0 -0
  298. package/dist/src/modules/social/social.types.d.cts +40 -0
  299. package/dist/src/modules/tag/tag.db.cjs +43 -0
  300. package/dist/src/modules/tag/tag.db.cjs.map +1 -0
  301. package/dist/src/modules/tag/tag.db.d.cts +352 -0
  302. package/dist/src/modules/tag/tag.dto.cjs +15 -0
  303. package/dist/src/modules/tag/tag.dto.cjs.map +1 -0
  304. package/dist/src/modules/tag/tag.dto.d.cts +1025 -0
  305. package/dist/src/modules/tag/tag.repository.cjs +116 -0
  306. package/dist/src/modules/tag/tag.repository.cjs.map +1 -0
  307. package/dist/src/modules/tag/tag.repository.d.cts +394 -0
  308. package/dist/src/modules/tag/tag.service.cjs +48 -0
  309. package/dist/src/modules/tag/tag.service.cjs.map +1 -0
  310. package/dist/src/modules/tag/tag.service.d.cts +120 -0
  311. package/dist/src/modules/tag/tag.trpc.cjs +32 -0
  312. package/dist/src/modules/tag/tag.trpc.cjs.map +1 -0
  313. package/dist/src/modules/tag/tag.trpc.d.cts +174 -0
  314. package/dist/src/modules/tag/tag.trpc.d.mts +1 -0
  315. package/dist/src/modules/utils/applyPagination.cjs +16 -0
  316. package/dist/src/modules/utils/applyPagination.cjs.map +1 -0
  317. package/dist/src/modules/utils/applyPagination.d.cts +10 -0
  318. package/dist/src/modules/utils/applySorting.cjs +20 -0
  319. package/dist/src/modules/utils/applySorting.cjs.map +1 -0
  320. package/dist/src/modules/utils/applySorting.d.cts +13 -0
  321. package/dist/src/modules/utils/getConditionsFromFilters.cjs +152 -0
  322. package/dist/src/modules/utils/getConditionsFromFilters.cjs.map +1 -0
  323. package/dist/src/modules/utils/getConditionsFromFilters.d.cts +9 -0
  324. package/dist/src/modules/utils/getGlobalSearchCondition.cjs +30 -0
  325. package/dist/src/modules/utils/getGlobalSearchCondition.cjs.map +1 -0
  326. package/dist/src/modules/utils/getGlobalSearchCondition.d.cts +18 -0
  327. package/dist/src/modules/utils/getGlobalSearchCondition.d.mts +18 -0
  328. package/dist/src/modules/utils/getGlobalSearchCondition.mjs +26 -0
  329. package/dist/src/modules/utils/getGlobalSearchCondition.mjs.map +1 -0
  330. package/dist/src/modules/video/video.service.cjs +114 -0
  331. package/dist/src/modules/video/video.service.cjs.map +1 -0
  332. package/dist/src/modules/video/video.service.d.cts +12 -0
  333. package/dist/src/modules/video/video.service.mjs.map +1 -1
  334. package/dist/src/modules/webhook/webhook.constants.cjs +13 -0
  335. package/dist/src/modules/webhook/webhook.constants.cjs.map +1 -0
  336. package/dist/src/modules/webhook/webhook.constants.d.cts +12 -0
  337. package/dist/src/modules/webhook/webhook.db.cjs +19 -0
  338. package/dist/src/modules/webhook/webhook.db.cjs.map +1 -0
  339. package/dist/src/modules/webhook/webhook.db.d.cts +142 -0
  340. package/dist/src/modules/webhook/webhook.dto.cjs +11 -0
  341. package/dist/src/modules/webhook/webhook.dto.cjs.map +1 -0
  342. package/dist/src/modules/webhook/webhook.dto.d.cts +402 -0
  343. package/dist/src/modules/webhook/webhook.repository.cjs +52 -0
  344. package/dist/src/modules/webhook/webhook.repository.cjs.map +1 -0
  345. package/dist/src/modules/webhook/webhook.repository.d.cts +154 -0
  346. package/dist/src/modules/webhook/webhook.router.cjs +26 -0
  347. package/dist/src/modules/webhook/webhook.router.cjs.map +1 -0
  348. package/dist/src/modules/webhook/webhook.router.d.cts +8 -0
  349. package/dist/src/modules/webhook/webhook.service.cjs +61 -0
  350. package/dist/src/modules/webhook/webhook.service.cjs.map +1 -0
  351. package/dist/src/modules/webhook/webhook.service.d.cts +14 -0
  352. package/dist/src/modules/workflow/workflow.db.cjs +35 -0
  353. package/dist/src/modules/workflow/workflow.db.cjs.map +1 -0
  354. package/dist/src/modules/workflow/workflow.db.d.cts +302 -0
  355. package/dist/src/modules/workflow/workflow.repository.cjs +95 -0
  356. package/dist/src/modules/workflow/workflow.repository.cjs.map +1 -0
  357. package/dist/src/modules/workflow/workflow.repository.d.cts +371 -0
  358. package/dist/src/modules/workflow/workflow.service.cjs +41 -0
  359. package/dist/src/modules/workflow/workflow.service.cjs.map +1 -0
  360. package/dist/src/modules/workflow/workflow.service.d.cts +68 -0
  361. package/dist/src/modules/workflow/workflow.trpc.cjs +19 -0
  362. package/dist/src/modules/workflow/workflow.trpc.cjs.map +1 -0
  363. package/dist/src/modules/workflow/workflow.trpc.d.cts +65 -0
  364. package/dist/src/modules/workflow/workflow.types.cjs +0 -0
  365. package/dist/src/modules/workflow/workflow.types.d.cts +25 -0
  366. package/dist/src/modules/workflow/workflow.utils.cjs +185 -0
  367. package/dist/src/modules/workflow/workflow.utils.cjs.map +1 -0
  368. package/dist/src/modules/workflow/workflow.utils.d.cts +36 -0
  369. package/dist/src/types.cjs +12 -0
  370. package/dist/src/types.cjs.map +1 -0
  371. package/dist/src/types.d.cts +344 -0
  372. package/dist/src/utils/errors.cjs +101 -0
  373. package/dist/src/utils/errors.cjs.map +1 -0
  374. package/dist/src/utils/errors.d.cts +62 -0
  375. package/dist/src/utils/logger.cjs +13 -0
  376. package/dist/src/utils/logger.cjs.map +1 -0
  377. package/dist/src/utils/logger.d.cts +7 -0
  378. package/dist/src/utils/posthog.cjs +31 -0
  379. package/dist/src/utils/posthog.cjs.map +1 -0
  380. package/dist/src/utils/posthog.d.cts +17 -0
  381. package/dist/src/utils/trpc.cjs +156 -0
  382. package/dist/src/utils/trpc.cjs.map +1 -0
  383. package/dist/src/utils/trpc.d.cts +54 -0
  384. package/dist/src/utils/types.cjs +0 -0
  385. package/dist/src/utils/types.d.cts +9 -0
  386. package/package.json +171 -45
@@ -0,0 +1,255 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../_virtual/_rolldown/runtime.cjs");
3
+ const require_src_modules_base_base_actor = require("./base.actor.cjs");
4
+ let neverthrow = require("neverthrow");
5
+ //#region src/modules/base/base.procedure.ts
6
+ const DEFAULT_CONTEXT_FILTER_INCLUDE = ["user"];
7
+ function isServerResult(value) {
8
+ return typeof value === "object" && value !== null && "isErr" in value && typeof value.isErr === "function" && "isOk" in value && typeof value.isOk === "function";
9
+ }
10
+ async function normalizeProcedureResult(result) {
11
+ const resolved = await result;
12
+ return isServerResult(resolved) ? resolved : (0, neverthrow.ok)(resolved);
13
+ }
14
+ function assertUniqueStepName(steps, stepName) {
15
+ if (steps.some((step) => step.stepName === stepName)) throw new Error(`Duplicate service procedure step name: ${stepName}`);
16
+ }
17
+ function hasStepName(steps, stepName) {
18
+ return steps.some((step) => step.stepName === stepName);
19
+ }
20
+ function getContextFilterInclude(include = DEFAULT_CONTEXT_FILTER_INCLUDE) {
21
+ return {
22
+ user: include.includes("user"),
23
+ organization: include.includes("organization"),
24
+ team: include.includes("team")
25
+ };
26
+ }
27
+ function getFailureStage(code) {
28
+ return code === "FORBIDDEN" || code === "UNAUTHORIZED" ? "forbidden" : "error";
29
+ }
30
+ function logProcedureStage(host, procedureName, ctx, stage, { stepName, durationMs, errorCode } = {}) {
31
+ host.logger.debug({
32
+ procedureName,
33
+ stage,
34
+ stepName,
35
+ durationMs,
36
+ errorCode,
37
+ hasActor: Boolean(ctx.actor)
38
+ });
39
+ }
40
+ function requireProcedureActor(host, ctx, scope) {
41
+ if (!ctx.actor) return host.error("UNAUTHORIZED", "Unauthorized");
42
+ if (!require_src_modules_base_base_actor.validateActor(ctx.actor, scope)) return host.error("FORBIDDEN", "Forbidden");
43
+ return (0, neverthrow.ok)(ctx.actor);
44
+ }
45
+ function createRequireAuthStep(host, scope = "user") {
46
+ return {
47
+ stage: "auth",
48
+ stepName: "auth",
49
+ run: async ({ ctx }) => {
50
+ return requireProcedureActor(host, ctx, scope);
51
+ }
52
+ };
53
+ }
54
+ function createUseStep(stepName, step) {
55
+ return {
56
+ stage: "use",
57
+ stepName,
58
+ run: async (args) => normalizeProcedureResult(step(args))
59
+ };
60
+ }
61
+ function createInputStep(stepName, step) {
62
+ return {
63
+ stage: "input",
64
+ stepName,
65
+ run: async (args) => normalizeProcedureResult(step(args))
66
+ };
67
+ }
68
+ function createContextFilterStep(host, include) {
69
+ const contextInclude = getContextFilterInclude(include);
70
+ const requiredScope = contextInclude.team ? "team" : contextInclude.organization ? "organization" : "user";
71
+ return {
72
+ stage: "input",
73
+ stepName: "contextFilter",
74
+ run: async ({ input, ctx }) => {
75
+ const actor = requireProcedureActor(host, ctx, requiredScope);
76
+ if (actor.isErr()) return actor;
77
+ return (0, neverthrow.ok)(host.addContextFilter(actor.value, contextInclude, input));
78
+ }
79
+ };
80
+ }
81
+ function createAccessStep(host, config) {
82
+ return {
83
+ stage: "access",
84
+ stepName: "access",
85
+ run: async (args) => {
86
+ const typedArgs = args;
87
+ const actor = requireProcedureActor(host, typedArgs.ctx, "user");
88
+ if (actor.isErr()) return actor;
89
+ if ("entityStep" in config && typeof config.entityStep === "string") {
90
+ const entities = typedArgs.state[config.entityStep];
91
+ if (!host.checkPermission(actor.value, config.action, entities, config.grants)) return host.error("FORBIDDEN");
92
+ return (0, neverthrow.ok)(entities);
93
+ }
94
+ if (typeof config.entities === "function") {
95
+ const resolveEntities = config.entities;
96
+ let loadedEntities;
97
+ const permission = await host.checkPermissionAsync(actor.value, config.action, async () => {
98
+ const entityResult = await normalizeProcedureResult(resolveEntities(typedArgs));
99
+ if (entityResult.isOk()) loadedEntities = entityResult.value;
100
+ return entityResult;
101
+ }, config.grants);
102
+ if (permission.isErr()) return permission;
103
+ if (!permission.value) return host.error("FORBIDDEN");
104
+ return (0, neverthrow.ok)(loadedEntities);
105
+ }
106
+ const entities = config.entities;
107
+ if (!host.checkPermission(actor.value, config.action, entities, config.grants)) return host.error("FORBIDDEN");
108
+ return (0, neverthrow.ok)(entities);
109
+ }
110
+ };
111
+ }
112
+ function createProcedureHandler(host, config, handler) {
113
+ return async (input, ctx) => host.throwableAsync(async () => {
114
+ const state = {};
115
+ const startTime = Date.now();
116
+ const typedCtx = ctx;
117
+ let currentInput = input;
118
+ logProcedureStage(host, config.name, typedCtx, "start");
119
+ try {
120
+ for (const step of config.steps) {
121
+ const stepResult = await step.run({
122
+ input: currentInput,
123
+ ctx: typedCtx,
124
+ state,
125
+ repository: host.repository,
126
+ service: host.service,
127
+ logger: host.logger
128
+ });
129
+ if (stepResult.isErr()) {
130
+ logProcedureStage(host, config.name, typedCtx, getFailureStage(stepResult.error.code), {
131
+ stepName: step.stepName,
132
+ durationMs: Date.now() - startTime,
133
+ errorCode: stepResult.error.code
134
+ });
135
+ return stepResult;
136
+ }
137
+ state[step.stepName] = stepResult.value;
138
+ if (step.stage === "input") currentInput = stepResult.value;
139
+ if (step.stage === "auth") logProcedureStage(host, config.name, typedCtx, "auth_passed", { stepName: step.stepName });
140
+ if (step.stage === "access") logProcedureStage(host, config.name, typedCtx, "access_passed", { stepName: step.stepName });
141
+ }
142
+ const handlerResult = await normalizeProcedureResult(handler({
143
+ input: currentInput,
144
+ ctx,
145
+ state,
146
+ repository: host.repository,
147
+ service: host.service,
148
+ logger: host.logger
149
+ }));
150
+ if (handlerResult.isErr()) {
151
+ logProcedureStage(host, config.name, typedCtx, getFailureStage(handlerResult.error.code), {
152
+ durationMs: Date.now() - startTime,
153
+ errorCode: handlerResult.error.code
154
+ });
155
+ return handlerResult;
156
+ }
157
+ logProcedureStage(host, config.name, typedCtx, "success", { durationMs: Date.now() - startTime });
158
+ return handlerResult;
159
+ } catch (error) {
160
+ const serverError = host.handleUnknownError(error);
161
+ logProcedureStage(host, config.name, typedCtx, getFailureStage(serverError.code), {
162
+ durationMs: Date.now() - startTime,
163
+ errorCode: serverError.code
164
+ });
165
+ throw error;
166
+ }
167
+ });
168
+ }
169
+ function createServiceProcedureBuilder(host, config) {
170
+ function addContextFilter(include) {
171
+ const steps = hasStepName(config.steps, "auth") ? config.steps : [...config.steps, createRequireAuthStep(host, "user")];
172
+ assertUniqueStepName(steps, "contextFilter");
173
+ return createServiceProcedureBuilder(host, {
174
+ ...config,
175
+ steps: [...steps, createContextFilterStep(host, include)]
176
+ });
177
+ }
178
+ return {
179
+ use(stepName, step) {
180
+ assertUniqueStepName(config.steps, stepName);
181
+ return createServiceProcedureBuilder(host, {
182
+ ...config,
183
+ steps: [...config.steps, createUseStep(stepName, step)]
184
+ });
185
+ },
186
+ mapInput(stepName, step) {
187
+ assertUniqueStepName(config.steps, stepName);
188
+ return createServiceProcedureBuilder(host, {
189
+ ...config,
190
+ steps: [...config.steps, createInputStep(stepName, step)]
191
+ });
192
+ },
193
+ addContextFilter,
194
+ requireAuth(scope) {
195
+ assertUniqueStepName(config.steps, "auth");
196
+ return createServiceProcedureBuilder(host, {
197
+ ...config,
198
+ steps: [...config.steps, createRequireAuthStep(host, scope ?? "user")]
199
+ });
200
+ },
201
+ handle(handler) {
202
+ return createProcedureHandler(host, config, handler);
203
+ }
204
+ };
205
+ }
206
+ function createPermissionServiceProcedureBuilder(host, config) {
207
+ function addContextFilter(include) {
208
+ const steps = hasStepName(config.steps, "auth") ? config.steps : [...config.steps, createRequireAuthStep(host, "user")];
209
+ assertUniqueStepName(steps, "contextFilter");
210
+ return createPermissionServiceProcedureBuilder(host, {
211
+ ...config,
212
+ steps: [...steps, createContextFilterStep(host, include)]
213
+ });
214
+ }
215
+ function access(accessConfig) {
216
+ assertUniqueStepName(config.steps, "access");
217
+ return createPermissionServiceProcedureBuilder(host, {
218
+ ...config,
219
+ steps: [...config.steps, createAccessStep(host, accessConfig)]
220
+ });
221
+ }
222
+ return {
223
+ use(stepName, step) {
224
+ assertUniqueStepName(config.steps, stepName);
225
+ return createPermissionServiceProcedureBuilder(host, {
226
+ ...config,
227
+ steps: [...config.steps, createUseStep(stepName, step)]
228
+ });
229
+ },
230
+ mapInput(stepName, step) {
231
+ assertUniqueStepName(config.steps, stepName);
232
+ return createPermissionServiceProcedureBuilder(host, {
233
+ ...config,
234
+ steps: [...config.steps, createInputStep(stepName, step)]
235
+ });
236
+ },
237
+ addContextFilter,
238
+ requireAuth(scope) {
239
+ assertUniqueStepName(config.steps, "auth");
240
+ return createPermissionServiceProcedureBuilder(host, {
241
+ ...config,
242
+ steps: [...config.steps, createRequireAuthStep(host, scope ?? "user")]
243
+ });
244
+ },
245
+ access,
246
+ handle(handler) {
247
+ return createProcedureHandler(host, config, handler);
248
+ }
249
+ };
250
+ }
251
+ //#endregion
252
+ exports.createPermissionServiceProcedureBuilder = createPermissionServiceProcedureBuilder;
253
+ exports.createServiceProcedureBuilder = createServiceProcedureBuilder;
254
+
255
+ //# sourceMappingURL=base.procedure.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.procedure.cjs","names":["validateActor"],"sources":["../../../../src/modules/base/base.procedure.ts"],"sourcesContent":["import type { QueryInput } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { TRPC_ERROR_CODE_KEY } from \"@trpc/server\";\r\nimport { ok } from \"neverthrow\";\r\nimport type { ServerError } from \"../../utils/errors\";\r\nimport type { logger } from \"../../utils/logger\";\r\nimport type { Base } from \"./base.abstract\";\r\nimport { type Actor, type ActorScope, type AuthenticatedActor, validateActor } from \"./base.actor\";\r\nimport type { ServerResult, ServerResultAsync } from \"./base.dto\";\r\nimport type { Entity, ResourceActionGrant } from \"./base.grants\";\r\n\r\ntype ServiceLogger = ReturnType<typeof logger.child>;\r\ntype RepositoryMap = Record<string, Base>;\r\ntype ServiceMap = Record<string, Base>;\r\n\r\nexport type ServiceProcedureContext = {\r\n actor?: AuthenticatedActor | null;\r\n} & Record<string, unknown>;\r\n\r\nexport type ServiceProcedureState = Record<string, unknown>;\r\nexport type ServiceProcedureStoredValue<T> = [T] extends [undefined] ? undefined : Awaited<T>;\r\nexport type ServiceProcedureResultLike<T> = T | ServerResult<T> | Promise<T | ServerResult<T>>;\r\nexport type ServiceProcedureContextFilterScope = ActorScope;\r\nexport type ServiceProcedureContextFilteredInput<TInput> = Extract<NonNullable<TInput>, QueryInput>;\r\ntype ServiceProcedureAuthContext<Scope extends ActorScope> = {\r\n actor: Actor[Scope];\r\n};\r\ntype ServiceProcedureRequiredScopeFromFilter<\r\n TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined,\r\n> = TInclude extends readonly ServiceProcedureContextFilterScope[]\r\n ? \"team\" extends TInclude[number]\r\n ? \"team\"\r\n : \"organization\" extends TInclude[number]\r\n ? \"organization\"\r\n : \"user\"\r\n : \"user\";\r\n\r\nexport type ServiceProcedure<TInput, TCtx extends ServiceProcedureContext, TOutput> = (\r\n input: TInput,\r\n ctx: TCtx\r\n) => ServerResultAsync<TOutput>;\r\n\r\nexport type ServiceProcedureArgs<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n> = {\r\n input: TInput;\r\n ctx: TCtx;\r\n state: State;\r\n repository: Repositories;\r\n service: Services;\r\n logger: ServiceLogger;\r\n};\r\n\r\nexport type ServiceProcedureStep<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TOutput = undefined,\r\n> = (\r\n args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>\r\n) => ServiceProcedureResultLike<ServiceProcedureStoredValue<TOutput>>;\r\n\r\nexport type ServiceProcedureInputMapper<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TNextInput,\r\n> = (\r\n args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>\r\n) => ServiceProcedureResultLike<ServiceProcedureStoredValue<TNextInput>>;\r\n\r\nexport type ServiceProcedureHandler<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TOutput,\r\n> = (\r\n args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>\r\n) => ServiceProcedureResultLike<TOutput>;\r\n\r\nexport type ServiceProcedureEntityResolver<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TEntities extends Entity | Entity[] | undefined,\r\n> =\r\n | TEntities\r\n | ((\r\n args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>\r\n ) => ServiceProcedureResultLike<TEntities>);\r\n\r\ntype ServiceProcedureAccessBaseConfig = {\r\n action: string;\r\n grants?: ResourceActionGrant[];\r\n};\r\n\r\nexport type ServiceProcedureEntityStepName<State extends ServiceProcedureState> = Extract<\r\n {\r\n [Key in keyof State]: State[Key] extends Entity | Entity[] | undefined ? Key : never;\r\n }[keyof State],\r\n string\r\n>;\r\n\r\nexport type ServiceProcedureAccessEntitiesConfig<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TEntities extends Entity | Entity[] | undefined = undefined,\r\n> = ServiceProcedureAccessBaseConfig & {\r\n entities?: ServiceProcedureEntityResolver<TInput, TCtx, Repositories, Services, State, TEntities>;\r\n entityStep?: never;\r\n};\r\n\r\nexport type ServiceProcedureAccessStateConfig<\r\n State extends ServiceProcedureState,\r\n StepName extends ServiceProcedureEntityStepName<State>,\r\n> = ServiceProcedureAccessBaseConfig & {\r\n entityStep: StepName;\r\n entities?: never;\r\n};\r\n\r\nexport type ServiceProcedureAccessConfig<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TEntities extends Entity | Entity[] | undefined = undefined,\r\n> =\r\n | ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State, TEntities>\r\n | ServiceProcedureAccessStateConfig<State, ServiceProcedureEntityStepName<State>>;\r\n\r\nexport interface ServiceProcedureBuilder<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState = Record<string, never>,\r\n> {\r\n use<StepName extends string, TOutput = void>(\r\n stepName: StepName,\r\n step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ): ServiceProcedureBuilder<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TOutput>>\r\n >;\r\n mapInput<StepName extends string, TNextInput>(\r\n stepName: StepName,\r\n step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>\r\n ): ServiceProcedureBuilder<\r\n ServiceProcedureStoredValue<TNextInput>,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>\r\n >;\r\n addContextFilter<\r\n TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined,\r\n >(\r\n include?: TInclude\r\n ): ServiceProcedureBuilder<\r\n ServiceProcedureContextFilteredInput<TInput>,\r\n TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>,\r\n Repositories,\r\n Services,\r\n State & { contextFilter: ServiceProcedureContextFilteredInput<TInput> }\r\n >;\r\n requireAuth<Scope extends ActorScope = \"user\">(\r\n scope?: Scope\r\n ): ServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<Scope>,\r\n Repositories,\r\n Services,\r\n State\r\n >;\r\n handle<TOutput>(\r\n handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ): ServiceProcedure<TInput, TCtx, TOutput>;\r\n}\r\n\r\nexport interface PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState = Record<string, never>,\r\n> extends ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> {\r\n use<StepName extends string, TOutput = void>(\r\n stepName: StepName,\r\n step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TOutput>>\r\n >;\r\n mapInput<StepName extends string, TNextInput>(\r\n stepName: StepName,\r\n step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>\r\n ): PermissionServiceProcedureBuilder<\r\n ServiceProcedureStoredValue<TNextInput>,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>\r\n >;\r\n addContextFilter<\r\n TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined,\r\n >(\r\n include?: TInclude\r\n ): PermissionServiceProcedureBuilder<\r\n ServiceProcedureContextFilteredInput<TInput>,\r\n TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>,\r\n Repositories,\r\n Services,\r\n State & { contextFilter: ServiceProcedureContextFilteredInput<TInput> }\r\n >;\r\n requireAuth<Scope extends ActorScope = \"user\">(\r\n scope?: Scope\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<Scope>,\r\n Repositories,\r\n Services,\r\n State\r\n >;\r\n access(\r\n config: ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State>\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State\r\n >;\r\n access<TEntities extends Entity | Entity[] | undefined>(\r\n config: ServiceProcedureAccessEntitiesConfig<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State,\r\n TEntities\r\n >\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State & { access: TEntities }\r\n >;\r\n access<StepName extends ServiceProcedureEntityStepName<State>>(\r\n config: ServiceProcedureAccessStateConfig<State, StepName>\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State & { access: State[StepName] }\r\n >;\r\n}\r\n\r\ntype BaseServiceProcedureHost<Repositories extends RepositoryMap, Services extends ServiceMap> = {\r\n repository: Repositories;\r\n service: Services;\r\n logger: ServiceLogger;\r\n addContextFilter(\r\n actor: AuthenticatedActor,\r\n include?: { user?: boolean; organization?: boolean; team?: boolean },\r\n query?: QueryInput\r\n ): QueryInput;\r\n error(\r\n code: TRPC_ERROR_CODE_KEY,\r\n message?: string,\r\n options?: { cause?: unknown; clientMessage?: string; log?: boolean }\r\n ): ServerResult<never>;\r\n throwableAsync<T>(fn: () => ServerResultAsync<T>): ServerResultAsync<T>;\r\n handleUnknownError(error: unknown): ServerError;\r\n};\r\n\r\ntype PermissionServiceProcedureHost<\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n> = BaseServiceProcedureHost<Repositories, Services> & {\r\n checkPermission<T extends Entity>(\r\n actor: AuthenticatedActor,\r\n action: string,\r\n entities?: T | T[],\r\n grants?: ResourceActionGrant[]\r\n ): boolean;\r\n checkPermissionAsync<T extends Entity>(\r\n actor: AuthenticatedActor,\r\n action: string,\r\n getEntities: () => ServerResultAsync<T | T[] | undefined>,\r\n grants?: ResourceActionGrant[]\r\n ): ServerResultAsync<boolean>;\r\n};\r\n\r\ntype ProcedureStage = \"start\" | \"auth_passed\" | \"access_passed\" | \"forbidden\" | \"success\" | \"error\";\r\n\r\ntype ProcedureRuntimeStep<Repositories extends RepositoryMap, Services extends ServiceMap> = {\r\n stage: \"use\" | \"input\" | \"auth\" | \"access\";\r\n stepName: string;\r\n run: (\r\n args: ServiceProcedureArgs<\r\n unknown,\r\n ServiceProcedureContext,\r\n Repositories,\r\n Services,\r\n ServiceProcedureState\r\n >\r\n ) => Promise<ServerResult<unknown>>;\r\n};\r\n\r\ntype ProcedureBuilderConfig<Repositories extends RepositoryMap, Services extends ServiceMap> = {\r\n name: string;\r\n steps: ProcedureRuntimeStep<Repositories, Services>[];\r\n};\r\n\r\nconst DEFAULT_CONTEXT_FILTER_INCLUDE = [\r\n \"user\",\r\n] as const satisfies readonly ServiceProcedureContextFilterScope[];\r\n\r\nfunction isServerResult<T>(value: unknown): value is ServerResult<T> {\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n \"isErr\" in value &&\r\n typeof (value as { isErr: unknown }).isErr === \"function\" &&\r\n \"isOk\" in value &&\r\n typeof (value as { isOk: unknown }).isOk === \"function\"\r\n );\r\n}\r\n\r\nasync function normalizeProcedureResult<T>(\r\n result: ServiceProcedureResultLike<T>\r\n): Promise<ServerResult<T>> {\r\n const resolved = await result;\r\n return isServerResult<T>(resolved) ? resolved : ok(resolved);\r\n}\r\n\r\nfunction assertUniqueStepName<Repositories extends RepositoryMap, Services extends ServiceMap>(\r\n steps: ProcedureRuntimeStep<Repositories, Services>[],\r\n stepName: string\r\n) {\r\n if (steps.some((step) => step.stepName === stepName)) {\r\n throw new Error(`Duplicate service procedure step name: ${stepName}`);\r\n }\r\n}\r\n\r\nfunction hasStepName<Repositories extends RepositoryMap, Services extends ServiceMap>(\r\n steps: ProcedureRuntimeStep<Repositories, Services>[],\r\n stepName: string\r\n) {\r\n return steps.some((step) => step.stepName === stepName);\r\n}\r\n\r\nfunction getContextFilterInclude(\r\n include: readonly ServiceProcedureContextFilterScope[] = DEFAULT_CONTEXT_FILTER_INCLUDE\r\n) {\r\n return {\r\n user: include.includes(\"user\"),\r\n organization: include.includes(\"organization\"),\r\n team: include.includes(\"team\"),\r\n };\r\n}\r\n\r\nfunction getFailureStage(code: TRPC_ERROR_CODE_KEY | undefined): ProcedureStage {\r\n return code === \"FORBIDDEN\" || code === \"UNAUTHORIZED\" ? \"forbidden\" : \"error\";\r\n}\r\n\r\nfunction logProcedureStage<Repositories extends RepositoryMap, Services extends ServiceMap>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n procedureName: string,\r\n ctx: ServiceProcedureContext,\r\n stage: ProcedureStage,\r\n {\r\n stepName,\r\n durationMs,\r\n errorCode,\r\n }: {\r\n stepName?: string;\r\n durationMs?: number;\r\n errorCode?: TRPC_ERROR_CODE_KEY;\r\n } = {}\r\n) {\r\n host.logger.debug({\r\n procedureName,\r\n stage,\r\n stepName,\r\n durationMs,\r\n errorCode,\r\n hasActor: Boolean(ctx.actor),\r\n });\r\n}\r\n\r\nfunction requireProcedureActor<\r\n Scope extends ActorScope,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n ctx: ServiceProcedureContext,\r\n scope: Scope\r\n): ServerResult<Actor[Scope]> {\r\n if (!ctx.actor) {\r\n return host.error(\"UNAUTHORIZED\", \"Unauthorized\");\r\n }\r\n\r\n if (!validateActor(ctx.actor, scope)) {\r\n return host.error(\"FORBIDDEN\", \"Forbidden\");\r\n }\r\n\r\n return ok(ctx.actor as Actor[Scope]);\r\n}\r\n\r\nfunction createRequireAuthStep<Repositories extends RepositoryMap, Services extends ServiceMap>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n scope: ActorScope = \"user\"\r\n): ProcedureRuntimeStep<Repositories, Services> {\r\n return {\r\n stage: \"auth\",\r\n stepName: \"auth\",\r\n run: async ({ ctx }) => {\r\n return requireProcedureActor(host, ctx, scope);\r\n },\r\n };\r\n}\r\n\r\nfunction createUseStep<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TOutput,\r\n>(\r\n stepName: string,\r\n step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>\r\n): ProcedureRuntimeStep<Repositories, Services> {\r\n return {\r\n stage: \"use\",\r\n stepName,\r\n run: async (args) =>\r\n normalizeProcedureResult(\r\n step(args as ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>)\r\n ),\r\n };\r\n}\r\n\r\nfunction createInputStep<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TNextInput,\r\n>(\r\n stepName: string,\r\n step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>\r\n): ProcedureRuntimeStep<Repositories, Services> {\r\n return {\r\n stage: \"input\",\r\n stepName,\r\n run: async (args) =>\r\n normalizeProcedureResult(\r\n step(args as ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>)\r\n ),\r\n };\r\n}\r\n\r\nfunction createContextFilterStep<Repositories extends RepositoryMap, Services extends ServiceMap>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n include?: readonly ServiceProcedureContextFilterScope[]\r\n): ProcedureRuntimeStep<Repositories, Services> {\r\n const contextInclude = getContextFilterInclude(include);\r\n const requiredScope: ActorScope = contextInclude.team\r\n ? \"team\"\r\n : contextInclude.organization\r\n ? \"organization\"\r\n : \"user\";\r\n\r\n return {\r\n stage: \"input\",\r\n stepName: \"contextFilter\",\r\n run: async ({ input, ctx }) => {\r\n const actor = requireProcedureActor(host, ctx, requiredScope);\r\n if (actor.isErr()) return actor;\r\n return ok(host.addContextFilter(actor.value, contextInclude, input as QueryInput));\r\n },\r\n };\r\n}\r\n\r\nfunction createAccessStep<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TEntities extends Entity | Entity[] | undefined,\r\n>(\r\n host: PermissionServiceProcedureHost<Repositories, Services>,\r\n config: ServiceProcedureAccessConfig<TInput, TCtx, Repositories, Services, State, TEntities>\r\n): ProcedureRuntimeStep<Repositories, Services> {\r\n return {\r\n stage: \"access\",\r\n stepName: \"access\",\r\n run: async (args) => {\r\n const typedArgs = args as ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>;\r\n const actor = requireProcedureActor(host, typedArgs.ctx, \"user\");\r\n if (actor.isErr()) return actor;\r\n\r\n if (\"entityStep\" in config && typeof config.entityStep === \"string\") {\r\n const entities = typedArgs.state[config.entityStep] as TEntities;\r\n const hasPermission = host.checkPermission(\r\n actor.value,\r\n config.action,\r\n entities as Entity | Entity[] | undefined,\r\n config.grants\r\n );\r\n\r\n if (!hasPermission) {\r\n return host.error(\"FORBIDDEN\");\r\n }\r\n\r\n return ok(entities);\r\n }\r\n\r\n if (typeof config.entities === \"function\") {\r\n const resolveEntities = config.entities as (\r\n args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>\r\n ) => ServiceProcedureResultLike<TEntities>;\r\n\r\n let loadedEntities: TEntities | undefined;\r\n const permission = await host.checkPermissionAsync(\r\n actor.value,\r\n config.action,\r\n async () => {\r\n const entityResult = await normalizeProcedureResult(resolveEntities(typedArgs));\r\n if (entityResult.isOk()) {\r\n loadedEntities = entityResult.value;\r\n }\r\n return entityResult;\r\n },\r\n config.grants\r\n );\r\n\r\n if (permission.isErr()) {\r\n return permission;\r\n }\r\n\r\n if (!permission.value) {\r\n return host.error(\"FORBIDDEN\");\r\n }\r\n\r\n return ok(loadedEntities);\r\n }\r\n\r\n const entities = config.entities;\r\n const hasPermission = host.checkPermission(\r\n actor.value,\r\n config.action,\r\n entities,\r\n config.grants\r\n );\r\n\r\n if (!hasPermission) {\r\n return host.error(\"FORBIDDEN\");\r\n }\r\n\r\n return ok(entities);\r\n },\r\n };\r\n}\r\n\r\nfunction createProcedureHandler<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TOutput,\r\n>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n config: ProcedureBuilderConfig<Repositories, Services>,\r\n handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>\r\n): ServiceProcedure<TInput, TCtx, TOutput> {\r\n return async (input, ctx) =>\r\n host.throwableAsync(async () => {\r\n const state: ServiceProcedureState = {};\r\n const startTime = Date.now();\r\n const typedCtx = ctx as ServiceProcedureContext;\r\n let currentInput: unknown = input;\r\n\r\n logProcedureStage(host, config.name, typedCtx, \"start\");\r\n\r\n try {\r\n for (const step of config.steps) {\r\n const stepResult = await step.run({\r\n input: currentInput,\r\n ctx: typedCtx,\r\n state,\r\n repository: host.repository,\r\n service: host.service,\r\n logger: host.logger,\r\n });\r\n\r\n if (stepResult.isErr()) {\r\n logProcedureStage(host, config.name, typedCtx, getFailureStage(stepResult.error.code), {\r\n stepName: step.stepName,\r\n durationMs: Date.now() - startTime,\r\n errorCode: stepResult.error.code,\r\n });\r\n return stepResult as ServerResult<TOutput>;\r\n }\r\n\r\n state[step.stepName] = stepResult.value;\r\n\r\n if (step.stage === \"input\") {\r\n currentInput = stepResult.value;\r\n }\r\n\r\n if (step.stage === \"auth\") {\r\n logProcedureStage(host, config.name, typedCtx, \"auth_passed\", {\r\n stepName: step.stepName,\r\n });\r\n }\r\n\r\n if (step.stage === \"access\") {\r\n logProcedureStage(host, config.name, typedCtx, \"access_passed\", {\r\n stepName: step.stepName,\r\n });\r\n }\r\n }\r\n\r\n const handlerResult = await normalizeProcedureResult(\r\n handler({\r\n input: currentInput as TInput,\r\n ctx: ctx as TCtx,\r\n state: state as State,\r\n repository: host.repository,\r\n service: host.service,\r\n logger: host.logger,\r\n })\r\n );\r\n\r\n if (handlerResult.isErr()) {\r\n logProcedureStage(\r\n host,\r\n config.name,\r\n typedCtx,\r\n getFailureStage(handlerResult.error.code),\r\n {\r\n durationMs: Date.now() - startTime,\r\n errorCode: handlerResult.error.code,\r\n }\r\n );\r\n return handlerResult;\r\n }\r\n\r\n logProcedureStage(host, config.name, typedCtx, \"success\", {\r\n durationMs: Date.now() - startTime,\r\n });\r\n return handlerResult;\r\n } catch (error) {\r\n const serverError = host.handleUnknownError(error);\r\n logProcedureStage(host, config.name, typedCtx, getFailureStage(serverError.code), {\r\n durationMs: Date.now() - startTime,\r\n errorCode: serverError.code,\r\n });\r\n throw error;\r\n }\r\n });\r\n}\r\n\r\nexport function createServiceProcedureBuilder<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState = Record<string, never>,\r\n>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n config: ProcedureBuilderConfig<Repositories, Services>\r\n): ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> {\r\n function addContextFilter<\r\n TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined,\r\n >(include?: TInclude) {\r\n const steps = hasStepName(config.steps, \"auth\")\r\n ? config.steps\r\n : [...config.steps, createRequireAuthStep(host, \"user\")];\r\n\r\n assertUniqueStepName(steps, \"contextFilter\");\r\n\r\n return createServiceProcedureBuilder<\r\n ServiceProcedureContextFilteredInput<TInput>,\r\n TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>,\r\n Repositories,\r\n Services,\r\n State & { contextFilter: ServiceProcedureContextFilteredInput<TInput> }\r\n >(host, {\r\n ...config,\r\n steps: [...steps, createContextFilterStep(host, include)],\r\n });\r\n }\r\n\r\n const builder: ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> = {\r\n use<StepName extends string, TOutput = void>(\r\n stepName: StepName,\r\n step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ) {\r\n assertUniqueStepName(config.steps, stepName);\r\n return createServiceProcedureBuilder<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TOutput>>\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createUseStep(stepName, step)],\r\n });\r\n },\r\n mapInput<StepName extends string, TNextInput>(\r\n stepName: StepName,\r\n step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>\r\n ) {\r\n assertUniqueStepName(config.steps, stepName);\r\n return createServiceProcedureBuilder<\r\n ServiceProcedureStoredValue<TNextInput>,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createInputStep(stepName, step)],\r\n });\r\n },\r\n addContextFilter,\r\n requireAuth<Scope extends ActorScope = \"user\">(scope?: Scope) {\r\n assertUniqueStepName(config.steps, \"auth\");\r\n return createServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<Scope>,\r\n Repositories,\r\n Services,\r\n State\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createRequireAuthStep(host, scope ?? \"user\")],\r\n });\r\n },\r\n handle<TOutput>(\r\n handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ) {\r\n return createProcedureHandler(host, config, handler);\r\n },\r\n };\r\n\r\n return builder;\r\n}\r\n\r\nexport function createPermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState = Record<string, never>,\r\n>(\r\n host: PermissionServiceProcedureHost<Repositories, Services>,\r\n config: ProcedureBuilderConfig<Repositories, Services>\r\n): PermissionServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> {\r\n function addContextFilter<\r\n TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined,\r\n >(include?: TInclude) {\r\n const steps = hasStepName(config.steps, \"auth\")\r\n ? config.steps\r\n : [...config.steps, createRequireAuthStep(host, \"user\")];\r\n\r\n assertUniqueStepName(steps, \"contextFilter\");\r\n\r\n return createPermissionServiceProcedureBuilder<\r\n ServiceProcedureContextFilteredInput<TInput>,\r\n TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>,\r\n Repositories,\r\n Services,\r\n State & { contextFilter: ServiceProcedureContextFilteredInput<TInput> }\r\n >(host, {\r\n ...config,\r\n steps: [...steps, createContextFilterStep(host, include)],\r\n });\r\n }\r\n\r\n function access(\r\n accessConfig: ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State>\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State\r\n >;\r\n function access<TEntities extends Entity | Entity[] | undefined>(\r\n accessConfig: ServiceProcedureAccessEntitiesConfig<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State,\r\n TEntities\r\n >\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State & { access: TEntities }\r\n >;\r\n function access<StepName extends ServiceProcedureEntityStepName<State>>(\r\n accessConfig: ServiceProcedureAccessStateConfig<State, StepName>\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State & { access: State[StepName] }\r\n >;\r\n function access(\r\n accessConfig:\r\n | ServiceProcedureAccessEntitiesConfig<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State,\r\n Entity | Entity[] | undefined\r\n >\r\n | ServiceProcedureAccessStateConfig<State, ServiceProcedureEntityStepName<State>>\r\n ) {\r\n assertUniqueStepName(config.steps, \"access\");\r\n return createPermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createAccessStep(host, accessConfig)],\r\n });\r\n }\r\n\r\n const builder: PermissionServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> = {\r\n use<StepName extends string, TOutput = void>(\r\n stepName: StepName,\r\n step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ) {\r\n assertUniqueStepName(config.steps, stepName);\r\n return createPermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TOutput>>\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createUseStep(stepName, step)],\r\n });\r\n },\r\n mapInput<StepName extends string, TNextInput>(\r\n stepName: StepName,\r\n step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>\r\n ) {\r\n assertUniqueStepName(config.steps, stepName);\r\n return createPermissionServiceProcedureBuilder<\r\n ServiceProcedureStoredValue<TNextInput>,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createInputStep(stepName, step)],\r\n });\r\n },\r\n addContextFilter,\r\n requireAuth<Scope extends ActorScope = \"user\">(scope?: Scope) {\r\n assertUniqueStepName(config.steps, \"auth\");\r\n return createPermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<Scope>,\r\n Repositories,\r\n Services,\r\n State\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createRequireAuthStep(host, scope ?? \"user\")],\r\n });\r\n },\r\n access,\r\n handle<TOutput>(\r\n handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ) {\r\n return createProcedureHandler(host, config, handler);\r\n },\r\n };\r\n\r\n return builder;\r\n}\r\n"],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import { ServerError } from "../../utils/errors.cjs";
2
+ import { ServerResult, ServerResultAsync } from "./base.dto.cjs";
3
+ import { logger } from "../../utils/logger.cjs";
4
+ import { Base } from "./base.abstract.cjs";
5
+ import { Actor, ActorScope, AuthenticatedActor } from "./base.actor.cjs";
6
+ import { Entity, ResourceActionGrant } from "./base.grants.cjs";
7
+ import { TRPC_ERROR_CODE_KEY } from "@trpc/server";
8
+ import { QueryInput } from "@m5kdev/commons/modules/schemas/query.schema";
9
+
10
+ //#region src/modules/base/base.procedure.d.ts
11
+ type ServiceLogger = ReturnType<typeof logger.child>;
12
+ type RepositoryMap = Record<string, Base>;
13
+ type ServiceMap = Record<string, Base>;
14
+ type ServiceProcedureContext = {
15
+ actor?: AuthenticatedActor | null;
16
+ } & Record<string, unknown>;
17
+ type ServiceProcedureState = Record<string, unknown>;
18
+ type ServiceProcedureStoredValue<T> = [T] extends [undefined] ? undefined : Awaited<T>;
19
+ type ServiceProcedureResultLike<T> = T | ServerResult<T> | Promise<T | ServerResult<T>>;
20
+ type ServiceProcedureContextFilterScope = ActorScope;
21
+ type ServiceProcedureContextFilteredInput<TInput> = Extract<NonNullable<TInput>, QueryInput>;
22
+ type ServiceProcedureAuthContext<Scope extends ActorScope> = {
23
+ actor: Actor[Scope];
24
+ };
25
+ type ServiceProcedureRequiredScopeFromFilter<TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined> = TInclude extends readonly ServiceProcedureContextFilterScope[] ? "team" extends TInclude[number] ? "team" : "organization" extends TInclude[number] ? "organization" : "user" : "user";
26
+ type ServiceProcedure<TInput, TCtx extends ServiceProcedureContext, TOutput> = (input: TInput, ctx: TCtx) => ServerResultAsync<TOutput>;
27
+ type ServiceProcedureArgs<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState> = {
28
+ input: TInput;
29
+ ctx: TCtx;
30
+ state: State;
31
+ repository: Repositories;
32
+ service: Services;
33
+ logger: ServiceLogger;
34
+ };
35
+ type ServiceProcedureStep<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TOutput = undefined> = (args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>) => ServiceProcedureResultLike<ServiceProcedureStoredValue<TOutput>>;
36
+ type ServiceProcedureInputMapper<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TNextInput> = (args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>) => ServiceProcedureResultLike<ServiceProcedureStoredValue<TNextInput>>;
37
+ type ServiceProcedureHandler<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TOutput> = (args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>) => ServiceProcedureResultLike<TOutput>;
38
+ type ServiceProcedureEntityResolver<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TEntities extends Entity | Entity[] | undefined> = TEntities | ((args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>) => ServiceProcedureResultLike<TEntities>);
39
+ type ServiceProcedureAccessBaseConfig = {
40
+ action: string;
41
+ grants?: ResourceActionGrant[];
42
+ };
43
+ type ServiceProcedureEntityStepName<State extends ServiceProcedureState> = Extract<{ [Key in keyof State]: State[Key] extends Entity | Entity[] | undefined ? Key : never }[keyof State], string>;
44
+ type ServiceProcedureAccessEntitiesConfig<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TEntities extends Entity | Entity[] | undefined = undefined> = ServiceProcedureAccessBaseConfig & {
45
+ entities?: ServiceProcedureEntityResolver<TInput, TCtx, Repositories, Services, State, TEntities>;
46
+ entityStep?: never;
47
+ };
48
+ type ServiceProcedureAccessStateConfig<State extends ServiceProcedureState, StepName extends ServiceProcedureEntityStepName<State>> = ServiceProcedureAccessBaseConfig & {
49
+ entityStep: StepName;
50
+ entities?: never;
51
+ };
52
+ type ServiceProcedureAccessConfig<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TEntities extends Entity | Entity[] | undefined = undefined> = ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State, TEntities> | ServiceProcedureAccessStateConfig<State, ServiceProcedureEntityStepName<State>>;
53
+ interface ServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState = Record<string, never>> {
54
+ use<StepName extends string, TOutput = void>(stepName: StepName, step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>): ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TOutput>>>;
55
+ mapInput<StepName extends string, TNextInput>(stepName: StepName, step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>): ServiceProcedureBuilder<ServiceProcedureStoredValue<TNextInput>, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>>;
56
+ addContextFilter<TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined>(include?: TInclude): ServiceProcedureBuilder<ServiceProcedureContextFilteredInput<TInput>, TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>, Repositories, Services, State & {
57
+ contextFilter: ServiceProcedureContextFilteredInput<TInput>;
58
+ }>;
59
+ requireAuth<Scope extends ActorScope = "user">(scope?: Scope): ServiceProcedureBuilder<TInput, TCtx & ServiceProcedureAuthContext<Scope>, Repositories, Services, State>;
60
+ handle<TOutput>(handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>): ServiceProcedure<TInput, TCtx, TOutput>;
61
+ }
62
+ interface PermissionServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState = Record<string, never>> extends ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> {
63
+ use<StepName extends string, TOutput = void>(stepName: StepName, step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>): PermissionServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TOutput>>>;
64
+ mapInput<StepName extends string, TNextInput>(stepName: StepName, step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>): PermissionServiceProcedureBuilder<ServiceProcedureStoredValue<TNextInput>, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>>;
65
+ addContextFilter<TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined>(include?: TInclude): PermissionServiceProcedureBuilder<ServiceProcedureContextFilteredInput<TInput>, TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>, Repositories, Services, State & {
66
+ contextFilter: ServiceProcedureContextFilteredInput<TInput>;
67
+ }>;
68
+ requireAuth<Scope extends ActorScope = "user">(scope?: Scope): PermissionServiceProcedureBuilder<TInput, TCtx & ServiceProcedureAuthContext<Scope>, Repositories, Services, State>;
69
+ access(config: ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State>): PermissionServiceProcedureBuilder<TInput, TCtx & ServiceProcedureAuthContext<"user">, Repositories, Services, State>;
70
+ access<TEntities extends Entity | Entity[] | undefined>(config: ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State, TEntities>): PermissionServiceProcedureBuilder<TInput, TCtx & ServiceProcedureAuthContext<"user">, Repositories, Services, State & {
71
+ access: TEntities;
72
+ }>;
73
+ access<StepName extends ServiceProcedureEntityStepName<State>>(config: ServiceProcedureAccessStateConfig<State, StepName>): PermissionServiceProcedureBuilder<TInput, TCtx & ServiceProcedureAuthContext<"user">, Repositories, Services, State & {
74
+ access: State[StepName];
75
+ }>;
76
+ }
77
+ type BaseServiceProcedureHost<Repositories extends RepositoryMap, Services extends ServiceMap> = {
78
+ repository: Repositories;
79
+ service: Services;
80
+ logger: ServiceLogger;
81
+ addContextFilter(actor: AuthenticatedActor, include?: {
82
+ user?: boolean;
83
+ organization?: boolean;
84
+ team?: boolean;
85
+ }, query?: QueryInput): QueryInput;
86
+ error(code: TRPC_ERROR_CODE_KEY, message?: string, options?: {
87
+ cause?: unknown;
88
+ clientMessage?: string;
89
+ log?: boolean;
90
+ }): ServerResult<never>;
91
+ throwableAsync<T>(fn: () => ServerResultAsync<T>): ServerResultAsync<T>;
92
+ handleUnknownError(error: unknown): ServerError;
93
+ };
94
+ type PermissionServiceProcedureHost<Repositories extends RepositoryMap, Services extends ServiceMap> = BaseServiceProcedureHost<Repositories, Services> & {
95
+ checkPermission<T extends Entity>(actor: AuthenticatedActor, action: string, entities?: T | T[], grants?: ResourceActionGrant[]): boolean;
96
+ checkPermissionAsync<T extends Entity>(actor: AuthenticatedActor, action: string, getEntities: () => ServerResultAsync<T | T[] | undefined>, grants?: ResourceActionGrant[]): ServerResultAsync<boolean>;
97
+ };
98
+ type ProcedureRuntimeStep<Repositories extends RepositoryMap, Services extends ServiceMap> = {
99
+ stage: "use" | "input" | "auth" | "access";
100
+ stepName: string;
101
+ run: (args: ServiceProcedureArgs<unknown, ServiceProcedureContext, Repositories, Services, ServiceProcedureState>) => Promise<ServerResult<unknown>>;
102
+ };
103
+ type ProcedureBuilderConfig<Repositories extends RepositoryMap, Services extends ServiceMap> = {
104
+ name: string;
105
+ steps: ProcedureRuntimeStep<Repositories, Services>[];
106
+ };
107
+ declare function createServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState = Record<string, never>>(host: BaseServiceProcedureHost<Repositories, Services>, config: ProcedureBuilderConfig<Repositories, Services>): ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State>;
108
+ declare function createPermissionServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState = Record<string, never>>(host: PermissionServiceProcedureHost<Repositories, Services>, config: ProcedureBuilderConfig<Repositories, Services>): PermissionServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State>;
109
+ //#endregion
110
+ export { PermissionServiceProcedureBuilder, ServiceProcedure, ServiceProcedureAccessConfig, ServiceProcedureAccessEntitiesConfig, ServiceProcedureAccessStateConfig, ServiceProcedureArgs, ServiceProcedureBuilder, ServiceProcedureContext, ServiceProcedureContextFilterScope, ServiceProcedureContextFilteredInput, ServiceProcedureEntityResolver, ServiceProcedureEntityStepName, ServiceProcedureHandler, ServiceProcedureInputMapper, ServiceProcedureResultLike, ServiceProcedureState, ServiceProcedureStep, ServiceProcedureStoredValue, createPermissionServiceProcedureBuilder, createServiceProcedureBuilder };
111
+ //# sourceMappingURL=base.procedure.d.cts.map