@modern-admin/system-drizzle 0.1.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 (46) hide show
  1. package/dist/index.d.ts +30 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +48 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/schema/pg.d.ts +4982 -0
  6. package/dist/schema/pg.d.ts.map +1 -0
  7. package/dist/schema/pg.js +297 -0
  8. package/dist/schema/pg.js.map +1 -0
  9. package/dist/stores/ai-task-store.d.ts +20 -0
  10. package/dist/stores/ai-task-store.d.ts.map +1 -0
  11. package/dist/stores/ai-task-store.js +128 -0
  12. package/dist/stores/ai-task-store.js.map +1 -0
  13. package/dist/stores/cache-store.d.ts +23 -0
  14. package/dist/stores/cache-store.d.ts.map +1 -0
  15. package/dist/stores/cache-store.js +72 -0
  16. package/dist/stores/cache-store.js.map +1 -0
  17. package/dist/stores/config-store.d.ts +13 -0
  18. package/dist/stores/config-store.d.ts.map +1 -0
  19. package/dist/stores/config-store.js +60 -0
  20. package/dist/stores/config-store.js.map +1 -0
  21. package/dist/stores/history-store.d.ts +22 -0
  22. package/dist/stores/history-store.d.ts.map +1 -0
  23. package/dist/stores/history-store.js +62 -0
  24. package/dist/stores/history-store.js.map +1 -0
  25. package/dist/stores/log-store.d.ts +10 -0
  26. package/dist/stores/log-store.d.ts.map +1 -0
  27. package/dist/stores/log-store.js +62 -0
  28. package/dist/stores/log-store.js.map +1 -0
  29. package/dist/stores/webhook-store.d.ts +16 -0
  30. package/dist/stores/webhook-store.d.ts.map +1 -0
  31. package/dist/stores/webhook-store.js +129 -0
  32. package/dist/stores/webhook-store.js.map +1 -0
  33. package/dist/types.d.ts +23 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/dist/types.js +12 -0
  36. package/dist/types.js.map +1 -0
  37. package/package.json +53 -0
  38. package/src/index.ts +65 -0
  39. package/src/schema/pg.ts +354 -0
  40. package/src/stores/ai-task-store.ts +174 -0
  41. package/src/stores/cache-store.ts +90 -0
  42. package/src/stores/config-store.ts +80 -0
  43. package/src/stores/history-store.ts +98 -0
  44. package/src/stores/log-store.ts +71 -0
  45. package/src/stores/webhook-store.ts +167 -0
  46. package/src/types.ts +27 -0
