@shipfox/api-definitions 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/.turbo/turbo-build.log +2 -0
  2. package/.turbo/turbo-type$colon$emit.log +1 -0
  3. package/.turbo/turbo-type.log +1 -0
  4. package/CHANGELOG.md +215 -0
  5. package/LICENSE +21 -0
  6. package/dist/config.d.ts +10 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +35 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/core/entities/index.d.ts +5 -0
  11. package/dist/core/entities/index.d.ts.map +1 -0
  12. package/dist/core/entities/index.js +6 -0
  13. package/dist/core/entities/index.js.map +1 -0
  14. package/dist/core/entities/integration-context.d.ts +11 -0
  15. package/dist/core/entities/integration-context.d.ts.map +1 -0
  16. package/dist/core/entities/integration-context.js +3 -0
  17. package/dist/core/entities/integration-context.js.map +1 -0
  18. package/dist/core/entities/sync-state.d.ts +19 -0
  19. package/dist/core/entities/sync-state.d.ts.map +1 -0
  20. package/dist/core/entities/sync-state.js +20 -0
  21. package/dist/core/entities/sync-state.js.map +1 -0
  22. package/dist/core/entities/workflow-definition.d.ts +35 -0
  23. package/dist/core/entities/workflow-definition.d.ts.map +1 -0
  24. package/dist/core/entities/workflow-definition.js +3 -0
  25. package/dist/core/entities/workflow-definition.js.map +1 -0
  26. package/dist/core/entities/workflow-model.d.ts +138 -0
  27. package/dist/core/entities/workflow-model.d.ts.map +1 -0
  28. package/dist/core/entities/workflow-model.js +3 -0
  29. package/dist/core/entities/workflow-model.js.map +1 -0
  30. package/dist/core/errors.d.ts +10 -0
  31. package/dist/core/errors.d.ts.map +1 -0
  32. package/dist/core/errors.js +14 -0
  33. package/dist/core/errors.js.map +1 -0
  34. package/dist/core/has-agent-step-integrations.d.ts +3 -0
  35. package/dist/core/has-agent-step-integrations.d.ts.map +1 -0
  36. package/dist/core/has-agent-step-integrations.js +5 -0
  37. package/dist/core/has-agent-step-integrations.js.map +1 -0
  38. package/dist/core/index.d.ts +9 -0
  39. package/dist/core/index.d.ts.map +1 -0
  40. package/dist/core/index.js +9 -0
  41. package/dist/core/index.js.map +1 -0
  42. package/dist/core/parse-definition.d.ts +9 -0
  43. package/dist/core/parse-definition.d.ts.map +1 -0
  44. package/dist/core/parse-definition.js +17 -0
  45. package/dist/core/parse-definition.js.map +1 -0
  46. package/dist/core/sync-definitions.d.ts +44 -0
  47. package/dist/core/sync-definitions.d.ts.map +1 -0
  48. package/dist/core/sync-definitions.js +140 -0
  49. package/dist/core/sync-definitions.js.map +1 -0
  50. package/dist/core/validate-definition.d.ts +20 -0
  51. package/dist/core/validate-definition.d.ts.map +1 -0
  52. package/dist/core/validate-definition.js +61 -0
  53. package/dist/core/validate-definition.js.map +1 -0
  54. package/dist/core/workflow-model/constants.d.ts +2 -0
  55. package/dist/core/workflow-model/constants.d.ts.map +1 -0
  56. package/dist/core/workflow-model/constants.js +3 -0
  57. package/dist/core/workflow-model/constants.js.map +1 -0
  58. package/dist/core/workflow-model/cron-trigger.d.ts +16 -0
  59. package/dist/core/workflow-model/cron-trigger.d.ts.map +1 -0
  60. package/dist/core/workflow-model/cron-trigger.js +85 -0
  61. package/dist/core/workflow-model/cron-trigger.js.map +1 -0
  62. package/dist/core/workflow-model/index.d.ts +4 -0
  63. package/dist/core/workflow-model/index.d.ts.map +1 -0
  64. package/dist/core/workflow-model/index.js +5 -0
  65. package/dist/core/workflow-model/index.js.map +1 -0
  66. package/dist/core/workflow-model/invalid-workflow-model-error.d.ts +15 -0
  67. package/dist/core/workflow-model/invalid-workflow-model-error.d.ts.map +1 -0
  68. package/dist/core/workflow-model/invalid-workflow-model-error.js +9 -0
  69. package/dist/core/workflow-model/invalid-workflow-model-error.js.map +1 -0
  70. package/dist/core/workflow-model/map-job-ids.d.ts +4 -0
  71. package/dist/core/workflow-model/map-job-ids.d.ts.map +1 -0
  72. package/dist/core/workflow-model/map-job-ids.js +33 -0
  73. package/dist/core/workflow-model/map-job-ids.js.map +1 -0
  74. package/dist/core/workflow-model/normalize-agent-integrations.d.ts +12 -0
  75. package/dist/core/workflow-model/normalize-agent-integrations.d.ts.map +1 -0
  76. package/dist/core/workflow-model/normalize-agent-integrations.js +157 -0
  77. package/dist/core/workflow-model/normalize-agent-integrations.js.map +1 -0
  78. package/dist/core/workflow-model/normalize-dependencies.d.ts +6 -0
  79. package/dist/core/workflow-model/normalize-dependencies.d.ts.map +1 -0
  80. package/dist/core/workflow-model/normalize-dependencies.js +119 -0
  81. package/dist/core/workflow-model/normalize-dependencies.js.map +1 -0
  82. package/dist/core/workflow-model/normalize-env.d.ts +17 -0
  83. package/dist/core/workflow-model/normalize-env.d.ts.map +1 -0
  84. package/dist/core/workflow-model/normalize-env.js +40 -0
  85. package/dist/core/workflow-model/normalize-env.js.map +1 -0
  86. package/dist/core/workflow-model/normalize-if-condition.d.ts +14 -0
  87. package/dist/core/workflow-model/normalize-if-condition.d.ts.map +1 -0
  88. package/dist/core/workflow-model/normalize-if-condition.js +75 -0
  89. package/dist/core/workflow-model/normalize-if-condition.js.map +1 -0
  90. package/dist/core/workflow-model/normalize-job-checkout.d.ts +5 -0
  91. package/dist/core/workflow-model/normalize-job-checkout.d.ts.map +1 -0
  92. package/dist/core/workflow-model/normalize-job-checkout.js +16 -0
  93. package/dist/core/workflow-model/normalize-job-checkout.js.map +1 -0
  94. package/dist/core/workflow-model/normalize-job-listening.d.ts +10 -0
  95. package/dist/core/workflow-model/normalize-job-listening.d.ts.map +1 -0
  96. package/dist/core/workflow-model/normalize-job-listening.js +125 -0
  97. package/dist/core/workflow-model/normalize-job-listening.js.map +1 -0
  98. package/dist/core/workflow-model/normalize-job-success.d.ts +11 -0
  99. package/dist/core/workflow-model/normalize-job-success.d.ts.map +1 -0
  100. package/dist/core/workflow-model/normalize-job-success.js +23 -0
  101. package/dist/core/workflow-model/normalize-job-success.js.map +1 -0
  102. package/dist/core/workflow-model/normalize-jobs.d.ts +12 -0
  103. package/dist/core/workflow-model/normalize-jobs.d.ts.map +1 -0
  104. package/dist/core/workflow-model/normalize-jobs.js +935 -0
  105. package/dist/core/workflow-model/normalize-jobs.js.map +1 -0
  106. package/dist/core/workflow-model/normalize-needs.d.ts +2 -0
  107. package/dist/core/workflow-model/normalize-needs.d.ts.map +1 -0
  108. package/dist/core/workflow-model/normalize-needs.js +16 -0
  109. package/dist/core/workflow-model/normalize-needs.js.map +1 -0
  110. package/dist/core/workflow-model/normalize-step-gate.d.ts +15 -0
  111. package/dist/core/workflow-model/normalize-step-gate.d.ts.map +1 -0
  112. package/dist/core/workflow-model/normalize-step-gate.js +89 -0
  113. package/dist/core/workflow-model/normalize-step-gate.js.map +1 -0
  114. package/dist/core/workflow-model/normalize-step-outputs.d.ts +10 -0
  115. package/dist/core/workflow-model/normalize-step-outputs.d.ts.map +1 -0
  116. package/dist/core/workflow-model/normalize-step-outputs.js +32 -0
  117. package/dist/core/workflow-model/normalize-step-outputs.js.map +1 -0
  118. package/dist/core/workflow-model/normalize-triggers.d.ts +11 -0
  119. package/dist/core/workflow-model/normalize-triggers.d.ts.map +1 -0
  120. package/dist/core/workflow-model/normalize-triggers.js +128 -0
  121. package/dist/core/workflow-model/normalize-triggers.js.map +1 -0
  122. package/dist/core/workflow-model/normalize-workflow-document.d.ts +11 -0
  123. package/dist/core/workflow-model/normalize-workflow-document.d.ts.map +1 -0
  124. package/dist/core/workflow-model/normalize-workflow-document.js +43 -0
  125. package/dist/core/workflow-model/normalize-workflow-document.js.map +1 -0
  126. package/dist/core/workflow-model/parse-duration-ms.d.ts +11 -0
  127. package/dist/core/workflow-model/parse-duration-ms.d.ts.map +1 -0
  128. package/dist/core/workflow-model/parse-duration-ms.js +47 -0
  129. package/dist/core/workflow-model/parse-duration-ms.js.map +1 -0
  130. package/dist/core/workflow-model/parse-interpolation-field.d.ts +14 -0
  131. package/dist/core/workflow-model/parse-interpolation-field.d.ts.map +1 -0
  132. package/dist/core/workflow-model/parse-interpolation-field.js +377 -0
  133. package/dist/core/workflow-model/parse-interpolation-field.js.map +1 -0
  134. package/dist/core/workflow-model/stable-id.d.ts +2 -0
  135. package/dist/core/workflow-model/stable-id.d.ts.map +1 -0
  136. package/dist/core/workflow-model/stable-id.js +8 -0
  137. package/dist/core/workflow-model/stable-id.js.map +1 -0
  138. package/dist/core/workflow-model/validate-job-references.d.ts +10 -0
  139. package/dist/core/workflow-model/validate-job-references.d.ts.map +1 -0
  140. package/dist/core/workflow-model/validate-job-references.js +42 -0
  141. package/dist/core/workflow-model/validate-job-references.js.map +1 -0
  142. package/dist/core/workflow-model/validate-predicate-expression.d.ts +14 -0
  143. package/dist/core/workflow-model/validate-predicate-expression.d.ts.map +1 -0
  144. package/dist/core/workflow-model/validate-predicate-expression.js +273 -0
  145. package/dist/core/workflow-model/validate-predicate-expression.js.map +1 -0
  146. package/dist/core/workflow-model/validation-issue.d.ts +8 -0
  147. package/dist/core/workflow-model/validation-issue.d.ts.map +1 -0
  148. package/dist/core/workflow-model/validation-issue.js +17 -0
  149. package/dist/core/workflow-model/validation-issue.js.map +1 -0
  150. package/dist/core/workflow-model/workflow-field-label.d.ts +3 -0
  151. package/dist/core/workflow-model/workflow-field-label.d.ts.map +1 -0
  152. package/dist/core/workflow-model/workflow-field-label.js +47 -0
  153. package/dist/core/workflow-model/workflow-field-label.js.map +1 -0
  154. package/dist/core/workflow-yaml/index.d.ts +3 -0
  155. package/dist/core/workflow-yaml/index.d.ts.map +1 -0
  156. package/dist/core/workflow-yaml/index.js +4 -0
  157. package/dist/core/workflow-yaml/index.js.map +1 -0
  158. package/dist/core/workflow-yaml/invalid-workflow-yaml-error.d.ts +16 -0
  159. package/dist/core/workflow-yaml/invalid-workflow-yaml-error.d.ts.map +1 -0
  160. package/dist/core/workflow-yaml/invalid-workflow-yaml-error.js +12 -0
  161. package/dist/core/workflow-yaml/invalid-workflow-yaml-error.js.map +1 -0
  162. package/dist/core/workflow-yaml/parse-workflow-yaml.d.ts +9 -0
  163. package/dist/core/workflow-yaml/parse-workflow-yaml.d.ts.map +1 -0
  164. package/dist/core/workflow-yaml/parse-workflow-yaml.js +52 -0
  165. package/dist/core/workflow-yaml/parse-workflow-yaml.js.map +1 -0
  166. package/dist/core/workflow-yaml/source-locations.d.ts +3 -0
  167. package/dist/core/workflow-yaml/source-locations.d.ts.map +1 -0
  168. package/dist/core/workflow-yaml/source-locations.js +48 -0
  169. package/dist/core/workflow-yaml/source-locations.js.map +1 -0
  170. package/dist/db/db.d.ts +1277 -0
  171. package/dist/db/db.d.ts.map +1 -0
  172. package/dist/db/db.js +22 -0
  173. package/dist/db/db.js.map +1 -0
  174. package/dist/db/definition-triggers.d.ts +4 -0
  175. package/dist/db/definition-triggers.d.ts.map +1 -0
  176. package/dist/db/definition-triggers.js +17 -0
  177. package/dist/db/definition-triggers.js.map +1 -0
  178. package/dist/db/definitions.d.ts +63 -0
  179. package/dist/db/definitions.d.ts.map +1 -0
  180. package/dist/db/definitions.js +208 -0
  181. package/dist/db/definitions.js.map +1 -0
  182. package/dist/db/index.d.ts +8 -0
  183. package/dist/db/index.d.ts.map +1 -0
  184. package/dist/db/index.js +10 -0
  185. package/dist/db/index.js.map +1 -0
  186. package/dist/db/schema/common.d.ts +2 -0
  187. package/dist/db/schema/common.d.ts.map +1 -0
  188. package/dist/db/schema/common.js +4 -0
  189. package/dist/db/schema/common.js.map +1 -0
  190. package/dist/db/schema/definitions.d.ts +237 -0
  191. package/dist/db/schema/definitions.d.ts.map +1 -0
  192. package/dist/db/schema/definitions.js +63 -0
  193. package/dist/db/schema/definitions.js.map +1 -0
  194. package/dist/db/schema/outbox.d.ts +195 -0
  195. package/dist/db/schema/outbox.d.ts.map +1 -0
  196. package/dist/db/schema/outbox.js +5 -0
  197. package/dist/db/schema/outbox.js.map +1 -0
  198. package/dist/db/schema/sync-states.d.ts +218 -0
  199. package/dist/db/schema/sync-states.d.ts.map +1 -0
  200. package/dist/db/schema/sync-states.js +68 -0
  201. package/dist/db/schema/sync-states.js.map +1 -0
  202. package/dist/db/sync-states.d.ts +21 -0
  203. package/dist/db/sync-states.d.ts.map +1 -0
  204. package/dist/db/sync-states.js +47 -0
  205. package/dist/db/sync-states.js.map +1 -0
  206. package/dist/index.d.ts +14 -0
  207. package/dist/index.d.ts.map +1 -0
  208. package/dist/index.js +63 -0
  209. package/dist/index.js.map +1 -0
  210. package/dist/presentation/dto/definition.d.ts +6 -0
  211. package/dist/presentation/dto/definition.d.ts.map +1 -0
  212. package/dist/presentation/dto/definition.js +35 -0
  213. package/dist/presentation/dto/definition.js.map +1 -0
  214. package/dist/presentation/dto/index.d.ts +2 -0
  215. package/dist/presentation/dto/index.d.ts.map +1 -0
  216. package/dist/presentation/dto/index.js +3 -0
  217. package/dist/presentation/dto/index.js.map +1 -0
  218. package/dist/presentation/index.d.ts +2 -0
  219. package/dist/presentation/index.d.ts.map +1 -0
  220. package/dist/presentation/index.js +3 -0
  221. package/dist/presentation/index.js.map +1 -0
  222. package/dist/presentation/routes/create-definition.d.ts +9 -0
  223. package/dist/presentation/routes/create-definition.d.ts.map +1 -0
  224. package/dist/presentation/routes/create-definition.js +76 -0
  225. package/dist/presentation/routes/create-definition.js.map +1 -0
  226. package/dist/presentation/routes/get-definition.d.ts +2 -0
  227. package/dist/presentation/routes/get-definition.d.ts.map +1 -0
  228. package/dist/presentation/routes/get-definition.js +43 -0
  229. package/dist/presentation/routes/get-definition.js.map +1 -0
  230. package/dist/presentation/routes/index.d.ts +7 -0
  231. package/dist/presentation/routes/index.d.ts.map +1 -0
  232. package/dist/presentation/routes/index.js +22 -0
  233. package/dist/presentation/routes/index.js.map +1 -0
  234. package/dist/presentation/routes/list-definitions.d.ts +2 -0
  235. package/dist/presentation/routes/list-definitions.d.ts.map +1 -0
  236. package/dist/presentation/routes/list-definitions.js +56 -0
  237. package/dist/presentation/routes/list-definitions.js.map +1 -0
  238. package/dist/presentation/routes/validate-definition.d.ts +2 -0
  239. package/dist/presentation/routes/validate-definition.d.ts.map +1 -0
  240. package/dist/presentation/routes/validate-definition.js +43 -0
  241. package/dist/presentation/routes/validate-definition.js.map +1 -0
  242. package/dist/presentation/subscribers/index.d.ts +3 -0
  243. package/dist/presentation/subscribers/index.d.ts.map +1 -0
  244. package/dist/presentation/subscribers/index.js +4 -0
  245. package/dist/presentation/subscribers/index.js.map +1 -0
  246. package/dist/presentation/subscribers/on-project-source-bound.d.ts +3 -0
  247. package/dist/presentation/subscribers/on-project-source-bound.d.ts.map +1 -0
  248. package/dist/presentation/subscribers/on-project-source-bound.js +11 -0
  249. package/dist/presentation/subscribers/on-project-source-bound.js.map +1 -0
  250. package/dist/presentation/subscribers/on-project-source-commit-observed.d.ts +3 -0
  251. package/dist/presentation/subscribers/on-project-source-commit-observed.d.ts.map +1 -0
  252. package/dist/presentation/subscribers/on-project-source-commit-observed.js +13 -0
  253. package/dist/presentation/subscribers/on-project-source-commit-observed.js.map +1 -0
  254. package/dist/presentation/subscribers/start-definition-sync.d.ts +10 -0
  255. package/dist/presentation/subscribers/start-definition-sync.d.ts.map +1 -0
  256. package/dist/presentation/subscribers/start-definition-sync.js +26 -0
  257. package/dist/presentation/subscribers/start-definition-sync.js.map +1 -0
  258. package/dist/temporal/activities/index.d.ts +3 -0
  259. package/dist/temporal/activities/index.d.ts.map +1 -0
  260. package/dist/temporal/activities/index.js +3 -0
  261. package/dist/temporal/activities/index.js.map +1 -0
  262. package/dist/temporal/activities/sync-activities.d.ts +47 -0
  263. package/dist/temporal/activities/sync-activities.d.ts.map +1 -0
  264. package/dist/temporal/activities/sync-activities.js +128 -0
  265. package/dist/temporal/activities/sync-activities.js.map +1 -0
  266. package/dist/temporal/constants.d.ts +3 -0
  267. package/dist/temporal/constants.d.ts.map +1 -0
  268. package/dist/temporal/constants.js +4 -0
  269. package/dist/temporal/constants.js.map +1 -0
  270. package/dist/temporal/index.d.ts +3 -0
  271. package/dist/temporal/index.d.ts.map +1 -0
  272. package/dist/temporal/index.js +4 -0
  273. package/dist/temporal/index.js.map +1 -0
  274. package/dist/temporal/workflows/definition-sync.d.ts +20 -0
  275. package/dist/temporal/workflows/definition-sync.d.ts.map +1 -0
  276. package/dist/temporal/workflows/definition-sync.js +95 -0
  277. package/dist/temporal/workflows/definition-sync.js.map +1 -0
  278. package/dist/temporal/workflows/index.d.ts +2 -0
  279. package/dist/temporal/workflows/index.d.ts.map +1 -0
  280. package/dist/temporal/workflows/index.js +3 -0
  281. package/dist/temporal/workflows/index.js.map +1 -0
  282. package/dist/tsconfig.test.tsbuildinfo +1 -0
  283. package/drizzle/0000_initial.sql +64 -0
  284. package/drizzle/0001_definition_list_pagination.sql +1 -0
  285. package/drizzle/meta/0000_snapshot.json +527 -0
  286. package/drizzle/meta/_journal.json +20 -0
  287. package/drizzle.config.ts +11 -0
  288. package/package.json +89 -0
  289. package/src/config.test.ts +23 -0
  290. package/src/config.ts +50 -0
  291. package/src/core/entities/index.ts +4 -0
  292. package/src/core/entities/integration-context.ts +21 -0
  293. package/src/core/entities/sync-state.ts +40 -0
  294. package/src/core/entities/workflow-definition.ts +38 -0
  295. package/src/core/entities/workflow-model.ts +162 -0
  296. package/src/core/errors.ts +21 -0
  297. package/src/core/has-agent-step-integrations.ts +7 -0
  298. package/src/core/index.ts +23 -0
  299. package/src/core/parse-definition.test.ts +200 -0
  300. package/src/core/parse-definition.ts +28 -0
  301. package/src/core/sync-definitions.test.ts +390 -0
  302. package/src/core/sync-definitions.ts +216 -0
  303. package/src/core/validate-definition.test.ts +152 -0
  304. package/src/core/validate-definition.ts +72 -0
  305. package/src/core/workflow-model/README.md +129 -0
  306. package/src/core/workflow-model/constants.ts +1 -0
  307. package/src/core/workflow-model/cron-trigger.test.ts +29 -0
  308. package/src/core/workflow-model/cron-trigger.ts +83 -0
  309. package/src/core/workflow-model/index.ts +9 -0
  310. package/src/core/workflow-model/invalid-workflow-model-error.ts +71 -0
  311. package/src/core/workflow-model/map-job-ids.ts +33 -0
  312. package/src/core/workflow-model/normalize-agent-integrations.ts +208 -0
  313. package/src/core/workflow-model/normalize-dependencies.ts +139 -0
  314. package/src/core/workflow-model/normalize-env.ts +48 -0
  315. package/src/core/workflow-model/normalize-if-condition.ts +126 -0
  316. package/src/core/workflow-model/normalize-job-checkout.ts +19 -0
  317. package/src/core/workflow-model/normalize-job-listening.ts +121 -0
  318. package/src/core/workflow-model/normalize-job-success.ts +28 -0
  319. package/src/core/workflow-model/normalize-jobs.ts +1010 -0
  320. package/src/core/workflow-model/normalize-needs.ts +12 -0
  321. package/src/core/workflow-model/normalize-step-gate.ts +90 -0
  322. package/src/core/workflow-model/normalize-step-outputs.ts +36 -0
  323. package/src/core/workflow-model/normalize-triggers.ts +130 -0
  324. package/src/core/workflow-model/normalize-workflow-document.test.ts +4463 -0
  325. package/src/core/workflow-model/normalize-workflow-document.ts +63 -0
  326. package/src/core/workflow-model/parse-duration-ms.ts +58 -0
  327. package/src/core/workflow-model/parse-interpolation-field.ts +566 -0
  328. package/src/core/workflow-model/stable-id.ts +12 -0
  329. package/src/core/workflow-model/validate-job-references.ts +54 -0
  330. package/src/core/workflow-model/validate-predicate-expression.test.ts +161 -0
  331. package/src/core/workflow-model/validate-predicate-expression.ts +406 -0
  332. package/src/core/workflow-model/validation-issue.ts +27 -0
  333. package/src/core/workflow-model/workflow-field-label.ts +50 -0
  334. package/src/core/workflow-yaml/README.md +77 -0
  335. package/src/core/workflow-yaml/index.ts +11 -0
  336. package/src/core/workflow-yaml/invalid-workflow-yaml-error.ts +23 -0
  337. package/src/core/workflow-yaml/parse-workflow-yaml.test.ts +71 -0
  338. package/src/core/workflow-yaml/parse-workflow-yaml.ts +74 -0
  339. package/src/core/workflow-yaml/source-locations.ts +62 -0
  340. package/src/db/db.ts +18 -0
  341. package/src/db/definition-triggers.test.ts +95 -0
  342. package/src/db/definition-triggers.ts +17 -0
  343. package/src/db/definitions.test.ts +1309 -0
  344. package/src/db/definitions.ts +357 -0
  345. package/src/db/index.ts +31 -0
  346. package/src/db/schema/common.ts +3 -0
  347. package/src/db/schema/definitions.test.ts +36 -0
  348. package/src/db/schema/definitions.ts +76 -0
  349. package/src/db/schema/outbox.ts +4 -0
  350. package/src/db/schema/sync-states.ts +79 -0
  351. package/src/db/sync-states.test.ts +90 -0
  352. package/src/db/sync-states.ts +86 -0
  353. package/src/index.ts +104 -0
  354. package/src/presentation/dto/definition.test.ts +59 -0
  355. package/src/presentation/dto/definition.ts +41 -0
  356. package/src/presentation/dto/index.ts +1 -0
  357. package/src/presentation/index.ts +1 -0
  358. package/src/presentation/routes/create-definition.test.ts +356 -0
  359. package/src/presentation/routes/create-definition.ts +101 -0
  360. package/src/presentation/routes/get-definition.test.ts +79 -0
  361. package/src/presentation/routes/get-definition.ts +37 -0
  362. package/src/presentation/routes/index.test.ts +41 -0
  363. package/src/presentation/routes/index.ts +28 -0
  364. package/src/presentation/routes/list-definitions.test.ts +195 -0
  365. package/src/presentation/routes/list-definitions.ts +49 -0
  366. package/src/presentation/routes/validate-definition.test.ts +63 -0
  367. package/src/presentation/routes/validate-definition.ts +46 -0
  368. package/src/presentation/subscribers/index.ts +2 -0
  369. package/src/presentation/subscribers/on-project-source-bound.test.ts +65 -0
  370. package/src/presentation/subscribers/on-project-source-bound.ts +11 -0
  371. package/src/presentation/subscribers/on-project-source-commit-observed.test.ts +56 -0
  372. package/src/presentation/subscribers/on-project-source-commit-observed.ts +15 -0
  373. package/src/presentation/subscribers/start-definition-sync.ts +38 -0
  374. package/src/temporal/activities/index.ts +10 -0
  375. package/src/temporal/activities/sync-activities.test.ts +337 -0
  376. package/src/temporal/activities/sync-activities.ts +206 -0
  377. package/src/temporal/constants.ts +2 -0
  378. package/src/temporal/index.ts +2 -0
  379. package/src/temporal/workflows/definition-sync.test.ts +59 -0
  380. package/src/temporal/workflows/definition-sync.ts +116 -0
  381. package/src/temporal/workflows/index.ts +1 -0
  382. package/test/env.ts +7 -0
  383. package/test/factories/definition.ts +66 -0
  384. package/test/fixtures/invalid-cycle.yml +13 -0
  385. package/test/fixtures/invalid-missing-name.yml +4 -0
  386. package/test/fixtures/invalid-yaml-syntax.yml +6 -0
  387. package/test/fixtures/valid-dag.yml +25 -0
  388. package/test/fixtures/valid-listening-job.yml +21 -0
  389. package/test/fixtures/valid-simple.yml +18 -0
  390. package/test/fixtures/workflow-yaml/invalid/invalid-yaml-syntax.yaml +6 -0
  391. package/test/fixtures/workflow-yaml/invalid/missing-step-run.yaml +5 -0
  392. package/test/fixtures/workflow-yaml/valid/simple-build.document.json +26 -0
  393. package/test/fixtures/workflow-yaml/valid/simple-build.yaml +14 -0
  394. package/test/globalSetup.ts +25 -0
  395. package/test/index.ts +1 -0
  396. package/test/setup.ts +17 -0
  397. package/tsconfig.build.json +9 -0
  398. package/tsconfig.build.tsbuildinfo +1 -0
  399. package/tsconfig.json +3 -0
  400. package/tsconfig.test.json +8 -0
  401. package/vitest.config.ts +11 -0
