functional-models 3.10.0 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/cjs/errors.cjs +38 -0
  2. package/cjs/errors.cjs.map +7 -0
  3. package/cjs/index.cjs +2426 -0
  4. package/cjs/index.cjs.map +7 -0
  5. package/cjs/lib.cjs +431 -0
  6. package/cjs/lib.cjs.map +7 -0
  7. package/cjs/models.cjs +571 -0
  8. package/cjs/models.cjs.map +7 -0
  9. package/cjs/orm/index.cjs +1765 -0
  10. package/cjs/orm/index.cjs.map +7 -0
  11. package/cjs/orm/internal-libs.cjs +136 -0
  12. package/cjs/orm/internal-libs.cjs.map +7 -0
  13. package/cjs/orm/libs.cjs +88 -0
  14. package/cjs/orm/libs.cjs.map +7 -0
  15. package/cjs/orm/models.cjs +1027 -0
  16. package/cjs/orm/models.cjs.map +7 -0
  17. package/cjs/orm/properties.cjs +989 -0
  18. package/cjs/orm/properties.cjs.map +7 -0
  19. package/cjs/orm/query.cjs +376 -0
  20. package/cjs/orm/query.cjs.map +7 -0
  21. package/cjs/orm/types.cjs +59 -0
  22. package/cjs/orm/types.cjs.map +7 -0
  23. package/cjs/orm/validation.cjs +301 -0
  24. package/cjs/orm/validation.cjs.map +7 -0
  25. package/cjs/properties.cjs +998 -0
  26. package/cjs/properties.cjs.map +7 -0
  27. package/cjs/serialization.cjs +75 -0
  28. package/cjs/serialization.cjs.map +7 -0
  29. package/cjs/types.cjs +65 -0
  30. package/cjs/types.cjs.map +7 -0
  31. package/cjs/utils.cjs +187 -0
  32. package/cjs/utils.cjs.map +7 -0
  33. package/cjs/validation.cjs +431 -0
  34. package/cjs/validation.cjs.map +7 -0
  35. package/errors.js +3 -4
  36. package/errors.js.map +1 -1
  37. package/index.d.ts +13 -13
  38. package/index.js +13 -52
  39. package/index.js.map +1 -1
  40. package/lib.d.ts +2 -2
  41. package/lib.js +45 -65
  42. package/lib.js.map +1 -1
  43. package/models.d.ts +1 -1
  44. package/models.js +22 -30
  45. package/models.js.map +1 -1
  46. package/orm/index.d.ts +9 -9
  47. package/orm/index.js +9 -48
  48. package/orm/index.js.map +1 -1
  49. package/orm/internal-libs.js +7 -11
  50. package/orm/internal-libs.js.map +1 -1
  51. package/orm/libs.d.ts +1 -1
  52. package/orm/libs.js +8 -16
  53. package/orm/libs.js.map +1 -1
  54. package/orm/models.d.ts +2 -2
  55. package/orm/models.js +20 -26
  56. package/orm/models.js.map +1 -1
  57. package/orm/properties.d.ts +22 -22
  58. package/orm/properties.js +26 -36
  59. package/orm/properties.js.map +1 -1
  60. package/orm/query.d.ts +1 -1
  61. package/orm/query.js +31 -52
  62. package/orm/query.js.map +1 -1
  63. package/orm/types.d.ts +1 -1
  64. package/orm/types.js +7 -10
  65. package/orm/types.js.map +1 -1
  66. package/orm/validation.d.ts +2 -2
  67. package/orm/validation.js +5 -13
  68. package/orm/validation.js.map +1 -1
  69. package/package.json +50 -65
  70. package/properties.d.ts +21 -21
  71. package/properties.js +65 -94
  72. package/properties.js.map +1 -1
  73. package/serialization.d.ts +1 -1
  74. package/serialization.js +3 -9
  75. package/serialization.js.map +1 -1
  76. package/types.js +4 -6
  77. package/types.js.map +1 -1
  78. package/utils.d.ts +2 -1
  79. package/utils.js +8 -23
  80. package/utils.js.map +1 -1
  81. package/validation.d.ts +1 -1
  82. package/validation.js +19 -50
  83. package/validation.js.map +1 -1
