@tailor-platform/create-sdk 1.19.0 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/index.js +7 -2
  3. package/package.json +1 -1
  4. package/templates/executor/README.md +32 -0
  5. package/templates/{testing → executor}/eslint.config.js +0 -5
  6. package/templates/executor/package.json +30 -0
  7. package/templates/executor/src/db/auditLog.ts +24 -0
  8. package/templates/executor/src/db/notification.ts +27 -0
  9. package/templates/executor/src/db/user.ts +22 -0
  10. package/templates/executor/src/executor/dailyCleanup.ts +16 -0
  11. package/templates/executor/src/executor/externalWebhook.ts +18 -0
  12. package/templates/executor/src/executor/onDataProcessed.ts +26 -0
  13. package/templates/executor/src/executor/onIdpUserCreated.ts +19 -0
  14. package/templates/executor/src/executor/onIdpUserDeleted.ts +19 -0
  15. package/templates/executor/src/executor/onIdpUserUpdated.ts +19 -0
  16. package/templates/executor/src/executor/onTokenIssued.ts +19 -0
  17. package/templates/executor/src/executor/onTokenRefreshed.ts +19 -0
  18. package/templates/executor/src/executor/onTokenRevoked.ts +19 -0
  19. package/templates/executor/src/executor/onUserCreated.ts +23 -0
  20. package/templates/executor/src/executor/onUserDeleted.ts +22 -0
  21. package/templates/executor/src/executor/onUserUpdated.ts +22 -0
  22. package/templates/executor/src/executor/shared.test.ts +36 -0
  23. package/templates/executor/src/executor/shared.ts +13 -0
  24. package/templates/executor/src/generated/db.ts +59 -0
  25. package/templates/executor/src/resolver/processData.ts +22 -0
  26. package/templates/executor/src/workflow/cleanup.ts +13 -0
  27. package/templates/executor/tailor.config.ts +40 -0
  28. package/templates/executor/vitest.config.ts +15 -0
  29. package/templates/generators/.oxfmtrc.json +3 -0
  30. package/templates/generators/.oxlintrc.json +197 -0
  31. package/templates/generators/.prettierignore +1 -0
  32. package/templates/generators/.prettierrc +1 -0
  33. package/templates/generators/README.md +30 -0
  34. package/templates/generators/__dot__gitignore +3 -0
  35. package/templates/generators/eslint.config.js +24 -0
  36. package/templates/generators/package.json +30 -0
  37. package/templates/generators/src/db/category.ts +25 -0
  38. package/templates/generators/src/db/order.ts +38 -0
  39. package/templates/generators/src/db/product.ts +34 -0
  40. package/templates/generators/src/db/user.ts +26 -0
  41. package/templates/generators/src/generated/db.ts +68 -0
  42. package/templates/generators/src/generated/enums.ts +39 -0
  43. package/templates/generators/src/generated/files.ts +51 -0
  44. package/templates/generators/src/resolver/getProduct.test.ts +92 -0
  45. package/templates/generators/src/resolver/getProduct.ts +53 -0
  46. package/templates/generators/src/seed/data/Category.jsonl +0 -0
  47. package/templates/generators/src/seed/data/Category.schema.ts +23 -0
  48. package/templates/generators/src/seed/data/Order.jsonl +0 -0
  49. package/templates/generators/src/seed/data/Order.schema.ts +21 -0
  50. package/templates/generators/src/seed/data/Product.jsonl +0 -0
  51. package/templates/generators/src/seed/data/Product.schema.ts +23 -0
  52. package/templates/generators/src/seed/data/User.jsonl +0 -0
  53. package/templates/generators/src/seed/data/User.schema.ts +20 -0
  54. package/templates/generators/src/seed/exec.mjs +419 -0
  55. package/templates/generators/tailor.config.ts +36 -0
  56. package/templates/generators/tsconfig.json +16 -0
  57. package/templates/generators/vitest.config.ts +15 -0
  58. package/templates/hello-world/package.json +1 -1
  59. package/templates/inventory-management/package.json +1 -1
  60. package/templates/inventory-management/user-defined.d.ts +15 -0
  61. package/templates/multi-application/package.json +1 -1
  62. package/templates/resolver/.oxfmtrc.json +3 -0
  63. package/templates/resolver/.oxlintrc.json +197 -0
  64. package/templates/resolver/.prettierrc +1 -0
  65. package/templates/resolver/README.md +31 -0
  66. package/templates/resolver/__dot__gitignore +3 -0
  67. package/templates/resolver/eslint.config.js +24 -0
  68. package/templates/resolver/package.json +30 -0
  69. package/templates/resolver/src/resolver/add.test.ts +23 -0
  70. package/templates/{testing/src/resolver/mockTailordb.test.ts → resolver/src/resolver/queryUser.test.ts} +5 -6
  71. package/templates/{testing/src/resolver/mockTailordb.ts → resolver/src/resolver/queryUser.ts} +0 -5
  72. package/templates/resolver/src/resolver/showEnv.test.ts +14 -0
  73. package/templates/resolver/src/resolver/showEnv.ts +19 -0
  74. package/templates/resolver/src/resolver/showUserInfo.test.ts +37 -0
  75. package/templates/resolver/src/resolver/showUserInfo.ts +21 -0
  76. package/templates/{testing/src/resolver/wrapTailordb.test.ts → resolver/src/resolver/updateUser.test.ts} +3 -5
  77. package/templates/{testing/src/resolver/wrapTailordb.ts → resolver/src/resolver/updateUser.ts} +0 -5
  78. package/templates/resolver/tailor.config.ts +26 -0
  79. package/templates/resolver/tsconfig.json +16 -0
  80. package/templates/resolver/user-defined.d.ts +18 -0
  81. package/templates/resolver/vitest.config.ts +15 -0
  82. package/templates/static-web-site/.oxfmtrc.json +3 -0
  83. package/templates/static-web-site/.oxlintrc.json +197 -0
  84. package/templates/static-web-site/.prettierrc +1 -0
  85. package/templates/static-web-site/README.md +21 -0
  86. package/templates/static-web-site/__dot__gitignore +3 -0
  87. package/templates/static-web-site/eslint.config.js +24 -0
  88. package/templates/static-web-site/package.json +27 -0
  89. package/templates/static-web-site/public/callback.html +34 -0
  90. package/templates/static-web-site/public/index.html +55 -0
  91. package/templates/static-web-site/public/style.css +62 -0
  92. package/templates/static-web-site/src/db/user.ts +22 -0
  93. package/templates/static-web-site/tailor.config.ts +55 -0
  94. package/templates/static-web-site/tsconfig.json +16 -0
  95. package/templates/tailordb/.oxfmtrc.json +3 -0
  96. package/templates/tailordb/.oxlintrc.json +197 -0
  97. package/templates/tailordb/.prettierrc +1 -0
  98. package/templates/tailordb/README.md +29 -0
  99. package/templates/tailordb/__dot__gitignore +3 -0
  100. package/templates/tailordb/eslint.config.js +24 -0
  101. package/templates/tailordb/package.json +30 -0
  102. package/templates/tailordb/src/db/category.ts +15 -0
  103. package/templates/tailordb/src/db/comment.ts +26 -0
  104. package/templates/tailordb/src/db/permission.ts +43 -0
  105. package/templates/tailordb/src/db/task.test.ts +41 -0
  106. package/templates/tailordb/src/db/task.ts +58 -0
  107. package/templates/tailordb/src/db/user.ts +19 -0
  108. package/templates/tailordb/src/generated/db.ts +75 -0
  109. package/templates/tailordb/tailor.config.ts +26 -0
  110. package/templates/tailordb/tsconfig.json +16 -0
  111. package/templates/tailordb/user-defined.d.ts +15 -0
  112. package/templates/tailordb/vitest.config.ts +15 -0
  113. package/templates/workflow/.oxfmtrc.json +3 -0
  114. package/templates/workflow/.oxlintrc.json +197 -0
  115. package/templates/workflow/.prettierrc +1 -0
  116. package/templates/workflow/README.md +25 -0
  117. package/templates/workflow/__dot__gitignore +3 -0
  118. package/templates/{testing → workflow}/e2e/globalSetup.ts +5 -5
  119. package/templates/workflow/e2e/resolver.test.ts +90 -0
  120. package/templates/workflow/e2e/workflow.test.ts +31 -0
  121. package/templates/workflow/eslint.config.js +24 -0
  122. package/templates/{testing → workflow}/package.json +3 -2
  123. package/templates/workflow/src/db/order.ts +22 -0
  124. package/templates/workflow/src/db/user.ts +22 -0
  125. package/templates/workflow/src/generated/db.ts +48 -0
  126. package/templates/workflow/src/resolver/incrementAge.ts +40 -0
  127. package/templates/workflow/src/workflow/order-fulfillment.test.ts +148 -0
  128. package/templates/workflow/src/workflow/order-fulfillment.ts +69 -0
  129. package/templates/{testing/src/workflow/wrapTailordb.test.ts → workflow/src/workflow/sync-profile.test.ts} +1 -1
  130. package/templates/{testing → workflow}/tailor.config.ts +1 -1
  131. package/templates/workflow/tsconfig.json +16 -0
  132. package/templates/workflow/user-defined.d.ts +15 -0
  133. package/templates/testing/README.md +0 -130
  134. package/templates/testing/e2e/resolver.test.ts +0 -57
  135. package/templates/testing/e2e/workflow.test.ts +0 -47
  136. package/templates/testing/src/resolver/simple.test.ts +0 -14
  137. package/templates/testing/src/workflow/simple.test.ts +0 -88
  138. package/templates/testing/src/workflow/simple.ts +0 -36
  139. package/templates/testing/src/workflow/trigger.test.ts +0 -104
  140. /package/templates/{testing → executor}/.oxfmtrc.json +0 -0
  141. /package/templates/{testing → executor}/.oxlintrc.json +0 -0
  142. /package/templates/{testing → executor}/.prettierrc +0 -0
  143. /package/templates/{testing → executor}/__dot__gitignore +0 -0
  144. /package/templates/{testing → executor}/tsconfig.json +0 -0
  145. /package/templates/{testing → resolver}/src/db/user.ts +0 -0
  146. /package/templates/{testing → resolver}/src/generated/db.ts +0 -0
  147. /package/templates/{testing/src/resolver/simple.ts → resolver/src/resolver/add.ts} +0 -0
  148. /package/templates/{testing/src/workflow/wrapTailordb.ts → workflow/src/workflow/sync-profile.ts} +0 -0
  149. /package/templates/{testing → workflow}/vitest.config.ts +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ "ignorePatterns": ["src/generated/", "pnpm-lock.yaml"]
