functional-models 3.0.5 → 3.0.7
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/README.md +45 -5
- package/index.d.ts +2 -0
- package/index.js +3 -1
- package/index.js.map +1 -1
- package/lib.d.ts +6 -2
- package/lib.js +8 -1
- package/lib.js.map +1 -1
- package/orm/index.d.ts +9 -0
- package/orm/index.js +49 -0
- package/orm/index.js.map +1 -0
- package/orm/models.d.ts +12 -0
- package/orm/models.js +232 -0
- package/orm/models.js.map +1 -0
- package/orm/properties.d.ts +31 -0
- package/orm/properties.js +36 -0
- package/orm/properties.js.map +1 -0
- package/orm/query.d.ts +121 -0
- package/orm/query.js +279 -0
- package/orm/query.js.map +1 -0
- package/orm/types.d.ts +551 -0
- package/orm/types.js +44 -0
- package/orm/types.js.map +1 -0
- package/orm/validation.d.ts +21 -0
- package/orm/validation.js +93 -0
- package/orm/validation.js.map +1 -0
- package/package.json +2 -1
- package/types.d.ts +14 -6
- package/types.js.map +1 -1
- package/utils.d.ts +2 -1
- package/utils.js +15 -1
- package/utils.js.map +1 -1
package/README.md
CHANGED
|
@@ -28,12 +28,12 @@ This framework was born out of the enjoyment and power of working with Django mo
|
|
|
28
28
|
|
|
29
29
|
- Define models that have robust properties and are scoped to a namespace or app
|
|
30
30
|
- Robust typing system for TypeScript goodness.
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
- ORM
|
|
34
|
-
- Most common properties out of the box.
|
|
31
|
+
- The same modeling code can be used on front end and backends.
|
|
32
|
+
- Complete validation system for both properties and overall models.
|
|
33
|
+
- ORM built-in with optional libraries that provide the database backends. Available Datastores: DynamoDb, Mongo, in-memory, elastic/opensearch, Sqlite, Postgres, Mysql
|
|
34
|
+
- Most common properties provided out of the box.
|
|
35
35
|
- Supports "foreign keys", 1 to 1 as well as 1 to many (via an Array).
|
|
36
|
-
- Models support custom primary
|
|
36
|
+
- Models support custom primary keys. (The key "id" is used by default)
|
|
37
37
|
- Supports different model namings, (plural, singular, display), and the ability to customize them.
|
|
38
38
|
- Add Api Information that can be used for auto-generating frontend and backend code as well as documentation.
|
|
39
39
|
|
|
@@ -43,6 +43,7 @@ This framework was born out of the enjoyment and power of working with Django mo
|
|
|
43
43
|
- [Simple JavasScript Example](#simple-javascript-example-usage)
|
|
44
44
|
- [Simple TypeScript Example](#simple-typescript-example-usage)
|
|
45
45
|
- [Validation](#validation)
|
|
46
|
+
- [ORM Backed Models](#orm-backed-models)
|
|
46
47
|
- [Properties](#properties)
|
|
47
48
|
- [List of Properties](#list-of-properties-out-of-the-box)
|
|
48
49
|
|
|
@@ -51,6 +52,7 @@ This framework was born out of the enjoyment and power of working with Django mo
|
|
|
51
52
|
Version 3 is a major update that changes most of the primary interfaces from Version 2. This version should be simpler to extend (see the companion library [Functional Models Orm](https://github.com/monolithst/functional-models-orm)) making models much easier to reuse across front and back ends. Here is a non-exhaustive list.
|
|
52
53
|
|
|
53
54
|
- Model/ModelInstance/ModelFactory types have been reworked, so that they are simpler and much easier to extend
|
|
55
|
+
- ORM code from `functional-models-orm` is now included. No additional libraries needed!
|
|
54
56
|
- Some "automagical" stuff has been removed, because experience has shown them to be more of a hassle than they were worth.
|
|
55
57
|
- Interfaces for ModelType/ModelInstance/ModelDefinitions have been reworked
|
|
56
58
|
- API Endpoint information can be added to a ModelDefinition
|
|
@@ -365,6 +367,36 @@ const checkForDuplicateValues = (
|
|
|
365
367
|
}
|
|
366
368
|
```
|
|
367
369
|
|
|
370
|
+
## Orm Backed Models
|
|
371
|
+
|
|
372
|
+
You can add datastore functionality to models and their instances by simply swapping out the Model Factory that creates your model. <b>This is a key concept for supporting frontend as well as backend development with the same models.</b>
|
|
373
|
+
|
|
374
|
+
Every model gets the following functions:
|
|
375
|
+
|
|
376
|
+
```
|
|
377
|
+
save() - Saves an instance passed in
|
|
378
|
+
delete() - Deletes an instance with the given primary key
|
|
379
|
+
retrieve() - Gets a saved instance by its primary key
|
|
380
|
+
search() - Searches for instances
|
|
381
|
+
searchOne() - Seaches for one instance
|
|
382
|
+
createAndSave() - Creates and then saves an instance
|
|
383
|
+
bulkInsert() - Bulk inserts many instances
|
|
384
|
+
count() - Counts the number of saved instances
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
Every model instance gets the following functions:
|
|
388
|
+
|
|
389
|
+
```
|
|
390
|
+
save() - Saves this instance
|
|
391
|
+
delete() - Deletes this instance
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
For additional information on the ORM system see:
|
|
395
|
+
|
|
396
|
+
[How To Use the ORM](https://monolithst.github.io/functional-models/documents/How_to_Use_the_ORM.html)
|
|
397
|
+
|
|
398
|
+
[How To Use a Model in a Frontend and Backend](https://monolithst.github.io/functional-models/documents/How_to_Use_a_model_in_a_Frontend_and_Backend.html)
|
|
399
|
+
|
|
368
400
|
## Properties
|
|
369
401
|
|
|
370
402
|
There are numerous properties that are supported out of the box that cover most data modeling needs. It is also very easy to create custom properties that encapsulate unique choices
|
|
@@ -576,3 +608,11 @@ console.info(id)
|
|
|
576
608
|
In this situation, the latinName for species is not passed in, but calculated from the two other properties. This becomes the primary key for this object, which is unique.
|
|
577
609
|
|
|
578
610
|
[Documentation](https://monolithst.github.io/functional-models/functions/index.properties.NaturalIdProperty.html)
|
|
611
|
+
|
|
612
|
+
### ORM Properties
|
|
613
|
+
|
|
614
|
+
#### LastModifiedDateProperty
|
|
615
|
+
|
|
616
|
+
A date property that automatically updates whenever the model instance is saved.
|
|
617
|
+
|
|
618
|
+
[Documentation](https://monolithst.github.io/functional-models/functions/index.orm.properties.LastModifiedDateProperty.html)
|
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -36,7 +36,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
36
36
|
};
|
|
37
37
|
})();
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.errors = exports.validation = exports.properties = exports.models = exports.types = void 0;
|
|
39
|
+
exports.orm = exports.errors = exports.validation = exports.properties = exports.models = exports.types = void 0;
|
|
40
40
|
__exportStar(require("./types"), exports);
|
|
41
41
|
exports.types = __importStar(require("./types"));
|
|
42
42
|
__exportStar(require("./models"), exports);
|
|
@@ -47,4 +47,6 @@ __exportStar(require("./validation"), exports);
|
|
|
47
47
|
exports.validation = __importStar(require("./validation"));
|
|
48
48
|
__exportStar(require("./errors"), exports);
|
|
49
49
|
exports.errors = __importStar(require("./errors"));
|
|
50
|
+
exports.orm = __importStar(require("./orm"));
|
|
51
|
+
__exportStar(require("./orm"), exports);
|
|
50
52
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0CAAuB;AACvB,iDAAgC;AAChC,2CAAwB;AACxB,mDAAkC;AAClC,+CAA4B;AAC5B,2DAA0C;AAC1C,+CAA4B;AAC5B,2DAA0C;AAC1C,2CAAwB;AACxB,mDAAkC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0CAAuB;AACvB,iDAAgC;AAChC,2CAAwB;AACxB,mDAAkC;AAClC,+CAA4B;AAC5B,2DAA0C;AAC1C,+CAA4B;AAC5B,2DAA0C;AAC1C,2CAAwB;AACxB,mDAAkC;AAClC,6CAA4B;AAC5B,wCAAqB"}
|
package/lib.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OpenAPIV3 } from 'openapi-types';
|
|
2
|
-
import { ApiInfo, ApiInfoPartialRest, Arrayable, DataDescription, DataValue, ModelInstance, PrimaryKeyType, PropertyConfig, PropertyValidatorComponent, PropertyValidatorComponentTypeAdvanced } from './types';
|
|
2
|
+
import { ApiInfo, ApiInfoPartialRest, Arrayable, DataDescription, DataValue, ModelInstance, ModelInstanceFetcher, PrimaryKeyType, PropertyConfig, PropertyValidatorComponent, PropertyValidatorComponentTypeAdvanced } from './types';
|
|
3
3
|
import HttpMethods = OpenAPIV3.HttpMethods;
|
|
4
4
|
declare const NULL_ENDPOINT = "NULL";
|
|
5
5
|
declare const NULL_METHOD = HttpMethods.HEAD;
|
|
@@ -14,4 +14,8 @@ declare const isModelInstance: (obj: any) => obj is ModelInstance<any, any>;
|
|
|
14
14
|
declare const getModelName: (namespace: string, pluralName: string) => string;
|
|
15
15
|
declare const buildValidEndpoint: (...components: readonly string[]) => string;
|
|
16
16
|
declare const populateApiInformation: (pluralName: string, namespace: string, partial: Partial<ApiInfoPartialRest> | undefined) => Readonly<Required<ApiInfo>>;
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* A ModelInstanceFetcher that does not do anything. It always returns undefined.
|
|
19
|
+
*/
|
|
20
|
+
declare const noFetch: ModelInstanceFetcher;
|
|
21
|
+
export { isReferencedProperty, getValueForModelInstance, getValueForReferencedModel, getCommonTextValidators, getValidatorFromConfigElseEmpty, getCommonNumberValidators, mergeValidators, isModelInstance, getModelName, buildValidEndpoint, populateApiInformation, NULL_ENDPOINT, NULL_METHOD, noFetch, };
|
package/lib.js
CHANGED
|
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.NULL_METHOD = exports.NULL_ENDPOINT = exports.populateApiInformation = exports.buildValidEndpoint = exports.getModelName = exports.isModelInstance = exports.mergeValidators = exports.getCommonNumberValidators = exports.getValidatorFromConfigElseEmpty = exports.getCommonTextValidators = exports.getValueForReferencedModel = exports.getValueForModelInstance = exports.isReferencedProperty = void 0;
|
|
15
|
+
exports.noFetch = exports.NULL_METHOD = exports.NULL_ENDPOINT = exports.populateApiInformation = exports.buildValidEndpoint = exports.getModelName = exports.isModelInstance = exports.mergeValidators = exports.getCommonNumberValidators = exports.getValidatorFromConfigElseEmpty = exports.getCommonTextValidators = exports.getValueForReferencedModel = exports.getValueForModelInstance = exports.isReferencedProperty = void 0;
|
|
16
16
|
const openapi_types_1 = require("openapi-types");
|
|
17
17
|
const kebabCase_1 = __importDefault(require("lodash/kebabCase"));
|
|
18
18
|
const merge_1 = __importDefault(require("lodash/merge"));
|
|
@@ -189,4 +189,11 @@ const populateApiInformation = (pluralName, namespace, partial) => {
|
|
|
189
189
|
return _fillOutRestInfo(pluralName, namespace, partial, nullRest);
|
|
190
190
|
};
|
|
191
191
|
exports.populateApiInformation = populateApiInformation;
|
|
192
|
+
/**
|
|
193
|
+
* A ModelInstanceFetcher that does not do anything. It always returns undefined.
|
|
194
|
+
*/
|
|
195
|
+
const noFetch = () => {
|
|
196
|
+
return Promise.resolve(undefined);
|
|
197
|
+
};
|
|
198
|
+
exports.noFetch = noFetch;
|
|
192
199
|
//# sourceMappingURL=lib.js.map
|
package/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,iDAAyC;AACzC,iEAAwC;AACxC,yDAAgC;AAChC,qDAA4B;AAC5B,
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
|
package/orm/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * as query from './query';
|
|
2
|
+
export * as validation from './validation';
|
|
3
|
+
export * as properties from './properties';
|
|
4
|
+
export * as types from './types';
|
|
5
|
+
export * from './models';
|
|
6
|
+
export * from './validation';
|
|
7
|
+
export * from './properties';
|
|
8
|
+
export * from './types';
|
|
9
|
+
export * from './query';
|
package/orm/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
36
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.types = exports.properties = exports.validation = exports.query = void 0;
|
|
40
|
+
exports.query = __importStar(require("./query"));
|
|
41
|
+
exports.validation = __importStar(require("./validation"));
|
|
42
|
+
exports.properties = __importStar(require("./properties"));
|
|
43
|
+
exports.types = __importStar(require("./types"));
|
|
44
|
+
__exportStar(require("./models"), exports);
|
|
45
|
+
__exportStar(require("./validation"), exports);
|
|
46
|
+
__exportStar(require("./properties"), exports);
|
|
47
|
+
__exportStar(require("./types"), exports);
|
|
48
|
+
__exportStar(require("./query"), exports);
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
package/orm/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/orm/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAgC;AAChC,2DAA0C;AAC1C,2DAA0C;AAC1C,iDAAgC;AAEhC,2CAAwB;AACxB,+CAA4B;AAC5B,+CAA4B;AAC5B,0CAAuB;AACvB,0CAAuB"}
|
package/orm/models.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ModelFactory } from '../types';
|
|
2
|
+
import { DatastoreAdapter, Orm } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a structure that has an OrmModel and a fetcher
|
|
5
|
+
* @param datastoreAdapter - A backing datastore.
|
|
6
|
+
* @param Model - An optional underlying Model factory for using. Defaults to {@link Model}
|
|
7
|
+
*/
|
|
8
|
+
declare const createOrm: ({ datastoreAdapter, Model, }: Readonly<{
|
|
9
|
+
datastoreAdapter: DatastoreAdapter;
|
|
10
|
+
Model?: ModelFactory;
|
|
11
|
+
}>) => Orm;
|
|
12
|
+
export { createOrm };
|
package/orm/models.js
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.createOrm = void 0;
|
|
16
|
+
const merge_1 = __importDefault(require("lodash/merge"));
|
|
17
|
+
const models_1 = require("../models");
|
|
18
|
+
const errors_1 = require("../errors");
|
|
19
|
+
const validation_1 = require("./validation");
|
|
20
|
+
const query_1 = require("./query");
|
|
21
|
+
/**
|
|
22
|
+
* Creates a structure that has an OrmModel and a fetcher
|
|
23
|
+
* @param datastoreAdapter - A backing datastore.
|
|
24
|
+
* @param Model - An optional underlying Model factory for using. Defaults to {@link Model}
|
|
25
|
+
*/
|
|
26
|
+
const createOrm = ({ datastoreAdapter, Model = models_1.Model, }) => {
|
|
27
|
+
if (!datastoreAdapter) {
|
|
28
|
+
throw new Error(`Must include a datastoreAdapter`);
|
|
29
|
+
}
|
|
30
|
+
const _retrievedObjToModel = (model) => (obj) => {
|
|
31
|
+
return model.create(obj);
|
|
32
|
+
};
|
|
33
|
+
// @ts-ignore
|
|
34
|
+
const fetcher = (model, id) => __awaiter(void 0, void 0, void 0, function* () {
|
|
35
|
+
const x = retrieve(model, id);
|
|
36
|
+
return x;
|
|
37
|
+
});
|
|
38
|
+
const retrieve = (model, id) => __awaiter(void 0, void 0, void 0, function* () {
|
|
39
|
+
const obj = yield datastoreAdapter.retrieve(model, id);
|
|
40
|
+
if (!obj) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
return _retrievedObjToModel(model)(obj);
|
|
44
|
+
});
|
|
45
|
+
const _defaultOptions = () => ({
|
|
46
|
+
instanceCreatedCallback: undefined,
|
|
47
|
+
});
|
|
48
|
+
const _convertOptions = (options) => {
|
|
49
|
+
const r = (0, merge_1.default)({}, _defaultOptions(), options);
|
|
50
|
+
return r;
|
|
51
|
+
};
|
|
52
|
+
const ThisModel = (modelDefinition, options) => {
|
|
53
|
+
/*
|
|
54
|
+
NOTE: We need access to the model AFTER its built, so we have to have this state variable.
|
|
55
|
+
It has been intentionally decided that recreating the model each and every time for each database retrieve is
|
|
56
|
+
too much cost to obtain "functional purity". This could always be reverted back.
|
|
57
|
+
*/
|
|
58
|
+
// @ts-ignore
|
|
59
|
+
// eslint-disable-next-line functional/no-let
|
|
60
|
+
let model = null;
|
|
61
|
+
const theOptions = _convertOptions(options);
|
|
62
|
+
const search = (ormQuery) => {
|
|
63
|
+
return datastoreAdapter.search(model, ormQuery).then(result => {
|
|
64
|
+
// @ts-ignore
|
|
65
|
+
const conversionFunc = _retrievedObjToModel(model);
|
|
66
|
+
return {
|
|
67
|
+
// @ts-ignore
|
|
68
|
+
instances: result.instances.map(conversionFunc),
|
|
69
|
+
page: result.page,
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
const searchOne = (ormQuery) => {
|
|
74
|
+
ormQuery = (0, merge_1.default)(ormQuery, { take: 1 });
|
|
75
|
+
return search(ormQuery).then(({ instances }) => {
|
|
76
|
+
return instances[0];
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
const bulkInsert = (instances) => __awaiter(void 0, void 0, void 0, function* () {
|
|
80
|
+
if (datastoreAdapter.bulkInsert) {
|
|
81
|
+
// @ts-ignore
|
|
82
|
+
yield datastoreAdapter.bulkInsert(model, instances);
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
yield Promise.all(instances.map(x => x.save()));
|
|
86
|
+
return undefined;
|
|
87
|
+
});
|
|
88
|
+
const loadedRetrieve = (id) => {
|
|
89
|
+
// @ts-ignore
|
|
90
|
+
return retrieve(model, id);
|
|
91
|
+
};
|
|
92
|
+
const modelValidators = (modelDefinition === null || modelDefinition === void 0 ? void 0 : modelDefinition.uniqueTogether)
|
|
93
|
+
? (modelDefinition.modelValidators || []).concat(
|
|
94
|
+
// @ts-ignore
|
|
95
|
+
(0, validation_1.uniqueTogether)(modelDefinition.uniqueTogether))
|
|
96
|
+
: modelDefinition.modelValidators;
|
|
97
|
+
const ormModelDefinition = (0, merge_1.default)({}, modelDefinition, {
|
|
98
|
+
modelValidators,
|
|
99
|
+
});
|
|
100
|
+
const _updateLastModifiedIfExistsReturnNewObj = (instance) => __awaiter(void 0, void 0, void 0, function* () {
|
|
101
|
+
const hasLastModified = Object.entries(instance.getModel().getModelDefinition().properties).filter(propertyEntry => {
|
|
102
|
+
const property = propertyEntry[1];
|
|
103
|
+
return Boolean('lastModifiedUpdateMethod' in property);
|
|
104
|
+
})[0];
|
|
105
|
+
const doLastModified = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
106
|
+
const obj = yield instance.toObj();
|
|
107
|
+
const newInstance = model.create(
|
|
108
|
+
// @ts-ignore
|
|
109
|
+
(0, merge_1.default)(obj, {
|
|
110
|
+
[hasLastModified[0]]:
|
|
111
|
+
// @ts-ignore
|
|
112
|
+
hasLastModified[1].lastModifiedUpdateMethod(),
|
|
113
|
+
}));
|
|
114
|
+
return newInstance;
|
|
115
|
+
});
|
|
116
|
+
// @ts-ignore
|
|
117
|
+
return hasLastModified ? doLastModified() : instance;
|
|
118
|
+
});
|
|
119
|
+
const save = (instance) => __awaiter(void 0, void 0, void 0, function* () {
|
|
120
|
+
return Promise.resolve().then(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
121
|
+
const newInstance = yield _updateLastModifiedIfExistsReturnNewObj(instance);
|
|
122
|
+
const invalid = yield newInstance.validate();
|
|
123
|
+
if (invalid) {
|
|
124
|
+
throw new errors_1.ValidationError(model.getName(), invalid);
|
|
125
|
+
}
|
|
126
|
+
const savedObj = yield datastoreAdapter.save(newInstance);
|
|
127
|
+
// @ts-ignore
|
|
128
|
+
return _retrievedObjToModel(model)(savedObj);
|
|
129
|
+
}));
|
|
130
|
+
});
|
|
131
|
+
const createAndSave = (data) => __awaiter(void 0, void 0, void 0, function* () {
|
|
132
|
+
if (datastoreAdapter.createAndSave) {
|
|
133
|
+
const response = yield datastoreAdapter.createAndSave(data);
|
|
134
|
+
// @ts-ignore
|
|
135
|
+
return _retrievedObjToModel(model)(response);
|
|
136
|
+
}
|
|
137
|
+
// @ts-ignore
|
|
138
|
+
const instance = model.create(yield data.toObj());
|
|
139
|
+
return instance.save();
|
|
140
|
+
});
|
|
141
|
+
const deleteObj = (id) => {
|
|
142
|
+
return Promise.resolve().then(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
143
|
+
yield datastoreAdapter.delete(model, id);
|
|
144
|
+
}));
|
|
145
|
+
};
|
|
146
|
+
const _getSave = (instance) => {
|
|
147
|
+
// See if save has been overrided.
|
|
148
|
+
if (theOptions.save !== undefined) {
|
|
149
|
+
// @ts-ignore
|
|
150
|
+
return () => theOptions.save(save, instance);
|
|
151
|
+
}
|
|
152
|
+
// @ts-ignore
|
|
153
|
+
return () => save(instance);
|
|
154
|
+
};
|
|
155
|
+
const _getDelete = (instance) => {
|
|
156
|
+
if (theOptions.delete) {
|
|
157
|
+
// @ts-ignore
|
|
158
|
+
return () => theOptions.delete(deleteObj, instance);
|
|
159
|
+
}
|
|
160
|
+
return () => deleteObj(instance.getPrimaryKey());
|
|
161
|
+
};
|
|
162
|
+
const instanceCreatedCallback = (instance) => {
|
|
163
|
+
// @ts-ignore
|
|
164
|
+
// eslint-disable-next-line functional/immutable-data
|
|
165
|
+
instance.save = _getSave(instance);
|
|
166
|
+
// @ts-ignore
|
|
167
|
+
// eslint-disable-next-line functional/immutable-data
|
|
168
|
+
instance.delete = _getDelete(instance);
|
|
169
|
+
if (theOptions.instanceCreatedCallback) {
|
|
170
|
+
const callbacks = Array.isArray(theOptions.instanceCreatedCallback)
|
|
171
|
+
? theOptions.instanceCreatedCallback
|
|
172
|
+
: [theOptions.instanceCreatedCallback];
|
|
173
|
+
callbacks.forEach(x => x(instance));
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
// Absolutely do not put theOptions as the first argument. This first argument is what is modified,
|
|
177
|
+
// therefore the instanceCreatedCallback keeps calling itself instead of wrapping.
|
|
178
|
+
const overridedOptions = (0, merge_1.default)({}, theOptions, {
|
|
179
|
+
instanceCreatedCallback: [instanceCreatedCallback],
|
|
180
|
+
});
|
|
181
|
+
const baseModel = Model(ormModelDefinition, overridedOptions);
|
|
182
|
+
const lowerLevelCreate = baseModel.create;
|
|
183
|
+
const _convertModelInstance = (instance) => {
|
|
184
|
+
return (0, merge_1.default)(instance, {
|
|
185
|
+
create,
|
|
186
|
+
getModel: () => model,
|
|
187
|
+
save: _getSave(instance),
|
|
188
|
+
delete: _getDelete(instance),
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
const create = (data) => {
|
|
192
|
+
const result = lowerLevelCreate(data);
|
|
193
|
+
return _convertModelInstance(result);
|
|
194
|
+
};
|
|
195
|
+
const _countRecursive = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (page = null) {
|
|
196
|
+
const results = yield model.search((0, query_1.queryBuilder)().pagination(page).compile());
|
|
197
|
+
const length1 = results.instances.length;
|
|
198
|
+
// Don't run it again if the page is the same as a previous run.
|
|
199
|
+
if (results.page && results.page !== page) {
|
|
200
|
+
const length2 = yield _countRecursive(results.page);
|
|
201
|
+
return length1 + length2;
|
|
202
|
+
}
|
|
203
|
+
return length1;
|
|
204
|
+
});
|
|
205
|
+
const count = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
206
|
+
// NOTE: This is EXTREMELY inefficient. This should be
|
|
207
|
+
// overrided by a dataProvider if at all possible.
|
|
208
|
+
if (datastoreAdapter.count) {
|
|
209
|
+
return datastoreAdapter.count(model);
|
|
210
|
+
}
|
|
211
|
+
return _countRecursive();
|
|
212
|
+
});
|
|
213
|
+
model = (0, merge_1.default)(baseModel, {
|
|
214
|
+
create,
|
|
215
|
+
save,
|
|
216
|
+
delete: deleteObj,
|
|
217
|
+
retrieve: loadedRetrieve,
|
|
218
|
+
search,
|
|
219
|
+
searchOne,
|
|
220
|
+
createAndSave,
|
|
221
|
+
bulkInsert,
|
|
222
|
+
count,
|
|
223
|
+
});
|
|
224
|
+
return model;
|
|
225
|
+
};
|
|
226
|
+
return {
|
|
227
|
+
Model: ThisModel,
|
|
228
|
+
fetcher,
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
exports.createOrm = createOrm;
|
|
232
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/orm/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { DateValueType, PropertyConfig, Arrayable, DataValue } from '../types';
|
|
2
|
+
import { OrmPropertyConfig } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* A property that automatically updates whenever the model instance is saved.
|
|
5
|
+
* @param config
|
|
6
|
+
*/
|
|
7
|
+
declare const LastModifiedDateProperty: (config?: PropertyConfig<DateValueType>) => Readonly<{
|
|
8
|
+
getConfig: () => object;
|
|
9
|
+
getChoices: () => readonly import("../types").ChoiceTypes[];
|
|
10
|
+
getDefaultValue: () => DateValueType | undefined;
|
|
11
|
+
getConstantValue: () => DateValueType | undefined;
|
|
12
|
+
getPropertyType: () => import("../types").PropertyType | string;
|
|
13
|
+
createGetter: (value: DateValueType, modelData: Readonly<{
|
|
14
|
+
[s: string]: any;
|
|
15
|
+
}>, modelInstance: import("../types").ModelInstance<Readonly<{
|
|
16
|
+
[s: string]: any;
|
|
17
|
+
}>, object, object>) => import("../types").ValueGetter<DateValueType, Readonly<{
|
|
18
|
+
[s: string]: any;
|
|
19
|
+
}>, object, object>;
|
|
20
|
+
getValidator: (valueGetter: import("../types").ValueGetter<DateValueType, Readonly<{
|
|
21
|
+
[s: string]: any;
|
|
22
|
+
}>, object, object>) => import("../types").PropertyValidator<Readonly<{
|
|
23
|
+
[s: string]: any;
|
|
24
|
+
}>>;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Creates an orm based property config.
|
|
28
|
+
* @param config - Additional configurations.
|
|
29
|
+
*/
|
|
30
|
+
declare const ormPropertyConfig: <T extends Arrayable<DataValue>>(config?: OrmPropertyConfig<T>) => PropertyConfig<T>;
|
|
31
|
+
export { ormPropertyConfig, LastModifiedDateProperty };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LastModifiedDateProperty = exports.ormPropertyConfig = void 0;
|
|
7
|
+
const merge_1 = __importDefault(require("lodash/merge"));
|
|
8
|
+
const identity_1 = __importDefault(require("lodash/identity"));
|
|
9
|
+
const properties_1 = require("../properties");
|
|
10
|
+
const validation_1 = require("./validation");
|
|
11
|
+
const _defaultPropertyConfig = {
|
|
12
|
+
unique: undefined,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* A property that automatically updates whenever the model instance is saved.
|
|
16
|
+
* @param config
|
|
17
|
+
*/
|
|
18
|
+
const LastModifiedDateProperty = (config = {}) => {
|
|
19
|
+
const additionalMetadata = { lastModifiedUpdateMethod: () => new Date() };
|
|
20
|
+
return (0, properties_1.DatetimeProperty)(config, additionalMetadata);
|
|
21
|
+
};
|
|
22
|
+
exports.LastModifiedDateProperty = LastModifiedDateProperty;
|
|
23
|
+
/**
|
|
24
|
+
* Creates an orm based property config.
|
|
25
|
+
* @param config - Additional configurations.
|
|
26
|
+
*/
|
|
27
|
+
const ormPropertyConfig = (config = _defaultPropertyConfig) => {
|
|
28
|
+
return (0, merge_1.default)(config, {
|
|
29
|
+
validators: [
|
|
30
|
+
...(config.validators ? config.validators : []),
|
|
31
|
+
config.unique ? (0, validation_1.unique)(config.unique) : null,
|
|
32
|
+
].filter(identity_1.default),
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
exports.ormPropertyConfig = ormPropertyConfig;
|
|
36
|
+
//# sourceMappingURL=properties.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../../src/orm/properties.ts"],"names":[],"mappings":";;;;;;AAAA,yDAAgC;AAChC,+DAAsC;AAEtC,8CAAgD;AAChD,6CAAqC;AAGrC,MAAM,sBAAsB,GAAG;IAC7B,MAAM,EAAE,SAAS;CAClB,CAAA;AAED;;;GAGG;AACH,MAAM,wBAAwB,GAAG,CAC/B,SAAwC,EAAE,EAC1C,EAAE;IACF,MAAM,kBAAkB,GAAG,EAAE,wBAAwB,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAA;IACzE,OAAO,IAAA,6BAAgB,EAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;AACrD,CAAC,CAAA;AAiB2B,4DAAwB;AAfpD;;;GAGG;AACH,MAAM,iBAAiB,GAAG,CACxB,SAA+B,sBAAsB,EAClC,EAAE;IACrB,OAAO,IAAA,eAAK,EAAC,MAAM,EAAE;QACnB,UAAU,EAAE;YACV,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;SAC7C,CAAC,MAAM,CAAC,kBAAQ,CAAC;KACnB,CAAC,CAAA;AACJ,CAAC,CAAA;AAEQ,8CAAiB"}
|