@skedulo/integration-sdk 0.3.4 → 0.5.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 (225) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +84 -20
  3. package/dist/actions/action-registry.d.ts.map +1 -1
  4. package/dist/actions/action-registry.js +27 -23
  5. package/dist/actions/action-registry.js.map +1 -1
  6. package/dist/actions/data-flow/activate.action.d.ts +10 -0
  7. package/dist/actions/data-flow/activate.action.d.ts.map +1 -0
  8. package/dist/actions/data-flow/activate.action.js +22 -0
  9. package/dist/actions/data-flow/activate.action.js.map +1 -0
  10. package/dist/actions/data-flow/create.action.d.ts +9 -0
  11. package/dist/actions/data-flow/create.action.d.ts.map +1 -0
  12. package/dist/actions/data-flow/create.action.js +55 -0
  13. package/dist/actions/data-flow/create.action.js.map +1 -0
  14. package/dist/actions/data-flow/deactivate.action.d.ts +9 -0
  15. package/dist/actions/data-flow/deactivate.action.d.ts.map +1 -0
  16. package/dist/actions/data-flow/deactivate.action.js +21 -0
  17. package/dist/actions/data-flow/deactivate.action.js.map +1 -0
  18. package/dist/actions/data-flow/delete.action.d.ts +10 -0
  19. package/dist/actions/data-flow/delete.action.d.ts.map +1 -0
  20. package/dist/actions/data-flow/delete.action.js +33 -0
  21. package/dist/actions/data-flow/delete.action.js.map +1 -0
  22. package/dist/actions/data-flow/get.action.d.ts +5 -0
  23. package/dist/actions/data-flow/get.action.d.ts.map +1 -0
  24. package/dist/actions/data-flow/get.action.js +22 -0
  25. package/dist/actions/data-flow/get.action.js.map +1 -0
  26. package/dist/actions/data-flow/index.d.ts +9 -0
  27. package/dist/actions/data-flow/index.d.ts.map +1 -0
  28. package/dist/actions/data-flow/index.js +33 -0
  29. package/dist/actions/data-flow/index.js.map +1 -0
  30. package/dist/actions/data-flow/list.action.d.ts +6 -0
  31. package/dist/actions/data-flow/list.action.d.ts.map +1 -0
  32. package/dist/actions/data-flow/list.action.js +25 -0
  33. package/dist/actions/data-flow/list.action.js.map +1 -0
  34. package/dist/actions/data-flow/shared.d.ts +3 -0
  35. package/dist/actions/data-flow/shared.d.ts.map +1 -0
  36. package/dist/actions/data-flow/shared.js +16 -0
  37. package/dist/actions/data-flow/shared.js.map +1 -0
  38. package/dist/actions/data-flow/types.d.ts +21 -0
  39. package/dist/actions/data-flow/types.d.ts.map +1 -0
  40. package/dist/actions/data-flow/types.js +3 -0
  41. package/dist/actions/data-flow/types.js.map +1 -0
  42. package/dist/actions/data-flow/update.action.d.ts +16 -0
  43. package/dist/actions/data-flow/update.action.d.ts.map +1 -0
  44. package/dist/actions/data-flow/update.action.js +62 -0
  45. package/dist/actions/data-flow/update.action.js.map +1 -0
  46. package/dist/actions/data-flow.action.d.ts.map +1 -1
  47. package/dist/actions/data-flow.action.js +5 -9
  48. package/dist/actions/data-flow.action.js.map +1 -1
  49. package/dist/actions/event/index.d.ts +4 -0
  50. package/dist/actions/event/index.d.ts.map +1 -0
  51. package/dist/actions/event/index.js +23 -0
  52. package/dist/actions/event/index.js.map +1 -0
  53. package/dist/actions/event/on-skedulo.action.d.ts +4 -0
  54. package/dist/actions/event/on-skedulo.action.d.ts.map +1 -0
  55. package/dist/actions/event/on-skedulo.action.js +81 -0
  56. package/dist/actions/event/on-skedulo.action.js.map +1 -0
  57. package/dist/actions/event/on-vendor.action.d.ts +4 -0
  58. package/dist/actions/event/on-vendor.action.d.ts.map +1 -0
  59. package/dist/actions/event/on-vendor.action.js +43 -0
  60. package/dist/actions/event/on-vendor.action.js.map +1 -0
  61. package/dist/actions/event/types.d.ts +28 -0
  62. package/dist/actions/event/types.d.ts.map +1 -0
  63. package/dist/actions/event/types.js +3 -0
  64. package/dist/actions/event/types.js.map +1 -0
  65. package/dist/actions/metadata/get-fields.action.d.ts +5 -0
  66. package/dist/actions/metadata/get-fields.action.d.ts.map +1 -0
  67. package/dist/actions/metadata/get-fields.action.js +26 -0
  68. package/dist/actions/metadata/get-fields.action.js.map +1 -0
  69. package/dist/actions/metadata/get-objects.action.d.ts +5 -0
  70. package/dist/actions/metadata/get-objects.action.d.ts.map +1 -0
  71. package/dist/actions/metadata/get-objects.action.js +18 -0
  72. package/dist/actions/metadata/get-objects.action.js.map +1 -0
  73. package/dist/actions/metadata/get-sample-apis.action.d.ts +5 -0
  74. package/dist/actions/metadata/get-sample-apis.action.d.ts.map +1 -0
  75. package/dist/actions/metadata/get-sample-apis.action.js +19 -0
  76. package/dist/actions/metadata/get-sample-apis.action.js.map +1 -0
  77. package/dist/actions/metadata/get-sample-records.action.d.ts +5 -0
  78. package/dist/actions/metadata/get-sample-records.action.d.ts.map +1 -0
  79. package/dist/actions/metadata/get-sample-records.action.js +33 -0
  80. package/dist/actions/metadata/get-sample-records.action.js.map +1 -0
  81. package/dist/actions/metadata/get-templates.action.d.ts +5 -0
  82. package/dist/actions/metadata/get-templates.action.d.ts.map +1 -0
  83. package/dist/actions/metadata/get-templates.action.js +19 -0
  84. package/dist/actions/metadata/get-templates.action.js.map +1 -0
  85. package/dist/actions/metadata/index.d.ts +7 -0
  86. package/dist/actions/metadata/index.d.ts.map +1 -0
  87. package/dist/actions/metadata/index.js +29 -0
  88. package/dist/actions/metadata/index.js.map +1 -0
  89. package/dist/actions/metadata/shared.d.ts +6 -0
  90. package/dist/actions/metadata/shared.d.ts.map +1 -0
  91. package/dist/actions/metadata/shared.js +11 -0
  92. package/dist/actions/metadata/shared.js.map +1 -0
  93. package/dist/actions/metadata/types.d.ts +38 -0
  94. package/dist/actions/metadata/types.d.ts.map +1 -0
  95. package/dist/actions/metadata/types.js +3 -0
  96. package/dist/actions/metadata/types.js.map +1 -0
  97. package/dist/actions/scheduled-job/create.action.d.ts +5 -0
  98. package/dist/actions/scheduled-job/create.action.d.ts.map +1 -0
  99. package/dist/actions/scheduled-job/create.action.js +56 -0
  100. package/dist/actions/scheduled-job/create.action.js.map +1 -0
  101. package/dist/actions/scheduled-job/delete.action.d.ts +15 -0
  102. package/dist/actions/scheduled-job/delete.action.d.ts.map +1 -0
  103. package/dist/actions/scheduled-job/delete.action.js +42 -0
  104. package/dist/actions/scheduled-job/delete.action.js.map +1 -0
  105. package/dist/actions/scheduled-job/get.action.d.ts +7 -0
  106. package/dist/actions/scheduled-job/get.action.d.ts.map +1 -0
  107. package/dist/actions/scheduled-job/get.action.js +23 -0
  108. package/dist/actions/scheduled-job/get.action.js.map +1 -0
  109. package/dist/actions/scheduled-job/index.d.ts +7 -0
  110. package/dist/actions/scheduled-job/index.d.ts.map +1 -0
  111. package/dist/actions/scheduled-job/index.js +29 -0
  112. package/dist/actions/scheduled-job/index.js.map +1 -0
  113. package/dist/actions/scheduled-job/list.action.d.ts +5 -0
  114. package/dist/actions/scheduled-job/list.action.d.ts.map +1 -0
  115. package/dist/actions/scheduled-job/list.action.js +18 -0
  116. package/dist/actions/scheduled-job/list.action.js.map +1 -0
  117. package/dist/actions/scheduled-job/shared.d.ts +30 -0
  118. package/dist/actions/scheduled-job/shared.d.ts.map +1 -0
  119. package/dist/actions/scheduled-job/shared.js +129 -0
  120. package/dist/actions/scheduled-job/shared.js.map +1 -0
  121. package/dist/actions/scheduled-job/types.d.ts +23 -0
  122. package/dist/actions/scheduled-job/types.d.ts.map +1 -0
  123. package/dist/actions/scheduled-job/types.js +3 -0
  124. package/dist/actions/scheduled-job/types.js.map +1 -0
  125. package/dist/actions/scheduled-job/update.action.d.ts +5 -0
  126. package/dist/actions/scheduled-job/update.action.d.ts.map +1 -0
  127. package/dist/actions/scheduled-job/update.action.js +68 -0
  128. package/dist/actions/scheduled-job/update.action.js.map +1 -0
  129. package/dist/actions/scheduled-job.action.d.ts +73 -0
  130. package/dist/actions/scheduled-job.action.d.ts.map +1 -0
  131. package/dist/actions/scheduled-job.action.js +355 -0
  132. package/dist/actions/scheduled-job.action.js.map +1 -0
  133. package/dist/actions/setup.action.js +1 -1
  134. package/dist/actions/setup.action.js.map +1 -1
  135. package/dist/actions/sync/index.d.ts +4 -0
  136. package/dist/actions/sync/index.d.ts.map +1 -0
  137. package/dist/actions/sync/index.js +23 -0
  138. package/dist/actions/sync/index.js.map +1 -0
  139. package/dist/actions/sync/run-flow.action.d.ts +8 -0
  140. package/dist/actions/sync/run-flow.action.d.ts.map +1 -0
  141. package/dist/actions/sync/run-flow.action.js +81 -0
  142. package/dist/actions/sync/run-flow.action.js.map +1 -0
  143. package/dist/actions/sync/run-job.action.d.ts +11 -0
  144. package/dist/actions/sync/run-job.action.d.ts.map +1 -0
  145. package/dist/actions/sync/run-job.action.js +75 -0
  146. package/dist/actions/sync/run-job.action.js.map +1 -0
  147. package/dist/actions/sync/types.d.ts +41 -0
  148. package/dist/actions/sync/types.d.ts.map +1 -0
  149. package/dist/actions/sync/types.js +3 -0
  150. package/dist/actions/sync/types.js.map +1 -0
  151. package/dist/actions/sync.action.d.ts +8 -47
  152. package/dist/actions/sync.action.d.ts.map +1 -1
  153. package/dist/actions/sync.action.js +29 -162
  154. package/dist/actions/sync.action.js.map +1 -1
  155. package/dist/actions/utils/action-names.d.ts +19 -6
  156. package/dist/actions/utils/action-names.d.ts.map +1 -1
  157. package/dist/actions/utils/action-names.js +19 -6
  158. package/dist/actions/utils/action-names.js.map +1 -1
  159. package/dist/actions/utils/define-action.d.ts +36 -0
  160. package/dist/actions/utils/define-action.d.ts.map +1 -0
  161. package/dist/actions/utils/define-action.js +43 -0
  162. package/dist/actions/utils/define-action.js.map +1 -0
  163. package/dist/actions/utils/errors.d.ts +54 -8
  164. package/dist/actions/utils/errors.d.ts.map +1 -1
  165. package/dist/actions/utils/errors.js +107 -14
  166. package/dist/actions/utils/errors.js.map +1 -1
  167. package/dist/actions/utils/helpers.d.ts.map +1 -1
  168. package/dist/actions/utils/helpers.js +2 -1
  169. package/dist/actions/utils/helpers.js.map +1 -1
  170. package/dist/actions/utils/metrics.d.ts +12 -0
  171. package/dist/actions/utils/metrics.d.ts.map +1 -0
  172. package/dist/actions/utils/metrics.js +12 -0
  173. package/dist/actions/utils/metrics.js.map +1 -0
  174. package/dist/actions/utils/middleware.d.ts +39 -0
  175. package/dist/actions/utils/middleware.d.ts.map +1 -0
  176. package/dist/actions/utils/middleware.js +85 -0
  177. package/dist/actions/utils/middleware.js.map +1 -0
  178. package/dist/actions/utils/types.d.ts +5 -4
  179. package/dist/actions/utils/types.d.ts.map +1 -1
  180. package/dist/adapters/base-adapter-handler.d.ts +10 -0
  181. package/dist/adapters/base-adapter-handler.d.ts.map +1 -1
  182. package/dist/adapters/base-adapter-handler.js +18 -34
  183. package/dist/adapters/base-adapter-handler.js.map +1 -1
  184. package/dist/browser.d.ts +2 -0
  185. package/dist/browser.d.ts.map +1 -1
  186. package/dist/browser.js +3 -1
  187. package/dist/browser.js.map +1 -1
  188. package/dist/clients/integration-config.client.d.ts +21 -0
  189. package/dist/clients/integration-config.client.d.ts.map +1 -0
  190. package/dist/clients/integration-config.client.js +44 -0
  191. package/dist/clients/integration-config.client.js.map +1 -0
  192. package/dist/context.d.ts +18 -3
  193. package/dist/context.d.ts.map +1 -1
  194. package/dist/context.js +21 -5
  195. package/dist/context.js.map +1 -1
  196. package/dist/index.d.ts +11 -0
  197. package/dist/index.d.ts.map +1 -1
  198. package/dist/index.js +30 -1
  199. package/dist/index.js.map +1 -1
  200. package/dist/interfaces/data-flow-spec.interface.d.ts +14 -21
  201. package/dist/interfaces/data-flow-spec.interface.d.ts.map +1 -1
  202. package/dist/interfaces/data-flow-spec.interface.js +10 -26
  203. package/dist/interfaces/data-flow-spec.interface.js.map +1 -1
  204. package/dist/interfaces/integration-capabilities.interface.d.ts +2 -2
  205. package/dist/interfaces/scheduled-job.interface.d.ts +40 -0
  206. package/dist/interfaces/scheduled-job.interface.d.ts.map +1 -0
  207. package/dist/interfaces/scheduled-job.interface.js +39 -0
  208. package/dist/interfaces/scheduled-job.interface.js.map +1 -0
  209. package/dist/services/dataflow.service.d.ts +13 -6
  210. package/dist/services/dataflow.service.d.ts.map +1 -1
  211. package/dist/services/dataflow.service.js +34 -57
  212. package/dist/services/dataflow.service.js.map +1 -1
  213. package/dist/services/sync-runner.d.ts +1 -0
  214. package/dist/services/sync-runner.d.ts.map +1 -1
  215. package/dist/services/sync-runner.js +7 -27
  216. package/dist/services/sync-runner.js.map +1 -1
  217. package/dist/types.d.ts +2 -0
  218. package/dist/types.d.ts.map +1 -1
  219. package/dist/types.js +4 -1
  220. package/dist/types.js.map +1 -1
  221. package/dist/utils/artifact-builder.d.ts +40 -15
  222. package/dist/utils/artifact-builder.d.ts.map +1 -1
  223. package/dist/utils/artifact-builder.js +92 -17
  224. package/dist/utils/artifact-builder.js.map +1 -1
  225. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.5.0]
