@tailor-platform/sdk 2.0.0-next.2 → 2.0.0-next.3

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 (410) hide show
  1. package/CHANGELOG.md +466 -10
  2. package/README.md +9 -9
  3. package/agent-skills/{tailor-sdk → tailor}/SKILL.md +3 -1
  4. package/dist/aigateway-B3oZZE6v.mjs +15 -0
  5. package/dist/aigateway-B3oZZE6v.mjs.map +1 -0
  6. package/dist/application-D2hSK1ZL.mjs +3 -0
  7. package/dist/application-eHp9jXld.mjs +6393 -0
  8. package/dist/application-eHp9jXld.mjs.map +1 -0
  9. package/dist/{authconnection-D2MhtTN5.mjs → authconnection-BGQM8FZI.mjs} +2 -2
  10. package/dist/authconnection-BGQM8FZI.mjs.map +1 -0
  11. package/dist/cli/cache/bundle-cache.d.mts +1 -0
  12. package/dist/cli/cache/store.d.mts +1 -0
  13. package/dist/cli/cache/types.d.mts +1 -0
  14. package/dist/cli/commands/api/api-call.d.mts +19 -0
  15. package/dist/cli/commands/api/index.d.mts +3 -0
  16. package/dist/cli/commands/deploy/aigateway.d.mts +1 -0
  17. package/dist/cli/commands/deploy/application.d.mts +1 -0
  18. package/dist/cli/commands/deploy/apply-phases.d.mts +1 -0
  19. package/dist/cli/commands/deploy/auth.d.mts +1 -0
  20. package/dist/cli/commands/deploy/deploy.d.mts +24 -0
  21. package/dist/cli/commands/deploy/executor.d.mts +1 -0
  22. package/dist/cli/commands/deploy/function-registry-types.d.mts +12 -0
  23. package/dist/cli/commands/deploy/function-registry.d.mts +2 -0
  24. package/dist/cli/commands/deploy/idp.d.mts +1 -0
  25. package/dist/cli/commands/deploy/resolver.d.mts +1 -0
  26. package/dist/cli/commands/deploy/secret-manager.d.mts +1 -0
  27. package/dist/cli/commands/deploy/staticwebsite.d.mts +1 -0
  28. package/dist/cli/commands/deploy/tailordb/index.d.mts +1 -0
  29. package/dist/cli/commands/deploy/types.d.mts +1 -0
  30. package/dist/cli/commands/deploy/workflow.d.mts +1 -0
  31. package/dist/cli/commands/executor/get.d.mts +29 -0
  32. package/dist/cli/commands/executor/jobs.d.mts +123 -0
  33. package/dist/cli/commands/executor/list.d.mts +19 -0
  34. package/dist/cli/commands/executor/transform.d.mts +41 -0
  35. package/dist/cli/commands/executor/trigger.d.mts +41 -0
  36. package/dist/cli/commands/executor/webhook.d.mts +22 -0
  37. package/dist/cli/commands/function/get.d.mts +18 -0
  38. package/dist/cli/commands/function/list.d.mts +22 -0
  39. package/dist/cli/commands/function/transform.d.mts +11 -0
  40. package/dist/cli/commands/generate/options.d.mts +7 -0
  41. package/dist/cli/commands/generate/seed/bundler.d.mts +26 -0
  42. package/dist/cli/commands/generate/service.d.mts +11 -0
  43. package/dist/cli/commands/machineuser/list.d.mts +27 -0
  44. package/dist/cli/commands/machineuser/token.d.mts +22 -0
  45. package/dist/cli/commands/oauth2client/get.d.mts +18 -0
  46. package/dist/cli/commands/oauth2client/list.d.mts +20 -0
  47. package/dist/cli/commands/oauth2client/transform.d.mts +20 -0
  48. package/dist/cli/commands/organization/folder/create.d.mts +18 -0
  49. package/dist/cli/commands/organization/folder/delete.d.mts +16 -0
  50. package/dist/cli/commands/organization/folder/get.d.mts +17 -0
  51. package/dist/cli/commands/organization/folder/list.d.mts +22 -0
  52. package/dist/cli/commands/organization/folder/update.d.mts +18 -0
  53. package/dist/cli/commands/organization/get.d.mts +16 -0
  54. package/dist/cli/commands/organization/list.d.mts +15 -0
  55. package/dist/cli/commands/organization/transform.d.mts +27 -0
  56. package/dist/cli/commands/organization/tree.d.mts +25 -0
  57. package/dist/cli/commands/organization/update.d.mts +17 -0
  58. package/dist/cli/commands/remove.d.mts +16 -0
  59. package/dist/cli/commands/show.d.mts +34 -0
  60. package/dist/cli/commands/tailordb/migrate/bundler.d.mts +28 -0
  61. package/dist/cli/commands/tailordb/migrate/config.d.mts +19 -0
  62. package/dist/cli/commands/tailordb/migrate/diff-calculator.d.mts +223 -0
  63. package/dist/cli/commands/tailordb/migrate/generate.d.mts +17 -0
  64. package/dist/cli/commands/tailordb/migrate/snapshot-types.d.mts +202 -0
  65. package/dist/cli/commands/tailordb/migrate/snapshot.d.mts +98 -0
  66. package/dist/cli/commands/tailordb/migrate/types.d.mts +7 -0
  67. package/dist/cli/commands/tailordb/truncate.d.mts +19 -0
  68. package/dist/cli/commands/workflow/executions.d.mts +75 -0
  69. package/dist/cli/commands/workflow/get.d.mts +29 -0
  70. package/dist/cli/commands/workflow/list.d.mts +19 -0
  71. package/dist/cli/commands/workflow/resume.d.mts +23 -0
  72. package/dist/cli/commands/workflow/start.d.mts +61 -0
  73. package/dist/cli/commands/workflow/status.d.mts +5 -0
  74. package/dist/cli/commands/workflow/transform.d.mts +33 -0
  75. package/dist/cli/commands/workflow/wait.d.mts +16 -0
  76. package/dist/cli/commands/workflow/waiter.d.mts +23 -0
  77. package/dist/cli/commands/workspace/app/health.d.mts +18 -0
  78. package/dist/cli/commands/workspace/app/list.d.mts +22 -0
  79. package/dist/cli/commands/workspace/app/transform.d.mts +18 -0
  80. package/dist/cli/commands/workspace/create.d.mts +25 -0
  81. package/dist/cli/commands/workspace/delete.d.mts +15 -0
  82. package/dist/cli/commands/workspace/get.d.mts +17 -0
  83. package/dist/cli/commands/workspace/list.d.mts +17 -0
  84. package/dist/cli/commands/workspace/restore.d.mts +15 -0
  85. package/dist/cli/commands/workspace/transform.d.mts +16 -0
  86. package/dist/cli/commands/workspace/user/invite.d.mts +22 -0
  87. package/dist/cli/commands/workspace/user/list.d.mts +22 -0
  88. package/dist/cli/commands/workspace/user/remove.d.mts +17 -0
  89. package/dist/cli/commands/workspace/user/transform.d.mts +8 -0
  90. package/dist/cli/commands/workspace/user/update.d.mts +22 -0
  91. package/dist/cli/erd-viewer-assets/app.js +279 -36
  92. package/dist/cli/erd-viewer-assets/index.html +4 -0
  93. package/dist/cli/erd-viewer-assets/styles.css +252 -5
  94. package/dist/cli/index.d.mts +18 -3
  95. package/dist/cli/index.mjs +2136 -519
  96. package/dist/cli/index.mjs.map +1 -1
  97. package/dist/cli/lib.d.mts +81 -21107
  98. package/dist/cli/lib.mjs +6 -9
  99. package/dist/cli/lib.mjs.map +1 -1
  100. package/dist/cli/query/index.d.mts +35 -0
  101. package/dist/cli/services/application.d.mts +1 -0
  102. package/dist/cli/services/auth/service.d.mts +1 -0
  103. package/dist/cli/services/executor/service.d.mts +1 -0
  104. package/dist/cli/services/http-adapter/bundler.d.mts +1 -0
  105. package/dist/cli/services/http-adapter/service.d.mts +1 -0
  106. package/dist/cli/services/resolver/service.d.mts +1 -0
  107. package/dist/cli/services/tailordb/service.d.mts +1 -0
  108. package/dist/cli/services/workflow/bundler.d.mts +1 -0
  109. package/dist/cli/services/workflow/service.d.mts +1 -0
  110. package/dist/cli/shared/args.d.mts +13 -0
  111. package/dist/cli/shared/client.d.mts +1273 -0
  112. package/dist/cli/shared/config-loader.d.mts +26 -0
  113. package/dist/cli/shared/context.d.mts +28 -0
  114. package/dist/cli/shared/script-executor.d.mts +75 -0
  115. package/dist/cli/shared/seed-chunker.d.mts +46 -0
  116. package/dist/cli/shared/trigger-context.d.mts +1 -0
  117. package/dist/cli/shared/type-generator.d.mts +20 -0
  118. package/dist/cli/ts-hook.d.mts +4 -0
  119. package/dist/cli/ts-hook.mjs +303 -0
  120. package/dist/completion/zsh-worker.zsh +1523 -1123
  121. package/dist/configure/config/index.d.mts +21 -0
  122. package/dist/configure/config/types.d.mts +103 -0
  123. package/dist/configure/index.d.mts +122 -9
  124. package/dist/configure/index.mjs +24 -21
  125. package/dist/configure/index.mjs.map +1 -1
  126. package/dist/configure/services/aigateway/index.d.mts +17 -0
  127. package/dist/configure/services/aigateway/types.d.mts +11 -0
  128. package/dist/configure/services/auth/index.d.mts +34 -0
  129. package/dist/configure/services/auth/types.d.mts +172 -0
  130. package/dist/configure/services/executor/executor.d.mts +81 -0
  131. package/dist/configure/services/executor/index.d.mts +8 -0
  132. package/dist/configure/services/executor/operation.d.mts +45 -0
  133. package/dist/configure/services/executor/trigger/event.d.mts +272 -0
  134. package/dist/configure/services/executor/trigger/index.d.mts +8 -0
  135. package/dist/configure/services/executor/trigger/schedule.d.mts +25 -0
  136. package/dist/configure/services/executor/trigger/webhook.d.mts +44 -0
  137. package/dist/configure/services/executor/types.d.mts +2 -0
  138. package/dist/configure/services/http-adapter/http-adapter.d.mts +125 -0
  139. package/dist/configure/services/http-adapter/index.d.mts +2 -0
  140. package/dist/configure/services/idp/index.d.mts +64 -0
  141. package/dist/configure/services/idp/permission.d.mts +80 -0
  142. package/dist/configure/services/idp/types.d.mts +20 -0
  143. package/dist/configure/services/index.d.mts +32 -0
  144. package/dist/configure/services/resolver/index.d.mts +5 -0
  145. package/dist/configure/services/resolver/resolver.d.mts +75 -0
  146. package/dist/configure/services/resolver/types.d.mts +6 -0
  147. package/dist/configure/services/secrets/index.d.mts +38 -0
  148. package/dist/configure/services/secrets/types.d.mts +11 -0
  149. package/dist/configure/services/staticwebsite/index.d.mts +19 -0
  150. package/dist/configure/services/staticwebsite/types.d.mts +11 -0
  151. package/dist/configure/services/tailordb/index.d.mts +4 -0
  152. package/dist/configure/services/tailordb/permission.d.mts +119 -0
  153. package/dist/configure/services/tailordb/schema.d.mts +456 -0
  154. package/dist/configure/services/tailordb/types.d.mts +149 -0
  155. package/dist/configure/services/workflow/index.d.mts +6 -0
  156. package/dist/configure/services/workflow/job.d.mts +79 -0
  157. package/dist/configure/services/workflow/types.d.mts +2 -0
  158. package/dist/configure/services/workflow/wait-point.d.mts +73 -0
  159. package/dist/configure/services/workflow/workflow.d.mts +54 -0
  160. package/dist/configure/types/aigateway-name.d.mts +12 -0
  161. package/dist/configure/types/connection-name.d.mts +12 -0
  162. package/dist/configure/types/field-runtime.d.mts +17 -0
  163. package/dist/configure/types/field.d.mts +9 -0
  164. package/dist/configure/types/field.types.d.mts +109 -0
  165. package/dist/configure/types/idp-name.d.mts +12 -0
  166. package/dist/configure/types/index.d.mts +4 -0
  167. package/dist/configure/types/machine-user.d.mts +2 -0
  168. package/dist/configure/types/type.d.mts +82 -0
  169. package/dist/context-Bd266-ru.mjs.map +1 -1
  170. package/dist/{crashreport-DFq-vsU0.mjs → crashreport-Cg-pqRJV.mjs} +6 -6
  171. package/dist/{crashreport-DFq-vsU0.mjs.map → crashreport-Cg-pqRJV.mjs.map} +1 -1
  172. package/dist/{crashreport-BMWcxeSE.mjs → crashreport-D3RjuSYb.mjs} +1 -1
  173. package/dist/enum-constants-j9QBF0cB.mjs.map +1 -1
  174. package/dist/{errors-Dtf2WPaW.mjs → errors-118wUDRr.mjs} +2 -2
  175. package/dist/errors-118wUDRr.mjs.map +1 -0
  176. package/dist/field-runtime-CAnh_oow.mjs +183 -0
  177. package/dist/field-runtime-CAnh_oow.mjs.map +1 -0
  178. package/dist/file-utils-CYZnO1pX.mjs.map +1 -1
  179. package/dist/{globals-Cf0sxIt8.mjs → globals-DhwZj0RB.mjs} +4 -46
  180. package/dist/globals-DhwZj0RB.mjs.map +1 -0
  181. package/dist/{idp-BDbK5gjm.mjs → idp-Bx25ZBdN.mjs} +9 -1
  182. package/dist/idp-Bx25ZBdN.mjs.map +1 -0
  183. package/dist/{interceptor-D-q1rvRl.mjs → interceptor-e33JtsC-.mjs} +2 -2
  184. package/dist/interceptor-e33JtsC-.mjs.map +1 -0
  185. package/dist/kysely/index.d.mts +2 -3
  186. package/dist/{kysely-type-DR8uzZTA.mjs → kysely-type-5eAChaHO.mjs} +4 -2
  187. package/dist/kysely-type-5eAChaHO.mjs.map +1 -0
  188. package/dist/{logger-CxF-Ex5d.mjs → logger-BEiZZ3qT.mjs} +3 -3
  189. package/dist/{logger-CxF-Ex5d.mjs.map → logger-BEiZZ3qT.mjs.map} +1 -1
  190. package/dist/parser/service/auth/index.d.mts +1 -0
  191. package/dist/parser/service/auth/schema.d.mts +1 -0
  192. package/dist/parser/service/http-adapter/index.d.mts +1 -0
  193. package/dist/parser/service/http-adapter/schema.d.mts +1 -0
  194. package/dist/parser/service/idp/types.d.mts +4 -0
  195. package/dist/parser/service/tailordb/types.d.mts +126 -0
  196. package/dist/platform-serialize-RoRtBS0v.mjs +46 -0
  197. package/dist/platform-serialize-RoRtBS0v.mjs.map +1 -0
  198. package/dist/plugin/builtin/enum-constants/index.d.mts +16 -1
  199. package/dist/plugin/builtin/file-utils/index.d.mts +16 -1
  200. package/dist/plugin/builtin/kysely-type/index.d.mts +16 -1
  201. package/dist/plugin/builtin/kysely-type/index.mjs +1 -1
  202. package/dist/plugin/builtin/seed/index.d.mts +45 -1
  203. package/dist/plugin/builtin/seed/index.mjs +1 -1
  204. package/dist/plugin/get-generated-type.d.mts +17 -0
  205. package/dist/plugin/index.d.mts +3 -118
  206. package/dist/plugin/index.mjs +1 -1
  207. package/dist/plugin/index.mjs.map +1 -1
  208. package/dist/plugin/manager.d.mts +1 -0
  209. package/dist/plugin/types.d.mts +243 -0
  210. package/dist/plugin/with-context.d.mts +102 -0
  211. package/dist/{runtime-CY4JvrDj.mjs → register-ts-hook-ZpBacA07.mjs} +3426 -2041
  212. package/dist/register-ts-hook-ZpBacA07.mjs.map +1 -0
  213. package/dist/registry-DH4m7eYo.mjs.map +1 -1
  214. package/dist/{repl-editor-DmGr9zMw.mjs → repl-editor-BCozyiNq.mjs} +6 -5
  215. package/dist/{repl-editor-DmGr9zMw.mjs.map → repl-editor-BCozyiNq.mjs.map} +1 -1
  216. package/dist/runtime/aigateway.d.mts +35 -0
  217. package/dist/runtime/aigateway.mjs +3 -0
  218. package/dist/runtime/authconnection.d.mts +31 -2
  219. package/dist/runtime/authconnection.mjs +1 -1
  220. package/dist/runtime/context.d.mts +46 -2
  221. package/dist/runtime/file.d.mts +210 -2
  222. package/dist/runtime/globals.d.mts +31 -19
  223. package/dist/runtime/iconv.d.mts +121 -2
  224. package/dist/runtime/idp.d.mts +186 -2
  225. package/dist/runtime/idp.mjs +1 -1
  226. package/dist/runtime/index.d.mts +47 -9
  227. package/dist/runtime/index.mjs +5 -4
  228. package/dist/runtime/secretmanager.d.mts +54 -2
  229. package/dist/{types-BZ7QKVE8.d.mts → runtime/types.d.mts} +4 -5
  230. package/dist/runtime/workflow.d.mts +112 -2
  231. package/dist/runtime/workflow.mjs +2 -2
  232. package/dist/{schema-Dtw9Orye.mjs → schema-89dYxNC2.mjs} +17 -182
  233. package/dist/schema-89dYxNC2.mjs.map +1 -0
  234. package/dist/{secret-file-VSVGy1V0.mjs → secret-file-aoNXJmKa.mjs} +3 -3
  235. package/dist/secret-file-aoNXJmKa.mjs.map +1 -0
  236. package/dist/secretmanager-Bd45j7an.mjs +98 -0
  237. package/dist/secretmanager-Bd45j7an.mjs.map +1 -0
  238. package/dist/seed/index.d.mts +1 -2
  239. package/dist/{seed-izIEyP3z.mjs → seed-CRSQJI_z.mjs} +14 -3
  240. package/dist/seed-CRSQJI_z.mjs.map +1 -0
  241. package/dist/service-CkIwEctX.mjs +3 -0
  242. package/dist/{service-DU1mVzri2.mjs → service-DeZeYa06.mjs} +3 -3
  243. package/dist/service-DeZeYa06.mjs.map +1 -0
  244. package/dist/{service-DjyqbCaJ.mjs → service-ufH7sS8o.mjs} +396 -58
  245. package/dist/service-ufH7sS8o.mjs.map +1 -0
  246. package/dist/service_pb-CIrhGwHk.mjs +988 -0
  247. package/dist/service_pb-CIrhGwHk.mjs.map +1 -0
  248. package/dist/service_pb-DjwIn4jO.mjs +3 -0
  249. package/dist/tailor-proto/src/tailor/v1/aigateway_pb.d.mts +204 -0
  250. package/dist/tailor-proto/src/tailor/v1/aigateway_resource_pb.d.mts +58 -0
  251. package/dist/tailor-proto/src/tailor/v1/application_pb.d.mts +316 -0
  252. package/dist/tailor-proto/src/tailor/v1/application_resource_pb.d.mts +161 -0
  253. package/dist/tailor-proto/src/tailor/v1/auth_pb.d.mts +2070 -0
  254. package/dist/tailor-proto/src/tailor/v1/auth_resource_pb.d.mts +861 -0
  255. package/dist/tailor-proto/src/tailor/v1/events_pb.d.mts +112 -0
  256. package/dist/tailor-proto/src/tailor/v1/events_resource_pb.d.mts +69 -0
  257. package/dist/tailor-proto/src/tailor/v1/executor_pb.d.mts +439 -0
  258. package/dist/tailor-proto/src/tailor/v1/executor_resource_pb.d.mts +564 -0
  259. package/dist/tailor-proto/src/tailor/v1/function_pb.d.mts +145 -0
  260. package/dist/tailor-proto/src/tailor/v1/function_registry_pb.d.mts +451 -0
  261. package/dist/tailor-proto/src/tailor/v1/function_resource_pb.d.mts +192 -0
  262. package/dist/tailor-proto/src/tailor/v1/http_adapter_resource_pb.d.mts +50 -0
  263. package/dist/tailor-proto/src/tailor/v1/idp_pb.d.mts +407 -0
  264. package/dist/tailor-proto/src/tailor/v1/idp_resource_pb.d.mts +430 -0
  265. package/dist/tailor-proto/src/tailor/v1/metadata_pb.d.mts +73 -0
  266. package/dist/tailor-proto/src/tailor/v1/metadata_resource_pb.d.mts +17 -0
  267. package/dist/tailor-proto/src/tailor/v1/meter_pb.d.mts +309 -0
  268. package/dist/tailor-proto/src/tailor/v1/pipeline_pb.d.mts +591 -0
  269. package/dist/tailor-proto/src/tailor/v1/pipeline_resource_pb.d.mts +330 -0
  270. package/dist/tailor-proto/src/tailor/v1/resource_pb.d.mts +113 -0
  271. package/dist/tailor-proto/src/tailor/v1/secret_manager_pb.d.mts +346 -0
  272. package/dist/tailor-proto/src/tailor/v1/secret_manager_resource_pb.d.mts +54 -0
  273. package/dist/tailor-proto/src/tailor/v1/service_pb.d.mts +3576 -0
  274. package/dist/tailor-proto/src/tailor/v1/stateflow_pb.d.mts +187 -0
  275. package/dist/tailor-proto/src/tailor/v1/stateflow_resource_pb.d.mts +29 -0
  276. package/dist/tailor-proto/src/tailor/v1/staticwebsite_pb.d.mts +429 -0
  277. package/dist/tailor-proto/src/tailor/v1/staticwebsite_resource_pb.d.mts +90 -0
  278. package/dist/tailor-proto/src/tailor/v1/tailordb_pb.d.mts +684 -0
  279. package/dist/tailor-proto/src/tailor/v1/tailordb_resource_pb.d.mts +797 -0
  280. package/dist/tailor-proto/src/tailor/v1/telemetryrouter_pb.d.mts +330 -0
  281. package/dist/tailor-proto/src/tailor/v1/telemetryrouter_resource_pb.d.mts +183 -0
  282. package/dist/tailor-proto/src/tailor/v1/workflow_pb.d.mts +842 -0
  283. package/dist/tailor-proto/src/tailor/v1/workflow_resource_pb.d.mts +276 -0
  284. package/dist/tailor-proto/src/tailor/v1/workspace_pb.d.mts +2015 -0
  285. package/dist/tailor-proto/src/tailor/v1/workspace_resource_pb.d.mts +483 -0
  286. package/dist/{telemetry-CdqJEzkj.mjs → telemetry-BRVdwh14.mjs} +3 -3
  287. package/dist/telemetry-BRVdwh14.mjs.map +1 -0
  288. package/dist/telemetry-CkbkeJxl.mjs +3 -0
  289. package/dist/types/aigateway.generated.d.mts +9 -0
  290. package/dist/types/app-config.generated.d.mts +4 -0
  291. package/dist/types/auth-connection.generated.d.mts +20 -0
  292. package/dist/types/auth.generated.d.mts +145 -0
  293. package/dist/types/executor.generated.d.mts +177 -0
  294. package/dist/types/helpers.d.mts +39 -0
  295. package/dist/types/http-adapter.generated.d.mts +17 -0
  296. package/dist/{workflow.generated-ClEjBYhm.d.mts → types/idp.generated.d.mts} +98 -185
  297. package/dist/types/resolver.generated.d.mts +39 -0
  298. package/dist/types/secrets.generated.d.mts +14 -0
  299. package/dist/types/staticwebsite.generated.d.mts +10 -0
  300. package/dist/{types-CdcQh4Z2.d.mts → types/tailordb.generated.d.mts} +2 -287
  301. package/dist/types/workflow.generated.d.mts +12 -0
  302. package/dist/types-C-lQ4se3.mjs +4 -0
  303. package/dist/types-CXF2OYdR.mjs +199 -0
  304. package/dist/types-CXF2OYdR.mjs.map +1 -0
  305. package/dist/utils/test/index.d.mts +5 -89
  306. package/dist/utils/test/index.mjs.map +1 -1
  307. package/dist/utils/test/mock.d.mts +87 -0
  308. package/dist/vitest/environment.d.mts +1 -2
  309. package/dist/vitest/environment.mjs +2 -2
  310. package/dist/vitest/environment.mjs.map +1 -1
  311. package/dist/vitest/index.d.mts +12 -428
  312. package/dist/vitest/index.mjs +739 -8
  313. package/dist/vitest/index.mjs.map +1 -1
  314. package/dist/vitest/mock-kysely.d.mts +62 -0
  315. package/dist/vitest/mock.d.mts +9 -0
  316. package/dist/vitest/mocks/aigateway.d.mts +30 -0
  317. package/dist/vitest/mocks/authconnection.d.mts +28 -0
  318. package/dist/vitest/mocks/file.d.mts +41 -0
  319. package/dist/vitest/mocks/iconv.d.mts +27 -0
  320. package/dist/vitest/mocks/idp.d.mts +44 -0
  321. package/dist/vitest/mocks/secretmanager.d.mts +33 -0
  322. package/dist/vitest/mocks/tailordb.d.mts +71 -0
  323. package/dist/vitest/mocks/workflow.d.mts +115 -0
  324. package/dist/vitest/setup.d.mts +1 -2
  325. package/dist/vitest/setup.mjs +2 -2
  326. package/dist/vitest/workflow-local.d.mts +40 -0
  327. package/dist/{workflow-BOmaZwwG.mjs → workflow-Bo59B75H.mjs} +9 -2
  328. package/dist/workflow-Bo59B75H.mjs.map +1 -0
  329. package/docs/cli/application.md +98 -250
  330. package/docs/cli/auth.md +48 -292
  331. package/docs/cli/completion.md +1 -25
  332. package/docs/cli/crashreport.md +3 -61
  333. package/docs/cli/executor.md +23 -187
  334. package/docs/cli/function.md +14 -130
  335. package/docs/cli/organization.md +11 -221
  336. package/docs/cli/plugin.md +29 -0
  337. package/docs/cli/query.md +2 -22
  338. package/docs/cli/secret.md +71 -251
  339. package/docs/cli/setup.md +137 -41
  340. package/docs/cli/skills.md +50 -39
  341. package/docs/cli/staticwebsite.md +32 -180
  342. package/docs/cli/tailordb.md +97 -323
  343. package/docs/cli/upgrade.md +2 -22
  344. package/docs/cli/user.md +78 -247
  345. package/docs/cli/workflow.md +44 -203
  346. package/docs/cli/workspace.md +165 -538
  347. package/docs/cli-reference.md +167 -67
  348. package/docs/configuration.md +10 -4
  349. package/docs/github-actions.md +46 -19
  350. package/docs/migration/v2.md +286 -26
  351. package/docs/multi-environment.md +29 -7
  352. package/docs/plugin/index.md +6 -6
  353. package/docs/quickstart.md +8 -7
  354. package/docs/runtime.md +5 -1
  355. package/docs/services/aigateway.md +18 -2
  356. package/docs/services/auth.md +32 -40
  357. package/docs/services/http-adapter.md +16 -1
  358. package/docs/services/idp.md +55 -2
  359. package/docs/services/resolver.md +1 -1
  360. package/docs/services/secret.md +11 -11
  361. package/docs/services/staticwebsite.md +8 -2
  362. package/docs/services/tailordb-migration.md +24 -22
  363. package/docs/services/tailordb.md +25 -2
  364. package/docs/services/workflow.md +14 -14
  365. package/docs/testing.md +49 -3
  366. package/package.json +42 -31
  367. package/postinstall.mjs +4 -6
  368. package/dist/application-Dtqap5jM.mjs +0 -3
  369. package/dist/application-XuMWK4eq.mjs +0 -7257
  370. package/dist/application-XuMWK4eq.mjs.map +0 -1
  371. package/dist/authconnection-D2MhtTN5.mjs.map +0 -1
  372. package/dist/authconnection-DvUQAjQS.d.mts +0 -39
  373. package/dist/context-C2lEi9uw.d.mts +0 -47
  374. package/dist/errors-Dtf2WPaW.mjs.map +0 -1
  375. package/dist/field-DOsJCPFa.mjs +0 -22
  376. package/dist/field-DOsJCPFa.mjs.map +0 -1
  377. package/dist/file-Dq3NIt_F.d.mts +0 -211
  378. package/dist/globals-Cf0sxIt8.mjs.map +0 -1
  379. package/dist/http-adapter.generated-DFsXDdm5.d.mts +0 -581
  380. package/dist/iconv-Co-TOPuH.d.mts +0 -122
  381. package/dist/idp-BDbK5gjm.mjs.map +0 -1
  382. package/dist/idp-DrhVrLmV.d.mts +0 -160
  383. package/dist/index-BI-_j9Z3.d.mts +0 -1013
  384. package/dist/index-C4JirJH8.d.mts +0 -18
  385. package/dist/index-CZfWhr0a.d.mts +0 -18
  386. package/dist/index-Cg8VKAdN.d.mts +0 -46
  387. package/dist/index-DYRjoLXD.d.mts +0 -47
  388. package/dist/index-lFpcjHPU.d.mts +0 -201
  389. package/dist/index-nW7hE6oE.d.mts +0 -18
  390. package/dist/interceptor-D-q1rvRl.mjs.map +0 -1
  391. package/dist/kysely-type-DR8uzZTA.mjs.map +0 -1
  392. package/dist/mock-FPxmnt-y.mjs +0 -759
  393. package/dist/mock-FPxmnt-y.mjs.map +0 -1
  394. package/dist/runtime-CY4JvrDj.mjs.map +0 -1
  395. package/dist/schema-Dtw9Orye.mjs.map +0 -1
  396. package/dist/secret-file-VSVGy1V0.mjs.map +0 -1
  397. package/dist/secretmanager-B3n4KHfm.d.mts +0 -55
  398. package/dist/seed-izIEyP3z.mjs.map +0 -1
  399. package/dist/service-DCqIWibD.mjs +0 -3
  400. package/dist/service-DU1mVzri2.mjs.map +0 -1
  401. package/dist/service-DjyqbCaJ.mjs.map +0 -1
  402. package/dist/telemetry-CdqJEzkj.mjs.map +0 -1
  403. package/dist/telemetry-ClwW5ohF.mjs +0 -3
  404. package/dist/types-74etvaxy.mjs +0 -4
  405. package/dist/types-BDRml5C3.d.mts +0 -574
  406. package/dist/types-BQijbo4m.mjs +0 -371
  407. package/dist/types-BQijbo4m.mjs.map +0 -1
  408. package/dist/types-BX4q6Mo6.d.mts +0 -339
  409. package/dist/workflow-BOmaZwwG.mjs.map +0 -1
  410. package/dist/workflow-BVy4XWjS.d.mts +0 -101
