@labdigital/commercetools-mock 2.66.0 → 3.0.0-beta.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 (281) hide show
  1. package/README.md +31 -8
  2. package/dist/abstract-BKFcva6S.mjs +1044 -0
  3. package/dist/abstract-BKFcva6S.mjs.map +1 -0
  4. package/dist/config-BcNSzPZz.d.mts +1718 -0
  5. package/dist/index.d.mts +50 -1633
  6. package/dist/index.mjs +3769 -2653
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/storage/sqlite.d.mts +59 -0
  9. package/dist/storage/sqlite.mjs +234 -0
  10. package/dist/storage/sqlite.mjs.map +1 -0
  11. package/package.json +26 -29
  12. package/src/ctMock.ts +125 -136
  13. package/src/helpers.ts +14 -6
  14. package/src/index.ts +5 -0
  15. package/src/lib/masking.ts +4 -5
  16. package/src/lib/product-review-statistics.test.ts +257 -294
  17. package/src/lib/review-statistics.ts +17 -4
  18. package/src/oauth/helpers.ts +7 -4
  19. package/src/oauth/server.test.ts +102 -62
  20. package/src/oauth/server.ts +215 -213
  21. package/src/oauth/store.ts +20 -6
  22. package/src/orderSearch.ts +3 -3
  23. package/src/product-projection-search.ts +38 -20
  24. package/src/product-search-availability.test.ts +31 -52
  25. package/src/product-search.ts +19 -10
  26. package/src/projectAPI.ts +6 -22
  27. package/src/repositories/abstract.ts +182 -48
  28. package/src/repositories/as-associate.test.ts +19 -19
  29. package/src/repositories/associate-role.ts +12 -23
  30. package/src/repositories/attribute-group.test.ts +23 -23
  31. package/src/repositories/attribute-group.ts +6 -4
  32. package/src/repositories/business-unit.test.ts +63 -57
  33. package/src/repositories/business-unit.ts +107 -55
  34. package/src/repositories/cart/actions.ts +96 -65
  35. package/src/repositories/cart/helpers.ts +15 -11
  36. package/src/repositories/cart/index.test.ts +136 -30
  37. package/src/repositories/cart/index.ts +76 -59
  38. package/src/repositories/cart-discount/actions.ts +12 -44
  39. package/src/repositories/cart-discount/index.ts +20 -8
  40. package/src/repositories/category/actions.ts +27 -27
  41. package/src/repositories/category/index.test.ts +13 -9
  42. package/src/repositories/category/index.ts +40 -23
  43. package/src/repositories/channel.test.ts +53 -51
  44. package/src/repositories/channel.ts +12 -22
  45. package/src/repositories/custom-object.ts +34 -25
  46. package/src/repositories/customer/actions.ts +47 -25
  47. package/src/repositories/customer/index.test.ts +11 -11
  48. package/src/repositories/customer/index.ts +65 -35
  49. package/src/repositories/customer-group.test.ts +44 -42
  50. package/src/repositories/customer-group.ts +12 -22
  51. package/src/repositories/discount-code/actions.ts +3 -19
  52. package/src/repositories/discount-code/index.ts +9 -4
  53. package/src/repositories/discount-group/index.ts +8 -3
  54. package/src/repositories/extension.test.ts +27 -27
  55. package/src/repositories/extension.ts +10 -5
  56. package/src/repositories/helpers.ts +126 -47
  57. package/src/repositories/inventory-entry/actions.ts +3 -24
  58. package/src/repositories/inventory-entry/index.ts +19 -11
  59. package/src/repositories/my-customer.ts +13 -12
  60. package/src/repositories/my-order.ts +5 -2
  61. package/src/repositories/order/actions.ts +84 -56
  62. package/src/repositories/order/index.test.ts +36 -31
  63. package/src/repositories/order/index.ts +83 -49
  64. package/src/repositories/order-edit.ts +8 -3
  65. package/src/repositories/payment/actions.ts +64 -44
  66. package/src/repositories/payment/helpers.ts +3 -3
  67. package/src/repositories/payment/index.ts +28 -12
  68. package/src/repositories/product/actions.ts +133 -98
  69. package/src/repositories/product/helpers.ts +29 -16
  70. package/src/repositories/product/index.ts +42 -25
  71. package/src/repositories/product-discount.ts +6 -4
  72. package/src/repositories/product-projection.ts +41 -21
  73. package/src/repositories/product-selection.ts +8 -15
  74. package/src/repositories/product-tailoring.ts +22 -3
  75. package/src/repositories/product-type.ts +45 -4
  76. package/src/repositories/project.ts +57 -13
  77. package/src/repositories/quote/actions.ts +5 -28
  78. package/src/repositories/quote/index.ts +29 -6
  79. package/src/repositories/quote-request/actions.ts +5 -28
  80. package/src/repositories/quote-request/index.test.ts +3 -3
  81. package/src/repositories/quote-request/index.ts +31 -11
  82. package/src/repositories/quote-staged/actions.ts +5 -28
  83. package/src/repositories/quote-staged/index.ts +22 -8
  84. package/src/repositories/recurrence-policy/index.ts +6 -4
  85. package/src/repositories/recurring-order/actions.ts +7 -32
  86. package/src/repositories/recurring-order/index.ts +8 -6
  87. package/src/repositories/review.test.ts +147 -142
  88. package/src/repositories/review.ts +31 -37
  89. package/src/repositories/shipping-method/actions.ts +11 -28
  90. package/src/repositories/shipping-method/index.ts +26 -15
  91. package/src/repositories/shopping-list/actions.ts +21 -31
  92. package/src/repositories/shopping-list/index.ts +44 -22
  93. package/src/repositories/standalone-price.ts +6 -4
  94. package/src/repositories/state.ts +15 -9
  95. package/src/repositories/store.ts +21 -32
  96. package/src/repositories/subscription.test.ts +22 -22
  97. package/src/repositories/subscription.ts +8 -3
  98. package/src/repositories/tax-category/index.ts +8 -3
  99. package/src/repositories/type/actions.ts +21 -3
  100. package/src/repositories/type/index.ts +5 -3
  101. package/src/repositories/zone.test.ts +112 -77
  102. package/src/repositories/zone.ts +5 -3
  103. package/src/schemas/generated/associate-role.ts +13 -0
  104. package/src/schemas/generated/attribute-group.ts +12 -0
  105. package/src/schemas/generated/business-unit.ts +38 -0
  106. package/src/schemas/generated/cart-discount.ts +33 -0
  107. package/src/schemas/generated/cart.ts +61 -0
  108. package/src/schemas/generated/category.ts +25 -0
  109. package/src/schemas/generated/channel.ts +21 -0
  110. package/src/schemas/generated/common.ts +1372 -0
  111. package/src/schemas/generated/custom-object.ts +11 -0
  112. package/src/schemas/generated/customer-group.ts +11 -0
  113. package/src/schemas/generated/customer.ts +47 -0
  114. package/src/schemas/generated/discount-code.ts +25 -0
  115. package/src/schemas/generated/discount-group.ts +13 -0
  116. package/src/schemas/generated/extension.ts +15 -0
  117. package/src/schemas/generated/index.ts +42 -0
  118. package/src/schemas/generated/inventory-entry.ts +20 -0
  119. package/src/schemas/generated/my-quote-request.ts +10 -0
  120. package/src/schemas/generated/order-edit.ts +18 -0
  121. package/src/schemas/generated/order-from-cart.ts +25 -0
  122. package/src/schemas/generated/payment.ts +30 -0
  123. package/src/schemas/generated/product-discount.ts +20 -0
  124. package/src/schemas/generated/product-selection.ts +18 -0
  125. package/src/schemas/generated/product-tailoring.ts +26 -0
  126. package/src/schemas/generated/product-type.ts +12 -0
  127. package/src/schemas/generated/product.ts +37 -0
  128. package/src/schemas/generated/quote-request.ts +19 -0
  129. package/src/schemas/generated/quote.ts +18 -0
  130. package/src/schemas/generated/recurrence-policy.ts +15 -0
  131. package/src/schemas/generated/recurring-order.ts +19 -0
  132. package/src/schemas/generated/review.ts +24 -0
  133. package/src/schemas/generated/shipping-method.ts +24 -0
  134. package/src/schemas/generated/shopping-list.ts +28 -0
  135. package/src/schemas/generated/staged-quote.ts +18 -0
  136. package/src/schemas/generated/standalone-price.ts +32 -0
  137. package/src/schemas/generated/state.ts +20 -0
  138. package/src/schemas/generated/store.ts +23 -0
  139. package/src/schemas/generated/subscription.ts +20 -0
  140. package/src/schemas/generated/tax-category.ts +12 -0
  141. package/src/schemas/generated/type.ts +17 -0
  142. package/src/schemas/generated/zone.ts +12 -0
  143. package/src/schemas/update-request.ts +3 -5
  144. package/src/server.ts +32 -4
  145. package/src/services/abstract.ts +207 -101
  146. package/src/services/as-associate-cart.test.ts +28 -36
  147. package/src/services/as-associate-cart.ts +15 -12
  148. package/src/services/as-associate-order.test.ts +33 -40
  149. package/src/services/as-associate-order.ts +15 -12
  150. package/src/services/as-associate-quote-request.ts +15 -12
  151. package/src/services/as-associate-shopping-list.test.ts +25 -35
  152. package/src/services/as-associate-shopping-list.ts +15 -12
  153. package/src/services/as-associate.test.ts +21 -15
  154. package/src/services/as-associate.ts +23 -22
  155. package/src/services/associate-roles.test.ts +16 -22
  156. package/src/services/associate-roles.ts +2 -2
  157. package/src/services/attribute-group.test.ts +40 -44
  158. package/src/services/attribute-group.ts +2 -2
  159. package/src/services/business-units.test.ts +227 -163
  160. package/src/services/business-units.ts +2 -2
  161. package/src/services/cart-discount.test.ts +253 -187
  162. package/src/services/cart-discount.ts +2 -2
  163. package/src/services/cart.test.ts +833 -832
  164. package/src/services/cart.ts +31 -12
  165. package/src/services/category.test.ts +208 -130
  166. package/src/services/category.ts +2 -2
  167. package/src/services/channel.test.ts +39 -44
  168. package/src/services/channel.ts +2 -2
  169. package/src/services/custom-object.test.ts +103 -79
  170. package/src/services/custom-object.ts +106 -38
  171. package/src/services/customer-group.test.ts +39 -44
  172. package/src/services/customer-group.ts +2 -2
  173. package/src/services/customer.test.ts +357 -292
  174. package/src/services/customer.ts +70 -23
  175. package/src/services/discount-code.test.ts +57 -68
  176. package/src/services/discount-code.ts +2 -2
  177. package/src/services/discount-group.test.ts +111 -134
  178. package/src/services/discount-group.ts +2 -2
  179. package/src/services/draft-validation.test.ts +255 -0
  180. package/src/services/extension.test.ts +39 -44
  181. package/src/services/extension.ts +2 -2
  182. package/src/services/inventory-entry.test.ts +106 -87
  183. package/src/services/inventory-entry.ts +2 -2
  184. package/src/services/my-business-unit.test.ts +82 -112
  185. package/src/services/my-business-unit.ts +25 -19
  186. package/src/services/my-cart.test.ts +46 -41
  187. package/src/services/my-cart.ts +32 -28
  188. package/src/services/my-customer.test.ts +153 -88
  189. package/src/services/my-customer.ts +130 -61
  190. package/src/services/my-order.ts +15 -12
  191. package/src/services/my-payment.test.ts +30 -24
  192. package/src/services/my-payment.ts +2 -2
  193. package/src/services/my-shopping-list.ts +2 -2
  194. package/src/services/order.test.ts +332 -276
  195. package/src/services/order.ts +45 -27
  196. package/src/services/payment.test.ts +31 -29
  197. package/src/services/payment.ts +2 -2
  198. package/src/services/product-discount.test.ts +39 -46
  199. package/src/services/product-discount.ts +2 -2
  200. package/src/services/product-projection.test.ts +176 -166
  201. package/src/services/product-projection.ts +31 -15
  202. package/src/services/product-selection.test.ts +17 -9
  203. package/src/services/product-selection.ts +2 -2
  204. package/src/services/product-type.test.ts +80 -21
  205. package/src/services/product-type.ts +2 -2
  206. package/src/services/product.test.ts +569 -534
  207. package/src/services/product.ts +14 -7
  208. package/src/services/project.test.ts +22 -12
  209. package/src/services/project.ts +28 -13
  210. package/src/services/quote-request.test.ts +36 -39
  211. package/src/services/quote-request.ts +2 -2
  212. package/src/services/quote-staged.ts +2 -2
  213. package/src/services/quote.ts +2 -2
  214. package/src/services/recurrence-policy.test.ts +114 -139
  215. package/src/services/recurrence-policy.ts +2 -2
  216. package/src/services/recurring-order.test.ts +149 -194
  217. package/src/services/recurring-order.ts +2 -2
  218. package/src/services/reviews.test.ts +127 -106
  219. package/src/services/reviews.ts +2 -2
  220. package/src/services/shipping-method.test.ts +96 -125
  221. package/src/services/shipping-method.ts +24 -12
  222. package/src/services/shopping-list.test.ts +183 -141
  223. package/src/services/shopping-list.ts +2 -2
  224. package/src/services/standalone-price.test.ts +60 -46
  225. package/src/services/standalone-price.ts +2 -2
  226. package/src/services/state.test.ts +20 -25
  227. package/src/services/state.ts +2 -2
  228. package/src/services/store.test.ts +26 -45
  229. package/src/services/store.ts +2 -2
  230. package/src/services/subscription.test.ts +39 -44
  231. package/src/services/subscription.ts +2 -2
  232. package/src/services/tax-category.test.ts +33 -36
  233. package/src/services/tax-category.ts +2 -2
  234. package/src/services/type.test.ts +45 -44
  235. package/src/services/type.ts +2 -2
  236. package/src/services/zone.test.ts +40 -44
  237. package/src/services/zone.ts +2 -2
  238. package/src/shipping.ts +41 -11
  239. package/src/storage/abstract.ts +248 -17
  240. package/src/storage/in-memory.ts +147 -290
  241. package/src/storage/sqlite.ts +429 -0
  242. package/src/storage/storage-map.ts +75 -0
  243. package/src/storage/storage.test-helpers.ts +97 -0
  244. package/src/storage/storage.test.ts +802 -0
  245. package/src/testing/associate-role.ts +28 -0
  246. package/src/testing/attribute-group.ts +27 -0
  247. package/src/testing/business-unit.ts +9 -8
  248. package/src/testing/cart-discount.ts +34 -0
  249. package/src/testing/cart.ts +20 -0
  250. package/src/testing/category.ts +25 -0
  251. package/src/testing/channel.ts +23 -0
  252. package/src/testing/custom-object.ts +27 -0
  253. package/src/testing/customer-group.ts +26 -0
  254. package/src/testing/customer.ts +36 -33
  255. package/src/testing/discount-code.ts +29 -0
  256. package/src/testing/discount-group.ts +27 -0
  257. package/src/testing/extension.ts +32 -0
  258. package/src/testing/index.ts +33 -0
  259. package/src/testing/inventory-entry.ts +26 -0
  260. package/src/testing/order.ts +27 -0
  261. package/src/testing/payment.ts +23 -0
  262. package/src/testing/product-discount.ts +33 -0
  263. package/src/testing/product-selection.ts +28 -0
  264. package/src/testing/product-type.ts +27 -0
  265. package/src/testing/product.ts +38 -0
  266. package/src/testing/quote-request.ts +29 -0
  267. package/src/testing/recurrence-policy.ts +33 -0
  268. package/src/testing/recurring-order.ts +32 -0
  269. package/src/testing/review.ts +24 -0
  270. package/src/testing/shipping-method.ts +31 -0
  271. package/src/testing/shopping-list.ts +25 -0
  272. package/src/testing/standalone-price.ts +31 -0
  273. package/src/testing/state.ts +21 -0
  274. package/src/testing/store.ts +26 -0
  275. package/src/testing/subscription.ts +38 -0
  276. package/src/testing/tax-category.ts +27 -0
  277. package/src/testing/type.ts +9 -6
  278. package/src/testing/zone.ts +22 -0
  279. package/src/validate.test.ts +122 -0
  280. package/src/validate.ts +78 -7
  281. package/src/.env +0 -0
