@unifiedcommerce/plugin-loyalty 0.0.1

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.
@@ -0,0 +1,5 @@
1
+ import type { LoyaltyPluginOptions } from "./types";
2
+ export type { LoyaltyPluginOptions, Db } from "./types";
3
+ export { LoyaltyService } from "./services/loyalty-service";
4
+ export declare function loyaltyPlugin(userOptions?: LoyaltyPluginOptions): import("@unifiedcommerce/core").CommercePlugin;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAM,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGxD,YAAY,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,wBAAgB,aAAa,CAAC,WAAW,GAAE,oBAAyB,kDAsCnE"}
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ import { defineCommercePlugin, resolveOrgId } from "@unifiedcommerce/core";
2
+ import { loyaltyPoints, loyaltyTransactions, loyaltyRedemptionOffers } from "./schema";
3
+ import { LoyaltyService } from "./services/loyalty-service";
4
+ import { buildLoyaltyRoutes } from "./routes/loyalty";
5
+ import { DEFAULT_LOYALTY_OPTIONS } from "./types";
6
+ export { LoyaltyService } from "./services/loyalty-service";
7
+ export function loyaltyPlugin(userOptions = {}) {
8
+ const options = { ...DEFAULT_LOYALTY_OPTIONS, ...userOptions };
9
+ return defineCommercePlugin({
10
+ id: "loyalty",
11
+ version: "1.0.0",
12
+ permissions: [
13
+ { scope: "loyalty:admin", description: "Create/manage redemption offers, view all loyalty data." },
14
+ ],
15
+ schema: () => ({ loyaltyPoints, loyaltyTransactions, loyaltyRedemptionOffers }),
16
+ hooks: () => [{
17
+ key: "orders.afterCreate",
18
+ async handler(args) {
19
+ const { result, context } = args;
20
+ if (!result.customerId)
21
+ return;
22
+ const rawDb = context.services.database?.db;
23
+ if (!rawDb)
24
+ return;
25
+ const orgId = resolveOrgId(context.actor);
26
+ const pointsEarned = Math.floor((result.grandTotal / 100) * options.pointsPerDollar);
27
+ if (pointsEarned <= 0)
28
+ return;
29
+ const db = rawDb;
30
+ const service = new LoyaltyService(db, options.tierThresholds);
31
+ await service.earnPoints(orgId, result.customerId, pointsEarned, result.id);
32
+ context.logger.info("loyalty_points_awarded", { customerId: result.customerId, orgId, pointsEarned });
33
+ },
34
+ }],
35
+ routes: (ctx) => {
36
+ const db = ctx.database.db;
37
+ if (!db)
38
+ return [];
39
+ return buildLoyaltyRoutes(new LoyaltyService(db, options.tierThresholds), ctx);
40
+ },
41
+ });
42
+ }
@@ -0,0 +1,9 @@
1
+ import type { LoyaltyService } from "../services/loyalty-service";
2
+ import type { PluginRouteRegistration } from "@unifiedcommerce/core";
3
+ export declare function buildLoyaltyRoutes(service: LoyaltyService, ctx: {
4
+ services?: Record<string, unknown>;
5
+ database?: {
6
+ db: unknown;
7
+ };
8
+ }): PluginRouteRegistration[];
9
+ //# sourceMappingURL=loyalty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loyalty.d.ts","sourceRoot":"","sources":["../../src/routes/loyalty.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,GACtE,uBAAuB,EAAE,CA4D3B"}
@@ -0,0 +1,62 @@
1
+ import { router } from "@unifiedcommerce/core";
2
+ import { z } from "@hono/zod-openapi";
3
+ export function buildLoyaltyRoutes(service, ctx) {
4
+ const r = router("Loyalty", "/loyalty", ctx);
5
+ r.get("/points/{customerId}").summary("Get loyalty points (admin)").permission("loyalty:admin")
6
+ .handler(async ({ params, orgId }) => {
7
+ const result = await service.getPoints(orgId, params.customerId);
8
+ if (!result.ok)
9
+ throw new Error("Failed");
10
+ if (!result.value)
11
+ return { customerId: params.customerId, points: 0, tier: "bronze", message: "No points yet" };
12
+ return result.value;
13
+ });
14
+ r.get("/leaderboard").summary("Loyalty leaderboard").auth()
15
+ .handler(async ({ orgId }) => {
16
+ const result = await service.getLeaderboard(orgId);
17
+ if (!result.ok)
18
+ throw new Error(result.error);
19
+ return result.value.map((e, i) => ({ rank: i + 1, customerId: e.customerId, points: e.points, tier: e.tier }));
20
+ });
21
+ r.post("/redeem").summary("Redeem points (admin)").permission("loyalty:admin")
22
+ .input(z.object({ customerId: z.string().min(1), pointsToRedeem: z.number().int().min(1) }))
23
+ .handler(async ({ input, orgId }) => {
24
+ const body = input;
25
+ const result = await service.redeemPoints(orgId, body.customerId, body.pointsToRedeem);
26
+ if (!result.ok)
27
+ throw new Error(result.error);
28
+ return { remainingPoints: result.value.points, tier: result.value.tier };
29
+ });
30
+ // ─── Offers ────────────────────────────────────────────────────
31
+ r.post("/offers").summary("Create redemption offer").permission("loyalty:admin")
32
+ .input(z.object({
33
+ name: z.string().min(1), pointsRequired: z.number().int().positive(),
34
+ rewardType: z.enum(["discount_percentage", "discount_fixed", "free_item", "free_shipping"]),
35
+ rewardValue: z.number().int(), rewardEntityId: z.string().uuid().optional(),
36
+ validFrom: z.string().optional(), validUntil: z.string().optional(),
37
+ maxRedemptions: z.number().int().positive().optional(),
38
+ }))
39
+ .handler(async ({ input, orgId }) => {
40
+ const result = await service.createOffer(orgId, input);
41
+ if (!result.ok)
42
+ throw new Error(result.error);
43
+ return result.value;
44
+ });
45
+ r.get("/offers").summary("List active offers").auth()
46
+ .handler(async ({ orgId }) => {
47
+ const result = await service.listOffers(orgId);
48
+ if (!result.ok)
49
+ throw new Error(result.error);
50
+ return result.value;
51
+ });
52
+ r.post("/offers/{id}/redeem").summary("Redeem an offer (admin)").permission("loyalty:admin")
53
+ .input(z.object({ customerId: z.string().min(1) }))
54
+ .handler(async ({ params, input, orgId }) => {
55
+ const body = input;
56
+ const result = await service.redeemOffer(orgId, body.customerId, params.id);
57
+ if (!result.ok)
58
+ throw new Error(result.error);
59
+ return result.value;
60
+ });
61
+ return r.routes();
62
+ }
@@ -0,0 +1,532 @@
1
+ export declare const loyaltyPoints: import("drizzle-orm/pg-core").PgTableWithColumns<{
2
+ name: "loyalty_points";
3
+ schema: undefined;
4
+ columns: {
5
+ id: import("drizzle-orm/pg-core").PgColumn<{
6
+ name: "id";
7
+ tableName: "loyalty_points";
8
+ dataType: "string";
9
+ columnType: "PgUUID";
10
+ data: string;
11
+ driverParam: string;
12
+ notNull: true;
13
+ hasDefault: true;
14
+ isPrimaryKey: true;
15
+ isAutoincrement: false;
16
+ hasRuntimeDefault: false;
17
+ enumValues: undefined;
18
+ baseColumn: never;
19
+ identity: undefined;
20
+ generated: undefined;
21
+ }, {}, {}>;
22
+ organizationId: import("drizzle-orm/pg-core").PgColumn<{
23
+ name: "organization_id";
24
+ tableName: "loyalty_points";
25
+ dataType: "string";
26
+ columnType: "PgText";
27
+ data: string;
28
+ driverParam: string;
29
+ notNull: true;
30
+ hasDefault: false;
31
+ isPrimaryKey: false;
32
+ isAutoincrement: false;
33
+ hasRuntimeDefault: false;
34
+ enumValues: [string, ...string[]];
35
+ baseColumn: never;
36
+ identity: undefined;
37
+ generated: undefined;
38
+ }, {}, {}>;
39
+ customerId: import("drizzle-orm/pg-core").PgColumn<{
40
+ name: "customer_id";
41
+ tableName: "loyalty_points";
42
+ dataType: "string";
43
+ columnType: "PgUUID";
44
+ data: string;
45
+ driverParam: string;
46
+ notNull: true;
47
+ hasDefault: false;
48
+ isPrimaryKey: false;
49
+ isAutoincrement: false;
50
+ hasRuntimeDefault: false;
51
+ enumValues: undefined;
52
+ baseColumn: never;
53
+ identity: undefined;
54
+ generated: undefined;
55
+ }, {}, {}>;
56
+ points: import("drizzle-orm/pg-core").PgColumn<{
57
+ name: "points";
58
+ tableName: "loyalty_points";
59
+ dataType: "number";
60
+ columnType: "PgInteger";
61
+ data: number;
62
+ driverParam: string | number;
63
+ notNull: true;
64
+ hasDefault: true;
65
+ isPrimaryKey: false;
66
+ isAutoincrement: false;
67
+ hasRuntimeDefault: false;
68
+ enumValues: undefined;
69
+ baseColumn: never;
70
+ identity: undefined;
71
+ generated: undefined;
72
+ }, {}, {}>;
73
+ tier: import("drizzle-orm/pg-core").PgColumn<{
74
+ name: "tier";
75
+ tableName: "loyalty_points";
76
+ dataType: "string";
77
+ columnType: "PgText";
78
+ data: "bronze" | "silver" | "gold" | "platinum";
79
+ driverParam: string;
80
+ notNull: true;
81
+ hasDefault: true;
82
+ isPrimaryKey: false;
83
+ isAutoincrement: false;
84
+ hasRuntimeDefault: false;
85
+ enumValues: ["bronze", "silver", "gold", "platinum"];
86
+ baseColumn: never;
87
+ identity: undefined;
88
+ generated: undefined;
89
+ }, {}, {}>;
90
+ lifetimeSpend: import("drizzle-orm/pg-core").PgColumn<{
91
+ name: "lifetime_spend";
92
+ tableName: "loyalty_points";
93
+ dataType: "number";
94
+ columnType: "PgInteger";
95
+ data: number;
96
+ driverParam: string | number;
97
+ notNull: true;
98
+ hasDefault: true;
99
+ isPrimaryKey: false;
100
+ isAutoincrement: false;
101
+ hasRuntimeDefault: false;
102
+ enumValues: undefined;
103
+ baseColumn: never;
104
+ identity: undefined;
105
+ generated: undefined;
106
+ }, {}, {}>;
107
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
108
+ name: "created_at";
109
+ tableName: "loyalty_points";
110
+ dataType: "date";
111
+ columnType: "PgTimestamp";
112
+ data: Date;
113
+ driverParam: string;
114
+ notNull: true;
115
+ hasDefault: true;
116
+ isPrimaryKey: false;
117
+ isAutoincrement: false;
118
+ hasRuntimeDefault: false;
119
+ enumValues: undefined;
120
+ baseColumn: never;
121
+ identity: undefined;
122
+ generated: undefined;
123
+ }, {}, {}>;
124
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
125
+ name: "updated_at";
126
+ tableName: "loyalty_points";
127
+ dataType: "date";
128
+ columnType: "PgTimestamp";
129
+ data: Date;
130
+ driverParam: string;
131
+ notNull: true;
132
+ hasDefault: true;
133
+ isPrimaryKey: false;
134
+ isAutoincrement: false;
135
+ hasRuntimeDefault: false;
136
+ enumValues: undefined;
137
+ baseColumn: never;
138
+ identity: undefined;
139
+ generated: undefined;
140
+ }, {}, {}>;
141
+ };
142
+ dialect: "pg";
143
+ }>;
144
+ export declare const loyaltyTransactions: import("drizzle-orm/pg-core").PgTableWithColumns<{
145
+ name: "loyalty_transactions";
146
+ schema: undefined;
147
+ columns: {
148
+ id: import("drizzle-orm/pg-core").PgColumn<{
149
+ name: "id";
150
+ tableName: "loyalty_transactions";
151
+ dataType: "string";
152
+ columnType: "PgUUID";
153
+ data: string;
154
+ driverParam: string;
155
+ notNull: true;
156
+ hasDefault: true;
157
+ isPrimaryKey: true;
158
+ isAutoincrement: false;
159
+ hasRuntimeDefault: false;
160
+ enumValues: undefined;
161
+ baseColumn: never;
162
+ identity: undefined;
163
+ generated: undefined;
164
+ }, {}, {}>;
165
+ organizationId: import("drizzle-orm/pg-core").PgColumn<{
166
+ name: "organization_id";
167
+ tableName: "loyalty_transactions";
168
+ dataType: "string";
169
+ columnType: "PgText";
170
+ data: string;
171
+ driverParam: string;
172
+ notNull: true;
173
+ hasDefault: false;
174
+ isPrimaryKey: false;
175
+ isAutoincrement: false;
176
+ hasRuntimeDefault: false;
177
+ enumValues: [string, ...string[]];
178
+ baseColumn: never;
179
+ identity: undefined;
180
+ generated: undefined;
181
+ }, {}, {}>;
182
+ customerId: import("drizzle-orm/pg-core").PgColumn<{
183
+ name: "customer_id";
184
+ tableName: "loyalty_transactions";
185
+ dataType: "string";
186
+ columnType: "PgUUID";
187
+ data: string;
188
+ driverParam: string;
189
+ notNull: true;
190
+ hasDefault: false;
191
+ isPrimaryKey: false;
192
+ isAutoincrement: false;
193
+ hasRuntimeDefault: false;
194
+ enumValues: undefined;
195
+ baseColumn: never;
196
+ identity: undefined;
197
+ generated: undefined;
198
+ }, {}, {}>;
199
+ orderId: import("drizzle-orm/pg-core").PgColumn<{
200
+ name: "order_id";
201
+ tableName: "loyalty_transactions";
202
+ dataType: "string";
203
+ columnType: "PgUUID";
204
+ data: string;
205
+ driverParam: string;
206
+ notNull: false;
207
+ hasDefault: false;
208
+ isPrimaryKey: false;
209
+ isAutoincrement: false;
210
+ hasRuntimeDefault: false;
211
+ enumValues: undefined;
212
+ baseColumn: never;
213
+ identity: undefined;
214
+ generated: undefined;
215
+ }, {}, {}>;
216
+ type: import("drizzle-orm/pg-core").PgColumn<{
217
+ name: "type";
218
+ tableName: "loyalty_transactions";
219
+ dataType: "string";
220
+ columnType: "PgText";
221
+ data: "earn" | "redeem";
222
+ driverParam: string;
223
+ notNull: true;
224
+ hasDefault: false;
225
+ isPrimaryKey: false;
226
+ isAutoincrement: false;
227
+ hasRuntimeDefault: false;
228
+ enumValues: ["earn", "redeem"];
229
+ baseColumn: never;
230
+ identity: undefined;
231
+ generated: undefined;
232
+ }, {}, {}>;
233
+ amount: import("drizzle-orm/pg-core").PgColumn<{
234
+ name: "amount";
235
+ tableName: "loyalty_transactions";
236
+ dataType: "number";
237
+ columnType: "PgInteger";
238
+ data: number;
239
+ driverParam: string | number;
240
+ notNull: true;
241
+ hasDefault: false;
242
+ isPrimaryKey: false;
243
+ isAutoincrement: false;
244
+ hasRuntimeDefault: false;
245
+ enumValues: undefined;
246
+ baseColumn: never;
247
+ identity: undefined;
248
+ generated: undefined;
249
+ }, {}, {}>;
250
+ description: import("drizzle-orm/pg-core").PgColumn<{
251
+ name: "description";
252
+ tableName: "loyalty_transactions";
253
+ dataType: "string";
254
+ columnType: "PgText";
255
+ data: string;
256
+ driverParam: string;
257
+ notNull: false;
258
+ hasDefault: false;
259
+ isPrimaryKey: false;
260
+ isAutoincrement: false;
261
+ hasRuntimeDefault: false;
262
+ enumValues: [string, ...string[]];
263
+ baseColumn: never;
264
+ identity: undefined;
265
+ generated: undefined;
266
+ }, {}, {}>;
267
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
268
+ name: "created_at";
269
+ tableName: "loyalty_transactions";
270
+ dataType: "date";
271
+ columnType: "PgTimestamp";
272
+ data: Date;
273
+ driverParam: string;
274
+ notNull: true;
275
+ hasDefault: true;
276
+ isPrimaryKey: false;
277
+ isAutoincrement: false;
278
+ hasRuntimeDefault: false;
279
+ enumValues: undefined;
280
+ baseColumn: never;
281
+ identity: undefined;
282
+ generated: undefined;
283
+ }, {}, {}>;
284
+ };
285
+ dialect: "pg";
286
+ }>;
287
+ export declare const loyaltyRedemptionOffers: import("drizzle-orm/pg-core").PgTableWithColumns<{
288
+ name: "loyalty_redemption_offers";
289
+ schema: undefined;
290
+ columns: {
291
+ id: import("drizzle-orm/pg-core").PgColumn<{
292
+ name: "id";
293
+ tableName: "loyalty_redemption_offers";
294
+ dataType: "string";
295
+ columnType: "PgUUID";
296
+ data: string;
297
+ driverParam: string;
298
+ notNull: true;
299
+ hasDefault: true;
300
+ isPrimaryKey: true;
301
+ isAutoincrement: false;
302
+ hasRuntimeDefault: false;
303
+ enumValues: undefined;
304
+ baseColumn: never;
305
+ identity: undefined;
306
+ generated: undefined;
307
+ }, {}, {}>;
308
+ organizationId: import("drizzle-orm/pg-core").PgColumn<{
309
+ name: "organization_id";
310
+ tableName: "loyalty_redemption_offers";
311
+ dataType: "string";
312
+ columnType: "PgText";
313
+ data: string;
314
+ driverParam: string;
315
+ notNull: true;
316
+ hasDefault: false;
317
+ isPrimaryKey: false;
318
+ isAutoincrement: false;
319
+ hasRuntimeDefault: false;
320
+ enumValues: [string, ...string[]];
321
+ baseColumn: never;
322
+ identity: undefined;
323
+ generated: undefined;
324
+ }, {}, {}>;
325
+ name: import("drizzle-orm/pg-core").PgColumn<{
326
+ name: "name";
327
+ tableName: "loyalty_redemption_offers";
328
+ dataType: "string";
329
+ columnType: "PgText";
330
+ data: string;
331
+ driverParam: string;
332
+ notNull: true;
333
+ hasDefault: false;
334
+ isPrimaryKey: false;
335
+ isAutoincrement: false;
336
+ hasRuntimeDefault: false;
337
+ enumValues: [string, ...string[]];
338
+ baseColumn: never;
339
+ identity: undefined;
340
+ generated: undefined;
341
+ }, {}, {}>;
342
+ pointsRequired: import("drizzle-orm/pg-core").PgColumn<{
343
+ name: "points_required";
344
+ tableName: "loyalty_redemption_offers";
345
+ dataType: "number";
346
+ columnType: "PgInteger";
347
+ data: number;
348
+ driverParam: string | number;
349
+ notNull: true;
350
+ hasDefault: false;
351
+ isPrimaryKey: false;
352
+ isAutoincrement: false;
353
+ hasRuntimeDefault: false;
354
+ enumValues: undefined;
355
+ baseColumn: never;
356
+ identity: undefined;
357
+ generated: undefined;
358
+ }, {}, {}>;
359
+ rewardType: import("drizzle-orm/pg-core").PgColumn<{
360
+ name: "reward_type";
361
+ tableName: "loyalty_redemption_offers";
362
+ dataType: "string";
363
+ columnType: "PgText";
364
+ data: "discount_percentage" | "discount_fixed" | "free_item" | "free_shipping";
365
+ driverParam: string;
366
+ notNull: true;
367
+ hasDefault: false;
368
+ isPrimaryKey: false;
369
+ isAutoincrement: false;
370
+ hasRuntimeDefault: false;
371
+ enumValues: ["discount_percentage", "discount_fixed", "free_item", "free_shipping"];
372
+ baseColumn: never;
373
+ identity: undefined;
374
+ generated: undefined;
375
+ }, {}, {}>;
376
+ rewardValue: import("drizzle-orm/pg-core").PgColumn<{
377
+ name: "reward_value";
378
+ tableName: "loyalty_redemption_offers";
379
+ dataType: "number";
380
+ columnType: "PgInteger";
381
+ data: number;
382
+ driverParam: string | number;
383
+ notNull: true;
384
+ hasDefault: false;
385
+ isPrimaryKey: false;
386
+ isAutoincrement: false;
387
+ hasRuntimeDefault: false;
388
+ enumValues: undefined;
389
+ baseColumn: never;
390
+ identity: undefined;
391
+ generated: undefined;
392
+ }, {}, {}>;
393
+ rewardEntityId: import("drizzle-orm/pg-core").PgColumn<{
394
+ name: "reward_entity_id";
395
+ tableName: "loyalty_redemption_offers";
396
+ dataType: "string";
397
+ columnType: "PgUUID";
398
+ data: string;
399
+ driverParam: string;
400
+ notNull: false;
401
+ hasDefault: false;
402
+ isPrimaryKey: false;
403
+ isAutoincrement: false;
404
+ hasRuntimeDefault: false;
405
+ enumValues: undefined;
406
+ baseColumn: never;
407
+ identity: undefined;
408
+ generated: undefined;
409
+ }, {}, {}>;
410
+ isActive: import("drizzle-orm/pg-core").PgColumn<{
411
+ name: "is_active";
412
+ tableName: "loyalty_redemption_offers";
413
+ dataType: "boolean";
414
+ columnType: "PgBoolean";
415
+ data: boolean;
416
+ driverParam: boolean;
417
+ notNull: true;
418
+ hasDefault: true;
419
+ isPrimaryKey: false;
420
+ isAutoincrement: false;
421
+ hasRuntimeDefault: false;
422
+ enumValues: undefined;
423
+ baseColumn: never;
424
+ identity: undefined;
425
+ generated: undefined;
426
+ }, {}, {}>;
427
+ validFrom: import("drizzle-orm/pg-core").PgColumn<{
428
+ name: "valid_from";
429
+ tableName: "loyalty_redemption_offers";
430
+ dataType: "date";
431
+ columnType: "PgTimestamp";
432
+ data: Date;
433
+ driverParam: string;
434
+ notNull: false;
435
+ hasDefault: false;
436
+ isPrimaryKey: false;
437
+ isAutoincrement: false;
438
+ hasRuntimeDefault: false;
439
+ enumValues: undefined;
440
+ baseColumn: never;
441
+ identity: undefined;
442
+ generated: undefined;
443
+ }, {}, {}>;
444
+ validUntil: import("drizzle-orm/pg-core").PgColumn<{
445
+ name: "valid_until";
446
+ tableName: "loyalty_redemption_offers";
447
+ dataType: "date";
448
+ columnType: "PgTimestamp";
449
+ data: Date;
450
+ driverParam: string;
451
+ notNull: false;
452
+ hasDefault: false;
453
+ isPrimaryKey: false;
454
+ isAutoincrement: false;
455
+ hasRuntimeDefault: false;
456
+ enumValues: undefined;
457
+ baseColumn: never;
458
+ identity: undefined;
459
+ generated: undefined;
460
+ }, {}, {}>;
461
+ maxRedemptions: import("drizzle-orm/pg-core").PgColumn<{
462
+ name: "max_redemptions";
463
+ tableName: "loyalty_redemption_offers";
464
+ dataType: "number";
465
+ columnType: "PgInteger";
466
+ data: number;
467
+ driverParam: string | number;
468
+ notNull: false;
469
+ hasDefault: false;
470
+ isPrimaryKey: false;
471
+ isAutoincrement: false;
472
+ hasRuntimeDefault: false;
473
+ enumValues: undefined;
474
+ baseColumn: never;
475
+ identity: undefined;
476
+ generated: undefined;
477
+ }, {}, {}>;
478
+ timesRedeemed: import("drizzle-orm/pg-core").PgColumn<{
479
+ name: "times_redeemed";
480
+ tableName: "loyalty_redemption_offers";
481
+ dataType: "number";
482
+ columnType: "PgInteger";
483
+ data: number;
484
+ driverParam: string | number;
485
+ notNull: true;
486
+ hasDefault: true;
487
+ isPrimaryKey: false;
488
+ isAutoincrement: false;
489
+ hasRuntimeDefault: false;
490
+ enumValues: undefined;
491
+ baseColumn: never;
492
+ identity: undefined;
493
+ generated: undefined;
494
+ }, {}, {}>;
495
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
496
+ name: "created_at";
497
+ tableName: "loyalty_redemption_offers";
498
+ dataType: "date";
499
+ columnType: "PgTimestamp";
500
+ data: Date;
501
+ driverParam: string;
502
+ notNull: true;
503
+ hasDefault: true;
504
+ isPrimaryKey: false;
505
+ isAutoincrement: false;
506
+ hasRuntimeDefault: false;
507
+ enumValues: undefined;
508
+ baseColumn: never;
509
+ identity: undefined;
510
+ generated: undefined;
511
+ }, {}, {}>;
512
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
513
+ name: "updated_at";
514
+ tableName: "loyalty_redemption_offers";
515
+ dataType: "date";
516
+ columnType: "PgTimestamp";
517
+ data: Date;
518
+ driverParam: string;
519
+ notNull: true;
520
+ hasDefault: true;
521
+ isPrimaryKey: false;
522
+ isAutoincrement: false;
523
+ hasRuntimeDefault: false;
524
+ enumValues: undefined;
525
+ baseColumn: never;
526
+ identity: undefined;
527
+ generated: undefined;
528
+ }, {}, {}>;
529
+ };
530
+ dialect: "pg";
531
+ }>;
532
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcvB,CAAC;AAEJ,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc7B,CAAC;AAEJ,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBjC,CAAC"}