@@ -1,118 +1,3 @@
1
- import { a as TailorEnv, o as TailorPrincipal } from "../types-BZ7QKVE8.mjs";
2
- import { f as TailorAnyDBType } from "../types-CdcQh4Z2.mjs";
3
-
4
- //#region src/plugin/with-context.d.ts
5
- /**
6
- * Plugin executor factory function type.
7
- * Takes context and returns an executor configuration.
8
- * Returns unknown since the exact return type depends on createExecutor's generic params.
9
- */
10
- type PluginExecutorFactory<Ctx> = (ctx: Ctx) => unknown;
11
- /**
12
- * Base args for plugin executor function operations.
13
- * Provides typed access to runtime context without requiring specific record types.
14
- */
15
- interface PluginFunctionArgs {
16
- /** Workspace ID where the executor runs */
17
- workspaceId: string;
18
- /** Application namespace */
19
- appNamespace: string;
20
- /** Environment variables */
21
- env: TailorEnv;
22
- /** Principal that triggered the event, null for system events */
23
- actor: TailorPrincipal | null;
24
- /** Name of the TailorDB type */
25
- typeName: string;
26
- /** TailorDB connections by namespace */
27
- tailordb: Record<string, unknown>;
28
- }
29
- /**
30
- * Args for plugin executors triggered on record creation.
31
- */
32
- interface PluginRecordCreatedArgs extends PluginFunctionArgs {
33
- /** The newly created record */
34
- newRecord: Record<string, unknown>;
35
- }
36
- /**
37
- * Args for plugin executors triggered on record update.
38
- */
39
- interface PluginRecordUpdatedArgs extends PluginFunctionArgs {
40
- /** The record after update */
41
- newRecord: Record<string, unknown>;
42
- /** The record before update */
43
- oldRecord: Record<string, unknown>;
44
- }
45
- /**
46
- * Args for plugin executors triggered on record deletion.
47
- */
48
- interface PluginRecordDeletedArgs extends PluginFunctionArgs {
49
- /** The deleted record */
50
- oldRecord: Record<string, unknown>;
51
- }
52
- /**
53
- * Database schema type for plugins.
54
- * Since plugins work with dynamic types, the schema uses Record types.
55
- */
56
- type PluginDBSchema = Record<string, Record<string, unknown>>;
57
- /**
58
- * Base record type for TailorDB records.
59
- * All records have an id field.
60
- */
61
- type PluginRecord = {
62
- id: string;
63
- } & Record<string, unknown>;
64
- /**
65
- * Define a plugin executor that receives context at runtime.
66
- * This allows executor definitions to be in separate files while
67
- * still receiving dynamic values like typeName, generated types, and namespace.
68
- * @param factory - Function that takes context and returns executor configuration
69
- * @returns The same factory function (for type inference)
70
- * @example
71
- * ```typescript
72
- * // executors/on-create.ts
73
- * import { withPluginContext } from "@tailor-platform/sdk/plugin";
74
- * import { createExecutor, recordCreatedTrigger } from "@tailor-platform/sdk";
75
- * import { getDB } from "@tailor-platform/function-kysely-tailordb";
76
- *
77
- * interface MyContext {
78
- * sourceType: TailorAnyDBType;
79
- * historyType: TailorAnyDBType;
80
- * namespace: string;
81
- * }
82
- *
83
- * export default withPluginContext<MyContext>((ctx) =>
84
- * createExecutor({
85
- * name: `${ctx.sourceType.name.toLowerCase()}-on-create`,
86
- * trigger: recordCreatedTrigger({ type: ctx.sourceType }),
87
- * operation: {
88
- * kind: "function",
89
- * body: async (args) => {
90
- * const db = getDB(ctx.namespace);
91
- * await db.insertInto(ctx.historyType.name).values({
92
- * recordId: args.newRecord.id,
93
- * // ...
94
- * }).execute();
95
- * },
96
- * },
97
- * })
98
- * );
99
- * ```
100
- */
101
- declare function withPluginContext<Ctx>(factory: PluginExecutorFactory<Ctx>): PluginExecutorFactory<Ctx>;
102
- //#endregion
103
- //#region src/plugin/get-generated-type.d.ts
104
- /**
105
- * Get a generated type from a plugin by loading the config and resolving everything automatically.
106
- * For type-attached plugins, calls onTypeLoaded() with the sourceType.
107
- * For namespace plugins, calls onNamespaceLoaded() with auto-resolved namespace.
108
- * Results are cached per config path, plugin, namespace, and pluginConfig to avoid redundant processing.
109
- * @param configPath - Path to tailor.config.ts (absolute or relative to cwd)
110
- * @param pluginId - The plugin's unique identifier
111
- * @param sourceType - The source TailorDB type (null for namespace plugins)
112
- * @param kind - The generated type kind (e.g., "request", "step")
113
- * @returns The generated TailorDB type
114
- */
115
- declare function getGeneratedType(configPath: string, pluginId: string, sourceType: TailorAnyDBType | null, kind: string): Promise<TailorAnyDBType>;
116
- //#endregion
117
- export { type PluginDBSchema, type PluginExecutorFactory, type PluginFunctionArgs, type PluginRecord, type PluginRecordCreatedArgs, type PluginRecordDeletedArgs, type PluginRecordUpdatedArgs, getGeneratedType, withPluginContext };
118
- //# sourceMappingURL=index.d.mts.map
1
+ import { PluginDBSchema, PluginExecutorFactory, PluginFunctionArgs, PluginRecord, PluginRecordCreatedArgs, PluginRecordDeletedArgs, PluginRecordUpdatedArgs, withPluginContext } from "./with-context.mjs";
2
+ import { getGeneratedType } from "./get-generated-type.mjs";
3
+ export { type PluginDBSchema, type PluginExecutorFactory, type PluginFunctionArgs, type PluginRecord, type PluginRecordCreatedArgs, type PluginRecordDeletedArgs, type PluginRecordUpdatedArgs, getGeneratedType, withPluginContext };
@@ -1,5 +1,5 @@
1
- import * as fs from "node:fs";
2
1
  import * as path from "pathe";
