@umec/core 0.1.0-alpha.0 → 0.1.0-alpha.10

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 (53) hide show
  1. package/dist/catalog-5BPLMAW2.js +15 -0
  2. package/dist/catalog-5BPLMAW2.js.map +1 -0
  3. package/dist/checkout.d.ts +10 -3
  4. package/dist/checkout.js +1 -1
  5. package/dist/{chunk-2NYFCO5V.js → chunk-2EBXJT3M.js} +30 -30
  6. package/dist/chunk-2EBXJT3M.js.map +1 -0
  7. package/dist/{chunk-WZFM6R5J.js → chunk-4V4GYE7E.js} +4 -10
  8. package/dist/chunk-4V4GYE7E.js.map +1 -0
  9. package/dist/chunk-CYKUAS3D.js +9 -0
  10. package/dist/chunk-CYKUAS3D.js.map +1 -0
  11. package/dist/chunk-DN3J2NQC.js +298 -0
  12. package/dist/chunk-DN3J2NQC.js.map +1 -0
  13. package/dist/chunk-PNICEHSO.js +255 -0
  14. package/dist/chunk-PNICEHSO.js.map +1 -0
  15. package/dist/{chunk-QRFFBMFN.js → chunk-RFEX32LI.js} +12 -11
  16. package/dist/chunk-RFEX32LI.js.map +1 -0
  17. package/dist/chunk-T2PO3YLZ.js +64 -0
  18. package/dist/chunk-T2PO3YLZ.js.map +1 -0
  19. package/dist/{chunk-REUSLO5I.js → chunk-ZP7IGPJW.js} +26 -4
  20. package/dist/chunk-ZP7IGPJW.js.map +1 -0
  21. package/dist/cli.js +823 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/db/index.d.ts +130 -0
  24. package/dist/db/index.js +81 -0
  25. package/dist/db/index.js.map +1 -0
  26. package/dist/index.d.ts +6 -4
  27. package/dist/index.js +15 -4
  28. package/dist/middleware.d.ts +7 -2
  29. package/dist/middleware.js +1 -1
  30. package/dist/notify.d.ts +7 -8
  31. package/dist/notify.js +1 -1
  32. package/dist/orders-DRZvcL3s.d.ts +99 -0
  33. package/dist/schema-version-F-YYC1UG.d.ts +25 -0
  34. package/dist/sql-J4YBS7N7.js +7 -0
  35. package/dist/sql-J4YBS7N7.js.map +1 -0
  36. package/dist/webhook.d.ts +10 -2
  37. package/dist/webhook.js +1 -1
  38. package/package.json +10 -2
  39. package/schema/frozen-checksums.json +11 -0
  40. package/schema/migrations/0001_processed_events.sql +4 -0
  41. package/schema/migrations/0002_orders.sql +19 -0
  42. package/schema/migrations/0003_inventory.sql +5 -0
  43. package/schema/migrations/0004_admin_audit_log.sql +15 -0
  44. package/schema/migrations/0005_orders_tracking.sql +3 -0
  45. package/schema/migrations/0006_products.sql +15 -0
  46. package/schema/migrations/0007_orders_extras.sql +1 -0
  47. package/schema/snapshot.json +433 -0
  48. package/schema/upgrades/types.ts +16 -0
  49. package/schema/upgrades/v2-to-v6.ts +205 -0
  50. package/dist/chunk-2NYFCO5V.js.map +0 -1
  51. package/dist/chunk-QRFFBMFN.js.map +0 -1
  52. package/dist/chunk-REUSLO5I.js.map +0 -1
  53. package/dist/chunk-WZFM6R5J.js.map +0 -1
package/dist/webhook.d.ts CHANGED
@@ -37,17 +37,24 @@ type WebhookOrder = {
37
37
  paymentIntent: string | null;
38
38
  offerSlug: string | null;
39
39
  customFields: Record<string, string> | null;
40
+ metadata: Record<string, string> | null;
40
41
  createdAt: number;
41
42
  };
