semola 0.5.4 → 0.6.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.
Files changed (50) hide show
  1. package/README.md +35 -50
  2. package/dist/lib/api/index.cjs +1 -523
  3. package/dist/lib/api/index.d.cts +1 -271
  4. package/dist/lib/api/index.d.mts +80 -84
  5. package/dist/lib/api/index.mjs +1 -521
  6. package/dist/lib/cache/index.cjs +1 -74
  7. package/dist/lib/cache/index.d.cts +1 -48
  8. package/dist/lib/cache/index.d.mts +3 -24
  9. package/dist/lib/cache/index.mjs +1 -73
  10. package/dist/lib/cron/index.cjs +1 -735
  11. package/dist/lib/cron/index.d.cts +1 -146
  12. package/dist/lib/cron/index.d.mts +99 -36
  13. package/dist/lib/cron/index.mjs +1 -726
  14. package/dist/lib/errors/index.cjs +1 -30
  15. package/dist/lib/errors/index.d.cts +1 -2
  16. package/dist/lib/errors/index.d.mts +12 -1
  17. package/dist/lib/errors/index.mjs +1 -26
  18. package/dist/lib/i18n/index.cjs +1 -42
  19. package/dist/lib/i18n/index.d.cts +1 -28
  20. package/dist/lib/i18n/index.mjs +1 -41
  21. package/dist/lib/logging/index.cjs +1 -387
  22. package/dist/lib/logging/index.d.cts +1 -108
  23. package/dist/lib/logging/index.mjs +1 -374
  24. package/dist/lib/orm/index.cjs +1 -0
  25. package/dist/lib/orm/index.d.cts +1 -0
  26. package/dist/lib/orm/index.d.mts +404 -0
  27. package/dist/lib/orm/index.mjs +1 -0
  28. package/dist/lib/policy/index.cjs +1 -285
  29. package/dist/lib/policy/index.d.cts +1 -77
  30. package/dist/lib/policy/index.mjs +1 -265
  31. package/dist/lib/prompts/index.cjs +6 -769
  32. package/dist/lib/prompts/index.d.cts +1 -96
  33. package/dist/lib/prompts/index.d.mts +12 -33
  34. package/dist/lib/prompts/index.mjs +6 -763
  35. package/dist/lib/pubsub/index.cjs +1 -117
  36. package/dist/lib/pubsub/index.d.cts +1 -41
  37. package/dist/lib/pubsub/index.d.mts +3 -18
  38. package/dist/lib/pubsub/index.mjs +1 -116
  39. package/dist/lib/queue/index.cjs +1 -182
  40. package/dist/lib/queue/index.d.cts +1 -74
  41. package/dist/lib/queue/index.d.mts +11 -4
  42. package/dist/lib/queue/index.mjs +1 -181
  43. package/dist/lib/workflow/index.cjs +1 -534
  44. package/dist/lib/workflow/index.d.cts +1 -85
  45. package/dist/lib/workflow/index.d.mts +76 -11
  46. package/dist/lib/workflow/index.mjs +1 -533
  47. package/dist/rolldown-runtime-CMqjfN_6.cjs +1 -0
  48. package/package.json +17 -5
  49. package/dist/index-BhGNDjPq.d.mts +0 -13
  50. package/dist/index-DxSbeGP-.d.cts +0 -13
