@tailor-platform/create-sdk 2.0.0-next.5 → 2.0.0-next.7

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 (30) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/package.json +2 -2
  3. package/templates/executor/.oxlintrc.json +8 -0
  4. package/templates/executor/package.json +2 -1
  5. package/templates/generators/.oxlintrc.json +8 -0
  6. package/templates/generators/package.json +2 -1
  7. package/templates/generators/src/resolver/getProduct.test.ts +27 -24
  8. package/templates/hello-world/.oxlintrc.json +8 -0
  9. package/templates/hello-world/package.json +2 -1
  10. package/templates/inventory-management/.oxlintrc.json +8 -0
  11. package/templates/inventory-management/package.json +2 -1
  12. package/templates/inventory-management/src/executor/checkInventory.ts +0 -1
  13. package/templates/multi-application/.oxlintrc.json +8 -0
  14. package/templates/multi-application/apps/admin/tailor.config.ts +1 -1
  15. package/templates/multi-application/apps/user/tailor.config.ts +1 -1
  16. package/templates/multi-application/package.json +2 -1
  17. package/templates/resolver/.oxlintrc.json +8 -0
  18. package/templates/resolver/package.json +2 -1
  19. package/templates/resolver/src/resolver/incrementUserAge.test.ts +2 -2
  20. package/templates/static-web-site/.oxlintrc.json +8 -0
  21. package/templates/static-web-site/package.json +2 -1
  22. package/templates/tailordb/.oxlintrc.json +8 -0
  23. package/templates/tailordb/package.json +2 -1
  24. package/templates/workflow/.oxlintrc.json +8 -0
  25. package/templates/workflow/README.md +2 -2
  26. package/templates/workflow/package.json +2 -1
  27. package/templates/workflow/src/resolver/resolveApproval.test.ts +14 -10
  28. package/templates/workflow/src/workflow/approval.test.ts +8 -9
  29. package/templates/workflow/src/workflow/order-fulfillment.test.ts +10 -10
  30. package/templates/workflow/src/workflow/order-fulfillment.ts +3 -3
package/CHANGELOG.md CHANGED
@@ -1,7 +1,33 @@
1
1
  # @tailor-platform/create-sdk
2
2
 