@@ -0,0 +1,59 @@
1
+ import { a as QueryParams, c as ResourceType, n as AbstractStorage, o as PagedQueryResponseMap, r as GetParams, s as ResourceMap } from "../config-BcNSzPZz.mjs";
2
+ import { CustomObject, Project } from "@commercetools/platform-sdk";
3
+
4
+ //#region src/storage/sqlite.d.ts
5
+ type SQLiteStorageOptions = {
6
+ /**
7
+ * Path to the SQLite database file.
8
+ * Defaults to `commercetools-mock.db` in the current working directory.
9
+ * Use `':memory:'` for an in-memory database.
10
+ */
11
+ filename?: string;
12
+ };
13
+ declare class SQLiteStorage extends AbstractStorage {
14
+ private db;
15
+ private _knownProjects;
16
+ private _stmtInsertProject;
17
+ private _stmtGetProject;
18
+ private _stmtUpsertProject;
19
+ private _stmtInsertResource;
20
+ private _stmtGetResource;
21
+ private _stmtGetResourceByKey;
22
+ private _stmtAllResources;
23
+ private _stmtDeleteResource;
24
+ private _stmtClearResources;
25
+ private _stmtGetResourceByContainerAndKey;
26
+ private _stmtCountResources;
27
+ constructor(options?: SQLiteStorageOptions);
28
+ /**
29
+ * Close the database connection. Call this when you're done using the storage.
30
+ */
31
+ close(): void;
32
+ private get stmtInsertProject();
33
+ private get stmtGetProject();
34
+ private get stmtUpsertProject();
35
+ private get stmtInsertResource();
36
+ private get stmtGetResource();
37
+ private get stmtGetResourceByKey();
38
+ private get stmtAllResources();
39
+ private get stmtCountResources();
40
+ private get stmtDeleteResource();
41
+ private get stmtClearResources();
42
+ private get stmtGetResourceByContainerAndKey();
43
+ private ensureProject;
44
+ addProject(projectKey: string): Promise<Project>;
45
+ getProject(projectKey: string): Promise<Project>;
46
+ saveProject(project: Project): Promise<Project>;
47
+ clear(): Promise<void>;
48
+ all<RT extends ResourceType>(projectKey: string, typeId: RT): Promise<ResourceMap[RT][]>;
49
+ count(projectKey: string, typeId: ResourceType): Promise<number>;
50
+ add<RT extends ResourceType>(projectKey: string, typeId: RT, obj: ResourceMap[RT], params?: GetParams): Promise<ResourceMap[RT]>;
51
+ get<RT extends ResourceType>(projectKey: string, typeId: RT, id: string, params?: GetParams): Promise<ResourceMap[RT] | null>;
52
+ getByKey<RT extends ResourceType>(projectKey: string, typeId: RT, key: string, params?: GetParams): Promise<ResourceMap[RT] | null>;
53
+ delete<RT extends ResourceType>(projectKey: string, typeId: RT, id: string, params?: GetParams): Promise<ResourceMap[RT] | null>;
54
+ getByContainerAndKey(projectKey: string, container: string, key: string): Promise<CustomObject | null>;
55
+ query<RT extends ResourceType>(projectKey: string, typeId: RT, params: QueryParams): Promise<PagedQueryResponseMap[RT]>;
56
+ }
57
+ //#endregion
58
+ export { SQLiteStorage, SQLiteStorageOptions };
59
+ //# sourceMappingURL=sqlite.d.mts.map
@@ -0,0 +1,234 @@
1
+ import { n as parseQueryExpression, o as cloneObject, p as CommercetoolsError, t as AbstractStorage } from "../abstract-BKFcva6S.mjs";
2
+ import path from "node:path";
3
+ import { DatabaseSync } from "node:sqlite";
4
+
5
+ //#region src/storage/sqlite.ts
6
+ const DEFAULT_PROJECT = {
7
+ name: "",
8
+ countries: [],
9
+ currencies: [],
10
+ languages: [],
11
+ createdAt: "2018-10-04T11:32:12.603Z",
12
+ trialUntil: "2018-12",
13
+ carts: {
14
+ countryTaxRateFallbackEnabled: false,
15
+ deleteDaysAfterLastModification: 90,
16
+ priceRoundingMode: "HalfEven",
17
+ taxRoundingMode: "HalfEven"
18
+ },
19
+ shoppingLists: { deleteDaysAfterLastModification: 360 },
20
+ messages: {
21
+ enabled: false,
22
+ deleteDaysAfterCreation: 15
23
+ },
24
+ shippingRateInputType: void 0,
25
+ externalOAuth: void 0,
26
+ searchIndexing: {
27
+ products: { status: "Deactivated" },
28
+ productsSearch: { status: "Deactivated" },
29
+ orders: { status: "Deactivated" },
30
+ customers: { status: "Deactivated" },
31
+ businessUnits: { status: "Deactivated" }
32
+ },
33
+ discounts: { discountCombinationMode: "Stacking" },
34
+ version: 1
35
+ };
36
+ const SCHEMA = `
37
+ CREATE TABLE IF NOT EXISTS projects (
38
+ project_key TEXT PRIMARY KEY,
39
+ data TEXT NOT NULL
40
+ );
41
+
42
+ CREATE TABLE IF NOT EXISTS resources (
43
+ project_key TEXT NOT NULL,
44
+ type_id TEXT NOT NULL,
45
+ id TEXT NOT NULL,
46
+ key TEXT,
47
+ data TEXT NOT NULL,
48
+ PRIMARY KEY (project_key, type_id, id)
49
+ );
50
+
51
+ CREATE INDEX IF NOT EXISTS idx_resources_key
52
+ ON resources (project_key, type_id, key) WHERE key IS NOT NULL;
53
+
54
+ CREATE INDEX IF NOT EXISTS idx_resources_container_key
55
+ ON resources (
56
+ project_key,
57
+ json_extract(data, '$.container'),
58
+ json_extract(data, '$.key')
59
+ )
60
+ WHERE type_id = 'key-value-document';
61
+ `;
62
+ var SQLiteStorage = class extends AbstractStorage {
63
+ db;
64
+ _knownProjects = /* @__PURE__ */ new Set();
65
+ _stmtInsertProject = null;
66
+ _stmtGetProject = null;
67
+ _stmtUpsertProject = null;
68
+ _stmtInsertResource = null;
69
+ _stmtGetResource = null;
70
+ _stmtGetResourceByKey = null;
71
+ _stmtAllResources = null;
72
+ _stmtDeleteResource = null;
73
+ _stmtClearResources = null;
74
+ _stmtGetResourceByContainerAndKey = null;
75
+ _stmtCountResources = null;
76
+ constructor(options = {}) {
77
+ super();
78
+ this.db = new DatabaseSync(options.filename ?? path.join(process.cwd(), "commercetools-mock.db"));
79
+ this.db.exec(SCHEMA);
80
+ }
81
+ /**
82
+ * Close the database connection. Call this when you're done using the storage.
83
+ */
84
+ close() {
85
+ if (this.db.isOpen) this.db.close();
86
+ }
87
+ get stmtInsertProject() {
88
+ if (!this._stmtInsertProject) this._stmtInsertProject = this.db.prepare("INSERT OR IGNORE INTO projects (project_key, data) VALUES (?, ?)");
89
+ return this._stmtInsertProject;
90
+ }
91
+ get stmtGetProject() {
92
+ if (!this._stmtGetProject) this._stmtGetProject = this.db.prepare("SELECT data FROM projects WHERE project_key = ?");
93
+ return this._stmtGetProject;
94
+ }
95
+ get stmtUpsertProject() {
96
+ if (!this._stmtUpsertProject) this._stmtUpsertProject = this.db.prepare("INSERT OR REPLACE INTO projects (project_key, data) VALUES (?, ?)");
97
+ return this._stmtUpsertProject;
98
+ }
99
+ get stmtInsertResource() {
100
+ if (!this._stmtInsertResource) this._stmtInsertResource = this.db.prepare("INSERT OR REPLACE INTO resources (project_key, type_id, id, key, data) VALUES (?, ?, ?, ?, ?)");
101
+ return this._stmtInsertResource;
102
+ }
103
+ get stmtGetResource() {
104
+ if (!this._stmtGetResource) this._stmtGetResource = this.db.prepare("SELECT data FROM resources WHERE project_key = ? AND type_id = ? AND id = ?");
105
+ return this._stmtGetResource;
106
+ }
107
+ get stmtGetResourceByKey() {
108
+ if (!this._stmtGetResourceByKey) this._stmtGetResourceByKey = this.db.prepare("SELECT data FROM resources WHERE project_key = ? AND type_id = ? AND key = ?");
109
+ return this._stmtGetResourceByKey;
110
+ }
111
+ get stmtAllResources() {
112
+ if (!this._stmtAllResources) this._stmtAllResources = this.db.prepare("SELECT data FROM resources WHERE project_key = ? AND type_id = ?");
113
+ return this._stmtAllResources;
114
+ }
115
+ get stmtCountResources() {
116
+ if (!this._stmtCountResources) this._stmtCountResources = this.db.prepare("SELECT COUNT(*) as cnt FROM resources WHERE project_key = ? AND type_id = ?");
117
+ return this._stmtCountResources;
118
+ }
119
+ get stmtDeleteResource() {
120
+ if (!this._stmtDeleteResource) this._stmtDeleteResource = this.db.prepare("DELETE FROM resources WHERE project_key = ? AND type_id = ? AND id = ?");
121
+ return this._stmtDeleteResource;
122
+ }
123
+ get stmtClearResources() {
124
+ if (!this._stmtClearResources) this._stmtClearResources = this.db.prepare("DELETE FROM resources");
125
+ return this._stmtClearResources;
126
+ }
127
+ get stmtGetResourceByContainerAndKey() {
128
+ if (!this._stmtGetResourceByContainerAndKey) this._stmtGetResourceByContainerAndKey = this.db.prepare(`SELECT data FROM resources
129
+ WHERE project_key = ?
130
+ AND type_id = 'key-value-document'
131
+ AND json_extract(data, '$.container') = ?
132
+ AND json_extract(data, '$.key') = ?`);
133
+ return this._stmtGetResourceByContainerAndKey;
134
+ }
135
+ ensureProject(projectKey) {
136
+ if (this._knownProjects.has(projectKey)) return;
137
+ const project = {
138
+ ...DEFAULT_PROJECT,
139
+ key: projectKey
140
+ };
141
+ this.stmtInsertProject.run(projectKey, JSON.stringify(project));
142
+ this._knownProjects.add(projectKey);
143
+ }
144
+ async addProject(projectKey) {
145
+ this.ensureProject(projectKey);
146
+ const row = this.stmtGetProject.get(projectKey);
147
+ if (!row) throw new Error(`Failed to create project ${projectKey}`);
148
+ return JSON.parse(row.data);
149
+ }
150
+ async getProject(projectKey) {
151
+ return this.addProject(projectKey);
152
+ }
153
+ async saveProject(project) {
154
+ this.stmtUpsertProject.run(project.key, JSON.stringify(project));
155
+ return project;
156
+ }
157
+ async clear() {
158
+ this.stmtClearResources.run();
159
+ this._knownProjects.clear();
160
+ }
161
+ async all(projectKey, typeId) {
162
+ return this.stmtAllResources.all(projectKey, typeId).map((row) => JSON.parse(row.data));
163
+ }
164
+ async count(projectKey, typeId) {
165
+ return this.stmtCountResources.get(projectKey, typeId)?.cnt ?? 0;
166
+ }
167
+ async add(projectKey, typeId, obj, params = {}) {
168
+ this.ensureProject(projectKey);
169
+ const key = obj.key ?? null;
170
+ this.stmtInsertResource.run(projectKey, typeId, obj.id, key, JSON.stringify(obj));
171
+ const clone = cloneObject(obj);
172
+ return this.expand(projectKey, clone, params.expand);
173
+ }
174
+ async get(projectKey, typeId, id, params = {}) {
175
+ const row = this.stmtGetResource.get(projectKey, typeId, id);
176
+ if (row) {
177
+ const resource = JSON.parse(row.data);
178
+ return this.expand(projectKey, resource, params.expand);
179
+ }
180
+ return null;
181
+ }
182
+ async getByKey(projectKey, typeId, key, params = {}) {
183
+ const row = this.stmtGetResourceByKey.get(projectKey, typeId, key);
184
+ if (row) {
185
+ const resource = JSON.parse(row.data);
186
+ return this.expand(projectKey, resource, params.expand);
187
+ }
188
+ return null;
189
+ }
190
+ async delete(projectKey, typeId, id, params = {}) {
191
+ const resource = await this.get(projectKey, typeId, id);
192
+ if (resource) {
193
+ this.stmtDeleteResource.run(projectKey, typeId, id);
194
+ return this.expand(projectKey, resource, params.expand);
195
+ }
196
+ return null;
197
+ }
198
+ async getByContainerAndKey(projectKey, container, key) {
199
+ const row = this.stmtGetResourceByContainerAndKey.get(projectKey, container, key);
200
+ if (row) return JSON.parse(row.data);
201
+ return null;
202
+ }
203
+ async query(projectKey, typeId, params) {
204
+ let resources = await this.all(projectKey, typeId);
205
+ if (params.where) {
206
+ const vars = Object.fromEntries(Object.entries(params).filter(([key]) => key.startsWith("var.")).map(([key, value]) => [key.slice(4), value]));
207
+ try {
208
+ const filterFunc = parseQueryExpression(params.where);
209
+ resources = resources.filter((resource) => filterFunc(resource, vars));
210
+ } catch (err) {
211
+ throw new CommercetoolsError({
212
+ code: "InvalidInput",
213
+ message: err.message
214
+ }, 400);
215
+ }
216
+ }
217
+ const totalResources = resources.length;
218
+ const offset = params.offset || 0;
219
+ const limit = params.limit || 20;
220
+ resources = resources.slice(offset, offset + limit);
221
+ if (params.expand !== void 0) resources = await Promise.all(resources.map((resource) => this.expand(projectKey, resource, params.expand)));
222
+ return {
223
+ count: resources.length,
224
+ total: totalResources,
225
+ offset,
226
+ limit,
227
+ results: resources
228
+ };
229
+ }
230
+ };
231
+
232
+ //#endregion
233
+ export { SQLiteStorage };
234
+ //# sourceMappingURL=sqlite.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.mjs","names":[],"sources":["../../src/storage/sqlite.ts"],"sourcesContent":["import path from \"node:path\";\nimport { DatabaseSync, type StatementSync } from \"node:sqlite\";\nimport type {\n\tCustomObject,\n\tInvalidInputError,\n\tProject,\n} from \"@commercetools/platform-sdk\";\nimport { CommercetoolsError } from \"#src/exceptions.ts\";\nimport { cloneObject } from \"../helpers.ts\";\nimport { parseQueryExpression } from \"../lib/predicateParser.ts\";\nimport type {\n\tPagedQueryResponseMap,\n\tResourceMap,\n\tResourceType,\n} from \"../types.ts\";\nimport type { GetParams, QueryParams } from \"./abstract.ts\";\nimport { AbstractStorage } from \"./abstract.ts\";\n\nexport type SQLiteStorageOptions = {\n\t/**\n\t * Path to the SQLite database file.\n\t * Defaults to `commercetools-mock.db` in the current working directory.\n\t * Use `':memory:'` for an in-memory database.\n\t */\n\tfilename?: string;\n};\n\nconst DEFAULT_PROJECT: Omit<Project, \"key\"> = {\n\tname: \"\",\n\tcountries: [],\n\tcurrencies: [],\n\tlanguages: [],\n\tcreatedAt: \"2018-10-04T11:32:12.603Z\",\n\ttrialUntil: \"2018-12\",\n\tcarts: {\n\t\tcountryTaxRateFallbackEnabled: false,\n\t\tdeleteDaysAfterLastModification: 90,\n\t\tpriceRoundingMode: \"HalfEven\",\n\t\ttaxRoundingMode: \"HalfEven\",\n\t},\n\tshoppingLists: {\n\t\tdeleteDaysAfterLastModification: 360,\n\t},\n\tmessages: { enabled: false, deleteDaysAfterCreation: 15 },\n\tshippingRateInputType: undefined,\n\texternalOAuth: undefined,\n\tsearchIndexing: {\n\t\tproducts: {\n\t\t\tstatus: \"Deactivated\",\n\t\t},\n\t\tproductsSearch: {\n\t\t\tstatus: \"Deactivated\",\n\t\t},\n\t\torders: {\n\t\t\tstatus: \"Deactivated\",\n\t\t},\n\t\tcustomers: {\n\t\t\tstatus: \"Deactivated\",\n\t\t},\n\t\tbusinessUnits: {\n\t\t\tstatus: \"Deactivated\",\n\t\t},\n\t},\n\tdiscounts: {\n\t\tdiscountCombinationMode: \"Stacking\",\n\t},\n\tversion: 1,\n};\n\nconst SCHEMA = `\n CREATE TABLE IF NOT EXISTS projects (\n project_key TEXT PRIMARY KEY,\n data TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS resources (\n project_key TEXT NOT NULL,\n type_id TEXT NOT NULL,\n id TEXT NOT NULL,\n key TEXT,\n data TEXT NOT NULL,\n PRIMARY KEY (project_key, type_id, id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_resources_key\n ON resources (project_key, type_id, key) WHERE key IS NOT NULL;\n\n CREATE INDEX IF NOT EXISTS idx_resources_container_key\n ON resources (\n project_key,\n json_extract(data, '$.container'),\n json_extract(data, '$.key')\n )\n WHERE type_id = 'key-value-document';\n`;\n\nexport class SQLiteStorage extends AbstractStorage {\n\tprivate db: DatabaseSync;\n\n\t// Cache of known project keys to avoid redundant INSERT+SELECT on every add()\n\tprivate _knownProjects: Set<string> = new Set();\n\n\t// Prepared statements (lazily created)\n\tprivate _stmtInsertProject: StatementSync | null = null;\n\tprivate _stmtGetProject: StatementSync | null = null;\n\tprivate _stmtUpsertProject: StatementSync | null = null;\n\tprivate _stmtInsertResource: StatementSync | null = null;\n\tprivate _stmtGetResource: StatementSync | null = null;\n\tprivate _stmtGetResourceByKey: StatementSync | null = null;\n\tprivate _stmtAllResources: StatementSync | null = null;\n\tprivate _stmtDeleteResource: StatementSync | null = null;\n\tprivate _stmtClearResources: StatementSync | null = null;\n\tprivate _stmtGetResourceByContainerAndKey: StatementSync | null = null;\n\tprivate _stmtCountResources: StatementSync | null = null;\n\n\tconstructor(options: SQLiteStorageOptions = {}) {\n\t\tsuper();\n\n\t\tconst filename =\n\t\t\toptions.filename ?? path.join(process.cwd(), \"commercetools-mock.db\");\n\n\t\tthis.db = new DatabaseSync(filename);\n\t\tthis.db.exec(SCHEMA);\n\t}\n\n\t/**\n\t * Close the database connection. Call this when you're done using the storage.\n\t */\n\toverride close(): void {\n\t\tif (this.db.isOpen) {\n\t\t\tthis.db.close();\n\t\t}\n\t}\n\n\tprivate get stmtInsertProject() {\n\t\tif (!this._stmtInsertProject) {\n\t\t\tthis._stmtInsertProject = this.db.prepare(\n\t\t\t\t\"INSERT OR IGNORE INTO projects (project_key, data) VALUES (?, ?)\",\n\t\t\t);\n\t\t}\n\t\treturn this._stmtInsertProject;\n\t}\n\n\tprivate get stmtGetProject() {\n\t\tif (!this._stmtGetProject) {\n\t\t\tthis._stmtGetProject = this.db.prepare(\n\t\t\t\t\"SELECT data FROM projects WHERE project_key = ?\",\n\t\t\t);\n\t\t}\n\t\treturn this._stmtGetProject;\n\t}\n\n\tprivate get stmtUpsertProject() {\n\t\tif (!this._stmtUpsertProject) {\n\t\t\tthis._stmtUpsertProject = this.db.prepare(\n\t\t\t\t\"INSERT OR REPLACE INTO projects (project_key, data) VALUES (?, ?)\",\n\t\t\t);\n\t\t}\n\t\treturn this._stmtUpsertProject;\n\t}\n\n\tprivate get stmtInsertResource() {\n\t\tif (!this._stmtInsertResource) {\n\t\t\tthis._stmtInsertResource = this.db.prepare(\n\t\t\t\t\"INSERT OR REPLACE INTO resources (project_key, type_id, id, key, data) VALUES (?, ?, ?, ?, ?)\",\n\t\t\t);\n\t\t}\n\t\treturn this._stmtInsertResource;\n\t}\n\n\tprivate get stmtGetResource() {\n\t\tif (!this._stmtGetResource) {\n\t\t\tthis._stmtGetResource = this.db.prepare(\n\t\t\t\t\"SELECT data FROM resources WHERE project_key = ? AND type_id = ? AND id = ?\",\n\t\t\t);\n\t\t}\n\t\treturn this._stmtGetResource;\n\t}\n\n\tprivate get stmtGetResourceByKey() {\n\t\tif (!this._stmtGetResourceByKey) {\n\t\t\tthis._stmtGetResourceByKey = this.db.prepare(\n\t\t\t\t\"SELECT data FROM resources WHERE project_key = ? AND type_id = ? AND key = ?\",\n\t\t\t);\n\t\t}\n\t\treturn this._stmtGetResourceByKey;\n\t}\n\n\tprivate get stmtAllResources() {\n\t\tif (!this._stmtAllResources) {\n\t\t\tthis._stmtAllResources = this.db.prepare(\n\t\t\t\t\"SELECT data FROM resources WHERE project_key = ? AND type_id = ?\",\n\t\t\t);\n\t\t}\n\t\treturn this._stmtAllResources;\n\t}\n\n\tprivate get stmtCountResources() {\n\t\tif (!this._stmtCountResources) {\n\t\t\tthis._stmtCountResources = this.db.prepare(\n\t\t\t\t\"SELECT COUNT(*) as cnt FROM resources WHERE project_key = ? AND type_id = ?\",\n\t\t\t);\n\t\t}\n\t\treturn this._stmtCountResources;\n\t}\n\n\tprivate get stmtDeleteResource() {\n\t\tif (!this._stmtDeleteResource) {\n\t\t\tthis._stmtDeleteResource = this.db.prepare(\n\t\t\t\t\"DELETE FROM resources WHERE project_key = ? AND type_id = ? AND id = ?\",\n\t\t\t);\n\t\t}\n\t\treturn this._stmtDeleteResource;\n\t}\n\n\tprivate get stmtClearResources() {\n\t\tif (!this._stmtClearResources) {\n\t\t\tthis._stmtClearResources = this.db.prepare(\"DELETE FROM resources\");\n\t\t}\n\t\treturn this._stmtClearResources;\n\t}\n\n\tprivate get stmtGetResourceByContainerAndKey() {\n\t\tif (!this._stmtGetResourceByContainerAndKey) {\n\t\t\tthis._stmtGetResourceByContainerAndKey = this.db.prepare(\n\t\t\t\t`SELECT data FROM resources\n\t\t\t\t WHERE project_key = ?\n\t\t\t\t AND type_id = 'key-value-document'\n\t\t\t\t AND json_extract(data, '$.container') = ?\n\t\t\t\t AND json_extract(data, '$.key') = ?`,\n\t\t\t);\n\t\t}\n\t\treturn this._stmtGetResourceByContainerAndKey;\n\t}\n\n\tprivate ensureProject(projectKey: string): void {\n\t\tif (this._knownProjects.has(projectKey)) {\n\t\t\treturn;\n\t\t}\n\t\tconst project: Project = { ...DEFAULT_PROJECT, key: projectKey };\n\t\tthis.stmtInsertProject.run(projectKey, JSON.stringify(project));\n\t\tthis._knownProjects.add(projectKey);\n\t}\n\n\tasync addProject(projectKey: string): Promise<Project> {\n\t\tthis.ensureProject(projectKey);\n\n\t\tconst row = this.stmtGetProject.get(projectKey) as\n\t\t\t| { data: string }\n\t\t\t| undefined;\n\t\tif (!row) {\n\t\t\tthrow new Error(`Failed to create project ${projectKey}`);\n\t\t}\n\t\treturn JSON.parse(row.data) as Project;\n\t}\n\n\tasync getProject(projectKey: string): Promise<Project> {\n\t\treturn this.addProject(projectKey);\n\t}\n\n\tasync saveProject(project: Project): Promise<Project> {\n\t\tthis.stmtUpsertProject.run(project.key, JSON.stringify(project));\n\t\treturn project;\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tthis.stmtClearResources.run();\n\t\tthis._knownProjects.clear();\n\t}\n\n\tasync all<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t): Promise<ResourceMap[RT][]> {\n\t\tconst rows = this.stmtAllResources.all(projectKey, typeId) as Array<{\n\t\t\tdata: string;\n\t\t}>;\n\t\treturn rows.map((row) => JSON.parse(row.data) as ResourceMap[RT]);\n\t}\n\n\tasync count(projectKey: string, typeId: ResourceType): Promise<number> {\n\t\tconst row = this.stmtCountResources.get(projectKey, typeId) as\n\t\t\t| { cnt: number }\n\t\t\t| undefined;\n\t\treturn row?.cnt ?? 0;\n\t}\n\n\tasync add<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tobj: ResourceMap[RT],\n\t\tparams: GetParams = {},\n\t): Promise<ResourceMap[RT]> {\n\t\t// Ensure the project exists (cached, no DB round-trip after first call)\n\t\tthis.ensureProject(projectKey);\n\n\t\tconst key = (obj as any).key ?? null;\n\n\t\tthis.stmtInsertResource.run(\n\t\t\tprojectKey,\n\t\t\ttypeId,\n\t\t\tobj.id,\n\t\t\tkey,\n\t\t\tJSON.stringify(obj),\n\t\t);\n\n\t\t// Return a clone instead of the caller's reference so that expand()\n\t\t// can safely mutate it without affecting the caller's object.\n\t\tconst clone = cloneObject(obj);\n\t\treturn this.expand(projectKey, clone, params.expand);\n\t}\n\n\tasync get<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams: GetParams = {},\n\t): Promise<ResourceMap[RT] | null> {\n\t\tconst row = this.stmtGetResource.get(projectKey, typeId, id) as\n\t\t\t| { data: string }\n\t\t\t| undefined;\n\t\tif (row) {\n\t\t\tconst resource = JSON.parse(row.data) as ResourceMap[RT];\n\t\t\treturn this.expand(projectKey, resource, params.expand);\n\t\t}\n\t\treturn null;\n\t}\n\n\tasync getByKey<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tkey: string,\n\t\tparams: GetParams = {},\n\t): Promise<ResourceMap[RT] | null> {\n\t\tconst row = this.stmtGetResourceByKey.get(projectKey, typeId, key) as\n\t\t\t| { data: string }\n\t\t\t| undefined;\n\t\tif (row) {\n\t\t\tconst resource = JSON.parse(row.data) as ResourceMap[RT];\n\t\t\treturn this.expand(projectKey, resource, params.expand);\n\t\t}\n\t\treturn null;\n\t}\n\n\tasync delete<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tid: string,\n\t\tparams: GetParams = {},\n\t): Promise<ResourceMap[RT] | null> {\n\t\tconst resource = await this.get(projectKey, typeId, id);\n\t\tif (resource) {\n\t\t\tthis.stmtDeleteResource.run(projectKey, typeId, id);\n\t\t\treturn this.expand(projectKey, resource, params.expand);\n\t\t}\n\t\treturn null;\n\t}\n\n\tasync getByContainerAndKey(\n\t\tprojectKey: string,\n\t\tcontainer: string,\n\t\tkey: string,\n\t): Promise<CustomObject | null> {\n\t\tconst row = this.stmtGetResourceByContainerAndKey.get(\n\t\t\tprojectKey,\n\t\t\tcontainer,\n\t\t\tkey,\n\t\t) as { data: string } | undefined;\n\t\tif (row) {\n\t\t\treturn JSON.parse(row.data) as CustomObject;\n\t\t}\n\t\treturn null;\n\t}\n\n\tasync query<RT extends ResourceType>(\n\t\tprojectKey: string,\n\t\ttypeId: RT,\n\t\tparams: QueryParams,\n\t): Promise<PagedQueryResponseMap[RT]> {\n\t\tlet resources = await this.all<RT>(projectKey, typeId);\n\n\t\t// Apply predicates\n\t\tif (params.where) {\n\t\t\tconst vars = Object.fromEntries(\n\t\t\t\tObject.entries(params)\n\t\t\t\t\t.filter(([key]) => key.startsWith(\"var.\"))\n\t\t\t\t\t.map(([key, value]) => [key.slice(4), value]),\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst filterFunc = parseQueryExpression(params.where);\n\t\t\t\tresources = resources.filter((resource) => filterFunc(resource, vars));\n\t\t\t} catch (err) {\n\t\t\t\tthrow new CommercetoolsError<InvalidInputError>(\n\t\t\t\t\t{\n\t\t\t\t\t\tcode: \"InvalidInput\",\n\t\t\t\t\t\tmessage: (err as any).message,\n\t\t\t\t\t},\n\t\t\t\t\t400,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Get the total before slicing the array\n\t\tconst totalResources = resources.length;\n\n\t\t// Apply offset, limit\n\t\tconst offset = params.offset || 0;\n\t\tconst limit = params.limit || 20;\n\t\tresources = resources.slice(offset, offset + limit);\n\n\t\t// Expand the resources\n\t\tif (params.expand !== undefined) {\n\t\t\tresources = await Promise.all(\n\t\t\t\tresources.map((resource) =>\n\t\t\t\t\tthis.expand(projectKey, resource, params.expand),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tcount: resources.length,\n\t\t\ttotal: totalResources,\n\t\t\toffset: offset,\n\t\t\tlimit: limit,\n\t\t\tresults: resources,\n\t\t} as PagedQueryResponseMap[RT];\n\t}\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@labdigital/commercetools-mock",
3
- "version": "2.66.0",
3
+ "version": "3.0.0-beta.0",
4
4
  "license": "MIT",