@@ -1,108 +1 @@
1
- //#region src/lib/logging/core/types.d.ts
2
- declare const LogLevel: {
3
- readonly debug: 10;
4
- readonly info: 20;
5
- readonly warning: 30;
6
- readonly error: 40;
7
- readonly critical: 50;
8
- };
9
- type LogLevelType = keyof typeof LogLevel;
10
- type LogMessageType = string | object | number | boolean;
11
- type LogDataType = {
12
- prefix: string;
13
- level: LogLevelType;
14
- msg: LogMessageType;
15
- row?: string;
16
- column?: string;
17
- fileName?: string;
18
- method?: string;
19
- };
20
- //#endregion
21
- //#region src/lib/logging/formatter/types.d.ts
22
- type DateFmtFnType = () => string;
23
- //#endregion
24
- //#region src/lib/logging/formatter/index.d.ts
25
- declare abstract class Formatter {
26
- protected dateFmt: DateFmtFnType;
27
- constructor(dateFmt: DateFmtFnType);
28
- abstract format(logData: LogDataType): string;
29
- abstract formatError(logData: LogDataType, error: Error): string;
30
- }
31
- declare class BaseFormatter extends Formatter {
32
- constructor(dateFmt?: DateFmtFnType);
33
- format(logData: LogDataType): string;
34
- formatError(logData: LogDataType, error: Error): string;
35
- }
36
- declare class JSONFormatter extends Formatter {
37
- constructor(dateFmt?: DateFmtFnType);
38
- format(logData: LogDataType): string;
39
- formatError(logData: LogDataType, error: Error): string;
40
- }
41
- declare function isoDateTimeFormat(): string;
42
- declare function isoDateFormat(): string;
43
- declare function dmyFormat(): string;
44
- declare function mdyFormat(): string;
45
- //#endregion
46
- //#region src/lib/logging/provider/types.d.ts
47
- type ProviderOptions = {
48
- level?: LogLevelType;
49
- formatter?: Formatter;
50
- };
51
- interface SizeBasedPolicyType {
52
- type: "size";
53
- maxSize?: number;
54
- }
55
- interface TimeBasedPolicyType {
56
- type: "time";
57
- instant: "hour" | "day" | "week" | "month";
58
- duration: number;
59
- }
60
- type FileProviderOptions = ProviderOptions & {
61
- policy?: SizeBasedPolicyType | TimeBasedPolicyType;
62
- };
63
- //#endregion
64
- //#region src/lib/logging/provider/index.d.ts
65
- declare abstract class LoggerProvider {
66
- protected options: ProviderOptions;
67
- constructor(options?: ProviderOptions);
68
- abstract execute(data: LogDataType): void;
69
- getLogLevel(): number;
70
- }
71
- declare class FileProvider extends LoggerProvider {
72
- private readonly filePath;
73
- private counter;
74
- private file;
75
- private policy?;
76
- constructor(file: string, options?: FileProviderOptions);
77
- execute(data: LogDataType): void;
78
- private canRollFile;
79
- private getFileSize;
80
- private isJSONFile;
81
- private createNewFileName;
82
- }
83
- declare class ConsoleProvider extends LoggerProvider {
84
- execute(data: LogDataType): void;
85
- }
86
- //#endregion
87
- //#region src/lib/logging/core/index.d.ts
88
- declare abstract class AbstractLogger {
89
- protected providers: LoggerProvider[];
90
- protected prefix: string;
91
- constructor(prefix: string, providers: [LoggerProvider, ...LoggerProvider[]]);
92
- abstract debug(msg: LogMessageType): void;
93
- abstract info(msg: LogMessageType): void;
94
- abstract warning(msg: LogMessageType): void;
95
- abstract error(msg: LogMessageType): void;
96
- abstract critical(msg: LogMessageType): void;
97
- protected createLogData(level: LogLevelType, msg: LogMessageType, prefix: string): LogDataType;
98
- }
99
- declare class Logger extends AbstractLogger {
100
- debug(msg: LogMessageType): void;
101
- info(msg: LogMessageType): void;
102
- warning(msg: LogMessageType): void;
103
- error(msg: LogMessageType): void;
104
- critical(msg: LogMessageType): void;
105
- private run;
106
- }
107
- //#endregion
108
- export { AbstractLogger, BaseFormatter, ConsoleProvider, type DateFmtFnType, FileProvider, type FileProviderOptions, Formatter, JSONFormatter, type LogDataType, LogLevel, type LogLevelType, type LogMessageType, Logger, LoggerProvider, type ProviderOptions, type SizeBasedPolicyType, type TimeBasedPolicyType, dmyFormat, isoDateFormat, isoDateTimeFormat, mdyFormat };
1
+ export type * from './index.d.mts'
@@ -1,374 +1 @@
1
- import { mightThrowSync } from "../errors/index.mjs";
2
- import { basename, dirname, extname, join } from "node:path";
3
- import { appendFileSync, existsSync, mkdirSync, statSync } from "node:fs";
4
- //#region src/lib/logging/formatter/index.ts
5
- var Formatter = class {
6
- dateFmt;
7
- constructor(dateFmt) {
8
- this.dateFmt = dateFmt;
9
- }
10
- };
11
- var BaseFormatter = class extends Formatter {
12
- constructor(dateFmt = isoDateTimeFormat) {
13
- super(dateFmt);
14
- }
15
- format(logData) {
16
- let { prefix, level, msg, fileName, row, column, method } = logData;
17
- const timestamp = this.dateFmt();
18
- const levelType = level.toUpperCase();
19
- if (typeof msg === "object") msg = JSON.stringify(msg);
20
- const fileData = `${prefix}/${fileName}:${row}:${column}`;
21
- let header = `[${levelType}]`;
22
- if (method) header = `${header}\t[${method}]\t[${fileData}]`;
23
- else header = `${header}\t[${fileData}]`;
24
- return `${timestamp} ${header} : ${msg}`;
25
- }
26
- formatError(logData, error) {
27
- const { prefix, fileName, row, column, method } = logData;
28
- const timestamp = this.dateFmt();
29
- const fileData = `${prefix}/${fileName}:${row}:${column}`;
30
- let errorMsg = `Error name="${error.name}" Error message="${error.message}"`;
31
- let header = "[ERROR]";
32
- if (method) header = `${header}\t[${method}]\t[${fileData}]`;
33
- else header = `${header}\t[${fileData}]`;
34
- if (error.cause) errorMsg = `${errorMsg}\n\tError cause="${error.cause}"`;
35
- if (error.stack) errorMsg = `${errorMsg}\n\tStack trace="${error.stack}"`;
36
- return `${timestamp} ${header} : ${errorMsg}`;
37
- }
38
- };
39
- var JSONFormatter = class extends Formatter {
40
- constructor(dateFmt = isoDateTimeFormat) {
41
- super(dateFmt);
42
- }
43
- format(logData) {
44
- const { prefix, level, msg, fileName, row, column, method } = logData;
45
- const timestamp = this.dateFmt();
46
- const levelType = level.toUpperCase();
47
- let position = {};
48
- if (method) position = { method };
49
- position = {
50
- ...position,
51
- fileName,
52
- row,
53
- column
54
- };
55
- return JSON.stringify({
56
- timestamp,
57
- level: levelType,
58
- prefix,
59
- position,
60
- msg
61
- });
62
- }
63
- formatError(logData, error) {
64
- const { prefix, fileName, row, column, method } = logData;
65
- const timestamp = this.dateFmt();
66
- let errorMsg = {
67
- errorName: error.name,
68
- errorMessage: error.message
69
- };
70
- let position = {};
71
- if (method) position = { method };
72
- position = {
73
- ...position,
74
- fileName,
75
- row,
76
- column
77
- };
78
- if (error.cause) errorMsg = {
79
- ...errorMsg,
80
- errorCause: error.cause
81
- };
82
- if (error.stack) errorMsg = {
83
- ...errorMsg,
84
- stackTrace: error.stack
85
- };
86
- return JSON.stringify({
87
- timestamp,
88
- level: "ERROR",
89
- prefix,
90
- position,
91
- msg: errorMsg
92
- });
93
- }
94
- };
95
- function isoDateTimeFormat() {
96
- return (/* @__PURE__ */ new Date()).toISOString();
97
- }
98
- function isoDateFormat() {
99
- const date = isoDateTimeFormat().split("T")[0];
100
- if (!date) return "";
101
- return date;
102
- }
103
- function dmyFormat() {
104
- const isoDate = isoDateFormat();
105
- if (!isoDate) return "";
106
- const info = isoDate.split("-");
107
- return `${info[2]}-${info[1]}-${info[0]}`;
108
- }
109
- function mdyFormat() {
110
- const isoDate = isoDateFormat();
111
- if (!isoDate) return "";
112
- const info = isoDate.split("-");
113
- return `${info[1]}-${info[2]}-${info[0]}`;
114
- }
115
- //#endregion
116
- //#region src/lib/logging/core/index.ts
117
- const PROVIDER_OPTION_DEFAULT = {
118
- formatter: new BaseFormatter(),
119
- level: "debug"
120
- };
121
- const STACK_FRAME_IDX = 1;
122
- var StackData = class {
123
- stack = [];
124
- constructor(fn) {
125
- const oldStackTrace = Error.prepareStackTrace;
126
- const [stackTraceError] = mightThrowSync(() => {
127
- Error.prepareStackTrace = (_, stack) => {
128
- return stack.map((callSite) => {
129
- return {
130
- fileName: callSite.getFileName(),
131
- column: callSite.getColumnNumber(),
132
- row: callSite.getLineNumber(),
133
- functionCall: callSite.getFunctionName()
134
- };
135
- });
136
- };
137
- Error.captureStackTrace(this, fn);
138
- this.stack;
139
- });
140
- Error.prepareStackTrace = oldStackTrace;
141
- if (stackTraceError) this.stack = [];
142
- }
143
- retrieveFrame() {
144
- if (this.stack.length === 0) return void 0;
145
- return this.stack[STACK_FRAME_IDX];
146
- }
147
- };
148
- var AbstractLogger = class {
149
- providers;
150
- prefix;
151
- constructor(prefix, providers) {
152
- this.prefix = prefix;
153
- this.providers = providers;
154
- }
155
- createLogData(level, msg, prefix) {
156
- const logCall = new StackData(this.createLogData).retrieveFrame();
157
- let logData = {
158
- level,
159
- msg,
160
- prefix
161
- };
162
- if (!logCall) return logData;
163
- const { column, fileName, functionCall, row } = logCall;
164
- if (fileName) logData = {
165
- ...logData,
166
- fileName: basename(fileName)
167
- };
168
- if (column) logData = {
169
- ...logData,
170
- column: String(column)
171
- };
172
- if (row) logData = {
173
- ...logData,
174
- row: String(row)
175
- };
176
- if (functionCall) logData = {
177
- ...logData,
178
- method: functionCall
179
- };
180
- return logData;
181
- }
182
- };
183
- var Logger = class extends AbstractLogger {
184
- debug(msg) {
185
- const data = this.createLogData("debug", msg, this.prefix);
186
- this.run(data);
187
- }
188
- info(msg) {
189
- const data = this.createLogData("info", msg, this.prefix);
190
- this.run(data);
191
- }
192
- warning(msg) {
193
- const data = this.createLogData("warning", msg, this.prefix);
194
- this.run(data);
195
- }
196
- error(msg) {
197
- const data = this.createLogData("error", msg, this.prefix);
198
- this.run(data);
199
- }
200
- critical(msg) {
201
- const data = this.createLogData("critical", msg, this.prefix);
202
- this.run(data);
203
- }
204
- run(data) {
205
- for (let i = 0; i < this.providers.length; i++) this.providers[i]?.execute(data);
206
- }
207
- };
208
- //#endregion
209
- //#region src/lib/logging/core/types.ts
210
- const LogLevel = {
211
- debug: 10,
212
- info: 20,
213
- warning: 30,
214
- error: 40,
215
- critical: 50
216
- };
217
- //#endregion
218
- //#region src/lib/logging/provider/index.ts
219
- const DEFAULT_MAX_SIZE = 4 * 1024;
220
- const DurationUnit = {
221
- hour: 1e3 * 60 * 60,
222
- day: 1e3 * 60 * 60 * 24,
223
- week: 1e3 * 60 * 60 * 24 * 7,
224
- month: 1e3 * 60 * 60 * 24 * 7 * 4.345
225
- };
226
- var LoggerProvider = class {
227
- options;
228
- constructor(options = PROVIDER_OPTION_DEFAULT) {
229
- this.options = {
230
- ...PROVIDER_OPTION_DEFAULT,
231
- ...options
232
- };
233
- }
234
- getLogLevel() {
235
- if (!this.options.level) return LogLevel.debug;
236
- return LogLevel[this.options.level];
237
- }
238
- };
239
- const FILE_PROVIDER_OPTION_DEFAULT = {
240
- ...PROVIDER_OPTION_DEFAULT,
241
- policy: { type: "size" }
242
- };
243
- var FileProvider = class extends LoggerProvider {
244
- filePath;
245
- counter;
246
- file;
247
- policy;
248
- constructor(file, options = FILE_PROVIDER_OPTION_DEFAULT) {
249
- super({
250
- formatter: options.formatter ?? PROVIDER_OPTION_DEFAULT.formatter,
251
- level: options.level ?? PROVIDER_OPTION_DEFAULT.level
252
- });
253
- this.policy = options.policy ?? FILE_PROVIDER_OPTION_DEFAULT.policy;
254
- this.filePath = file;
255
- this.counter = 0;
256
- this.file = this.createNewFileName();
257
- }
258
- execute(data) {
259
- if (this.getLogLevel() > LogLevel[data.level]) return;
260
- const [error, formattedMessage] = mightThrowSync(() => {
261
- if (this.isJSONFile()) return JSON.stringify({
262
- timestamp: isoDateTimeFormat(),
263
- level: data.level,
264
- message: data.msg
265
- });
266
- const { formatter } = this.options;
267
- return formatter?.format(data) ?? "";
268
- });
269
- const [fsError] = mightThrowSync(() => {
270
- if (error && error instanceof Error) {
271
- const { formatter } = this.options;
272
- const errorMsg = formatter?.formatError(data, error);
273
- appendFileSync(this.file, `${errorMsg}\n`);
274
- }
275
- if (this.canRollFile()) {
276
- this.counter += 1;
277
- this.file = this.createNewFileName();
278
- }
279
- if (error || !formattedMessage) return;
280
- appendFileSync(this.file, `${formattedMessage}\n`);
281
- });
282
- if (fsError && fsError instanceof Error) throw fsError;
283
- }
284
- canRollFile() {
285
- if (!this.policy) return false;
286
- switch (this.policy.type) {
287
- case "size":
288
- if (this.policy.maxSize) return this.getFileSize() >= this.policy.maxSize;
289
- return this.getFileSize() >= DEFAULT_MAX_SIZE;
290
- case "time": {
291
- if (!existsSync(this.file)) return false;
292
- const { duration, instant } = this.policy;
293
- const { birthtime } = statSync(this.file);
294
- const creationTimeMs = birthtime.getTime();
295
- const currenTimeMs = Date.now();
296
- const diffMs = currenTimeMs - creationTimeMs;
297
- switch (instant) {
298
- case "hour": return Math.floor(diffMs / DurationUnit.hour) >= duration;
299
- case "day": return Math.floor(diffMs / DurationUnit.day) >= duration;
300
- case "week": return Math.floor(diffMs / DurationUnit.week) >= duration;
301
- case "month": {
302
- const currentDate = new Date(currenTimeMs);
303
- const monthsDiff = (currentDate.getFullYear() - birthtime.getFullYear()) * 12 + (currentDate.getMonth() - birthtime.getMonth());
304
- return (currentDate.getDate() >= birthtime.getDate() ? monthsDiff : monthsDiff - 1) >= duration;
305
- }
306
- }
307
- }
308
- }
309
- }
310
- getFileSize() {
311
- if (!existsSync(this.file)) return 0;
312
- const [statError, size] = mightThrowSync(() => {
313
- const { size } = statSync(this.file);
314
- return size;
315
- });
316
- if (statError && statError instanceof Error) return 0;
317
- if (!size) return 0;
318
- return size;
319
- }
320
- isJSONFile() {
321
- return extname(this.filePath) === ".json";
322
- }
323
- createNewFileName() {
324
- const fileName = basename(this.filePath);
325
- const directory = dirname(this.filePath);
326
- if (!existsSync(directory)) mkdirSync(directory, { recursive: true });
327
- const fileInfo = fileName.split(".");
328
- const extension = fileInfo.pop();
329
- return join(directory, [
330
- ...fileInfo,
331
- this.counter,
332
- extension
333
- ].join("."));
334
- }
335
- };
336
- var ConsoleProvider = class extends LoggerProvider {
337
- execute(data) {
338
- const level = this.getLogLevel();
339
- const userLevel = LogLevel[data.level];
340
- if (level > userLevel) return;
341
- const [error, formattedMessage] = mightThrowSync(() => {
342
- const { formatter } = this.options;
343
- return formatter?.format(data) ?? "";
344
- });
345
- if (error && error instanceof Error) {
346
- const { formatter } = this.options;
347
- console.error(formatter?.formatError(data, error));
348
- return;
349
- }
350
- if (!formattedMessage) return;
351
- switch (userLevel) {
352
- case LogLevel.debug:
353
- console.debug(formattedMessage);
354
- break;
355
- case LogLevel.info:
356
- console.info(formattedMessage);
357
- break;
358
- case LogLevel.warning:
359
- console.warn(formattedMessage);
360
- break;
361
- case LogLevel.error:
362
- console.error(formattedMessage);
363
- break;
364
- case LogLevel.critical:
365
- console.error(formattedMessage);
366
- break;
367
- default:
368
- console.debug(formattedMessage);
369
- break;
370
- }
371
- }
372
- };
373
- //#endregion
374
- export { AbstractLogger, BaseFormatter, ConsoleProvider, FileProvider, Formatter, JSONFormatter, LogLevel, Logger, LoggerProvider, dmyFormat, isoDateFormat, isoDateTimeFormat, mdyFormat };
1
+ import{mightThrowSync as e}from"../errors/index.mjs";import{basename as t,dirname as n,extname as r,join as i}from"node:path";import{appendFileSync as a,existsSync as o,mkdirSync as s,statSync as c}from"node:fs";var l=class{dateFmt;constructor(e){this.dateFmt=e}},u=class extends l{constructor(e=f){super(e)}format(e){let{prefix:t,level:n,msg:r,fileName:i,row:a,column:o,method:s}=e,c=this.dateFmt(),l=n.toUpperCase();typeof r==`object`&&(r=JSON.stringify(r));let u=`${t}/${i}:${a}:${o}`,d=`[${l}]`;return d=s?`${d}\t[${s}]\t[${u}]`:`${d}\t[${u}]`,`${c} ${d} : ${r}`}formatError(e,t){let{prefix:n,fileName:r,row:i,column:a,method:o}=e,s=this.dateFmt(),c=`${n}/${r}:${i}:${a}`,l=`Error name="${t.name}" Error message="${t.message}"`,u=`[ERROR]`;return u=o?`${u}\t[${o}]\t[${c}]`:`${u}\t[${c}]`,t.cause&&(l=`${l}\n\tError cause="${t.cause}"`),t.stack&&(l=`${l}\n\tStack trace="${t.stack}"`),`${s} ${u} : ${l}`}},d=class extends l{constructor(e=f){super(e)}format(e){let{prefix:t,level:n,msg:r,fileName:i,row:a,column:o,method:s}=e,c=this.dateFmt(),l=n.toUpperCase(),u={};return s&&(u={method:s}),u={...u,fileName:i,row:a,column:o},JSON.stringify({timestamp:c,level:l,prefix:t,position:u,msg:r})}formatError(e,t){let{prefix:n,fileName:r,row:i,column:a,method:o}=e,s=this.dateFmt(),c={errorName:t.name,errorMessage:t.message},l={};return o&&(l={method:o}),l={...l,fileName:r,row:i,column:a},t.cause&&(c={...c,errorCause:t.cause}),t.stack&&(c={...c,stackTrace:t.stack}),JSON.stringify({timestamp:s,level:`ERROR`,prefix:n,position:l,msg:c})}};function f(){return new Date().toISOString()}function p(){return f().split(`T`)[0]||``}function m(){let e=p();if(!e)return``;let t=e.split(`-`);return`${t[2]}-${t[1]}-${t[0]}`}function h(){let e=p();if(!e)return``;let t=e.split(`-`);return`${t[1]}-${t[2]}-${t[0]}`}const g={formatter:new u,level:`debug`};var _=class{stack=[];constructor(t){let n=Error.prepareStackTrace,[r]=e(()=>{Error.prepareStackTrace=(e,t)=>t.map(e=>({fileName:e.getFileName(),column:e.getColumnNumber(),row:e.getLineNumber(),functionCall:e.getFunctionName()})),Error.captureStackTrace(this,t),this.stack});Error.prepareStackTrace=n,r&&(this.stack=[])}retrieveFrame(){if(this.stack.length!==0)return this.stack[1]}},v=class{providers;prefix;constructor(e,t){this.prefix=e,this.providers=t}createLogData(e,n,r){let i=new _(this.createLogData).retrieveFrame(),a={level:e,msg:n,prefix:r};if(!i)return a;let{column:o,fileName:s,functionCall:c,row:l}=i;return s&&(a={...a,fileName:t(s)}),o&&(a={...a,column:String(o)}),l&&(a={...a,row:String(l)}),c&&(a={...a,method:c}),a}},y=class extends v{debug(e){let t=this.createLogData(`debug`,e,this.prefix);this.run(t)}info(e){let t=this.createLogData(`info`,e,this.prefix);this.run(t)}warning(e){let t=this.createLogData(`warning`,e,this.prefix);this.run(t)}error(e){let t=this.createLogData(`error`,e,this.prefix);this.run(t)}critical(e){let t=this.createLogData(`critical`,e,this.prefix);this.run(t)}run(e){for(let t=0;t<this.providers.length;t++)this.providers[t]?.execute(e)}};const b={debug:10,info:20,warning:30,error:40,critical:50},x={hour:1e3*60*60,day:1e3*60*60*24,week:1e3*60*60*24*7,month:1e3*60*60*24*7*4.345};var S=class{options;constructor(e=g){this.options={...g,...e}}getLogLevel(){return this.options.level?b[this.options.level]:b.debug}};const C={...g,policy:{type:`size`}};var w=class extends S{filePath;counter;file;policy;constructor(e,t=C){super({formatter:t.formatter??g.formatter,level:t.level??g.level}),this.policy=t.policy??C.policy,this.filePath=e,this.counter=0,this.file=this.createNewFileName()}execute(t){if(this.getLogLevel()>b[t.level])return;let[n,r]=e(()=>{if(this.isJSONFile())return JSON.stringify({timestamp:f(),level:t.level,message:t.msg});let{formatter:e}=this.options;return e?.format(t)??``}),[i]=e(()=>{if(n&&n instanceof Error){let{formatter:e}=this.options,r=e?.formatError(t,n);a(this.file,`${r}\n`)}this.canRollFile()&&(this.counter+=1,this.file=this.createNewFileName()),!(n||!r)&&a(this.file,`${r}\n`)});if(i&&i instanceof Error)throw i}canRollFile(){if(!this.policy)return!1;switch(this.policy.type){case`size`:return this.policy.maxSize?this.getFileSize()>=this.policy.maxSize:this.getFileSize()>=4096;case`time`:{if(!o(this.file))return!1;let{duration:e,instant:t}=this.policy,{birthtime:n}=c(this.file),r=n.getTime(),i=Date.now(),a=i-r;switch(t){case`hour`:return Math.floor(a/x.hour)>=e;case`day`:return Math.floor(a/x.day)>=e;case`week`:return Math.floor(a/x.week)>=e;case`month`:{let t=new Date(i),r=(t.getFullYear()-n.getFullYear())*12+(t.getMonth()-n.getMonth());return(t.getDate()>=n.getDate()?r:r-1)>=e}}}}}getFileSize(){if(!o(this.file))return 0;let[t,n]=e(()=>{let{size:e}=c(this.file);return e});return t&&t instanceof Error||!n?0:n}isJSONFile(){return r(this.filePath)===`.json`}createNewFileName(){let e=t(this.filePath),r=n(this.filePath);o(r)||s(r,{recursive:!0});let a=e.split(`.`),c=a.pop();return i(r,[...a,this.counter,c].join(`.`))}},T=class extends S{execute(t){let n=this.getLogLevel(),r=b[t.level];if(n>r)return;let[i,a]=e(()=>{let{formatter:e}=this.options;return e?.format(t)??``});if(i&&i instanceof Error){let{formatter:e}=this.options;console.error(e?.formatError(t,i));return}if(a)switch(r){case b.debug:console.debug(a);break;case b.info:console.info(a);break;case b.warning:console.warn(a);break;case b.error:console.error(a);break;case b.critical:console.error(a);break;default:console.debug(a);break}}};export{v as AbstractLogger,u as BaseFormatter,T as ConsoleProvider,w as FileProvider,l as Formatter,d as JSONFormatter,b as LogLevel,y as Logger,S as LoggerProvider,m as dmyFormat,p as isoDateFormat,f as isoDateTimeFormat,h as mdyFormat};
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=t=>{let n=()=>e({...t,_meta:{...t._meta,isNullable:!1,isPrimaryKey:!0}}),r=()=>e({...t,_meta:{...t._meta,isNullable:!1}}),i=(()=>t._meta.isPrimaryKey?e({...t,_meta:{...t._meta,isNullable:!1}}):e({...t,_meta:{...t._meta,isNullable:!0}})),a=()=>e({...t,_meta:{...t._meta,isUnique:!0}}),o=n=>e({...t,_meta:{...t._meta,hasDefault:!0},_default:n}),s=n=>e({...t,references:{tableColumn:n}});return s.tableColumn=t.references?.tableColumn,{...t,primaryKey:n,notNull:r,nullable:i,unique:a,default:o,references:s}},t=(t,n,r)=>e({sqlName:t,type:n,enumValues:r,_meta:{isNullable:!0,isPrimaryKey:!1,isUnique:!1,hasDefault:!1}}),n=e=>t(e,`string`),r=e=>n(e),i=e=>t(e,`number`),a=e=>t(e,`boolean`),o=e=>t(e,`date`),s=(e,n)=>t(e,`enum`,n),c=e=>t(e,`json`),l=e=>t(e,`jsonb`);var u=class{tableName;table;constructor(e,t){this.tableName=e,this.table=t}shouldSkip(e){return e?.$skipHooks===!0}stripSkipHooks(e){let{$skipHooks:t,...n}=e;return n}toHookOptions(e){if(e)return this.stripSkipHooks(e)}async withReadHooks(e){let t={tableName:this.tableName,table:this.table,options:e.hookOptions};e.skipHooks||await this.runReadHooks(e.beforeGlobal,e.beforeTable,t);let n=await e.query();return e.skipHooks||await this.runReadHooks(e.afterGlobal,e.afterTable,{...t,result:n}),n}async runReadHooks(e,t,n){await this.runHook(e,n),await this.runHook(t,n)}async runHook(e,t){await e?.(t)}};const d=e=>{let{tables:t,...n}=e;return n},f=e=>(e=e.replaceAll(`"`,`""`),`"${e}"`),p=new class{resolveHasMany(e,t){let n=Object.values(e.columns),r=[];for(let[,e]of Object.entries(t.columns)){if(!e.references)continue;let t=e.references.tableColumn;if(!t)continue;let i=t();n.some(e=>e===i)&&r.push({fk:e,source:i})}if(r.length>1)throw Error(`Ambiguous hasMany foreign key from ${t.sqlName} to ${e.sqlName}`);let[i]=r;if(!i)throw Error(`Missing hasMany foreign key from ${t.sqlName} to ${e.sqlName}`);return i}resolveHasOne(e){let{sourceTable:t,relationTable:n,relationForeignKey:r}=e,i=t.columns[r];if(!i)throw Error(`Missing hasOne foreign key column ${r} on ${t.sqlName}`);if(!i.references?.tableColumn)throw Error(`Column ${r} on ${t.sqlName} is not a foreign key - call .references() on it`);let a=i.references.tableColumn();if(!Object.values(n.columns).some(e=>e===a))throw Error(`Column ${r} on ${t.sqlName} does not reference ${n.sqlName}`);return{localForeignKey:i,target:a}}},m=new class{buildColumns(e,t){if(!t||Object.keys(t).length===0)return Object.entries(e.columns).map(([e,t])=>this.getColumnAlias(t.sqlName,e)).join(`, `);let n=[],r=Object.entries(t).filter(([,e])=>e===!0).map(([e])=>e);if(!r.length)throw Error(`select must include at least one selected column on table ${e.sqlName}`);for(let t of r){let r=e.columns[t];if(!r)throw Error(`Unknown select key "${t}" on table ${e.sqlName}`);n.push(this.getColumnAlias(r.sqlName,t))}return n.join(`, `)}buildList(e,t){return t.sql?`${e}, ${t.sql}`:e}buildOrderBy(e,t){if(!t)return``;let n=[];for(let[r,i]of Object.entries(t)){let t=e.columns[r];if(!t)throw Error(`Unknown orderBy key "${r}" on table ${e.sqlName}`);if(i===`desc`){n.push(`${f(t.sqlName)} DESC`);continue}if(i===`asc`){n.push(`${f(t.sqlName)} ASC`);continue}throw Error(`Unknown orderBy direction "${i}" for key "${r}" on table ${e.sqlName}`)}return n.length?n.join(`, `):``}buildPagination(e,t,n,r){let i=[];if(n===void 0){if(r===void 0)return{sql:``,params:i};let n=t();return i.push(r),{sql:`${e.unlimitedOffsetKeyword} ${n}`,params:i}}let a=t();if(i.push(n),r===void 0)return{sql:`LIMIT ${a}`,params:i};let o=t();return i.push(r),{sql:`LIMIT ${a} OFFSET ${o}`,params:i}}buildStatement(e){let{tableName:t,columns:n,where:r,orderBy:i,pagination:a}=e,o=`SELECT ${n} FROM ${t}`;return r&&(o=`${o} WHERE ${r}`),i&&(o=`${o} ORDER BY ${i}`),a&&(o=`${o} ${a}`),o}getColumnAlias(e,t){return`${f(e)} AS ${f(t)}`}},h=e=>e instanceof Date?e.toISOString():e,g=(e,t)=>e.type!==`json`&&e.type!==`jsonb`?h(t):t===null?t:t===void 0?null:JSON.stringify(t),_=(e,t)=>t===void 0?e._default?e._default():null:t,v=(e,t)=>{let n=Object.entries(t).filter(([,e])=>e!==void 0);if(!n.map(([e])=>e).length)throw Error(`findUnique requires at least one where key`);let r=!1;for(let[t,i]of n){let n=e.columns[t];if(!n)throw Error(`Unknown where key ${t} on table ${e.sqlName}`);if(n._meta.isPrimaryKey||n._meta.isUnique){if(i===null)throw Error(`findUnique where key "${t}" must be non-null on table ${e.sqlName}`);r=!0}}if(!r)throw Error(`findUnique where must include at least one unique or primary key column`)},y=e=>{let{nextPlaceholder:t,table:n,data:r}=e,i=[],a=[];for(let[e,o]of Object.entries(r)){if(o===void 0)continue;let r=n.columns[e];if(!r)throw Error(`Unknown data key "${e}" on table ${n.sqlName}`);i.push(`${f(r.sqlName)} = ${t()}`),a.push(g(r,o))}return{setClauses:i,params:a}},b=`(1 = 0)`,x=`(1 = 1)`,S=[`every`,`some`,`none`],C=e=>h(`${h(e)}`.replaceAll(`\\`,`\\\\`).replaceAll(`%`,`\\%`).replaceAll(`_`,`\\_`)),w={equals:{sql:e=>`= ${e}`,transform:e=>h(e)},gt:{sql:e=>`> ${e}`,transform:e=>h(e)},gte:{sql:e=>`>= ${e}`,transform:e=>h(e)},lt:{sql:e=>`< ${e}`,transform:e=>h(e)},lte:{sql:e=>`<= ${e}`,transform:e=>h(e)},startsWith:{sql:e=>`LIKE ${e} ESCAPE '\\'`,transform:e=>h(`${C(e)}%`)},endsWith:{sql:e=>`LIKE ${e} ESCAPE '\\'`,transform:e=>h(`%${C(e)}`)},contains:{sql:e=>`LIKE ${e} ESCAPE '\\'`,transform:e=>h(`%${C(e)}%`)}},T=e=>{if(typeof e!=`object`||!e||Array.isArray(e)||e instanceof Date)return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype};var E=class e{table;relations;parentAlias;nextPlaceholder;clauses=[];params=[];constructor(e,t,n,r){this.table=e,this.relations=t,this.parentAlias=n,this.nextPlaceholder=r}static from(t){return new e(t.table,t.relations,t.parentAlias,t.nextPlaceholder).build(t.where)}build(e){if(!e)return{sql:``,params:[]};for(let[t,n]of Object.entries(e)){if(n===void 0)continue;let e=this.getLogicalWhereKey(t);if(e){this.appendLogical(e,n);continue}let r=this.relations?.[t];if(r&&this.isRelationFilterValue(n)){this.appendRelation({relation:r,relationName:t,value:n,parentAlias:this.parentAlias??f(this.table.sqlName)});continue}this.appendField(t,n)}return{sql:this.clauses.join(` AND `),params:this.params}}appendField(e,t){if(!(e in this.table.columns))throw Error(`Unknown where key "${e}" on table ${this.table.sqlName}`);let n=this.table.columns[e];if(!n)throw Error(`Unknown where key "${e}" on table ${this.table.sqlName}`);let r=f(n.sqlName);if(!T(t)){this.appendDirect(n,r,t);return}this.appendOperators(n,r,e,t)}appendDirect(e,t,n){if(n===null){this.clauses.push(`${t} IS NULL`);return}this.clauses.push(`${t} = ${this.nextPlaceholder()}`),this.params.push(g(e,n))}appendOperators(e,t,n,r){let i=Object.entries(r);if(!i.length)throw Error(`Missing where operator for field ${n}`);for(let[r,a]of i){if(r===`in`||r===`notIn`){this.appendInOperator(e,t,n,r,a);continue}if(r===`between`){this.appendBetweenOperator(e,t,n,a);continue}let i=w[r];if(!i)throw Error(`Unknown where operator: ${r} for field ${n}`);if(r===`equals`&&a===null){this.clauses.push(`${t} IS NULL`);continue}this.clauses.push(`${t} ${i.sql(this.nextPlaceholder())}`),this.params.push(i.transform(g(e,a)))}}appendInOperator(e,t,n,r,i){if(!Array.isArray(i))throw Error(`Expected array for where operator: ${r} for field ${n}`);if(r===`in`&&i.length===0){this.clauses.push(b);return}if(r===`notIn`&&i.length===0)return;let a=i.map(()=>this.nextPlaceholder()),o=r===`in`?`IN`:`NOT IN`;this.clauses.push(`${t} ${o} (${a.join(`, `)})`);for(let t of i)this.params.push(g(e,t))}appendBetweenOperator(e,t,n,r){if(!Array.isArray(r))throw Error(`Expected array for where operator: between for field ${n}`);if(r.length!==2)throw Error(`Expected 2-element array for where operator: between for field ${n}`);let[i,a]=r,o=this.nextPlaceholder(),s=this.nextPlaceholder();this.clauses.push(`${t} BETWEEN ${o} AND ${s}`),this.params.push(g(e,i),g(e,a))}appendLogical(e,t){let n=this.collectLogicalClauses(e,t);if(typeof n==`string`){this.clauses.push(n);return}if(!n.nestedClauses.length)return;if(this.params.push(...n.nestedParams),e===`$not`){let e=n.nestedClauses.map(e=>`NOT (${e})`).join(` AND `);this.clauses.push(e);return}let r=this.getLogicalOperator(e);this.clauses.push(`(${n.nestedClauses.join(` ${r} `)})`)}collectLogicalClauses(t,n){let r=this.getLogicalWhereValues(t,n),i=[],a=[];for(let n of r){if(!T(n))throw Error(`${t} where value must contain object filters`);let r=e.from({nextPlaceholder:this.nextPlaceholder,table:this.table,where:n,relations:this.relations,parentAlias:this.parentAlias});if(!r.sql){if(t===`$or`)return x;continue}i.push(`(${r.sql})`),a.push(...r.params)}return t===`$or`&&!i.length?b:{nestedClauses:i,nestedParams:a}}appendRelation(e){let t=this.parseRelationFilters(e.relationName,e.value);for(let n of t)this.appendRelationFilter({...e,...n})}appendRelationFilter(t){let n=t.relation._table,r=`where_${t.relationName}__${n.sqlName}`,i=this.buildRelationForeignKeyCondition({relation:t.relation,relationTable:n,relationAlias:r,parentAlias:t.parentAlias}),a=e.from({nextPlaceholder:this.nextPlaceholder,table:n,where:t.where}),o=a.sql?a.sql:x;this.params.push(...a.params);let s=`${f(n.sqlName)} AS ${r}`;if(t.key===`some`){this.clauses.push(`EXISTS (SELECT 1 FROM ${s} WHERE ${i} AND (${o}))`);return}if(t.key===`none`){this.clauses.push(`NOT EXISTS (SELECT 1 FROM ${s} WHERE ${i} AND (${o}))`);return}this.clauses.push(`NOT EXISTS (SELECT 1 FROM ${s} WHERE ${i} AND NOT (${o}))`)}buildRelationForeignKeyCondition(e){if(e.relation._type===`hasMany`){let{fk:t,source:n}=p.resolveHasMany(this.table,e.relationTable);return`${e.relationAlias}.${f(t.sqlName)} = ${e.parentAlias}.${f(n.sqlName)}`}if(e.relation._type!==`hasOne`)throw Error(`Expected hasOne relation`);let{localForeignKey:t,target:n}=p.resolveHasOne({sourceTable:this.table,relationTable:e.relationTable,relationForeignKey:e.relation._foreignKey});return`${e.relationAlias}.${f(n.sqlName)} = ${e.parentAlias}.${f(t.sqlName)}`}parseRelationFilters(e,t){if(!T(t))throw Error(`Relation where filter for ${e} must be an object`);let n=t,r=[];for(let e of S){if(!(e in n))continue;let t=n[e];if(!T(t))throw Error(`Relation where filter ${e} must be an object`);r.push({key:e,where:t})}let i=new Set(S),a=Object.keys(n).filter(e=>!i.has(e));if(a.length)throw Error(`Relation where filter for ${e} has unknown operators: ${a.join(`, `)}`);if(r.length===0)throw Error(`Relation where filter for ${e} must include at least one of every, some, or none`);return r}isRelationFilterValue(e){if(!T(e))return!1;let t=e;for(let e of S)if(e in t)return!0;return Object.keys(t).length===0}getLogicalWhereKey(e){return e===`$and`||e===`$not`||e===`$or`?e:null}getLogicalOperator(e){return e===`$or`?`OR`:`AND`}getLogicalWhereValues(e,t){if(e===`$or`&&!Array.isArray(t))throw Error(`$or where value must be an array`);return Array.isArray(t)?t:[t]}};const D={sql:``,params:[],descriptors:[]},O=new class{build(e){let{table:t,parentAlias:n,relations:r,tableRelationsMap:i,include:a}=e;if(!a)return D;let o=Object.entries(a).filter(([,e])=>!!e);if(!o.length)return D;let s=[],c=[],l=[];for(let[a,u]of o){let o=r[a];if(!o)throw Error(`Unknown relation ${a} on table ${t.sqlName}`);let d=this.buildSubquery({spec:e.spec,nextPlaceholder:e.nextPlaceholder,parentTable:t,parentAlias:n,relation:o,relationName:a,includeValue:u,tableRelationsMap:i});s.push(`${d.sql} AS ${f(a)}`),c.push(...d.params),l.push(d.descriptor)}return{sql:s.join(`, `),params:c,descriptors:l}}buildSubquery(e){if(e.includeValue!==!0&&!this.isRelationIncludeOptions(e.includeValue))throw Error(`Invalid include options for relation ${e.relationName} on table ${e.parentTable.sqlName}`);let t=this.getRelationOptions(e.includeValue),n=e.relation._table,r=`${e.relationName}__${n.sqlName}`,i=this.buildNestedPairs({...e,relationTable:n,relationAlias:r,options:t}),a=this.buildJsonObject({spec:e.spec,alias:r,table:n,extraPairs:i.nestedExtraPairs,select:t.select}),o=E.from({nextPlaceholder:e.nextPlaceholder,table:n,where:t.where}),s=m.buildOrderBy(n,t.orderBy),c=m.buildPagination(e.spec,e.nextPlaceholder,t.take,t.skip),l=[...i.nestedParams,...o.params,...c.params];return e.relation._type===`hasMany`?this.buildHasManySubquery({...e,relationTable:n,relationAlias:r,jsonObj:a,nestedDescriptors:i.nestedDescriptors,whereSql:o.sql,orderBy:s,paginationSql:c.sql,allParams:l}):this.buildHasOneSubquery({...e,relationTable:n,relationAlias:r,jsonObj:a,nestedDescriptors:i.nestedDescriptors,whereSql:o.sql,allParams:l})}buildNestedPairs(e){let t=e.tableRelationsMap.get(e.relationTable)??{},n=[],r=[],i=[];if(!e.options.include)return{nestedExtraPairs:n,nestedParams:r,nestedDescriptors:i};for(let[a,o]of Object.entries(e.options.include)){if(!o)continue;let s=t[a];if(!s)throw Error(`Unknown relation ${a} on table ${e.relationTable.sqlName}`);let c=this.buildSubquery({spec:e.spec,nextPlaceholder:e.nextPlaceholder,parentTable:e.relationTable,parentAlias:e.relationAlias,relation:s,relationName:a,includeValue:o,tableRelationsMap:e.tableRelationsMap});n.push(`'${a}'`,c.sql),r.push(...c.params),i.push(c.descriptor)}return{nestedExtraPairs:n,nestedParams:r,nestedDescriptors:i}}buildJsonObject(e){let t=Object.entries(e.table.columns),n=e.select!==void 0&&Object.keys(e.select).length>0,r=t;if(n){let n=e.select??{};for(let t of Object.keys(n))if(!(t in e.table.columns))throw Error(`Unknown select key "${t}" on table ${e.table.sqlName}`);r=t.filter(([e])=>e in n)}let i=r.flatMap(([t,n])=>[`'${t}'`,`${e.alias}.${f(n.sqlName)}`]),a=e.extraPairs??[];return`${e.spec.jsonObjectFunctionName}(${[...i,...a].join(`, `)})`}buildHasManySubquery(e){let{fk:t,source:n}=p.resolveHasMany(e.parentTable,e.relationTable),r=`${e.relationAlias}.${f(t.sqlName)} = ${e.parentAlias}.${f(n.sqlName)}`,i=this.joinWhereSql(r,e.whereSql);return{sql:`COALESCE((${this.buildNestedHasManyQuery({spec:e.spec,relationTable:e.relationTable,relationAlias:e.relationAlias,whereSql:i,orderBy:e.orderBy,paginationSql:e.paginationSql,jsonObj:e.jsonObj})}), ${e.spec.emptyJsonArrayLiteral})`,params:e.allParams,descriptor:{name:e.relationName,type:`hasMany`,table:e.relationTable,nested:e.nestedDescriptors}}}buildHasOneSubquery(e){if(e.relation._type!==`hasOne`)throw Error(`Expected hasOne relation for ${e.relationName}`);let{localForeignKey:t,target:n}=p.resolveHasOne({sourceTable:e.parentTable,relationTable:e.relationTable,relationForeignKey:e.relation._foreignKey}),r=`${e.relationAlias}.${f(n.sqlName)} = ${e.parentAlias}.${f(t.sqlName)}`,i=this.joinWhereSql(r,e.whereSql);return{sql:`(${`SELECT ${e.jsonObj} FROM ${f(e.relationTable.sqlName)} AS ${e.relationAlias} WHERE ${i} LIMIT 1`})`,params:e.allParams,descriptor:{name:e.relationName,type:`hasOne`,table:e.relationTable,nested:e.nestedDescriptors}}}buildNestedHasManyQuery(e){if(!e.orderBy&&!e.paginationSql)return`SELECT ${e.spec.jsonArrayAggregateFunctionName}(${e.jsonObj}) FROM ${f(e.relationTable.sqlName)} AS ${e.relationAlias} WHERE ${e.whereSql}`;let t=`SELECT * FROM ${f(e.relationTable.sqlName)} AS ${e.relationAlias} WHERE ${e.whereSql}`;return e.orderBy&&(t=`${t} ORDER BY ${e.orderBy}`),e.paginationSql&&(t=`${t} ${e.paginationSql}`),`SELECT ${e.spec.jsonArrayAggregateFunctionName}(${e.jsonObj}) FROM (${t}) AS ${e.relationAlias}`}joinWhereSql(e,t){return t?`${e} AND ${t}`:e}isRelationIncludeOptions(e){return!(typeof e!=`object`||!e||Array.isArray(e))}getRelationOptions(e){let t={};return typeof e!=`object`||!e||Object.assign(t,e),t}};var k=class{spec;index=0;constructor(e){this.spec=e}next(){return this.index+=1,this.spec.formatPlaceholder(this.index)}asFn(){return()=>this.next()}},A=class{spec;table;relations;tableRelationsMap;constructor(e){this.spec=e.spec,this.table=e.table,this.relations=e.relations,this.tableRelationsMap=e.tableRelationsMap??new Map}buildFindMany(e){let t=new k(this.spec).asFn(),n=this.buildSelectIncludeWhere(t,{where:e?.where,select:e?.select,include:e?.include}),r=m.buildOrderBy(this.table,e?.orderBy),i=m.buildPagination(this.spec,t,e?.take,e?.skip),a=[...n.include.params,...n.where.params,...i.params];return{statement:m.buildStatement({tableName:f(this.table.sqlName),columns:n.selectColumns,where:n.where.sql,orderBy:r,pagination:i.sql}),params:a,includeDescriptors:n.include.descriptors}}buildFindFirst(e){return this.buildFindMany({...e,take:1})}buildFindUnique(e){v(this.table,e.where);let t=new k(this.spec).asFn(),n=this.buildSelectIncludeWhere(t,{where:e.where,select:e.select,include:e.include});return{statement:m.buildStatement({tableName:f(this.table.sqlName),columns:n.selectColumns,where:n.where.sql,orderBy:``,pagination:`LIMIT 1`}),params:[...n.include.params,...n.where.params],includeDescriptors:n.include.descriptors}}buildCreate(e){let t=new k(this.spec).asFn(),n=new Map(Object.entries(e.data)),r=[],i=[],a=[];for(let[e,o]of Object.entries(this.table.columns)){let s=_(o,n.get(e));r.push(f(o.sqlName)),i.push(t()),a.push(g(o,s))}let o=m.buildColumns(this.table,e.select),s=this.buildInclude(t,e.include),c=m.buildList(o,s);return{statement:`INSERT INTO ${f(this.table.sqlName)} (${r.join(`, `)}) VALUES (${i.join(`, `)}) RETURNING ${c}`,params:[...a,...s.params],includeDescriptors:s.descriptors}}buildUpdate(e){v(this.table,e.where);let t=new k(this.spec).asFn(),n=y({nextPlaceholder:t,table:this.table,data:e.data});if(!n.setClauses.length)throw Error(`update requires at least one field in data`);let r=this.buildWhereIncludeReturning(t,{where:e.where,select:e.select,include:e.include}),i=`UPDATE ${f(this.table.sqlName)} SET ${n.setClauses.join(`, `)}`;return r.where.sql&&(i=`${i} WHERE ${r.where.sql}`),i=`${i} RETURNING ${r.returning}`,n.params.push(...r.where.params,...r.include.params),{statement:i,params:n.params,includeDescriptors:r.include.descriptors}}buildDelete(e){v(this.table,e.where);let t=new k(this.spec).asFn(),n=this.buildWhereIncludeReturning(t,{where:e.where,select:e.select,include:e.include}),r=`DELETE FROM ${f(this.table.sqlName)}`;return n.where.sql&&(r=`${r} WHERE ${n.where.sql}`),r=`${r} RETURNING ${n.returning}`,{statement:r,params:[...n.where.params,...n.include.params],includeDescriptors:n.include.descriptors}}buildCreateMany(e){let t=new k(this.spec).asFn(),n=Object.entries(this.table.columns),r=n.map(([,e])=>f(e.sqlName)),i=[],a=[];for(let r of e.data){let e=r,o=[];for(let[r,a]of n){let n=_(a,e[r]);o.push(t()),i.push(g(a,n))}a.push(`(${o.join(`, `)})`)}let o=m.buildColumns(this.table,void 0);return{statement:`INSERT INTO ${f(this.table.sqlName)} (${r.join(`, `)}) VALUES ${a.join(`, `)} RETURNING ${o}`,params:i,includeDescriptors:[]}}buildUpdateMany(e){let t=new k(this.spec).asFn(),n=y({nextPlaceholder:t,table:this.table,data:e.data});if(!n.setClauses.length)throw Error(`updateMany requires at least one field in data`);let r=E.from({nextPlaceholder:t,table:this.table,where:e.where,relations:this.relations,parentAlias:f(this.table.sqlName)}),i=`UPDATE ${f(this.table.sqlName)} SET ${n.setClauses.join(`, `)}`;r.sql&&(i=`${i} WHERE ${r.sql}`),n.params.push(...r.params);let a=m.buildColumns(this.table,void 0);return i=`${i} RETURNING ${a}`,{statement:i,params:n.params,includeDescriptors:[]}}buildDeleteMany(e){let t=new k(this.spec).asFn(),n=E.from({nextPlaceholder:t,table:this.table,where:e.where,relations:this.relations,parentAlias:f(this.table.sqlName)}),r=`DELETE FROM ${f(this.table.sqlName)}`;n.sql&&(r=`${r} WHERE ${n.sql}`);let i=m.buildColumns(this.table,void 0);return r=`${r} RETURNING ${i}`,{statement:r,params:n.params,includeDescriptors:[]}}buildInclude(e,t){return O.build({spec:this.spec,nextPlaceholder:e,table:this.table,parentAlias:f(this.table.sqlName),relations:this.relations,tableRelationsMap:this.tableRelationsMap,include:t})}buildSelectIncludeWhere(e,t){let n=this.buildInclude(e,t.include),r=E.from({nextPlaceholder:e,table:this.table,where:t.where,relations:this.relations,parentAlias:f(this.table.sqlName)}),i=m.buildColumns(this.table,t.select);return{include:n,where:r,selectColumns:m.buildList(i,n)}}buildWhereIncludeReturning(e,t){let n=E.from({nextPlaceholder:e,table:this.table,where:t.where,relations:this.relations,parentAlias:f(this.table.sqlName)}),r=m.buildColumns(this.table,t.select),i=this.buildInclude(e,t.include);return{where:n,include:i,returning:m.buildList(r,i)}}},j=class{parseRows(e){let{table:t,rows:n,descriptors:r}=e,i=new Map;for(let e of n)this.coerceRow({row:e,table:t,descriptors:r,columnKeyCache:i})}async executeQuery(e,t,n){let r=[...await e.unsafe(n.statement,n.params)];return this.parseRows({table:t,rows:r,descriptors:n.includeDescriptors}),r}coerceRow(e){let{row:t,table:n,descriptors:r,columnKeyCache:i}=e;this.coerceColumnValues(t,n,i),this.coerceRelationValues(t,r,i)}coerceColumnValues(e,t,n){let{boolKeys:r,jsonKeys:i}=this.getCachedColumnKeysByType(t,n);for(let t of r)t in e&&(e[t]=this.coerceBooleanValue(e[t]));for(let t of i){if(!(t in e))continue;let n=e[t];typeof n==`string`&&(e[t]=JSON.parse(n))}}coerceRelationValues(e,t,n){for(let r of t)this.coerceRelationValue({row:e,descriptor:r,columnKeyCache:n})}coerceRelationValue(e){let{row:t,descriptor:n}=e,r=t[n.name];if(r===null){n.type===`hasMany`&&(t[n.name]=[]);return}let i=n.nested??[];if(typeof r==`string`){let a=JSON.parse(r);this.coerceRelationItems({value:a,table:n.table,nested:i,columnKeyCache:e.columnKeyCache}),t[n.name]=a;return}this.coerceRelationItems({value:r,table:n.table,nested:i,columnKeyCache:e.columnKeyCache})}coerceRelationItems(e){let{value:t,table:n,nested:r,columnKeyCache:i}=e;if(Array.isArray(t)){for(let e of t)typeof e==`object`&&e&&this.coerceRow({row:e,table:n,descriptors:r,columnKeyCache:i});return}typeof t==`object`&&t&&this.coerceRow({row:t,table:n,descriptors:r,columnKeyCache:i})}getCachedColumnKeysByType(e,t){let n=t.get(e);if(n)return n;let r=this.getColumnKeysByType(e);return t.set(e,r),r}coerceBooleanValue(e){return e==null?e:!!e}getColumnKeysByType(e){let t=new Set,n=new Set;for(let[r,i]of Object.entries(e.columns))i.type===`boolean`&&t.add(r),i.type===`json`&&n.add(r),i.type===`jsonb`&&n.add(r);return{boolKeys:t,jsonKeys:n}}},M=class{name;builder;parser=new j;constructor(e){this.name=e.spec.name,this.builder=new A(e)}async findMany(e,t){let n=this.builder.buildFindMany(t);return this.parser.executeQuery(e,this.builder.table,n)}async findFirst(e,t){let n=this.builder.buildFindFirst(t),[r]=await this.parser.executeQuery(e,this.builder.table,n);return r??null}async findUnique(e,t){let n=this.builder.buildFindUnique(t),[r]=await this.parser.executeQuery(e,this.builder.table,n);return r??null}async create(e,t){let n=this.builder.buildCreate(t);return this.executeOne(e,n,`insert`)}async createMany(e,t){if(!t.data.length)return[];let n=this.builder.buildCreateMany(t);return this.parser.executeQuery(e,this.builder.table,n)}async update(e,t){let n=this.builder.buildUpdate(t);return this.executeOne(e,n,`update`)}async updateMany(e,t){let n=this.builder.buildUpdateMany(t);return this.parser.executeQuery(e,this.builder.table,n)}async delete(e,t){let n=this.builder.buildDelete(t);return this.executeOne(e,n,`delete`)}async deleteMany(e,t){let n=this.builder.buildDeleteMany(t);return this.parser.executeQuery(e,this.builder.table,n)}async executeOne(e,t,n){let[r]=await this.parser.executeQuery(e,this.builder.table,t);if(!r)throw Error(`Record not found after ${n} on table ${this.builder.table.sqlName}`);return r}};const N={name:`postgres`,formatPlaceholder:e=>`$${e}`,unlimitedOffsetKeyword:`LIMIT ALL OFFSET`,jsonObjectFunctionName:`jsonb_build_object`,jsonArrayAggregateFunctionName:`jsonb_agg`,emptyJsonArrayLiteral:`'[]'::jsonb`},P={name:`sqlite`,formatPlaceholder:()=>`?`,unlimitedOffsetKeyword:`LIMIT -1 OFFSET`,jsonObjectFunctionName:`json_object`,jsonArrayAggregateFunctionName:`json_group_array`,emptyJsonArrayLiteral:`'[]'`},F=e=>{let t={...e,tableRelationsMap:e.tableRelationsMap??new Map};switch(e.adapter){case`sqlite`:return new M({spec:P,...t});case`postgres`:return new M({spec:N,...t});default:throw Error(`Unsupported adapter: ${e.adapter}`)}};var I=class{sql;dialect;hooks;tableName;table;globalHooks;tableHooks;constructor(e){this.sql=e.sql,this.tableName=e.tableName,this.table=e.table,this.globalHooks=e.globalHooks,this.tableHooks=e.tableHooks,this.dialect=F(e),this.hooks=new u(e.tableName,e.table)}findMany(e){let t=this.hooks.shouldSkip(e),n=this.hooks.toHookOptions(e);return this.hooks.withReadHooks({skipHooks:t,hookOptions:n,beforeGlobal:this.globalHooks?.beforeFindMany,beforeTable:this.tableHooks?.beforeFindMany,afterGlobal:this.globalHooks?.afterFindMany,afterTable:this.tableHooks?.afterFindMany,query:()=>this.dialect.findMany(this.sql,n)})}findFirst(e){let t=this.hooks.shouldSkip(e),n=this.hooks.toHookOptions(e);return this.hooks.withReadHooks({skipHooks:t,hookOptions:n,beforeGlobal:this.globalHooks?.beforeFindFirst,beforeTable:this.tableHooks?.beforeFindFirst,afterGlobal:this.globalHooks?.afterFindFirst,afterTable:this.tableHooks?.afterFindFirst,query:()=>this.dialect.findFirst(this.sql,n)})}findUnique(e){let t=this.hooks.shouldSkip(e),n=this.hooks.stripSkipHooks(e);return this.hooks.withReadHooks({skipHooks:t,hookOptions:n,beforeGlobal:this.globalHooks?.beforeFindUnique,beforeTable:this.tableHooks?.beforeFindUnique,afterGlobal:this.globalHooks?.afterFindUnique,afterTable:this.tableHooks?.afterFindUnique,query:()=>this.dialect.findUnique(this.sql,n)})}create(e){let t=this.hooks.shouldSkip(e),n=this.hooks.stripSkipHooks(e);return this.withMutationHooks({skipHooks:t,hookOptions:n,beforeGlobal:this.globalHooks?.beforeCreate,beforeTable:this.tableHooks?.beforeCreate,afterGlobal:this.globalHooks?.afterCreate,afterTable:this.tableHooks?.afterCreate,query:e=>this.dialect.create(this.sql,e)})}createMany(e){let t=this.hooks.shouldSkip(e),n=this.hooks.stripSkipHooks(e);return this.withMutationHooks({skipHooks:t,hookOptions:n,beforeGlobal:this.globalHooks?.beforeCreateMany,beforeTable:this.tableHooks?.beforeCreateMany,afterGlobal:this.globalHooks?.afterCreateMany,afterTable:this.tableHooks?.afterCreateMany,query:e=>this.dialect.createMany(this.sql,e)})}update(e){let t=this.hooks.shouldSkip(e),n=this.hooks.stripSkipHooks(e);return this.withMutationHooks({skipHooks:t,hookOptions:n,beforeGlobal:this.globalHooks?.beforeUpdate,beforeTable:this.tableHooks?.beforeUpdate,afterGlobal:this.globalHooks?.afterUpdate,afterTable:this.tableHooks?.afterUpdate,query:e=>this.dialect.update(this.sql,e)})}updateMany(e){let t=this.hooks.shouldSkip(e),n=this.hooks.stripSkipHooks(e);return this.withMutationHooks({skipHooks:t,hookOptions:n,beforeGlobal:this.globalHooks?.beforeUpdateMany,beforeTable:this.tableHooks?.beforeUpdateMany,afterGlobal:this.globalHooks?.afterUpdateMany,afterTable:this.tableHooks?.afterUpdateMany,query:e=>this.dialect.updateMany(this.sql,e)})}delete(e){let t=this.hooks.shouldSkip(e),n=this.hooks.stripSkipHooks(e);return this.withMutationHooks({skipHooks:t,hookOptions:n,beforeGlobal:this.globalHooks?.beforeDelete,beforeTable:this.tableHooks?.beforeDelete,afterGlobal:this.globalHooks?.afterDelete,afterTable:this.tableHooks?.afterDelete,query:e=>this.dialect.delete(this.sql,e)})}deleteMany(e){let t=this.hooks.shouldSkip(e),n=this.hooks.stripSkipHooks(e);return this.withMutationHooks({skipHooks:t,hookOptions:n,beforeGlobal:this.globalHooks?.beforeDeleteMany,beforeTable:this.tableHooks?.beforeDeleteMany,afterGlobal:this.globalHooks?.afterDeleteMany,afterTable:this.tableHooks?.afterDeleteMany,query:e=>this.dialect.deleteMany(this.sql,e)})}async withMutationHooks(e){let t=e.hookOptions;if(!e.skipHooks){let n={tableName:this.tableName,table:this.table,options:e.hookOptions},r=await e.beforeGlobal?.(n);t=L(e.hookOptions,r);let i=await e.beforeTable?.({...n,options:t});t=L(t,i)}let n=await e.query(t);return e.skipHooks||await this.hooks.runReadHooks(e.afterGlobal,e.afterTable,{tableName:this.tableName,table:this.table,options:t,result:n}),n}};const L=(e,t)=>typeof t!=`object`||!t?e:{...e,...t};var R=class{$raw;options;tableRelationsMap=new Map;constructor(e){this.options=e,this.$raw=new Bun.SQL(e.url,{adapter:e.adapter})}buildClient(){let e=this.buildTableClients(this.$raw),t=this.buildTransaction();return{...e,$raw:this.$raw,$transaction:t}}buildTableClients(e){let t=Object.create(null);for(let n of this.toObjectEntries(this.options.tables))this.setTableClient(t,e,n[0],n[1]);return t}setTableClient(e,t,n,r){let i=this.getTableRelations(n);this.tableRelationsMap.set(r,i),e[n]=new I({sql:t,tableName:n,table:r,adapter:this.options.adapter,relations:i,tableRelationsMap:this.tableRelationsMap,globalHooks:this.options.hooks?d(this.options.hooks):void 0,tableHooks:this.options.hooks?.tables?.[n]})}buildTransaction(){return async e=>await this.$raw.begin(async t=>await e({...this.buildTableClients(t),$raw:t}))}getTableRelations(e){return this.options.relations?.[e]||Object.create(null)}toObjectEntries(e){let t=[];for(let n in e)Object.hasOwn(e,n)&&t.push([n,e[n]]);return t}};const z=e=>new R(e).buildClient();var B=class{_type=`hasMany`;_table;constructor(e){this._table=e}},V=class{_type=`hasOne`;_table;_foreignKey;constructor(e,t){this._foreignKey=e,this._table=t}};const H=e=>new B(e()),U=(e,t)=>new V(e,t()),W=(e,t)=>({sqlName:e,columns:t});exports.boolean=a,exports.createOrm=z,exports.date=o,exports.defineTable=W,exports.enumType=s,exports.json=c,exports.jsonb=l,exports.many=H,exports.number=i,exports.one=U,exports.string=n,exports.uuid=r;
@@ -0,0 +1 @@
1
+ export type * from './index.d.mts'