2
+ import * as fs from "node:fs";
3
3
  import { pathToFileURL } from "node:url";
4
4
 
5
5
  //#region src/plugin/with-context.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/plugin/with-context.ts","../../src/plugin/get-generated-type.ts"],"sourcesContent":["/**\n * Plugin executor context support for defining plugin executors in separate files.\n * This module provides utilities for creating type-safe plugin executors that receive\n * context (like type references and namespace) at runtime.\n */\n\nimport type { TailorEnv, TailorPrincipal } from \"@/runtime/types\";\n\n/**\n * Plugin executor factory function type.\n * Takes context and returns an executor configuration.\n * Returns unknown since the exact return type depends on createExecutor's generic params.\n */\nexport type PluginExecutorFactory<Ctx> = (ctx: Ctx) => unknown;\n\n// ============================================================================\n// Plugin Executor Args Types\n// ============================================================================\n\n/**\n * Base args for plugin executor function operations.\n * Provides typed access to runtime context without requiring specific record types.\n */\nexport interface PluginFunctionArgs {\n /** Workspace ID where the executor runs */\n workspaceId: string;\n /** Application namespace */\n appNamespace: string;\n /** Environment variables */\n env: TailorEnv;\n /** Principal that triggered the event, null for system events */\n actor: TailorPrincipal | null;\n /** Name of the TailorDB type */\n typeName: string;\n /** TailorDB connections by namespace */\n tailordb: Record<string, unknown>;\n}\n\n/**\n * Args for plugin executors triggered on record creation.\n */\nexport interface PluginRecordCreatedArgs extends PluginFunctionArgs {\n /** The newly created record */\n newRecord: Record<string, unknown>;\n}\n\n/**\n * Args for plugin executors triggered on record update.\n */\nexport interface PluginRecordUpdatedArgs extends PluginFunctionArgs {\n /** The record after update */\n newRecord: Record<string, unknown>;\n /** The record before update */\n oldRecord: Record<string, unknown>;\n}\n\n/**\n * Args for plugin executors triggered on record deletion.\n */\nexport interface PluginRecordDeletedArgs extends PluginFunctionArgs {\n /** The deleted record */\n oldRecord: Record<string, unknown>;\n}\n\n/**\n * Database schema type for plugins.\n * Since plugins work with dynamic types, the schema uses Record types.\n */\nexport type PluginDBSchema = Record<string, Record<string, unknown>>;\n\n/**\n * Base record type for TailorDB records.\n * All records have an id field.\n */\nexport type PluginRecord = { id: string } & Record<string, unknown>;\n\n/**\n * Define a plugin executor that receives context at runtime.\n * This allows executor definitions to be in separate files while\n * still receiving dynamic values like typeName, generated types, and namespace.\n * @param factory - Function that takes context and returns executor configuration\n * @returns The same factory function (for type inference)\n * @example\n * ```typescript\n * // executors/on-create.ts\n * import { withPluginContext } from \"@tailor-platform/sdk/plugin\";\n * import { createExecutor, recordCreatedTrigger } from \"@tailor-platform/sdk\";\n * import { getDB } from \"@tailor-platform/function-kysely-tailordb\";\n *\n * interface MyContext {\n * sourceType: TailorAnyDBType;\n * historyType: TailorAnyDBType;\n * namespace: string;\n * }\n *\n * export default withPluginContext<MyContext>((ctx) =>\n * createExecutor({\n * name: `${ctx.sourceType.name.toLowerCase()}-on-create`,\n * trigger: recordCreatedTrigger({ type: ctx.sourceType }),\n * operation: {\n * kind: \"function\",\n * body: async (args) => {\n * const db = getDB(ctx.namespace);\n * await db.insertInto(ctx.historyType.name).values({\n * recordId: args.newRecord.id,\n * // ...\n * }).execute();\n * },\n * },\n * })\n * );\n * ```\n */\nexport function withPluginContext<Ctx>(\n factory: PluginExecutorFactory<Ctx>,\n): PluginExecutorFactory<Ctx> {\n return factory;\n}\n","import * as fs from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport * as path from \"pathe\";\nimport type { TailorAnyDBType } from \"@/configure/services/tailordb/types\";\nimport type { Plugin, PluginOutput, TypePluginOutput } from \"@/plugin/types\";\n\n// ========================================\n// Config loading and caching\n// ========================================\n\ninterface PluginEntry {\n plugin: Plugin;\n pluginConfig: unknown;\n}\n\ninterface ConfigCache {\n config: { db?: Record<string, unknown> };\n plugins: Map<string, PluginEntry>;\n configDir: string;\n}\n\n/** Cache: resolved config path -> loaded config data */\nconst configCacheMap = new Map<string, ConfigCache>();\n\n/**\n * Check if a value is a Plugin instance.\n * @param value - Value to check\n * @returns True if value has the shape of Plugin\n */\nfunction isPlugin(value: unknown): value is Plugin {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Record<string, unknown>).id === \"string\" &&\n typeof (value as Record<string, unknown>).description === \"string\"\n );\n}\n\n/**\n * Load and cache config module from the given path.\n * Extracts plugins from all array exports using definePlugins() format.\n * Returns null if the config file does not exist (e.g., in bundled executor on platform server).\n * @param configPath - Absolute or relative path to tailor.config.ts\n * @returns Cached config data with plugins map, or null if config file is not available\n */\nasync function loadAndCacheConfig(configPath: string): Promise<ConfigCache | null> {\n const resolvedPath = path.resolve(configPath);\n\n const cached = configCacheMap.get(resolvedPath);\n if (cached) return cached;\n\n // Config file may not exist in bundled environments (e.g., platform server)\n if (!fs.existsSync(resolvedPath)) {\n return null;\n }\n\n const configModule = await import(pathToFileURL(resolvedPath).href);\n if (!configModule?.default) {\n throw new Error(`Invalid config module at \"${resolvedPath}\": default export not found`);\n }\n\n const config = configModule.default as { db?: Record<string, unknown> };\n const configDir = path.dirname(resolvedPath);\n const plugins = new Map<string, PluginEntry>();\n\n // Find plugin arrays from exports (definePlugins returns PluginConfig[])\n for (const value of Object.values(configModule)) {\n if (!Array.isArray(value)) continue;\n\n for (const item of value) {\n if (isPlugin(item)) {\n plugins.set(item.id, { plugin: item, pluginConfig: item.pluginConfig });\n }\n }\n }\n\n const result: ConfigCache = { config, plugins, configDir };\n configCacheMap.set(resolvedPath, result);\n return result;\n}\n\n// ========================================\n// Namespace resolution\n// ========================================\n\ninterface DbNamespaceConfig {\n files?: string[];\n external?: boolean;\n}\n\n/**\n * Resolve the namespace for a type-attached sourceType by checking config.db file patterns.\n * Uses ESM module cache identity: same file path yields same object references.\n * @param config - App config with db namespace definitions\n * @param config.db - DB namespace definitions\n * @param configDir - Directory containing the config file\n * @param sourceType - The TailorDB type to look up\n * @returns The namespace name\n */\nasync function resolveNamespaceForType(\n config: { db?: Record<string, unknown> },\n configDir: string,\n sourceType: TailorAnyDBType,\n): Promise<string> {\n if (!config.db) {\n throw new Error(`No db configuration found in config`);\n }\n\n for (const [namespace, nsConfig] of Object.entries(config.db)) {\n const dbConfig = nsConfig as DbNamespaceConfig;\n // Skip external namespaces (no files to resolve)\n if (dbConfig.external || !dbConfig.files) continue;\n\n for (const pattern of dbConfig.files) {\n const absolutePattern = path.resolve(configDir, pattern);\n let matchedFiles: string[];\n try {\n matchedFiles = fs.globSync(absolutePattern);\n } catch {\n continue;\n }\n\n for (const file of matchedFiles) {\n const mod = await import(pathToFileURL(file).href);\n for (const exported of Object.values(mod)) {\n if (exported === sourceType) {\n return namespace;\n }\n }\n }\n }\n }\n\n throw new Error(\n `Could not resolve namespace for type \"${sourceType.name}\". ` +\n `Ensure the type file is included in a db namespace's files pattern.`,\n );\n}\n\n/**\n * Resolve the namespace for a namespace plugin by trying each namespace.\n * Calls onNamespaceLoaded() for each and returns the first whose output contains the requested kind.\n * @param config - App config with db namespace definitions\n * @param config.db - DB namespace definitions\n * @param plugin - Plugin instance\n * @param kind - The generated type kind to look for\n * @param pluginConfig - Plugin-level configuration\n * @returns The namespace name\n */\nasync function resolveNamespaceForNamespacePlugin(\n config: { db?: Record<string, unknown> },\n plugin: Plugin,\n kind: string,\n pluginConfig: unknown,\n): Promise<{ namespace: string; output: PluginOutput }> {\n if (!config.db) {\n throw new Error(`No db configuration found in config`);\n }\n\n if (!plugin.onNamespaceLoaded) {\n throw new Error(`Plugin \"${plugin.id}\" does not have a onNamespaceLoaded() method`);\n }\n\n for (const namespace of Object.keys(config.db)) {\n const dbConfig = config.db[namespace] as DbNamespaceConfig;\n if (dbConfig.external) continue;\n\n const output = await plugin.onNamespaceLoaded({\n pluginConfig,\n namespace,\n });\n\n if (output.types?.[kind]) {\n return { namespace, output };\n }\n }\n\n throw new Error(\n `Could not resolve namespace for plugin \"${plugin.id}\" with kind \"${kind}\". ` +\n `No namespace produced a type with that kind.`,\n );\n}\n\n// ========================================\n// Process caching\n// ========================================\n\n// Cache: plugin -> cacheKey -> TypePluginOutput\nconst processCache = new WeakMap<Plugin, Map<string, TypePluginOutput>>();\n\n// Cache for namespace plugins: plugin -> cacheKey -> PluginOutput\nconst namespaceProcessCache = new WeakMap<Plugin, Map<string, PluginOutput>>();\n\n/**\n * Generate a cache key that includes pluginConfig.\n * @param baseKey - Base key for the cache\n * @param pluginConfig - Plugin configuration to include in the key\n * @returns Cache key string\n */\nfunction getCacheKey(baseKey: string, pluginConfig: unknown): string {\n if (pluginConfig === undefined) {\n return baseKey;\n }\n try {\n return `${baseKey}:${JSON.stringify(pluginConfig)}`;\n } catch {\n throw new Error(\n `pluginConfig must be JSON-serializable for caching. Received non-serializable value.`,\n );\n }\n}\n\n// ========================================\n// Main API\n// ========================================\n\n/**\n * Get a generated type from a plugin by loading the config and resolving everything automatically.\n * For type-attached plugins, calls onTypeLoaded() with the sourceType.\n * For namespace plugins, calls onNamespaceLoaded() with auto-resolved namespace.\n * Results are cached per config path, plugin, namespace, and pluginConfig to avoid redundant processing.\n * @param configPath - Path to tailor.config.ts (absolute or relative to cwd)\n * @param pluginId - The plugin's unique identifier\n * @param sourceType - The source TailorDB type (null for namespace plugins)\n * @param kind - The generated type kind (e.g., \"request\", \"step\")\n * @returns The generated TailorDB type\n */\nexport async function getGeneratedType(\n configPath: string,\n pluginId: string,\n sourceType: TailorAnyDBType | null,\n kind: string,\n): Promise<TailorAnyDBType> {\n const cache = await loadAndCacheConfig(configPath);\n\n if (!cache) {\n // Config not available (e.g., running in bundled executor on platform server).\n // Return a placeholder. The actual type is resolved at generate/apply time.\n return { name: `__placeholder_${kind}__`, fields: {} } as TailorAnyDBType;\n }\n\n const { config, configDir, plugins } = cache;\n\n const pluginEntry = plugins.get(pluginId);\n if (!pluginEntry) {\n throw new Error(\n `Plugin \"${pluginId}\" not found in config at \"${configPath}\". ` +\n `Ensure the plugin is registered via definePlugins().`,\n );\n }\n\n const { plugin, pluginConfig } = pluginEntry;\n\n if (sourceType === null) {\n return getGeneratedTypeForNamespacePlugin(config, plugin, kind, pluginConfig);\n }\n\n const namespace = await resolveNamespaceForType(config, configDir, sourceType);\n return getGeneratedTypeForTypeAttachedPlugin(plugin, sourceType, kind, pluginConfig, namespace);\n}\n\n/**\n * Get a generated type from a type-attached plugin.\n * @param plugin - The plugin instance (must have onTypeLoaded() method)\n * @param sourceType - The source TailorDB type\n * @param kind - The generated type kind\n * @param pluginConfig - Plugin-level configuration\n * @param namespace - Resolved namespace\n * @returns The generated TailorDB type\n */\nasync function getGeneratedTypeForTypeAttachedPlugin(\n plugin: Plugin,\n sourceType: TailorAnyDBType,\n kind: string,\n pluginConfig: unknown,\n namespace: string,\n): Promise<TailorAnyDBType> {\n if (!plugin.onTypeLoaded) {\n throw new Error(`Plugin \"${plugin.id}\" does not have a onTypeLoaded() method`);\n }\n\n // Check cache first\n let pluginCache = processCache.get(plugin);\n if (!pluginCache) {\n pluginCache = new Map();\n processCache.set(plugin, pluginCache);\n }\n\n const cacheKey = getCacheKey(`${sourceType.name}:ns=${namespace}`, pluginConfig);\n let output = pluginCache.get(cacheKey);\n\n if (!output) {\n const typeConfig = sourceType.plugins.find((p) => p.pluginId === plugin.id)?.config;\n output = await plugin.onTypeLoaded({\n type: sourceType,\n typeConfig: typeConfig ?? {},\n pluginConfig,\n namespace,\n });\n pluginCache.set(cacheKey, output);\n }\n\n const generatedType = output.types?.[kind];\n if (!generatedType) {\n throw new Error(\n `Generated type not found: plugin=${plugin.id}, sourceType=${sourceType.name}, kind=${kind}`,\n );\n }\n\n return generatedType as TailorAnyDBType;\n}\n\n/**\n * Get a generated type from a namespace plugin.\n * Auto-resolves the namespace by trying each one.\n * @param config - App config with db namespace definitions\n * @param config.db - DB namespace definitions\n * @param plugin - The plugin instance (must have onNamespaceLoaded() method)\n * @param kind - The generated type kind\n * @param pluginConfig - Plugin-level configuration\n * @returns The generated TailorDB type\n */\nasync function getGeneratedTypeForNamespacePlugin(\n config: { db?: Record<string, unknown> },\n plugin: Plugin,\n kind: string,\n pluginConfig: unknown,\n): Promise<TailorAnyDBType> {\n if (!plugin.onNamespaceLoaded) {\n throw new Error(`Plugin \"${plugin.id}\" does not have a onNamespaceLoaded() method`);\n }\n\n // Check cache first - try all namespaces\n let pluginCache = namespaceProcessCache.get(plugin);\n if (!pluginCache) {\n pluginCache = new Map();\n namespaceProcessCache.set(plugin, pluginCache);\n }\n\n // Try cached results first\n if (config.db) {\n for (const namespace of Object.keys(config.db)) {\n const dbConfig = config.db[namespace] as DbNamespaceConfig;\n if (dbConfig.external) continue;\n\n const cacheKey = getCacheKey(`namespace:ns=${namespace}`, pluginConfig);\n const cached = pluginCache.get(cacheKey);\n if (cached?.types?.[kind]) {\n return cached.types[kind] as TailorAnyDBType;\n }\n }\n }\n\n // Not in cache - resolve namespace and process\n const { namespace, output } = await resolveNamespaceForNamespacePlugin(\n config,\n plugin,\n kind,\n pluginConfig,\n );\n\n const cacheKey = getCacheKey(`namespace:ns=${namespace}`, pluginConfig);\n pluginCache.set(cacheKey, output);\n\n const generatedType = output.types?.[kind];\n if (!generatedType) {\n throw new Error(`Generated type not found: plugin=${plugin.id}, kind=${kind}`);\n }\n\n return generatedType as TailorAnyDBType;\n}\n\n/**\n * Clear all internal caches. For testing only.\n */\nexport function _clearCacheForTesting(): void {\n configCacheMap.clear();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/plugin/with-context.ts","../../src/plugin/get-generated-type.ts"],"sourcesContent":["/**\n * Plugin executor context support for defining plugin executors in separate files.\n * This module provides utilities for creating type-safe plugin executors that receive\n * context (like type references and namespace) at runtime.\n */\n\nimport type { TailorEnv, TailorPrincipal } from \"#/runtime/types\";\n\n/**\n * Plugin executor factory function type.\n * Takes context and returns an executor configuration.\n * Returns unknown since the exact return type depends on createExecutor's generic params.\n */\nexport type PluginExecutorFactory<Ctx> = (ctx: Ctx) => unknown;\n\n// ============================================================================\n// Plugin Executor Args Types\n// ============================================================================\n\n/**\n * Base args for plugin executor function operations.\n * Provides typed access to runtime context without requiring specific record types.\n */\nexport interface PluginFunctionArgs {\n /** Workspace ID where the executor runs */\n workspaceId: string;\n /** Application namespace */\n appNamespace: string;\n /** Environment variables */\n env: TailorEnv;\n /** Principal that triggered the event, null for system events */\n actor: TailorPrincipal | null;\n /** Name of the TailorDB type */\n typeName: string;\n /** TailorDB connections by namespace */\n tailordb: Record<string, unknown>;\n}\n\n/**\n * Args for plugin executors triggered on record creation.\n */\nexport interface PluginRecordCreatedArgs extends PluginFunctionArgs {\n /** The newly created record */\n newRecord: Record<string, unknown>;\n}\n\n/**\n * Args for plugin executors triggered on record update.\n */\nexport interface PluginRecordUpdatedArgs extends PluginFunctionArgs {\n /** The record after update */\n newRecord: Record<string, unknown>;\n /** The record before update */\n oldRecord: Record<string, unknown>;\n}\n\n/**\n * Args for plugin executors triggered on record deletion.\n */\nexport interface PluginRecordDeletedArgs extends PluginFunctionArgs {\n /** The deleted record */\n oldRecord: Record<string, unknown>;\n}\n\n/**\n * Database schema type for plugins.\n * Since plugins work with dynamic types, the schema uses Record types.\n */\nexport type PluginDBSchema = Record<string, Record<string, unknown>>;\n\n/**\n * Base record type for TailorDB records.\n * All records have an id field.\n */\nexport type PluginRecord = { id: string } & Record<string, unknown>;\n\n/**\n * Define a plugin executor that receives context at runtime.\n * This allows executor definitions to be in separate files while\n * still receiving dynamic values like typeName, generated types, and namespace.\n * @param factory - Function that takes context and returns executor configuration\n * @returns The same factory function (for type inference)\n * @example\n * ```typescript\n * // executors/on-create.ts\n * import { withPluginContext } from \"@tailor-platform/sdk/plugin\";\n * import { createExecutor, recordCreatedTrigger } from \"@tailor-platform/sdk\";\n * import { getDB } from \"@tailor-platform/function-kysely-tailordb\";\n *\n * interface MyContext {\n * sourceType: TailorAnyDBType;\n * historyType: TailorAnyDBType;\n * namespace: string;\n * }\n *\n * export default withPluginContext<MyContext>((ctx) =>\n * createExecutor({\n * name: `${ctx.sourceType.name.toLowerCase()}-on-create`,\n * trigger: recordCreatedTrigger({ type: ctx.sourceType }),\n * operation: {\n * kind: \"function\",\n * body: async (args) => {\n * const db = getDB(ctx.namespace);\n * await db.insertInto(ctx.historyType.name).values({\n * recordId: args.newRecord.id,\n * // ...\n * }).execute();\n * },\n * },\n * })\n * );\n * ```\n */\nexport function withPluginContext<Ctx>(\n factory: PluginExecutorFactory<Ctx>,\n): PluginExecutorFactory<Ctx> {\n return factory;\n}\n","import * as fs from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport * as path from \"pathe\";\nimport type { TailorAnyDBType } from \"#/configure/services/tailordb/types\";\nimport type { Plugin, PluginOutput, TypePluginOutput } from \"#/plugin/types\";\n\n// ========================================\n// Config loading and caching\n// ========================================\n\ninterface PluginEntry {\n plugin: Plugin;\n pluginConfig: unknown;\n}\n\ninterface ConfigCache {\n config: { db?: Record<string, unknown> };\n plugins: Map<string, PluginEntry>;\n configDir: string;\n}\n\n/** Cache: resolved config path -> loaded config data */\nconst configCacheMap = new Map<string, ConfigCache>();\n\n/**\n * Check if a value is a Plugin instance.\n * @param value - Value to check\n * @returns True if value has the shape of Plugin\n */\nfunction isPlugin(value: unknown): value is Plugin {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Record<string, unknown>).id === \"string\" &&\n typeof (value as Record<string, unknown>).description === \"string\"\n );\n}\n\n/**\n * Load and cache config module from the given path.\n * Extracts plugins from all array exports using definePlugins() format.\n * Returns null if the config file does not exist (e.g., in bundled executor on platform server).\n * @param configPath - Absolute or relative path to tailor.config.ts\n * @returns Cached config data with plugins map, or null if config file is not available\n */\nasync function loadAndCacheConfig(configPath: string): Promise<ConfigCache | null> {\n const resolvedPath = path.resolve(configPath);\n\n const cached = configCacheMap.get(resolvedPath);\n if (cached) return cached;\n\n // Config file may not exist in bundled environments (e.g., platform server)\n if (!fs.existsSync(resolvedPath)) {\n return null;\n }\n\n const configModule = await import(pathToFileURL(resolvedPath).href);\n if (!configModule?.default) {\n throw new Error(`Invalid config module at \"${resolvedPath}\": default export not found`);\n }\n\n const config = configModule.default as { db?: Record<string, unknown> };\n const configDir = path.dirname(resolvedPath);\n const plugins = new Map<string, PluginEntry>();\n\n // Find plugin arrays from exports (definePlugins returns PluginConfig[])\n for (const value of Object.values(configModule)) {\n if (!Array.isArray(value)) continue;\n\n for (const item of value) {\n if (isPlugin(item)) {\n plugins.set(item.id, { plugin: item, pluginConfig: item.pluginConfig });\n }\n }\n }\n\n const result: ConfigCache = { config, plugins, configDir };\n configCacheMap.set(resolvedPath, result);\n return result;\n}\n\n// ========================================\n// Namespace resolution\n// ========================================\n\ninterface DbNamespaceConfig {\n files?: string[];\n external?: boolean;\n}\n\n/**\n * Resolve the namespace for a type-attached sourceType by checking config.db file patterns.\n * Uses ESM module cache identity: same file path yields same object references.\n * @param config - App config with db namespace definitions\n * @param config.db - DB namespace definitions\n * @param configDir - Directory containing the config file\n * @param sourceType - The TailorDB type to look up\n * @returns The namespace name\n */\nasync function resolveNamespaceForType(\n config: { db?: Record<string, unknown> },\n configDir: string,\n sourceType: TailorAnyDBType,\n): Promise<string> {\n if (!config.db) {\n throw new Error(`No db configuration found in config`);\n }\n\n for (const [namespace, nsConfig] of Object.entries(config.db)) {\n const dbConfig = nsConfig as DbNamespaceConfig;\n // Skip external namespaces (no files to resolve)\n if (dbConfig.external || !dbConfig.files) continue;\n\n for (const pattern of dbConfig.files) {\n const absolutePattern = path.resolve(configDir, pattern);\n let matchedFiles: string[];\n try {\n matchedFiles = fs.globSync(absolutePattern);\n } catch {\n continue;\n }\n\n for (const file of matchedFiles) {\n const mod = await import(pathToFileURL(file).href);\n for (const exported of Object.values(mod)) {\n if (exported === sourceType) {\n return namespace;\n }\n }\n }\n }\n }\n\n throw new Error(\n `Could not resolve namespace for type \"${sourceType.name}\". ` +\n `Ensure the type file is included in a db namespace's files pattern.`,\n );\n}\n\n/**\n * Resolve the namespace for a namespace plugin by trying each namespace.\n * Calls onNamespaceLoaded() for each and returns the first whose output contains the requested kind.\n * @param config - App config with db namespace definitions\n * @param config.db - DB namespace definitions\n * @param plugin - Plugin instance\n * @param kind - The generated type kind to look for\n * @param pluginConfig - Plugin-level configuration\n * @returns The namespace name\n */\nasync function resolveNamespaceForNamespacePlugin(\n config: { db?: Record<string, unknown> },\n plugin: Plugin,\n kind: string,\n pluginConfig: unknown,\n): Promise<{ namespace: string; output: PluginOutput }> {\n if (!config.db) {\n throw new Error(`No db configuration found in config`);\n }\n\n if (!plugin.onNamespaceLoaded) {\n throw new Error(`Plugin \"${plugin.id}\" does not have a onNamespaceLoaded() method`);\n }\n\n for (const namespace of Object.keys(config.db)) {\n const dbConfig = config.db[namespace] as DbNamespaceConfig;\n if (dbConfig.external) continue;\n\n const output = await plugin.onNamespaceLoaded({\n pluginConfig,\n namespace,\n });\n\n if (output.types?.[kind]) {\n return { namespace, output };\n }\n }\n\n throw new Error(\n `Could not resolve namespace for plugin \"${plugin.id}\" with kind \"${kind}\". ` +\n `No namespace produced a type with that kind.`,\n );\n}\n\n// ========================================\n// Process caching\n// ========================================\n\n// Cache: plugin -> cacheKey -> TypePluginOutput\nconst processCache = new WeakMap<Plugin, Map<string, TypePluginOutput>>();\n\n// Cache for namespace plugins: plugin -> cacheKey -> PluginOutput\nconst namespaceProcessCache = new WeakMap<Plugin, Map<string, PluginOutput>>();\n\n/**\n * Generate a cache key that includes pluginConfig.\n * @param baseKey - Base key for the cache\n * @param pluginConfig - Plugin configuration to include in the key\n * @returns Cache key string\n */\nfunction getCacheKey(baseKey: string, pluginConfig: unknown): string {\n if (pluginConfig === undefined) {\n return baseKey;\n }\n try {\n return `${baseKey}:${JSON.stringify(pluginConfig)}`;\n } catch {\n throw new Error(\n `pluginConfig must be JSON-serializable for caching. Received non-serializable value.`,\n );\n }\n}\n\n// ========================================\n// Main API\n// ========================================\n\n/**\n * Get a generated type from a plugin by loading the config and resolving everything automatically.\n * For type-attached plugins, calls onTypeLoaded() with the sourceType.\n * For namespace plugins, calls onNamespaceLoaded() with auto-resolved namespace.\n * Results are cached per config path, plugin, namespace, and pluginConfig to avoid redundant processing.\n * @param configPath - Path to tailor.config.ts (absolute or relative to cwd)\n * @param pluginId - The plugin's unique identifier\n * @param sourceType - The source TailorDB type (null for namespace plugins)\n * @param kind - The generated type kind (e.g., \"request\", \"step\")\n * @returns The generated TailorDB type\n */\nexport async function getGeneratedType(\n configPath: string,\n pluginId: string,\n sourceType: TailorAnyDBType | null,\n kind: string,\n): Promise<TailorAnyDBType> {\n const cache = await loadAndCacheConfig(configPath);\n\n if (!cache) {\n // Config not available (e.g., running in bundled executor on platform server).\n // Return a placeholder. The actual type is resolved at generate/apply time.\n return { name: `__placeholder_${kind}__`, fields: {} } as TailorAnyDBType;\n }\n\n const { config, configDir, plugins } = cache;\n\n const pluginEntry = plugins.get(pluginId);\n if (!pluginEntry) {\n throw new Error(\n `Plugin \"${pluginId}\" not found in config at \"${configPath}\". ` +\n `Ensure the plugin is registered via definePlugins().`,\n );\n }\n\n const { plugin, pluginConfig } = pluginEntry;\n\n if (sourceType === null) {\n return getGeneratedTypeForNamespacePlugin(config, plugin, kind, pluginConfig);\n }\n\n const namespace = await resolveNamespaceForType(config, configDir, sourceType);\n return getGeneratedTypeForTypeAttachedPlugin(plugin, sourceType, kind, pluginConfig, namespace);\n}\n\n/**\n * Get a generated type from a type-attached plugin.\n * @param plugin - The plugin instance (must have onTypeLoaded() method)\n * @param sourceType - The source TailorDB type\n * @param kind - The generated type kind\n * @param pluginConfig - Plugin-level configuration\n * @param namespace - Resolved namespace\n * @returns The generated TailorDB type\n */\nasync function getGeneratedTypeForTypeAttachedPlugin(\n plugin: Plugin,\n sourceType: TailorAnyDBType,\n kind: string,\n pluginConfig: unknown,\n namespace: string,\n): Promise<TailorAnyDBType> {\n if (!plugin.onTypeLoaded) {\n throw new Error(`Plugin \"${plugin.id}\" does not have a onTypeLoaded() method`);\n }\n\n // Check cache first\n let pluginCache = processCache.get(plugin);\n if (!pluginCache) {\n pluginCache = new Map();\n processCache.set(plugin, pluginCache);\n }\n\n const cacheKey = getCacheKey(`${sourceType.name}:ns=${namespace}`, pluginConfig);\n let output = pluginCache.get(cacheKey);\n\n if (!output) {\n const typeConfig = sourceType.plugins.find((p) => p.pluginId === plugin.id)?.config;\n output = await plugin.onTypeLoaded({\n type: sourceType,\n typeConfig: typeConfig ?? {},\n pluginConfig,\n namespace,\n });\n pluginCache.set(cacheKey, output);\n }\n\n const generatedType = output.types?.[kind];\n if (!generatedType) {\n throw new Error(\n `Generated type not found: plugin=${plugin.id}, sourceType=${sourceType.name}, kind=${kind}`,\n );\n }\n\n return generatedType as TailorAnyDBType;\n}\n\n/**\n * Get a generated type from a namespace plugin.\n * Auto-resolves the namespace by trying each one.\n * @param config - App config with db namespace definitions\n * @param config.db - DB namespace definitions\n * @param plugin - The plugin instance (must have onNamespaceLoaded() method)\n * @param kind - The generated type kind\n * @param pluginConfig - Plugin-level configuration\n * @returns The generated TailorDB type\n */\nasync function getGeneratedTypeForNamespacePlugin(\n config: { db?: Record<string, unknown> },\n plugin: Plugin,\n kind: string,\n pluginConfig: unknown,\n): Promise<TailorAnyDBType> {\n if (!plugin.onNamespaceLoaded) {\n throw new Error(`Plugin \"${plugin.id}\" does not have a onNamespaceLoaded() method`);\n }\n\n // Check cache first - try all namespaces\n let pluginCache = namespaceProcessCache.get(plugin);\n if (!pluginCache) {\n pluginCache = new Map();\n namespaceProcessCache.set(plugin, pluginCache);\n }\n\n // Try cached results first\n if (config.db) {\n for (const namespace of Object.keys(config.db)) {\n const dbConfig = config.db[namespace] as DbNamespaceConfig;\n if (dbConfig.external) continue;\n\n const cacheKey = getCacheKey(`namespace:ns=${namespace}`, pluginConfig);\n const cached = pluginCache.get(cacheKey);\n if (cached?.types?.[kind]) {\n return cached.types[kind] as TailorAnyDBType;\n }\n }\n }\n\n // Not in cache - resolve namespace and process\n const { namespace, output } = await resolveNamespaceForNamespacePlugin(\n config,\n plugin,\n kind,\n pluginConfig,\n );\n\n const cacheKey = getCacheKey(`namespace:ns=${namespace}`, pluginConfig);\n pluginCache.set(cacheKey, output);\n\n const generatedType = output.types?.[kind];\n if (!generatedType) {\n throw new Error(`Generated type not found: plugin=${plugin.id}, kind=${kind}`);\n }\n\n return generatedType as TailorAnyDBType;\n}\n\n/**\n * Clear all internal caches. For testing only.\n */\nexport function _clearCacheForTesting(): void {\n configCacheMap.clear();\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,243 @@