3
+ }
@@ -0,0 +1,197 @@
1
+ {
2
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
3
+ "plugins": ["typescript"],
4
+ "categories": {
5
+ "correctness": "off"
6
+ },
7
+ "env": {
8
+ "builtin": true
9
+ },
10
+ "ignorePatterns": [".tailor-sdk/", "src/generated/"],
11
+ "rules": {
12
+ "constructor-super": "error",
13
+ "for-direction": "error",
14
+ "no-async-promise-executor": "error",
15
+ "no-case-declarations": "error",
16
+ "no-class-assign": "error",
17
+ "no-compare-neg-zero": "error",
18
+ "no-cond-assign": "error",
19
+ "no-const-assign": "error",
20
+ "no-constant-binary-expression": "error",
21
+ "no-constant-condition": "error",
22
+ "no-control-regex": "error",
23
+ "no-debugger": "error",
24
+ "no-delete-var": "error",
25
+ "no-dupe-class-members": "error",
26
+ "no-dupe-else-if": "error",
27
+ "no-dupe-keys": "error",
28
+ "no-duplicate-case": "error",
29
+ "no-empty": "error",
30
+ "no-empty-character-class": "error",
31
+ "no-empty-pattern": "error",
32
+ "no-empty-static-block": "error",
33
+ "no-ex-assign": "error",
34
+ "no-extra-boolean-cast": "error",
35
+ "no-fallthrough": "error",
36
+ "no-func-assign": "error",
37
+ "no-global-assign": "error",
38
+ "no-import-assign": "error",
39
+ "no-invalid-regexp": "error",
40
+ "no-irregular-whitespace": "error",
41
+ "no-loss-of-precision": "error",
42
+ "no-new-native-nonconstructor": "error",
43
+ "no-nonoctal-decimal-escape": "error",
44
+ "no-obj-calls": "error",
45
+ "no-prototype-builtins": "error",
46
+ "no-redeclare": "error",
47
+ "no-regex-spaces": "error",
48
+ "no-self-assign": "error",
49
+ "no-setter-return": "error",
50
+ "no-shadow-restricted-names": "error",
51
+ "no-sparse-arrays": "error",
52
+ "no-this-before-super": "error",
53
+ "no-unexpected-multiline": "error",
54
+ "no-unsafe-finally": "error",
55
+ "no-unsafe-negation": "error",
56
+ "no-unsafe-optional-chaining": "error",
57
+ "no-unused-labels": "error",
58
+ "no-unused-private-class-members": "error",
59
+ "no-unused-vars": "error",
60
+ "no-useless-backreference": "error",
61
+ "no-useless-catch": "error",
62
+ "no-useless-escape": "error",
63
+ "no-with": "error",
64
+ "require-yield": "error",
65
+ "use-isnan": "error",
66
+ "valid-typeof": "error",
67
+ "@typescript-eslint/await-thenable": "error",
68
+ "@typescript-eslint/ban-ts-comment": "error",
69
+ "no-array-constructor": "error",
70
+ "@typescript-eslint/no-array-delete": "error",
71
+ "@typescript-eslint/no-base-to-string": "error",
72
+ "@typescript-eslint/no-duplicate-enum-values": "error",
73
+ "@typescript-eslint/no-duplicate-type-constituents": "error",
74
+ "@typescript-eslint/no-empty-object-type": "error",
75
+ "@typescript-eslint/no-explicit-any": "error",
76
+ "@typescript-eslint/no-extra-non-null-assertion": "error",
77
+ "@typescript-eslint/no-floating-promises": "error",
78
+ "@typescript-eslint/no-for-in-array": "error",
79
+ "@typescript-eslint/no-implied-eval": "error",
80
+ "@typescript-eslint/no-misused-new": "error",
81
+ "@typescript-eslint/no-misused-promises": "error",
82
+ "@typescript-eslint/no-namespace": "error",
83
+ "@typescript-eslint/no-non-null-asserted-optional-chain": "error",
84
+ "@typescript-eslint/no-redundant-type-constituents": "error",
85
+ "@typescript-eslint/no-require-imports": "error",
86
+ "@typescript-eslint/no-this-alias": "error",
87
+ "@typescript-eslint/no-unnecessary-type-assertion": "error",
88
+ "@typescript-eslint/no-unnecessary-type-constraint": "error",
89
+ "@typescript-eslint/no-unsafe-argument": "error",
90
+ "@typescript-eslint/no-unsafe-assignment": "error",
91
+ "@typescript-eslint/no-unsafe-call": "error",
92
+ "@typescript-eslint/no-unsafe-declaration-merging": "error",
93
+ "@typescript-eslint/no-unsafe-enum-comparison": "error",
94
+ "@typescript-eslint/no-unsafe-function-type": "error",
95
+ "@typescript-eslint/no-unsafe-member-access": "error",
96
+ "@typescript-eslint/no-unsafe-return": "error",
97
+ "@typescript-eslint/no-unsafe-unary-minus": "error",
98
+ "no-unused-expressions": "error",
99
+ "@typescript-eslint/no-wrapper-object-types": "error",
100
+ "@typescript-eslint/only-throw-error": "error",
101
+ "@typescript-eslint/prefer-as-const": "error",
102
+ "@typescript-eslint/prefer-namespace-keyword": "error",
103
+ "@typescript-eslint/prefer-promise-reject-errors": "error",
104
+ "@typescript-eslint/require-await": "error",
105
+ "@typescript-eslint/restrict-plus-operands": "error",
106
+ "@typescript-eslint/restrict-template-expressions": "error",
107
+ "@typescript-eslint/triple-slash-reference": "error",
108
+ "@typescript-eslint/unbound-method": "error",
109
+ "@typescript-eslint/adjacent-overload-signatures": "error",
110
+ "@typescript-eslint/array-type": "error",
111
+ "@typescript-eslint/ban-tslint-comment": "error",
112
+ "@typescript-eslint/consistent-generic-constructors": "error",
113
+ "@typescript-eslint/consistent-indexed-object-style": "error",
114
+ "@typescript-eslint/consistent-type-definitions": "error",
115
+ "@typescript-eslint/no-confusing-non-null-assertion": "error",
116
+ "no-empty-function": "error",
117
+ "@typescript-eslint/no-inferrable-types": "error",
118
+ "@typescript-eslint/non-nullable-type-assertion-style": "error",
119
+ "@typescript-eslint/prefer-for-of": "error",
120
+ "@typescript-eslint/prefer-function-type": "error",
121
+ "@typescript-eslint/prefer-includes": "error",
122
+ "@typescript-eslint/prefer-nullish-coalescing": "error"
123
+ },
124
+ "overrides": [
125
+ {
126
+ "files": ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts"],
127
+ "rules": {
128
+ "constructor-super": "off",
129
+ "no-class-assign": "off",
130
+ "no-const-assign": "off",
131
+ "no-dupe-class-members": "off",
132
+ "no-dupe-keys": "off",
133
+ "no-func-assign": "off",
134
+ "no-import-assign": "off",
135
+ "no-new-native-nonconstructor": "off",
136
+ "no-obj-calls": "off",
137
+ "no-redeclare": "off",
138
+ "no-setter-return": "off",
139
+ "no-this-before-super": "off",
140
+ "no-unsafe-negation": "off",
141
+ "no-var": "error",
142
+ "no-with": "off",
143
+ "prefer-rest-params": "error",
144
+ "prefer-spread": "error"
145
+ }
146
+ },
147
+ {
148
+ "files": ["eslint.config.js"],
149
+ "rules": {
150
+ "@typescript-eslint/await-thenable": "off",
151
+ "@typescript-eslint/no-array-delete": "off",
152
+ "@typescript-eslint/no-base-to-string": "off",
153
+ "@typescript-eslint/no-confusing-void-expression": "off",
154
+ "@typescript-eslint/no-deprecated": "off",
155
+ "@typescript-eslint/no-duplicate-type-constituents": "off",
156
+ "@typescript-eslint/no-floating-promises": "off",
157
+ "@typescript-eslint/no-for-in-array": "off",
158
+ "@typescript-eslint/no-implied-eval": "off",
159
+ "@typescript-eslint/no-meaningless-void-operator": "off",
160
+ "@typescript-eslint/no-misused-promises": "off",
161
+ "@typescript-eslint/no-misused-spread": "off",
162
+ "@typescript-eslint/no-mixed-enums": "off",
163
+ "@typescript-eslint/no-redundant-type-constituents": "off",
164
+ "@typescript-eslint/no-unnecessary-boolean-literal-compare": "off",
165
+ "@typescript-eslint/no-unnecessary-template-expression": "off",
166
+ "@typescript-eslint/no-unnecessary-type-arguments": "off",
167
+ "@typescript-eslint/no-unnecessary-type-assertion": "off",
168
+ "@typescript-eslint/no-unsafe-argument": "off",
169
+ "@typescript-eslint/no-unsafe-assignment": "off",
170
+ "@typescript-eslint/no-unsafe-call": "off",
171
+ "@typescript-eslint/no-unsafe-enum-comparison": "off",
172
+ "@typescript-eslint/no-unsafe-member-access": "off",
173
+ "@typescript-eslint/no-unsafe-return": "off",
174
+ "@typescript-eslint/no-unsafe-type-assertion": "off",
175
+ "@typescript-eslint/no-unsafe-unary-minus": "off",
176
+ "@typescript-eslint/non-nullable-type-assertion-style": "off",
177
+ "@typescript-eslint/only-throw-error": "off",
178
+ "@typescript-eslint/prefer-includes": "off",
179
+ "@typescript-eslint/prefer-nullish-coalescing": "off",
180
+ "@typescript-eslint/prefer-promise-reject-errors": "off",
181
+ "@typescript-eslint/prefer-reduce-type-parameter": "off",
182
+ "@typescript-eslint/prefer-return-this-type": "off",
183
+ "@typescript-eslint/promise-function-async": "off",
184
+ "@typescript-eslint/related-getter-setter-pairs": "off",
185
+ "@typescript-eslint/require-array-sort-compare": "off",
186
+ "@typescript-eslint/require-await": "off",
187
+ "@typescript-eslint/restrict-plus-operands": "off",
188
+ "@typescript-eslint/restrict-template-expressions": "off",
189
+ "@typescript-eslint/return-await": "off",
190
+ "@typescript-eslint/strict-boolean-expressions": "off",
191
+ "@typescript-eslint/switch-exhaustiveness-check": "off",
192
+ "@typescript-eslint/unbound-method": "off",
193
+ "@typescript-eslint/use-unknown-in-catch-callback-variable": "off"
194
+ }
195
+ }
196
+ ]
197
+ }
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1,31 @@
1
+ # Resolver Template
2
+
3
+ Demonstrates all resolver patterns with comprehensive testing approaches.
4
+
5
+ ## Features
6
+
7
+ - Simple query resolver (pure logic)
8
+ - Database query resolver (Kysely with transactions)
9
+ - Database mutation resolver (dependency injection pattern)
10
+ - Environment variable access
11
+ - User context access
12
+
13
+ ## Testing Approaches
14
+
15
+ 1. **Direct `body()` call** - Simple resolvers with `unauthenticatedTailorUser`
16
+ 2. **Mock `tailordb.Client`** - Database resolvers via `vi.stubGlobal`
17
+ 3. **Dependency injection** - Extract `DbOperations` interface for testability
18
+
19
+ ## Getting Started
20
+
21
+ ```bash
22
+ pnpm install
23
+ pnpm generate
24
+ pnpm deploy
25
+ ```
26
+
27
+ ## Testing
28
+
29
+ ```bash
30
+ pnpm test
31
+ ```
@@ -0,0 +1,3 @@
1
+ node_modules/
2
+ .tailor-sdk/
3
+ .eslintcache
@@ -0,0 +1,24 @@
1
+ import eslint from "@eslint/js";
2
+ import tseslint from "typescript-eslint";
3
+ import { defineConfig, globalIgnores } from "eslint/config";
4
+ import oxlint from "eslint-plugin-oxlint";
5
+
6
+ export default defineConfig([
7
+ globalIgnores([".tailor-sdk/", "src/generated/"]),
8
+ eslint.configs.recommended,
9
+ tseslint.configs.recommendedTypeChecked,
10
+ tseslint.configs.stylisticTypeChecked,
11
+ {
12
+ languageOptions: {
13
+ parserOptions: {
14
+ projectService: true,
15
+ tsconfigRootDir: import.meta.dirname,
16
+ },
17
+ },
18
+ },
19
+ {
20
+ files: ["eslint.config.js"],
21
+ extends: [tseslint.configs.disableTypeChecked],
22
+ },
23
+ ...oxlint.buildFromOxlintConfigFile("./.oxlintrc.json"),
24
+ ]);
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "resolver",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "generate": "tailor-sdk generate",
7
+ "deploy": "tailor-sdk apply",
8
+ "test": "vitest --project unit",
9
+ "test:unit": "vitest --project unit",
10
+ "format": "oxfmt --write .",
11
+ "format:check": "oxfmt --check .",
12
+ "lint": "oxlint --type-aware . && eslint --cache .",
13
+ "lint:fix": "oxlint --type-aware --fix . && eslint --cache --fix .",
14
+ "typecheck": "tsc --noEmit"
15
+ },
16
+ "devDependencies": {
17
+ "@eslint/js": "9.39.2",
18
+ "@tailor-platform/function-types": "0.8.0",
19
+ "@tailor-platform/sdk": "1.21.0",
20
+ "@types/node": "24.10.9",
21
+ "eslint": "9.39.2",
22
+ "eslint-plugin-oxlint": "1.39.0",
23
+ "oxfmt": "0.24.0",
24
+ "oxlint": "1.39.0",
25
+ "oxlint-tsgolint": "0.11.1",
26
+ "typescript": "5.9.3",
27
+ "typescript-eslint": "8.53.0",
28
+ "vitest": "4.0.17"
29
+ }
30
+ }
@@ -0,0 +1,23 @@
1
+ import { unauthenticatedTailorUser } from "@tailor-platform/sdk/test";
2
+ import { describe, expect, test } from "vitest";
3
+ import resolver from "./add";
4
+
5
+ describe("add resolver", () => {
6
+ test("adds two positive numbers", async () => {
7
+ const result = await resolver.body({
8
+ input: { left: 1, right: 2 },
9
+ user: unauthenticatedTailorUser,
10
+ env: { appName: "Resolver Template", version: 1 },
11
+ });
12
+ expect(result).toBe(3);
13
+ });
14
+
15
+ test("handles negative numbers", async () => {
16
+ const result = await resolver.body({
17
+ input: { left: -5, right: 3 },
18
+ user: unauthenticatedTailorUser,
19
+ env: { appName: "Resolver Template", version: 1 },
20
+ });
21
+ expect(result).toBe(-2);
22
+ });
23
+ });
@@ -1,9 +1,8 @@
1
1
  import { unauthenticatedTailorUser } from "@tailor-platform/sdk/test";
