@cedarjs/api 2.6.1-next.0 → 2.6.1-next.115
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/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +8 -4
- package/dist/cjs/cache/index.d.ts.map +1 -1
- package/dist/cjs/cache/index.js +8 -14
- package/dist/cjs/validations/validations.d.ts +17 -7
- package/dist/cjs/validations/validations.d.ts.map +1 -1
- package/dist/cjs/validations/validations.js +9 -13
- package/dist/validations/validations.d.ts +17 -7
- package/dist/validations/validations.d.ts.map +1 -1
- package/dist/validations/validations.js +9 -13
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGzD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAE5D,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE;QACP,EAAE,EAAE,MAAM,CAAA;QACV,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB,CACnC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC7C,SAAQ,YAAY;IACpB,UAAU,CAAC,EAAE,aAAa,CAAA;CAC3B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AACxC,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEjD,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA;IAC/B,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA;CACjC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGzD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAE5D,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE;QACP,EAAE,EAAE,MAAM,CAAA;QACV,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB,CACnC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC7C,SAAQ,YAAY;IACpB,UAAU,CAAC,EAAE,aAAa,CAAA;CAC3B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AACxC,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEjD,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA;IAC/B,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA;CACjC,CAAA;AAmBD,eAAO,MAAM,iBAAiB,MAAM,CAAA;AAEpC,eAAO,MAAM,cAAc,GAAI,KAAK,QAAQ,EAAE,SAAS,MAAM,WAkB5D,CAAA;AAMD,eAAO,MAAM,WAAW,GACtB,aAAa,UAAU,EACvB,UAAU,kBAAkB;YAQP,OAAO,OACrB,QAAQ,SACN,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,YAC7B,YAAY,KACrB,OAAO,CAAC,GAAG,CAAC;oBAqDc,SAAS,SAAS,eAAe,OACvD,QAAQ,SACN,SAAS,YACP,oBAAoB,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;0BA+ClC,QAAQ;CA0B5C,CAAA"}
|
package/dist/cache/index.js
CHANGED
|
@@ -2,6 +2,10 @@ import { CacheTimeoutError } from "./errors.js";
|
|
|
2
2
|
import { MemcachedClient } from "./clients/MemcachedClient.js";
|
|
3
3
|
import { RedisClient } from "./clients/RedisClient.js";
|
|
4
4
|
import { InMemoryClient } from "./clients/InMemoryClient.js";
|
|
5
|
+
const PRISMA_CLIENT_VALIDATION_ERROR_NAME = "PrismaClientValidationError";
|
|
6
|
+
const isPrismaClientValidationError = (error) => {
|
|
7
|
+
return error !== null && typeof error === "object" && "name" in error && error.name === PRISMA_CLIENT_VALIDATION_ERROR_NAME;
|
|
8
|
+
};
|
|
5
9
|
const DEFAULT_LATEST_FIELDS = { id: "id", updatedAt: "updatedAt" };
|
|
6
10
|
const wait = (ms) => {
|
|
7
11
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -71,7 +75,6 @@ const createCache = (cacheClient, options) => {
|
|
|
71
75
|
const { conditions, ...rest } = options2;
|
|
72
76
|
const cacheKey = formatCacheKey(key, prefix);
|
|
73
77
|
let latest, latestCacheKey;
|
|
74
|
-
const { PrismaClientValidationError } = await import("@prisma/client");
|
|
75
78
|
try {
|
|
76
79
|
latest = await model.findFirst({
|
|
77
80
|
...conditions,
|
|
@@ -79,17 +82,18 @@ const createCache = (cacheClient, options) => {
|
|
|
79
82
|
select: { [fields.id]: true, [fields.updatedAt]: true }
|
|
80
83
|
});
|
|
81
84
|
} catch (e) {
|
|
82
|
-
if (e
|
|
85
|
+
if (isPrismaClientValidationError(e)) {
|
|
83
86
|
logger?.error(
|
|
84
87
|
`[Cache] cacheFindMany error: model does not contain \`${fields.id}\` or \`${fields.updatedAt}\` fields`
|
|
85
88
|
);
|
|
86
89
|
} else {
|
|
87
|
-
|
|
90
|
+
const message = e instanceof Error ? e.message : String(e ?? "Unknown error");
|
|
91
|
+
logger?.error(`[Cache] cacheFindMany error: ${message}`);
|
|
88
92
|
}
|
|
89
93
|
return serialize(await model.findMany(conditions));
|
|
90
94
|
}
|
|
91
95
|
if (latest) {
|
|
92
|
-
latestCacheKey = `${cacheKey}${cacheKeySeparator}${latest.id}${cacheKeySeparator}${latest[fields.updatedAt].getTime()}`;
|
|
96
|
+
latestCacheKey = `${cacheKey}${cacheKeySeparator}${latest[fields.id]}${cacheKeySeparator}${latest[fields.updatedAt].getTime()}`;
|
|
93
97
|
} else {
|
|
94
98
|
logger?.debug(
|
|
95
99
|
`[Cache] cacheFindMany: No data to cache for key \`${key}\`, skipping`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGzD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAE5D,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE;QACP,EAAE,EAAE,MAAM,CAAA;QACV,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB,CACnC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC7C,SAAQ,YAAY;IACpB,UAAU,CAAC,EAAE,aAAa,CAAA;CAC3B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AACxC,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEjD,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA;IAC/B,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA;CACjC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGzD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAE5D,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE;QACP,EAAE,EAAE,MAAM,CAAA;QACV,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB,CACnC,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC7C,SAAQ,YAAY;IACpB,UAAU,CAAC,EAAE,aAAa,CAAA;CAC3B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AACxC,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEjD,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA;IAC/B,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA;CACjC,CAAA;AAmBD,eAAO,MAAM,iBAAiB,MAAM,CAAA;AAEpC,eAAO,MAAM,cAAc,GAAI,KAAK,QAAQ,EAAE,SAAS,MAAM,WAkB5D,CAAA;AAMD,eAAO,MAAM,WAAW,GACtB,aAAa,UAAU,EACvB,UAAU,kBAAkB;YAQP,OAAO,OACrB,QAAQ,SACN,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,YAC7B,YAAY,KACrB,OAAO,CAAC,GAAG,CAAC;oBAqDc,SAAS,SAAS,eAAe,OACvD,QAAQ,SACN,SAAS,YACP,oBAAoB,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;0BA+ClC,QAAQ;CA0B5C,CAAA"}
|
package/dist/cjs/cache/index.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
6
|
var __export = (target, all) => {
|
|
9
7
|
for (var name in all)
|
|
@@ -17,14 +15,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
15
|
}
|
|
18
16
|
return to;
|
|
19
17
|
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
19
|
var cache_exports = {};
|
|
30
20
|
__export(cache_exports, {
|
|
@@ -40,6 +30,10 @@ var import_errors = require("./errors.js");
|
|
|
40
30
|
var import_MemcachedClient = require("./clients/MemcachedClient.js");
|
|
41
31
|
var import_RedisClient = require("./clients/RedisClient.js");
|
|
42
32
|
var import_InMemoryClient = require("./clients/InMemoryClient.js");
|
|
33
|
+
const PRISMA_CLIENT_VALIDATION_ERROR_NAME = "PrismaClientValidationError";
|
|
34
|
+
const isPrismaClientValidationError = (error) => {
|
|
35
|
+
return error !== null && typeof error === "object" && "name" in error && error.name === PRISMA_CLIENT_VALIDATION_ERROR_NAME;
|
|
36
|
+
};
|
|
43
37
|
const DEFAULT_LATEST_FIELDS = { id: "id", updatedAt: "updatedAt" };
|
|
44
38
|
const wait = (ms) => {
|
|
45
39
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -109,7 +103,6 @@ const createCache = (cacheClient, options) => {
|
|
|
109
103
|
const { conditions, ...rest } = options2;
|
|
110
104
|
const cacheKey = formatCacheKey(key, prefix);
|
|
111
105
|
let latest, latestCacheKey;
|
|
112
|
-
const { PrismaClientValidationError } = await import("@prisma/client");
|
|
113
106
|
try {
|
|
114
107
|
latest = await model.findFirst({
|
|
115
108
|
...conditions,
|
|
@@ -117,17 +110,18 @@ const createCache = (cacheClient, options) => {
|
|
|
117
110
|
select: { [fields.id]: true, [fields.updatedAt]: true }
|
|
118
111
|
});
|
|
119
112
|
} catch (e) {
|
|
120
|
-
if (e
|
|
113
|
+
if (isPrismaClientValidationError(e)) {
|
|
121
114
|
logger?.error(
|
|
122
115
|
`[Cache] cacheFindMany error: model does not contain \`${fields.id}\` or \`${fields.updatedAt}\` fields`
|
|
123
116
|
);
|
|
124
117
|
} else {
|
|
125
|
-
|
|
118
|
+
const message = e instanceof Error ? e.message : String(e ?? "Unknown error");
|
|
119
|
+
logger?.error(`[Cache] cacheFindMany error: ${message}`);
|
|
126
120
|
}
|
|
127
121
|
return serialize(await model.findMany(conditions));
|
|
128
122
|
}
|
|
129
123
|
if (latest) {
|
|
130
|
-
latestCacheKey = `${cacheKey}${cacheKeySeparator}${latest.id}${cacheKeySeparator}${latest[fields.updatedAt].getTime()}`;
|
|
124
|
+
latestCacheKey = `${cacheKey}${cacheKeySeparator}${latest[fields.id]}${cacheKeySeparator}${latest[fields.updatedAt].getTime()}`;
|
|
131
125
|
} else {
|
|
132
126
|
logger?.debug(
|
|
133
127
|
`[Cache] cacheFindMany: No data to cache for key \`${key}\`, skipping`
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { PrismaClient } from '@prisma/client';
|
|
2
1
|
type WithOptionalMessage<T = Record<string, unknown>> = T & {
|
|
3
2
|
/**
|
|
4
3
|
* A message to be shown if the validation fails.
|
|
@@ -135,8 +134,17 @@ interface CustomValidatorOptions extends WithOptionalMessage {
|
|
|
135
134
|
with: () => void;
|
|
136
135
|
}
|
|
137
136
|
interface UniquenessValidatorOptions extends WithOptionalMessage {
|
|
138
|
-
db?:
|
|
137
|
+
db?: UniquenessDb;
|
|
139
138
|
}
|
|
139
|
+
type UniquenessWhere = Record<'AND' | 'NOT', Record<string, unknown>[]>;
|
|
140
|
+
export type UniquenessTransactionClient = Record<string, {
|
|
141
|
+
findFirst: (args: {
|
|
142
|
+
where: UniquenessWhere;
|
|
143
|
+
}) => Promise<unknown>;
|
|
144
|
+
}>;
|
|
145
|
+
type UniquenessDb = {
|
|
146
|
+
$transaction: <T>(callback: (tx: UniquenessTransactionClient) => Promise<T>) => Promise<T>;
|
|
147
|
+
};
|
|
140
148
|
interface ValidationRecipe {
|
|
141
149
|
/**
|
|
142
150
|
* Requires that a field NOT be present, meaning it must be `null` or `undefined`.
|
|
@@ -195,8 +203,10 @@ interface ValidationRecipe {
|
|
|
195
203
|
*/
|
|
196
204
|
presence?: boolean | PresenceValidatorOptions;
|
|
197
205
|
/**
|
|
198
|
-
* Run a custom validation function which should either throw or return
|
|
199
|
-
*
|
|
206
|
+
* Run a custom validation function which should either throw or return
|
|
207
|
+
* nothing.
|
|
208
|
+
* If the function throws an error, the error message will be used as the
|
|
209
|
+
* validation error associated with the field.
|
|
200
210
|
*/
|
|
201
211
|
custom?: CustomValidatorOptions;
|
|
202
212
|
}
|
|
@@ -210,13 +220,13 @@ interface ValidationWithMessagesRecipe extends ValidationRecipe {
|
|
|
210
220
|
length?: WithRequiredMessage<LengthValidatorOptions>;
|
|
211
221
|
numericality?: WithRequiredMessage<NumericalityValidatorOptions>;
|
|
212
222
|
presence?: WithRequiredMessage<PresenceValidatorOptions>;
|
|
213
|
-
custom?:
|
|
223
|
+
custom?: CustomValidatorOptions;
|
|
214
224
|
}
|
|
215
225
|
export declare function validate(value: unknown, labelOrRecipe: ValidationWithMessagesRecipe, recipe?: never): void;
|
|
216
226
|
export declare function validate(value: unknown, labelOrRecipe: string, recipe: ValidationRecipe): void;
|
|
217
227
|
export declare const validateWithSync: (func: () => void) => void;
|
|
218
228
|
export declare const validateWith: (func: () => Promise<any>) => Promise<void>;
|
|
219
|
-
export declare function validateUniqueness(model: string, fields: Record<string, unknown>, optionsOrCallback: (tx:
|
|
220
|
-
export declare function validateUniqueness(model: string, fields: Record<string, unknown>, optionsOrCallback: UniquenessValidatorOptions, callback?: (tx:
|
|
229
|
+
export declare function validateUniqueness(model: string, fields: Record<string, unknown>, optionsOrCallback: (tx: UniquenessTransactionClient) => Promise<any>, callback?: never): Promise<any>;
|
|
230
|
+
export declare function validateUniqueness(model: string, fields: Record<string, unknown>, optionsOrCallback: UniquenessValidatorOptions, callback?: (tx: UniquenessTransactionClient) => Promise<any>): Promise<any>;
|
|
221
231
|
export {};
|
|
222
232
|
//# sourceMappingURL=validations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../../src/validations/validations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../../src/validations/validations.ts"],"names":[],"mappings":"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"}
|
|
@@ -259,9 +259,8 @@ const fieldsToString = (fields) => {
|
|
|
259
259
|
return output.join(", ");
|
|
260
260
|
};
|
|
261
261
|
const validationError = (type, name, options, substitutions = {}) => {
|
|
262
|
-
const
|
|
263
|
-
|
|
264
|
-
)}ValidationError`;
|
|
262
|
+
const pascalType = (0, import_pascalcase.default)(type);
|
|
263
|
+
const errorClassName = `${pascalType}ValidationError`;
|
|
265
264
|
const ErrorClass = ValidationErrors[errorClassName];
|
|
266
265
|
const errorMessage = typeof options === "object" ? options.message : void 0;
|
|
267
266
|
throw new ErrorClass(name, errorMessage, substitutions);
|
|
@@ -279,9 +278,11 @@ function validate(value, labelOrRecipe, recipe) {
|
|
|
279
278
|
if (typeof labelOrRecipe === "object") {
|
|
280
279
|
label = "";
|
|
281
280
|
validationRecipe = labelOrRecipe;
|
|
282
|
-
} else {
|
|
281
|
+
} else if (recipe) {
|
|
283
282
|
label = labelOrRecipe;
|
|
284
283
|
validationRecipe = recipe;
|
|
284
|
+
} else {
|
|
285
|
+
throw new Error("invalid options");
|
|
285
286
|
}
|
|
286
287
|
for (const [validator, options] of Object.entries(validationRecipe)) {
|
|
287
288
|
if (typeof options === "undefined") {
|
|
@@ -310,20 +311,15 @@ async function validateUniqueness(model, fields, optionsOrCallback, callback) {
|
|
|
310
311
|
const { $self, $scope, ...rest } = fields;
|
|
311
312
|
let options = {};
|
|
312
313
|
let validCallback;
|
|
313
|
-
let db = null;
|
|
314
314
|
if (typeof optionsOrCallback === "function") {
|
|
315
315
|
validCallback = optionsOrCallback;
|
|
316
316
|
} else {
|
|
317
317
|
options = optionsOrCallback;
|
|
318
318
|
validCallback = callback;
|
|
319
319
|
}
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
db = customDb;
|
|
324
|
-
} else {
|
|
325
|
-
db = new import_client.PrismaClient();
|
|
326
|
-
}
|
|
320
|
+
const { db: _db, ...restOptions } = options;
|
|
321
|
+
const db = options.db || new import_client.PrismaClient();
|
|
322
|
+
options = restOptions;
|
|
327
323
|
const where = {
|
|
328
324
|
AND: [rest],
|
|
329
325
|
NOT: []
|
|
@@ -337,7 +333,7 @@ async function validateUniqueness(model, fields, optionsOrCallback, callback) {
|
|
|
337
333
|
return await db.$transaction(async (tx) => {
|
|
338
334
|
const found = await tx[model].findFirst({ where });
|
|
339
335
|
if (found) {
|
|
340
|
-
validationError("uniqueness", fieldsToString(
|
|
336
|
+
validationError("uniqueness", fieldsToString(rest), options);
|
|
341
337
|
}
|
|
342
338
|
return validCallback(tx);
|
|
343
339
|
});
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { PrismaClient } from '@prisma/client';
|
|
2
1
|
type WithOptionalMessage<T = Record<string, unknown>> = T & {
|
|
3
2
|
/**
|
|
4
3
|
* A message to be shown if the validation fails.
|
|
@@ -135,8 +134,17 @@ interface CustomValidatorOptions extends WithOptionalMessage {
|
|
|
135
134
|
with: () => void;
|
|
136
135
|
}
|
|
137
136
|
interface UniquenessValidatorOptions extends WithOptionalMessage {
|
|
138
|
-
db?:
|
|
137
|
+
db?: UniquenessDb;
|
|
139
138
|
}
|
|
139
|
+
type UniquenessWhere = Record<'AND' | 'NOT', Record<string, unknown>[]>;
|
|
140
|
+
export type UniquenessTransactionClient = Record<string, {
|
|
141
|
+
findFirst: (args: {
|
|
142
|
+
where: UniquenessWhere;
|
|
143
|
+
}) => Promise<unknown>;
|
|
144
|
+
}>;
|
|
145
|
+
type UniquenessDb = {
|
|
146
|
+
$transaction: <T>(callback: (tx: UniquenessTransactionClient) => Promise<T>) => Promise<T>;
|
|
147
|
+
};
|
|
140
148
|
interface ValidationRecipe {
|
|
141
149
|
/**
|
|
142
150
|
* Requires that a field NOT be present, meaning it must be `null` or `undefined`.
|
|
@@ -195,8 +203,10 @@ interface ValidationRecipe {
|
|
|
195
203
|
*/
|
|
196
204
|
presence?: boolean | PresenceValidatorOptions;
|
|
197
205
|
/**
|
|
198
|
-
* Run a custom validation function which should either throw or return
|
|
199
|
-
*
|
|
206
|
+
* Run a custom validation function which should either throw or return
|
|
207
|
+
* nothing.
|
|
208
|
+
* If the function throws an error, the error message will be used as the
|
|
209
|
+
* validation error associated with the field.
|
|
200
210
|
*/
|
|
201
211
|
custom?: CustomValidatorOptions;
|
|
202
212
|
}
|
|
@@ -210,13 +220,13 @@ interface ValidationWithMessagesRecipe extends ValidationRecipe {
|
|
|
210
220
|
length?: WithRequiredMessage<LengthValidatorOptions>;
|
|
211
221
|
numericality?: WithRequiredMessage<NumericalityValidatorOptions>;
|
|
212
222
|
presence?: WithRequiredMessage<PresenceValidatorOptions>;
|
|
213
|
-
custom?:
|
|
223
|
+
custom?: CustomValidatorOptions;
|
|
214
224
|
}
|
|
215
225
|
export declare function validate(value: unknown, labelOrRecipe: ValidationWithMessagesRecipe, recipe?: never): void;
|
|
216
226
|
export declare function validate(value: unknown, labelOrRecipe: string, recipe: ValidationRecipe): void;
|
|
217
227
|
export declare const validateWithSync: (func: () => void) => void;
|
|
218
228
|
export declare const validateWith: (func: () => Promise<any>) => Promise<void>;
|
|
219
|
-
export declare function validateUniqueness(model: string, fields: Record<string, unknown>, optionsOrCallback: (tx:
|
|
220
|
-
export declare function validateUniqueness(model: string, fields: Record<string, unknown>, optionsOrCallback: UniquenessValidatorOptions, callback?: (tx:
|
|
229
|
+
export declare function validateUniqueness(model: string, fields: Record<string, unknown>, optionsOrCallback: (tx: UniquenessTransactionClient) => Promise<any>, callback?: never): Promise<any>;
|
|
230
|
+
export declare function validateUniqueness(model: string, fields: Record<string, unknown>, optionsOrCallback: UniquenessValidatorOptions, callback?: (tx: UniquenessTransactionClient) => Promise<any>): Promise<any>;
|
|
221
231
|
export {};
|
|
222
232
|
//# sourceMappingURL=validations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../src/validations/validations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../src/validations/validations.ts"],"names":[],"mappings":"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"}
|
|
@@ -223,9 +223,8 @@ const fieldsToString = (fields) => {
|
|
|
223
223
|
return output.join(", ");
|
|
224
224
|
};
|
|
225
225
|
const validationError = (type, name, options, substitutions = {}) => {
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
)}ValidationError`;
|
|
226
|
+
const pascalType = pascalcase(type);
|
|
227
|
+
const errorClassName = `${pascalType}ValidationError`;
|
|
229
228
|
const ErrorClass = ValidationErrors[errorClassName];
|
|
230
229
|
const errorMessage = typeof options === "object" ? options.message : void 0;
|
|
231
230
|
throw new ErrorClass(name, errorMessage, substitutions);
|
|
@@ -243,9 +242,11 @@ function validate(value, labelOrRecipe, recipe) {
|
|
|
243
242
|
if (typeof labelOrRecipe === "object") {
|
|
244
243
|
label = "";
|
|
245
244
|
validationRecipe = labelOrRecipe;
|
|
246
|
-
} else {
|
|
245
|
+
} else if (recipe) {
|
|
247
246
|
label = labelOrRecipe;
|
|
248
247
|
validationRecipe = recipe;
|
|
248
|
+
} else {
|
|
249
|
+
throw new Error("invalid options");
|
|
249
250
|
}
|
|
250
251
|
for (const [validator, options] of Object.entries(validationRecipe)) {
|
|
251
252
|
if (typeof options === "undefined") {
|
|
@@ -274,20 +275,15 @@ async function validateUniqueness(model, fields, optionsOrCallback, callback) {
|
|
|
274
275
|
const { $self, $scope, ...rest } = fields;
|
|
275
276
|
let options = {};
|
|
276
277
|
let validCallback;
|
|
277
|
-
let db = null;
|
|
278
278
|
if (typeof optionsOrCallback === "function") {
|
|
279
279
|
validCallback = optionsOrCallback;
|
|
280
280
|
} else {
|
|
281
281
|
options = optionsOrCallback;
|
|
282
282
|
validCallback = callback;
|
|
283
283
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
db = customDb;
|
|
288
|
-
} else {
|
|
289
|
-
db = new PrismaClient();
|
|
290
|
-
}
|
|
284
|
+
const { db: _db, ...restOptions } = options;
|
|
285
|
+
const db = options.db || new PrismaClient();
|
|
286
|
+
options = restOptions;
|
|
291
287
|
const where = {
|
|
292
288
|
AND: [rest],
|
|
293
289
|
NOT: []
|
|
@@ -301,7 +297,7 @@ async function validateUniqueness(model, fields, optionsOrCallback, callback) {
|
|
|
301
297
|
return await db.$transaction(async (tx) => {
|
|
302
298
|
const found = await tx[model].findFirst({ where });
|
|
303
299
|
if (found) {
|
|
304
|
-
validationError("uniqueness", fieldsToString(
|
|
300
|
+
validationError("uniqueness", fieldsToString(rest), options);
|
|
305
301
|
}
|
|
306
302
|
return validCallback(tx);
|
|
307
303
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cedarjs/api",
|
|
3
|
-
"version": "2.6.1-next.
|
|
3
|
+
"version": "2.6.1-next.115+b00f80537",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/cedarjs/cedar.git",
|
|
@@ -97,8 +97,8 @@
|
|
|
97
97
|
"title-case": "3.0.3"
|
|
98
98
|
},
|
|
99
99
|
"devDependencies": {
|
|
100
|
-
"@cedarjs/framework-tools": "2.6.1-next.
|
|
101
|
-
"@types/aws-lambda": "8.10.
|
|
100
|
+
"@cedarjs/framework-tools": "2.6.1-next.115",
|
|
101
|
+
"@types/aws-lambda": "8.10.161",
|
|
102
102
|
"@types/jsonwebtoken": "9.0.10",
|
|
103
103
|
"@types/memjs": "1",
|
|
104
104
|
"@types/pascalcase": "1.0.3",
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"concurrently": "9.2.1",
|
|
107
107
|
"memjs": "1.3.2",
|
|
108
108
|
"publint": "0.3.17",
|
|
109
|
-
"redis": "5.
|
|
109
|
+
"redis": "5.11.0",
|
|
110
110
|
"split2": "4.2.0",
|
|
111
111
|
"ts-toolbelt": "9.6.0",
|
|
112
112
|
"tsx": "4.21.0",
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
},
|
|
116
116
|
"peerDependencies": {
|
|
117
117
|
"memjs": "1.3.2",
|
|
118
|
-
"redis": "5.
|
|
118
|
+
"redis": "5.11.0"
|
|
119
119
|
},
|
|
120
120
|
"peerDependenciesMeta": {
|
|
121
121
|
"memjs": {
|
|
@@ -128,5 +128,5 @@
|
|
|
128
128
|
"publishConfig": {
|
|
129
129
|
"access": "public"
|
|
130
130
|
},
|
|
131
|
-
"gitHead": "
|
|
131
|
+
"gitHead": "b00f80537b951b64c7b627dc2efbbe1ed2f3ea40"
|
|
132
132
|
}
|