1
+ import { PluginAttachment, TailorAnyDBField, TailorAnyDBType } from "../configure/services/tailordb/types.mjs";
2
+ import { IdProvider, OAuth2Client } from "../types/auth.generated.mjs";
3
+ import { TailorDBType, TypeSourceInfoEntry } from "../parser/service/tailordb/types.mjs";
4
+ import { Executor } from "../types/executor.generated.mjs";
5
+ import { Resolver } from "../types/resolver.generated.mjs";
6
+
7
+ //#region src/plugin/types.d.ts
8
+ /**
9
+ * A single generated file to write to disk.
10
+ */
11
+ interface GeneratedFile {
12
+ path: string;
13
+ content: string;
14
+ skipIfExists?: boolean;
15
+ executable?: boolean;
16
+ }
17
+ /**
18
+ * Result returned by generation-time hooks.
19
+ */
20
+ interface GeneratorResult {
21
+ files: GeneratedFile[];
22
+ errors?: string[];
23
+ }
24
+ /**
25
+ * Auth configuration available to generation-time hooks.
26
+ */
27
+ interface GeneratorAuthInput {
28
+ name: string;
29
+ userProfile?: {
30
+ typeName: string;
31
+ namespace: string;
32
+ usernameField: string;
33
+ };
34
+ machineUsers?: Record<string, {
35
+ attributes?: Record<string, unknown>;
36
+ }>;
37
+ oauth2Clients?: Record<string, OAuth2Client>;
38
+ idProvider?: IdProvider;
39
+ }
40
+ /**
41
+ * Namespace-level TailorDB data available to generation-time hooks.
42
+ */
43
+ interface TailorDBNamespaceData {
44
+ /** Namespace name */
45
+ namespace: string;
46
+ /** All TailorDB types in this namespace, keyed by type name */
47
+ types: Record<string, TailorDBType>;
48
+ /** Source info for each type (file path, export name, plugin info) */
49
+ sourceInfo: ReadonlyMap<string, TypeSourceInfoEntry>;
50
+ /** Plugin attachments configured on each type via .plugin() method */
51
+ pluginAttachments: ReadonlyMap<string, readonly PluginAttachment[]>;
52
+ }
53
+ /**
54
+ * Namespace-level resolver data available to generation-time hooks.
55
+ */
56
+ interface ResolverNamespaceData {
57
+ /** Namespace name */
58
+ namespace: string;
59
+ /** All resolvers in this namespace, keyed by resolver name */
60
+ resolvers: Record<string, Resolver>;
61
+ }
62
+ /**
63
+ * Context passed to plugin's onTailorDBReady hook.
64
+ * @template PluginConfig - Plugin-level configuration type
65
+ */
66
+ interface TailorDBReadyContext<PluginConfig = unknown> {
67
+ /** All TailorDB namespaces with their types and metadata */
68
+ tailordb: TailorDBNamespaceData[];
69
+ /** Auth configuration */
70
+ auth?: GeneratorAuthInput;
71
+ /** Base directory for generated files */
72
+ baseDir: string;
73
+ /** Path to tailor.config.ts */
74
+ configPath: string;
75
+ /** Plugin-level configuration passed via definePlugins() */
76
+ pluginConfig: PluginConfig;
77
+ }
78
+ /**
79
+ * Context passed to plugin's onResolverReady hook.
80
+ * @template PluginConfig - Plugin-level configuration type
81
+ */
82
+ interface ResolverReadyContext<PluginConfig = unknown> {
83
+ /** All TailorDB namespaces with their types and metadata */
84
+ tailordb: TailorDBNamespaceData[];
85
+ /** All resolver namespaces with their resolvers */
86
+ resolvers: ResolverNamespaceData[];
87
+ /** Auth configuration */
88
+ auth?: GeneratorAuthInput;
89
+ /** Base directory for generated files */
90
+ baseDir: string;
91
+ /** Path to tailor.config.ts */
92
+ configPath: string;
93
+ /** Plugin-level configuration passed via definePlugins() */
94
+ pluginConfig: PluginConfig;
95
+ }
96
+ /**
97
+ * Context passed to plugin's onExecutorReady hook.
98
+ * @template PluginConfig - Plugin-level configuration type
99
+ */
100
+ interface ExecutorReadyContext<PluginConfig = unknown> {
101
+ /** All TailorDB namespaces with their types and metadata */
102
+ tailordb: TailorDBNamespaceData[];
103
+ /** All resolver namespaces with their resolvers */
104
+ resolvers: ResolverNamespaceData[];
105
+ /** All executors, keyed by executor name */
106
+ executors: Record<string, Executor>;
107
+ /** Auth configuration */
108
+ auth?: GeneratorAuthInput;
109
+ /** Base directory for generated files */
110
+ baseDir: string;
111
+ /** Path to tailor.config.ts */
112
+ configPath: string;
113
+ /** Plugin-level configuration passed via definePlugins() */
114
+ pluginConfig: PluginConfig;
115
+ }
116
+ type TypeConfigRequired<PluginConfig = unknown> = boolean | ((pluginConfig: PluginConfig | undefined) => boolean);
117
+ /**
118
+ * Interface for plugin configuration mapping.
119
+ * Extend this interface via declaration merging to add typed plugin configs.
120
+ */
121
+ interface PluginConfigs<Fields extends string = string> {}
122
+ /**
123
+ * Context passed to plugin's process method
124
+ */
125
+ interface PluginProcessContext<TypeConfig = unknown, PluginConfig = unknown> {
126
+ type: TailorAnyDBType;
127
+ typeConfig: TypeConfig;
128
+ pluginConfig: PluginConfig;
129
+ namespace: string;
130
+ }
131
+ /**
132
+ * Context passed to plugin's onNamespaceLoaded hook.
133
+ */
134
+ interface PluginNamespaceProcessContext<PluginConfig = unknown> {
135
+ pluginConfig: PluginConfig;
136
+ namespace: string;
137
+ }
138
+ /**
139
+ * Interface representing a TailorDB type for plugin output.
140
+ */
141
+ interface TailorDBTypeForPlugin {
142
+ readonly name: string;
143
+ readonly fields: Record<string, unknown>;
144
+ }
145
+ type PluginGeneratedType = TailorDBTypeForPlugin;
146
+ type PluginGeneratedTypes = Record<string, PluginGeneratedType>;
147
+ interface PluginGeneratedResolver {
148
+ name: string;
149
+ operation: "query" | "mutation";
150
+ inputFields?: Record<string, unknown>;
151
+ outputFields: Record<string, unknown>;
152
+ body: string;
153
+ }
154
+ interface PluginRecordTriggerConfig {
155
+ kind: "tailordb";
156
+ events: ("tailordb.type_record.created" | "tailordb.type_record.updated" | "tailordb.type_record.deleted")[];
157
+ typeName: string;
158
+ }
159
+ interface PluginScheduleTriggerConfig {
160
+ kind: "schedule";
161
+ cron: string;
162
+ timezone?: string;
163
+ }
164
+ interface PluginIncomingWebhookTriggerConfig {
165
+ kind: "incomingWebhook";
166
+ }
167
+ type PluginTriggerConfig = PluginRecordTriggerConfig | PluginScheduleTriggerConfig | PluginIncomingWebhookTriggerConfig;
168
+ type PluginInjectValue = string | number | boolean | null;
169
+ type PluginInjectMap = Record<string, PluginInjectValue>;
170
+ interface PluginFunctionOperationConfig {
171
+ kind: "function";
172
+ body: string;
173
+ inject?: PluginInjectMap;
174
+ }
175
+ interface PluginGraphQLOperationConfig {
176
+ kind: "graphql";
177
+ query: string;
178
+ appName?: string;
179
+ variables?: string;
180
+ }
181
+ interface PluginWebhookOperationConfig {
182
+ kind: "webhook";
183
+ url: string;
184
+ }
185
+ interface PluginWorkflowOperationConfig {
186
+ kind: "workflow";
187
+ workflowName: string;
188
+ }
189
+ type PluginOperationConfig = PluginFunctionOperationConfig | PluginGraphQLOperationConfig | PluginWebhookOperationConfig | PluginWorkflowOperationConfig;
190
+ type PluginExecutorContextValue = TailorAnyDBType | string | number | boolean | null | undefined;
191
+ interface PluginExecutorContextBase {
192
+ sourceType: TailorAnyDBType | null;
193
+ namespace: string;
194
+ }
195
+ type PluginExecutorContext = PluginExecutorContextBase & {
196
+ [key: string]: PluginExecutorContextValue;
197
+ };
198
+ interface PluginExecutorModule {
199
+ default: unknown;
200
+ }
201
+ interface PluginGeneratedExecutorWithFile<Ctx = PluginExecutorContext> {
202
+ name: string;
203
+ resolve: () => Promise<PluginExecutorModule>;
204
+ context: Ctx;
205
+ }
206
+ interface PluginGeneratedExecutorLegacy {
207
+ name: string;
208
+ description?: string;
209
+ trigger: PluginTriggerConfig;
210
+ operation: PluginOperationConfig;
211
+ }
212
+ type PluginGeneratedExecutor = PluginGeneratedExecutorWithFile | PluginGeneratedExecutorLegacy;
213
+ interface PluginExtends {
214
+ fields?: Record<string, TailorAnyDBField>;
215
+ }
216
+ interface PluginOutput {
217
+ types?: PluginGeneratedTypes;
218
+ resolvers?: PluginGeneratedResolver[];
219
+ executors?: PluginGeneratedExecutor[];
220
+ }
221
+ interface TypePluginOutput extends PluginOutput {
222
+ extends?: PluginExtends;
223
+ }
224
+ type NamespacePluginOutput = PluginOutput;
225
+ /**
226
+ * Plugin interface that all plugins must implement.
227
+ * @template TypeConfig - Type for per-type configuration passed via .plugin() method
228
+ * @template PluginConfig - Type for plugin-level configuration passed via definePlugins()
229
+ */
230
+ interface Plugin<TypeConfig = unknown, PluginConfig = unknown> {
231
+ readonly id: string;
232
+ readonly description: string;
233
+ readonly importPath?: string;
234
+ readonly typeConfigRequired?: TypeConfigRequired<PluginConfig>;
235
+ readonly pluginConfig?: PluginConfig;
236
+ onTypeLoaded?(context: PluginProcessContext<TypeConfig, PluginConfig>): TypePluginOutput | Promise<TypePluginOutput>;
237
+ onNamespaceLoaded?(context: PluginNamespaceProcessContext<PluginConfig>): NamespacePluginOutput | Promise<NamespacePluginOutput>;
238
+ onTailorDBReady?(context: TailorDBReadyContext<PluginConfig>): GeneratorResult | Promise<GeneratorResult>;
239
+ onResolverReady?(context: ResolverReadyContext<PluginConfig>): GeneratorResult | Promise<GeneratorResult>;
240
+ onExecutorReady?(context: ExecutorReadyContext<PluginConfig>): GeneratorResult | Promise<GeneratorResult>;
241
+ }
242
+ //#endregion
243
+ export { ExecutorReadyContext, GeneratedFile, GeneratorAuthInput, GeneratorResult, NamespacePluginOutput, Plugin, type PluginAttachment, PluginConfigs, PluginExecutorContext, PluginExecutorContextBase, PluginExecutorContextValue, PluginExecutorModule, PluginExtends, PluginFunctionOperationConfig, PluginGeneratedExecutor, PluginGeneratedExecutorLegacy, PluginGeneratedExecutorWithFile, PluginGeneratedResolver, PluginGeneratedType, PluginGeneratedTypes, PluginGraphQLOperationConfig, PluginIncomingWebhookTriggerConfig, PluginInjectMap, PluginInjectValue, PluginNamespaceProcessContext, PluginOperationConfig, PluginOutput, PluginProcessContext, PluginRecordTriggerConfig, PluginScheduleTriggerConfig, PluginTriggerConfig, PluginWebhookOperationConfig, PluginWorkflowOperationConfig, ResolverNamespaceData, ResolverReadyContext, TailorDBNamespaceData, TailorDBReadyContext, TailorDBTypeForPlugin, TypeConfigRequired, TypePluginOutput };
@@ -0,0 +1,102 @@
1
+ import { TailorEnv, TailorPrincipal } from "../runtime/types.mjs";
2
+
3
+ //#region src/plugin/with-context.d.ts
4
+ /**
5
+ * Plugin executor factory function type.
6
+ * Takes context and returns an executor configuration.
7
+ * Returns unknown since the exact return type depends on createExecutor's generic params.
8
+ */
9
+ type PluginExecutorFactory<Ctx> = (ctx: Ctx) => unknown;
10
+ /**
11
+ * Base args for plugin executor function operations.
12
+ * Provides typed access to runtime context without requiring specific record types.
13
+ */
14
+ interface PluginFunctionArgs {
15
+ /** Workspace ID where the executor runs */
16
+ workspaceId: string;
17
+ /** Application namespace */
18
+ appNamespace: string;
19
+ /** Environment variables */
20
+ env: TailorEnv;
21
+ /** Principal that triggered the event, null for system events */
22
+ actor: TailorPrincipal | null;
23
+ /** Name of the TailorDB type */
24
+ typeName: string;
25
+ /** TailorDB connections by namespace */
26
+ tailordb: Record<string, unknown>;
27
+ }
28
+ /**
29
+ * Args for plugin executors triggered on record creation.
30
+ */
31
+ interface PluginRecordCreatedArgs extends PluginFunctionArgs {
32
+ /** The newly created record */
33
+ newRecord: Record<string, unknown>;
34
+ }
35
+ /**
36
+ * Args for plugin executors triggered on record update.
37
+ */
38
+ interface PluginRecordUpdatedArgs extends PluginFunctionArgs {
39
+ /** The record after update */
40
+ newRecord: Record<string, unknown>;
41
+ /** The record before update */
42
+ oldRecord: Record<string, unknown>;
43
+ }
44
+ /**
45
+ * Args for plugin executors triggered on record deletion.
46
+ */
47
+ interface PluginRecordDeletedArgs extends PluginFunctionArgs {
48
+ /** The deleted record */
49
+ oldRecord: Record<string, unknown>;
50
+ }
51
+ /**
52
+ * Database schema type for plugins.
53
+ * Since plugins work with dynamic types, the schema uses Record types.
54
+ */
55
+ type PluginDBSchema = Record<string, Record<string, unknown>>;
56
+ /**
57
+ * Base record type for TailorDB records.
58
+ * All records have an id field.
59
+ */
60
+ type PluginRecord = {
61
+ id: string;
62
+ } & Record<string, unknown>;
63
+ /**
64
+ * Define a plugin executor that receives context at runtime.
65
+ * This allows executor definitions to be in separate files while
66
+ * still receiving dynamic values like typeName, generated types, and namespace.
67
+ * @param factory - Function that takes context and returns executor configuration
68
+ * @returns The same factory function (for type inference)
69
+ * @example
70
+ * ```typescript
71
+ * // executors/on-create.ts
72
+ * import { withPluginContext } from "@tailor-platform/sdk/plugin";
73
+ * import { createExecutor, recordCreatedTrigger } from "@tailor-platform/sdk";
74
+ * import { getDB } from "@tailor-platform/function-kysely-tailordb";
75
+ *
76
+ * interface MyContext {
77
+ * sourceType: TailorAnyDBType;
78
+ * historyType: TailorAnyDBType;
79
+ * namespace: string;
80
+ * }
81
+ *
82
+ * export default withPluginContext<MyContext>((ctx) =>
83
+ * createExecutor({
84
+ * name: `${ctx.sourceType.name.toLowerCase()}-on-create`,
85
+ * trigger: recordCreatedTrigger({ type: ctx.sourceType }),
86
+ * operation: {
87
+ * kind: "function",
88
+ * body: async (args) => {
89
+ * const db = getDB(ctx.namespace);
90
+ * await db.insertInto(ctx.historyType.name).values({
91
+ * recordId: args.newRecord.id,
92
+ * // ...
93
+ * }).execute();
94
+ * },
95
+ * },
96
+ * })
97
+ * );
98
+ * ```
99
+ */
100
+ declare function withPluginContext<Ctx>(factory: PluginExecutorFactory<Ctx>): PluginExecutorFactory<Ctx>;
101
+ //#endregion
102
+ export { PluginDBSchema, PluginExecutorFactory, PluginFunctionArgs, PluginRecord, PluginRecordCreatedArgs, PluginRecordDeletedArgs, PluginRecordUpdatedArgs, withPluginContext };