4
+
5
+ **Action framework: typed errors, middleware, observability hooks.**
6
+
7
+ - `defineAction({ name, parseInput, handler, idempotent?, audit?, requireAdmin? })` wires a fixed middleware stack (metrics → logging → audit → requireAdmin) around each handler so cross-cutting concerns live in one place. Migrated `scheduled-job.{list,create}` as the reference; remaining actions keep their existing factory shape and still benefit from the dispatcher's new error mapping.
8
+ - Typed error hierarchy with `ErrorCategory` — `InvalidInputError`, `ForbiddenError`, `NotFoundError`, `ConflictError`, `PreconditionFailedError`, `NotImplementedError`, `UpstreamTransientError`, `UpstreamPermanentError`. Each carries the category that drives HTTP status (`categoryToStatus`) and a `retryable` flag echoed in the failure envelope. The dispatcher's hard-coded code switch is gone; bare `ActionError` now defaults to `internal` (500).
9
+ - `IntegrationContext` gains `requestId` (from `sked-request-id` header or auto-minted UUID) and `metrics` (pluggable `Metrics` sink; `noopMetrics` default). `BaseAdapterHandlerConfig` accepts a `metrics` impl.
10
+ - `actions/` restructured into one folder per group (`data-flow/`, `event/`, `metadata/`, `scheduled-job/`, `sync/`), one file per action, with `types.ts` + `shared.ts`. `capabilities` and `setup` stay flat (single-action groups).
11
+
12
+ ## [0.4.0] - 2026-05-28
13
+
14
+ **Integration-level scheduled jobs replace per-flow scheduled webhooks.**
15
+
16
+ - `SyncStrategy` collapses to realtime-only. Realtime flows carry `sync_config: { strategy: 'realtime', trigger_name?, trigger_type? }`; batch flows have `triggerConfig: null`. `interval_minutes` and `TriggerType.WEBHOOK` removed.
17
+ - Scheduled jobs (new). `tenant_integration.config` stores an ordered list of `ScheduledJob`s; each job provisions one PSS scheduled webhook that fires `sync.run-job`, which runs the job's `flow_ids` sequentially (continue-on-error). Job identity is `webhook_name`, derived from the display name on create and immutable after. A flow can belong to at most one job. Intervals: 1–60 minutes or 1–24 hours.
18
+ - Action surface: added `scheduled-job.{create,update,delete,list,get}` and `sync.run-job` (header `sked-scheduled-job-name`); removed `sync.push`, `sync.scheduled-pull`, `sync.run-all-flows`. Mutations are admin-gated and two-phase fail-closed via the new `IntegrationConfigClient`.
19
+ - `dataFlow.activate` / `.deactivate` provision/tear down a triggered action only for realtime flows; batch flows are status-only.
20
+ - Artifact name caps split: per-flow realtime artifact 255 chars (system-derived); scheduled-job webhook 200 chars (user-supplied name).
21
+ - New browser-safe types and helpers: `ScheduledJob`, `IntegrationConfig`, `JobIntervalUnit`, `asIntegrationConfig`, plus `buildJobArtifactName`, `jobIntervalToMinutes`, and `functionCallbackUrl`.
22
+ - `event.on-skedulo` now parses the real ElasticServer triggered-action envelope and processes records against the flow named by `sked-data-flow-id` (`SyncRunner.handleFlowEvent`, no object-level fan-out).
23
+ - Per-flow actions read `dataFlowId` from the `sked-data-flow-id` header (`parseInput` `meta`), fixing the prior `INVALID_INPUT` on scheduled callbacks.
24
+ - `metadata.get-sample-records` and `PreviewService` now query the object's mapped fields, not just `UID`.
25
+ - No migration. Existing scheduled flows must be re-created as batch flows and assigned to a scheduled job.
26
+
3
27
  ## [0.3.3] - 2026-05-27