42
43
  type WebhookRecordedOrder = {
43
44
  items: WebhookItem[];
44
45
  offerSlug: string | null;
45
46
  };
47
+ type WebhookEmailResult = {
48
+ sessionId: string;
49
+ status: "sent" | "failed";
50
+ errorMessage?: string;
51
+ };
46
52
  type WebhookHandlerOptions = {
47
53
  claimEvent?: (eventId: string) => Promise<boolean>;
48
54
  recordRefund?: (paymentIntentId: string) => Promise<WebhookRecordedOrder | null>;
49
55
  recordExpiry?: (sessionId: string) => Promise<WebhookRecordedOrder | null>;
50
56
  recordOrder?: (order: WebhookOrder) => Promise<void>;
57
+ recordEmailResult?: (result: WebhookEmailResult) => Promise<void>;
51
58
  restoreStock?: (items: WebhookItem[]) => Promise<void>;
52
59
  decrementStock?: (items: WebhookItem[]) => Promise<void>;
53
60
  incrementOfferSold?: (offerSlug: string, items: WebhookItem[]) => Promise<void>;
@@ -55,11 +62,12 @@ type WebhookHandlerOptions = {
55
62
  renderOrderEmail?: RenderOrderEmail;
56
63
  orderEmailFrom?: string;
57
64
  orderEmailBcc?: string | string[];
65
+ orderEmailReplyTo?: string;
58
66
  };
59
67
  type WebhookHandler = ({ request }: {
60
68
  request: Request;
61
69
  }) => Promise<Response>;
62
70
  declare const GET: WebhookHandler;
63
- declare function createWebhookHandler({ claimEvent, recordRefund, recordExpiry, recordOrder, restoreStock, decrementStock, incrementOfferSold, decrementOfferSold, renderOrderEmail, orderEmailFrom, orderEmailBcc, }?: WebhookHandlerOptions): WebhookHandler;
71
+ declare function createWebhookHandler({ claimEvent, recordRefund, recordExpiry, recordOrder, recordEmailResult, restoreStock, decrementStock, incrementOfferSold, decrementOfferSold, renderOrderEmail, orderEmailFrom, orderEmailBcc, orderEmailReplyTo, }?: WebhookHandlerOptions): WebhookHandler;
64
72
 
65
- export { GET, type OrderEmailData, type OrderEmailLineItem, type RenderOrderEmail, type SupportedWebhookEvent, type WebhookHandler, type WebhookHandlerOptions, type WebhookItem, type WebhookOrder, type WebhookRecordedOrder, createWebhookHandler };
73
+ export { GET, type OrderEmailData, type OrderEmailLineItem, type RenderOrderEmail, type SupportedWebhookEvent, type WebhookEmailResult, type WebhookHandler, type WebhookHandlerOptions, type WebhookItem, type WebhookOrder, type WebhookRecordedOrder, createWebhookHandler };
package/dist/webhook.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  GET,
3
3
  createWebhookHandler
4
- } from "./chunk-REUSLO5I.js";
4
+ } from "./chunk-ZP7IGPJW.js";
5
5
  import "./chunk-7TJANK6S.js";
6
6
  export {
7
7
  GET,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umec/core",
3
- "version": "0.1.0-alpha.0",
3
+ "version": "0.1.0-alpha.10",
4
4
  "description": "Headless EC logic for umec — config schema and shared handlers",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -51,10 +51,18 @@
51
51
  "./webhook": {
52
52
  "types": "./dist/webhook.d.ts",
53
53
  "import": "./dist/webhook.js"
54
+ },
55
+ "./db": {
56
+ "types": "./dist/db/index.d.ts",
57
+ "import": "./dist/db/index.js"
54
58
  }
55
59
  },
60
+ "bin": {
61
+ "umec": "./dist/cli.js"
62
+ },
56
63
  "files": [
57
- "dist"
64
+ "dist",
65
+ "schema"
58
66
  ],