3
+ ## 2.0.0-next.7
4
+
5
+ ### Major Changes
6
+
7
+ - [#1782](https://github.com/tailor-platform/sdk/pull/1782) [`c971797`](https://github.com/tailor-platform/sdk/commit/c971797c9bfa035a43771c46f2b1c3bd93f989a9) Thanks [@toiroakr](https://github.com/toiroakr)! - Rename `Workflow.trigger()` (returned by `createWorkflow()`) and `WorkflowJob.trigger()` (returned by `createWorkflowJob()`) to `.start()`, aligning the SDK's ergonomic verb with the platform's `start*` RPC vocabulary:
8
+
9
+ ```diff
10
+ const inventory = checkInventory.trigger({ orderId: input.orderId });
11
+ +const inventory = checkInventory.start({ orderId: input.orderId });
12
+
13
+ -const workflowRunId = await orderProcessingWorkflow.trigger(args, { invoker: "manager" });
14
+ +const workflowRunId = await orderProcessingWorkflow.start(args, { invoker: "manager" });
15
+ ```
16
+
17
+ `mockWorkflow()`'s `wf.job(definition)` / `wf.workflow(definition)` now return a mock of the `.start` method, and `wf.setTriggerHandler` / `wf.triggeredJobs` are renamed to `wf.setStartHandler` / `wf.startedJobs`. No codemod ships for the `.trigger()` → `.start()` call-site rename itself — see the `v2/workflow-start-rename` migration guide entry for manual migration steps.
18
+
19
+ ### Minor Changes
20
+
21
+ - [#1737](https://github.com/tailor-platform/sdk/pull/1737) [`e349b9e`](https://github.com/tailor-platform/sdk/commit/e349b9e3d9c61f324f21dea92dd08055493a2c6d) Thanks [@dqn](https://github.com/dqn)! - Add lint rules that flag the external /api prefix in HTTP adapter path patterns and permission settings that grant access unconditionally, and enable them in newly scaffolded projects.
22
+
23
+ ## 2.0.0-next.6
24
+
3
25
  ## 2.0.0-next.5
4
26
 
27
+ ### Patch Changes
28
+
29
+ - [#1753](https://github.com/tailor-platform/sdk/pull/1753) [`6bff945`](https://github.com/tailor-platform/sdk/commit/6bff94505f3dbe11a8be36ef301e3641ee2cba89) Thanks [@dqn](https://github.com/dqn)! - Add typed, service-specific Vitest mock controls for runtime APIs and update generated project tests to use them.
30
+
5
31
  ## 2.0.0-next.4
6
32
 
7
33
  ### Major Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tailor-platform/create-sdk",
3
- "version": "2.0.0-next.5",
3
+ "version": "2.0.0-next.7",
4
4
  "description": "A CLI tool to quickly create a new Tailor Platform SDK project",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -29,7 +29,7 @@
29
29
  "eslint-plugin-zod": "4.7.0",
30
30
  "oxlint": "1.73.0",
31
31
  "oxlint-tsgolint": "0.24.0",
32
- "tsdown": "0.22.4",
32
+ "tsdown": "0.22.7",
33
33
  "typescript": "6.0.3"
34
34
  },
35
35
  "scripts": {
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "$schema": "./node_modules/oxlint/configuration_schema.json",
3
3
  "plugins": ["typescript"],
4
+ "jsPlugins": [
5
+ {
6
+ "name": "tailor-sdk",
7
+ "specifier": "@tailor-platform/eslint-plugin-sdk"
8
+ }
9
+ ],
4
10
  "categories": {
5
11
  "correctness": "error"
6
12
  },
@@ -9,6 +15,8 @@
9
15
  },
10
16
  "ignorePatterns": [".tailor/", "src/generated/", "tailor.d.ts"],
11
17
  "rules": {
18
+ "tailor-sdk/no-api-prefix-in-path-pattern": "warn",
19
+ "tailor-sdk/no-unconditional-permit": "warn",
12
20
  "no-case-declarations": "error",
13
21
  "no-empty": "error",
14
22
  "no-fallthrough": "error",
@@ -15,7 +15,8 @@
15
15
  "typecheck": "tsc --noEmit"
16
16
  },
17
17
  "devDependencies": {
18
- "@tailor-platform/sdk": "2.0.0-next.5",
18
+ "@tailor-platform/eslint-plugin-sdk": "0.1.0-next.0",
19
+ "@tailor-platform/sdk": "2.0.0-next.7",
19
20
  "@types/node": "24.13.3",
20
21
  "oxfmt": "0.58.0",
21
22
  "oxlint": "1.73.0",
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "$schema": "./node_modules/oxlint/configuration_schema.json",
3
3
  "plugins": ["typescript"],
4
+ "jsPlugins": [
5
+ {
6
+ "name": "tailor-sdk",
7
+ "specifier": "@tailor-platform/eslint-plugin-sdk"
8
+ }
9
+ ],
4
10
  "categories": {
5
11
  "correctness": "error"
6
12
  },
@@ -9,6 +15,8 @@
9
15
  },
10
16
  "ignorePatterns": [".tailor/", "src/generated/", "src/seed/", "tailor.d.ts"],
11
17
  "rules": {
18
+ "tailor-sdk/no-api-prefix-in-path-pattern": "warn",
19
+ "tailor-sdk/no-unconditional-permit": "warn",
12
20
  "no-case-declarations": "error",
13
21
  "no-empty": "error",
14
22
  "no-fallthrough": "error",
@@ -15,7 +15,8 @@
15
15
  "typecheck": "tsc --noEmit"
16
16
  },
17
17
  "devDependencies": {
18
- "@tailor-platform/sdk": "2.0.0-next.5",
18
+ "@tailor-platform/eslint-plugin-sdk": "0.1.0-next.0",
19
+ "@tailor-platform/sdk": "2.0.0-next.7",
19
20
  "@types/node": "24.13.3",
20
21
  "oxfmt": "0.58.0",
21
22
  "oxlint": "1.73.0",
@@ -5,19 +5,21 @@ import resolver from "./getProduct";
5
5
  describe("getProduct resolver", () => {
6
6
  test("returns product with category", async () => {
7
7
  using db = mockTailordb();
8
- // Select product
9
- db.enqueueResult({
10
- id: "product-1",
11
- name: "Widget",
12
- price: 9.99,
13
- status: "ACTIVE",
14
- categoryId: "cat-1",
15
- description: null,
16
- createdAt: new Date(),
17
- updatedAt: null,
18
- });
19
- // Select category
20
- db.enqueueResult({ name: "Gadgets" });
8
+ db.enqueueRows(
9
+ [
10
+ {
11
+ id: "product-1",
12
+ name: "Widget",
13
+ price: 9.99,
14
+ status: "ACTIVE",
15
+ categoryId: "cat-1",
16
+ description: null,
17
+ createdAt: new Date(),
18
+ updatedAt: null,
19
+ },
20
+ ],
21
+ [{ name: "Gadgets" }],
22
+ );
21
23
 
22
24
  const result = await resolver.body({
23
25
  input: { productId: "product-1" },
@@ -37,17 +39,18 @@ describe("getProduct resolver", () => {
37
39
 
38
40
  test("returns product without category", async () => {
39
41
  using db = mockTailordb();
40
- // Select product (no categoryId)
41
- db.enqueueResult({
42
- id: "product-2",
43
- name: "Standalone Item",
44
- price: 19.99,
45
- status: "DRAFT",
46
- categoryId: null,
47
- description: null,
48
- createdAt: new Date(),
49
- updatedAt: null,
50
- });
42
+ db.enqueueRows([
43
+ {
44
+ id: "product-2",
45
+ name: "Standalone Item",
46
+ price: 19.99,
47
+ status: "DRAFT",
48
+ categoryId: null,
49
+ description: null,
50
+ createdAt: new Date(),
51
+ updatedAt: null,
52
+ },
53
+ ]);
51
54
 
52
55
  const result = await resolver.body({
53
56
  input: { productId: "product-2" },
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "$schema": "./node_modules/oxlint/configuration_schema.json",
3
3
  "plugins": ["typescript"],
4
+ "jsPlugins": [
5
+ {
6
+ "name": "tailor-sdk",
7
+ "specifier": "@tailor-platform/eslint-plugin-sdk"
8
+ }
9
+ ],
4
10
  "categories": {
5
11
  "correctness": "error"
6
12
  },
@@ -9,6 +15,8 @@
9
15
  },
10
16
  "ignorePatterns": [".tailor/", "tailor.d.ts"],
11
17
  "rules": {
18
+ "tailor-sdk/no-api-prefix-in-path-pattern": "warn",
19
+ "tailor-sdk/no-unconditional-permit": "warn",
12
20
  "no-case-declarations": "error",
13
21
  "no-empty": "error",
14
22
  "no-fallthrough": "error",
@@ -13,7 +13,8 @@
13
13
  "typecheck": "tsc --noEmit"
14
14
  },
15
15
  "devDependencies": {
16
- "@tailor-platform/sdk": "2.0.0-next.5",
16
+ "@tailor-platform/eslint-plugin-sdk": "0.1.0-next.0",
17
+ "@tailor-platform/sdk": "2.0.0-next.7",
17
18
  "@types/node": "24.13.3",
18
19
  "oxfmt": "0.58.0",
19
20
  "oxlint": "1.73.0",
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "$schema": "./node_modules/oxlint/configuration_schema.json",
3
3
  "plugins": ["typescript"],
4
+ "jsPlugins": [
5
+ {
6
+ "name": "tailor-sdk",
7
+ "specifier": "@tailor-platform/eslint-plugin-sdk"
8
+ }
9
+ ],
4
10
  "categories": {
5
11
  "correctness": "error"
6
12
  },
@@ -9,6 +15,8 @@
9
15
  },
10
16
  "ignorePatterns": [".tailor/", "src/generated/", "tailor.d.ts"],
11
17
  "rules": {
18
+ "tailor-sdk/no-api-prefix-in-path-pattern": "warn",
19
+ "tailor-sdk/no-unconditional-permit": "warn",
12
20
  "no-case-declarations": "error",
13
21
  "no-empty": "error",
14
22
  "no-fallthrough": "error",
@@ -13,7 +13,8 @@
13
13
  "typecheck": "tsc --noEmit"
14
14
  },
15
15
  "devDependencies": {
16
- "@tailor-platform/sdk": "2.0.0-next.5",
16
+ "@tailor-platform/eslint-plugin-sdk": "0.1.0-next.0",
17
+ "@tailor-platform/sdk": "2.0.0-next.7",
17
18
  "@types/node": "24.13.3",
18
19
  "oxfmt": "0.58.0",
19
20
  "oxlint": "1.73.0",
@@ -21,6 +21,5 @@ export default createExecutor({
21
21
  })
22
22
  .execute();
23
23
  },
24
- invoker: "manager",
25
24
  },
26
25
  });
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "$schema": "./node_modules/oxlint/configuration_schema.json",
3
3
  "plugins": ["typescript"],
4
+ "jsPlugins": [
5
+ {
6
+ "name": "tailor-sdk",
7
+ "specifier": "@tailor-platform/eslint-plugin-sdk"
8
+ }
9
+ ],
4
10
  "categories": {
5
11
  "correctness": "error"
6
12
  },
@@ -9,6 +15,8 @@
9
15
  },
10
16
  "ignorePatterns": [".tailor/", "tailor.d.ts"],
11
17
  "rules": {
18
+ "tailor-sdk/no-api-prefix-in-path-pattern": "warn",
19
+ "tailor-sdk/no-unconditional-permit": "warn",
12
20
  "no-case-declarations": "error",
13
21
  "no-empty": "error",
14
22
  "no-fallthrough": "error",
@@ -5,6 +5,6 @@ export default defineConfig({
5
5
  name: "admin",
6
6
  db: {
7
7
  [sharedDb]: { external: true },
8
- "admin-db": { files: [`./apps/admin/db/**/*.ts`] },
8
+ "admin-db": { files: [`./db/**/*.ts`] },
9
9
  },
10
10
  });
@@ -4,5 +4,5 @@ export const sharedDb = "shared-db";
4
4
 
5
5
  export default defineConfig({
6
6
  name: "user",
7
- db: { [sharedDb]: { files: [`./apps/user/db/**/*.ts`] } },
7
+ db: { [sharedDb]: { files: [`./db/**/*.ts`] } },
8
8
  });
@@ -14,7 +14,8 @@
14
14
  "typecheck": "tsc --noEmit"
15
15
  },
16
16
  "devDependencies": {
17
- "@tailor-platform/sdk": "2.0.0-next.5",
17
+ "@tailor-platform/eslint-plugin-sdk": "0.1.0-next.0",
18
+ "@tailor-platform/sdk": "2.0.0-next.7",
18
19
  "@types/node": "24.13.3",
19
20
  "oxfmt": "0.58.0",
20
21
  "oxlint": "1.73.0",
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "$schema": "./node_modules/oxlint/configuration_schema.json",
3
3
  "plugins": ["typescript"],
4
+ "jsPlugins": [
5
+ {
6
+ "name": "tailor-sdk",
7
+ "specifier": "@tailor-platform/eslint-plugin-sdk"
8
+ }
9
+ ],
4
10
  "categories": {
5
11
  "correctness": "error"
6
12
  },
@@ -9,6 +15,8 @@
9
15
  },
10
16
  "ignorePatterns": [".tailor/", "src/generated/", "tailor.d.ts"],
11
17
  "rules": {
18
+ "tailor-sdk/no-api-prefix-in-path-pattern": "warn",
19
+ "tailor-sdk/no-unconditional-permit": "warn",
12
20
  "no-case-declarations": "error",
13
21
  "no-empty": "error",
14
22
  "no-fallthrough": "error",
@@ -15,7 +15,8 @@
15
15
  "typecheck": "tsc --noEmit"
16
16
  },
17
17
  "devDependencies": {
18
- "@tailor-platform/sdk": "2.0.0-next.5",
18
+ "@tailor-platform/eslint-plugin-sdk": "0.1.0-next.0",
19
+ "@tailor-platform/sdk": "2.0.0-next.7",
19
20
  "@types/node": "24.13.3",
20
21
  "oxfmt": "0.58.0",
21
22
  "oxlint": "1.73.0",
@@ -5,7 +5,7 @@ import resolver from "./incrementUserAge";
5
5
  describe("incrementUserAge resolver", () => {
6
6
  test("increments user age", async () => {
7
7
  using db = mockTailordb();
8
- db.enqueueResults(
8
+ db.enqueueRows(
9
9
  [], // BEGIN
10
10
  [{ age: 30 }], // SELECT
11
11
  [], // UPDATE
@@ -24,7 +24,7 @@ describe("incrementUserAge resolver", () => {
24
24
 
25
25
  test("throws when user not found", async () => {
26
26
  using db = mockTailordb();
27
- db.enqueueResults(
27
+ db.enqueueRows(
28
28
  [], // BEGIN
29
29
  [], // SELECT (empty)
30
30
  [], // ROLLBACK
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "$schema": "./node_modules/oxlint/configuration_schema.json",
3
3
  "plugins": ["typescript"],
4
+ "jsPlugins": [
5
+ {
6
+ "name": "tailor-sdk",
7
+ "specifier": "@tailor-platform/eslint-plugin-sdk"
8
+ }
9
+ ],
4
10
  "categories": {
5
11
  "correctness": "error"
6
12
  },
@@ -9,6 +15,8 @@
9
15
  },
10
16
  "ignorePatterns": [".tailor/", "src/generated/", "tailor.d.ts"],
11
17
  "rules": {
18
+ "tailor-sdk/no-api-prefix-in-path-pattern": "warn",
19
+ "tailor-sdk/no-unconditional-permit": "warn",
12
20
  "no-case-declarations": "error",
13
21
  "no-empty": "error",
14
22
  "no-fallthrough": "error",
@@ -13,7 +13,8 @@
13
13
  "typecheck": "tsc --noEmit"
14
14
  },
15
15
  "devDependencies": {
16
- "@tailor-platform/sdk": "2.0.0-next.5",
16
+ "@tailor-platform/eslint-plugin-sdk": "0.1.0-next.0",
17
+ "@tailor-platform/sdk": "2.0.0-next.7",
17
18
  "@types/node": "24.13.3",
18
19
  "oxfmt": "0.58.0",
19
20
  "oxlint": "1.73.0",
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "$schema": "./node_modules/oxlint/configuration_schema.json",
3
3
  "plugins": ["typescript"],
4
+ "jsPlugins": [
5
+ {
6
+ "name": "tailor-sdk",
7
+ "specifier": "@tailor-platform/eslint-plugin-sdk"
8
+ }
9
+ ],
4
10
  "categories": {
5
11
  "correctness": "error"
6
12
  },
@@ -9,6 +15,8 @@
9
15
  },
10
16
  "ignorePatterns": [".tailor/", "src/generated/", "tailor.d.ts"],
11
17
  "rules": {
18
+ "tailor-sdk/no-api-prefix-in-path-pattern": "warn",
19
+ "tailor-sdk/no-unconditional-permit": "warn",
12
20
  "no-case-declarations": "error",
13
21
  "no-empty": "error",
14
22
  "no-fallthrough": "error",
@@ -15,7 +15,8 @@
15
15
  "typecheck": "tsc --noEmit"
16
16
  },
17
17
  "devDependencies": {
18
- "@tailor-platform/sdk": "2.0.0-next.5",
18
+ "@tailor-platform/eslint-plugin-sdk": "0.1.0-next.0",
19
+ "@tailor-platform/sdk": "2.0.0-next.7",
19
20
  "@types/node": "24.13.3",
20
21
  "oxfmt": "0.58.0",
21
22
  "oxlint": "1.73.0",
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "$schema": "./node_modules/oxlint/configuration_schema.json",
3
3
  "plugins": ["typescript"],
4
+ "jsPlugins": [
5
+ {
6
+ "name": "tailor-sdk",
7
+ "specifier": "@tailor-platform/eslint-plugin-sdk"
8
+ }
9
+ ],
4
10
  "categories": {
5
11
  "correctness": "error"
6
12
  },
@@ -9,6 +15,8 @@
9
15
  },
10
16
  "ignorePatterns": [".tailor/", "src/generated/", "tailor.d.ts"],
11
17
  "rules": {
18
+ "tailor-sdk/no-api-prefix-in-path-pattern": "warn",
19
+ "tailor-sdk/no-unconditional-permit": "warn",
12
20
  "no-case-declarations": "error",
13
21
  "no-empty": "error",
14
22
  "no-fallthrough": "error",
@@ -1,11 +1,11 @@
1
1
  # Workflow Template
2
2
 
3
- Demonstrates workflow patterns with job chaining, trigger testing, and dependency injection.
3
+ Demonstrates workflow patterns with job chaining, start testing, and dependency injection.
4
4
 
5
5
  ## Features
6
6
 
7
7
  - Workflow with multiple jobs (`createWorkflow`, `createWorkflowJob`)
8
- - Job chaining via `.trigger()`
8
+ - Job chaining via `.start()`
9
9
  - Database operations in workflow jobs (DI pattern)
10
10
  - Integration testing with `runWorkflowLocally()`
11
11
 
@@ -16,7 +16,8 @@
16
16
  "typecheck": "tsc --noEmit"
17
17
  },
18
18
  "devDependencies": {
19
- "@tailor-platform/sdk": "2.0.0-next.5",
19
+ "@tailor-platform/eslint-plugin-sdk": "0.1.0-next.0",
20
+ "@tailor-platform/sdk": "2.0.0-next.7",
20
21
  "@types/node": "24.13.3",
21
22
  "graphql": "17.0.2",
22
23
  "graphql-request": "7.4.0",
@@ -1,16 +1,18 @@
1
1
  import { describe, expect, test } from "vitest";
2
2
  import { mockWorkflow } from "@tailor-platform/sdk/vitest";
3
+ import { approval } from "../workflow/approval";
3
4
  import resolver from "./resolveApproval";
4
5
 
5
6
  describe("resolveApproval resolver", () => {
6
7
  test("resolves approval with approved=true", async () => {
7
8
  using wf = mockWorkflow();
8
- wf.setResolveHandler((_executionId, _key, callback) => {
9
- const callbackResult = callback({
10
- message: "Please approve order order-1",
11
- orderId: "order-1",
12
- });
13
- expect(callbackResult).toEqual({ approved: true });
9
+ const approvalMock = wf.waitPoint(approval);
10
+ const payload = {
11
+ message: "Please approve order order-1",
12
+ orderId: "order-1",
13
+ };
14
+ approvalMock.resolve.mockImplementation(async (_executionId, callback) => {
15
+ expect(await callback(payload)).toEqual({ approved: true });
14
16
  });
15
17
 
16
18
  const result = await resolver.body({
@@ -21,14 +23,15 @@ describe("resolveApproval resolver", () => {
21
23
  });
22
24
 
23
25
  expect(result).toEqual({ resolved: true });
24
- expect(wf.resolveCalls).toEqual([{ executionId: "exec-1", key: "approval" }]);
26
+ expect(approvalMock.resolve).toHaveBeenCalledWith("exec-1", expect.any(Function));
25
27
  });
26
28
 
27
29
  test("resolves approval with approved=false", async () => {
28
30
  using wf = mockWorkflow();
29
- wf.setResolveHandler((_executionId, _key, callback) => {
30
- const callbackResult = callback({ message: "Please approve", orderId: "order-2" });
31
- expect(callbackResult).toEqual({ approved: false });
31
+ const approvalMock = wf.waitPoint(approval);
32
+ const payload = { message: "Please approve", orderId: "order-2" };
33
+ approvalMock.resolve.mockImplementation(async (_executionId, callback) => {
34
+ expect(await callback(payload)).toEqual({ approved: false });
32
35
  });
33
36
 
34
37
  const result = await resolver.body({
@@ -39,5 +42,6 @@ describe("resolveApproval resolver", () => {
39
42
  });
40
43
 
41
44
  expect(result).toEqual({ resolved: true });
45
+ expect(approvalMock.resolve).toHaveBeenCalledWith("exec-2", expect.any(Function));
42
46
  });
43
47
  });
@@ -1,11 +1,12 @@
1
1
  import { describe, expect, test } from "vitest";
2
2
  import { mockWorkflow } from "@tailor-platform/sdk/vitest";
3
- import workflow, { processWithApproval } from "./approval";
3
+ import workflow, { approval, processWithApproval } from "./approval";
4
4
 
5
5
  describe("approval workflow", () => {
6
6
  test("approved flow returns approved status", async () => {
7
7
  using wf = mockWorkflow();
8
- wf.setWaitHandler((_key, _payload) => ({ approved: true }));
8
+ const approvalMock = wf.waitPoint(approval);
9
+ approvalMock.wait.mockResolvedValue({ approved: true });
9
10
 
10
11
  const result = await processWithApproval.body(
11
12
  { orderId: "order-1" },
@@ -13,17 +14,15 @@ describe("approval workflow", () => {
13
14
  );
14
15
 
15
16
  expect(result).toEqual({ orderId: "order-1", status: "approved" });
16
- expect(wf.waitCalls).toEqual([
17
- {
18
- key: "approval",
19
- payload: { message: "Please approve order order-1", orderId: "order-1" },
20
- },
21
- ]);
17
+ expect(approvalMock.wait).toHaveBeenCalledWith({
18
+ message: "Please approve order order-1",
19
+ orderId: "order-1",
20
+ });
22
21
  });
23
22
 
24
23
  test("rejected flow returns rejected status", async () => {
25
24
  using wf = mockWorkflow();
26
- wf.setWaitHandler({ approved: false });
25
+ wf.waitPoint(approval).wait.mockResolvedValue({ approved: false });
27
26
 
28
27
  const result = await processWithApproval.body(
29
28
  { orderId: "order-2" },
@@ -48,18 +48,18 @@ describe("order fulfillment workflow", () => {
48
48
  });
49
49
  });
50
50
 
51
- describe("orchestration tests with mocked triggers", () => {
51
+ describe("orchestration tests with mocked starts", () => {
52
52
  test("fulfillOrder chains all jobs", async () => {
53
- using _validateSpy = vi.spyOn(validateOrder, "trigger").mockReturnValue({
53
+ using _validateSpy = vi.spyOn(validateOrder, "start").mockReturnValue({
54
54
  valid: true,
55
55
  orderId: "order-1",
56
56
  });
57
- using _paymentSpy = vi.spyOn(processPayment, "trigger").mockReturnValue({
57
+ using _paymentSpy = vi.spyOn(processPayment, "start").mockReturnValue({
58
58
  transactionId: "txn-order-1",
59
59
  amount: 100,
60
60
  status: "completed" as const,
61
61
  });
62
- using _confirmSpy = vi.spyOn(sendConfirmation, "trigger").mockReturnValue({
62
+ using _confirmSpy = vi.spyOn(sendConfirmation, "start").mockReturnValue({
63
63
  orderId: "order-1",
64
64
  transactionId: "txn-order-1",
65
65
  confirmed: true,
@@ -70,15 +70,15 @@ describe("order fulfillment workflow", () => {
70
70
  { env: {}, invoker: null },
71
71
  );
72
72
 
73
- expect(validateOrder.trigger).toHaveBeenCalledWith({
73
+ expect(validateOrder.start).toHaveBeenCalledWith({
74
74
  orderId: "order-1",
75
75
  amount: 100,
76
76
  });
77
- expect(processPayment.trigger).toHaveBeenCalledWith({
77
+ expect(processPayment.start).toHaveBeenCalledWith({
78
78
  orderId: "order-1",
79
79
  amount: 100,
80
80
  });
81
- expect(sendConfirmation.trigger).toHaveBeenCalledWith({
81
+ expect(sendConfirmation.start).toHaveBeenCalledWith({
82
82
  orderId: "order-1",
83
83
  transactionId: "txn-order-1",
84
84
  });
@@ -91,16 +91,16 @@ describe("order fulfillment workflow", () => {
91
91
  });
92
92
 
93
93
  test("workflow.mainJob.body() chains all jobs", async () => {
94
- using _validateSpy = vi.spyOn(validateOrder, "trigger").mockReturnValue({
94
+ using _validateSpy = vi.spyOn(validateOrder, "start").mockReturnValue({
95
95
  valid: true,
96
96
  orderId: "order-2",
97
97
  });
98
- using _paymentSpy = vi.spyOn(processPayment, "trigger").mockReturnValue({
98
+ using _paymentSpy = vi.spyOn(processPayment, "start").mockReturnValue({
99
99
  transactionId: "txn-order-2",
100
100
  amount: 200,
101
101
  status: "completed" as const,
102
102
  });
103
- using _confirmSpy = vi.spyOn(sendConfirmation, "trigger").mockReturnValue({
103
+ using _confirmSpy = vi.spyOn(sendConfirmation, "start").mockReturnValue({
104
104
  orderId: "order-2",
105
105
  transactionId: "txn-order-2",
106
106
  confirmed: true,
@@ -35,7 +35,7 @@ export const sendConfirmation = createWorkflowJob({
35
35
  export const fulfillOrder = createWorkflowJob({
36
36
  name: "fulfill-order",
37
37
  body: (input: { orderId: string; amount: number }) => {
38
- const validation = validateOrder.trigger({
38
+ const validation = validateOrder.start({
39
39
  orderId: input.orderId,
40
40
  amount: input.amount,
41
41
  });
@@ -44,12 +44,12 @@ export const fulfillOrder = createWorkflowJob({
44
44
  throw new Error("Order validation failed");
45
45
  }
46
46
 
47
- const payment = processPayment.trigger({
47
+ const payment = processPayment.start({
48
48
  orderId: input.orderId,
49
49
  amount: input.amount,
50
50
  });
51
51
 
52
- const confirmation = sendConfirmation.trigger({
52
+ const confirmation = sendConfirmation.start({
53
53
  orderId: input.orderId,
54
54
  transactionId: payment.transactionId,
55
55
  });