4
28
 
5
29
  - **Single-dispatch handler** — one POST route → `BaseAdapterHandler.dispatch`, action selected via the `sked-integration-action` header; `ACTION_HEADER` / `ACTIONS` exported (incl. `/browser`) so the UI imports them instead of hardcoding.
package/README.md CHANGED
@@ -87,9 +87,14 @@ Tenant integration functions expose a **single POST endpoint** that forwards the
87
87
  ```ts
88
88
  type ActionResult<T> =
89
89
  | { ok: true; result: T }
90
- | { ok: false; error: { code: string; message: string; details?: unknown } };
90
+ | {
91
+ ok: false;
92
+ error: { code: string; message: string; details?: unknown; retryable?: boolean };
93
+ };
91
94
  ```
92
95
 
96
+ `retryable` tells callers (PSS, IS, UI) whether a retry could succeed. It comes from the thrown error's `ErrorCategory` — see [Errors](#errors) below.
97
+
93
98
  ### Server wiring
94
99
 
95
100
  ```typescript
@@ -142,42 +147,101 @@ const flow = await dispatch(ACTIONS.dataFlow.activate, { id: 42 });
142
147
 
143
148
  `ACTIONS` is a frozen, dot-grouped map of all action names (`ACTIONS.dataFlow.activate`, `ACTIONS.metadata.getObjects`, …). `ACTION_HEADER` is the literal header name (`sked-integration-action`).
144
149
 
145
- ## Sync strategies
150
+ ### Authoring an action
151
+
152
+ Use `defineAction` to wire the standard middleware stack (metrics → logging → audit → requireAdmin) around the handler:
153
+
154
+ ```typescript
155
+ import { defineAction, ACTIONS, ConflictError } from '@skedulo/integration-sdk';
156
+
157
+ export const myAction = defineAction({
158
+ name: ACTIONS.scheduledJob.create,
159
+ parseInput: parseCreateInput,
160
+ requireAdmin: true, // 403 ForbiddenError if caller isn't admin
161
+ audit: true, // emits an audit log line on success
162
+ idempotent: false, // surfaced to callers so PSS doesn't blind-retry
163
+ handler: async (input, ctx) => {
164
+ if (await exists(input.name)) {
165
+ throw new ConflictError('JOB_ALREADY_EXISTS', `'${input.name}' already exists`);
166
+ }
167
+ return createJob(ctx, input);
168
+ },
169
+ });
170
+ ```
171
+
172
+ Every action receives `ctx.requestId` (correlation id) and `ctx.metrics` (counter/histogram sink). Inject a real metrics impl via `BaseAdapterHandlerConfig.metrics`; the default is a no-op.
173
+
174
+ ### Errors
175
+
176
+ Throw a typed subclass instead of `new ActionError(CODE, ...)`. The dispatcher maps the error's `category` to HTTP status and echoes `retryable` in the envelope.
177
+
178
+ | Subclass | Category | HTTP | Retryable |
179
+ |---------------------------|-----------------------|-----:|:---------:|
180
+ | `InvalidInputError` | `invalid_input` | 422 | no |
181
+ | `ForbiddenError` | `forbidden` | 403 | no |
182
+ | `NotFoundError` | `not_found` | 404 | no |
183
+ | `ConflictError` | `conflict` | 409 | no |
184
+ | `PreconditionFailedError` | `precondition_failed` | 412 | no |
185
+ | `NotImplementedError` | `not_implemented` | 501 | no |
186
+ | `UpstreamTransientError` | `upstream_transient` | 503 | **yes** |
187
+ | `UpstreamPermanentError` | `upstream_permanent` | 424 | no |
188
+ | bare `ActionError` | `internal` | 500 | no |
189
+
190
+ ## Sync model
146
191
 
147
- A data flow's trigger config is persisted as JSONB under a single `sync_config` key:
192
+ There are two ways a data flow runs:
193
+
194
+ 1. **Realtime** (per-flow triggered action) — the flow's `triggerConfig` carries `sync_config: { strategy: 'realtime' }`. Activation provisions one PSS triggered action; record changes dispatch `event.on-skedulo` (Skedulo → vendor) or `event.on-vendor` (vendor → Skedulo) immediately.
195
+ 2. **Batch** (integration-level scheduled jobs) — the flow has **no** `sync_config` (`triggerConfig` is `null`). Operators group batch flows into ordered **scheduled jobs** at the integration level. Each job provisions one PSS scheduled webhook that fires `sync.run-job`, which runs the job's `flow_ids` sequentially (continue-on-error).
148
196
 
149
197
  ```jsonc