@@ -0,0 +1,60 @@
1
+ import { uuidv7 } from '@modern-admin/core';
2
+ import { and, asc, eq, isNull } from 'drizzle-orm';
3
+ const rowToEntry = (row) => ({
4
+ scope: row.scope,
5
+ scopeId: row.scopeId,
6
+ key: row.key,
7
+ value: row.value,
8
+ updatedAt: row.updatedAt.toISOString(),
9
+ });
10
+ export class DrizzleConfigStore {
11
+ constructor(db, table) {
12
+ this.db = db;
13
+ this.table = table;
14
+ }
15
+ pkCondition(scope, scopeId, key) {
16
+ const scopeIdCond = scopeId === null
17
+ ? isNull(this.table.scopeId)
18
+ : eq(this.table.scopeId, scopeId);
19
+ return and(eq(this.table.scope, scope), scopeIdCond, eq(this.table.key, key));
20
+ }
21
+ async get(scope, scopeId, key) {
22
+ const rows = (await this.db
23
+ .select()
24
+ .from(this.table)
25
+ .where(this.pkCondition(scope, scopeId, key))
26
+ .limit(1));
27
+ return rows[0]?.value;
28
+ }
29
+ async set(scope, scopeId, key, value) {
30
+ await this.db
31
+ .insert(this.table)
32
+ .values({
33
+ id: uuidv7(),
34
+ scope,
35
+ scopeId,
36
+ key,
37
+ value: value ?? null,
38
+ updatedAt: new Date(),
39
+ })
40
+ .onConflictDoUpdate({
41
+ target: [this.table.scope, this.table.scopeId, this.table.key],
42
+ set: { value: value ?? null, updatedAt: new Date() },
43
+ });
44
+ }
45
+ async delete(scope, scopeId, key) {
46
+ await this.db.delete(this.table).where(this.pkCondition(scope, scopeId, key));
47
+ }
48
+ async list(scope, scopeId) {
49
+ const scopeIdCond = scopeId === null
50
+ ? isNull(this.table.scopeId)
51
+ : eq(this.table.scopeId, scopeId);
52
+ const rows = (await this.db
53
+ .select()
54
+ .from(this.table)
55
+ .where(and(eq(this.table.scope, scope), scopeIdCond))
56
+ .orderBy(asc(this.table.key)));
57
+ return rows.map(rowToEntry);
58
+ }
59
+ }
60
+ //# sourceMappingURL=config-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/stores/config-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type HistoryEntry, type HistoryOp, type IHistoryStore } from '@modern-admin/core';
2
+ import type { DrizzleLike, SystemTables } from '../types.js';
3
+ export declare class DrizzleHistoryStore implements IHistoryStore {
4
+ private readonly db;
5
+ private readonly table;
6
+ constructor(db: DrizzleLike, table: SystemTables['maHistory']);
7
+ append(input: {
8
+ resourceId: string;
9
+ recordId: string;
10
+ op: HistoryOp;
11
+ userId?: string;
12
+ snapshot: Record<string, unknown>;
13
+ snapshotBefore?: Record<string, unknown>;
14
+ }): Promise<HistoryEntry>;
15
+ list(resourceId: string, recordId: string, options?: {
16
+ limit?: number;
17
+ offset?: number;
18
+ }): Promise<HistoryEntry[]>;
19
+ get(resourceId: string, recordId: string, revisionId: string): Promise<HistoryEntry | null>;
20
+ latest(resourceId: string, recordId: string): Promise<HistoryEntry | null>;
21
+ }
22
+ //# sourceMappingURL=history-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-store.d.ts","sourceRoot":"","sources":["../../src/stores/history-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElG,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AA2B5D,qBAAa,mBAAoB,YAAW,aAAa;IAErD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,YAAY,CAAC,WAAW,CAAC;IAG7C,MAAM,CAAC,KAAK,EAAE;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,EAAE,EAAE,SAAS,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACjC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACzC,GAAG,OAAO,CAAC,YAAY,CAAC;IAgBnB,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAChD,OAAO,CAAC,YAAY,EAAE,CAAC;IAgBpB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAe3F,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;CAIjF"}
@@ -0,0 +1,62 @@
1
+ import { uuidv7 } from '@modern-admin/core';
2
+ import { and, desc, eq } from 'drizzle-orm';
3
+ const rowToEntry = (row) => ({
4
+ id: row.id,
5
+ resourceId: row.resourceId,
6
+ recordId: row.recordId,
7
+ op: row.op,
8
+ ...(row.userId !== null ? { userId: row.userId } : {}),
9
+ snapshot: row.snapshot ?? {},
10
+ ...(row.snapshotBefore !== null && row.snapshotBefore !== undefined
11
+ ? { snapshotBefore: row.snapshotBefore }
12
+ : {}),
13
+ createdAt: row.createdAt.toISOString(),
14
+ });
15
+ export class DrizzleHistoryStore {
16
+ constructor(db, table) {
17
+ this.db = db;
18
+ this.table = table;
19
+ }
20
+ async append(input) {
21
+ const rows = (await this.db
22
+ .insert(this.table)
23
+ .values({
24
+ id: uuidv7(),
25
+ resourceId: input.resourceId,
26
+ recordId: input.recordId,
27
+ op: input.op,
28
+ userId: input.userId ?? null,
29
+ snapshot: input.snapshot,
30
+ snapshotBefore: input.snapshotBefore ?? null,
31
+ })
32
+ .returning());
33
+ return rowToEntry(rows[0]);
34
+ }
35
+ async list(resourceId, recordId, options = {}) {
36
+ const limit = options.limit ?? 50;
37
+ const offset = options.offset ?? 0;
38
+ let q = this.db
39
+ .select()
40
+ .from(this.table)
41
+ .where(and(eq(this.table.resourceId, resourceId), eq(this.table.recordId, recordId)))
42
+ .orderBy(desc(this.table.createdAt))
43
+ .limit(limit);
44
+ if (offset > 0)
45
+ q = q.offset(offset);
46
+ const rows = (await q);
47
+ return rows.map(rowToEntry);
48
+ }
49
+ async get(resourceId, recordId, revisionId) {
50
+ const rows = (await this.db
51
+ .select()
52
+ .from(this.table)
53
+ .where(and(eq(this.table.id, revisionId), eq(this.table.resourceId, resourceId), eq(this.table.recordId, recordId)))
54
+ .limit(1));
55
+ return rows[0] ? rowToEntry(rows[0]) : null;
56
+ }
57
+ async latest(resourceId, recordId) {
58
+ const rows = (await this.list(resourceId, recordId, { limit: 1 }));
59
+ return rows[0] ?? null;
60
+ }
61
+ }
62
+ //# sourceMappingURL=history-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-store.js","sourceRoot":"","sources":["../../src/stores/history-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type ActionLogEntry, type IQueryableLogStore } from '@modern-admin/core';
2
+ import type { DrizzleLike, SystemTables } from '../types.js';
3
+ export declare class DrizzleLogStore implements IQueryableLogStore {
4
+ private readonly db;
5
+ private readonly table;
6
+ constructor(db: DrizzleLike, table: SystemTables['maLog']);
7
+ record(entry: ActionLogEntry): Promise<void>;
8
+ list(filter?: Parameters<IQueryableLogStore['list']>[0]): Promise<ActionLogEntry[]>;
9
+ }
10
+ //# sourceMappingURL=log-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-store.d.ts","sourceRoot":"","sources":["../../src/stores/log-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEzF,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AA8B5D,qBAAa,eAAgB,YAAW,kBAAkB;IAEtD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC;IAGzC,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5C,IAAI,CAAC,MAAM,GAAE,UAAU,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAkB9F"}
@@ -0,0 +1,62 @@
1
+ import { uuidv7 } from '@modern-admin/core';
2
+ import { and, desc, eq, gte, inArray, lte } from 'drizzle-orm';
3
+ const rowToEntry = (row) => ({
4
+ id: row.id,
5
+ resourceId: row.resourceId,
6
+ action: row.action,
7
+ ...(row.recordId !== null ? { recordId: row.recordId } : {}),
8
+ ...(Array.isArray(row.recordIds) ? { recordIds: row.recordIds } : {}),
9
+ ...(row.userId !== null ? { userId: row.userId } : {}),
10
+ ...(row.payload !== null && row.payload !== undefined
11
+ ? { payload: row.payload }
12
+ : {}),
13
+ ...(row.result !== null && row.result !== undefined
14
+ ? { result: row.result }
15
+ : {}),
16
+ at: Number(row.at),
17
+ });
18
+ export class DrizzleLogStore {
19
+ constructor(db, table) {
20
+ this.db = db;
21
+ this.table = table;
22
+ }
23
+ async record(entry) {
24
+ await this.db.insert(this.table).values({
25
+ id: entry.id ?? uuidv7(),
26
+ resourceId: entry.resourceId,
27
+ action: entry.action,
28
+ recordId: entry.recordId ?? null,
29
+ recordIds: entry.recordIds ?? null,
30
+ userId: entry.userId ?? null,
31
+ payload: entry.payload ?? null,
32
+ result: entry.result ?? null,
33
+ at: entry.at,
34
+ });
35
+ }
36
+ async list(filter = {}) {
37
+ const conds = [];
38
+ if (filter.resourceId)
39
+ conds.push(eq(this.table.resourceId, filter.resourceId));
40
+ if (filter.recordId)
41
+ conds.push(eq(this.table.recordId, filter.recordId));
42
+ if (filter.userId)
43
+ conds.push(eq(this.table.userId, filter.userId));
44
+ if (filter.actions?.length)
45
+ conds.push(inArray(this.table.action, filter.actions));
46
+ if (filter.from)
47
+ conds.push(gte(this.table.at, filter.from.getTime()));
48
+ if (filter.to)
49
+ conds.push(lte(this.table.at, filter.to.getTime()));
50
+ let q = this.db.select().from(this.table);
51
+ if (conds.length)
52
+ q = q.where(conds.length === 1 ? conds[0] : and(...conds));
53
+ q = q.orderBy(desc(this.table.at));
54
+ if (filter.limit !== undefined)
55
+ q = q.limit(filter.limit);
56
+ if (filter.offset !== undefined)
57
+ q = q.offset(filter.offset);
58
+ const rows = (await q);
59
+ return rows.map(rowToEntry);
60
+ }
61
+ }
62
+ //# sourceMappingURL=log-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-store.js","sourceRoot":"","sources":["../../src/stores/log-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type IWebhookStore, type Webhook, type WebhookDelivery, type WebhookInput } from '@modern-admin/core';
2
+ import type { DrizzleLike, SystemTables } from '../types.js';
3
+ export declare class DrizzleWebhookStore implements IWebhookStore {
4
+ private readonly db;
5
+ private readonly hookTable;
6
+ private readonly deliveryTable;
7
+ constructor(db: DrizzleLike, hookTable: SystemTables['maWebhook'], deliveryTable: SystemTables['maWebhookDelivery']);
8
+ list(): Promise<Webhook[]>;
9
+ get(id: string): Promise<Webhook | null>;
10
+ create(input: WebhookInput): Promise<Webhook>;
11
+ update(id: string, patch: Partial<WebhookInput>): Promise<Webhook>;
12
+ delete(id: string): Promise<void>;
13
+ recordDelivery(delivery: Omit<WebhookDelivery, 'id' | 'createdAt'>): Promise<WebhookDelivery>;
14
+ listDeliveries(webhookId: string, limit?: number): Promise<WebhookDelivery[]>;
15
+ }
16
+ //# sourceMappingURL=webhook-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-store.d.ts","sourceRoot":"","sources":["../../src/stores/webhook-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,eAAe,EAEpB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AA4D5D,qBAAa,mBAAoB,YAAW,aAAa;IAErD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,EAAE,EAAE,WAAW,EACf,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,EACpC,aAAa,EAAE,YAAY,CAAC,mBAAmB,CAAC;IAG7D,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAQ1B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IASxC,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB7C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBlE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,cAAc,CAClB,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,WAAW,CAAC,GAClD,OAAO,CAAC,eAAe,CAAC;IAmBrB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAShF"}
@@ -0,0 +1,129 @@
1
+ import { uuidv7, } from '@modern-admin/core';
2
+ import { desc, eq } from 'drizzle-orm';
3
+ const rowToWebhook = (row) => ({
4
+ id: row.id,
5
+ name: row.name,
6
+ url: row.url,
7
+ events: Array.isArray(row.events) ? row.events : [],
8
+ resourceId: row.resourceId,
9
+ enabled: row.enabled,
10
+ ...(row.secret !== null ? { secret: row.secret } : {}),
11
+ headers: row.headers ?? {},
12
+ filters: row.filters ?? {},
13
+ payloadFields: Array.isArray(row.payloadFields) ? row.payloadFields : [],
14
+ createdAt: row.createdAt.toISOString(),
15
+ updatedAt: row.updatedAt.toISOString(),
16
+ });
17
+ const rowToDelivery = (row) => ({
18
+ id: row.id,
19
+ webhookId: row.webhookId,
20
+ event: row.event,
21
+ payload: row.payload ?? {},
22
+ status: row.status,
23
+ ...(row.responseStatus !== null ? { responseStatus: row.responseStatus } : {}),
24
+ ...(row.responseBody !== null ? { responseBody: row.responseBody } : {}),
25
+ ...(row.error !== null ? { error: row.error } : {}),
26
+ attempt: row.attempt,
27
+ createdAt: row.createdAt.toISOString(),
28
+ ...(row.deliveredAt !== null ? { deliveredAt: row.deliveredAt.toISOString() } : {}),
29
+ });
30
+ export class DrizzleWebhookStore {
31
+ constructor(db, hookTable, deliveryTable) {
32
+ this.db = db;
33
+ this.hookTable = hookTable;
34
+ this.deliveryTable = deliveryTable;
35
+ }
36
+ async list() {
37
+ const rows = (await this.db
38
+ .select()
39
+ .from(this.hookTable)
40
+ .orderBy(desc(this.hookTable.createdAt)));
41
+ return rows.map(rowToWebhook);
42
+ }
43
+ async get(id) {
44
+ const rows = (await this.db
45
+ .select()
46
+ .from(this.hookTable)
47
+ .where(eq(this.hookTable.id, id))
48
+ .limit(1));
49
+ return rows[0] ? rowToWebhook(rows[0]) : null;
50
+ }
51
+ async create(input) {
52
+ const rows = (await this.db
53
+ .insert(this.hookTable)
54
+ .values({
55
+ id: uuidv7(),
56
+ name: input.name,
57
+ url: input.url,
58
+ events: input.events,
59
+ resourceId: input.resourceId ?? null,
60
+ enabled: input.enabled ?? true,
61
+ secret: input.secret ?? null,
62
+ headers: input.headers ?? {},
63
+ filters: input.filters ?? {},
64
+ payloadFields: input.payloadFields ?? [],
65
+ })
66
+ .returning());
67
+ return rowToWebhook(rows[0]);
68
+ }
69
+ async update(id, patch) {
70
+ const data = { updatedAt: new Date() };
71
+ if (patch.name !== undefined)
72
+ data['name'] = patch.name;
73
+ if (patch.url !== undefined)
74
+ data['url'] = patch.url;
75
+ if (patch.events !== undefined)
76
+ data['events'] = patch.events;
77
+ if (patch.resourceId !== undefined)
78
+ data['resourceId'] = patch.resourceId ?? null;
79
+ if (patch.enabled !== undefined)
80
+ data['enabled'] = patch.enabled;
81
+ if (patch.secret !== undefined)
82
+ data['secret'] = patch.secret;
83
+ if (patch.headers !== undefined)
84
+ data['headers'] = patch.headers;
85
+ if (patch.filters !== undefined)
86
+ data['filters'] = patch.filters;
87
+ if (patch.payloadFields !== undefined)
88
+ data['payloadFields'] = patch.payloadFields;
89
+ const rows = (await this.db
90
+ .update(this.hookTable)
91
+ .set(data)
92
+ .where(eq(this.hookTable.id, id))
93
+ .returning());
94
+ if (!rows[0])
95
+ throw new Error(`Webhook not found: ${id}`);
96
+ return rowToWebhook(rows[0]);
97
+ }
98
+ async delete(id) {
99
+ await this.db.delete(this.hookTable).where(eq(this.hookTable.id, id));
100
+ }
101
+ async recordDelivery(delivery) {
102
+ const rows = (await this.db
103
+ .insert(this.deliveryTable)
104
+ .values({
105
+ id: uuidv7(),
106
+ webhookId: delivery.webhookId,
107
+ event: delivery.event,
108
+ payload: delivery.payload,
109
+ status: delivery.status,
110
+ responseStatus: delivery.responseStatus ?? null,
111
+ responseBody: delivery.responseBody ?? null,
112
+ error: delivery.error ?? null,
113
+ attempt: delivery.attempt,
114
+ deliveredAt: delivery.deliveredAt ? new Date(delivery.deliveredAt) : null,
115
+ })
116
+ .returning());
117
+ return rowToDelivery(rows[0]);
118
+ }
119
+ async listDeliveries(webhookId, limit = 50) {
120
+ const rows = (await this.db
121
+ .select()
122
+ .from(this.deliveryTable)
123
+ .where(eq(this.deliveryTable.webhookId, webhookId))
124
+ .orderBy(desc(this.deliveryTable.createdAt))
125
+ .limit(limit));
126
+ return rows.map(rowToDelivery);
127
+ }
128
+ }
129
+ //# sourceMappingURL=webhook-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-store.js","sourceRoot":"","sources":["../../src/stores/webhook-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Structural Drizzle typings used by the system stores.
3
+ *
4
+ * Drizzle's typed `db` carries a heavy dialect-specific generic load
5
+ * (`PgDatabase`, `MySqlDatabase`, `BetterSQLite3Database`, …). To stay
6
+ * dialect-agnostic at the package boundary we accept a `DrizzleLike`
7
+ * surface — runtime calls go through a small handful of methods every
8
+ * builder exposes. Hosts pass their concrete `drizzle(...)` instance and
9
+ * it satisfies this shape structurally.
10
+ */
11
+ import type { SystemTables } from './schema/pg.js';
12
+ /**
13
+ * Loose Drizzle client surface. The real `drizzle(...)` instance has a
14
+ * much richer typed API; we only depend on the methods we actually call.
15
+ */
16
+ export type DrizzleLike = {
17
+ insert: (table: any) => any;
18
+ select: (fields?: any) => any;
19
+ update: (table: any) => any;
20
+ delete: (table: any) => any;
21
+ };
22
+ export type { SystemTables };
23
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAA;IAC3B,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,GAAG,CAAA;IAC7B,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAA;IAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAA;CAC5B,CAAA;AAED,YAAY,EAAE,YAAY,EAAE,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Structural Drizzle typings used by the system stores.
3
+ *
4
+ * Drizzle's typed `db` carries a heavy dialect-specific generic load
5
+ * (`PgDatabase`, `MySqlDatabase`, `BetterSQLite3Database`, …). To stay
6
+ * dialect-agnostic at the package boundary we accept a `DrizzleLike`
7
+ * surface — runtime calls go through a small handful of methods every
8
+ * builder exposes. Hosts pass their concrete `drizzle(...)` instance and
9
+ * it satisfies this shape structurally.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@modern-admin/system-drizzle",
3
+ "version": "0.1.0",
4
+ "description": "Drizzle-backed implementation of Modern Admin system stores.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/modern-admin/modern-admin.git",
10
+ "directory": "packages/system-drizzle"
11
+ },
12
+ "main": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "src"
23
+ ],
24
+ "publishConfig": {
25
+ "registry": "https://registry.npmjs.org",
26
+ "access": "public",
27
+ "main": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ }
34
+ }
35
+ },
36
+ "dependencies": {
37
+ "@modern-admin/core": "0.1.0"
38
+ },
39
+ "devDependencies": {
40
+ "@modern-admin/tsconfig": "0.1.0",
41
+ "@types/bun": "^1.3.13",
42
+ "drizzle-orm": "^0.45.0",
43
+ "typescript": "^6.0.3"
44
+ },
45
+ "peerDependencies": {
46
+ "drizzle-orm": ">=0.45"
47
+ },
48
+ "peerDependenciesMeta": {
49
+ "drizzle-orm": {
50
+ "optional": true
51
+ }
52
+ }
53
+ }
package/src/index.ts ADDED
@@ -0,0 +1,65 @@
1
+ // @modern-admin/system-drizzle — Drizzle-backed implementations of the
2
+ // runtime system stores defined in `@modern-admin/core/system`.
3
+ //
4
+ // Quick start (Postgres):
5
+ //
6
+ // import { drizzle } from 'drizzle-orm/node-postgres'
7
+ // import * as systemSchema from '@modern-admin/system-drizzle/pg'
8
+ // import { setupDrizzleSystem } from '@modern-admin/system-drizzle'
9
+ //
10
+ // const db = drizzle(client, { schema: { ...mySchema, ...systemSchema } })
11
+ // const system = setupDrizzleSystem(db, systemSchema)
12
+ //
13
+ // new ModernAdmin({
14
+ // databases: [...],
15
+ // plugins: [actionLoggingPlugin({ store: system.logStore })],
16
+ // })
17
+ //
18
+ // To use a different prefix or schema, copy `src/schema/pg.ts` into your
19
+ // project, edit table names, and pass the customised table objects in
20
+ // `setupDrizzleSystem(db, customTables)`.
21
+
22
+ import type { ISystemStores } from '@modern-admin/core'
23
+ import { DrizzleLogStore } from './stores/log-store.js'
24
+ import { DrizzleWebhookStore } from './stores/webhook-store.js'
25
+ import { DrizzleConfigStore } from './stores/config-store.js'
26
+ import { DrizzleHistoryStore } from './stores/history-store.js'
27
+ import { DrizzleAiTaskStore } from './stores/ai-task-store.js'
28
+ import { DrizzleCacheStore } from './stores/cache-store.js'
29
+ import type { DrizzleLike, SystemTables } from './types.js'
30
+
31
+ export interface DrizzleSystem extends ISystemStores {
32
+ logStore: DrizzleLogStore
33
+ webhookStore: DrizzleWebhookStore
34
+ configStore: DrizzleConfigStore
35
+ historyStore: DrizzleHistoryStore
36
+ aiTaskStore: DrizzleAiTaskStore
37
+ cacheStore: DrizzleCacheStore
38
+ }
39
+
40
+ /**
41
+ * Build the full bundle of system stores from a Drizzle client + table
42
+ * objects. The host owns the `db` lifecycle; this just wires tables into
43
+ * thin store classes.
44
+ */
45
+ export function setupDrizzleSystem(
46
+ db: DrizzleLike,
47
+ tables: SystemTables,
48
+ ): DrizzleSystem {
49
+ return {
50
+ logStore: new DrizzleLogStore(db, tables.maLog),
51
+ webhookStore: new DrizzleWebhookStore(db, tables.maWebhook, tables.maWebhookDelivery),
52
+ configStore: new DrizzleConfigStore(db, tables.maConfig),
53
+ historyStore: new DrizzleHistoryStore(db, tables.maHistory),
54
+ aiTaskStore: new DrizzleAiTaskStore(db, tables.maAiTask, tables.maAiTaskEvent),
55
+ cacheStore: new DrizzleCacheStore(db, tables.maCache),
56
+ }
57
+ }
58
+
59
+ export { DrizzleLogStore } from './stores/log-store.js'
60
+ export { DrizzleWebhookStore } from './stores/webhook-store.js'
61
+ export { DrizzleConfigStore } from './stores/config-store.js'
62
+ export { DrizzleHistoryStore } from './stores/history-store.js'
63
+ export { DrizzleAiTaskStore } from './stores/ai-task-store.js'
64
+ export { DrizzleCacheStore } from './stores/cache-store.js'
65
+ export type { DrizzleLike, SystemTables } from './types.js'