@@ -0,0 +1,376 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
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
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/orm/query.ts
31
+ var query_exports = {};
32
+ __export(query_exports, {
33
+ and: () => and,
34
+ booleanQuery: () => booleanQuery,
35
+ datesAfter: () => datesAfter,
36
+ datesBefore: () => datesBefore,
37
+ isALinkToken: () => isALinkToken,
38
+ isPropertyBasedQuery: () => isPropertyBasedQuery,
39
+ numberQuery: () => numberQuery,
40
+ or: () => or,
41
+ pagination: () => pagination,
42
+ property: () => property,
43
+ queryBuilder: () => queryBuilder,
44
+ sort: () => sort,
45
+ take: () => take,
46
+ textQuery: () => textQuery,
47
+ threeitize: () => threeitize,
48
+ validateOrmSearch: () => validateOrmSearch
49
+ });
50
+ module.exports = __toCommonJS(query_exports);
51
+ var import_merge = __toESM(require("lodash/merge.js"), 1);
52
+ var import_omit = __toESM(require("lodash/omit.js"), 1);
53
+
54
+ // src/orm/types.ts
55
+ var EqualitySymbol = /* @__PURE__ */ ((EqualitySymbol2) => {
56
+ EqualitySymbol2["eq"] = "=";
57
+ EqualitySymbol2["lt"] = "<";
58
+ EqualitySymbol2["lte"] = "<=";
59
+ EqualitySymbol2["gt"] = ">";
60
+ EqualitySymbol2["gte"] = ">=";
61
+ EqualitySymbol2["ne"] = "!=";
62
+ return EqualitySymbol2;
63
+ })(EqualitySymbol || {});
64
+ var AllowableEqualitySymbols = Object.values(EqualitySymbol);
65
+
66
+ // src/orm/query.ts
67
+ var THREE = 3;
68
+ var _objectize = (key, value) => {
69
+ return value ? {
70
+ [key]: value
71
+ } : {};
72
+ };
73
+ var _additionalLink = (data) => {
74
+ const inner = _builderV2(data);
75
+ const partialLink = (0, import_omit.default)(_link(data), ["and", "or"]);
76
+ return {
77
+ ...inner,
78
+ ...partialLink
79
+ };
80
+ };
81
+ var _link = (data) => {
82
+ return {
83
+ and: () => {
84
+ return _queryBuilder({ ...data, query: data.query.concat("AND") });
85
+ },
86
+ or: () => {
87
+ return _queryBuilder({ ...data, query: data.query.concat("OR") });
88
+ },
89
+ compile: () => {
90
+ return data;
91
+ },
92
+ take: (num) => {
93
+ return _additionalLink({ ...data, take: take(num) });
94
+ },
95
+ sort: (key, order = "asc" /* asc */) => {
96
+ return _additionalLink({ ...data, sort: sort(key, order) });
97
+ },
98
+ pagination: (value) => {
99
+ return _additionalLink({ ...data, page: pagination(value) });
100
+ }
101
+ };
102
+ };
103
+ var _canCompile = (obj) => {
104
+ return Boolean(obj.compile);
105
+ };
106
+ var _builderV2 = (data) => {
107
+ const _myProperty = (name, value, options) => {
108
+ const p = property(name, value, options);
109
+ return _link((0, import_merge.default)(data, { query: data.query.concat(p) }));
110
+ };
111
+ const complex = (subBuilderFunc) => {
112
+ const subBuilder = _queryBuilder();
113
+ const result = subBuilderFunc(subBuilder);
114
+ if (_canCompile(result)) {
115
+ const queryTokens = [result.compile().query];
116
+ return _link(
117
+ (0, import_merge.default)(data, {
118
+ query: data.query.concat(queryTokens)
119
+ })
120
+ );
121
+ }
122
+ return _link((0, import_merge.default)(data, { query: data.query.concat([result.query]) }));
123
+ };
124
+ const thisDatesBefore = (key, jsDate, { valueType = "date" /* date */, equalToAndBefore = true } = {}) => {
125
+ const p = datesBefore(key, jsDate, { valueType, equalToAndBefore });
126
+ return _link((0, import_merge.default)(data, { query: data.query.concat(p) }));
127
+ };
128
+ const thisDatesAfter = (key, jsDate, { valueType = "date" /* date */, equalToAndAfter = true } = {}) => {
129
+ const p = datesAfter(key, jsDate, { valueType, equalToAndAfter });
130
+ return _link((0, import_merge.default)(data, { query: data.query.concat(p) }));
131
+ };
132
+ return {
133
+ datesBefore: thisDatesBefore,
134
+ datesAfter: thisDatesAfter,
135
+ complex,
136
+ property: _myProperty
137
+ };
138
+ };
139
+ var _queryBuilder = (data = void 0) => {
140
+ const theData = (0, import_merge.default)(
141
+ {
142
+ query: []
143
+ },
144
+ data
145
+ );
146
+ const builder = _builderV2(theData);
147
+ const linkData = _additionalLink(theData);
148
+ return {
149
+ ...builder,
150
+ ...linkData,
151
+ compile: () => {
152
+ return {
153
+ ..._objectize("take", theData.take),
154
+ ..._objectize("sort", theData.sort),
155
+ ..._objectize("page", theData.page),
156
+ query: []
157
+ };
158
+ }
159
+ };
160
+ };
161
+ var property = (key, value, options = {}) => {
162
+ const {
163
+ equalitySymbol = "=" /* eq */,
164
+ caseSensitive,
165
+ startsWith,
166
+ endsWith,
167
+ includes,
168
+ type
169
+ } = options;
170
+ const typeToUse = type || "string" /* string */;
171
+ if (!AllowableEqualitySymbols.includes(equalitySymbol)) {
172
+ throw new Error(`${equalitySymbol} is not a valid symbol`);
173
+ }
174
+ if (equalitySymbol !== "=" /* eq */ && equalitySymbol !== "!=" /* ne */ && typeToUse === "string" /* string */) {
175
+ throw new Error(`Cannot use a non = symbol for a string type`);
176
+ }
177
+ const propertyEntry = {
178
+ type: "property",
179
+ key,
180
+ value,
181
+ valueType: typeToUse,
182
+ equalitySymbol,
183
+ options: {
184
+ ..._objectize("caseSensitive", caseSensitive),
185
+ ..._objectize("startsWith", startsWith),
186
+ ..._objectize("endsWith", endsWith),
187
+ ..._objectize("includes", includes)
188
+ }
189
+ };
190
+ return propertyEntry;
191
+ };
192
+ var take = (max) => {
193
+ const parsed = parseInt(`${max}`, 10);
194
+ if (Number.isNaN(parsed)) {
195
+ throw new Error(`Number "${max}" is not integerable`);
196
+ }
197
+ return parsed;
198
+ };
199
+ var sort = (key, order = "asc" /* asc */) => {
200
+ if (order !== "asc" /* asc */ && order !== "dsc" /* dsc */) {
201
+ throw new Error("Sort must be either asc or dsc");
202
+ }
203
+ return {
204
+ key,
205
+ order
206
+ };
207
+ };
208
+ var pagination = (value) => {
209
+ return value;
210
+ };
211
+ var datesAfter = (key, jsDate, options = {
212
+ valueType: "date" /* date */,
213
+ equalToAndAfter: true
214
+ }) => {
215
+ const { valueType = "date" /* date */, equalToAndAfter = true } = options;
216
+ return {
217
+ type: "datesAfter",
218
+ key,
219
+ date: isDate(jsDate) ? jsDate.toISOString() : jsDate,
220
+ valueType,
221
+ options: {
222
+ equalToAndAfter
223
+ }
224
+ };
225
+ };
226
+ var isDate = (obj) => {
227
+ return Boolean(obj.toISOString);
228
+ };
229
+ var datesBefore = (key, jsDate, options = {
230
+ valueType: "date" /* date */,
231
+ equalToAndBefore: true
232
+ }) => {
233
+ const { valueType = "date" /* date */, equalToAndBefore = true } = options;
234
+ return {
235
+ type: "datesBefore",
236
+ key,
237
+ date: isDate(jsDate) ? jsDate.toISOString() : jsDate,
238
+ valueType,
239
+ options: {
240
+ equalToAndBefore
241
+ }
242
+ };
243
+ };
244
+ var queryBuilder = () => {
245
+ return _queryBuilder();
246
+ };
247
+ var isPropertyBasedQuery = (value) => {
248
+ if (!value || !value.type) {
249
+ return false;
250
+ }
251
+ return value.type === "property" || value.type === "datesBefore" || value.type === "datesAfter";
252
+ };
253
+ var isALinkToken = (value) => {
254
+ if (!value) {
255
+ return false;
256
+ }
257
+ if (typeof value !== "string") {
258
+ return false;
259
+ }
260
+ value = value.toLowerCase();
261
+ return value === "and" || value === "or";
262
+ };
263
+ var and = () => "AND";
264
+ var or = () => "OR";
265
+ var textQuery = (key, value, options) => property(
266
+ key,
267
+ value,
268
+ Object.assign({}, options, {
269
+ equalitySymbol: void 0,
270
+ type: "string" /* string */
271
+ })
272
+ );
273
+ var numberQuery = (key, value, equalitySymbol = "=" /* eq */) => property(key, value, {
274
+ equalitySymbol,
275
+ type: "number" /* number */
276
+ });
277
+ var booleanQuery = (key, value) => property(key, value, {
278
+ type: "boolean" /* boolean */,
279
+ equalitySymbol: "=" /* eq */
280
+ });
281
+ var threeitize = (data) => {
282
+ if (data.length === 0 || data.length === 1) {
283
+ return [];
284
+ }
285
+ if (data.length % 2 === 0) {
286
+ throw new Error("Must be an odd number of 3 or greater.");
287
+ }
288
+ const three = data.slice(0, THREE);
289
+ const rest = data.slice(2);
290
+ const moreThrees = threeitize(rest);
291
+ return [three, ...moreThrees];
292
+ };
293
+ var _validateTokenTypes = (token) => {
294
+ if (Array.isArray(token)) {
295
+ token.forEach(_validateTokenTypes);
296
+ return;
297
+ }
298
+ if (isPropertyBasedQuery(token)) {
299
+ return;
300
+ }
301
+ if (isALinkToken(token)) {
302
+ return;
303
+ }
304
+ throw new Error(`Unknown token type ${token}`);
305
+ };
306
+ var _validateTokenStructure = (o) => {
307
+ const first = o[0];
308
+ if (first === "AND" || first === "OR") {
309
+ throw new Error("Cannot have AND or OR at the very start.");
310
+ }
311
+ const last = o[o.length - 1];
312
+ if (last === "AND" || last === "OR") {
313
+ throw new Error("Cannot have AND or OR at the very end.");
314
+ }
315
+ if (o.every((x) => x !== "AND" && x !== "OR")) {
316
+ o.every(_validateArrayOrQuery);
317
+ return;
318
+ }
319
+ const totalLinks = o.filter((x) => x === "AND" || x === "OR");
320
+ const nonLinks = o.filter((x) => x !== "AND" && x !== "OR");
321
+ if (totalLinks.length !== nonLinks.length - 1) {
322
+ throw new Error("Must separate each statement with an AND or OR");
323
+ }
324
+ const threes = threeitize(o).reverse();
325
+ threes.forEach(([a, l, b]) => {
326
+ if (l !== "AND" && l !== "OR") {
327
+ if (isPropertyBasedQuery(l)) {
328
+ throw new Error("Must have AND/OR between property queries");
329
+ }
330
+ throw new Error("Must have AND/OR between nested queries");
331
+ }
332
+ _validateArrayOrQuery(a);
333
+ _validateArrayOrQuery(b);
334
+ });
335
+ return;
336
+ };
337
+ var _validateArrayOrQuery = (o) => {
338
+ if (Array.isArray(o)) {
339
+ _validateTokenStructure(o);
340
+ return;
341
+ }
342
+ if (isPropertyBasedQuery(o)) {
343
+ return;
344
+ }
345
+ throw new Error("Order of link tokens and queries invalid");
346
+ };
347
+ var validateOrmSearch = (search) => {
348
+ if (Array.isArray(search.query) === false) {
349
+ throw new Error(`Query must be an array`);
350
+ }
351
+ if (search.query.length < 1) {
352
+ return;
353
+ }
354
+ _validateTokenTypes(search.query);
355
+ _validateTokenStructure(search.query);
356
+ };
357
+ // Annotate the CommonJS export names for ESM import in node:
358
+ 0 && (module.exports = {
359
+ and,
360
+ booleanQuery,
361
+ datesAfter,
362
+ datesBefore,
363
+ isALinkToken,
364
+ isPropertyBasedQuery,
365
+ numberQuery,
366
+ or,
367
+ pagination,
368
+ property,
369
+ queryBuilder,
370
+ sort,
371
+ take,
372
+ textQuery,
373
+ threeitize,
374
+ validateOrmSearch
375
+ });
376
+ //# sourceMappingURL=query.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/orm/query.ts", "../../../src/orm/types.ts"],
4
+ "sourcesContent": ["import merge from 'lodash/merge.js'\nimport omit from 'lodash/omit.js'\nimport {\n AllowableEqualitySymbols,\n BooleanQuery,\n BuilderV2Link,\n DatastoreValueType,\n DatesAfterQuery,\n DatesBeforeQuery,\n EqualitySymbol,\n InnerBuilderV2,\n MaxMatchStatement,\n OrmSearch,\n PaginationQuery,\n PropertyOptions,\n PropertyQuery,\n Query,\n QueryBuilder,\n QueryTokens,\n SortOrder,\n SortStatement,\n SubBuilderFunction,\n} from './types.js'\n\nconst THREE = 3\n\nconst _objectize = <T>(key: string, value: T) => {\n return value\n ? {\n [key]: value,\n }\n : {}\n}\n\nconst _additionalLink = (data: OrmSearch): InnerBuilderV2 & BuilderV2Link => {\n const inner = _builderV2(data)\n const partialLink = omit(_link(data), ['and', 'or'])\n // @ts-ignore\n return {\n ...inner,\n ...partialLink,\n }\n}\n\nconst _link = (data: OrmSearch): BuilderV2Link => {\n return {\n and: () => {\n return _queryBuilder({ ...data, query: data.query.concat('AND') })\n },\n or: () => {\n return _queryBuilder({ ...data, query: data.query.concat('OR') })\n },\n compile: () => {\n return data\n },\n take: (num: number) => {\n return _additionalLink({ ...data, take: take(num) })\n },\n sort: (key: string, order = SortOrder.asc) => {\n return _additionalLink({ ...data, sort: sort(key, order) })\n },\n pagination: (value: any) => {\n return _additionalLink({ ...data, page: pagination(value) })\n },\n }\n}\n\nconst _canCompile = (obj: any): obj is { compile: () => OrmSearch } => {\n return Boolean(obj.compile)\n}\n\nconst _builderV2 = (data: OrmSearch): InnerBuilderV2 => {\n const _myProperty = (name: string, value: any, options?: PropertyOptions) => {\n // @ts-ignore\n const p = property(name, value, options)\n return _link(merge(data, { query: data.query.concat(p) }))\n }\n\n const complex = (subBuilderFunc: SubBuilderFunction) => {\n const subBuilder = _queryBuilder()\n const result = subBuilderFunc(subBuilder)\n if (_canCompile(result)) {\n const queryTokens: [readonly QueryTokens[]] = [result.compile().query]\n return _link(\n merge(data, {\n query: data.query.concat(queryTokens),\n })\n )\n }\n // @ts-ignore\n return _link(merge(data, { query: data.query.concat([result.query]) }))\n }\n\n const thisDatesBefore = (\n key: string,\n jsDate: Date | string,\n { valueType = DatastoreValueType.date, equalToAndBefore = true } = {}\n ) => {\n const p = datesBefore(key, jsDate, { valueType, equalToAndBefore })\n return _link(merge(data, { query: data.query.concat(p) }))\n }\n\n const thisDatesAfter = (\n key: string,\n jsDate: Date | string,\n { valueType = DatastoreValueType.date, equalToAndAfter = true } = {}\n ) => {\n const p = datesAfter(key, jsDate, { valueType, equalToAndAfter })\n return _link(merge(data, { query: data.query.concat(p) }))\n }\n\n return {\n datesBefore: thisDatesBefore,\n datesAfter: thisDatesAfter,\n complex,\n property: _myProperty,\n }\n}\n\nconst _queryBuilder = (\n data: Partial<OrmSearch> | undefined = undefined\n): QueryBuilder => {\n const theData = merge(\n {\n query: [],\n },\n data\n )\n const builder = _builderV2(theData)\n const linkData = _additionalLink(theData)\n // @ts-ignore\n return {\n ...builder,\n ...linkData,\n compile: () => {\n return {\n ..._objectize('take', theData.take),\n ..._objectize('sort', theData.sort),\n ..._objectize('page', theData.page),\n query: [],\n } as OrmSearch\n },\n }\n}\n\n/**\n * Creates a property query.\n * @param key - The property's name/key/column to match on\n * @param value - The value to match\n * @param options - Additional options for changing this property query.\n */\nconst property = (\n key: string,\n value: any,\n options: PropertyOptions = {}\n): PropertyQuery => {\n const {\n equalitySymbol = EqualitySymbol.eq,\n caseSensitive,\n startsWith,\n endsWith,\n includes,\n type,\n } = options\n const typeToUse = type || DatastoreValueType.string\n if (!AllowableEqualitySymbols.includes(equalitySymbol)) {\n throw new Error(`${equalitySymbol} is not a valid symbol`)\n }\n if (\n equalitySymbol !== EqualitySymbol.eq &&\n equalitySymbol !== EqualitySymbol.ne &&\n typeToUse === DatastoreValueType.string\n ) {\n throw new Error(`Cannot use a non = symbol for a string type`)\n }\n\n const propertyEntry: PropertyQuery = {\n type: 'property',\n key,\n value,\n valueType: typeToUse,\n equalitySymbol,\n options: {\n ..._objectize('caseSensitive', caseSensitive),\n ..._objectize('startsWith', startsWith),\n ..._objectize('endsWith', endsWith),\n ..._objectize('includes', includes),\n },\n }\n return propertyEntry\n}\n\n/**\n * Limits the number of results to the provided count.\n * @param max - The maximum results to find\n */\nconst take = (max: number): MaxMatchStatement => {\n const parsed = parseInt(`${max}`, 10)\n if (Number.isNaN(parsed)) {\n throw new Error(`Number \"${max}\" is not integerable`)\n }\n return parsed\n}\n\n/**\n * Creates a sort query\n * @param key - The key to sort on\n * @param order - The order of the sort.\n */\nconst sort = (\n key: string,\n order: SortOrder | undefined = SortOrder.asc\n): SortStatement => {\n if (order !== SortOrder.asc && order !== SortOrder.dsc) {\n throw new Error('Sort must be either asc or dsc')\n }\n return {\n key,\n order,\n }\n}\n\n/**\n * Creates a pagination query.\n * @param value - Anything\n */\nconst pagination = (value: any): PaginationQuery => {\n return value\n}\n\n/**\n * Creates a query that looks at dated objects after the given date.\n * @param key - The property's key\n * @param jsDate - The date value being examined\n * @param options - Additional options\n */\nconst datesAfter = (\n key: string,\n jsDate: Date | string,\n options: { valueType: DatastoreValueType; equalToAndAfter: boolean } = {\n valueType: DatastoreValueType.date,\n equalToAndAfter: true,\n }\n): DatesAfterQuery => {\n const { valueType = DatastoreValueType.date, equalToAndAfter = true } =\n options\n return {\n type: 'datesAfter',\n key,\n date: isDate(jsDate) ? jsDate.toISOString() : jsDate,\n valueType,\n options: {\n equalToAndAfter,\n },\n }\n}\n\n/**\n * Determines if the object is a Date\n * @param obj - Date or string\n */\nconst isDate = (obj: Date | string): obj is Date => {\n // @ts-ignore\n return Boolean(obj.toISOString)\n}\n\n/**\n * Creates a search query that looks at dates before the given date.\n * @param key - The property's key\n * @param jsDate - The date value being examined.\n * @param options - Additional options\n */\nconst datesBefore = (\n key: string,\n jsDate: Date | string,\n options: { valueType: DatastoreValueType; equalToAndBefore: boolean } = {\n valueType: DatastoreValueType.date,\n equalToAndBefore: true,\n }\n): DatesBeforeQuery => {\n const { valueType = DatastoreValueType.date, equalToAndBefore = true } =\n options\n return {\n type: 'datesBefore',\n key,\n date: isDate(jsDate) ? jsDate.toISOString() : jsDate,\n valueType,\n options: {\n equalToAndBefore,\n },\n }\n}\n\n/**\n * Creates a builder that can create search queries.\n * This is a structured way to build search queries.\n */\nconst queryBuilder = (): QueryBuilder => {\n return _queryBuilder()\n}\n\n/**\n * Determines if the token is an Orm Property based statement\n * @param value\n */\nconst isPropertyBasedQuery = (value: any): value is Query => {\n if (!value || !value.type) {\n return false\n }\n return (\n value.type === 'property' ||\n value.type === 'datesBefore' ||\n value.type === 'datesAfter'\n )\n}\n\n/**\n * Determines if the value is a boolean\n * @param value - The value to examine.\n */\nconst isALinkToken = (value: any): value is BooleanQuery => {\n if (!value) {\n return false\n }\n if (typeof value !== 'string') {\n return false\n }\n value = value.toLowerCase()\n return value === 'and' || value === 'or'\n}\n\n/**\n * Creates an AND\n */\nconst and = () => 'AND'\n\n/**\n * Creates an OR\n */\nconst or = () => 'OR'\n\n/**\n * A helper query that is text based.\n * @param key - The property key/name\n * @param value - The value to match\n * @param options - Additional text based options\n */\nconst textQuery = (\n key: string,\n value: string | undefined | null,\n options?: Omit<Partial<PropertyOptions>, 'type' | 'equalitySymbol'>\n) =>\n property(\n key,\n value,\n Object.assign({}, options, {\n equalitySymbol: undefined,\n type: DatastoreValueType.string,\n })\n )\n\n/**\n * A helper query that is number based.\n * @param key - The property key/name\n * @param value - The value to match\n * @param equalitySymbol - A matching symbol for the number\n */\nconst numberQuery = (\n key: string,\n value: number | string | undefined | null,\n equalitySymbol: EqualitySymbol = EqualitySymbol.eq\n) =>\n property(key, value, {\n equalitySymbol,\n type: DatastoreValueType.number,\n })\n\n/**\n * A helper query that is for boolean values.\n * @param key - The property key/name\n * @param value - The value to match\n */\nconst booleanQuery = (key: string, value: boolean | undefined | null) =>\n property(key, value, {\n type: DatastoreValueType.boolean,\n equalitySymbol: EqualitySymbol.eq,\n })\n\n/**\n * A useful utility for processing {@link QueryTokens} with a {@link DatastoreAdapter}\n * Takes the first 3 values (property, LINK, property) and then shifts the list left by 2, so that it can create another property, LINK, property\n * @param data - The list of values\n */\nconst threeitize = <T>(data: T[]): T[][] => {\n if (data.length === 0 || data.length === 1) {\n return []\n }\n if (data.length % 2 === 0) {\n throw new Error('Must be an odd number of 3 or greater.')\n }\n const three = data.slice(0, THREE)\n const rest = data.slice(2)\n const moreThrees = threeitize(rest)\n return [three, ...moreThrees]\n}\n\nconst _validateTokenTypes = (token: QueryTokens) => {\n if (Array.isArray(token)) {\n token.forEach(_validateTokenTypes)\n return\n }\n if (isPropertyBasedQuery(token)) {\n return\n }\n if (isALinkToken(token)) {\n return\n }\n throw new Error(`Unknown token type ${token}`)\n}\n\nconst _validateTokenStructure = (o: QueryTokens[]) => {\n const first = o[0]\n if (first === 'AND' || first === 'OR') {\n throw new Error('Cannot have AND or OR at the very start.')\n }\n const last = o[o.length - 1]\n if (last === 'AND' || last === 'OR') {\n throw new Error('Cannot have AND or OR at the very end.')\n }\n if (o.every(x => x !== 'AND' && x !== 'OR')) {\n o.every(_validateArrayOrQuery)\n return\n }\n const totalLinks = o.filter(x => x === 'AND' || x === 'OR')\n const nonLinks = o.filter(x => x !== 'AND' && x !== 'OR')\n if (totalLinks.length !== nonLinks.length - 1) {\n throw new Error('Must separate each statement with an AND or OR')\n }\n // eslint-disable-next-line functional/immutable-data\n const threes = threeitize(o).reverse()\n threes.forEach(([a, l, b]) => {\n if (l !== 'AND' && l !== 'OR') {\n // @ts-ignore\n if (isPropertyBasedQuery(l)) {\n throw new Error('Must have AND/OR between property queries')\n }\n throw new Error('Must have AND/OR between nested queries')\n }\n _validateArrayOrQuery(a)\n _validateArrayOrQuery(b)\n })\n return\n}\n\nconst _validateArrayOrQuery = (o: QueryTokens) => {\n if (Array.isArray(o)) {\n _validateTokenStructure(o)\n return\n }\n if (isPropertyBasedQuery(o)) {\n return\n }\n throw new Error('Order of link tokens and queries invalid')\n}\n\nconst validateOrmSearch = (search: OrmSearch) => {\n if (Array.isArray(search.query) === false) {\n throw new Error(`Query must be an array`)\n }\n if (search.query.length < 1) {\n return\n }\n _validateTokenTypes(search.query)\n _validateTokenStructure(search.query)\n}\n\nexport {\n queryBuilder,\n take,\n pagination,\n sort,\n property,\n and,\n or,\n isALinkToken,\n isPropertyBasedQuery,\n datesBefore,\n datesAfter,\n textQuery,\n numberQuery,\n booleanQuery,\n threeitize,\n validateOrmSearch,\n}\n", "import {\n Arrayable,\n DataValue,\n Maybe,\n ModelInstance,\n ModelType,\n DataDescription,\n PrimaryKeyType,\n MinimalModelDefinition,\n PropertyConfig,\n ValidatorContext,\n ToObjectResult,\n ModelInstanceFetcher,\n ModelFactoryOptions,\n CreateParams,\n PropertyType,\n CanBeNullableType,\n} from '../types.js'\n\n/**\n * Equals symbols for doing database matching\n */\nexport enum EqualitySymbol {\n // Equals\n eq = '=',\n // Less than\n lt = '<',\n // Equal to or less than\n lte = '<=',\n // Greater than\n gt = '>',\n // Equal to or greater than\n gte = '>=',\n // Not equal to\n ne = '!=',\n}\n\n/**\n * The value types that map to database types.\n */\nexport enum DatastoreValueType {\n string = 'string',\n number = 'number',\n date = 'date',\n object = 'object',\n boolean = 'boolean',\n}\n\n/**\n * A list of allowable equality symbols.\n */\nexport const AllowableEqualitySymbols = Object.values(EqualitySymbol)\n\n/**\n * A function that can save.\n */\ntype SaveMethod<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n /**\n * An instance to save\n */\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<\n OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * A method that can delete\n */\ntype DeleteMethod<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<void>\n\n/**\n * A function that allows overriding the save functionality for a specific model.\n */\nexport type SaveOverride<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n existingSave: SaveMethod<TModelExtensions, TModelInstanceExtensions>,\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<\n OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * A function that allows overriding the delete functionality for a specific model.\n */\nexport type DeleteOverride<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n existingDelete: DeleteMethod<TModelExtensions, TModelInstanceExtensions>,\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<void>\n\n/**\n * A result of an ORM search.\n * @interface\n */\nexport type OrmSearchResult<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = Readonly<{\n /**\n * A list of instances\n */\n instances: readonly OrmModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >[]\n /**\n * An optional page value. The exact structure is provided by the datastore itself.\n */\n page?: any\n}>\n\n/**\n * ORM based ModelFactory extensions.\n * @interface\n */\nexport type OrmModelFactoryOptionsExtensions<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = Readonly<{\n /**\n * Optional: The save function to override.\n */\n save?: SaveOverride<TModelExtensions, TModelInstanceExtensions>\n /**\n * Optional: The delete function to override.\n */\n delete?: DeleteOverride<TModelExtensions, TModelInstanceExtensions>\n}>\n\n/**\n * Extensions to the Model type\n * @interface\n */\nexport type OrmModelExtensions<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = Readonly<{\n /**\n * Save the model\n * @param instance - The instance to save.\n */\n save: <TData extends DataDescription>(\n instance: OrmModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >\n ) => Promise<\n OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n >\n /**\n * Deletes an instance by its id.\n * @param id - The id to delete\n */\n delete: (id: PrimaryKeyType) => Promise<void>\n /**\n * Attempts to get an instance by its id\n * @param primaryKey\n */\n retrieve: <TData extends DataDescription>(\n primaryKey: PrimaryKeyType\n ) => Promise<\n Maybe<OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>>\n >\n /**\n * Searches instances by the provided search query\n * @param query\n */\n search: <TData extends DataDescription>(\n query: OrmSearch\n ) => Promise<\n OrmSearchResult<\n TData,\n OrmModel<TData, TModelExtensions, TModelInstanceExtensions>\n >\n >\n /**\n * Searches for a single instance with the given query.\n * @param query\n */\n searchOne: <TData extends DataDescription>(\n query: Omit<OrmSearch, 'take'>\n ) => Promise<\n | OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n | undefined\n >\n /**\n * Creates and saves an instance. An optimization in some databases\n * @param query\n */\n createAndSave: <TData extends DataDescription>(\n data: OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n ) => Promise<\n OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n >\n /**\n * Inserts multiple objects at once. Can often see great optimizations in some databases.\n * @param query\n */\n bulkInsert: <TData extends DataDescription>(\n instances: readonly OrmModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >[]\n ) => Promise<void>\n /**\n * Deletes multiple instances at once.\n * @param instances\n */\n bulkDelete: <TData extends DataDescription>(\n keysOrInstances:\n | readonly OrmModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >[]\n | readonly PrimaryKeyType[]\n ) => Promise<void>\n /**\n * Counts the number of models saved in the database.\n */\n count: () => Promise<number>\n}>\n\n/**\n * Instance overrides that give it ORM functions.\n * @interface\n */\nexport type OrmModelInstanceExtensions<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = Readonly<{\n /**\n * Save this model.\n */\n save: <TData extends DataDescription>() => Promise<\n OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n >\n /**\n * Delete this model.\n */\n delete: () => Promise<void>\n}>\n\n/**\n * ORM based configurations for a model.\n * @interface\n */\ntype OrmModelConfigurations = Readonly<{\n /**\n * Validator that there is only a single value in the datastore that has the properties given.\n * Example:\n * [\"name\", \"text\"]\n * This will make sure that there can only be a single row in the database that has a unique combination of name and text.\n */\n uniqueTogether?: readonly string[]\n}>\n\n/**\n * A minimum orm model definition\n * @interface\n */\nexport type MinimumOrmModelDefinition<TData extends DataDescription> =\n MinimalModelDefinition<TData> & OrmModelConfigurations\n\n/**\n * A model factory that produces ORM based models.\n *\n */\nexport type OrmModelFactory<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n TModelOptionsExtensions extends object = object,\n> = <TData extends DataDescription>(\n /**\n * The model definition for the model\n */\n modelDef: MinimumOrmModelDefinition<TData>,\n /**\n * Additional options for this model.\n */\n options?: ModelFactoryOptions<\n TData,\n OrmModelFactoryOptionsExtensions<\n TModelExtensions,\n TModelInstanceExtensions\n > &\n TModelOptionsExtensions\n >\n) => OrmModel<TData, TModelExtensions, TModelInstanceExtensions>\n\n/**\n * A search result from a datastore\n * @interface\n */\nexport type DatastoreSearchResult<T extends DataDescription> = Readonly<{\n /**\n * An array of objects that represent the data from the datastore.\n */\n instances: readonly ToObjectResult<T>[]\n /**\n * Any pagination information.\n */\n page?: any\n}>\n\n/**\n * A model that has ORM functions attached.\n * @interface\n */\nexport type OrmModel<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = ModelType<\n TData,\n OrmModelExtensions<TModelExtensions, TModelInstanceExtensions>,\n OrmModelInstanceExtensions<TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * A Model Instance with ORM functions attached.\n * @interface\n */\nexport type OrmModelInstance<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = ModelInstance<\n TData,\n OrmModelExtensions<TModelExtensions, TModelInstanceExtensions>,\n OrmModelInstanceExtensions<TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * An interface that describes a datastore. By implementing this interface, databases can be swapped.\n * @interface\n */\nexport type DatastoreAdapter = Readonly<{\n /**\n * Saving a model.\n * @param instance\n */\n save: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n ) => Promise<ToObjectResult<TData>>\n /**\n * Deleting an instance.\n * @param model\n * @param id\n */\n delete: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n id: PrimaryKeyType\n ) => Promise<void>\n /**\n * Attempts to retrieves an instance.\n * @param model\n * @param primaryKey\n */\n retrieve: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n primaryKey: PrimaryKeyType\n ) => Promise<Maybe<ToObjectResult<TData>>>\n /**\n * Searches for instances by a query.\n * @param model\n * @param query\n */\n search: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n query: OrmSearch\n ) => Promise<DatastoreSearchResult<TData>>\n /**\n * Optional: An optimized bulkInsert function. (Highly recommended)\n * @param model\n * @param instances\n */\n bulkInsert?: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n instances: readonly ModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >[]\n ) => Promise<void>\n /**\n * Optional: An optimized bulkDelete function. (Highly recommended)\n * @param model\n * @param keysOrInstances\n */\n bulkDelete?: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n keys: readonly PrimaryKeyType[]\n ) => Promise<void>\n /**\n * Optional: An optimized createAndSave function.\n * @param instance\n */\n createAndSave?: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n ) => Promise<ToObjectResult<TData>>\n /**\n * Optional: An optimized counting function. Highly recommended.\n * @param model\n */\n count?: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>\n ) => Promise<number>\n}>\n\n/**\n * A search that describes a property and its value.\n * @interface\n */\nexport type PropertyQuery = Readonly<{\n /**\n * Distinguishes this as a property query.\n */\n type: 'property'\n /**\n * The property's key\n */\n key: string\n /**\n * The value to search for.\n */\n value: any\n /**\n * The type of database value.\n */\n valueType: DatastoreValueType\n /**\n * How the value should be compared.\n */\n equalitySymbol: EqualitySymbol\n /**\n * Options for additional matching.\n */\n options: PropertyOptions\n}>\n\n/**\n * A property search for a string value.\n */\nexport type StringPropertyQuery = PropertyQuery & {\n valueType: DatastoreValueType.string\n equalitySymbol: EqualitySymbol.eq | EqualitySymbol.ne\n options: PropertyOptions\n}\n\n/**\n * A search that looks at dated objects after the given date.\n * @interface\n */\nexport type DatesAfterQuery = Readonly<{\n /**\n * Distinguishes this query\n */\n type: 'datesAfter'\n /**\n * The property's key\n */\n key: string\n /**\n * The date value being examined.\n */\n date: string\n /**\n * The database type.\n */\n valueType: DatastoreValueType\n /**\n * Options for additional searching\n */\n options: {\n /**\n * Should this search be equalsTo as well as after?\n */\n equalToAndAfter: boolean\n }\n}>\n\n/**\n * A search query that looks at dates before the given date.\n * @interface\n */\nexport type DatesBeforeQuery = Readonly<{\n /**\n * Distinguishes this query\n */\n type: 'datesBefore'\n /**\n * The property's key.\n */\n key: string\n /**\n * The date value being examined.\n */\n date: string\n /**\n * The database value type.\n */\n valueType: DatastoreValueType\n /**\n * Options for additional searching\n */\n options: {\n /**\n * Should this search be equalsTo as well as before?\n */\n equalToAndBefore: boolean\n }\n}>\n\n/**\n * Additional configurations for ORM based properties.\n * @interface\n */\nexport type OrmPropertyConfig<T extends Arrayable<DataValue>> =\n PropertyConfig<T> &\n Readonly<{\n /**\n * Validator: Checks to make sure that there is only one instance in a datastore that has this property's value.\n * NOTE: The value is a property KEY. Not true or false.\n */\n unique?: string\n }>\n\n/**\n * Additional context that is provided for ORM based instance.\n * @interface\n */\nexport type OrmValidatorContext = Readonly<{\n /**\n * IMPORTANT: Sometimes you do not want to do any ORM based validation because of speed.\n * This disables any orm based validation, and only runs non-orm validation.\n */\n noOrmValidation?: boolean\n}> &\n ValidatorContext\n\n/**\n * Options for a property query.\n */\nexport type PropertyOptions = {\n /**\n * Is this a case sensitive search?\n */\n caseSensitive?: boolean\n /**\n * Is the value a startsWith query?\n */\n startsWith?: boolean\n /**\n * Is the value a endsWith query?\n */\n endsWith?: boolean\n /**\n * Is the value a includes query?\n */\n includes?: boolean\n /**\n * The type of value\n */\n type?: DatastoreValueType\n /**\n * An equality symbol.\n */\n equalitySymbol?: EqualitySymbol\n}\n\n/**\n * An object that has both an Orm Model Factory (that can make Orm Models) as well as a loaded fetcher\n * that can retrieve referenced models as needed. See {@see \"functional-models.ModelReference\"}\n * @interface\n */\nexport type Orm = {\n /**\n * A model factory that can produce {@link OrmModel}\n */\n Model: OrmModelFactory\n /**\n * A fetcher for use with Model References\n */\n fetcher: ModelInstanceFetcher<OrmModelExtensions, OrmModelInstanceExtensions>\n}\n\n/**\n * The sort order.\n */\nexport enum SortOrder {\n asc = 'asc',\n dsc = 'dsc',\n}\n\n/**\n * The number of instances to receive back from a query.\n */\nexport type MaxMatchStatement = number\n\n/**\n * Defines how a sort should happen. Which column and what order.\n * @interface\n */\nexport type SortStatement = {\n /**\n * The property's key/name. Also could be a \"column\"\n */\n key: string\n /**\n * Ascending or Descending sort.\n */\n order: SortOrder\n}\n\n/**\n * Pagination can be anything.\n */\nexport type PaginationQuery = any\n\n/**\n * A query to a search function.\n * @interface\n */\nexport type OrmSearch = {\n /**\n * Optional: A number of max records to return.\n */\n take?: MaxMatchStatement\n /**\n * Optional: Sorting.\n */\n sort?: SortStatement\n /**\n * Optional: Pagination information\n */\n page?: PaginationQuery\n /**\n * Optional: Querying tokens.\n */\n query: readonly QueryTokens[]\n}\n\n/**\n * Statements that make up the meat of QueryTokens\n */\nexport type Query =\n | PropertyQuery\n | DatesAfterQuery\n | DatesBeforeQuery\n | StringPropertyQuery\n\n/**\n * A token type that links two queries together.\n */\nexport type BooleanQuery = 'AND' | 'OR'\n\n/**\n * A generic structure of querys.\n */\nexport type QueryTokens =\n | readonly QueryTokens[][]\n | readonly QueryTokens[]\n | BooleanQuery\n | Query\n\n/**\n * Builder functions that are not property related.\n * @interface\n */\ntype NonQueryBuilder = Readonly<{\n /**\n * Creates a pagination.\n * @param value - Can be anything\n */\n pagination: (value: any) => BuilderV2Link & InnerBuilderV2\n /**\n * Creates a sort.\n * @param key - The key to sort on\n * @param sortOrder - The order to sort by. Defaults to ascending.\n */\n sort: (key: string, sortOrder?: SortOrder) => BuilderV2Link & InnerBuilderV2\n /**\n * Maximum number of elements to return.\n * @param count - The count\n */\n take: (count: number) => BuilderV2Link & InnerBuilderV2\n /**\n * Compiles the builder into a search query.\n */\n compile: () => OrmSearch\n}>\n\n/**\n * An in between or ending type to a builder creating a SearchQuery\n * @interface\n */\nexport type BuilderV2Link = NonQueryBuilder &\n Readonly<{\n /**\n * Links together two or more {@link Query} or complex queries.\n */\n and: () => QueryBuilder\n /**\n * Links together two or more {@link Query} or complex queries.\n */\n or: () => QueryBuilder\n }>\n\n/**\n * A function that can either take a builder or raw QueryTokens[] and create a sub-query.\n * @param builder - Can be either a BuilderV2 or a hand written Query\n **/\nexport type SubBuilderFunction = (\n builder: QueryBuilder\n) => Omit<OrmSearch, 'take' | 'sort' | 'page'> | (QueryBuilder | BuilderV2Link)\n\n/**\n * A search builder is a structured way to create a complex query.\n * @interface\n */\nexport type QueryBuilder = InnerBuilderV2 & NonQueryBuilder\n\n/**\n * A builder for version 3.0 search queries.\n * @interface\n */\nexport type InnerBuilderV2 = {\n /**\n * Creates a query that has nested property queries.\n * @param subBuilderFunc - A function that can return a Builder\n */\n complex: (subBuilderFunc: SubBuilderFunction) => BuilderV2Link\n /**\n * Searches for elements that are after the given date.\n * NOTE: It can be very important to set the valueType to either string or Date depending on what datastore you are using.\n * @param key - The property name/key to use.\n * @param jsDate - The date to search.\n * @param options - Additional options.\n */\n datesAfter: (\n key: string,\n jsDate: Date | string,\n options?: { valueType?: DatastoreValueType; equalToAndAfter?: boolean }\n ) => BuilderV2Link\n /**\n * Searches for elements that are before the given date.\n * NOTE: It can be very important to set the valueType to either string or Date depending on what datastore you are using.\n * @param key - The property name/key to use.\n * @param jsDate - The date to search.\n * @param options - Additional options.\n */\n datesBefore: (\n key: string,\n jsDate: Date | string,\n options?: { valueType?: DatastoreValueType; equalToAndBefore?: boolean }\n ) => BuilderV2Link\n /**\n * Search a value\n * @param key - The property name/key to use.\n * @param value - The value to match.\n * @param options - Additional options.\n */\n property: (\n key: string,\n value: any,\n options?: Partial<PropertyOptions>\n ) => BuilderV2Link\n}\n\n/**\n * The types of primary key properties.\n */\nexport type PrimaryKeyPropertyType =\n | PropertyType.UniqueId\n | PropertyType.Text\n | PropertyType.Integer\n\n/**\n * A function that can generate a primary key for a model.\n * @param model - The model to generate a primary key for.\n * @returns A promise that resolves to the primary key.\n */\nexport type PrimaryKeyGenerator = <\n TValue extends PrimaryKeyType,\n TData extends DataDescription,\n>(\n value: TValue,\n modelData: CreateParams<TData>,\n instance: ModelInstance<TData>\n) => Promise<PrimaryKeyType>\n\n/**\n * A property that represents a key in a database.\n * By default it is a \"uuid\" type, but if you want to use an arbitrary string, or an integer type you can set the `dataType` property.\n * @interface\n */\nexport type DatabaseKeyPropertyConfig<\n TValue extends CanBeNullableType<PrimaryKeyType> = PrimaryKeyType,\n> = PropertyConfig<TValue> &\n Readonly<{\n /**\n * Sets the type of the key.\n * @default PrimaryKeyDataType.Uuid\n */\n dataType?: PrimaryKeyPropertyType\n /**\n * If true, the key will be automatically generated if not provided. Only applies to uuids and integers\n * @default true\n */\n auto?: boolean\n /**\n * Optional: A custom primary key generator function to use for models. If the property type is UniqueId (default) then this will produce random UUID. If the property type is a number, a random number will be generated.\n * If using a SQL-like database that uses numbers, its HIGHLY recommended to get a number from the database itself.\n */\n primaryKeyGenerator?: PrimaryKeyGenerator\n }>\n"],
5
+ "mappings": "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",
6
+ "names": ["EqualitySymbol", "omit", "merge"]
7
+ }
@@ -0,0 +1,59 @@
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/orm/types.ts
21
+ var types_exports = {};
22
+ __export(types_exports, {
23
+ AllowableEqualitySymbols: () => AllowableEqualitySymbols,
24
+ DatastoreValueType: () => DatastoreValueType,
25
+ EqualitySymbol: () => EqualitySymbol,
26
+ SortOrder: () => SortOrder
27
+ });
28
+ module.exports = __toCommonJS(types_exports);
29
+ var EqualitySymbol = /* @__PURE__ */ ((EqualitySymbol2) => {
30
+ EqualitySymbol2["eq"] = "=";
31
+ EqualitySymbol2["lt"] = "<";
32
+ EqualitySymbol2["lte"] = "<=";
33
+ EqualitySymbol2["gt"] = ">";
34
+ EqualitySymbol2["gte"] = ">=";
35
+ EqualitySymbol2["ne"] = "!=";
36
+ return EqualitySymbol2;
37
+ })(EqualitySymbol || {});
38
+ var DatastoreValueType = /* @__PURE__ */ ((DatastoreValueType2) => {
39
+ DatastoreValueType2["string"] = "string";
40
+ DatastoreValueType2["number"] = "number";
41
+ DatastoreValueType2["date"] = "date";
42
+ DatastoreValueType2["object"] = "object";
43
+ DatastoreValueType2["boolean"] = "boolean";
44
+ return DatastoreValueType2;
45
+ })(DatastoreValueType || {});
46
+ var AllowableEqualitySymbols = Object.values(EqualitySymbol);
47
+ var SortOrder = /* @__PURE__ */ ((SortOrder2) => {
48
+ SortOrder2["asc"] = "asc";
49
+ SortOrder2["dsc"] = "dsc";
50
+ return SortOrder2;
51
+ })(SortOrder || {});
52
+ // Annotate the CommonJS export names for ESM import in node:
53
+ 0 && (module.exports = {
54
+ AllowableEqualitySymbols,
55
+ DatastoreValueType,
56
+ EqualitySymbol,
57
+ SortOrder
58
+ });
59
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/orm/types.ts"],
4
+ "sourcesContent": ["import {\n Arrayable,\n DataValue,\n Maybe,\n ModelInstance,\n ModelType,\n DataDescription,\n PrimaryKeyType,\n MinimalModelDefinition,\n PropertyConfig,\n ValidatorContext,\n ToObjectResult,\n ModelInstanceFetcher,\n ModelFactoryOptions,\n CreateParams,\n PropertyType,\n CanBeNullableType,\n} from '../types.js'\n\n/**\n * Equals symbols for doing database matching\n */\nexport enum EqualitySymbol {\n // Equals\n eq = '=',\n // Less than\n lt = '<',\n // Equal to or less than\n lte = '<=',\n // Greater than\n gt = '>',\n // Equal to or greater than\n gte = '>=',\n // Not equal to\n ne = '!=',\n}\n\n/**\n * The value types that map to database types.\n */\nexport enum DatastoreValueType {\n string = 'string',\n number = 'number',\n date = 'date',\n object = 'object',\n boolean = 'boolean',\n}\n\n/**\n * A list of allowable equality symbols.\n */\nexport const AllowableEqualitySymbols = Object.values(EqualitySymbol)\n\n/**\n * A function that can save.\n */\ntype SaveMethod<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n /**\n * An instance to save\n */\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<\n OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * A method that can delete\n */\ntype DeleteMethod<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<void>\n\n/**\n * A function that allows overriding the save functionality for a specific model.\n */\nexport type SaveOverride<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n existingSave: SaveMethod<TModelExtensions, TModelInstanceExtensions>,\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<\n OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * A function that allows overriding the delete functionality for a specific model.\n */\nexport type DeleteOverride<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = <TData extends DataDescription>(\n existingDelete: DeleteMethod<TModelExtensions, TModelInstanceExtensions>,\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n) => Promise<void>\n\n/**\n * A result of an ORM search.\n * @interface\n */\nexport type OrmSearchResult<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = Readonly<{\n /**\n * A list of instances\n */\n instances: readonly OrmModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >[]\n /**\n * An optional page value. The exact structure is provided by the datastore itself.\n */\n page?: any\n}>\n\n/**\n * ORM based ModelFactory extensions.\n * @interface\n */\nexport type OrmModelFactoryOptionsExtensions<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = Readonly<{\n /**\n * Optional: The save function to override.\n */\n save?: SaveOverride<TModelExtensions, TModelInstanceExtensions>\n /**\n * Optional: The delete function to override.\n */\n delete?: DeleteOverride<TModelExtensions, TModelInstanceExtensions>\n}>\n\n/**\n * Extensions to the Model type\n * @interface\n */\nexport type OrmModelExtensions<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = Readonly<{\n /**\n * Save the model\n * @param instance - The instance to save.\n */\n save: <TData extends DataDescription>(\n instance: OrmModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >\n ) => Promise<\n OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n >\n /**\n * Deletes an instance by its id.\n * @param id - The id to delete\n */\n delete: (id: PrimaryKeyType) => Promise<void>\n /**\n * Attempts to get an instance by its id\n * @param primaryKey\n */\n retrieve: <TData extends DataDescription>(\n primaryKey: PrimaryKeyType\n ) => Promise<\n Maybe<OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>>\n >\n /**\n * Searches instances by the provided search query\n * @param query\n */\n search: <TData extends DataDescription>(\n query: OrmSearch\n ) => Promise<\n OrmSearchResult<\n TData,\n OrmModel<TData, TModelExtensions, TModelInstanceExtensions>\n >\n >\n /**\n * Searches for a single instance with the given query.\n * @param query\n */\n searchOne: <TData extends DataDescription>(\n query: Omit<OrmSearch, 'take'>\n ) => Promise<\n | OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n | undefined\n >\n /**\n * Creates and saves an instance. An optimization in some databases\n * @param query\n */\n createAndSave: <TData extends DataDescription>(\n data: OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n ) => Promise<\n OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n >\n /**\n * Inserts multiple objects at once. Can often see great optimizations in some databases.\n * @param query\n */\n bulkInsert: <TData extends DataDescription>(\n instances: readonly OrmModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >[]\n ) => Promise<void>\n /**\n * Deletes multiple instances at once.\n * @param instances\n */\n bulkDelete: <TData extends DataDescription>(\n keysOrInstances:\n | readonly OrmModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >[]\n | readonly PrimaryKeyType[]\n ) => Promise<void>\n /**\n * Counts the number of models saved in the database.\n */\n count: () => Promise<number>\n}>\n\n/**\n * Instance overrides that give it ORM functions.\n * @interface\n */\nexport type OrmModelInstanceExtensions<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = Readonly<{\n /**\n * Save this model.\n */\n save: <TData extends DataDescription>() => Promise<\n OrmModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n >\n /**\n * Delete this model.\n */\n delete: () => Promise<void>\n}>\n\n/**\n * ORM based configurations for a model.\n * @interface\n */\ntype OrmModelConfigurations = Readonly<{\n /**\n * Validator that there is only a single value in the datastore that has the properties given.\n * Example:\n * [\"name\", \"text\"]\n * This will make sure that there can only be a single row in the database that has a unique combination of name and text.\n */\n uniqueTogether?: readonly string[]\n}>\n\n/**\n * A minimum orm model definition\n * @interface\n */\nexport type MinimumOrmModelDefinition<TData extends DataDescription> =\n MinimalModelDefinition<TData> & OrmModelConfigurations\n\n/**\n * A model factory that produces ORM based models.\n *\n */\nexport type OrmModelFactory<\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n TModelOptionsExtensions extends object = object,\n> = <TData extends DataDescription>(\n /**\n * The model definition for the model\n */\n modelDef: MinimumOrmModelDefinition<TData>,\n /**\n * Additional options for this model.\n */\n options?: ModelFactoryOptions<\n TData,\n OrmModelFactoryOptionsExtensions<\n TModelExtensions,\n TModelInstanceExtensions\n > &\n TModelOptionsExtensions\n >\n) => OrmModel<TData, TModelExtensions, TModelInstanceExtensions>\n\n/**\n * A search result from a datastore\n * @interface\n */\nexport type DatastoreSearchResult<T extends DataDescription> = Readonly<{\n /**\n * An array of objects that represent the data from the datastore.\n */\n instances: readonly ToObjectResult<T>[]\n /**\n * Any pagination information.\n */\n page?: any\n}>\n\n/**\n * A model that has ORM functions attached.\n * @interface\n */\nexport type OrmModel<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = ModelType<\n TData,\n OrmModelExtensions<TModelExtensions, TModelInstanceExtensions>,\n OrmModelInstanceExtensions<TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * A Model Instance with ORM functions attached.\n * @interface\n */\nexport type OrmModelInstance<\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n> = ModelInstance<\n TData,\n OrmModelExtensions<TModelExtensions, TModelInstanceExtensions>,\n OrmModelInstanceExtensions<TModelExtensions, TModelInstanceExtensions>\n>\n\n/**\n * An interface that describes a datastore. By implementing this interface, databases can be swapped.\n * @interface\n */\nexport type DatastoreAdapter = Readonly<{\n /**\n * Saving a model.\n * @param instance\n */\n save: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n ) => Promise<ToObjectResult<TData>>\n /**\n * Deleting an instance.\n * @param model\n * @param id\n */\n delete: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n id: PrimaryKeyType\n ) => Promise<void>\n /**\n * Attempts to retrieves an instance.\n * @param model\n * @param primaryKey\n */\n retrieve: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n primaryKey: PrimaryKeyType\n ) => Promise<Maybe<ToObjectResult<TData>>>\n /**\n * Searches for instances by a query.\n * @param model\n * @param query\n */\n search: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n query: OrmSearch\n ) => Promise<DatastoreSearchResult<TData>>\n /**\n * Optional: An optimized bulkInsert function. (Highly recommended)\n * @param model\n * @param instances\n */\n bulkInsert?: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n instances: readonly ModelInstance<\n TData,\n TModelExtensions,\n TModelInstanceExtensions\n >[]\n ) => Promise<void>\n /**\n * Optional: An optimized bulkDelete function. (Highly recommended)\n * @param model\n * @param keysOrInstances\n */\n bulkDelete?: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>,\n keys: readonly PrimaryKeyType[]\n ) => Promise<void>\n /**\n * Optional: An optimized createAndSave function.\n * @param instance\n */\n createAndSave?: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n instance: ModelInstance<TData, TModelExtensions, TModelInstanceExtensions>\n ) => Promise<ToObjectResult<TData>>\n /**\n * Optional: An optimized counting function. Highly recommended.\n * @param model\n */\n count?: <\n TData extends DataDescription,\n TModelExtensions extends object = object,\n TModelInstanceExtensions extends object = object,\n >(\n model: OrmModel<TData, TModelExtensions, TModelInstanceExtensions>\n ) => Promise<number>\n}>\n\n/**\n * A search that describes a property and its value.\n * @interface\n */\nexport type PropertyQuery = Readonly<{\n /**\n * Distinguishes this as a property query.\n */\n type: 'property'\n /**\n * The property's key\n */\n key: string\n /**\n * The value to search for.\n */\n value: any\n /**\n * The type of database value.\n */\n valueType: DatastoreValueType\n /**\n * How the value should be compared.\n */\n equalitySymbol: EqualitySymbol\n /**\n * Options for additional matching.\n */\n options: PropertyOptions\n}>\n\n/**\n * A property search for a string value.\n */\nexport type StringPropertyQuery = PropertyQuery & {\n valueType: DatastoreValueType.string\n equalitySymbol: EqualitySymbol.eq | EqualitySymbol.ne\n options: PropertyOptions\n}\n\n/**\n * A search that looks at dated objects after the given date.\n * @interface\n */\nexport type DatesAfterQuery = Readonly<{\n /**\n * Distinguishes this query\n */\n type: 'datesAfter'\n /**\n * The property's key\n */\n key: string\n /**\n * The date value being examined.\n */\n date: string\n /**\n * The database type.\n */\n valueType: DatastoreValueType\n /**\n * Options for additional searching\n */\n options: {\n /**\n * Should this search be equalsTo as well as after?\n */\n equalToAndAfter: boolean\n }\n}>\n\n/**\n * A search query that looks at dates before the given date.\n * @interface\n */\nexport type DatesBeforeQuery = Readonly<{\n /**\n * Distinguishes this query\n */\n type: 'datesBefore'\n /**\n * The property's key.\n */\n key: string\n /**\n * The date value being examined.\n */\n date: string\n /**\n * The database value type.\n */\n valueType: DatastoreValueType\n /**\n * Options for additional searching\n */\n options: {\n /**\n * Should this search be equalsTo as well as before?\n */\n equalToAndBefore: boolean\n }\n}>\n\n/**\n * Additional configurations for ORM based properties.\n * @interface\n */\nexport type OrmPropertyConfig<T extends Arrayable<DataValue>> =\n PropertyConfig<T> &\n Readonly<{\n /**\n * Validator: Checks to make sure that there is only one instance in a datastore that has this property's value.\n * NOTE: The value is a property KEY. Not true or false.\n */\n unique?: string\n }>\n\n/**\n * Additional context that is provided for ORM based instance.\n * @interface\n */\nexport type OrmValidatorContext = Readonly<{\n /**\n * IMPORTANT: Sometimes you do not want to do any ORM based validation because of speed.\n * This disables any orm based validation, and only runs non-orm validation.\n */\n noOrmValidation?: boolean\n}> &\n ValidatorContext\n\n/**\n * Options for a property query.\n */\nexport type PropertyOptions = {\n /**\n * Is this a case sensitive search?\n */\n caseSensitive?: boolean\n /**\n * Is the value a startsWith query?\n */\n startsWith?: boolean\n /**\n * Is the value a endsWith query?\n */\n endsWith?: boolean\n /**\n * Is the value a includes query?\n */\n includes?: boolean\n /**\n * The type of value\n */\n type?: DatastoreValueType\n /**\n * An equality symbol.\n */\n equalitySymbol?: EqualitySymbol\n}\n\n/**\n * An object that has both an Orm Model Factory (that can make Orm Models) as well as a loaded fetcher\n * that can retrieve referenced models as needed. See {@see \"functional-models.ModelReference\"}\n * @interface\n */\nexport type Orm = {\n /**\n * A model factory that can produce {@link OrmModel}\n */\n Model: OrmModelFactory\n /**\n * A fetcher for use with Model References\n */\n fetcher: ModelInstanceFetcher<OrmModelExtensions, OrmModelInstanceExtensions>\n}\n\n/**\n * The sort order.\n */\nexport enum SortOrder {\n asc = 'asc',\n dsc = 'dsc',\n}\n\n/**\n * The number of instances to receive back from a query.\n */\nexport type MaxMatchStatement = number\n\n/**\n * Defines how a sort should happen. Which column and what order.\n * @interface\n */\nexport type SortStatement = {\n /**\n * The property's key/name. Also could be a \"column\"\n */\n key: string\n /**\n * Ascending or Descending sort.\n */\n order: SortOrder\n}\n\n/**\n * Pagination can be anything.\n */\nexport type PaginationQuery = any\n\n/**\n * A query to a search function.\n * @interface\n */\nexport type OrmSearch = {\n /**\n * Optional: A number of max records to return.\n */\n take?: MaxMatchStatement\n /**\n * Optional: Sorting.\n */\n sort?: SortStatement\n /**\n * Optional: Pagination information\n */\n page?: PaginationQuery\n /**\n * Optional: Querying tokens.\n */\n query: readonly QueryTokens[]\n}\n\n/**\n * Statements that make up the meat of QueryTokens\n */\nexport type Query =\n | PropertyQuery\n | DatesAfterQuery\n | DatesBeforeQuery\n | StringPropertyQuery\n\n/**\n * A token type that links two queries together.\n */\nexport type BooleanQuery = 'AND' | 'OR'\n\n/**\n * A generic structure of querys.\n */\nexport type QueryTokens =\n | readonly QueryTokens[][]\n | readonly QueryTokens[]\n | BooleanQuery\n | Query\n\n/**\n * Builder functions that are not property related.\n * @interface\n */\ntype NonQueryBuilder = Readonly<{\n /**\n * Creates a pagination.\n * @param value - Can be anything\n */\n pagination: (value: any) => BuilderV2Link & InnerBuilderV2\n /**\n * Creates a sort.\n * @param key - The key to sort on\n * @param sortOrder - The order to sort by. Defaults to ascending.\n */\n sort: (key: string, sortOrder?: SortOrder) => BuilderV2Link & InnerBuilderV2\n /**\n * Maximum number of elements to return.\n * @param count - The count\n */\n take: (count: number) => BuilderV2Link & InnerBuilderV2\n /**\n * Compiles the builder into a search query.\n */\n compile: () => OrmSearch\n}>\n\n/**\n * An in between or ending type to a builder creating a SearchQuery\n * @interface\n */\nexport type BuilderV2Link = NonQueryBuilder &\n Readonly<{\n /**\n * Links together two or more {@link Query} or complex queries.\n */\n and: () => QueryBuilder\n /**\n * Links together two or more {@link Query} or complex queries.\n */\n or: () => QueryBuilder\n }>\n\n/**\n * A function that can either take a builder or raw QueryTokens[] and create a sub-query.\n * @param builder - Can be either a BuilderV2 or a hand written Query\n **/\nexport type SubBuilderFunction = (\n builder: QueryBuilder\n) => Omit<OrmSearch, 'take' | 'sort' | 'page'> | (QueryBuilder | BuilderV2Link)\n\n/**\n * A search builder is a structured way to create a complex query.\n * @interface\n */\nexport type QueryBuilder = InnerBuilderV2 & NonQueryBuilder\n\n/**\n * A builder for version 3.0 search queries.\n * @interface\n */\nexport type InnerBuilderV2 = {\n /**\n * Creates a query that has nested property queries.\n * @param subBuilderFunc - A function that can return a Builder\n */\n complex: (subBuilderFunc: SubBuilderFunction) => BuilderV2Link\n /**\n * Searches for elements that are after the given date.\n * NOTE: It can be very important to set the valueType to either string or Date depending on what datastore you are using.\n * @param key - The property name/key to use.\n * @param jsDate - The date to search.\n * @param options - Additional options.\n */\n datesAfter: (\n key: string,\n jsDate: Date | string,\n options?: { valueType?: DatastoreValueType; equalToAndAfter?: boolean }\n ) => BuilderV2Link\n /**\n * Searches for elements that are before the given date.\n * NOTE: It can be very important to set the valueType to either string or Date depending on what datastore you are using.\n * @param key - The property name/key to use.\n * @param jsDate - The date to search.\n * @param options - Additional options.\n */\n datesBefore: (\n key: string,\n jsDate: Date | string,\n options?: { valueType?: DatastoreValueType; equalToAndBefore?: boolean }\n ) => BuilderV2Link\n /**\n * Search a value\n * @param key - The property name/key to use.\n * @param value - The value to match.\n * @param options - Additional options.\n */\n property: (\n key: string,\n value: any,\n options?: Partial<PropertyOptions>\n ) => BuilderV2Link\n}\n\n/**\n * The types of primary key properties.\n */\nexport type PrimaryKeyPropertyType =\n | PropertyType.UniqueId\n | PropertyType.Text\n | PropertyType.Integer\n\n/**\n * A function that can generate a primary key for a model.\n * @param model - The model to generate a primary key for.\n * @returns A promise that resolves to the primary key.\n */\nexport type PrimaryKeyGenerator = <\n TValue extends PrimaryKeyType,\n TData extends DataDescription,\n>(\n value: TValue,\n modelData: CreateParams<TData>,\n instance: ModelInstance<TData>\n) => Promise<PrimaryKeyType>\n\n/**\n * A property that represents a key in a database.\n * By default it is a \"uuid\" type, but if you want to use an arbitrary string, or an integer type you can set the `dataType` property.\n * @interface\n */\nexport type DatabaseKeyPropertyConfig<\n TValue extends CanBeNullableType<PrimaryKeyType> = PrimaryKeyType,\n> = PropertyConfig<TValue> &\n Readonly<{\n /**\n * Sets the type of the key.\n * @default PrimaryKeyDataType.Uuid\n */\n dataType?: PrimaryKeyPropertyType\n /**\n * If true, the key will be automatically generated if not provided. Only applies to uuids and integers\n * @default true\n */\n auto?: boolean\n /**\n * Optional: A custom primary key generator function to use for models. If the property type is UniqueId (default) then this will produce random UUID. If the property type is a number, a random number will be generated.\n * If using a SQL-like database that uses numbers, its HIGHLY recommended to get a number from the database itself.\n */\n primaryKeyGenerator?: PrimaryKeyGenerator\n }>\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBO,IAAK,iBAAL,kBAAKA,oBAAL;AAEL,EAAAA,gBAAA,QAAK;AAEL,EAAAA,gBAAA,QAAK;AAEL,EAAAA,gBAAA,SAAM;AAEN,EAAAA,gBAAA,QAAK;AAEL,EAAAA,gBAAA,SAAM;AAEN,EAAAA,gBAAA,QAAK;AAZK,SAAAA;AAAA,GAAA;AAkBL,IAAK,qBAAL,kBAAKC,wBAAL;AACL,EAAAA,oBAAA,YAAS;AACT,EAAAA,oBAAA,YAAS;AACT,EAAAA,oBAAA,UAAO;AACP,EAAAA,oBAAA,YAAS;AACT,EAAAA,oBAAA,aAAU;AALA,SAAAA;AAAA,GAAA;AAWL,IAAM,2BAA2B,OAAO,OAAO,cAAc;AA2kB7D,IAAK,YAAL,kBAAKC,eAAL;AACL,EAAAA,WAAA,SAAM;AACN,EAAAA,WAAA,SAAM;AAFI,SAAAA;AAAA,GAAA;",
6
+ "names": ["EqualitySymbol", "DatastoreValueType", "SortOrder"]
7
+ }