@tailor-platform/sdk 1.40.1 → 1.44.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 +68 -0
- package/README.md +23 -0
- package/dist/{actor-B2oEmlTc.d.mts → actor-DzCuoMlP.d.mts} +2 -2
- package/dist/application-BZRbA1pL.mjs +4 -0
- package/dist/{application-EvhIIVg0.mjs → application-DkVNbIuh.mjs} +95 -16
- package/dist/application-DkVNbIuh.mjs.map +1 -0
- package/dist/brand-Ll48SMXe.mjs.map +1 -1
- package/dist/cli/index.mjs +56 -43
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cli/lib.d.mts +75 -18
- package/dist/cli/lib.mjs +9 -9
- package/dist/cli/lib.mjs.map +1 -1
- package/dist/cli/skills.mjs.map +1 -1
- package/dist/{client-CcV6Jjds.mjs → client-DQl5NPG9.mjs} +103 -43
- package/dist/{client-CcV6Jjds.mjs.map → client-DQl5NPG9.mjs.map} +1 -1
- package/dist/{client-Cn9SqhZT.mjs → client-EI4pMzvm.mjs} +1 -1
- package/dist/configure/index.d.mts +5 -5
- package/dist/configure/index.mjs +84 -4
- package/dist/configure/index.mjs.map +1 -1
- package/dist/{crash-report-CUbm1ErM.mjs → crash-report-CSSrblUv.mjs} +4 -4
- package/dist/{crash-report-CUbm1ErM.mjs.map → crash-report-CSSrblUv.mjs.map} +1 -1
- package/dist/{crash-report-CSYupJ0T.mjs → crash-report-DtkFq9JF.mjs} +1 -1
- package/dist/{enum-constants-Dx82rSjf.mjs → enum-constants-C3KSpsYj.mjs} +1 -1
- package/dist/{enum-constants-Dx82rSjf.mjs.map → enum-constants-C3KSpsYj.mjs.map} +1 -1
- package/dist/{errors-ChWX5ZG8.mjs → errors-_M2TVoWh.mjs} +1 -1
- package/dist/{errors-ChWX5ZG8.mjs.map → errors-_M2TVoWh.mjs.map} +1 -1
- package/dist/{file-utils-DeWpvq3T.mjs → file-utils-775qWKoo.mjs} +1 -1
- package/dist/{file-utils-DeWpvq3T.mjs.map → file-utils-775qWKoo.mjs.map} +1 -1
- package/dist/{index-Chvw1Eod.d.mts → index-0Dk-fDWi.d.mts} +2 -2
- package/dist/{index-CiNNNpuH.d.mts → index-BEEL1-6Z.d.mts} +2 -2
- package/dist/{index-D_ezppY7.d.mts → index-Br4XCvX1.d.mts} +103 -86
- package/dist/{index-BtXZdz-F.d.mts → index-DdsUV-aA.d.mts} +2 -2
- package/dist/{index-reFAYSX7.d.mts → index-ZZYEd_0R.d.mts} +2 -2
- package/dist/interceptor-4UC-KTno.mjs.map +1 -1
- package/dist/{job-p6zf8Qpg.mjs → job-BOvKyNdT.mjs} +15 -9
- package/dist/job-BOvKyNdT.mjs.map +1 -0
- package/dist/kysely/index.mjs.map +1 -1
- package/dist/{kysely-type-CwtvQuxh.mjs → kysely-type-BQsYEZoY.mjs} +1 -1
- package/dist/kysely-type-BQsYEZoY.mjs.map +1 -0
- package/dist/logger-DTNAMYGy.mjs.map +1 -1
- package/dist/{package-json-CWp8s9dE.mjs → package-json-CRzw5eUf.mjs} +1 -1
- package/dist/{package-json-CWp8s9dE.mjs.map → package-json-CRzw5eUf.mjs.map} +1 -1
- package/dist/package-json-DR_mqrCW.mjs +4 -0
- package/dist/plugin/builtin/enum-constants/index.d.mts +1 -1
- package/dist/plugin/builtin/enum-constants/index.mjs +1 -1
- package/dist/plugin/builtin/file-utils/index.d.mts +1 -1
- package/dist/plugin/builtin/file-utils/index.mjs +1 -1
- package/dist/plugin/builtin/kysely-type/index.d.mts +1 -1
- package/dist/plugin/builtin/kysely-type/index.mjs +1 -1
- package/dist/plugin/builtin/seed/index.d.mts +1 -1
- package/dist/plugin/builtin/seed/index.mjs +1 -1
- package/dist/plugin/index.d.mts +2 -2
- package/dist/plugin/index.mjs.map +1 -1
- package/dist/repl-editor-DjycioU-.mjs.map +1 -1
- package/dist/{runtime-B9R1TzLD.mjs → runtime-l7GFD3Xg.mjs} +503 -196
- package/dist/runtime-l7GFD3Xg.mjs.map +1 -0
- package/dist/{schema-CEcfEyPN.mjs → schema-DBq6hr6h.mjs} +13 -2
- package/dist/{schema-CEcfEyPN.mjs.map → schema-DBq6hr6h.mjs.map} +1 -1
- package/dist/{seed-CyYPhvNL.mjs → seed-BkVKgsxf.mjs} +1 -1
- package/dist/{seed-CyYPhvNL.mjs.map → seed-BkVKgsxf.mjs.map} +1 -1
- package/dist/{service-SrG26B9T.mjs → service-CCnx_IFw.mjs} +2 -2
- package/dist/{service-SrG26B9T.mjs.map → service-CCnx_IFw.mjs.map} +1 -1
- package/dist/{tailor-db-field-CoFKRCYW.d.mts → tailor-db-field-D_z185oq.d.mts} +36 -6
- package/dist/{telemetry-BuDto_2q.mjs → telemetry-B6Le9XT-.mjs} +2 -2
- package/dist/{telemetry-BuDto_2q.mjs.map → telemetry-B6Le9XT-.mjs.map} +1 -1
- package/dist/telemetry-C_WXxIo0.mjs +4 -0
- package/dist/types-Duhhsx3R.mjs.map +1 -1
- package/dist/utils/test/index.d.mts +36 -3
- package/dist/utils/test/index.mjs +78 -9
- package/dist/utils/test/index.mjs.map +1 -1
- package/dist/{workflow.generated-Btz6srLR.d.mts → workflow.generated-CDCnZNkH.d.mts} +2 -2
- package/docs/cli/application.md +130 -5
- package/docs/cli/crash-report.md +12 -1
- package/docs/cli/executor.md +6 -4
- package/docs/cli/function.md +83 -1
- package/docs/cli/organization.md +6 -5
- package/docs/cli/workspace.md +16 -13
- package/docs/cli-reference.md +13 -10
- package/docs/services/executor.md +4 -0
- package/docs/services/idp.md +16 -0
- package/docs/services/resolver.md +4 -2
- package/docs/services/workflow.md +117 -3
- package/docs/testing.md +95 -7
- package/package.json +24 -24
- package/dist/application-CE2s_a6w.mjs +0 -4
- package/dist/application-EvhIIVg0.mjs.map +0 -1
- package/dist/job-p6zf8Qpg.mjs.map +0 -1
- package/dist/kysely-type-CwtvQuxh.mjs.map +0 -1
- package/dist/package-json-CPR7s5hf.mjs +0 -4
- package/dist/runtime-B9R1TzLD.mjs.map +0 -1
- package/dist/telemetry-C1hzFaiV.mjs +0 -4
package/docs/testing.md
CHANGED
|
@@ -10,7 +10,7 @@ npm create @tailor-platform/sdk -- --template testing <your-project-name>
|
|
|
10
10
|
|
|
11
11
|
## Unit Tests
|
|
12
12
|
|
|
13
|
-
Unit tests verify resolver logic without requiring deployment.
|
|
13
|
+
Unit tests verify resolver and workflow logic locally without requiring deployment.
|
|
14
14
|
|
|
15
15
|
### Simple Resolver Testing
|
|
16
16
|
|
|
@@ -171,13 +171,52 @@ describe("decrementUserAge resolver", () => {
|
|
|
171
171
|
- Mock high-level operations instead of low-level SQL queries
|
|
172
172
|
- **Best for:** Complex business logic with multiple database operations
|
|
173
173
|
|
|
174
|
-
|
|
174
|
+
### Testing Resolvers that Call `.resolve()`
|
|
175
175
|
|
|
176
|
-
|
|
176
|
+
Use `setupWaitPointMock` to mock `tailor.workflow.resolve` when testing resolvers that resume a suspended workflow execution.
|
|
177
177
|
|
|
178
|
-
|
|
178
|
+
```typescript
|
|
179
|
+
import { afterEach } from "vitest";
|
|
180
|
+
import { setupWaitPointMock, unauthenticatedTailorUser } from "@tailor-platform/sdk/test";
|
|
181
|
+
import resolver from "./resolvers/resolveApproval";
|
|
182
|
+
|
|
183
|
+
const TailorGlobal = globalThis as { tailor?: { workflow?: Record<string, unknown> } };
|
|
184
|
+
|
|
185
|
+
describe("resolveApproval resolver", () => {
|
|
186
|
+
afterEach(() => {
|
|
187
|
+
delete TailorGlobal.tailor;
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test("resolves approval", async () => {
|
|
191
|
+
const { resolveCalls } = setupWaitPointMock({
|
|
192
|
+
onResolve: (_execId, _key, callback) => {
|
|
193
|
+
const result = callback({ message: "Please approve", orderId: "order-1" });
|
|
194
|
+
expect(result).toEqual({ approved: true });
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
const result = await resolver.body({
|
|
199
|
+
input: { executionId: "exec-1", approved: true },
|
|
200
|
+
user: unauthenticatedTailorUser,
|
|
201
|
+
env: {},
|
|
202
|
+
});
|
|
179
203
|
|
|
180
|
-
|
|
204
|
+
expect(result).toEqual({ resolved: true });
|
|
205
|
+
expect(resolveCalls).toHaveLength(1);
|
|
206
|
+
expect(resolveCalls[0]).toEqual({ executionId: "exec-1", key: "approval" });
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**Key points:**
|
|
212
|
+
|
|
213
|
+
- `onResolve` lets you verify the callback behavior in resolvers that call `.resolve()`
|
|
214
|
+
- Clean up mocks in `afterEach` by deleting `TailorGlobal.tailor`
|
|
215
|
+
- **Best for:** Resolvers that resume suspended workflow executions
|
|
216
|
+
|
|
217
|
+
### Workflow Job Unit Tests
|
|
218
|
+
|
|
219
|
+
Test individual workflow job logic locally without deploying. Call `.body()` directly:
|
|
181
220
|
|
|
182
221
|
```typescript
|
|
183
222
|
import workflow, { addNumbers, calculate } from "./workflows/calculation";
|
|
@@ -218,9 +257,9 @@ describe("workflow with dependencies", () => {
|
|
|
218
257
|
|
|
219
258
|
**Note:** To execute dependent jobs without mocking, and they require `env`, use `vi.stubEnv(WORKFLOW_TEST_ENV_KEY, ...)` and call `.trigger()` directly as shown in the integration test section below.
|
|
220
259
|
|
|
221
|
-
### Integration Tests with `.trigger()`
|
|
260
|
+
### Workflow Integration Tests with `.trigger()`
|
|
222
261
|
|
|
223
|
-
Test the full workflow execution using `workflow.mainJob.trigger()`:
|
|
262
|
+
Test the full workflow execution locally using `workflow.mainJob.trigger()`:
|
|
224
263
|
|
|
225
264
|
```typescript
|
|
226
265
|
import { WORKFLOW_TEST_ENV_KEY } from "@tailor-platform/sdk/test";
|
|
@@ -252,6 +291,55 @@ describe("workflow integration", () => {
|
|
|
252
291
|
- Use `workflow.mainJob.trigger()` to execute the full workflow chain and get the result
|
|
253
292
|
- **Best for:** Testing workflow orchestration and job dependencies
|
|
254
293
|
|
|
294
|
+
### Testing Jobs with Wait Points
|
|
295
|
+
|
|
296
|
+
Use `setupWaitPointMock` to mock `tailor.workflow.wait` when testing jobs that suspend on wait points:
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
import { afterEach, vi } from "vitest";
|
|
300
|
+
import { setupWaitPointMock } from "@tailor-platform/sdk/test";
|
|
301
|
+
import { processWithApproval } from "./workflows/approval";
|
|
302
|
+
|
|
303
|
+
const TailorGlobal = globalThis as { tailor?: { workflow?: Record<string, unknown> } };
|
|
304
|
+
|
|
305
|
+
describe("approval workflow", () => {
|
|
306
|
+
afterEach(() => {
|
|
307
|
+
delete TailorGlobal.tailor;
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
test("approved flow returns approved status", async () => {
|
|
311
|
+
const { waitCalls } = setupWaitPointMock({
|
|
312
|
+
onWait: (_key, _payload) => ({ approved: true }),
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
const result = await processWithApproval.body({ orderId: "order-1" }, { env: {} });
|
|
316
|
+
|
|
317
|
+
expect(result).toEqual({ orderId: "order-1", status: "approved" });
|
|
318
|
+
expect(waitCalls).toHaveLength(1);
|
|
319
|
+
expect(waitCalls[0]).toEqual({
|
|
320
|
+
key: "approval",
|
|
321
|
+
payload: { message: "Please approve order order-1", orderId: "order-1" },
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
test("rejected flow returns rejected status", async () => {
|
|
326
|
+
setupWaitPointMock({
|
|
327
|
+
onWait: () => ({ approved: false }),
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
const result = await processWithApproval.body({ orderId: "order-2" }, { env: {} });
|
|
331
|
+
|
|
332
|
+
expect(result).toEqual({ orderId: "order-2", status: "rejected" });
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
**Key points:**
|
|
338
|
+
|
|
339
|
+
- `onWait` controls what `.wait()` returns — use it to test different branches (approved/rejected)
|
|
340
|
+
- Clean up mocks in `afterEach` by deleting `TailorGlobal.tailor`
|
|
341
|
+
- **Best for:** Jobs that suspend on wait points for human-in-the-loop approval
|
|
342
|
+
|
|
255
343
|
## End-to-End (E2E) Tests
|
|
256
344
|
|
|
257
345
|
E2E tests verify your application works correctly when deployed to Tailor Platform. They test the full stack including GraphQL API, database operations, and authentication.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tailor-platform/sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.44.0",
|
|
4
4
|
"description": "Tailor Platform SDK - The SDK to work with Tailor Platform",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -78,11 +78,11 @@
|
|
|
78
78
|
"dependencies": {
|
|
79
79
|
"@0no-co/graphql.web": "1.2.0",
|
|
80
80
|
"@badgateway/oauth2-client": "3.3.1",
|
|
81
|
-
"@bufbuild/protobuf": "2.
|
|
81
|
+
"@bufbuild/protobuf": "2.12.0",
|
|
82
82
|
"@connectrpc/connect": "2.1.1",
|
|
83
83
|
"@connectrpc/connect-node": "2.1.1",
|
|
84
|
-
"@inquirer/core": "11.1.
|
|
85
|
-
"@inquirer/prompts": "8.4.
|
|
84
|
+
"@inquirer/core": "11.1.9",
|
|
85
|
+
"@inquirer/prompts": "8.4.2",
|
|
86
86
|
"@jridgewell/trace-mapping": "0.3.31",
|
|
87
87
|
"@liam-hq/cli": "0.7.24",
|
|
88
88
|
"@napi-rs/keyring": "1.2.0",
|
|
@@ -91,18 +91,18 @@
|
|
|
91
91
|
"@opentelemetry/resources": "2.7.0",
|
|
92
92
|
"@opentelemetry/sdk-trace-node": "2.7.0",
|
|
93
93
|
"@opentelemetry/semantic-conventions": "1.40.0",
|
|
94
|
-
"@oxc-project/types": "0.
|
|
94
|
+
"@oxc-project/types": "0.127.0",
|
|
95
95
|
"@standard-schema/spec": "1.1.0",
|
|
96
96
|
"@tailor-platform/function-kysely-tailordb": "0.1.3",
|
|
97
|
-
"@tailor-platform/function-types": "0.8.
|
|
98
|
-
"@toiroakr/lines-db": "0.9.
|
|
99
|
-
"@toiroakr/read-multiline": "0.3.
|
|
97
|
+
"@tailor-platform/function-types": "0.8.5",
|
|
98
|
+
"@toiroakr/lines-db": "0.9.2",
|
|
99
|
+
"@toiroakr/read-multiline": "0.3.2",
|
|
100
100
|
"@urql/core": "6.0.1",
|
|
101
101
|
"chalk": "5.6.2",
|
|
102
102
|
"chokidar": "5.0.0",
|
|
103
103
|
"confbox": "0.2.4",
|
|
104
104
|
"date-fns": "4.1.0",
|
|
105
|
-
"es-toolkit": "1.
|
|
105
|
+
"es-toolkit": "1.46.0",
|
|
106
106
|
"find-up-simple": "1.0.1",
|
|
107
107
|
"globals": "17.5.0",
|
|
108
108
|
"graphql": "16.13.2",
|
|
@@ -113,21 +113,21 @@
|
|
|
113
113
|
"multiline-ts": "4.0.1",
|
|
114
114
|
"open": "11.0.0",
|
|
115
115
|
"ora": "9.3.0",
|
|
116
|
-
"oxc-parser": "0.
|
|
116
|
+
"oxc-parser": "0.127.0",
|
|
117
117
|
"p-limit": "7.3.0",
|
|
118
118
|
"pathe": "2.0.3",
|
|
119
119
|
"pgsql-ast-parser": "12.0.2",
|
|
120
120
|
"pkg-types": "2.3.0",
|
|
121
|
-
"politty": "0.4.
|
|
122
|
-
"rolldown": "1.0.0-rc.
|
|
121
|
+
"politty": "0.4.15",
|
|
122
|
+
"rolldown": "1.0.0-rc.17",
|
|
123
123
|
"semver": "7.7.4",
|
|
124
124
|
"serve": "14.2.6",
|
|
125
125
|
"sql-highlight": "6.1.0",
|
|
126
|
-
"std-env": "4.
|
|
126
|
+
"std-env": "4.1.0",
|
|
127
127
|
"table": "6.9.0",
|
|
128
128
|
"ts-cron-validator": "1.1.5",
|
|
129
129
|
"tsx": "4.21.0",
|
|
130
|
-
"type-fest": "5.
|
|
130
|
+
"type-fest": "5.6.0",
|
|
131
131
|
"xdg-basedir": "5.1.0",
|
|
132
132
|
"zod": "4.3.6"
|
|
133
133
|
},
|
|
@@ -138,19 +138,19 @@
|
|
|
138
138
|
"@types/mime-types": "3.0.1",
|
|
139
139
|
"@types/node": "24.12.2",
|
|
140
140
|
"@types/semver": "7.7.1",
|
|
141
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
142
|
-
"@vitest/coverage-v8": "4.1.
|
|
143
|
-
"eslint": "10.2.
|
|
141
|
+
"@typescript/native-preview": "7.0.0-dev.20260424.1",
|
|
142
|
+
"@vitest/coverage-v8": "4.1.5",
|
|
143
|
+
"eslint": "10.2.1",
|
|
144
144
|
"eslint-plugin-jsdoc": "62.9.0",
|
|
145
|
-
"eslint-plugin-oxlint": "1.
|
|
146
|
-
"oxfmt": "0.
|
|
147
|
-
"oxlint": "1.
|
|
148
|
-
"oxlint-tsgolint": "0.
|
|
145
|
+
"eslint-plugin-oxlint": "1.61.0",
|
|
146
|
+
"oxfmt": "0.46.0",
|
|
147
|
+
"oxlint": "1.61.0",
|
|
148
|
+
"oxlint-tsgolint": "0.21.1",
|
|
149
149
|
"sonda": "0.11.1",
|
|
150
|
-
"tsdown": "0.21.
|
|
150
|
+
"tsdown": "0.21.10",
|
|
151
151
|
"typescript": "5.9.3",
|
|
152
|
-
"typescript-eslint": "8.
|
|
153
|
-
"vitest": "4.1.
|
|
152
|
+
"typescript-eslint": "8.59.0",
|
|
153
|
+
"vitest": "4.1.5",
|
|
154
154
|
"zinfer": "0.1.8"
|
|
155
155
|
},
|
|
156
156
|
"scripts": {
|