prisma-flare 1.0.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.
- package/dist/cli/db-create.cjs +240 -0
- package/dist/cli/db-create.d.cts +1 -0
- package/dist/cli/db-create.d.ts +1 -0
- package/dist/cli/db-create.js +217 -0
- package/dist/cli/db-drop.cjs +263 -0
- package/dist/cli/db-drop.d.cts +1 -0
- package/dist/cli/db-drop.d.ts +1 -0
- package/dist/cli/db-drop.js +240 -0
- package/dist/cli/db-migrate.cjs +318 -0
- package/dist/cli/db-migrate.d.cts +1 -0
- package/dist/cli/db-migrate.d.ts +1 -0
- package/dist/cli/db-migrate.js +295 -0
- package/dist/cli/db-reset.cjs +110 -0
- package/dist/cli/db-reset.d.cts +1 -0
- package/dist/cli/db-reset.d.ts +1 -0
- package/dist/cli/db-reset.js +87 -0
- package/dist/cli/db-seed.cjs +87 -0
- package/dist/cli/db-seed.d.cts +1 -0
- package/dist/cli/db-seed.d.ts +1 -0
- package/dist/cli/db-seed.js +64 -0
- package/dist/cli/index.cjs +352 -0
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +328 -0
- package/dist/core/flareBuilder.cjs +681 -0
- package/dist/core/flareBuilder.d.cts +402 -0
- package/dist/core/flareBuilder.d.ts +402 -0
- package/dist/core/flareBuilder.js +658 -0
- package/dist/core/hooks.cjs +243 -0
- package/dist/core/hooks.d.cts +13 -0
- package/dist/core/hooks.d.ts +13 -0
- package/dist/core/hooks.js +209 -0
- package/dist/generated.cjs +31 -0
- package/dist/generated.d.cts +4 -0
- package/dist/generated.d.ts +4 -0
- package/dist/generated.js +6 -0
- package/dist/index.cjs +1315 -0
- package/dist/index.d.cts +237 -0
- package/dist/index.d.ts +237 -0
- package/dist/index.js +1261 -0
- package/dist/prisma.types-nGNe1CG8.d.cts +201 -0
- package/dist/prisma.types-nGNe1CG8.d.ts +201 -0
- package/license.md +21 -0
- package/package.json +115 -0
- package/readme.md +957 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/core/hooks.ts
|
|
21
|
+
var hooks_exports = {};
|
|
22
|
+
__export(hooks_exports, {
|
|
23
|
+
afterChange: () => afterChange,
|
|
24
|
+
afterCreate: () => afterCreate,
|
|
25
|
+
afterDelete: () => afterDelete,
|
|
26
|
+
afterUpdate: () => afterUpdate,
|
|
27
|
+
afterUpsert: () => afterUpsert,
|
|
28
|
+
beforeCreate: () => beforeCreate,
|
|
29
|
+
beforeDelete: () => beforeDelete,
|
|
30
|
+
beforeUpdate: () => beforeUpdate
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(hooks_exports);
|
|
33
|
+
|
|
34
|
+
// src/core/hookRegistry.ts
|
|
35
|
+
function valuesEqual(a, b) {
|
|
36
|
+
if (a == null && b == null) return true;
|
|
37
|
+
if (a == null || b == null) return false;
|
|
38
|
+
if (a === b) return true;
|
|
39
|
+
if (a instanceof Date && b instanceof Date) {
|
|
40
|
+
return a.getTime() === b.getTime();
|
|
41
|
+
}
|
|
42
|
+
if (typeof a.toDecimalPlaces === "function" && typeof b.toDecimalPlaces === "function") {
|
|
43
|
+
return a.toString() === b.toString();
|
|
44
|
+
}
|
|
45
|
+
if (typeof a === "bigint" && typeof b === "bigint") {
|
|
46
|
+
return a === b;
|
|
47
|
+
}
|
|
48
|
+
if (typeof a === "object" && typeof b === "object") {
|
|
49
|
+
try {
|
|
50
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
51
|
+
} catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return a === b;
|
|
56
|
+
}
|
|
57
|
+
var DEFAULT_CONFIG = {
|
|
58
|
+
enableColumnHooks: true,
|
|
59
|
+
maxRefetch: 1e3,
|
|
60
|
+
warnOnSkip: true
|
|
61
|
+
};
|
|
62
|
+
var HookRegistry = class {
|
|
63
|
+
constructor() {
|
|
64
|
+
this.hooks = {
|
|
65
|
+
before: {},
|
|
66
|
+
after: {}
|
|
67
|
+
};
|
|
68
|
+
this.columnHooks = {
|
|
69
|
+
afterChange: {}
|
|
70
|
+
};
|
|
71
|
+
this.fieldCache = {};
|
|
72
|
+
this.modelsWithColumnHooks = /* @__PURE__ */ new Set();
|
|
73
|
+
this.config = { ...DEFAULT_CONFIG };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Configure the hook system.
|
|
77
|
+
* @param config - Partial configuration to merge with defaults
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* // Disable column hooks globally for performance
|
|
81
|
+
* hookRegistry.configure({ enableColumnHooks: false });
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* // Increase maxRefetch limit
|
|
85
|
+
* hookRegistry.configure({ maxRefetch: 5000 });
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* // Disable limit entirely (use with caution)
|
|
89
|
+
* hookRegistry.configure({ maxRefetch: Infinity });
|
|
90
|
+
*/
|
|
91
|
+
configure(config) {
|
|
92
|
+
this.config = { ...this.config, ...config };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get current configuration.
|
|
96
|
+
*/
|
|
97
|
+
getConfig() {
|
|
98
|
+
return this.config;
|
|
99
|
+
}
|
|
100
|
+
addHook(model, action, timing, fn) {
|
|
101
|
+
const key = `${model}:${action}`;
|
|
102
|
+
if (!this.hooks[timing][key]) {
|
|
103
|
+
this.hooks[timing][key] = [];
|
|
104
|
+
}
|
|
105
|
+
this.hooks[timing][key].push(fn);
|
|
106
|
+
}
|
|
107
|
+
addColumnHook(model, column, fn) {
|
|
108
|
+
const key = `${model}:${column}`;
|
|
109
|
+
if (!this.columnHooks.afterChange[key]) {
|
|
110
|
+
this.columnHooks.afterChange[key] = [];
|
|
111
|
+
}
|
|
112
|
+
this.columnHooks.afterChange[key].push(fn);
|
|
113
|
+
this.modelsWithColumnHooks.add(model);
|
|
114
|
+
}
|
|
115
|
+
async runHooks(timing, model, action, args, prisma) {
|
|
116
|
+
const key = `${model}:${action}`;
|
|
117
|
+
const hooks = this.hooks[timing]?.[key] ?? [];
|
|
118
|
+
if (timing === "after") {
|
|
119
|
+
await Promise.all(hooks.map((hook) => hook(...args, prisma)));
|
|
120
|
+
} else {
|
|
121
|
+
for (const hook of hooks) {
|
|
122
|
+
await hook(...args, prisma);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async runColumnHooks(model, newData, prevData, prisma) {
|
|
127
|
+
const promises = [];
|
|
128
|
+
for (const column in newData) {
|
|
129
|
+
const key = `${model}:${column}`;
|
|
130
|
+
const hooks = this.columnHooks.afterChange[key];
|
|
131
|
+
if (hooks && !valuesEqual(newData[column], prevData[column])) {
|
|
132
|
+
for (const hook of hooks) {
|
|
133
|
+
promises.push(hook(prevData[column], newData[column], newData, prisma));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
await Promise.all(promises);
|
|
138
|
+
}
|
|
139
|
+
hasColumnHooks(model) {
|
|
140
|
+
return this.modelsWithColumnHooks.has(model);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Check if column hooks should run for an operation.
|
|
144
|
+
* Takes into account global config, record count limits, and per-call options.
|
|
145
|
+
*
|
|
146
|
+
* @param model - The model name
|
|
147
|
+
* @param recordCount - Number of records affected (for maxRefetch check)
|
|
148
|
+
* @param args - The operation args (to check for __flare skip option)
|
|
149
|
+
* @returns Whether column hooks should execute
|
|
150
|
+
*/
|
|
151
|
+
shouldRunColumnHooks(model, recordCount, args) {
|
|
152
|
+
if (args?.__flare?.skipColumnHooks === true) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
if (!this.config.enableColumnHooks) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
if (!this.modelsWithColumnHooks.has(model)) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
if (this.config.maxRefetch > 0 && recordCount > this.config.maxRefetch) {
|
|
162
|
+
if (this.config.warnOnSkip) {
|
|
163
|
+
console.warn(
|
|
164
|
+
`[prisma-flare] Skipping column hooks for ${model}: ${recordCount} records exceeds maxRefetch limit of ${this.config.maxRefetch}. Configure via hookRegistry.configure({ maxRefetch: ... })`
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
getRelevantFields(model) {
|
|
172
|
+
if (this.fieldCache[model]) {
|
|
173
|
+
return this.fieldCache[model];
|
|
174
|
+
}
|
|
175
|
+
const fields = /* @__PURE__ */ new Set();
|
|
176
|
+
for (const key of Object.keys(this.columnHooks.afterChange)) {
|
|
177
|
+
if (key.startsWith(`${model}:`)) {
|
|
178
|
+
const [, column] = key.split(":");
|
|
179
|
+
fields.add(column);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
fields.add("id");
|
|
183
|
+
const result = Array.from(fields).reduce((acc, field) => {
|
|
184
|
+
acc[field] = true;
|
|
185
|
+
return acc;
|
|
186
|
+
}, {});
|
|
187
|
+
this.fieldCache[model] = result;
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Clear all registered hooks (useful for testing)
|
|
192
|
+
*/
|
|
193
|
+
clearAll() {
|
|
194
|
+
this.hooks.before = {};
|
|
195
|
+
this.hooks.after = {};
|
|
196
|
+
this.columnHooks.afterChange = {};
|
|
197
|
+
this.fieldCache = {};
|
|
198
|
+
this.modelsWithColumnHooks.clear();
|
|
199
|
+
this.config = { ...DEFAULT_CONFIG };
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
var hookRegistry = new HookRegistry();
|
|
203
|
+
var hookRegistry_default = hookRegistry;
|
|
204
|
+
|
|
205
|
+
// src/core/hooks.ts
|
|
206
|
+
function normalizeModelName(model) {
|
|
207
|
+
return model.toLowerCase();
|
|
208
|
+
}
|
|
209
|
+
function beforeCreate(model, callback) {
|
|
210
|
+
hookRegistry_default.addHook(normalizeModelName(model), "create", "before", callback);
|
|
211
|
+
}
|
|
212
|
+
function beforeDelete(model, callback) {
|
|
213
|
+
hookRegistry_default.addHook(normalizeModelName(model), "delete", "before", callback);
|
|
214
|
+
}
|
|
215
|
+
function afterCreate(model, callback) {
|
|
216
|
+
hookRegistry_default.addHook(normalizeModelName(model), "create", "after", callback);
|
|
217
|
+
}
|
|
218
|
+
function afterDelete(model, callback) {
|
|
219
|
+
hookRegistry_default.addHook(normalizeModelName(model), "delete", "after", callback);
|
|
220
|
+
}
|
|
221
|
+
function beforeUpdate(model, callback) {
|
|
222
|
+
hookRegistry_default.addHook(normalizeModelName(model), "update", "before", callback);
|
|
223
|
+
}
|
|
224
|
+
function afterUpdate(model, callback) {
|
|
225
|
+
hookRegistry_default.addHook(normalizeModelName(model), "update", "after", callback);
|
|
226
|
+
}
|
|
227
|
+
function afterChange(model, column, callback) {
|
|
228
|
+
hookRegistry_default.addColumnHook(normalizeModelName(model), column, callback);
|
|
229
|
+
}
|
|
230
|
+
function afterUpsert(model, callback) {
|
|
231
|
+
hookRegistry_default.addHook(normalizeModelName(model), "upsert", "after", callback);
|
|
232
|
+
}
|
|
233
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
234
|
+
0 && (module.exports = {
|
|
235
|
+
afterChange,
|
|
236
|
+
afterCreate,
|
|
237
|
+
afterDelete,
|
|
238
|
+
afterUpdate,
|
|
239
|
+
afterUpsert,
|
|
240
|
+
beforeCreate,
|
|
241
|
+
beforeDelete,
|
|
242
|
+
beforeUpdate
|
|
243
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { M as ModelName, B as BeforeHookCallback, j as AfterHookCallback, k as ColumnChangeCallback } from '../prisma.types-nGNe1CG8.cjs';
|
|
2
|
+
import '@prisma/client';
|
|
3
|
+
|
|
4
|
+
declare function beforeCreate<T extends ModelName>(model: T, callback: BeforeHookCallback<T>): void;
|
|
5
|
+
declare function beforeDelete<T extends ModelName>(model: T, callback: BeforeHookCallback<T>): void;
|
|
6
|
+
declare function afterCreate<T extends ModelName>(model: T, callback: AfterHookCallback<T>): void;
|
|
7
|
+
declare function afterDelete<T extends ModelName>(model: T, callback: AfterHookCallback<T>): void;
|
|
8
|
+
declare function beforeUpdate<T extends ModelName>(model: T, callback: BeforeHookCallback<T>): void;
|
|
9
|
+
declare function afterUpdate<T extends ModelName>(model: T, callback: AfterHookCallback<T>): void;
|
|
10
|
+
declare function afterChange<T extends ModelName>(model: T, column: string, callback: ColumnChangeCallback<T>): void;
|
|
11
|
+
declare function afterUpsert<T extends ModelName>(model: T, callback: AfterHookCallback<T>): void;
|
|
12
|
+
|
|
13
|
+
export { afterChange, afterCreate, afterDelete, afterUpdate, afterUpsert, beforeCreate, beforeDelete, beforeUpdate };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { M as ModelName, B as BeforeHookCallback, j as AfterHookCallback, k as ColumnChangeCallback } from '../prisma.types-nGNe1CG8.js';
|
|
2
|
+
import '@prisma/client';
|
|
3
|
+
|
|
4
|
+
declare function beforeCreate<T extends ModelName>(model: T, callback: BeforeHookCallback<T>): void;
|
|
5
|
+
declare function beforeDelete<T extends ModelName>(model: T, callback: BeforeHookCallback<T>): void;
|
|
6
|
+
declare function afterCreate<T extends ModelName>(model: T, callback: AfterHookCallback<T>): void;
|
|
7
|
+
declare function afterDelete<T extends ModelName>(model: T, callback: AfterHookCallback<T>): void;
|
|
8
|
+
declare function beforeUpdate<T extends ModelName>(model: T, callback: BeforeHookCallback<T>): void;
|
|
9
|
+
declare function afterUpdate<T extends ModelName>(model: T, callback: AfterHookCallback<T>): void;
|
|
10
|
+
declare function afterChange<T extends ModelName>(model: T, column: string, callback: ColumnChangeCallback<T>): void;
|
|
11
|
+
declare function afterUpsert<T extends ModelName>(model: T, callback: AfterHookCallback<T>): void;
|
|
12
|
+
|
|
13
|
+
export { afterChange, afterCreate, afterDelete, afterUpdate, afterUpsert, beforeCreate, beforeDelete, beforeUpdate };
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
// src/core/hookRegistry.ts
|
|
2
|
+
function valuesEqual(a, b) {
|
|
3
|
+
if (a == null && b == null) return true;
|
|
4
|
+
if (a == null || b == null) return false;
|
|
5
|
+
if (a === b) return true;
|
|
6
|
+
if (a instanceof Date && b instanceof Date) {
|
|
7
|
+
return a.getTime() === b.getTime();
|
|
8
|
+
}
|
|
9
|
+
if (typeof a.toDecimalPlaces === "function" && typeof b.toDecimalPlaces === "function") {
|
|
10
|
+
return a.toString() === b.toString();
|
|
11
|
+
}
|
|
12
|
+
if (typeof a === "bigint" && typeof b === "bigint") {
|
|
13
|
+
return a === b;
|
|
14
|
+
}
|
|
15
|
+
if (typeof a === "object" && typeof b === "object") {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
18
|
+
} catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return a === b;
|
|
23
|
+
}
|
|
24
|
+
var DEFAULT_CONFIG = {
|
|
25
|
+
enableColumnHooks: true,
|
|
26
|
+
maxRefetch: 1e3,
|
|
27
|
+
warnOnSkip: true
|
|
28
|
+
};
|
|
29
|
+
var HookRegistry = class {
|
|
30
|
+
constructor() {
|
|
31
|
+
this.hooks = {
|
|
32
|
+
before: {},
|
|
33
|
+
after: {}
|
|
34
|
+
};
|
|
35
|
+
this.columnHooks = {
|
|
36
|
+
afterChange: {}
|
|
37
|
+
};
|
|
38
|
+
this.fieldCache = {};
|
|
39
|
+
this.modelsWithColumnHooks = /* @__PURE__ */ new Set();
|
|
40
|
+
this.config = { ...DEFAULT_CONFIG };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Configure the hook system.
|
|
44
|
+
* @param config - Partial configuration to merge with defaults
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* // Disable column hooks globally for performance
|
|
48
|
+
* hookRegistry.configure({ enableColumnHooks: false });
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* // Increase maxRefetch limit
|
|
52
|
+
* hookRegistry.configure({ maxRefetch: 5000 });
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* // Disable limit entirely (use with caution)
|
|
56
|
+
* hookRegistry.configure({ maxRefetch: Infinity });
|
|
57
|
+
*/
|
|
58
|
+
configure(config) {
|
|
59
|
+
this.config = { ...this.config, ...config };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get current configuration.
|
|
63
|
+
*/
|
|
64
|
+
getConfig() {
|
|
65
|
+
return this.config;
|
|
66
|
+
}
|
|
67
|
+
addHook(model, action, timing, fn) {
|
|
68
|
+
const key = `${model}:${action}`;
|
|
69
|
+
if (!this.hooks[timing][key]) {
|
|
70
|
+
this.hooks[timing][key] = [];
|
|
71
|
+
}
|
|
72
|
+
this.hooks[timing][key].push(fn);
|
|
73
|
+
}
|
|
74
|
+
addColumnHook(model, column, fn) {
|
|
75
|
+
const key = `${model}:${column}`;
|
|
76
|
+
if (!this.columnHooks.afterChange[key]) {
|
|
77
|
+
this.columnHooks.afterChange[key] = [];
|
|
78
|
+
}
|
|
79
|
+
this.columnHooks.afterChange[key].push(fn);
|
|
80
|
+
this.modelsWithColumnHooks.add(model);
|
|
81
|
+
}
|
|
82
|
+
async runHooks(timing, model, action, args, prisma) {
|
|
83
|
+
const key = `${model}:${action}`;
|
|
84
|
+
const hooks = this.hooks[timing]?.[key] ?? [];
|
|
85
|
+
if (timing === "after") {
|
|
86
|
+
await Promise.all(hooks.map((hook) => hook(...args, prisma)));
|
|
87
|
+
} else {
|
|
88
|
+
for (const hook of hooks) {
|
|
89
|
+
await hook(...args, prisma);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async runColumnHooks(model, newData, prevData, prisma) {
|
|
94
|
+
const promises = [];
|
|
95
|
+
for (const column in newData) {
|
|
96
|
+
const key = `${model}:${column}`;
|
|
97
|
+
const hooks = this.columnHooks.afterChange[key];
|
|
98
|
+
if (hooks && !valuesEqual(newData[column], prevData[column])) {
|
|
99
|
+
for (const hook of hooks) {
|
|
100
|
+
promises.push(hook(prevData[column], newData[column], newData, prisma));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
await Promise.all(promises);
|
|
105
|
+
}
|
|
106
|
+
hasColumnHooks(model) {
|
|
107
|
+
return this.modelsWithColumnHooks.has(model);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if column hooks should run for an operation.
|
|
111
|
+
* Takes into account global config, record count limits, and per-call options.
|
|
112
|
+
*
|
|
113
|
+
* @param model - The model name
|
|
114
|
+
* @param recordCount - Number of records affected (for maxRefetch check)
|
|
115
|
+
* @param args - The operation args (to check for __flare skip option)
|
|
116
|
+
* @returns Whether column hooks should execute
|
|
117
|
+
*/
|
|
118
|
+
shouldRunColumnHooks(model, recordCount, args) {
|
|
119
|
+
if (args?.__flare?.skipColumnHooks === true) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
if (!this.config.enableColumnHooks) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
if (!this.modelsWithColumnHooks.has(model)) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
if (this.config.maxRefetch > 0 && recordCount > this.config.maxRefetch) {
|
|
129
|
+
if (this.config.warnOnSkip) {
|
|
130
|
+
console.warn(
|
|
131
|
+
`[prisma-flare] Skipping column hooks for ${model}: ${recordCount} records exceeds maxRefetch limit of ${this.config.maxRefetch}. Configure via hookRegistry.configure({ maxRefetch: ... })`
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
getRelevantFields(model) {
|
|
139
|
+
if (this.fieldCache[model]) {
|
|
140
|
+
return this.fieldCache[model];
|
|
141
|
+
}
|
|
142
|
+
const fields = /* @__PURE__ */ new Set();
|
|
143
|
+
for (const key of Object.keys(this.columnHooks.afterChange)) {
|
|
144
|
+
if (key.startsWith(`${model}:`)) {
|
|
145
|
+
const [, column] = key.split(":");
|
|
146
|
+
fields.add(column);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
fields.add("id");
|
|
150
|
+
const result = Array.from(fields).reduce((acc, field) => {
|
|
151
|
+
acc[field] = true;
|
|
152
|
+
return acc;
|
|
153
|
+
}, {});
|
|
154
|
+
this.fieldCache[model] = result;
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Clear all registered hooks (useful for testing)
|
|
159
|
+
*/
|
|
160
|
+
clearAll() {
|
|
161
|
+
this.hooks.before = {};
|
|
162
|
+
this.hooks.after = {};
|
|
163
|
+
this.columnHooks.afterChange = {};
|
|
164
|
+
this.fieldCache = {};
|
|
165
|
+
this.modelsWithColumnHooks.clear();
|
|
166
|
+
this.config = { ...DEFAULT_CONFIG };
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
var hookRegistry = new HookRegistry();
|
|
170
|
+
var hookRegistry_default = hookRegistry;
|
|
171
|
+
|
|
172
|
+
// src/core/hooks.ts
|
|
173
|
+
function normalizeModelName(model) {
|
|
174
|
+
return model.toLowerCase();
|
|
175
|
+
}
|
|
176
|
+
function beforeCreate(model, callback) {
|
|
177
|
+
hookRegistry_default.addHook(normalizeModelName(model), "create", "before", callback);
|
|
178
|
+
}
|
|
179
|
+
function beforeDelete(model, callback) {
|
|
180
|
+
hookRegistry_default.addHook(normalizeModelName(model), "delete", "before", callback);
|
|
181
|
+
}
|
|
182
|
+
function afterCreate(model, callback) {
|
|
183
|
+
hookRegistry_default.addHook(normalizeModelName(model), "create", "after", callback);
|
|
184
|
+
}
|
|
185
|
+
function afterDelete(model, callback) {
|
|
186
|
+
hookRegistry_default.addHook(normalizeModelName(model), "delete", "after", callback);
|
|
187
|
+
}
|
|
188
|
+
function beforeUpdate(model, callback) {
|
|
189
|
+
hookRegistry_default.addHook(normalizeModelName(model), "update", "before", callback);
|
|
190
|
+
}
|
|
191
|
+
function afterUpdate(model, callback) {
|
|
192
|
+
hookRegistry_default.addHook(normalizeModelName(model), "update", "after", callback);
|
|
193
|
+
}
|
|
194
|
+
function afterChange(model, column, callback) {
|
|
195
|
+
hookRegistry_default.addColumnHook(normalizeModelName(model), column, callback);
|
|
196
|
+
}
|
|
197
|
+
function afterUpsert(model, callback) {
|
|
198
|
+
hookRegistry_default.addHook(normalizeModelName(model), "upsert", "after", callback);
|
|
199
|
+
}
|
|
200
|
+
export {
|
|
201
|
+
afterChange,
|
|
202
|
+
afterCreate,
|
|
203
|
+
afterDelete,
|
|
204
|
+
afterUpdate,
|
|
205
|
+
afterUpsert,
|
|
206
|
+
beforeCreate,
|
|
207
|
+
beforeDelete,
|
|
208
|
+
beforeUpdate
|
|
209
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/generated.ts
|
|
21
|
+
var generated_exports = {};
|
|
22
|
+
__export(generated_exports, {
|
|
23
|
+
DB: () => DB
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(generated_exports);
|
|
26
|
+
var DB = class {
|
|
27
|
+
};
|
|
28
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
29
|
+
0 && (module.exports = {
|
|
30
|
+
DB
|
|
31
|
+
});
|