198
+ // Realtime flow — triggerConfig
150
199
  {
151
200
  "sync_config": {
152
- "strategy": "scheduled", // "scheduled" | "realtime"
153
- "interval_minutes": 15, // scheduled only
154
- "trigger_name": "sked-int-…", // set by the SDK on activate
155
- "trigger_type": "webhook" // "webhook" | "triggered_action"
201
+ "strategy": "realtime",
202
+ "trigger_name": "sked-int-…", // set by the SDK on activate
203
+ "trigger_type": "triggered_action"
156
204
  }
157
205
  }
206
+
207
+ // Scheduled jobs — tenant_integration.config (an IntegrationConfig)
208
+ {
209
+ "scheduled_jobs": [
210
+ {
211
+ "webhook_name": "sked-int-hubspot-job-nightly-crm", // identity + ES artifact name
212
+ "name": "Nightly CRM",
213
+ "interval_value": 5,
214
+ "interval_unit": "minutes", // "minutes" (1–60) | "hours" (1–24)
215
+ "flow_ids": [12, 8, 3], // ordered; unique across jobs (J5)
216
+ "enabled": true
217
+ }
218
+ ]
219
+ }
158
220
  ```
159
221
 
160
- The **strategy** only says *when* a flow fires; **direction** (`sourceSystem === 'skedulo'` ⇒ outbound) decides push vs pull:
222
+ Narrow a raw `triggerConfig` with `asSyncConfig(triggerConfig)` → `SyncConfig | null` (returns non-null only for realtime). Narrow a raw config with `asIntegrationConfig(value)` → `IntegrationConfig` (always returns `{ scheduled_jobs: [] }` for null/garbage; drops malformed entries).
161
223
 
162
- | Strategy | Direction | PSS artifact | Dispatched action |
163
- |---|---|---|---|
164
- | `scheduled` | outbound (Skedulo → vendor) | scheduled webhook | `sync.push` |
165
- | `scheduled` | inbound (vendor → Skedulo) | scheduled webhook | `sync.scheduled-pull` |
166
- | `realtime` | outbound (Skedulo → vendor on record change) | triggered action | `event.on-skedulo` |
224
+ ### Per-flow lifecycle (realtime only)
167
225
 
168
- Narrow a raw `triggerConfig` with `asSyncConfig(triggerConfig)` → `SyncConfig | null` rather than reading the JSONB directly.
226
+ The SDK provisions the triggered action on `dataFlow.activate` and tears it down on `dataFlow.deactivate`, two-phase fail-closed, via the PSS `ArtifactClient` (`ArtifactType.TRIGGERED_ACTION`). Batch flows are status-only — no artifact, no provisioning. Each realtime artifact is named deterministically:
169
227
 
170
- The SDK owns the lifecycle of the Skedulo-side artifact for each flow, provisioned through the PSS `ArtifactClient` (`ArtifactType.WEBHOOK` / `TRIGGERED_ACTION`). On `dataFlow.activate` it creates the appropriate webhook or triggered action and records its name/type in `sync_config`; on `dataFlow.deactivate` it deletes the artifact and clears those fields. Both are **two-phase fail-closed**: the artifact is provisioned first, then the IS record is updated, with compensating cleanup if the second phase fails — so an active flow always has its artifact and a deactivated flow never does.
228
+ ```text
229
+ sked-int-<integrationType>-<sourceObject>-to-<targetObject>-flow<id>
230
+ ```
171
231
 
172
- Each artifact is named deterministically:
232
+ ### Scheduled-job lifecycle
173
233
 
234
+ `scheduled-job.create` / `.update` / `.delete` (admin-gated) write the `IntegrationConfig` via the SDK's `IntegrationConfigClient` (config-first, two-phase fail-closed), then reconcile a PSS webhook named:
235
+
236
+ ```text
237
+ sked-int-<integrationType>-job-<slug(name)>
174
238
  ```
175
- sked-int-<integrationType>-<sourceObject>-to-<targetObject>-flow<id>
176
- ```
177
239
 
178
- The name is used as an idempotency key, capped at 100 characters (the SDK throws rather than truncating silently), and lets operators correlate artifacts back to flows. The callback URL baked into each artifact is `{{ SKEDULO_API_URL }}/function/<type>/<type>` — the platform substitutes the tenant API host when the artifact fires.
240
+ The webhook posts `sync.run-job` with the `sked-scheduled-job-name` header carrying the `webhook_name`. The SDK looks up the job in config and runs each flow in order; one flow failing does not stop the others.
241
+
242
+ Artifact names act as idempotency keys and are capped (the SDK throws rather than truncating silently): **255 chars** for per-flow realtime artifacts (system-derived) and **200 chars** for scheduled-job webhooks (derived from the user-supplied job name, so a long display name is rejected up-front). The callback URL baked into each artifact is `{{ SKEDULO_API_URL }}/function/<type>/<type>` — the platform substitutes the tenant API host when the artifact fires.
179
243
 
180
- See [docs/DATA-FLOW-LIFECYCLE.md](./docs/DATA-FLOW-LIFECYCLE.md) for the full activate/deactivate flow.
244
+ See [docs/DATA-FLOW-LIFECYCLE.md](./docs/DATA-FLOW-LIFECYCLE.md) for the full activate/deactivate flow and the scheduled-job action surface.
181
245
 
182
246
  ## Development
183
247
 