59
67
  "scripts": {
60
68
  "build": "tsup",
@@ -0,0 +1,11 @@
1
+ {
2
+ "schema/migrations/0001_processed_events.sql": "a5f525d69fb9591d0bbe0701fa28e4e3c11316ec60edcf3970d0b947ccef1bb9",
3
+ "schema/migrations/0002_orders.sql": "4d6e8fb3ee46e9afc3b47a9312ffe9ad1cf20e36eed51055d4c073e2ae85afd5",
4
+ "schema/migrations/0003_inventory.sql": "9ec36f50c9d3514cd2a1607c58f05065b8d5ff89ff9ce3eb92e20f1895ddebf1",
5
+ "schema/migrations/0004_admin_audit_log.sql": "04f4afbe91b484afb2239691ea2eb42cd2c01cb5b9881de29bdc0020cf259c3f",
6
+ "schema/migrations/0005_orders_tracking.sql": "22a0707ac907f31341dbca5347d803f1668f0e5630c9b94f7644ddad5211757b",
7
+ "schema/migrations/0006_products.sql": "f5710befe27d0324bcb1adb4537f9b53ef69dfa9407ce271dd13b2fb972b4452",
8
+ "schema/migrations/0007_orders_extras.sql": "6dd00e5b3b4e554a89c4b5dc5cc6d46b77d681de57e36521c2e4449ba1ba1c60",
9
+ "schema/upgrades/v2-to-v6.ts": "419704d04f583133be5b8b0d45a674619d1bdf60f9077614effa306862ba0e2f",
10
+ "schema/upgrades/types.ts": "0e45a9037c5e957eadb4b9ff66034e77be64a475eb18ca69b59a554d87070c54"
11
+ }
@@ -0,0 +1,4 @@
1
+ CREATE TABLE IF NOT EXISTS processed_events (
2
+ event_id TEXT PRIMARY KEY,
3
+ processed_at INTEGER NOT NULL
4
+ );
@@ -0,0 +1,19 @@
1
+ CREATE TABLE IF NOT EXISTS orders (
2
+ id TEXT PRIMARY KEY,
3
+ email TEXT NOT NULL,
4
+ name TEXT,
5
+ phone TEXT,
6
+ items_json TEXT NOT NULL,
7
+ amount INTEGER NOT NULL,
8
+ shipping INTEGER,
9
+ address_json TEXT,
10
+ payment_intent TEXT,
11
+ custom_fields_json TEXT,
12
+ status TEXT NOT NULL DEFAULT 'pending',
13
+ run_id TEXT,
14
+ email_status TEXT CHECK (email_status IN ('sent', 'failed')),
15
+ created_at INTEGER NOT NULL,
16
+ shipped_at INTEGER
17
+ );
18
+
19
+ CREATE INDEX IF NOT EXISTS orders_payment_intent_idx ON orders(payment_intent);
@@ -0,0 +1,5 @@
1
+ CREATE TABLE IF NOT EXISTS inventory (
2
+ sku TEXT PRIMARY KEY,
3
+ stock INTEGER NOT NULL DEFAULT 0,
4
+ updated_at INTEGER NOT NULL
5
+ );
@@ -0,0 +1,15 @@
1
+ CREATE TABLE IF NOT EXISTS admin_audit_log (
2
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
3
+ entity_type TEXT NOT NULL,
4
+ entity_id TEXT NOT NULL,
5
+ action TEXT NOT NULL,
6
+ delta INTEGER,
7
+ reason TEXT,
8
+ admin_email TEXT,
9
+ actor TEXT NOT NULL DEFAULT 'human',
10
+ detail_json TEXT,
11
+ created_at INTEGER NOT NULL
12
+ );
13
+
14
+ CREATE INDEX IF NOT EXISTS idx_admin_audit_log_entity
15
+ ON admin_audit_log(entity_type, entity_id, created_at);
@@ -0,0 +1,3 @@
1
+ ALTER TABLE orders ADD COLUMN tracking_number TEXT;
2
+ ALTER TABLE orders ADD COLUMN carrier TEXT
3
+ CHECK (carrier IN ('yamato', 'sagawa', 'japanpost', 'other') OR carrier IS NULL);
@@ -0,0 +1,15 @@
1
+ CREATE TABLE IF NOT EXISTS products (
2
+ sku TEXT PRIMARY KEY,
3
+ name TEXT NOT NULL,
4
+ description TEXT,
5
+ price INTEGER NOT NULL CHECK (price > 0),
6
+ shipping_units INTEGER NOT NULL DEFAULT 1 CHECK (shipping_units > 0),
7
+ images_json TEXT,
8
+ gtin TEXT,
9
+ category TEXT,
10
+ active INTEGER NOT NULL DEFAULT 1 CHECK (active IN (0, 1)),
11
+ low_stock_threshold INTEGER,
12
+ created_at INTEGER NOT NULL,
13
+ updated_at INTEGER NOT NULL,
14
+ updated_by TEXT
15
+ );
@@ -0,0 +1 @@
1
+ ALTER TABLE orders ADD COLUMN extras_json TEXT;
@@ -0,0 +1,433 @@
1
+ {
2
+ "version": 7,
3
+ "tables": {
4
+ "processed_events": {
5
+ "name": "processed_events",
6
+ "sql": "CREATE TABLE processed_events (\n event_id TEXT PRIMARY KEY,\n processed_at INTEGER NOT NULL\n)",
7
+ "columns": [
8
+ {
9
+ "cid": 0,
10
+ "name": "event_id",
11
+ "type": "TEXT",
12
+ "notnull": 0,
13
+ "dflt_value": null,
14
+ "pk": 1
15
+ },
16
+ {
17
+ "cid": 1,
18
+ "name": "processed_at",
19
+ "type": "INTEGER",
20
+ "notnull": 1,
21
+ "dflt_value": null,
22
+ "pk": 0
23
+ }
24
+ ],
25
+ "indexes": [],
26
+ "foreignKeys": []
27
+ },
28
+ "orders": {
29
+ "name": "orders",
30
+ "sql": "CREATE TABLE orders (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL,\n name TEXT,\n phone TEXT,\n items_json TEXT NOT NULL,\n amount INTEGER NOT NULL,\n shipping INTEGER,\n address_json TEXT,\n payment_intent TEXT,\n custom_fields_json TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n run_id TEXT,\n email_status TEXT CHECK (email_status IN ('sent', 'failed')),\n created_at INTEGER NOT NULL,\n shipped_at INTEGER\n, tracking_number TEXT, carrier TEXT\n CHECK (carrier IN ('yamato', 'sagawa', 'japanpost', 'other') OR carrier IS NULL), extras_json TEXT)",
31
+ "columns": [
32
+ {
33
+ "cid": 0,
34
+ "name": "id",
35
+ "type": "TEXT",
36
+ "notnull": 0,
37
+ "dflt_value": null,
38
+ "pk": 1
39
+ },
40
+ {
41
+ "cid": 1,
42
+ "name": "email",
43
+ "type": "TEXT",
44
+ "notnull": 1,
45
+ "dflt_value": null,
46
+ "pk": 0
47
+ },
48
+ {
49
+ "cid": 2,
50
+ "name": "name",
51
+ "type": "TEXT",
52
+ "notnull": 0,
53
+ "dflt_value": null,
54
+ "pk": 0
55
+ },
56
+ {
57
+ "cid": 3,
58
+ "name": "phone",
59
+ "type": "TEXT",
60
+ "notnull": 0,
61
+ "dflt_value": null,
62
+ "pk": 0
63
+ },
64
+ {
65
+ "cid": 4,
66
+ "name": "items_json",
67
+ "type": "TEXT",
68
+ "notnull": 1,
69
+ "dflt_value": null,
70
+ "pk": 0
71
+ },
72
+ {
73
+ "cid": 5,
74
+ "name": "amount",
75
+ "type": "INTEGER",
76
+ "notnull": 1,
77
+ "dflt_value": null,
78
+ "pk": 0
79
+ },
80
+ {
81
+ "cid": 6,
82
+ "name": "shipping",
83
+ "type": "INTEGER",
84
+ "notnull": 0,
85
+ "dflt_value": null,
86
+ "pk": 0
87
+ },
88
+ {
89
+ "cid": 7,
90
+ "name": "address_json",
91
+ "type": "TEXT",
92
+ "notnull": 0,
93
+ "dflt_value": null,
94
+ "pk": 0
95
+ },
96
+ {
97
+ "cid": 8,
98
+ "name": "payment_intent",
99
+ "type": "TEXT",
100
+ "notnull": 0,
101
+ "dflt_value": null,
102
+ "pk": 0
103
+ },
104
+ {
105
+ "cid": 9,
106
+ "name": "custom_fields_json",
107
+ "type": "TEXT",
108
+ "notnull": 0,
109
+ "dflt_value": null,
110
+ "pk": 0
111
+ },
112
+ {
113
+ "cid": 10,
114
+ "name": "status",
115
+ "type": "TEXT",
116
+ "notnull": 1,
117
+ "dflt_value": "'pending'",
118
+ "pk": 0
119
+ },
120
+ {
121
+ "cid": 11,
122
+ "name": "run_id",
123
+ "type": "TEXT",
124
+ "notnull": 0,
125
+ "dflt_value": null,
126
+ "pk": 0
127
+ },
128
+ {
129
+ "cid": 12,
130
+ "name": "email_status",
131
+ "type": "TEXT",
132
+ "notnull": 0,
133
+ "dflt_value": null,
134
+ "pk": 0
135
+ },
136
+ {
137
+ "cid": 13,
138
+ "name": "created_at",
139
+ "type": "INTEGER",
140
+ "notnull": 1,
141
+ "dflt_value": null,
142
+ "pk": 0
143
+ },
144
+ {
145
+ "cid": 14,
146
+ "name": "shipped_at",
147
+ "type": "INTEGER",
148
+ "notnull": 0,
149
+ "dflt_value": null,
150
+ "pk": 0
151
+ },
152
+ {
153
+ "cid": 15,
154
+ "name": "tracking_number",
155
+ "type": "TEXT",
156
+ "notnull": 0,
157
+ "dflt_value": null,
158
+ "pk": 0
159
+ },
160
+ {
161
+ "cid": 16,
162
+ "name": "carrier",
163
+ "type": "TEXT",
164
+ "notnull": 0,
165
+ "dflt_value": null,
166
+ "pk": 0
167
+ },
168
+ {
169
+ "cid": 17,
170
+ "name": "extras_json",
171
+ "type": "TEXT",
172
+ "notnull": 0,
173
+ "dflt_value": null,
174
+ "pk": 0
175
+ }
176
+ ],
177
+ "indexes": [
178
+ {
179
+ "name": "orders_payment_intent_idx",
180
+ "unique": 0,
181
+ "origin": "c",
182
+ "columns": [
183
+ "payment_intent"
184
+ ]
185
+ }
186
+ ],
187
+ "foreignKeys": []
188
+ },
189
+ "inventory": {
190
+ "name": "inventory",
191
+ "sql": "CREATE TABLE inventory (\n sku TEXT PRIMARY KEY,\n stock INTEGER NOT NULL DEFAULT 0,\n updated_at INTEGER NOT NULL\n)",
192
+ "columns": [
193
+ {
194
+ "cid": 0,
195
+ "name": "sku",
196
+ "type": "TEXT",
197
+ "notnull": 0,
198
+ "dflt_value": null,
199
+ "pk": 1
200
+ },
201
+ {
202
+ "cid": 1,
203
+ "name": "stock",
204
+ "type": "INTEGER",
205
+ "notnull": 1,
206
+ "dflt_value": "0",
207
+ "pk": 0
208
+ },
209
+ {
210
+ "cid": 2,
211
+ "name": "updated_at",
212
+ "type": "INTEGER",
213
+ "notnull": 1,
214
+ "dflt_value": null,
215
+ "pk": 0
216
+ }
217
+ ],
218
+ "indexes": [],
219
+ "foreignKeys": []
220
+ },
221
+ "admin_audit_log": {
222
+ "name": "admin_audit_log",
223
+ "sql": "CREATE TABLE admin_audit_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n entity_type TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n action TEXT NOT NULL,\n delta INTEGER,\n reason TEXT,\n admin_email TEXT,\n actor TEXT NOT NULL DEFAULT 'human',\n detail_json TEXT,\n created_at INTEGER NOT NULL\n)",
224
+ "columns": [
225
+ {
226
+ "cid": 0,
227
+ "name": "id",
228
+ "type": "INTEGER",
229
+ "notnull": 0,
230
+ "dflt_value": null,
231
+ "pk": 1
232
+ },
233
+ {
234
+ "cid": 1,
235
+ "name": "entity_type",
236
+ "type": "TEXT",
237
+ "notnull": 1,
238
+ "dflt_value": null,
239
+ "pk": 0
240
+ },
241
+ {
242
+ "cid": 2,
243
+ "name": "entity_id",
244
+ "type": "TEXT",
245
+ "notnull": 1,
246
+ "dflt_value": null,
247
+ "pk": 0
248
+ },
249
+ {
250
+ "cid": 3,
251
+ "name": "action",
252
+ "type": "TEXT",
253
+ "notnull": 1,
254
+ "dflt_value": null,
255
+ "pk": 0
256
+ },
257
+ {
258
+ "cid": 4,
259
+ "name": "delta",
260
+ "type": "INTEGER",
261
+ "notnull": 0,
262
+ "dflt_value": null,
263
+ "pk": 0
264
+ },
265
+ {
266
+ "cid": 5,
267
+ "name": "reason",
268
+ "type": "TEXT",
269
+ "notnull": 0,
270
+ "dflt_value": null,
271
+ "pk": 0
272
+ },
273
+ {
274
+ "cid": 6,
275
+ "name": "admin_email",
276
+ "type": "TEXT",
277
+ "notnull": 0,
278
+ "dflt_value": null,
279
+ "pk": 0
280
+ },
281
+ {
282
+ "cid": 7,
283
+ "name": "actor",
284
+ "type": "TEXT",
285
+ "notnull": 1,
286
+ "dflt_value": "'human'",
287
+ "pk": 0
288
+ },
289
+ {
290
+ "cid": 8,
291
+ "name": "detail_json",
292
+ "type": "TEXT",
293
+ "notnull": 0,
294
+ "dflt_value": null,
295
+ "pk": 0
296
+ },
297
+ {
298
+ "cid": 9,
299
+ "name": "created_at",
300
+ "type": "INTEGER",
301
+ "notnull": 1,
302
+ "dflt_value": null,
303
+ "pk": 0
304
+ }
305
+ ],
306
+ "indexes": [
307
+ {
308
+ "name": "idx_admin_audit_log_entity",
309
+ "unique": 0,
310
+ "origin": "c",
311
+ "columns": [
312
+ "entity_type",
313
+ "entity_id",
314
+ "created_at"
315
+ ]
316
+ }
317
+ ],
318
+ "foreignKeys": []
319
+ },
320
+ "products": {
321
+ "name": "products",
322
+ "sql": "CREATE TABLE products (\n sku TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n price INTEGER NOT NULL CHECK (price > 0),\n shipping_units INTEGER NOT NULL DEFAULT 1 CHECK (shipping_units > 0),\n images_json TEXT,\n gtin TEXT,\n category TEXT,\n active INTEGER NOT NULL DEFAULT 1 CHECK (active IN (0, 1)),\n low_stock_threshold INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n updated_by TEXT\n)",
323
+ "columns": [
324
+ {
325
+ "cid": 0,
326
+ "name": "sku",
327
+ "type": "TEXT",
328
+ "notnull": 0,
329
+ "dflt_value": null,
330
+ "pk": 1
331
+ },
332
+ {
333
+ "cid": 1,
334
+ "name": "name",
335
+ "type": "TEXT",
336
+ "notnull": 1,
337
+ "dflt_value": null,
338
+ "pk": 0
339
+ },
340
+ {
341
+ "cid": 2,
342
+ "name": "description",
343
+ "type": "TEXT",
344
+ "notnull": 0,
345
+ "dflt_value": null,
346
+ "pk": 0
347
+ },
348
+ {
349
+ "cid": 3,
350
+ "name": "price",
351
+ "type": "INTEGER",
352
+ "notnull": 1,
353
+ "dflt_value": null,
354
+ "pk": 0
355
+ },
356
+ {
357
+ "cid": 4,
358
+ "name": "shipping_units",
359
+ "type": "INTEGER",
360
+ "notnull": 1,
361
+ "dflt_value": "1",
362
+ "pk": 0
363
+ },
364
+ {
365
+ "cid": 5,
366
+ "name": "images_json",
367
+ "type": "TEXT",
368
+ "notnull": 0,
369
+ "dflt_value": null,
370
+ "pk": 0
371
+ },
372
+ {
373
+ "cid": 6,
374
+ "name": "gtin",
375
+ "type": "TEXT",
376
+ "notnull": 0,
377
+ "dflt_value": null,
378
+ "pk": 0
379
+ },
380
+ {
381
+ "cid": 7,
382
+ "name": "category",
383
+ "type": "TEXT",
384
+ "notnull": 0,
385
+ "dflt_value": null,
386
+ "pk": 0
387
+ },
388
+ {
389
+ "cid": 8,
390
+ "name": "active",
391
+ "type": "INTEGER",
392
+ "notnull": 1,
393
+ "dflt_value": "1",
394
+ "pk": 0
395
+ },
396
+ {
397
+ "cid": 9,
398
+ "name": "low_stock_threshold",
399
+ "type": "INTEGER",
400
+ "notnull": 0,
401
+ "dflt_value": null,
402
+ "pk": 0
403
+ },
404
+ {
405
+ "cid": 10,
406
+ "name": "created_at",
407
+ "type": "INTEGER",
408
+ "notnull": 1,
409
+ "dflt_value": null,
410
+ "pk": 0
411
+ },
412
+ {
413
+ "cid": 11,
414
+ "name": "updated_at",
415
+ "type": "INTEGER",
416
+ "notnull": 1,
417
+ "dflt_value": null,
418
+ "pk": 0
419
+ },
420
+ {
421
+ "cid": 12,
422
+ "name": "updated_by",
423
+ "type": "TEXT",
424
+ "notnull": 0,
425
+ "dflt_value": null,
426
+ "pk": 0
427
+ }
428
+ ],
429
+ "indexes": [],
430
+ "foreignKeys": []
431
+ }
432
+ }
433
+ }
@@ -0,0 +1,16 @@
1
+ export type UpgradeExecutor = {
2
+ exec(sql: string): Promise<void>;
3
+ all<T>(sql: string, params?: unknown[]): Promise<T[]>;
4
+ first<T>(sql: string, params?: unknown[]): Promise<T | null>;
5
+ run(sql: string, params?: unknown[]): Promise<{ changes: number }>;
6
+ };
7
+
8
+ export type UpgradeModule = {
9
+ name: string;
10
+ fromVersion: number;
11
+ toVersion: number;
12
+ description: string;
13
+ replacesChecksums: readonly string[];
14
+ canApply(db: UpgradeExecutor): Promise<boolean>;
15
+ apply(db: UpgradeExecutor): Promise<void>;
16
+ };