2
2
  import { afterAll, afterEach, beforeAll, describe, expect, test, vi } from "vitest";
3
- import resolver from "./mockTailordb";
3
+ import resolver from "./queryUser";
4
4
 
5
5
  describe("incrementUserAge resolver", () => {
6
- // Mock queryObject method to simulate database interactions
7
6
  const mockQueryObject = vi.fn();
8
7
  beforeAll(() => {
9
8
  vi.stubGlobal("tailordb", {
@@ -23,7 +22,7 @@ describe("incrementUserAge resolver", () => {
23
22
  mockQueryObject.mockReset();
24
23
  });
25
24
 
26
- test("basic functionality", async () => {
25
+ test("increments user age", async () => {
27
26
  // 1: Begin transaction
28
27
  mockQueryObject.mockResolvedValueOnce({});
29
28
  // 2: Select current age
@@ -38,13 +37,13 @@ describe("incrementUserAge resolver", () => {
38
37
  const result = await resolver.body({
39
38
  input: { email: "test@example.com" },
40
39
  user: unauthenticatedTailorUser,
41
- env: {},
40
+ env: { appName: "Resolver Template", version: 1 },
42
41
  });
43
42
  expect(result).toEqual({ oldAge: 30, newAge: 31 });
44
43
  expect(mockQueryObject).toHaveBeenCalledTimes(4);
45
44
  });
46
45
 
47
- test("user not found", async () => {
46
+ test("throws when user not found", async () => {
48
47
  // 1: Begin transaction
49
48
  mockQueryObject.mockResolvedValueOnce({});
50
49
  // 2: Select current age (no rows returned)
@@ -57,7 +56,7 @@ describe("incrementUserAge resolver", () => {
57
56
  const result = resolver.body({
58
57
  input: { email: "test@example.com" },
59
58
  user: unauthenticatedTailorUser,
60
- env: {},
59
+ env: { appName: "Resolver Template", version: 1 },
61
60
  });
62
61
  await expect(result).rejects.toThrowError();
63
62
  expect(mockQueryObject).toHaveBeenCalledTimes(3);
@@ -8,11 +8,9 @@ const resolver = createResolver({
8
8
  email: t.string(),
9
9
  },
10
10
  body: async (context) => {
11
- // Initialize database client
12
11
  const db = getDB("main-db");
13
12
 
14
13
  return await db.transaction().execute(async (trx) => {
15
- // Select current age
16
14
  const { age } = await trx
17
15
  .selectFrom("User")
18
16
  .where("email", "=", context.input.email)
@@ -20,18 +18,15 @@ const resolver = createResolver({
20
18
  .forUpdate()
21
19
  .executeTakeFirstOrThrow();
22
20
 
23
- // Increase age by 1
24
21
  const oldAge = age;
25
22
  const newAge = age + 1;
26
23
 
27
- // Update age in database
28
24
  await trx
29
25
  .updateTable("User")
30
26
  .set({ age: newAge })
31
27
  .where("email", "=", context.input.email)
32
28
  .execute();
33
29
 
34
- // Return old and new age
35
30
  return { oldAge, newAge };
36
31
  });
37
32
  },
@@ -0,0 +1,14 @@
1
+ import { unauthenticatedTailorUser } from "@tailor-platform/sdk/test";
2
+ import { describe, expect, test } from "vitest";
3
+ import resolver from "./showEnv";
4
+
5
+ describe("showEnv resolver", () => {
6
+ test("returns environment variables", async () => {
7
+ const result = await resolver.body({
8
+ input: undefined as never,
9
+ user: unauthenticatedTailorUser,
10
+ env: { appName: "Resolver Template", version: 1 },
11
+ });
12
+ expect(result).toEqual({ appName: "Resolver Template", version: 1 });
13
+ });
14
+ });
@@ -0,0 +1,19 @@
1
+ import { createResolver, t } from "@tailor-platform/sdk";
2
+
3
+ const resolver = createResolver({
4
+ name: "showEnv",
5
+ description: "Returns environment variables from config",
6
+ operation: "query",
7
+ body: (context) => {
8
+ return {
9
+ appName: context.env.appName,
10
+ version: context.env.version,
11
+ };
12
+ },
13
+ output: t.object({
14
+ appName: t.string(),
15
+ version: t.int(),
16
+ }),
17
+ });
18
+
19
+ export default resolver;
@@ -0,0 +1,37 @@
1
+ import { unauthenticatedTailorUser } from "@tailor-platform/sdk/test";
2
+ import { describe, expect, test } from "vitest";
3
+ import resolver from "./showUserInfo";
4
+
5
+ describe("showUserInfo resolver", () => {
6
+ test("returns default user info", async () => {
7
+ const result = await resolver.body({
8
+ input: undefined as never,
9
+ user: unauthenticatedTailorUser,
10
+ env: { appName: "Resolver Template", version: 1 },
11
+ });
12
+ expect(result).toEqual({
13
+ userId: unauthenticatedTailorUser.id,
14
+ userType: unauthenticatedTailorUser.type,
15
+ workspaceId: unauthenticatedTailorUser.workspaceId,
16
+ });
17
+ });
18
+
19
+ test("returns custom user info", async () => {
20
+ const customUser = {
21
+ ...unauthenticatedTailorUser,
22
+ id: "user-123",
23
+ type: "machine_user" as const,
24
+ workspaceId: "ws-456",
25
+ };
26
+ const result = await resolver.body({
27
+ input: undefined as never,
28
+ user: customUser,
29
+ env: { appName: "Resolver Template", version: 1 },
30
+ });
31
+ expect(result).toEqual({
32
+ userId: "user-123",
33
+ userType: "machine_user",
34
+ workspaceId: "ws-456",
35
+ });
36
+ });
37
+ });
@@ -0,0 +1,21 @@
1
+ import { createResolver, t } from "@tailor-platform/sdk";
2
+
3
+ const resolver = createResolver({
4
+ name: "showUserInfo",
5
+ description: "Returns information about the current user",
6
+ operation: "query",
7
+ body: (context) => {
8
+ return {
9
+ userId: context.user.id,
10
+ userType: context.user.type,
11
+ workspaceId: context.user.workspaceId,
12
+ };
13
+ },
14
+ output: t.object({
15
+ userId: t.string(),
16
+ userType: t.string(),
17
+ workspaceId: t.string(),
18
+ }),
19
+ });
20
+
21
+ export default resolver;
@@ -1,9 +1,8 @@
1
1
  import { describe, expect, test, vi } from "vitest";
2
- import { DbOperations, decrementUserAge } from "./wrapTailordb";
2
+ import { type DbOperations, decrementUserAge } from "./updateUser";
3
3
 
4
4
  describe("decrementUserAge resolver", () => {
5
- test("basic functionality", async () => {
6
- // Mock database operations
5
+ test("decrements user age", async () => {
7
6
  const dbOperations = {
8
7
  transaction: vi.fn(
9
8
  async (fn: (ops: DbOperations) => Promise<unknown>) => await fn(dbOperations),
@@ -24,8 +23,7 @@ describe("decrementUserAge resolver", () => {
24
23
  );
25
24
  });
26
25
 
27
- test("user not found", async () => {
28
- // Mock database operations
26
+ test("throws when user not found", async () => {
29
27
  const dbOperations = {
30
28
  transaction: vi.fn(
31
29
  async (fn: (ops: DbOperations) => Promise<unknown>) => await fn(dbOperations),
@@ -37,17 +37,13 @@ function createDbOperations(db: DB<"main-db">): DbOperations {
37
37
 
38
38
  export async function decrementUserAge(email: string, dbOperations: DbOperations) {
39
39
  return await dbOperations.transaction(async (ops) => {
40
- // Select user
41
40
  const user = await ops.getUser(email, true);
42
41
 
43
- // Decrease age by 1
44
42
  const oldAge = user.age;
45
43
  const newAge = user.age - 1;
46
44
 
47
- // Update user
48
45
  await ops.updateUser({ ...user, age: newAge });
49
46
 
50
- // Return old and new age
51
47
  return { oldAge, newAge };
52
48
  });
53
49
  }
@@ -59,7 +55,6 @@ export default createResolver({
59
55
  email: t.string(),
60
56
  },
61
57
  body: async (context) => {
62
- // Initialize database client
63
58
  const db = getDB("main-db");
64
59
  const dbOperations = createDbOperations(db);
65
60
 
@@ -0,0 +1,26 @@
1
+ import { defineAuth, defineConfig, definePlugins, t } from "@tailor-platform/sdk";
2
+ import { kyselyTypePlugin } from "@tailor-platform/sdk/plugin/kysely-type";
3
+
4
+ export default defineConfig({
5
+ name: "resolver",
6
+ env: {
7
+ appName: "Resolver Template",
8
+ version: 1,
9
+ },
10
+ auth: defineAuth("main-auth", {
11
+ machineUserAttributes: {
12
+ role: t.string(),
13
+ },
14
+ machineUsers: {
15
+ admin: {
16
+ attributes: {
17
+ role: "admin",
18
+ },
19
+ },
20
+ },
21
+ }),
22
+ db: { "main-db": { files: ["./src/db/*.ts"] } },
23
+ resolver: { "main-resolver": { files: ["./src/resolver/*.ts"] } },
24
+ });
25
+
26
+ export const plugins = definePlugins(kyselyTypePlugin({ distPath: "./src/generated/db.ts" }));
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "allowSyntheticDefaultImports": true,
7
+ "esModuleInterop": true,
8
+ "allowJs": true,
9
+ "strict": true,
10
+ "noEmit": true,
11
+ "skipLibCheck": true,
12
+ "resolveJsonModule": true,
13
+ "types": ["node", "@tailor-platform/function-types"]
14
+ },
15
+ "include": ["**/*.ts"]
16
+ }
@@ -0,0 +1,18 @@
1
+ // This file is auto-generated by @tailor-platform/sdk
2
+ // Do not edit this file manually
3
+ // Regenerated automatically when running 'tailor-sdk apply' or 'tailor-sdk generate'
4
+
5
+ declare module "@tailor-platform/sdk" {
6
+ interface AttributeMap {
7
+ role: string;
8
+ }
9
+ interface AttributeList {
10
+ __tuple?: [];
11
+ }
12
+ interface Env {
13
+ appName: "Resolver Template";
14
+ version: 1;
15
+ }
16
+ }
17
+
18
+ export {};
@@ -0,0 +1,15 @@
1
+ import { defineConfig } from "vitest/config";
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ watch: false,
6
+ projects: [
7
+ {
8
+ test: {
9
+ name: { label: "unit", color: "blue" },
10
+ include: ["src/**/*.test.ts"],
11
+ },
12
+ },
13
+ ],
14
+ },
15
+ });
@@ -0,0 +1,3 @@
1
+ {
2
+ "ignorePatterns": ["src/generated/", "pnpm-lock.yaml"]
3
+ }