@reitwagen/data-layer 0.0.2

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,52 @@
1
+ /**
2
+ * CDC (Change Data Capture) Event Types
3
+ *
4
+ * These types represent database change events that can be
5
+ * captured and processed by downstream systems.
6
+ */
7
+ export type CDCOperation = 'INSERT' | 'UPDATE' | 'DELETE';
8
+ export interface CDCEventBase {
9
+ /** Unique event identifier */
10
+ id: string;
11
+ /** The operation type */
12
+ operation: CDCOperation;
13
+ /** ISO 8601 timestamp of when the event occurred */
14
+ timestamp: string;
15
+ /** Database schema name */
16
+ schema: string;
17
+ /** Table name */
18
+ table: string;
19
+ }
20
+ export interface CDCInsertEvent<T = Record<string, unknown>> extends CDCEventBase {
21
+ operation: 'INSERT';
22
+ /** The new record data */
23
+ new: T;
24
+ }
25
+ export interface CDCUpdateEvent<T = Record<string, unknown>> extends CDCEventBase {
26
+ operation: 'UPDATE';
27
+ /** The record data before the update */
28
+ old: T;
29
+ /** The record data after the update */
30
+ new: T;
31
+ /** List of changed column names */
32
+ changedColumns: string[];
33
+ }
34
+ export interface CDCDeleteEvent<T = Record<string, unknown>> extends CDCEventBase {
35
+ operation: 'DELETE';
36
+ /** The deleted record data */
37
+ old: T;
38
+ }
39
+ export type CDCEvent<T = Record<string, unknown>> = CDCInsertEvent<T> | CDCUpdateEvent<T> | CDCDeleteEvent<T>;
40
+ /**
41
+ * Type guard for INSERT events
42
+ */
43
+ export declare function isInsertEvent<T>(event: CDCEvent<T>): event is CDCInsertEvent<T>;
44
+ /**
45
+ * Type guard for UPDATE events
46
+ */
47
+ export declare function isUpdateEvent<T>(event: CDCEvent<T>): event is CDCUpdateEvent<T>;
48
+ /**
49
+ * Type guard for DELETE events
50
+ */
51
+ export declare function isDeleteEvent<T>(event: CDCEvent<T>): event is CDCDeleteEvent<T>;
52
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/cdc/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,SAAS,EAAE,YAAY,CAAC;IACxB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,SAAQ,YAAY;IAC/E,SAAS,EAAE,QAAQ,CAAC;IACpB,0BAA0B;IAC1B,GAAG,EAAE,CAAC,CAAC;CACR;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,SAAQ,YAAY;IAC/E,SAAS,EAAE,QAAQ,CAAC;IACpB,wCAAwC;IACxC,GAAG,EAAE,CAAC,CAAC;IACP,uCAAuC;IACvC,GAAG,EAAE,CAAC,CAAC;IACP,mCAAmC;IACnC,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,SAAQ,YAAY;IAC/E,SAAS,EAAE,QAAQ,CAAC;IACpB,8BAA8B;IAC9B,GAAG,EAAE,CAAC,CAAC;CACR;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5C,cAAc,CAAC,CAAC,CAAC,GACjB,cAAc,CAAC,CAAC,CAAC,GACjB,cAAc,CAAC,CAAC,CAAC,CAAC;AAEtB;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,CAE/E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,CAE/E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,CAE/E"}
@@ -0,0 +1,32 @@
1
+ import type { CDCEvent } from '../events.js';
2
+ /**
3
+ * CDC Event Handler type
4
+ */
5
+ export type CDCEventHandler<T = Record<string, unknown>> = (event: CDCEvent<T>) => Promise<void>;
6
+ /**
7
+ * CDC Handler Registry
8
+ *
9
+ * Maps table names to their handlers
10
+ */
11
+ export type CDCHandlerRegistry = Map<string, CDCEventHandler[]>;
12
+ /**
13
+ * Create a new handler registry
14
+ */
15
+ export declare function createHandlerRegistry(): CDCHandlerRegistry;
16
+ /**
17
+ * Register a handler for a specific table
18
+ */
19
+ export declare function registerHandler(registry: CDCHandlerRegistry, table: string, handler: CDCEventHandler): void;
20
+ /**
21
+ * Process a CDC event through registered handlers
22
+ */
23
+ export declare function processEvent(registry: CDCHandlerRegistry, event: CDCEvent): Promise<void>;
24
+ export declare const subscriptionHandlers: {
25
+ onSubscriptionCreated: (event: CDCEvent) => Promise<void>;
26
+ onSubscriptionUpdated: (event: CDCEvent) => Promise<void>;
27
+ };
28
+ export declare const paymentHandlers: {
29
+ onPaymentCreated: (event: CDCEvent) => Promise<void>;
30
+ onPaymentUpdated: (event: CDCEvent) => Promise<void>;
31
+ };
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cdc/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CACzD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KACf,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;AAEhE;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,CAE1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,GACvB,IAAI,CAIN;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,IAAI,CAAC,CAgBf;AAGD,eAAO,MAAM,oBAAoB;mCACM,QAAQ;mCAGR,QAAQ;CAG9C,CAAC;AAEF,eAAO,MAAM,eAAe;8BACM,QAAQ;8BAGR,QAAQ;CAGzC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { type CDCEvent, type CDCEventBase, type CDCInsertEvent, type CDCUpdateEvent, type CDCDeleteEvent, type CDCOperation, isInsertEvent, isUpdateEvent, isDeleteEvent, } from './events.js';
2
+ export { type CDCEventHandler, type CDCHandlerRegistry, createHandlerRegistry, registerHandler, processEvent, subscriptionHandlers, paymentHandlers, } from './handlers/index.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cdc/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,aAAa,EACb,aAAa,EACb,aAAa,GACd,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,eAAe,GAChB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createHandlerRegistry, isDeleteEvent, isInsertEvent, isUpdateEvent, paymentHandlers, processEvent, registerHandler, subscriptionHandlers } from '../chunk-4OINT53S.js';
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,56 @@
1
+ // src/cdc/events.ts
2
+ function isInsertEvent(event) {
3
+ return event.operation === "INSERT";
4
+ }
5
+ function isUpdateEvent(event) {
6
+ return event.operation === "UPDATE";
7
+ }
8
+ function isDeleteEvent(event) {
9
+ return event.operation === "DELETE";
10
+ }
11
+
12
+ // src/cdc/handlers/index.ts
13
+ function createHandlerRegistry() {
14
+ return /* @__PURE__ */ new Map();
15
+ }
16
+ function registerHandler(registry, table, handler) {
17
+ const handlers = registry.get(table) ?? [];
18
+ handlers.push(handler);
19
+ registry.set(table, handlers);
20
+ }
21
+ async function processEvent(registry, event) {
22
+ const handlers = registry.get(event.table) ?? [];
23
+ await Promise.all(
24
+ handlers.map(async (handler) => {
25
+ try {
26
+ await handler(event);
27
+ } catch (error) {
28
+ console.error(
29
+ `Error processing CDC event for table ${event.table}:`,
30
+ error
31
+ );
32
+ throw error;
33
+ }
34
+ })
35
+ );
36
+ }
37
+ var subscriptionHandlers = {
38
+ onSubscriptionCreated: async (event) => {
39
+ console.log("Subscription created:", event);
40
+ },
41
+ onSubscriptionUpdated: async (event) => {
42
+ console.log("Subscription updated:", event);
43
+ }
44
+ };
45
+ var paymentHandlers = {
46
+ onPaymentCreated: async (event) => {
47
+ console.log("Payment created:", event);
48
+ },
49
+ onPaymentUpdated: async (event) => {
50
+ console.log("Payment updated:", event);
51
+ }
52
+ };
53
+
54
+ export { createHandlerRegistry, isDeleteEvent, isInsertEvent, isUpdateEvent, paymentHandlers, processEvent, registerHandler, subscriptionHandlers };
55
+ //# sourceMappingURL=chunk-4OINT53S.js.map
56
+ //# sourceMappingURL=chunk-4OINT53S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cdc/events.ts","../src/cdc/handlers/index.ts"],"names":[],"mappings":";AAoDO,SAAS,cAAiB,KAAA,EAAgD;AAC/E,EAAA,OAAO,MAAM,SAAA,KAAc,QAAA;AAC7B;AAKO,SAAS,cAAiB,KAAA,EAAgD;AAC/E,EAAA,OAAO,MAAM,SAAA,KAAc,QAAA;AAC7B;AAKO,SAAS,cAAiB,KAAA,EAAgD;AAC/E,EAAA,OAAO,MAAM,SAAA,KAAc,QAAA;AAC7B;;;ACjDO,SAAS,qBAAA,GAA4C;AAC1D,EAAA,2BAAW,GAAA,EAAI;AACjB;AAKO,SAAS,eAAA,CACd,QAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,KAAK,KAAK,EAAC;AACzC,EAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,EAAA,QAAA,CAAS,GAAA,CAAI,OAAO,QAAQ,CAAA;AAC9B;AAKA,eAAsB,YAAA,CACpB,UACA,KAAA,EACe;AACf,EAAA,MAAM,WAAW,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,KAAK,KAAK,EAAC;AAE/C,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,QAAA,CAAS,GAAA,CAAI,OAAO,OAAA,KAAY;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,KAAK,CAAA;AAAA,MACrB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,qCAAA,EAAwC,MAAM,KAAK,CAAA,CAAA,CAAA;AAAA,UACnD;AAAA,SACF;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC;AAAA,GACH;AACF;AAGO,IAAM,oBAAA,GAAuB;AAAA,EAClC,qBAAA,EAAuB,OAAO,KAAA,KAAoB;AAChD,IAAA,OAAA,CAAQ,GAAA,CAAI,yBAAyB,KAAK,CAAA;AAAA,EAC5C,CAAA;AAAA,EACA,qBAAA,EAAuB,OAAO,KAAA,KAAoB;AAChD,IAAA,OAAA,CAAQ,GAAA,CAAI,yBAAyB,KAAK,CAAA;AAAA,EAC5C;AACF;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,gBAAA,EAAkB,OAAO,KAAA,KAAoB;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,oBAAoB,KAAK,CAAA;AAAA,EACvC,CAAA;AAAA,EACA,gBAAA,EAAkB,OAAO,KAAA,KAAoB;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,oBAAoB,KAAK,CAAA;AAAA,EACvC;AACF","file":"chunk-4OINT53S.js","sourcesContent":["/**\n * CDC (Change Data Capture) Event Types\n *\n * These types represent database change events that can be\n * captured and processed by downstream systems.\n */\n\nexport type CDCOperation = 'INSERT' | 'UPDATE' | 'DELETE';\n\nexport interface CDCEventBase {\n /** Unique event identifier */\n id: string;\n /** The operation type */\n operation: CDCOperation;\n /** ISO 8601 timestamp of when the event occurred */\n timestamp: string;\n /** Database schema name */\n schema: string;\n /** Table name */\n table: string;\n}\n\nexport interface CDCInsertEvent<T = Record<string, unknown>> extends CDCEventBase {\n operation: 'INSERT';\n /** The new record data */\n new: T;\n}\n\nexport interface CDCUpdateEvent<T = Record<string, unknown>> extends CDCEventBase {\n operation: 'UPDATE';\n /** The record data before the update */\n old: T;\n /** The record data after the update */\n new: T;\n /** List of changed column names */\n changedColumns: string[];\n}\n\nexport interface CDCDeleteEvent<T = Record<string, unknown>> extends CDCEventBase {\n operation: 'DELETE';\n /** The deleted record data */\n old: T;\n}\n\nexport type CDCEvent<T = Record<string, unknown>> =\n | CDCInsertEvent<T>\n | CDCUpdateEvent<T>\n | CDCDeleteEvent<T>;\n\n/**\n * Type guard for INSERT events\n */\nexport function isInsertEvent<T>(event: CDCEvent<T>): event is CDCInsertEvent<T> {\n return event.operation === 'INSERT';\n}\n\n/**\n * Type guard for UPDATE events\n */\nexport function isUpdateEvent<T>(event: CDCEvent<T>): event is CDCUpdateEvent<T> {\n return event.operation === 'UPDATE';\n}\n\n/**\n * Type guard for DELETE events\n */\nexport function isDeleteEvent<T>(event: CDCEvent<T>): event is CDCDeleteEvent<T> {\n return event.operation === 'DELETE';\n}\n","import type { CDCEvent } from '../events.js';\n\n/**\n * CDC Event Handler type\n */\nexport type CDCEventHandler<T = Record<string, unknown>> = (\n event: CDCEvent<T>\n) => Promise<void>;\n\n/**\n * CDC Handler Registry\n *\n * Maps table names to their handlers\n */\nexport type CDCHandlerRegistry = Map<string, CDCEventHandler[]>;\n\n/**\n * Create a new handler registry\n */\nexport function createHandlerRegistry(): CDCHandlerRegistry {\n return new Map();\n}\n\n/**\n * Register a handler for a specific table\n */\nexport function registerHandler(\n registry: CDCHandlerRegistry,\n table: string,\n handler: CDCEventHandler\n): void {\n const handlers = registry.get(table) ?? [];\n handlers.push(handler);\n registry.set(table, handlers);\n}\n\n/**\n * Process a CDC event through registered handlers\n */\nexport async function processEvent(\n registry: CDCHandlerRegistry,\n event: CDCEvent\n): Promise<void> {\n const handlers = registry.get(event.table) ?? [];\n\n await Promise.all(\n handlers.map(async (handler) => {\n try {\n await handler(event);\n } catch (error) {\n console.error(\n `Error processing CDC event for table ${event.table}:`,\n error\n );\n throw error;\n }\n })\n );\n}\n\n// Placeholder handlers - implement as needed\nexport const subscriptionHandlers = {\n onSubscriptionCreated: async (event: CDCEvent) => {\n console.log('Subscription created:', event);\n },\n onSubscriptionUpdated: async (event: CDCEvent) => {\n console.log('Subscription updated:', event);\n },\n};\n\nexport const paymentHandlers = {\n onPaymentCreated: async (event: CDCEvent) => {\n console.log('Payment created:', event);\n },\n onPaymentUpdated: async (event: CDCEvent) => {\n console.log('Payment updated:', event);\n },\n};\n"]}
@@ -0,0 +1,69 @@
1
+ import { PrismaClient } from '../prisma/generated/index.js';
2
+ export { PrismaClient } from '../prisma/generated/index.js';
3
+
4
+ // src/client.ts
5
+ function createPrismaClient() {
6
+ const client = new PrismaClient({
7
+ log: process.env.NODE_ENV === "development" ? ["warn", "error"] : ["error"]
8
+ });
9
+ return client.$extends({
10
+ query: {
11
+ $allModels: {
12
+ async findMany({ args, query }) {
13
+ args.relationLoadStrategy = "query";
14
+ const result = await query(args);
15
+ return convertBigIntToNumber(result);
16
+ },
17
+ async findFirst({ args, query }) {
18
+ args.relationLoadStrategy = "query";
19
+ const result = await query(args);
20
+ return convertBigIntToNumber(result);
21
+ },
22
+ async findUnique({ args, query }) {
23
+ args.relationLoadStrategy = "query";
24
+ const result = await query(args);
25
+ return convertBigIntToNumber(result);
26
+ },
27
+ async findFirstOrThrow({ args, query }) {
28
+ args.relationLoadStrategy = "query";
29
+ const result = await query(args);
30
+ return convertBigIntToNumber(result);
31
+ },
32
+ async findUniqueOrThrow({ args, query }) {
33
+ args.relationLoadStrategy = "query";
34
+ const result = await query(args);
35
+ return convertBigIntToNumber(result);
36
+ }
37
+ }
38
+ }
39
+ });
40
+ }
41
+ function convertBigIntToNumber(obj) {
42
+ if (obj === null || obj === void 0) {
43
+ return obj;
44
+ }
45
+ if (typeof obj === "bigint") {
46
+ return Number(obj);
47
+ }
48
+ if (Array.isArray(obj)) {
49
+ return obj.map(convertBigIntToNumber);
50
+ }
51
+ if (typeof obj === "object") {
52
+ const converted = {};
53
+ for (const key in obj) {
54
+ converted[key] = convertBigIntToNumber(obj[key]);
55
+ }
56
+ return converted;
57
+ }
58
+ return obj;
59
+ }
60
+ var globalForExtendedPrisma = globalThis;
61
+ var prisma = globalForExtendedPrisma.extendedPrisma ?? createPrismaClient();
62
+ if (process.env.NODE_ENV !== "production") {
63
+ globalForExtendedPrisma.extendedPrisma = prisma;
64
+ }
65
+ var client_default = prisma;
66
+
67
+ export { client_default, prisma };
68
+ //# sourceMappingURL=chunk-TPOKTXPS.js.map
69
+ //# sourceMappingURL=chunk-TPOKTXPS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";;;;AAMA,SAAS,kBAAA,GAAqB;AAC5B,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa;AAAA,IAC9B,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,GAAgB,CAAC,MAAA,EAAQ,OAAO,CAAA,GAAI,CAAC,OAAO;AAAA,GAC3E,CAAA;AAED,EAAA,OAAO,OAAO,QAAA,CAAS;AAAA,IACrB,KAAA,EAAO;AAAA,MACL,UAAA,EAAY;AAAA,QACV,MAAM,QAAA,CAAS,EAAE,IAAA,EAAM,OAAM,EAAG;AAC9B,UAAA,IAAA,CAAK,oBAAA,GAAuB,OAAA;AAC5B,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,IAAI,CAAA;AAC/B,UAAA,OAAO,sBAAsB,MAAM,CAAA;AAAA,QACrC,CAAA;AAAA,QACA,MAAM,SAAA,CAAU,EAAE,IAAA,EAAM,OAAM,EAAG;AAC/B,UAAA,IAAA,CAAK,oBAAA,GAAuB,OAAA;AAC5B,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,IAAI,CAAA;AAC/B,UAAA,OAAO,sBAAsB,MAAM,CAAA;AAAA,QACrC,CAAA;AAAA,QACA,MAAM,UAAA,CAAW,EAAE,IAAA,EAAM,OAAM,EAAG;AAChC,UAAA,IAAA,CAAK,oBAAA,GAAuB,OAAA;AAC5B,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,IAAI,CAAA;AAC/B,UAAA,OAAO,sBAAsB,MAAM,CAAA;AAAA,QACrC,CAAA;AAAA,QACA,MAAM,gBAAA,CAAiB,EAAE,IAAA,EAAM,OAAM,EAAG;AACtC,UAAA,IAAA,CAAK,oBAAA,GAAuB,OAAA;AAC5B,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,IAAI,CAAA;AAC/B,UAAA,OAAO,sBAAsB,MAAM,CAAA;AAAA,QACrC,CAAA;AAAA,QACA,MAAM,iBAAA,CAAkB,EAAE,IAAA,EAAM,OAAM,EAAG;AACvC,UAAA,IAAA,CAAK,oBAAA,GAAuB,OAAA;AAC5B,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,IAAI,CAAA;AAC/B,UAAA,OAAO,sBAAsB,MAAM,CAAA;AAAA,QACrC;AAAA;AACF;AACF,GACD,CAAA;AACH;AAEA,SAAS,sBAAyB,GAAA,EAAW;AAC3C,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW;AACrC,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,GAAA,CAAI,IAAI,qBAAqB,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,YAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,OAAO,GAAA,EAAK;AACrB,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,qBAAA,CAAuB,GAAA,CAAgC,GAAG,CAAC,CAAA;AAAA,IAC9E;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAIA,IAAM,uBAAA,GAA0B,UAAA;AAIzB,IAAM,MAAA,GAAS,uBAAA,CAAwB,cAAA,IAAkB,kBAAA;AAEhE,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,EAAA,uBAAA,CAAwB,cAAA,GAAiB,MAAA;AAC3C;AAGA,IAAO,cAAA,GAAQ","file":"chunk-TPOKTXPS.js","sourcesContent":["import { PrismaClient } from '../prisma/generated/index.js';\n\nconst globalForPrisma = globalThis as unknown as {\n prisma: PrismaClient | undefined;\n};\n\nfunction createPrismaClient() {\n const client = new PrismaClient({\n log: process.env.NODE_ENV === 'development' ? ['warn', 'error'] : ['error'],\n });\n\n return client.$extends({\n query: {\n $allModels: {\n async findMany({ args, query }) {\n args.relationLoadStrategy = 'query';\n const result = await query(args);\n return convertBigIntToNumber(result);\n },\n async findFirst({ args, query }) {\n args.relationLoadStrategy = 'query';\n const result = await query(args);\n return convertBigIntToNumber(result);\n },\n async findUnique({ args, query }) {\n args.relationLoadStrategy = 'query';\n const result = await query(args);\n return convertBigIntToNumber(result);\n },\n async findFirstOrThrow({ args, query }) {\n args.relationLoadStrategy = 'query';\n const result = await query(args);\n return convertBigIntToNumber(result);\n },\n async findUniqueOrThrow({ args, query }) {\n args.relationLoadStrategy = 'query';\n const result = await query(args);\n return convertBigIntToNumber(result);\n },\n },\n },\n });\n}\n\nfunction convertBigIntToNumber<T>(obj: T): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n if (typeof obj === 'bigint') {\n return Number(obj) as T;\n }\n if (Array.isArray(obj)) {\n return obj.map(convertBigIntToNumber) as T;\n }\n if (typeof obj === 'object') {\n const converted: Record<string, unknown> = {};\n for (const key in obj) {\n converted[key] = convertBigIntToNumber((obj as Record<string, unknown>)[key]);\n }\n return converted as T;\n }\n return obj;\n}\n\nexport type ExtendedPrismaClient = ReturnType<typeof createPrismaClient>;\n\nconst globalForExtendedPrisma = globalThis as unknown as {\n extendedPrisma: ExtendedPrismaClient | undefined;\n};\n\nexport const prisma = globalForExtendedPrisma.extendedPrisma ?? createPrismaClient();\n\nif (process.env.NODE_ENV !== 'production') {\n globalForExtendedPrisma.extendedPrisma = prisma;\n}\n\nexport { PrismaClient };\nexport default prisma;\n"]}
@@ -0,0 +1,31 @@
1
+ import { PrismaClient } from '../prisma/generated/index.js';
2
+ declare function createPrismaClient(): import("prisma/generated/runtime/library.js").DynamicClientExtensionThis<import("../prisma/generated/index.js").Prisma.TypeMap<import("prisma/generated/runtime/library.js").InternalArgs & {
3
+ result: {};
4
+ model: {};
5
+ query: {};
6
+ client: {};
7
+ }, {}>, import("../prisma/generated/index.js").Prisma.TypeMapCb<{
8
+ log: ("warn" | "error")[];
9
+ }>, {
10
+ result: {};
11
+ model: {};
12
+ query: {};
13
+ client: {};
14
+ }>;
15
+ export type ExtendedPrismaClient = ReturnType<typeof createPrismaClient>;
16
+ export declare const prisma: import("prisma/generated/runtime/library.js").DynamicClientExtensionThis<import("../prisma/generated/index.js").Prisma.TypeMap<import("prisma/generated/runtime/library.js").InternalArgs & {
17
+ result: {};
18
+ model: {};
19
+ query: {};
20
+ client: {};
21
+ }, {}>, import("../prisma/generated/index.js").Prisma.TypeMapCb<{
22
+ log: ("warn" | "error")[];
23
+ }>, {
24
+ result: {};
25
+ model: {};
26
+ query: {};
27
+ client: {};
28
+ }>;
29
+ export { PrismaClient };
30
+ export default prisma;
31
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAM5D,iBAAS,kBAAkB;;;;;;;;;;;;GAoC1B;AAsBD,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAMzE,eAAO,MAAM,MAAM;;;;;;;;;;;;EAAiE,CAAC;AAMrF,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,eAAe,MAAM,CAAC"}
package/dist/client.js ADDED
@@ -0,0 +1,3 @@
1
+ export { PrismaClient, client_default as default, prisma } from './chunk-TPOKTXPS.js';
2
+ //# sourceMappingURL=client.js.map
3
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"client.js"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Strapi 파일 시스템에서 단일 엔티티의 이미지를 조회합니다.
3
+ * @param entityName - 엔티티 이름 (예: 'product', 'supply-product')
4
+ * @param field - 필드 이름 (예: 'thumbnail', 'images')
5
+ * @param entityId - 엔티티 ID
6
+ * @returns 해당 엔티티의 파일 정보 배열
7
+ */
8
+ export declare function getImagesById(entityName: string, field: string, entityId: number): Promise<{
9
+ relatedType: string | null;
10
+ fieldName: string | null;
11
+ url: string | null | undefined;
12
+ relatedId: number | null;
13
+ formats: import("prisma/generated/runtime/library.js").JsonValue | undefined;
14
+ fileId: number | null;
15
+ }[]>;
16
+ /**
17
+ * Strapi 파일 시스템에서 여러 엔티티의 대표 이미지를 조회합니다.
18
+ * 각 엔티티당 하나의 이미지만 반환합니다 (DISTINCT ON 동작).
19
+ * @param entityName - 엔티티 이름
20
+ * @param field - 필드 이름
21
+ * @param entityIds - 엔티티 ID 배열
22
+ * @returns 각 엔티티의 대표 파일 정보 배열
23
+ */
24
+ export declare function getImagesByIds(entityName: string, field: string, entityIds: number[]): Promise<{
25
+ id: number;
26
+ name: string | null;
27
+ alternativeText: string | null;
28
+ caption: string | null;
29
+ width: number | null;
30
+ height: number | null;
31
+ formats: unknown;
32
+ hash: string | null;
33
+ ext: string | null;
34
+ mime: string | null;
35
+ size: number | null;
36
+ url: string | null;
37
+ previewUrl: string | null;
38
+ provider: string | null;
39
+ providerMetadata: unknown;
40
+ createdAt: Date | null;
41
+ updatedAt: Date | null;
42
+ folderPath: string | null;
43
+ relatedType: string | null;
44
+ fieldName: string | null;
45
+ relatedId: number | null;
46
+ fileId: number | null;
47
+ }[]>;
48
+ /**
49
+ * Strapi 파일 시스템에서 여러 엔티티의 모든 이미지를 조회합니다.
50
+ * 각 엔티티의 모든 이미지를 반환합니다.
51
+ * @param entityName - 엔티티 이름
52
+ * @param field - 필드 이름
53
+ * @param entityIds - 엔티티 ID 배열
54
+ * @returns 모든 파일 정보 배열
55
+ */
56
+ export declare function getManyImagesByIds(entityName: string, field: string, entityIds: number[]): Promise<{
57
+ relatedType: string | null;
58
+ fieldName: string | null;
59
+ url: string | null | undefined;
60
+ ext: string | null | undefined;
61
+ relatedId: number | null;
62
+ formats: import("prisma/generated/runtime/library.js").JsonValue | undefined;
63
+ fileId: number | null;
64
+ fileName: string | null | undefined;
65
+ }[]>;
66
+ /**
67
+ * 상품 정보를 조회합니다 (채팅에서 사용)
68
+ * @param productId - 상품 ID
69
+ * @returns 상품 정보
70
+ */
71
+ export declare function getProduct(productId: number): Promise<{
72
+ products: {
73
+ id: number;
74
+ title: string | null;
75
+ originalPrice: number | null;
76
+ salePrice: number | null;
77
+ mileage: number | null;
78
+ year: number | null;
79
+ modelName: string | null;
80
+ region: string | null;
81
+ productCode: string | null;
82
+ publishedAt: Date | null;
83
+ };
84
+ images: {
85
+ relatedType: string | null;
86
+ fieldName: string | null;
87
+ url: string | null | undefined;
88
+ relatedId: number | null;
89
+ formats: import("prisma/generated/runtime/library.js").JsonValue | undefined;
90
+ fileId: number | null;
91
+ }[];
92
+ } | null>;
93
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;;KAuBtF;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;KAyFpB;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE;;;;;;;;;KAgCpB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;UAoCjD"}
@@ -0,0 +1,155 @@
1
+ import { prisma } from '../chunk-TPOKTXPS.js';
2
+
3
+ // src/helpers/index.ts
4
+ async function getImagesById(entityName, field, entityId) {
5
+ const result = await prisma.filesRelatedMorphs.findMany({
6
+ where: {
7
+ relatedType: `api::${entityName}.${entityName}`,
8
+ field,
9
+ relatedId: entityId
10
+ },
11
+ include: {
12
+ files: true
13
+ },
14
+ orderBy: {
15
+ order: "asc"
16
+ }
17
+ });
18
+ return result.map((el) => ({
19
+ relatedType: el.relatedType,
20
+ fieldName: el.field,
21
+ url: el.files?.url,
22
+ relatedId: el.relatedId,
23
+ formats: el.files?.formats,
24
+ fileId: el.fileId
25
+ }));
26
+ }
27
+ async function getImagesByIds(entityName, field, entityIds) {
28
+ if (entityIds.length === 0) {
29
+ return [];
30
+ }
31
+ const result = await prisma.$queryRaw`
32
+ SELECT DISTINCT ON (frm.related_id)
33
+ f.id,
34
+ f.name,
35
+ f.alternative_text,
36
+ f.caption,
37
+ f.width,
38
+ f.height,
39
+ f.formats,
40
+ f.hash,
41
+ f.ext,
42
+ f.mime,
43
+ f.size,
44
+ f.url,
45
+ f.preview_url,
46
+ f.provider,
47
+ f.provider_metadata,
48
+ f.created_at,
49
+ f.updated_at,
50
+ f.folder_path,
51
+ frm.related_type,
52
+ frm.field AS field_name,
53
+ frm.related_id,
54
+ frm.file_id
55
+ FROM files_related_morphs frm
56
+ LEFT JOIN files f ON frm.file_id = f.id
57
+ WHERE frm.related_type = ${"api::" + entityName + "." + entityName}
58
+ AND frm.field = ${field}
59
+ AND frm.related_id = ANY(${entityIds})
60
+ ORDER BY frm.related_id ASC, frm.order ASC
61
+ LIMIT ${entityIds.length}
62
+ `;
63
+ return result.map((el) => ({
64
+ id: el.id,
65
+ name: el.name,
66
+ alternativeText: el.alternative_text,
67
+ caption: el.caption,
68
+ width: el.width,
69
+ height: el.height,
70
+ formats: el.formats,
71
+ hash: el.hash,
72
+ ext: el.ext,
73
+ mime: el.mime,
74
+ size: el.size ? Number(el.size) : null,
75
+ url: el.url,
76
+ previewUrl: el.preview_url,
77
+ provider: el.provider,
78
+ providerMetadata: el.provider_metadata,
79
+ createdAt: el.created_at,
80
+ updatedAt: el.updated_at,
81
+ folderPath: el.folder_path,
82
+ relatedType: el.related_type,
83
+ fieldName: el.field_name,
84
+ relatedId: el.related_id,
85
+ fileId: el.file_id
86
+ }));
87
+ }
88
+ async function getManyImagesByIds(entityName, field, entityIds) {
89
+ if (entityIds.length === 0) {
90
+ return [];
91
+ }
92
+ const result = await prisma.filesRelatedMorphs.findMany({
93
+ where: {
94
+ relatedType: `api::${entityName}.${entityName}`,
95
+ field,
96
+ relatedId: {
97
+ in: entityIds
98
+ }
99
+ },
100
+ include: {
101
+ files: true
102
+ },
103
+ orderBy: {
104
+ order: "asc"
105
+ }
106
+ });
107
+ return result.map((el) => ({
108
+ relatedType: el.relatedType,
109
+ fieldName: el.field,
110
+ url: el.files?.url,
111
+ ext: el.files?.ext,
112
+ relatedId: el.relatedId,
113
+ formats: el.files?.formats,
114
+ fileId: el.fileId,
115
+ fileName: el.files?.name
116
+ }));
117
+ }
118
+ async function getProduct(productId) {
119
+ const product = await prisma.products.findUnique({
120
+ where: { id: productId },
121
+ select: {
122
+ id: true,
123
+ title: true,
124
+ originalPrice: true,
125
+ salePrice: true,
126
+ mileage: true,
127
+ year: true,
128
+ modelName: true,
129
+ region: true,
130
+ productCode: true,
131
+ publishedAt: true
132
+ }
133
+ });
134
+ if (!product) return null;
135
+ const images = await getImagesById("product", "images", productId);
136
+ return {
137
+ products: {
138
+ id: product.id,
139
+ title: product.title,
140
+ originalPrice: product.originalPrice,
141
+ salePrice: product.salePrice,
142
+ mileage: product.mileage,
143
+ year: product.year,
144
+ modelName: product.modelName,
145
+ region: product.region,
146
+ productCode: product.productCode,
147
+ publishedAt: product.publishedAt
148
+ },
149
+ images
150
+ };
151
+ }
152
+
153
+ export { getImagesById, getImagesByIds, getManyImagesByIds, getProduct };
154
+ //# sourceMappingURL=index.js.map
155
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/helpers/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { prisma } from '../client.js';\n\n/**\n * Strapi 파일 시스템에서 단일 엔티티의 이미지를 조회합니다.\n * @param entityName - 엔티티 이름 (예: 'product', 'supply-product')\n * @param field - 필드 이름 (예: 'thumbnail', 'images')\n * @param entityId - 엔티티 ID\n * @returns 해당 엔티티의 파일 정보 배열\n */\nexport async function getImagesById(entityName: string, field: string, entityId: number) {\n const result = await prisma.filesRelatedMorphs.findMany({\n where: {\n relatedType: `api::${entityName}.${entityName}`,\n field: field,\n relatedId: entityId\n },\n include: {\n files: true\n },\n orderBy: {\n order: 'asc'\n }\n });\n\n return result.map((el: typeof result[0]) => ({\n relatedType: el.relatedType,\n fieldName: el.field,\n url: el.files?.url,\n relatedId: el.relatedId,\n formats: el.files?.formats,\n fileId: el.fileId\n }));\n}\n\n/**\n * Strapi 파일 시스템에서 여러 엔티티의 대표 이미지를 조회합니다.\n * 각 엔티티당 하나의 이미지만 반환합니다 (DISTINCT ON 동작).\n * @param entityName - 엔티티 이름\n * @param field - 필드 이름\n * @param entityIds - 엔티티 ID 배열\n * @returns 각 엔티티의 대표 파일 정보 배열\n */\nexport async function getImagesByIds(\n entityName: string,\n field: string,\n entityIds: number[]\n) {\n if (entityIds.length === 0) {\n return [];\n }\n\n // Prisma에서 DISTINCT ON을 지원하지 않으므로 raw query 사용\n const result = await prisma.$queryRaw<\n Array<{\n id: number;\n name: string | null;\n alternative_text: string | null;\n caption: string | null;\n width: number | null;\n height: number | null;\n formats: unknown;\n hash: string | null;\n ext: string | null;\n mime: string | null;\n size: number | null;\n url: string | null;\n preview_url: string | null;\n provider: string | null;\n provider_metadata: unknown;\n created_at: Date | null;\n updated_at: Date | null;\n folder_path: string | null;\n related_type: string | null;\n field_name: string | null;\n related_id: number | null;\n file_id: number | null;\n }>\n >`\n SELECT DISTINCT ON (frm.related_id)\n f.id,\n f.name,\n f.alternative_text,\n f.caption,\n f.width,\n f.height,\n f.formats,\n f.hash,\n f.ext,\n f.mime,\n f.size,\n f.url,\n f.preview_url,\n f.provider,\n f.provider_metadata,\n f.created_at,\n f.updated_at,\n f.folder_path,\n frm.related_type,\n frm.field AS field_name,\n frm.related_id,\n frm.file_id\n FROM files_related_morphs frm\n LEFT JOIN files f ON frm.file_id = f.id\n WHERE frm.related_type = ${'api::' + entityName + '.' + entityName}\n AND frm.field = ${field}\n AND frm.related_id = ANY(${entityIds})\n ORDER BY frm.related_id ASC, frm.order ASC\n LIMIT ${entityIds.length}\n `;\n\n return result.map((el) => ({\n id: el.id,\n name: el.name,\n alternativeText: el.alternative_text,\n caption: el.caption,\n width: el.width,\n height: el.height,\n formats: el.formats,\n hash: el.hash,\n ext: el.ext,\n mime: el.mime,\n size: el.size ? Number(el.size) : null,\n url: el.url,\n previewUrl: el.preview_url,\n provider: el.provider,\n providerMetadata: el.provider_metadata,\n createdAt: el.created_at,\n updatedAt: el.updated_at,\n folderPath: el.folder_path,\n relatedType: el.related_type,\n fieldName: el.field_name,\n relatedId: el.related_id,\n fileId: el.file_id\n }));\n}\n\n/**\n * Strapi 파일 시스템에서 여러 엔티티의 모든 이미지를 조회합니다.\n * 각 엔티티의 모든 이미지를 반환합니다.\n * @param entityName - 엔티티 이름\n * @param field - 필드 이름\n * @param entityIds - 엔티티 ID 배열\n * @returns 모든 파일 정보 배열\n */\nexport async function getManyImagesByIds(\n entityName: string,\n field: string,\n entityIds: number[]\n) {\n if (entityIds.length === 0) {\n return [];\n }\n\n const result = await prisma.filesRelatedMorphs.findMany({\n where: {\n relatedType: `api::${entityName}.${entityName}`,\n field: field,\n relatedId: {\n in: entityIds\n }\n },\n include: {\n files: true\n },\n orderBy: {\n order: 'asc'\n }\n });\n\n return result.map((el: typeof result[0]) => ({\n relatedType: el.relatedType,\n fieldName: el.field,\n url: el.files?.url,\n ext: el.files?.ext,\n relatedId: el.relatedId,\n formats: el.files?.formats,\n fileId: el.fileId,\n fileName: el.files?.name\n }));\n}\n\n/**\n * 상품 정보를 조회합니다 (채팅에서 사용)\n * @param productId - 상품 ID\n * @returns 상품 정보\n */\nexport async function getProduct(productId: number) {\n const product = await prisma.products.findUnique({\n where: { id: productId },\n select: {\n id: true,\n title: true,\n originalPrice: true,\n salePrice: true,\n mileage: true,\n year: true,\n modelName: true,\n region: true,\n productCode: true,\n publishedAt: true\n }\n });\n\n if (!product) return null;\n\n const images = await getImagesById('product', 'images', productId);\n\n return {\n products: {\n id: product.id,\n title: product.title,\n originalPrice: product.originalPrice,\n salePrice: product.salePrice,\n mileage: product.mileage,\n year: product.year,\n modelName: product.modelName,\n region: product.region,\n productCode: product.productCode,\n publishedAt: product.publishedAt\n },\n images\n };\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { prisma, PrismaClient } from './client.js';
2
+ export type { ExtendedPrismaClient } from './client.js';
3
+ export * from './cdc/index.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGxD,cAAc,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { createHandlerRegistry, isDeleteEvent, isInsertEvent, isUpdateEvent, paymentHandlers, processEvent, registerHandler, subscriptionHandlers } from './chunk-4OINT53S.js';
2
+ export { PrismaClient, prisma } from './chunk-TPOKTXPS.js';
3
+ //# sourceMappingURL=index.js.map
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,9 @@
1
+ import { PrismaClient } from '../../prisma/supabase/generated/index.js';
2
+ /**
3
+ * Supabase 데이터베이스용 Prisma 클라이언트
4
+ * Chat, Push, 관리자 세션/인증 등을 위한 별도 DB 연결
5
+ */
6
+ export declare const supabasePrisma: PrismaClient<import("../../prisma/supabase/generated/index.js").Prisma.PrismaClientOptions, never, import("prisma/supabase/generated/runtime/library.js").DefaultArgs>;
7
+ export { PrismaClient as SupabasePrismaClient };
8
+ export default supabasePrisma;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/supabase/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAmBxE;;;GAGG;AACH,eAAO,MAAM,cAAc,wKASvB,CAAC;AAML,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,CAAC;AAChD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { PrismaClient } from '../../prisma/supabase/generated/index.js';
2
+ export { PrismaClient as SupabasePrismaClient } from '../../prisma/supabase/generated/index.js';
3
+
4
+ // src/supabase/index.ts
5
+ var globalForSupabasePrisma = globalThis;
6
+ function getSupabaseDbUrl() {
7
+ const baseUrl = process.env.SUPABASE_DB_URL || "";
8
+ if (!baseUrl) return baseUrl;
9
+ const separator = baseUrl.includes("?") ? "&" : "?";
10
+ return `${baseUrl}${separator}connect_timeout=5&pool_timeout=5&pgbouncer=true`;
11
+ }
12
+ var supabasePrisma = globalForSupabasePrisma.supabasePrisma ?? new PrismaClient({
13
+ log: process.env.NODE_ENV === "development" ? ["query", "warn", "error"] : ["error"],
14
+ datasources: {
15
+ db: {
16
+ url: getSupabaseDbUrl()
17
+ }
18
+ }
19
+ });
20
+ if (process.env.NODE_ENV !== "production") {
21
+ globalForSupabasePrisma.supabasePrisma = supabasePrisma;
22
+ }
23
+ var supabase_default = supabasePrisma;
24
+
25
+ export { supabase_default as default, supabasePrisma };
26
+ //# sourceMappingURL=index.js.map
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/supabase/index.ts"],"names":[],"mappings":";;;;AAEA,IAAM,uBAAA,GAA0B,UAAA;AAKhC,SAAS,gBAAA,GAA2B;AAClC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,EAAA;AAC/C,EAAA,IAAI,CAAC,SAAS,OAAO,OAAA;AAGrB,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAIhD,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,SAAS,CAAA,+CAAA,CAAA;AAC/B;AAMO,IAAM,cAAA,GACX,uBAAA,CAAwB,cAAA,IACxB,IAAI,YAAA,CAAa;AAAA,EACf,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,GAAgB,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA,GAAI,CAAC,OAAO,CAAA;AAAA,EACnF,WAAA,EAAa;AAAA,IACX,EAAA,EAAI;AAAA,MACF,KAAK,gBAAA;AAAiB;AACxB;AAEJ,CAAC;AAEH,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,EAAA,uBAAA,CAAwB,cAAA,GAAiB,cAAA;AAC3C;AAGA,IAAO,gBAAA,GAAQ","file":"index.js","sourcesContent":["import { PrismaClient } from '../../prisma/supabase/generated/index.js';\n\nconst globalForSupabasePrisma = globalThis as unknown as {\n supabasePrisma: PrismaClient | undefined;\n};\n\n// Supabase DB URL에 연결 타임아웃 파라미터 추가\nfunction getSupabaseDbUrl(): string {\n const baseUrl = process.env.SUPABASE_DB_URL || '';\n if (!baseUrl) return baseUrl;\n\n // 이미 파라미터가 있는지 확인\n const separator = baseUrl.includes('?') ? '&' : '?';\n // connect_timeout: 연결 타임아웃 (초), pool_timeout: 풀 대기 타임아웃 (초)\n // pgbouncer: true 추가\n // !!! pgbouncer=true 없을 시 쿼리 결과를 반환하지 않음\n return `${baseUrl}${separator}connect_timeout=5&pool_timeout=5&pgbouncer=true`;\n}\n\n/**\n * Supabase 데이터베이스용 Prisma 클라이언트\n * Chat, Push, 관리자 세션/인증 등을 위한 별도 DB 연결\n */\nexport const supabasePrisma =\n globalForSupabasePrisma.supabasePrisma ??\n new PrismaClient({\n log: process.env.NODE_ENV === 'development' ? ['query', 'warn', 'error'] : ['error'],\n datasources: {\n db: {\n url: getSupabaseDbUrl()\n }\n }\n });\n\nif (process.env.NODE_ENV !== 'production') {\n globalForSupabasePrisma.supabasePrisma = supabasePrisma;\n}\n\nexport { PrismaClient as SupabasePrismaClient };\nexport default supabasePrisma;\n"]}