5
5
  "author": "Michael van Tellingen",
6
6
  "type": "module",
7
7
  "exports": {
8
- ".": "./dist/index.mjs"
8
+ ".": "./dist/index.mjs",
9
+ "./sqlite": "./dist/storage/sqlite.mjs"
9
10
  },
10
11
  "imports": {
11
12
  "#src/*": "./src/*",
@@ -19,41 +20,36 @@
19
20
  "src"
20
21
  ],
21
22
  "dependencies": {
23
+ "@fastify/formbody": "8.0.2",
22
24
  "basic-auth": "2.0.1",
23
- "body-parser": "2.2.1",
24
- "decimal.js": "10.5.0",
25
- "express": "5.1.0",
25
+ "decimal.js": "10.6.0",
26
+ "fastify": "5.7.4",
26
27
  "light-my-request": "6.6.0",
27
- "morgan": "1.10.1",
28
- "msw": "2.8.4",
29
- "uuid": "11.1.0",
30
- "zod": "3.24.2",
31
- "zod-validation-error": "3.4.0"
28
+ "msw": "2.12.10",
29
+ "pino": "^10.3.1",
30
+ "qs": "6.15.0",
31
+ "uuid": "13.0.0",
32
+ "zod": "4.3.6"
32
33
  },
33
34
  "devDependencies": {
34
- "@biomejs/biome": "2.3.7",
35
+ "@biomejs/biome": "2.4.0",
35
36
  "@changesets/changelog-github": "0.5.2",
36
- "@changesets/cli": "2.29.7",
37
- "@commercetools/platform-sdk": "8.16.0",
37
+ "@changesets/cli": "2.29.8",
38
+ "@commercetools/platform-sdk": "8.24.0",
38
39
  "@types/basic-auth": "1.1.8",
39
- "@types/body-parser": "1.19.5",
40
- "@types/express": "5.0.5",
41
- "@types/express-serve-static-core": "^5.1.0",
42
- "@types/morgan": "1.9.9",
43
- "@types/node": "20.16.14",
44
- "@types/qs": "6.9.11",
45
- "@types/supertest": "6.0.3",
46
- "@types/uuid": "9.0.8",
47
- "@vitest/coverage-v8": "4.0.13",
48
- "fishery": "2.2.3",
49
- "supertest": "7.1.4",
40
+ "@types/node": "24.11.0",
41
+ "@types/qs": "6.14.0",
42
+ "pino-pretty": "^13.1.3",
43
+ "@vitest/coverage-v8": "4.0.18",
44
+ "fishery": "2.4.0",
50
45
  "timekeeper": "2.3.1",
51
- "tsdown": "0.16.8",
46
+ "tsdown": "0.20.3",
52
47
  "typescript": "5.9.3",
53
- "vitest": "4.0.13"
48
+ "vitest": "4.0.18",
49
+ "yaml": "^2.8.2"
54
50
  },
55
51
  "engines": {
56
- "node": ">=18",
52
+ "node": ">=20",
57
53
  "pnpm": ">=10.8.0"
58
54
  },
59
55
  "publishConfig": {
@@ -76,9 +72,10 @@
76
72
  "lint": "biome check",
77
73
  "publish:ci": "pnpm build && pnpm changeset publish",
78
74
  "publish:version": "pnpm changeset version && pnpm format",
79
- "start": "tsdown src/server.ts --watch --onSuccess 'node dist/server'",
75
+ "start": "node --experimental-strip-types --watch src/server.ts",
80
76
  "test": "vitest run",
81
77
  "test:ci": "vitest run --coverage",
82
- "test:watch": "vitest --watch"
78
+ "test:watch": "vitest --watch",
79
+ "generate:schemas": "node --experimental-strip-types scripts/generate-schemas.ts"
83
80
  }
84
81
  }