@tailor-platform/create-sdk 2.0.0-next.4 → 2.0.0-next.6
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 +8 -0
- package/package.json +6 -6
- package/templates/executor/package.json +5 -5
- package/templates/generators/package.json +5 -5
- package/templates/generators/src/resolver/getProduct.test.ts +27 -24
- package/templates/generators/src/seed/data/Order.schema.ts +2 -2
- package/templates/generators/src/seed/data/Product.schema.ts +2 -2
- package/templates/generators/src/seed/data/User.schema.ts +2 -2
- package/templates/hello-world/package.json +4 -4
- package/templates/inventory-management/package.json +4 -4
- package/templates/inventory-management/src/db/inventory.ts +1 -1
- package/templates/inventory-management/src/db/orderItem.ts +11 -7
- package/templates/inventory-management/src/generated/kysely-tailordb.ts +1 -1
- package/templates/inventory-management/src/resolver/registerOrder.ts +3 -1
- package/templates/multi-application/package.json +4 -4
- package/templates/resolver/package.json +5 -5
- package/templates/resolver/src/resolver/incrementUserAge.test.ts +2 -2
- package/templates/static-web-site/package.json +4 -4
- package/templates/tailordb/package.json +5 -5
- package/templates/tailordb/src/db/comment.ts +3 -1
- package/templates/tailordb/src/db/task.ts +18 -26
- package/templates/workflow/package.json +6 -6
- package/templates/workflow/src/resolver/resolveApproval.test.ts +14 -10
- package/templates/workflow/src/workflow/approval.test.ts +8 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @tailor-platform/create-sdk
|
|
2
2
|
|
|
3
|
+
## 2.0.0-next.6
|
|
4
|
+
|
|
5
|
+
## 2.0.0-next.5
|
|
6
|
+
|
|
7
|
+
### Patch Changes
|
|
8
|
+
|
|
9
|
+
- [#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.
|
|
10
|
+
|
|
3
11
|
## 2.0.0-next.4
|
|
4
12
|
|
|
5
13
|
### 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.
|
|
3
|
+
"version": "2.0.0-next.6",
|
|
4
4
|
"description": "A CLI tool to quickly create a new Tailor Platform SDK project",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -17,19 +17,19 @@
|
|
|
17
17
|
],
|
|
18
18
|
"type": "module",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@clack/prompts": "1.
|
|
20
|
+
"@clack/prompts": "1.7.0",
|
|
21
21
|
"execa": "9.6.1",
|
|
22
22
|
"picocolors": "1.1.1",
|
|
23
23
|
"pkg-types": "2.3.1",
|
|
24
|
-
"politty": "0.11.
|
|
24
|
+
"politty": "0.11.2",
|
|
25
25
|
"zod": "4.4.3"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@types/node": "24.13.
|
|
28
|
+
"@types/node": "24.13.3",
|
|
29
29
|
"eslint-plugin-zod": "4.7.0",
|
|
30
|
-
"oxlint": "1.
|
|
30
|
+
"oxlint": "1.73.0",
|
|
31
31
|
"oxlint-tsgolint": "0.24.0",
|
|
32
|
-
"tsdown": "0.22.
|
|
32
|
+
"tsdown": "0.22.5",
|
|
33
33
|
"typescript": "6.0.3"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
"typecheck": "tsc --noEmit"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@tailor-platform/sdk": "2.0.0-next.
|
|
19
|
-
"@types/node": "24.13.
|
|
20
|
-
"oxfmt": "0.
|
|
21
|
-
"oxlint": "1.
|
|
18
|
+
"@tailor-platform/sdk": "2.0.0-next.6",
|
|
19
|
+
"@types/node": "24.13.3",
|
|
20
|
+
"oxfmt": "0.58.0",
|
|
21
|
+
"oxlint": "1.73.0",
|
|
22
22
|
"oxlint-tsgolint": "0.24.0",
|
|
23
23
|
"typescript": "6.0.3",
|
|
24
|
-
"vitest": "4.1.
|
|
24
|
+
"vitest": "4.1.10"
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
"typecheck": "tsc --noEmit"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@tailor-platform/sdk": "2.0.0-next.
|
|
19
|
-
"@types/node": "24.13.
|
|
20
|
-
"oxfmt": "0.
|
|
21
|
-
"oxlint": "1.
|
|
18
|
+
"@tailor-platform/sdk": "2.0.0-next.6",
|
|
19
|
+
"@types/node": "24.13.3",
|
|
20
|
+
"oxfmt": "0.58.0",
|
|
21
|
+
"oxlint": "1.73.0",
|
|
22
22
|
"oxlint-tsgolint": "0.24.0",
|
|
23
23
|
"typescript": "6.0.3",
|
|
24
|
-
"vitest": "4.1.
|
|
24
|
+
"vitest": "4.1.10"
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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" },
|
|
@@ -4,8 +4,8 @@ import { createTailorDBHook, createStandardSchema } from "@tailor-platform/sdk/t
|
|
|
4
4
|
import { order } from "../../db/order";
|
|
5
5
|
|
|
6
6
|
const schemaType = t.object({
|
|
7
|
-
...order.pickFields(["id"
|
|
8
|
-
...order.omitFields(["id"
|
|
7
|
+
...order.pickFields(["id"], { optional: true }),
|
|
8
|
+
...order.omitFields(["id"]),
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
const hook = createTailorDBHook(order);
|
|
@@ -4,8 +4,8 @@ import { createTailorDBHook, createStandardSchema } from "@tailor-platform/sdk/t
|
|
|
4
4
|
import { product } from "../../db/product";
|
|
5
5
|
|
|
6
6
|
const schemaType = t.object({
|
|
7
|
-
...product.pickFields(["id"
|
|
8
|
-
...product.omitFields(["id"
|
|
7
|
+
...product.pickFields(["id"], { optional: true }),
|
|
8
|
+
...product.omitFields(["id"]),
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
const hook = createTailorDBHook(product);
|
|
@@ -4,8 +4,8 @@ import { createTailorDBHook, createStandardSchema } from "@tailor-platform/sdk/t
|
|
|
4
4
|
import { user } from "../../db/user";
|
|
5
5
|
|
|
6
6
|
const schemaType = t.object({
|
|
7
|
-
...user.pickFields(["id"
|
|
8
|
-
...user.omitFields(["id"
|
|
7
|
+
...user.pickFields(["id"], { optional: true }),
|
|
8
|
+
...user.omitFields(["id"]),
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
const hook = createTailorDBHook(user);
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"typecheck": "tsc --noEmit"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@tailor-platform/sdk": "2.0.0-next.
|
|
17
|
-
"@types/node": "24.13.
|
|
18
|
-
"oxfmt": "0.
|
|
19
|
-
"oxlint": "1.
|
|
16
|
+
"@tailor-platform/sdk": "2.0.0-next.6",
|
|
17
|
+
"@types/node": "24.13.3",
|
|
18
|
+
"oxfmt": "0.58.0",
|
|
19
|
+
"oxlint": "1.73.0",
|
|
20
20
|
"oxlint-tsgolint": "0.24.0",
|
|
21
21
|
"typescript": "6.0.3"
|
|
22
22
|
}
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"typecheck": "tsc --noEmit"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@tailor-platform/sdk": "2.0.0-next.
|
|
17
|
-
"@types/node": "24.13.
|
|
18
|
-
"oxfmt": "0.
|
|
19
|
-
"oxlint": "1.
|
|
16
|
+
"@tailor-platform/sdk": "2.0.0-next.6",
|
|
17
|
+
"@types/node": "24.13.3",
|
|
18
|
+
"oxfmt": "0.58.0",
|
|
19
|
+
"oxlint": "1.73.0",
|
|
20
20
|
"oxlint-tsgolint": "0.24.0",
|
|
21
21
|
"typescript": "6.0.3"
|
|
22
22
|
}
|
|
@@ -11,7 +11,7 @@ export const inventory = db
|
|
|
11
11
|
quantity: db
|
|
12
12
|
.int()
|
|
13
13
|
.description("Quantity of the product in inventory")
|
|
14
|
-
.validate(({ value }) => value
|
|
14
|
+
.validate(({ value }) => (value < 0 ? "Quantity must be non-negative" : undefined)),
|
|
15
15
|
...db.fields.timestamps(),
|
|
16
16
|
})
|
|
17
17
|
.permission(permissionLoggedIn)
|
|
@@ -16,19 +16,23 @@ export const orderItem = db
|
|
|
16
16
|
quantity: db
|
|
17
17
|
.int()
|
|
18
18
|
.description("Quantity of the product")
|
|
19
|
-
.validate(({ value }) => value
|
|
19
|
+
.validate(({ value }) => (value < 0 ? "Quantity must be non-negative" : undefined)),
|
|
20
20
|
unitPrice: db
|
|
21
21
|
.float()
|
|
22
22
|
.description("Unit price of the product")
|
|
23
|
-
.validate(({ value }) => value
|
|
24
|
-
totalPrice: db.float(
|
|
23
|
+
.validate(({ value }) => (value < 0 ? "Unit price must be non-negative" : undefined)),
|
|
24
|
+
totalPrice: db.float().default(0).description("Total price of the order item"),
|
|
25
25
|
...db.fields.timestamps(),
|
|
26
26
|
})
|
|
27
27
|
.hooks({
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
28
|
+
create: ({ input }) => ({
|
|
29
|
+
totalPrice: (input?.quantity ?? 0) * (input?.unitPrice ?? 0),
|
|
30
|
+
}),
|
|
31
|
+
update: ({ input, oldRecord }) => ({
|
|
32
|
+
totalPrice:
|
|
33
|
+
(input?.quantity ?? oldRecord?.quantity ?? 0) *
|
|
34
|
+
(input?.unitPrice ?? oldRecord?.unitPrice ?? 0),
|
|
35
|
+
}),
|
|
32
36
|
})
|
|
33
37
|
.permission(permissionLoggedIn)
|
|
34
38
|
.gqlPermission(gqlPermissionLoggedIn);
|
|
@@ -5,7 +5,9 @@ import { type DB, getDB } from "../generated/kysely-tailordb";
|
|
|
5
5
|
|
|
6
6
|
const input = {
|
|
7
7
|
order: t.object(order.omitFields(["id", "createdAt", "updatedAt"])),
|
|
8
|
-
items: t.object(orderItem.omitFields(["id", "createdAt", "updatedAt"]), {
|
|
8
|
+
items: t.object(orderItem.omitFields(["id", "createdAt", "updatedAt", "totalPrice"]), {
|
|
9
|
+
array: true,
|
|
10
|
+
}),
|
|
9
11
|
};
|
|
10
12
|
interface Input {
|
|
11
13
|
order: t.infer<typeof input.order>;
|
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
"typecheck": "tsc --noEmit"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@tailor-platform/sdk": "2.0.0-next.
|
|
18
|
-
"@types/node": "24.13.
|
|
19
|
-
"oxfmt": "0.
|
|
20
|
-
"oxlint": "1.
|
|
17
|
+
"@tailor-platform/sdk": "2.0.0-next.6",
|
|
18
|
+
"@types/node": "24.13.3",
|
|
19
|
+
"oxfmt": "0.58.0",
|
|
20
|
+
"oxlint": "1.73.0",
|
|
21
21
|
"oxlint-tsgolint": "0.24.0",
|
|
22
22
|
"typescript": "6.0.3"
|
|
23
23
|
}
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
"typecheck": "tsc --noEmit"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@tailor-platform/sdk": "2.0.0-next.
|
|
19
|
-
"@types/node": "24.13.
|
|
20
|
-
"oxfmt": "0.
|
|
21
|
-
"oxlint": "1.
|
|
18
|
+
"@tailor-platform/sdk": "2.0.0-next.6",
|
|
19
|
+
"@types/node": "24.13.3",
|
|
20
|
+
"oxfmt": "0.58.0",
|
|
21
|
+
"oxlint": "1.73.0",
|
|
22
22
|
"oxlint-tsgolint": "0.24.0",
|
|
23
23
|
"typescript": "6.0.3",
|
|
24
|
-
"vitest": "4.1.
|
|
24
|
+
"vitest": "4.1.10"
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -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.
|
|
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.
|
|
27
|
+
db.enqueueRows(
|
|
28
28
|
[], // BEGIN
|
|
29
29
|
[], // SELECT (empty)
|
|
30
30
|
[], // ROLLBACK
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"typecheck": "tsc --noEmit"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@tailor-platform/sdk": "2.0.0-next.
|
|
17
|
-
"@types/node": "24.13.
|
|
18
|
-
"oxfmt": "0.
|
|
19
|
-
"oxlint": "1.
|
|
16
|
+
"@tailor-platform/sdk": "2.0.0-next.6",
|
|
17
|
+
"@types/node": "24.13.3",
|
|
18
|
+
"oxfmt": "0.58.0",
|
|
19
|
+
"oxlint": "1.73.0",
|
|
20
20
|
"oxlint-tsgolint": "0.24.0",
|
|
21
21
|
"typescript": "6.0.3"
|
|
22
22
|
}
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
"typecheck": "tsc --noEmit"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@tailor-platform/sdk": "2.0.0-next.
|
|
19
|
-
"@types/node": "24.13.
|
|
20
|
-
"oxfmt": "0.
|
|
21
|
-
"oxlint": "1.
|
|
18
|
+
"@tailor-platform/sdk": "2.0.0-next.6",
|
|
19
|
+
"@types/node": "24.13.3",
|
|
20
|
+
"oxfmt": "0.58.0",
|
|
21
|
+
"oxlint": "1.73.0",
|
|
22
22
|
"oxlint-tsgolint": "0.24.0",
|
|
23
23
|
"typescript": "6.0.3",
|
|
24
|
-
"vitest": "4.1.
|
|
24
|
+
"vitest": "4.1.10"
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -5,7 +5,9 @@ import { user } from "./user";
|
|
|
5
5
|
|
|
6
6
|
export const comment = db
|
|
7
7
|
.table("Comment", "A comment on a task", {
|
|
8
|
-
body: db
|
|
8
|
+
body: db
|
|
9
|
+
.string()
|
|
10
|
+
.validate(({ value }) => (value.length < 1 ? "Comment must not be empty" : undefined)),
|
|
9
11
|
taskId: db.uuid().relation({
|
|
10
12
|
type: "n-1",
|
|
11
13
|
toward: { type: task },
|
|
@@ -5,12 +5,10 @@ import { user } from "./user";
|
|
|
5
5
|
|
|
6
6
|
export const task = db
|
|
7
7
|
.table("Task", "A task with comprehensive features", {
|
|
8
|
-
title: db
|
|
9
|
-
|
|
10
|
-
.
|
|
11
|
-
|
|
12
|
-
[({ value }) => value.length <= 200, "Title must be at most 200 characters"],
|
|
13
|
-
),
|
|
8
|
+
title: db.string().validate(
|
|
9
|
+
({ value }) => (value.length >= 3 ? undefined : "Title must be at least 3 characters"),
|
|
10
|
+
({ value }) => (value.length <= 200 ? undefined : "Title must be at most 200 characters"),
|
|
11
|
+
),
|
|
14
12
|
description: db.string({ optional: true }),
|
|
15
13
|
status: db.enum([
|
|
16
14
|
{ value: "TODO", description: "Not started" },
|
|
@@ -18,12 +16,10 @@ export const task = db
|
|
|
18
16
|
{ value: "DONE", description: "Completed" },
|
|
19
17
|
{ value: "CANCELLED", description: "No longer needed" },
|
|
20
18
|
]),
|
|
21
|
-
priority: db
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
[({ value }) => value <= 4, "Priority must be at most 4"],
|
|
26
|
-
),
|
|
19
|
+
priority: db.int().validate(
|
|
20
|
+
({ value }) => (value >= 0 ? undefined : "Priority must be non-negative"),
|
|
21
|
+
({ value }) => (value <= 4 ? undefined : "Priority must be at most 4"),
|
|
22
|
+
),
|
|
27
23
|
dueDate: db.datetime({ optional: true }),
|
|
28
24
|
assigneeId: db.uuid({ optional: true }).relation({
|
|
29
25
|
type: "n-1",
|
|
@@ -33,26 +29,22 @@ export const task = db
|
|
|
33
29
|
type: "n-1",
|
|
34
30
|
toward: { type: category },
|
|
35
31
|
}),
|
|
36
|
-
isArchived: db
|
|
32
|
+
isArchived: db
|
|
33
|
+
.bool()
|
|
34
|
+
.description("Whether the task is archived")
|
|
35
|
+
.hooks({
|
|
36
|
+
create: () => false,
|
|
37
|
+
}),
|
|
37
38
|
...db.fields.timestamps(),
|
|
38
39
|
})
|
|
39
|
-
.hooks({
|
|
40
|
-
isArchived: {
|
|
41
|
-
create: () => false,
|
|
42
|
-
},
|
|
43
|
-
})
|
|
44
40
|
.indexes(
|
|
45
41
|
{ fields: ["status", "priority"], unique: false },
|
|
46
42
|
{ fields: ["assigneeId", "status"], unique: false, name: "task_assignee_status_idx" },
|
|
47
43
|
)
|
|
48
|
-
.validate({
|
|
49
|
-
status
|
|
50
|
-
(
|
|
51
|
-
|
|
52
|
-
return !(value === "DONE" && d.dueDate === null);
|
|
53
|
-
},
|
|
54
|
-
"Completed tasks must have a due date",
|
|
55
|
-
],
|
|
44
|
+
.validate(({ newRecord }, issues) => {
|
|
45
|
+
if (newRecord.status === "DONE" && !newRecord.dueDate) {
|
|
46
|
+
issues("status", "Completed tasks must have a due date");
|
|
47
|
+
}
|
|
56
48
|
})
|
|
57
49
|
.permission(rolePermission)
|
|
58
50
|
.gqlPermission(roleGqlPermission);
|
|
@@ -16,14 +16,14 @@
|
|
|
16
16
|
"typecheck": "tsc --noEmit"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@tailor-platform/sdk": "2.0.0-next.
|
|
20
|
-
"@types/node": "24.13.
|
|
21
|
-
"graphql": "17.0.
|
|
19
|
+
"@tailor-platform/sdk": "2.0.0-next.6",
|
|
20
|
+
"@types/node": "24.13.3",
|
|
21
|
+
"graphql": "17.0.2",
|
|
22
22
|
"graphql-request": "7.4.0",
|
|
23
|
-
"oxfmt": "0.
|
|
24
|
-
"oxlint": "1.
|
|
23
|
+
"oxfmt": "0.58.0",
|
|
24
|
+
"oxlint": "1.73.0",
|
|
25
25
|
"oxlint-tsgolint": "0.24.0",
|
|
26
26
|
"typescript": "6.0.3",
|
|
27
|
-
"vitest": "4.1.
|
|
27
|
+
"vitest": "4.1.10"
|
|
28
28
|
}
|
|
29
29
|
}
|
|
@@ -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.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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(
|
|
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.
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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.
|
|
25
|
+
wf.waitPoint(approval).wait.mockResolvedValue({ approved: false });
|
|
27
26
|
|
|
28
27
|
const result = await processWithApproval.body(
|
|
29
28
|
{ orderId: "order-2" },
|