@@ -1 +1 @@
1
- {"version":3,"file":"action-registry.d.ts","sourceRoot":"","sources":["../../src/actions/action-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AA0BpE,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,QAAQ,GACT,EAAE,uBAAuB,GAAG,cAAc,CA8B1C;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,cAAc,CAOxF"}
1
+ {"version":3,"file":"action-registry.d.ts","sourceRoot":"","sources":["../../src/actions/action-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AA4BpE,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,QAAQ,GACT,EAAE,uBAAuB,GAAG,cAAc,CAiC1C;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,cAAc,CAOxF"}
@@ -4,10 +4,11 @@ exports.buildActionRegistry = buildActionRegistry;
4
4
  exports.registerActions = registerActions;
5
5
  const capabilities_action_1 = require("./capabilities.action");
6
6
  const setup_action_1 = require("./setup.action");
7
- const metadata_action_1 = require("./metadata.action");
8
- const sync_action_1 = require("./sync.action");
9
- const event_action_1 = require("./event.action");
10
- const data_flow_action_1 = require("./data-flow.action");
7
+ const metadata_1 = require("./metadata");
8
+ const sync_1 = require("./sync");
9
+ const scheduled_job_1 = require("./scheduled-job");
10
+ const event_1 = require("./event");
11
+ const data_flow_1 = require("./data-flow");
11
12
  /**
12
13
  * Build the default action registry for a tenant integration function.
13
14
  * Groups by dependency shape: vendor pass-through (adapter only), Skedulo
@@ -19,29 +20,32 @@ function buildActionRegistry({ adapter, registry, }) {
19
20
  return registerActions([
20
21
  // Vendor pass-through — adapter only.
21
22
  (0, capabilities_action_1.makeCapabilitiesAction)(adapter),
22
- (0, metadata_action_1.makeGetObjectsAction)(adapter),
23
- (0, metadata_action_1.makeGetFieldsAction)(adapter),
24
- (0, metadata_action_1.makeGetTemplatesAction)(adapter),
25
- (0, metadata_action_1.makeGetSampleApisAction)(adapter),
26
- (0, metadata_action_1.makeGetSampleRecordsAction)(adapter),
23
+ (0, metadata_1.makeGetObjectsAction)(adapter),
24
+ (0, metadata_1.makeGetFieldsAction)(adapter),
25
+ (0, metadata_1.makeGetTemplatesAction)(adapter),
26
+ (0, metadata_1.makeGetSampleApisAction)(adapter),
27
+ (0, metadata_1.makeGetSampleRecordsAction)(adapter),
27
28
  // Skedulo bootstrap.
28
29
  (0, setup_action_1.makeSetupStatusAction)(),
29
30
  (0, setup_action_1.makeSetupCreateAction)(adapter),
30
- // Sync + event — need source/target lookup via registry.
31
- (0, sync_action_1.makePushAction)(syncDeps),
32
- (0, sync_action_1.makeScheduledPullAction)(syncDeps),
33
- (0, sync_action_1.makeRunFlowAction)(syncDeps),
34
- (0, sync_action_1.makeRunAllFlowsAction)(syncDeps),
35
- (0, event_action_1.makeOnSkeduloEventAction)(syncDeps),
36
- (0, event_action_1.makeOnVendorEventAction)(syncDeps),
31
+ // Sync + scheduled jobs + event — need source/target lookup via registry.
32
+ (0, sync_1.makeRunFlowAction)(syncDeps),
33
+ (0, sync_1.makeRunJobAction)(syncDeps),
34
+ (0, scheduled_job_1.makeScheduledJobListAction)(syncDeps),
35
+ (0, scheduled_job_1.makeScheduledJobGetAction)(syncDeps),
36
+ (0, scheduled_job_1.makeScheduledJobCreateAction)(syncDeps),
37
+ (0, scheduled_job_1.makeScheduledJobUpdateAction)(syncDeps),
38
+ (0, scheduled_job_1.makeScheduledJobDeleteAction)(syncDeps),
39
+ (0, event_1.makeOnSkeduloEventAction)(syncDeps),
40
+ (0, event_1.makeOnVendorEventAction)(syncDeps),
37
41
  // SDK orchestration — context-only.
38
- (0, data_flow_action_1.makeDataFlowCreateAction)(),
39
- (0, data_flow_action_1.makeDataFlowUpdateAction)(),
40
- (0, data_flow_action_1.makeDataFlowDeleteAction)(),
41
- (0, data_flow_action_1.makeDataFlowActivateAction)(),
42
- (0, data_flow_action_1.makeDataFlowDeactivateAction)(),
43
- (0, data_flow_action_1.makeDataFlowGetAction)(),
44
- (0, data_flow_action_1.makeDataFlowListAction)(),
42
+ (0, data_flow_1.makeDataFlowCreateAction)(),
43
+ (0, data_flow_1.makeDataFlowUpdateAction)(),
44
+ (0, data_flow_1.makeDataFlowDeleteAction)(),
45
+ (0, data_flow_1.makeDataFlowActivateAction)(),
46
+ (0, data_flow_1.makeDataFlowDeactivateAction)(),
47
+ (0, data_flow_1.makeDataFlowGetAction)(),
48
+ (0, data_flow_1.makeDataFlowListAction)(),
45
49
  ]);
46
50
  }
47
51
  /** Build a Map from a list of actions, rejecting duplicate names. */
@@ -1 +1 @@
1
- {"version":3,"file":"action-registry.js","sourceRoot":"","sources":["../../src/actions/action-registry.ts"],"names":[],"mappings":";;AAwCA,kDAiCC;AAGD,0CAOC;AAjFD,+DAA+D;AAC/D,iDAA8E;AAC9E,uDAM2B;AAC3B,+CAKuB;AACvB,iDAAmF;AACnF,yDAQ4B;AAQ5B;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,QAAQ,GACgB;IACxB,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAEvC,OAAO,eAAe,CAAC;QACrB,sCAAsC;QACtC,IAAA,4CAAsB,EAAC,OAAO,CAAC;QAC/B,IAAA,sCAAoB,EAAC,OAAO,CAAC;QAC7B,IAAA,qCAAmB,EAAC,OAAO,CAAC;QAC5B,IAAA,wCAAsB,EAAC,OAAO,CAAC;QAC/B,IAAA,yCAAuB,EAAC,OAAO,CAAC;QAChC,IAAA,4CAA0B,EAAC,OAAO,CAAC;QACnC,qBAAqB;QACrB,IAAA,oCAAqB,GAAE;QACvB,IAAA,oCAAqB,EAAC,OAAO,CAAC;QAC9B,yDAAyD;QACzD,IAAA,4BAAc,EAAC,QAAQ,CAAC;QACxB,IAAA,qCAAuB,EAAC,QAAQ,CAAC;QACjC,IAAA,+BAAiB,EAAC,QAAQ,CAAC;QAC3B,IAAA,mCAAqB,EAAC,QAAQ,CAAC;QAC/B,IAAA,uCAAwB,EAAC,QAAQ,CAAC;QAClC,IAAA,sCAAuB,EAAC,QAAQ,CAAC;QACjC,oCAAoC;QACpC,IAAA,2CAAwB,GAAE;QAC1B,IAAA,2CAAwB,GAAE;QAC1B,IAAA,2CAAwB,GAAE;QAC1B,IAAA,6CAA0B,GAAE;QAC5B,IAAA,+CAA4B,GAAE;QAC9B,IAAA,wCAAqB,GAAE;QACvB,IAAA,yCAAsB,GAAE;KACzB,CAAC,CAAC;AACL,CAAC;AAED,qEAAqE;AACrE,SAAgB,eAAe,CAAC,OAAwC;IACtE,MAAM,CAAC,GAAmB,IAAI,GAAG,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"action-registry.js","sourceRoot":"","sources":["../../src/actions/action-registry.ts"],"names":[],"mappings":";;AA0CA,kDAoCC;AAGD,0CAOC;AAtFD,+DAA+D;AAC/D,iDAA8E;AAC9E,yCAMoB;AACpB,iCAA6D;AAC7D,mDAMyB;AACzB,mCAA4E;AAC5E,2CAQqB;AAQrB;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,QAAQ,GACgB;IACxB,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAEvC,OAAO,eAAe,CAAC;QACrB,sCAAsC;QACtC,IAAA,4CAAsB,EAAC,OAAO,CAAC;QAC/B,IAAA,+BAAoB,EAAC,OAAO,CAAC;QAC7B,IAAA,8BAAmB,EAAC,OAAO,CAAC;QAC5B,IAAA,iCAAsB,EAAC,OAAO,CAAC;QAC/B,IAAA,kCAAuB,EAAC,OAAO,CAAC;QAChC,IAAA,qCAA0B,EAAC,OAAO,CAAC;QACnC,qBAAqB;QACrB,IAAA,oCAAqB,GAAE;QACvB,IAAA,oCAAqB,EAAC,OAAO,CAAC;QAC9B,0EAA0E;QAC1E,IAAA,wBAAiB,EAAC,QAAQ,CAAC;QAC3B,IAAA,uBAAgB,EAAC,QAAQ,CAAC;QAC1B,IAAA,0CAA0B,EAAC,QAAQ,CAAC;QACpC,IAAA,yCAAyB,EAAC,QAAQ,CAAC;QACnC,IAAA,4CAA4B,EAAC,QAAQ,CAAC;QACtC,IAAA,4CAA4B,EAAC,QAAQ,CAAC;QACtC,IAAA,4CAA4B,EAAC,QAAQ,CAAC;QACtC,IAAA,gCAAwB,EAAC,QAAQ,CAAC;QAClC,IAAA,+BAAuB,EAAC,QAAQ,CAAC;QACjC,oCAAoC;QACpC,IAAA,oCAAwB,GAAE;QAC1B,IAAA,oCAAwB,GAAE;QAC1B,IAAA,oCAAwB,GAAE;QAC1B,IAAA,sCAA0B,GAAE;QAC5B,IAAA,wCAA4B,GAAE;QAC9B,IAAA,iCAAqB,GAAE;QACvB,IAAA,kCAAsB,GAAE;KACzB,CAAC,CAAC;AACL,CAAC;AAED,qEAAqE;AACrE,SAAgB,eAAe,CAAC,OAAwC;IACtE,MAAM,CAAC,GAAmB,IAAI,GAAG,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { DataFlow } from '../../interfaces/data-flow-spec.interface';
2
+ import type { Action } from '../utils/types';
3
+ import type { DataFlowActivateInput } from './types';
4
+ /**
5
+ * Activate a data flow. Two-phase fail-closed: ES artifact created first,
6
+ * then IS PATCH; if PATCH fails the ES artifact is compensatingly deleted.
7
+ * See `DataFlowService.activate` for full semantics.
8
+ */
9
+ export declare function makeDataFlowActivateAction(): Action<DataFlowActivateInput, DataFlow>;
10
+ //# sourceMappingURL=activate.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activate.action.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/activate.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAUpF"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeDataFlowActivateAction = makeDataFlowActivateAction;
4
+ const action_names_1 = require("../utils/action-names");
5
+ const shared_1 = require("./shared");
6
+ /**
7
+ * Activate a data flow. Two-phase fail-closed: ES artifact created first,
8
+ * then IS PATCH; if PATCH fails the ES artifact is compensatingly deleted.
9
+ * See `DataFlowService.activate` for full semantics.
10
+ */
11
+ function makeDataFlowActivateAction() {
12
+ return {
13
+ name: action_names_1.ACTIONS.dataFlow.activate,
14
+ parseInput(raw) {
15
+ return { id: (0, shared_1.parseId)(raw) };
16
+ },
17
+ async handler(input, ctx) {
18
+ return ctx.dataFlowService.activate(input.id, ctx);
19
+ },
20
+ };
21
+ }
22
+ //# sourceMappingURL=activate.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activate.action.js","sourceRoot":"","sources":["../../../src/actions/data-flow/activate.action.ts"],"names":[],"mappings":";;AAWA,gEAUC;AApBD,wDAAgD;AAEhD,qCAAmC;AAGnC;;;;GAIG;AACH,SAAgB,0BAA0B;IACxC,OAAO;QACL,IAAI,EAAE,sBAAO,CAAC,QAAQ,CAAC,QAAQ;QAC/B,UAAU,CAAC,GAAG;YACZ,OAAO,EAAE,EAAE,EAAE,IAAA,gBAAO,EAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,OAAO,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { CreateDataFlowInput } from '../../clients/dataflow.client';
2
+ import type { DataFlow } from '../../interfaces/data-flow-spec.interface';
3
+ import type { Action } from '../utils/types';
4
+ /**
5
+ * Create a new data flow. New flows start INACTIVE per IS schema — no ES
6
+ * artifact is created here. Call `data-flow.activate` to provision the ES side.
7
+ */
8
+ export declare function makeDataFlowCreateAction(): Action<CreateDataFlowInput, DataFlow>;
9
+ //# sourceMappingURL=create.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.action.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/create.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AAG1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAsC7C;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAUhF"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeDataFlowCreateAction = makeDataFlowCreateAction;
4
+ const action_names_1 = require("../utils/action-names");
5
+ const errors_1 = require("../utils/errors");
6
+ const shared_1 = require("./shared");
7
+ function parseCreateInput(raw) {
8
+ var _a, _b, _c, _d, _e, _f, _g;
9
+ const obj = (raw !== null && raw !== void 0 ? raw : {});
10
+ const { name, sourceObject, targetObject, matchKeyField } = obj;
11
+ if (!(0, shared_1.isNonEmptyString)(name)) {
12
+ throw new errors_1.InvalidInputError('name must be a non-empty string');
13
+ }
14
+ if (!(0, shared_1.isNonEmptyString)(sourceObject)) {
15
+ throw new errors_1.InvalidInputError('sourceObject must be a non-empty string');
16
+ }
17
+ if (!(0, shared_1.isNonEmptyString)(targetObject)) {
18
+ throw new errors_1.InvalidInputError('targetObject must be a non-empty string');
19
+ }
20
+ if (!(0, shared_1.isNonEmptyString)(matchKeyField)) {
21
+ throw new errors_1.InvalidInputError('matchKeyField must be a non-empty string');
22
+ }
23
+ return {
24
+ // Authoritative integrationType is injected by the handler from context;
25
+ // placeholder here keeps the parsed shape well-typed.
26
+ integrationType: '',
27
+ name,
28
+ description: (_a = obj.description) !== null && _a !== void 0 ? _a : null,
29
+ sourceSystem: (_b = obj.sourceSystem) !== null && _b !== void 0 ? _b : null,
30
+ targetSystem: (_c = obj.targetSystem) !== null && _c !== void 0 ? _c : null,
31
+ sourceObject,
32
+ targetObject,
33
+ triggerConfig: (_d = obj.triggerConfig) !== null && _d !== void 0 ? _d : null,
34
+ mappingConfig: (_e = obj.mappingConfig) !== null && _e !== void 0 ? _e : null,
35
+ filter: (_f = obj.filter) !== null && _f !== void 0 ? _f : null,
36
+ matchKeyField,
37
+ executionOrder: (_g = obj.executionOrder) !== null && _g !== void 0 ? _g : null,
38
+ };
39
+ }
40
+ /**
41
+ * Create a new data flow. New flows start INACTIVE per IS schema — no ES
42
+ * artifact is created here. Call `data-flow.activate` to provision the ES side.
43
+ */
44
+ function makeDataFlowCreateAction() {
45
+ return {
46
+ name: action_names_1.ACTIONS.dataFlow.create,
47
+ parseInput: parseCreateInput,
48
+ async handler(input, ctx) {
49
+ // IS resolves tenantIntegrationId from integrationType + tenantId (token);
50
+ // take integrationType authoritatively from this function's context.
51
+ return ctx.dataFlowService.create(Object.assign(Object.assign({}, input), { integrationType: ctx.integrationType }));
52
+ },
53
+ };
54
+ }
55
+ //# sourceMappingURL=create.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.action.js","sourceRoot":"","sources":["../../../src/actions/data-flow/create.action.ts"],"names":[],"mappings":";;AA8CA,4DAUC;AAtDD,wDAAgD;AAChD,4CAAoD;AAEpD,qCAA4C;AAE5C,SAAS,gBAAgB,CAAC,GAAY;;IACpC,MAAM,GAAG,GAAG,CAAC,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,EAAE,CAA4B,CAAC;IACnD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC;IAEhE,IAAI,CAAC,IAAA,yBAAgB,EAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,0BAAiB,CAAC,iCAAiC,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,IAAA,yBAAgB,EAAC,YAAY,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,0BAAiB,CAAC,yCAAyC,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,IAAA,yBAAgB,EAAC,YAAY,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,0BAAiB,CAAC,yCAAyC,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,IAAA,yBAAgB,EAAC,aAAa,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,0BAAiB,CAAC,0CAA0C,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO;QACL,yEAAyE;QACzE,sDAAsD;QACtD,eAAe,EAAE,EAAE;QACnB,IAAI;QACJ,WAAW,EAAE,MAAC,GAAG,CAAC,WAAyC,mCAAI,IAAI;QACnE,YAAY,EAAE,MAAC,GAAG,CAAC,YAA0C,mCAAI,IAAI;QACrE,YAAY,EAAE,MAAC,GAAG,CAAC,YAA0C,mCAAI,IAAI;QACrE,YAAY;QACZ,YAAY;QACZ,aAAa,EAAE,MAAC,GAAG,CAAC,aAA4D,mCAAI,IAAI;QACxF,aAAa,EAAE,MAAC,GAAG,CAAC,aAAsD,mCAAI,IAAI;QAClF,MAAM,EAAE,MAAC,GAAG,CAAC,MAAwC,mCAAI,IAAI;QAC7D,aAAa;QACb,cAAc,EAAE,MAAC,GAAG,CAAC,cAA4C,mCAAI,IAAI;KAC1E,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,wBAAwB;IACtC,OAAO;QACL,IAAI,EAAE,sBAAO,CAAC,QAAQ,CAAC,MAAM;QAC7B,UAAU,EAAE,gBAAgB;QAC5B,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,2EAA2E;YAC3E,qEAAqE;YACrE,OAAO,GAAG,CAAC,eAAe,CAAC,MAAM,iCAAM,KAAK,KAAE,eAAe,EAAE,GAAG,CAAC,eAAe,IAAG,CAAC;QACxF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { DataFlow } from '../../interfaces/data-flow-spec.interface';
2
+ import type { Action } from '../utils/types';
3
+ import type { DataFlowDeactivateInput } from './types';
4
+ /**
5
+ * Deactivate a data flow. Deletes the artifact (404 = success) and clears
6
+ * `trigger_name`/`trigger_type` from `sync_config` in IS.
7
+ */
8
+ export declare function makeDataFlowDeactivateAction(): Action<DataFlowDeactivateInput, DataFlow>;
9
+ //# sourceMappingURL=deactivate.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deactivate.action.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/deactivate.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAUxF"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeDataFlowDeactivateAction = makeDataFlowDeactivateAction;
4
+ const action_names_1 = require("../utils/action-names");
5
+ const shared_1 = require("./shared");
6
+ /**
7
+ * Deactivate a data flow. Deletes the artifact (404 = success) and clears
8
+ * `trigger_name`/`trigger_type` from `sync_config` in IS.
9
+ */
10
+ function makeDataFlowDeactivateAction() {
11
+ return {
12
+ name: action_names_1.ACTIONS.dataFlow.deactivate,
13
+ parseInput(raw) {
14
+ return { id: (0, shared_1.parseId)(raw) };
15
+ },
16
+ async handler(input, ctx) {
17
+ return ctx.dataFlowService.deactivate(input.id, ctx);
18
+ },
19
+ };
20
+ }
21
+ //# sourceMappingURL=deactivate.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deactivate.action.js","sourceRoot":"","sources":["../../../src/actions/data-flow/deactivate.action.ts"],"names":[],"mappings":";;AAUA,oEAUC;AAnBD,wDAAgD;AAEhD,qCAAmC;AAGnC;;;GAGG;AACH,SAAgB,4BAA4B;IAC1C,OAAO;QACL,IAAI,EAAE,sBAAO,CAAC,QAAQ,CAAC,UAAU;QACjC,UAAU,CAAC,GAAG;YACZ,OAAO,EAAE,EAAE,EAAE,IAAA,gBAAO,EAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,OAAO,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Action } from '../utils/types';
2
+ import type { DataFlowDeleteInput } from './types';
3
+ /**
4
+ * Delete a data flow. If currently ACTIVE (has a provisioned artifact),
5
+ * deactivate first so the artifact is cleaned up, then delete from IS.
6
+ */
7
+ export declare function makeDataFlowDeleteAction(): Action<DataFlowDeleteInput, {
8
+ id: number;
9
+ }>;
10
+ //# sourceMappingURL=delete.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.action.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/delete.action.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,mBAAmB,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBtF"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeDataFlowDeleteAction = makeDataFlowDeleteAction;
4
+ const data_flow_spec_interface_1 = require("../../interfaces/data-flow-spec.interface");
5
+ const action_names_1 = require("../utils/action-names");
6
+ const errors_1 = require("../utils/errors");
7
+ const shared_1 = require("./shared");
8
+ /**
9
+ * Delete a data flow. If currently ACTIVE (has a provisioned artifact),
10
+ * deactivate first so the artifact is cleaned up, then delete from IS.
11
+ */
12
+ function makeDataFlowDeleteAction() {
13
+ return {
14
+ name: action_names_1.ACTIONS.dataFlow.delete,
15
+ parseInput(raw) {
16
+ return { id: (0, shared_1.parseId)(raw) };
17
+ },
18
+ async handler(input, ctx) {
19
+ var _a;
20
+ const flow = await ctx.dataFlowService.getFlowById(input.id);
21
+ if (!flow) {
22
+ throw new errors_1.NotFoundError('FLOW_NOT_FOUND', `Flow ${input.id} not found`);
23
+ }
24
+ const sc = (0, data_flow_spec_interface_1.asSyncConfig)((_a = flow.triggerConfig) !== null && _a !== void 0 ? _a : null);
25
+ if (sc === null || sc === void 0 ? void 0 : sc.trigger_name) {
26
+ await ctx.dataFlowService.deactivate(input.id, ctx);
27
+ }
28
+ await ctx.dataFlowService.delete(input.id);
29
+ return { id: input.id };
30
+ },
31
+ };
32
+ }
33
+ //# sourceMappingURL=delete.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.action.js","sourceRoot":"","sources":["../../../src/actions/data-flow/delete.action.ts"],"names":[],"mappings":";;AAWA,4DAmBC;AA9BD,wFAAyE;AACzE,wDAAgD;AAChD,4CAAgD;AAEhD,qCAAmC;AAGnC;;;GAGG;AACH,SAAgB,wBAAwB;IACtC,OAAO;QACL,IAAI,EAAE,sBAAO,CAAC,QAAQ,CAAC,MAAM;QAC7B,UAAU,CAAC,GAAG;YACZ,OAAO,EAAE,EAAE,EAAE,IAAA,gBAAO,EAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;;YACtB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,sBAAa,CAAC,gBAAgB,EAAE,QAAQ,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC;YAC1E,CAAC;YACD,MAAM,EAAE,GAAG,IAAA,uCAAY,EAAC,MAAA,IAAI,CAAC,aAAa,mCAAI,IAAI,CAAC,CAAC;YACpD,IAAI,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,YAAY,EAAE,CAAC;gBACrB,MAAM,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3C,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DataFlow } from '../../interfaces/data-flow-spec.interface';
2
+ import type { Action } from '../utils/types';
3
+ import type { DataFlowGetInput } from './types';
4
+ export declare function makeDataFlowGetAction(): Action<DataFlowGetInput, DataFlow>;
5
+ //# sourceMappingURL=get.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.action.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/get.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AAG1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAc1E"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeDataFlowGetAction = makeDataFlowGetAction;
4
+ const action_names_1 = require("../utils/action-names");
5
+ const errors_1 = require("../utils/errors");
6
+ const shared_1 = require("./shared");
7
+ function makeDataFlowGetAction() {
8
+ return {
9
+ name: action_names_1.ACTIONS.dataFlow.get,
10
+ parseInput(raw) {
11
+ return { id: (0, shared_1.parseId)(raw) };
12
+ },
13
+ async handler(input, ctx) {
14
+ const flow = await ctx.dataFlowService.getFlowById(input.id);
15
+ if (!flow) {
16
+ throw new errors_1.NotFoundError('FLOW_NOT_FOUND', `Flow ${input.id} not found`);
17
+ }
18
+ return flow;
19
+ },
20
+ };
21
+ }
22
+ //# sourceMappingURL=get.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.action.js","sourceRoot":"","sources":["../../../src/actions/data-flow/get.action.ts"],"names":[],"mappings":";;AAOA,sDAcC;AApBD,wDAAgD;AAChD,4CAAgD;AAEhD,qCAAmC;AAGnC,SAAgB,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,sBAAO,CAAC,QAAQ,CAAC,GAAG;QAC1B,UAAU,CAAC,GAAG;YACZ,OAAO,EAAE,EAAE,EAAE,IAAA,gBAAO,EAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,sBAAa,CAAC,gBAAgB,EAAE,QAAQ,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export * from './types';
2
+ export { makeDataFlowCreateAction } from './create.action';
3
+ export { makeDataFlowUpdateAction } from './update.action';
4
+ export { makeDataFlowDeleteAction } from './delete.action';
5
+ export { makeDataFlowActivateAction } from './activate.action';
6
+ export { makeDataFlowDeactivateAction } from './deactivate.action';
7
+ export { makeDataFlowGetAction } from './get.action';
8
+ export { makeDataFlowListAction } from './list.action';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.makeDataFlowListAction = exports.makeDataFlowGetAction = exports.makeDataFlowDeactivateAction = exports.makeDataFlowActivateAction = exports.makeDataFlowDeleteAction = exports.makeDataFlowUpdateAction = exports.makeDataFlowCreateAction = void 0;
18
+ __exportStar(require("./types"), exports);
19
+ var create_action_1 = require("./create.action");
20
+ Object.defineProperty(exports, "makeDataFlowCreateAction", { enumerable: true, get: function () { return create_action_1.makeDataFlowCreateAction; } });
21
+ var update_action_1 = require("./update.action");
22
+ Object.defineProperty(exports, "makeDataFlowUpdateAction", { enumerable: true, get: function () { return update_action_1.makeDataFlowUpdateAction; } });
23
+ var delete_action_1 = require("./delete.action");
24
+ Object.defineProperty(exports, "makeDataFlowDeleteAction", { enumerable: true, get: function () { return delete_action_1.makeDataFlowDeleteAction; } });
25
+ var activate_action_1 = require("./activate.action");
26
+ Object.defineProperty(exports, "makeDataFlowActivateAction", { enumerable: true, get: function () { return activate_action_1.makeDataFlowActivateAction; } });
27
+ var deactivate_action_1 = require("./deactivate.action");
28
+ Object.defineProperty(exports, "makeDataFlowDeactivateAction", { enumerable: true, get: function () { return deactivate_action_1.makeDataFlowDeactivateAction; } });
29
+ var get_action_1 = require("./get.action");
30
+ Object.defineProperty(exports, "makeDataFlowGetAction", { enumerable: true, get: function () { return get_action_1.makeDataFlowGetAction; } });
31
+ var list_action_1 = require("./list.action");
32
+ Object.defineProperty(exports, "makeDataFlowListAction", { enumerable: true, get: function () { return list_action_1.makeDataFlowListAction; } });
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/data-flow/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,iDAA2D;AAAlD,yHAAA,wBAAwB,OAAA;AACjC,iDAA2D;AAAlD,yHAAA,wBAAwB,OAAA;AACjC,iDAA2D;AAAlD,yHAAA,wBAAwB,OAAA;AACjC,qDAA+D;AAAtD,6HAAA,0BAA0B,OAAA;AACnC,yDAAmE;AAA1D,iIAAA,4BAA4B,OAAA;AACrC,2CAAqD;AAA5C,mHAAA,qBAAqB,OAAA;AAC9B,6CAAuD;AAA9C,qHAAA,sBAAsB,OAAA"}
@@ -0,0 +1,6 @@
1
+ import type { Action } from '../utils/types';
2
+ import type { DataFlowListInput } from './types';
3
+ export declare function makeDataFlowListAction(): Action<DataFlowListInput, Array<{
4
+ id: number;
5
+ }>>;
6
+ //# sourceMappingURL=list.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.action.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/list.action.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAoBzF"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeDataFlowListAction = makeDataFlowListAction;
4
+ const action_names_1 = require("../utils/action-names");
5
+ const errors_1 = require("../utils/errors");
6
+ function makeDataFlowListAction() {
7
+ return {
8
+ name: action_names_1.ACTIONS.dataFlow.list,
9
+ parseInput(raw) {
10
+ const obj = (raw !== null && raw !== void 0 ? raw : {});
11
+ const filter = obj.filter;
12
+ if (filter !== undefined &&
13
+ (filter === null || typeof filter !== 'object' || Array.isArray(filter))) {
14
+ throw new errors_1.InvalidInputError('filter must be an object when provided');
15
+ }
16
+ return { filter: filter };
17
+ },
18
+ async handler(input, ctx) {
19
+ // Scope to this function's own integration type so a vendor function
20
+ // never lists another vendor's flows.
21
+ return ctx.dataFlowService.list(Object.assign(Object.assign({}, input.filter), { integrationType: ctx.integrationType }));
22
+ },
23
+ };
24
+ }
25
+ //# sourceMappingURL=list.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.action.js","sourceRoot":"","sources":["../../../src/actions/data-flow/list.action.ts"],"names":[],"mappings":";;AAMA,wDAoBC;AAzBD,wDAAgD;AAChD,4CAAoD;AAIpD,SAAgB,sBAAsB;IACpC,OAAO;QACL,IAAI,EAAE,sBAAO,CAAC,QAAQ,CAAC,IAAI;QAC3B,UAAU,CAAC,GAAG;YACZ,MAAM,GAAG,GAAG,CAAC,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,EAAE,CAA4B,CAAC;YACnD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,IACE,MAAM,KAAK,SAAS;gBACpB,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EACxE,CAAC;gBACD,MAAM,IAAI,0BAAiB,CAAC,wCAAwC,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,MAAwC,EAAE,CAAC;QAC9D,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,qEAAqE;YACrE,sCAAsC;YACtC,OAAO,GAAG,CAAC,eAAe,CAAC,IAAI,iCAAM,KAAK,CAAC,MAAM,KAAE,eAAe,EAAE,GAAG,CAAC,eAAe,IAAG,CAAC;QAC7F,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function isNonEmptyString(v: unknown): v is string;
2
+ export declare function parseId(raw: unknown): number;
3
+ //# sourceMappingURL=shared.d.ts.map