@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.
- package/CHANGELOG.md +24 -0
- package/README.md +84 -20
- package/dist/actions/action-registry.d.ts.map +1 -1
- package/dist/actions/action-registry.js +27 -23
- package/dist/actions/action-registry.js.map +1 -1
- package/dist/actions/data-flow/activate.action.d.ts +10 -0
- package/dist/actions/data-flow/activate.action.d.ts.map +1 -0
- package/dist/actions/data-flow/activate.action.js +22 -0
- package/dist/actions/data-flow/activate.action.js.map +1 -0
- package/dist/actions/data-flow/create.action.d.ts +9 -0
- package/dist/actions/data-flow/create.action.d.ts.map +1 -0
- package/dist/actions/data-flow/create.action.js +55 -0
- package/dist/actions/data-flow/create.action.js.map +1 -0
- package/dist/actions/data-flow/deactivate.action.d.ts +9 -0
- package/dist/actions/data-flow/deactivate.action.d.ts.map +1 -0
- package/dist/actions/data-flow/deactivate.action.js +21 -0
- package/dist/actions/data-flow/deactivate.action.js.map +1 -0
- package/dist/actions/data-flow/delete.action.d.ts +10 -0
- package/dist/actions/data-flow/delete.action.d.ts.map +1 -0
- package/dist/actions/data-flow/delete.action.js +33 -0
- package/dist/actions/data-flow/delete.action.js.map +1 -0
- package/dist/actions/data-flow/get.action.d.ts +5 -0
- package/dist/actions/data-flow/get.action.d.ts.map +1 -0
- package/dist/actions/data-flow/get.action.js +22 -0
- package/dist/actions/data-flow/get.action.js.map +1 -0
- package/dist/actions/data-flow/index.d.ts +9 -0
- package/dist/actions/data-flow/index.d.ts.map +1 -0
- package/dist/actions/data-flow/index.js +33 -0
- package/dist/actions/data-flow/index.js.map +1 -0
- package/dist/actions/data-flow/list.action.d.ts +6 -0
- package/dist/actions/data-flow/list.action.d.ts.map +1 -0
- package/dist/actions/data-flow/list.action.js +25 -0
- package/dist/actions/data-flow/list.action.js.map +1 -0
- package/dist/actions/data-flow/shared.d.ts +3 -0
- package/dist/actions/data-flow/shared.d.ts.map +1 -0
- package/dist/actions/data-flow/shared.js +16 -0
- package/dist/actions/data-flow/shared.js.map +1 -0
- package/dist/actions/data-flow/types.d.ts +21 -0
- package/dist/actions/data-flow/types.d.ts.map +1 -0
- package/dist/actions/data-flow/types.js +3 -0
- package/dist/actions/data-flow/types.js.map +1 -0
- package/dist/actions/data-flow/update.action.d.ts +16 -0
- package/dist/actions/data-flow/update.action.d.ts.map +1 -0
- package/dist/actions/data-flow/update.action.js +62 -0
- package/dist/actions/data-flow/update.action.js.map +1 -0
- package/dist/actions/data-flow.action.d.ts.map +1 -1
- package/dist/actions/data-flow.action.js +5 -9
- package/dist/actions/data-flow.action.js.map +1 -1
- package/dist/actions/event/index.d.ts +4 -0
- package/dist/actions/event/index.d.ts.map +1 -0
- package/dist/actions/event/index.js +23 -0
- package/dist/actions/event/index.js.map +1 -0
- package/dist/actions/event/on-skedulo.action.d.ts +4 -0
- package/dist/actions/event/on-skedulo.action.d.ts.map +1 -0
- package/dist/actions/event/on-skedulo.action.js +81 -0
- package/dist/actions/event/on-skedulo.action.js.map +1 -0
- package/dist/actions/event/on-vendor.action.d.ts +4 -0
- package/dist/actions/event/on-vendor.action.d.ts.map +1 -0
- package/dist/actions/event/on-vendor.action.js +43 -0
- package/dist/actions/event/on-vendor.action.js.map +1 -0
- package/dist/actions/event/types.d.ts +28 -0
- package/dist/actions/event/types.d.ts.map +1 -0
- package/dist/actions/event/types.js +3 -0
- package/dist/actions/event/types.js.map +1 -0
- package/dist/actions/metadata/get-fields.action.d.ts +5 -0
- package/dist/actions/metadata/get-fields.action.d.ts.map +1 -0
- package/dist/actions/metadata/get-fields.action.js +26 -0
- package/dist/actions/metadata/get-fields.action.js.map +1 -0
- package/dist/actions/metadata/get-objects.action.d.ts +5 -0
- package/dist/actions/metadata/get-objects.action.d.ts.map +1 -0
- package/dist/actions/metadata/get-objects.action.js +18 -0
- package/dist/actions/metadata/get-objects.action.js.map +1 -0
- package/dist/actions/metadata/get-sample-apis.action.d.ts +5 -0
- package/dist/actions/metadata/get-sample-apis.action.d.ts.map +1 -0
- package/dist/actions/metadata/get-sample-apis.action.js +19 -0
- package/dist/actions/metadata/get-sample-apis.action.js.map +1 -0
- package/dist/actions/metadata/get-sample-records.action.d.ts +5 -0
- package/dist/actions/metadata/get-sample-records.action.d.ts.map +1 -0
- package/dist/actions/metadata/get-sample-records.action.js +33 -0
- package/dist/actions/metadata/get-sample-records.action.js.map +1 -0
- package/dist/actions/metadata/get-templates.action.d.ts +5 -0
- package/dist/actions/metadata/get-templates.action.d.ts.map +1 -0
- package/dist/actions/metadata/get-templates.action.js +19 -0
- package/dist/actions/metadata/get-templates.action.js.map +1 -0
- package/dist/actions/metadata/index.d.ts +7 -0
- package/dist/actions/metadata/index.d.ts.map +1 -0
- package/dist/actions/metadata/index.js +29 -0
- package/dist/actions/metadata/index.js.map +1 -0
- package/dist/actions/metadata/shared.d.ts +6 -0
- package/dist/actions/metadata/shared.d.ts.map +1 -0
- package/dist/actions/metadata/shared.js +11 -0
- package/dist/actions/metadata/shared.js.map +1 -0
- package/dist/actions/metadata/types.d.ts +38 -0
- package/dist/actions/metadata/types.d.ts.map +1 -0
- package/dist/actions/metadata/types.js +3 -0
- package/dist/actions/metadata/types.js.map +1 -0
- package/dist/actions/scheduled-job/create.action.d.ts +5 -0
- package/dist/actions/scheduled-job/create.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job/create.action.js +56 -0
- package/dist/actions/scheduled-job/create.action.js.map +1 -0
- package/dist/actions/scheduled-job/delete.action.d.ts +15 -0
- package/dist/actions/scheduled-job/delete.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job/delete.action.js +42 -0
- package/dist/actions/scheduled-job/delete.action.js.map +1 -0
- package/dist/actions/scheduled-job/get.action.d.ts +7 -0
- package/dist/actions/scheduled-job/get.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job/get.action.js +23 -0
- package/dist/actions/scheduled-job/get.action.js.map +1 -0
- package/dist/actions/scheduled-job/index.d.ts +7 -0
- package/dist/actions/scheduled-job/index.d.ts.map +1 -0
- package/dist/actions/scheduled-job/index.js +29 -0
- package/dist/actions/scheduled-job/index.js.map +1 -0
- package/dist/actions/scheduled-job/list.action.d.ts +5 -0
- package/dist/actions/scheduled-job/list.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job/list.action.js +18 -0
- package/dist/actions/scheduled-job/list.action.js.map +1 -0
- package/dist/actions/scheduled-job/shared.d.ts +30 -0
- package/dist/actions/scheduled-job/shared.d.ts.map +1 -0
- package/dist/actions/scheduled-job/shared.js +129 -0
- package/dist/actions/scheduled-job/shared.js.map +1 -0
- package/dist/actions/scheduled-job/types.d.ts +23 -0
- package/dist/actions/scheduled-job/types.d.ts.map +1 -0
- package/dist/actions/scheduled-job/types.js +3 -0
- package/dist/actions/scheduled-job/types.js.map +1 -0
- package/dist/actions/scheduled-job/update.action.d.ts +5 -0
- package/dist/actions/scheduled-job/update.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job/update.action.js +68 -0
- package/dist/actions/scheduled-job/update.action.js.map +1 -0
- package/dist/actions/scheduled-job.action.d.ts +73 -0
- package/dist/actions/scheduled-job.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job.action.js +355 -0
- package/dist/actions/scheduled-job.action.js.map +1 -0
- package/dist/actions/setup.action.js +1 -1
- package/dist/actions/setup.action.js.map +1 -1
- package/dist/actions/sync/index.d.ts +4 -0
- package/dist/actions/sync/index.d.ts.map +1 -0
- package/dist/actions/sync/index.js +23 -0
- package/dist/actions/sync/index.js.map +1 -0
- package/dist/actions/sync/run-flow.action.d.ts +8 -0
- package/dist/actions/sync/run-flow.action.d.ts.map +1 -0
- package/dist/actions/sync/run-flow.action.js +81 -0
- package/dist/actions/sync/run-flow.action.js.map +1 -0
- package/dist/actions/sync/run-job.action.d.ts +11 -0
- package/dist/actions/sync/run-job.action.d.ts.map +1 -0
- package/dist/actions/sync/run-job.action.js +75 -0
- package/dist/actions/sync/run-job.action.js.map +1 -0
- package/dist/actions/sync/types.d.ts +41 -0
- package/dist/actions/sync/types.d.ts.map +1 -0
- package/dist/actions/sync/types.js +3 -0
- package/dist/actions/sync/types.js.map +1 -0
- package/dist/actions/sync.action.d.ts +8 -47
- package/dist/actions/sync.action.d.ts.map +1 -1
- package/dist/actions/sync.action.js +29 -162
- package/dist/actions/sync.action.js.map +1 -1
- package/dist/actions/utils/action-names.d.ts +19 -6
- package/dist/actions/utils/action-names.d.ts.map +1 -1
- package/dist/actions/utils/action-names.js +19 -6
- package/dist/actions/utils/action-names.js.map +1 -1
- package/dist/actions/utils/define-action.d.ts +36 -0
- package/dist/actions/utils/define-action.d.ts.map +1 -0
- package/dist/actions/utils/define-action.js +43 -0
- package/dist/actions/utils/define-action.js.map +1 -0
- package/dist/actions/utils/errors.d.ts +54 -8
- package/dist/actions/utils/errors.d.ts.map +1 -1
- package/dist/actions/utils/errors.js +107 -14
- package/dist/actions/utils/errors.js.map +1 -1
- package/dist/actions/utils/helpers.d.ts.map +1 -1
- package/dist/actions/utils/helpers.js +2 -1
- package/dist/actions/utils/helpers.js.map +1 -1
- package/dist/actions/utils/metrics.d.ts +12 -0
- package/dist/actions/utils/metrics.d.ts.map +1 -0
- package/dist/actions/utils/metrics.js +12 -0
- package/dist/actions/utils/metrics.js.map +1 -0
- package/dist/actions/utils/middleware.d.ts +39 -0
- package/dist/actions/utils/middleware.d.ts.map +1 -0
- package/dist/actions/utils/middleware.js +85 -0
- package/dist/actions/utils/middleware.js.map +1 -0
- package/dist/actions/utils/types.d.ts +5 -4
- package/dist/actions/utils/types.d.ts.map +1 -1
- package/dist/adapters/base-adapter-handler.d.ts +10 -0
- package/dist/adapters/base-adapter-handler.d.ts.map +1 -1
- package/dist/adapters/base-adapter-handler.js +18 -34
- package/dist/adapters/base-adapter-handler.js.map +1 -1
- package/dist/browser.d.ts +2 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +3 -1
- package/dist/browser.js.map +1 -1
- package/dist/clients/integration-config.client.d.ts +21 -0
- package/dist/clients/integration-config.client.d.ts.map +1 -0
- package/dist/clients/integration-config.client.js +44 -0
- package/dist/clients/integration-config.client.js.map +1 -0
- package/dist/context.d.ts +18 -3
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +21 -5
- package/dist/context.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces/data-flow-spec.interface.d.ts +14 -21
- package/dist/interfaces/data-flow-spec.interface.d.ts.map +1 -1
- package/dist/interfaces/data-flow-spec.interface.js +10 -26
- package/dist/interfaces/data-flow-spec.interface.js.map +1 -1
- package/dist/interfaces/integration-capabilities.interface.d.ts +2 -2
- package/dist/interfaces/scheduled-job.interface.d.ts +40 -0
- package/dist/interfaces/scheduled-job.interface.d.ts.map +1 -0
- package/dist/interfaces/scheduled-job.interface.js +39 -0
- package/dist/interfaces/scheduled-job.interface.js.map +1 -0
- package/dist/services/dataflow.service.d.ts +13 -6
- package/dist/services/dataflow.service.d.ts.map +1 -1
- package/dist/services/dataflow.service.js +34 -57
- package/dist/services/dataflow.service.js.map +1 -1
- package/dist/services/sync-runner.d.ts +1 -0
- package/dist/services/sync-runner.d.ts.map +1 -1
- package/dist/services/sync-runner.js +7 -27
- package/dist/services/sync-runner.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/artifact-builder.d.ts +40 -15
- package/dist/utils/artifact-builder.d.ts.map +1 -1
- package/dist/utils/artifact-builder.js +92 -17
- package/dist/utils/artifact-builder.js.map +1 -1
- 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
|
-
| {
|
|
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
|
-
|
|
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
|
-
|
|
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": "
|
|
153
|
-
"
|
|
154
|
-
"
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
228
|
+
```text
|
|
229
|
+
sked-int-<integrationType>-<sourceObject>-to-<targetObject>-flow<id>
|
|
230
|
+
```
|
|
171
231
|
|
|
172
|
-
|
|
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
|
|
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;
|
|
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
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
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,
|
|
23
|
-
(0,
|
|
24
|
-
(0,
|
|
25
|
-
(0,
|
|
26
|
-
(0,
|
|
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,
|
|
32
|
-
(0,
|
|
33
|
-
(0,
|
|
34
|
-
(0,
|
|
35
|
-
(0,
|
|
36
|
-
(0,
|
|
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,
|
|
39
|
-
(0,
|
|
40
|
-
(0,
|
|
41
|
-
(0,
|
|
42
|
-
(0,
|
|
43
|
-
(0,
|
|
44
|
-
(0,
|
|
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":";;
|
|
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 @@
|
|
|
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"}
|