@@ -0,0 +1,77 @@
1
+ # Workflow YAML
2
+
3
+ This module reads workflow files written in YAML.
4
+
5
+ ## What it does
6
+
7
+ - **`parseWorkflowYaml(source)`**: Reads YAML source text and returns a
8
+ `WorkflowDocument`.
9
+ - **`parseWorkflowYamlWithLocations(source)`**: Reads YAML source text and
10
+ returns both the `WorkflowDocument` and source line ranges for authored
11
+ `jobs.*.steps[]` entries.
12
+ - **`InvalidWorkflowYamlError`**: Reports bad YAML and roots that are not
13
+ objects.
14
+ - **Document checks**: Sends parsed objects to
15
+ `@shipfox/workflow-document`.
16
+
17
+ Use this module when file text has to become the shared document shape. It is
18
+ small on purpose. It reads text, checks that the root is an object, and passes
19
+ that object to the document package.
20
+
21
+ This keeps the first step easy to test. Code that has found a file can call this
22
+ part and then pass the result to the next step. Keep new rules out of this part
23
+ unless they are about how YAML text is read or where authored YAML nodes appeared
24
+ in the source.
25
+
26
+ If a rule needs to know about jobs, ids, or run order beyond extracting a YAML
27
+ node's source range, put that rule in a later part. This part should stay easy
28
+ to read and easy to change.
29
+
30
+ That keeps the next part clear too.
31
+
32
+ ## Installation / Setup
33
+
34
+ This code is part of `@shipfox/api-definitions`. It is not a standalone package.
35
+
36
+ ```json
37
+ {
38
+ "dependencies": {
39
+ "@shipfox/workflow-document": "workspace:*",
40
+ "js-yaml": "^4.1.0",
41
+ "yaml": "^2.8.3"
42
+ }
43
+ }
44
+ ```
45
+
46
+ ## Usage
47
+
48
+ ```ts
49
+ import {parseWorkflowYaml} from '#core/workflow-yaml/index.js';
50
+
51
+ const document = parseWorkflowYaml(`
52
+ name: simple build
53
+ jobs:
54
+ build:
55
+ steps:
56
+ - run: npm test
57
+ `);
58
+
59
+ console.log(document.jobs.build.steps[0]?.run);
60
+ ```
61
+
62
+ ## Behavior Notes
63
+
64
+ The parser owns only YAML concerns. It does not set defaults. It does not change
65
+ job ids. It does not build job graphs. It does not check expressions.
66
+
67
+ ## Development
68
+
69
+ ```sh
70
+ turbo check --filter=@shipfox/api-definitions
71
+ turbo type --filter=@shipfox/api-definitions
72
+ turbo test --filter=@shipfox/api-definitions
73
+ ```
74
+
75
+ ## License
76
+
77
+ MIT
@@ -0,0 +1,11 @@
1
+ export {
2
+ InvalidWorkflowYamlError,
3
+ type InvalidWorkflowYamlReason,
4
+ invalidWorkflowYamlErrorCode,
5
+ type WorkflowYamlLocation,
6
+ } from './invalid-workflow-yaml-error.js';
7
+ export {
8
+ type ParsedWorkflowYaml,
9
+ parseWorkflowYaml,
10
+ parseWorkflowYamlWithLocations,
11
+ } from './parse-workflow-yaml.js';
@@ -0,0 +1,23 @@
1
+ export const invalidWorkflowYamlErrorCode = 'invalid-workflow-yaml';
2
+
3
+ export type InvalidWorkflowYamlReason = 'syntax' | 'non-object-root';
4
+
5
+ export interface WorkflowYamlLocation {
6
+ readonly line: number;
7
+ readonly column: number;
8
+ }
9
+
10
+ export class InvalidWorkflowYamlError extends Error {
11
+ readonly code = invalidWorkflowYamlErrorCode;
12
+ readonly location: WorkflowYamlLocation | undefined;
13
+
14
+ constructor(
15
+ readonly reason: InvalidWorkflowYamlReason,
16
+ message: string,
17
+ options: {cause?: unknown; location?: WorkflowYamlLocation | undefined} = {},
18
+ ) {
19
+ super(message, {cause: options.cause});
20
+ this.name = 'InvalidWorkflowYamlError';
21
+ this.location = options.location;
22
+ }
23
+ }
@@ -0,0 +1,71 @@
1
+ import {readFile} from 'node:fs/promises';
2
+ import {fileURLToPath} from 'node:url';
3
+ import {InvalidWorkflowDocumentError} from '@shipfox/workflow-document';
4
+ import {InvalidWorkflowYamlError} from './invalid-workflow-yaml-error.js';
5
+ import {parseWorkflowYaml} from './parse-workflow-yaml.js';
6
+
7
+ async function readFixture(path: string): Promise<string> {
8
+ const fixtureUrl = import.meta.resolve(`#test/fixtures/workflow-yaml/${path}`);
9
+ return await readFile(fileURLToPath(fixtureUrl), 'utf8');
10
+ }
11
+
12
+ describe('parseWorkflowYaml', () => {
13
+ it('parses valid workflow YAML into a workflow document', async () => {
14
+ const source = await readFixture('valid/simple-build.yaml');
15
+ const expected = JSON.parse(await readFixture('valid/simple-build.document.json')) as unknown;
16
+
17
+ const document = parseWorkflowYaml(source);
18
+
19
+ expect(document).toEqual(expected);
20
+ });
21
+
22
+ it('throws a typed YAML error for YAML syntax errors', async () => {
23
+ const source = await readFixture('invalid/invalid-yaml-syntax.yaml');
24
+
25
+ try {
26
+ parseWorkflowYaml(source);
27
+ expect.fail('Expected InvalidWorkflowYamlError');
28
+ } catch (error) {
29
+ expect(error).toBeInstanceOf(InvalidWorkflowYamlError);
30
+ expect(error).toMatchObject({
31
+ code: 'invalid-workflow-yaml',
32
+ reason: 'syntax',
33
+ });
34
+ expect((error as InvalidWorkflowYamlError).location?.line).toBeGreaterThanOrEqual(1);
35
+ expect((error as InvalidWorkflowYamlError).location?.column).toBeGreaterThanOrEqual(1);
36
+ expect((error as Error).message).toContain('Invalid workflow YAML syntax:');
37
+ expect((error as Error).cause).toBeDefined();
38
+ }
39
+ });
40
+
41
+ it.each([
42
+ ['array root', '- npm test'],
43
+ ['scalar root', '42'],
44
+ ['empty input', ''],
45
+ ])('throws a typed YAML error for %s', (_name, source) => {
46
+ try {
47
+ parseWorkflowYaml(source);
48
+ expect.fail('Expected InvalidWorkflowYamlError');
49
+ } catch (error) {
50
+ expect(error).toBeInstanceOf(InvalidWorkflowYamlError);
51
+ expect(error).toMatchObject({
52
+ code: 'invalid-workflow-yaml',
53
+ reason: 'non-object-root',
54
+ });
55
+ }
56
+ });
57
+
58
+ it('delegates workflow document validation to the shared document package', async () => {
59
+ const source = await readFixture('invalid/missing-step-run.yaml');
60
+
61
+ try {
62
+ parseWorkflowYaml(source);
63
+ expect.fail('Expected InvalidWorkflowDocumentError');
64
+ } catch (error) {
65
+ expect(error).toBeInstanceOf(InvalidWorkflowDocumentError);
66
+ expect((error as InvalidWorkflowDocumentError).validationError.issues[0]).toMatchObject({
67
+ path: ['jobs', 'build', 'steps', 0],
68
+ });
69
+ }
70
+ });
71
+ });
@@ -0,0 +1,74 @@
1
+ import {parseWorkflowDocument, type WorkflowDocument} from '@shipfox/workflow-document';
2
+ import yaml from 'js-yaml';
3
+ import type {WorkflowStepSourceLocationMap} from '../entities/workflow-model.js';
4
+ import {
5
+ InvalidWorkflowYamlError,
6
+ type WorkflowYamlLocation,
7
+ } from './invalid-workflow-yaml-error.js';
8
+ import {extractWorkflowStepSourceLocations} from './source-locations.js';
9
+
10
+ export interface ParsedWorkflowYaml {
11
+ document: WorkflowDocument;
12
+ stepSourceLocations: WorkflowStepSourceLocationMap;
13
+ }
14
+
15
+ export function parseWorkflowYaml(source: string): WorkflowDocument {
16
+ return parseWorkflowDocument(loadWorkflowYaml(source));
17
+ }
18
+
19
+ export function parseWorkflowYamlWithLocations(source: string): ParsedWorkflowYaml {
20
+ const parsed = loadWorkflowYaml(source);
21
+
22
+ return {
23
+ document: parseWorkflowDocument(parsed),
24
+ stepSourceLocations: extractWorkflowStepSourceLocations(source),
25
+ };
26
+ }
27
+
28
+ function loadWorkflowYaml(source: string): Record<string, unknown> {
29
+ let parsed: unknown;
30
+ try {
31
+ parsed = yaml.load(source);
32
+ } catch (error) {
33
+ throw new InvalidWorkflowYamlError(
34
+ 'syntax',
35
+ `Invalid workflow YAML syntax: ${yamlErrorMessage(error)}`,
36
+ {cause: error, location: yamlErrorLocation(error)},
37
+ );
38
+ }
39
+
40
+ if (!isRecord(parsed)) {
41
+ throw new InvalidWorkflowYamlError('non-object-root', 'Workflow YAML must parse to an object.');
42
+ }
43
+
44
+ return parsed;
45
+ }
46
+
47
+ function isRecord(value: unknown): value is Record<string, unknown> {
48
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
49
+ }
50
+
51
+ function yamlErrorMessage(error: unknown): string {
52
+ if (
53
+ error !== null &&
54
+ typeof error === 'object' &&
55
+ typeof (error as {reason?: unknown}).reason === 'string'
56
+ ) {
57
+ return (error as {reason: string}).reason;
58
+ }
59
+
60
+ return error instanceof Error ? error.message : String(error);
61
+ }
62
+
63
+ function yamlErrorLocation(error: unknown): WorkflowYamlLocation | undefined {
64
+ if (error === null || typeof error !== 'object') return undefined;
65
+
66
+ const mark = (error as {mark?: unknown}).mark;
67
+ if (mark === null || typeof mark !== 'object') return undefined;
68
+
69
+ const line = (mark as {line?: unknown}).line;
70
+ const column = (mark as {column?: unknown}).column;
71
+ if (typeof line !== 'number' || typeof column !== 'number') return undefined;
72
+
73
+ return {line: line + 1, column: column + 1};
74
+ }
@@ -0,0 +1,62 @@
1
+ import {isMap, isNode, isScalar, isSeq, LineCounter, parseDocument, type YAMLMap} from 'yaml';
2
+ import type {
3
+ WorkflowSourceLocation,
4
+ WorkflowStepSourceLocationMap,
5
+ } from '../entities/workflow-model.js';
6
+
7
+ export function extractWorkflowStepSourceLocations(source: string): WorkflowStepSourceLocationMap {
8
+ const lineCounter = new LineCounter();
9
+ const document = parseDocument(source, {lineCounter});
10
+ if (document.errors.length > 0 || !isMap(document.contents)) return new Map();
11
+
12
+ const jobs = getMapValue(document.contents, 'jobs');
13
+ if (!isMap(jobs)) return new Map();
14
+
15
+ const locations = new Map<string, Map<number, WorkflowSourceLocation>>();
16
+
17
+ for (const jobPair of jobs.items) {
18
+ const jobName = scalarString(jobPair.key);
19
+ if (jobName === undefined || !isMap(jobPair.value)) continue;
20
+
21
+ const steps = getMapValue(jobPair.value, 'steps');
22
+ if (!isSeq(steps)) continue;
23
+
24
+ const stepLocations = new Map<number, WorkflowSourceLocation>();
25
+ for (const [index, step] of steps.items.entries()) {
26
+ const location = sourceLocationFor(step, lineCounter);
27
+ if (location) stepLocations.set(index, location);
28
+ }
29
+
30
+ if (stepLocations.size > 0) locations.set(jobName, stepLocations);
31
+ }
32
+
33
+ return locations;
34
+ }
35
+
36
+ function getMapValue(map: YAMLMap, key: string): unknown {
37
+ for (const item of map.items) {
38
+ if (scalarString(item.key) === key) return item.value;
39
+ }
40
+
41
+ return undefined;
42
+ }
43
+
44
+ function scalarString(node: unknown): string | undefined {
45
+ return isScalar(node) && typeof node.value === 'string' ? node.value : undefined;
46
+ }
47
+
48
+ function sourceLocationFor(
49
+ node: unknown,
50
+ lineCounter: LineCounter,
51
+ ): WorkflowSourceLocation | undefined {
52
+ if (!isNode(node)) return undefined;
53
+ const range = node?.range;
54
+ if (!range) return undefined;
55
+
56
+ const start = lineCounter.linePos(range[0]);
57
+ const end = lineCounter.linePos(range[1]);
58
+ if (!start || !end) return undefined;
59
+
60
+ const endLine = end.col === 1 && end.line > start.line ? end.line - 1 : end.line;
61
+ return {startLine: start.line, endLine: Math.max(start.line, endLine)};
62
+ }
package/src/db/db.ts ADDED
@@ -0,0 +1,18 @@
1
+ import {drizzle, type NodePgDatabase} from '@shipfox/node-drizzle';
2
+ import {pgClient} from '@shipfox/node-postgres';
3
+ import {workflowDefinitions} from './schema/definitions.js';
4
+ import {definitionsOutbox} from './schema/outbox.js';
5
+ import {definitionSyncStates} from './schema/sync-states.js';
6
+
7
+ export const schema = {workflowDefinitions, definitionsOutbox, definitionSyncStates};
8
+
9
+ let _db: NodePgDatabase<typeof schema> | undefined;
10
+
11
+ export function db() {
12
+ if (!_db) _db = drizzle(pgClient(), {schema});
13
+ return _db;
14
+ }
15
+
16
+ export function closeDb(): void {
17
+ _db = undefined;
18
+ }
@@ -0,0 +1,95 @@
1
+ import type {WorkflowModel, WorkflowModelTrigger} from '#core/entities/workflow-model.js';
2
+ import {definitionTriggersFor} from './definition-triggers.js';
3
+
4
+ function workflowModelWithTriggers(triggers: readonly WorkflowModelTrigger[]): WorkflowModel {
5
+ return {
6
+ kind: 'workflow',
7
+ name: 'Test',
8
+ triggers,
9
+ jobs: [],
10
+ dependencies: [],
11
+ };
12
+ }
13
+
14
+ describe('definitionTriggersFor', () => {
15
+ it('projects model triggers to the public outbox trigger DTO shape', () => {
16
+ const model = workflowModelWithTriggers([
17
+ {
18
+ id: 'push',
19
+ key: 'push',
20
+ source: 'github',
21
+ event: 'push',
22
+ inputs: {branch: 'main'},
23
+ filter: 'event.ref == "refs/heads/main"',
24
+ },
25
+ ]);
26
+
27
+ const result = definitionTriggersFor(model);
28
+
29
+ expect(result).toEqual({
30
+ push: {
31
+ source: 'github',
32
+ event: 'push',
33
+ with: {branch: 'main'},
34
+ filter: 'event.ref == "refs/heads/main"',
35
+ },
36
+ });
37
+ expect(result.push).not.toHaveProperty('on');
38
+ });
39
+
40
+ it('omits absent optional trigger fields', () => {
41
+ const model = workflowModelWithTriggers([
42
+ {
43
+ id: 'manual',
44
+ key: 'manual',
45
+ source: 'manual',
46
+ event: 'fire',
47
+ },
48
+ ]);
49
+
50
+ const result = definitionTriggersFor(model);
51
+
52
+ expect(result).toEqual({
53
+ manual: {
54
+ source: 'manual',
55
+ event: 'fire',
56
+ },
57
+ });
58
+ });
59
+
60
+ it('projects cron config to the public outbox trigger DTO shape', () => {
61
+ const model = workflowModelWithTriggers([
62
+ {
63
+ id: 'nightly',
64
+ key: 'nightly',
65
+ source: 'cron',
66
+ event: 'tick',
67
+ config: {
68
+ schedule: '0 2 * * *',
69
+ timezone: 'UTC',
70
+ },
71
+ },
72
+ ]);
73
+
74
+ const result = definitionTriggersFor(model);
75
+
76
+ expect(result).toEqual({
77
+ nightly: {
78
+ source: 'cron',
79
+ event: 'tick',
80
+ config: {
81
+ schedule: '0 2 * * *',
82
+ timezone: 'UTC',
83
+ },
84
+ },
85
+ });
86
+ });
87
+
88
+ it('returns an empty object when the model has no triggers', () => {
89
+ const model = workflowModelWithTriggers([]);
90
+
91
+ const result = definitionTriggersFor(model);
92
+
93
+ expect(result).toEqual({});
94
+ });
95
+ });
@@ -0,0 +1,17 @@
1
+ import type {TriggerDto} from '@shipfox/api-definitions-dto';
2
+ import type {WorkflowModel} from '#core/entities/workflow-model.js';
3
+
4
+ export function definitionTriggersFor(model: WorkflowModel): Record<string, TriggerDto> {
5
+ return Object.fromEntries(
6
+ model.triggers.map((trigger) => {
7
+ const dto: TriggerDto = {
8
+ source: trigger.source,
9
+ event: trigger.event,
10
+ };
11
+ if (trigger.inputs !== undefined) dto.with = trigger.inputs;
12
+ if (trigger.filter !== undefined) dto.filter = trigger.filter;
13
+ if (trigger.config !== undefined) dto.config = trigger.config;
14
+ return [trigger.key, dto];
15
+ }),
16
+ );
17
+ }