joist-orm 0.1.538 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/{BaseEntity.d.ts → src/BaseEntity.d.ts} +2 -1
- package/build/{BaseEntity.js → src/BaseEntity.js} +13 -9
- package/build/src/BaseEntity.js.map +1 -0
- package/build/{EntityManager.d.ts → src/EntityManager.d.ts} +139 -110
- package/build/{EntityManager.js → src/EntityManager.js} +281 -262
- package/build/src/EntityManager.js.map +1 -0
- package/build/{QueryBuilder.d.ts → src/QueryBuilder.d.ts} +53 -3
- package/build/src/QueryBuilder.js +341 -0
- package/build/src/QueryBuilder.js.map +1 -0
- package/build/src/Todo.d.ts +25 -0
- package/build/src/Todo.js +52 -0
- package/build/src/Todo.js.map +1 -0
- package/build/src/changes.d.ts +34 -0
- package/build/src/changes.js +37 -0
- package/build/src/changes.js.map +1 -0
- package/build/src/config.d.ts +43 -0
- package/build/src/config.js +114 -0
- package/build/src/config.js.map +1 -0
- package/build/{createOrUpdatePartial.d.ts → src/createOrUpdatePartial.d.ts} +2 -1
- package/build/{createOrUpdatePartial.js → src/createOrUpdatePartial.js} +42 -10
- package/build/src/createOrUpdatePartial.js.map +1 -0
- package/build/src/dataloaders/findDataLoader.d.ts +5 -0
- package/build/src/dataloaders/findDataLoader.js +28 -0
- package/build/src/dataloaders/findDataLoader.js.map +1 -0
- package/build/src/dataloaders/loadDataLoader.d.ts +3 -0
- package/build/src/dataloaders/loadDataLoader.js +37 -0
- package/build/src/dataloaders/loadDataLoader.js.map +1 -0
- package/build/src/dataloaders/manyToManyDataLoader.d.ts +5 -0
- package/build/src/dataloaders/manyToManyDataLoader.js +78 -0
- package/build/src/dataloaders/manyToManyDataLoader.js.map +1 -0
- package/build/src/dataloaders/manyToManyFindDataLoader.d.ts +5 -0
- package/build/src/dataloaders/manyToManyFindDataLoader.js +33 -0
- package/build/src/dataloaders/manyToManyFindDataLoader.js.map +1 -0
- package/build/src/dataloaders/oneToManyDataLoader.d.ts +4 -0
- package/build/src/dataloaders/oneToManyDataLoader.js +40 -0
- package/build/src/dataloaders/oneToManyDataLoader.js.map +1 -0
- package/build/src/dataloaders/oneToManyFindDataLoader.d.ts +5 -0
- package/build/src/dataloaders/oneToManyFindDataLoader.js +32 -0
- package/build/src/dataloaders/oneToManyFindDataLoader.js.map +1 -0
- package/build/src/dataloaders/oneToOneDataLoader.d.ts +4 -0
- package/build/src/dataloaders/oneToOneDataLoader.js +40 -0
- package/build/src/dataloaders/oneToOneDataLoader.js.map +1 -0
- package/build/src/drivers/IdAssigner.d.ts +33 -0
- package/build/src/drivers/IdAssigner.js +106 -0
- package/build/src/drivers/IdAssigner.js.map +1 -0
- package/build/src/drivers/InMemoryDriver.d.ts +29 -0
- package/build/src/drivers/InMemoryDriver.js +306 -0
- package/build/src/drivers/InMemoryDriver.js.map +1 -0
- package/build/src/drivers/PostgresDriver.d.ts +40 -0
- package/build/src/drivers/PostgresDriver.js +376 -0
- package/build/src/drivers/PostgresDriver.js.map +1 -0
- package/build/src/drivers/driver.d.ts +23 -0
- package/build/src/drivers/driver.js +3 -0
- package/build/src/drivers/driver.js.map +1 -0
- package/build/src/drivers/index.d.ts +4 -0
- package/build/src/drivers/index.js +17 -0
- package/build/src/drivers/index.js.map +1 -0
- package/build/{getProperties.d.ts → src/getProperties.d.ts} +0 -0
- package/build/{getProperties.js → src/getProperties.js} +1 -1
- package/build/src/getProperties.js.map +1 -0
- package/build/src/index.d.ts +62 -0
- package/build/src/index.js +263 -0
- package/build/src/index.js.map +1 -0
- package/build/src/keys.d.ts +30 -0
- package/build/{keys.js → src/keys.js} +48 -16
- package/build/src/keys.js.map +1 -0
- package/build/{loadLens.d.ts → src/loadLens.d.ts} +2 -2
- package/build/{loadLens.js → src/loadLens.js} +1 -1
- package/build/src/loadLens.js.map +1 -0
- package/build/src/loaded.d.ts +49 -0
- package/build/src/loaded.js +9 -0
- package/build/src/loaded.js.map +1 -0
- package/build/{newTestInstance.d.ts → src/newTestInstance.d.ts} +37 -3
- package/build/src/newTestInstance.js +342 -0
- package/build/src/newTestInstance.js.map +1 -0
- package/build/{collections → src/relations}/AbstractRelationImpl.d.ts +6 -5
- package/build/{collections → src/relations}/AbstractRelationImpl.js +0 -0
- package/build/src/relations/AbstractRelationImpl.js.map +1 -0
- package/build/src/relations/Collection.d.ts +26 -0
- package/build/src/relations/Collection.js +19 -0
- package/build/src/relations/Collection.js.map +1 -0
- package/build/{collections → src/relations}/CustomCollection.d.ts +6 -2
- package/build/{collections → src/relations}/CustomCollection.js +17 -9
- package/build/src/relations/CustomCollection.js.map +1 -0
- package/build/{collections → src/relations}/CustomReference.d.ts +7 -2
- package/build/{collections → src/relations}/CustomReference.js +16 -9
- package/build/src/relations/CustomReference.js.map +1 -0
- package/build/src/relations/LargeCollection.d.ts +17 -0
- package/build/src/relations/LargeCollection.js +3 -0
- package/build/src/relations/LargeCollection.js.map +1 -0
- package/build/{collections → src/relations}/ManyToManyCollection.d.ts +9 -2
- package/build/src/relations/ManyToManyCollection.js +249 -0
- package/build/src/relations/ManyToManyCollection.js.map +1 -0
- package/build/src/relations/ManyToManyLargeCollection.d.ts +25 -0
- package/build/src/relations/ManyToManyLargeCollection.js +97 -0
- package/build/src/relations/ManyToManyLargeCollection.js.map +1 -0
- package/build/src/relations/ManyToOneReference.d.ts +77 -0
- package/build/{collections → src/relations}/ManyToOneReference.js +101 -48
- package/build/src/relations/ManyToOneReference.js.map +1 -0
- package/build/{collections → src/relations}/OneToManyCollection.d.ts +10 -2
- package/build/{collections → src/relations}/OneToManyCollection.js +54 -59
- package/build/src/relations/OneToManyCollection.js.map +1 -0
- package/build/src/relations/OneToManyLargeCollection.d.ts +25 -0
- package/build/src/relations/OneToManyLargeCollection.js +83 -0
- package/build/src/relations/OneToManyLargeCollection.js.map +1 -0
- package/build/src/relations/OneToOneReference.d.ts +82 -0
- package/build/src/relations/OneToOneReference.js +168 -0
- package/build/src/relations/OneToOneReference.js.map +1 -0
- package/build/src/relations/PolymorphicReference.d.ts +69 -0
- package/build/src/relations/PolymorphicReference.js +210 -0
- package/build/src/relations/PolymorphicReference.js.map +1 -0
- package/build/src/relations/Reference.d.ts +29 -0
- package/build/src/relations/Reference.js +23 -0
- package/build/src/relations/Reference.js.map +1 -0
- package/build/src/relations/Relation.d.ts +10 -0
- package/build/src/relations/Relation.js +13 -0
- package/build/src/relations/Relation.js.map +1 -0
- package/build/src/relations/hasAsyncProperty.d.ts +36 -0
- package/build/src/relations/hasAsyncProperty.js +55 -0
- package/build/src/relations/hasAsyncProperty.js.map +1 -0
- package/build/{collections → src/relations}/hasManyDerived.d.ts +2 -1
- package/build/{collections → src/relations}/hasManyDerived.js +1 -1
- package/build/src/relations/hasManyDerived.js.map +1 -0
- package/build/{collections → src/relations}/hasManyThrough.d.ts +0 -0
- package/build/{collections → src/relations}/hasManyThrough.js +2 -2
- package/build/src/relations/hasManyThrough.js.map +1 -0
- package/build/{collections → src/relations}/hasOneDerived.d.ts +3 -2
- package/build/{collections → src/relations}/hasOneDerived.js +1 -1
- package/build/src/relations/hasOneDerived.js.map +1 -0
- package/build/{collections → src/relations}/hasOneThrough.d.ts +0 -0
- package/build/{collections → src/relations}/hasOneThrough.js +2 -2
- package/build/src/relations/hasOneThrough.js.map +1 -0
- package/build/src/relations/index.d.ts +18 -0
- package/build/src/relations/index.js +53 -0
- package/build/src/relations/index.js.map +1 -0
- package/build/{reverseHint.d.ts → src/reverseHint.d.ts} +2 -1
- package/build/{reverseHint.js → src/reverseHint.js} +13 -9
- package/build/src/reverseHint.js.map +1 -0
- package/build/src/rules.d.ts +23 -0
- package/build/src/rules.js +23 -0
- package/build/src/rules.js.map +1 -0
- package/build/src/serde.d.ts +121 -0
- package/build/src/serde.js +190 -0
- package/build/src/serde.js.map +1 -0
- package/build/{utils.d.ts → src/utils.d.ts} +2 -0
- package/build/{utils.js → src/utils.js} +10 -1
- package/build/src/utils.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +30 -15
- package/build/BaseEntity.js.map +0 -1
- package/build/EntityManager.js.map +0 -1
- package/build/EntityPersister.d.ts +0 -30
- package/build/EntityPersister.js +0 -197
- package/build/EntityPersister.js.map +0 -1
- package/build/QueryBuilder.js +0 -195
- package/build/QueryBuilder.js.map +0 -1
- package/build/changes.d.ts +0 -23
- package/build/changes.js +0 -14
- package/build/changes.js.map +0 -1
- package/build/collections/AbstractRelationImpl.js.map +0 -1
- package/build/collections/CustomCollection.js.map +0 -1
- package/build/collections/CustomReference.js.map +0 -1
- package/build/collections/ManyToManyCollection.js +0 -288
- package/build/collections/ManyToManyCollection.js.map +0 -1
- package/build/collections/ManyToOneReference.d.ts +0 -50
- package/build/collections/ManyToOneReference.js.map +0 -1
- package/build/collections/OneToManyCollection.js.map +0 -1
- package/build/collections/OneToOneReference.d.ts +0 -51
- package/build/collections/OneToOneReference.js +0 -132
- package/build/collections/OneToOneReference.js.map +0 -1
- package/build/collections/hasManyDerived.js.map +0 -1
- package/build/collections/hasManyThrough.js.map +0 -1
- package/build/collections/hasOneDerived.js.map +0 -1
- package/build/collections/hasOneThrough.js.map +0 -1
- package/build/collections/index.d.ts +0 -19
- package/build/collections/index.js +0 -49
- package/build/collections/index.js.map +0 -1
- package/build/createOrUpdatePartial.js.map +0 -1
- package/build/getProperties.js.map +0 -1
- package/build/index.d.ts +0 -140
- package/build/index.js +0 -278
- package/build/index.js.map +0 -1
- package/build/keys.d.ts +0 -21
- package/build/keys.js.map +0 -1
- package/build/loadLens.js.map +0 -1
- package/build/newTestInstance.js +0 -153
- package/build/newTestInstance.js.map +0 -1
- package/build/reverseHint.js.map +0 -1
- package/build/serde.d.ts +0 -47
- package/build/serde.js +0 -93
- package/build/serde.js.map +0 -1
- package/build/utils.js.map +0 -1
- package/package.json.bak +0 -27
- package/src/BaseEntity.ts +0 -104
- package/src/EntityManager.ts +0 -1263
- package/src/EntityPersister.ts +0 -240
- package/src/QueryBuilder.ts +0 -289
- package/src/changes.ts +0 -40
- package/src/collections/AbstractRelationImpl.ts +0 -28
- package/src/collections/CustomCollection.ts +0 -152
- package/src/collections/CustomReference.ts +0 -138
- package/src/collections/ManyToManyCollection.ts +0 -346
- package/src/collections/ManyToOneReference.ts +0 -215
- package/src/collections/OneToManyCollection.ts +0 -254
- package/src/collections/OneToOneReference.ts +0 -153
- package/src/collections/hasManyDerived.ts +0 -29
- package/src/collections/hasManyThrough.ts +0 -20
- package/src/collections/hasOneDerived.ts +0 -26
- package/src/collections/hasOneThrough.ts +0 -20
- package/src/collections/index.ts +0 -74
- package/src/createOrUpdatePartial.ts +0 -144
- package/src/getProperties.ts +0 -27
- package/src/index.ts +0 -400
- package/src/keys.ts +0 -75
- package/src/loadLens.ts +0 -126
- package/src/newTestInstance.ts +0 -205
- package/src/reverseHint.ts +0 -43
- package/src/serde.ts +0 -97
- package/src/utils.ts +0 -63
- package/tsconfig.json +0 -21
- package/tsconfig.tsbuildinfo +0 -2646
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.isCollectionField = exports.isReferenceField = exports.isPolymorphicField = exports.isOneToOneField = exports.isManyToManyField = exports.isManyToOneField = exports.isOneToManyField = exports.maybeGetConstructorFromReference = exports.getConstructorFromTaggedId = exports.getRelations = exports.getEm = exports.configureMetadata = exports.getRequiredKeys = exports.ensureNotDeleted = exports.setOpts = exports.setField = exports.fail = exports.ValidationErrors = exports.newRequiredRule = exports.isNew = exports.ConfigApi = exports.BaseEntity = exports.newPgConnectionConfig = void 0;
|
|
14
|
+
const EntityManager_1 = require("./EntityManager");
|
|
15
|
+
const keys_1 = require("./keys");
|
|
16
|
+
const AbstractRelationImpl_1 = require("./relations/AbstractRelationImpl");
|
|
17
|
+
const reverseHint_1 = require("./reverseHint");
|
|
18
|
+
const utils_1 = require("./utils");
|
|
19
|
+
var joist_utils_1 = require("joist-utils");
|
|
20
|
+
Object.defineProperty(exports, "newPgConnectionConfig", { enumerable: true, get: function () { return joist_utils_1.newPgConnectionConfig; } });
|
|
21
|
+
var BaseEntity_1 = require("./BaseEntity");
|
|
22
|
+
Object.defineProperty(exports, "BaseEntity", { enumerable: true, get: function () { return BaseEntity_1.BaseEntity; } });
|
|
23
|
+
__exportStar(require("./changes"), exports);
|
|
24
|
+
var config_1 = require("./config");
|
|
25
|
+
Object.defineProperty(exports, "ConfigApi", { enumerable: true, get: function () { return config_1.ConfigApi; } });
|
|
26
|
+
__exportStar(require("./drivers"), exports);
|
|
27
|
+
__exportStar(require("./EntityManager"), exports);
|
|
28
|
+
__exportStar(require("./getProperties"), exports);
|
|
29
|
+
__exportStar(require("./keys"), exports);
|
|
30
|
+
var loaded_1 = require("./loaded");
|
|
31
|
+
Object.defineProperty(exports, "isNew", { enumerable: true, get: function () { return loaded_1.isNew; } });
|
|
32
|
+
__exportStar(require("./loadLens"), exports);
|
|
33
|
+
__exportStar(require("./newTestInstance"), exports);
|
|
34
|
+
__exportStar(require("./QueryBuilder"), exports);
|
|
35
|
+
__exportStar(require("./relations"), exports);
|
|
36
|
+
__exportStar(require("./reverseHint"), exports);
|
|
37
|
+
var rules_1 = require("./rules");
|
|
38
|
+
Object.defineProperty(exports, "newRequiredRule", { enumerable: true, get: function () { return rules_1.newRequiredRule; } });
|
|
39
|
+
Object.defineProperty(exports, "ValidationErrors", { enumerable: true, get: function () { return rules_1.ValidationErrors; } });
|
|
40
|
+
__exportStar(require("./serde"), exports);
|
|
41
|
+
var utils_2 = require("./utils");
|
|
42
|
+
Object.defineProperty(exports, "fail", { enumerable: true, get: function () { return utils_2.fail; } });
|
|
43
|
+
function setField(entity, fieldName, newValue) {
|
|
44
|
+
ensureNotDeleted(entity, { ignore: "pending" });
|
|
45
|
+
const { em } = entity;
|
|
46
|
+
if (em.isFlushing) {
|
|
47
|
+
const { flushSecret } = EntityManager_1.currentFlushSecret.getStore() || {};
|
|
48
|
+
if (flushSecret === undefined) {
|
|
49
|
+
throw new Error(`Cannot set '${fieldName}' on ${entity} during a flush outside of a entity hook or from afterCommit`);
|
|
50
|
+
}
|
|
51
|
+
if (flushSecret !== em["flushSecret"]) {
|
|
52
|
+
throw new Error(`Attempting to reuse a hook context outside its flush loop`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const { data, originalData } = entity.__orm;
|
|
56
|
+
// "Un-dirty" our originalData if newValue is reverting to originalData
|
|
57
|
+
if (fieldName in originalData) {
|
|
58
|
+
if (equal(originalData[fieldName], newValue)) {
|
|
59
|
+
data[fieldName] = newValue;
|
|
60
|
+
delete originalData[fieldName];
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Push this logic into a field serde type abstraction?
|
|
65
|
+
const currentValue = data[fieldName];
|
|
66
|
+
if (equal(currentValue, newValue)) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
// Only save the currentValue on the 1st change of this field
|
|
70
|
+
if (!(fieldName in originalData)) {
|
|
71
|
+
originalData[fieldName] = currentValue;
|
|
72
|
+
}
|
|
73
|
+
data[fieldName] = newValue;
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
exports.setField = setField;
|
|
77
|
+
/**
|
|
78
|
+
* Sets each value in `values` on the current entity.
|
|
79
|
+
*
|
|
80
|
+
* The default behavior is that passing a value as either `null` or `undefined` will set
|
|
81
|
+
* the field as `undefined`, i.e. automatic `null` to `undefined` conversion.
|
|
82
|
+
*
|
|
83
|
+
* However, if you pass `ignoreUndefined: true`, then any opt that is `undefined` will be treated
|
|
84
|
+
* as "do not set", and `null` will still mean "set to `undefined`". This is useful for implementing
|
|
85
|
+
* APIs were an input of `undefined` means "do not set / noop" and `null` means "unset".
|
|
86
|
+
*/
|
|
87
|
+
function setOpts(entity, values, opts) {
|
|
88
|
+
// If `values` is a string (i.e. the id), this instance is being hydrated from a database row, so skip all this.
|
|
89
|
+
// If `values` is undefined, we're being called by `createPartial` that will do its own opt handling.
|
|
90
|
+
if (values === undefined || typeof values === "string") {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const { calledFromConstructor, partial } = opts || {};
|
|
94
|
+
const meta = (0, EntityManager_1.getMetadata)(entity);
|
|
95
|
+
Object.entries(values).forEach(([key, _value]) => {
|
|
96
|
+
const field = meta.fields[key];
|
|
97
|
+
if (!field) {
|
|
98
|
+
throw new Error(`Unknown field ${key}`);
|
|
99
|
+
}
|
|
100
|
+
// If ignoreUndefined is set, we treat undefined as a noop
|
|
101
|
+
if (partial && _value === undefined) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// We let optional opts fields be `| null` for convenience, and convert to undefined.
|
|
105
|
+
const value = _value === null || (typeof _value === "string" && _value.trim() === "") ? undefined : _value;
|
|
106
|
+
const current = entity[key];
|
|
107
|
+
if (current instanceof AbstractRelationImpl_1.AbstractRelationImpl) {
|
|
108
|
+
if (calledFromConstructor) {
|
|
109
|
+
current.setFromOpts(value);
|
|
110
|
+
}
|
|
111
|
+
else if (partial && (field.kind === "o2m" || field.kind === "m2m")) {
|
|
112
|
+
const values = value;
|
|
113
|
+
// For setPartial collections, we used to individually add/remove instead of set, but this
|
|
114
|
+
// incremental behavior was unintuitive for mutations, i.e. `parent.children = [b, c]` and
|
|
115
|
+
// you'd still have `[a]` around. Note that we still support `delete: true` command to go
|
|
116
|
+
// further than "remove from collection" to "actually delete the entity".
|
|
117
|
+
const allowDelete = !field.otherMetadata().fields["delete"];
|
|
118
|
+
const allowRemove = !field.otherMetadata().fields["remove"];
|
|
119
|
+
// We're replacing the old `delete: true` / `remove: true` behavior with `op` (i.e. operation).
|
|
120
|
+
// When passed in, all values must have it, and we kick into incremental mode, i.e. we
|
|
121
|
+
// individually add/remove/delete entities.
|
|
122
|
+
//
|
|
123
|
+
// The old `delete: true / remove: true` behavior is deprecated, and should eventually blow up.
|
|
124
|
+
const allowOp = !field.otherMetadata().fields["op"];
|
|
125
|
+
const anyValueHasOp = allowOp && values.some((v) => !!v.op);
|
|
126
|
+
if (anyValueHasOp) {
|
|
127
|
+
const anyValueMissingOp = values.some((v) => !v.op);
|
|
128
|
+
if (anyValueMissingOp) {
|
|
129
|
+
throw new Error("If any child sets the `op` key, then all children must have the `op` key.");
|
|
130
|
+
}
|
|
131
|
+
values.forEach((v) => {
|
|
132
|
+
if (v.op === "delete") {
|
|
133
|
+
entity.em.delete(v);
|
|
134
|
+
}
|
|
135
|
+
else if (v.op === "remove") {
|
|
136
|
+
current.remove(v);
|
|
137
|
+
}
|
|
138
|
+
else if (v.op === "include") {
|
|
139
|
+
current.add(v);
|
|
140
|
+
}
|
|
141
|
+
else if (v.op === "incremental") {
|
|
142
|
+
// This is a marker entry to opt-in to incremental behavior, just drop it
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
return; // return from the op-based incremental behavior
|
|
146
|
+
}
|
|
147
|
+
const toSet = [];
|
|
148
|
+
values.forEach((e) => {
|
|
149
|
+
if (allowDelete && e.delete === true) {
|
|
150
|
+
entity.em.delete(e);
|
|
151
|
+
}
|
|
152
|
+
else if (allowRemove && e.remove === true) {
|
|
153
|
+
// Just leave out of `toSet`
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
toSet.push(e);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
current.set(toSet);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
current.set(value);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
entity[key] = value;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
if (calledFromConstructor) {
|
|
170
|
+
getRelations(entity).forEach((v) => v.initializeForNewEntity());
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
exports.setOpts = setOpts;
|
|
174
|
+
function ensureNotDeleted(entity, opts = {}) {
|
|
175
|
+
if (entity.isDeletedEntity && (opts.ignore === undefined || entity.__orm.deleted !== opts.ignore)) {
|
|
176
|
+
(0, utils_1.fail)(`${entity} is marked as deleted`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
exports.ensureNotDeleted = ensureNotDeleted;
|
|
180
|
+
function getRequiredKeys(entityOrType) {
|
|
181
|
+
return Object.values((0, EntityManager_1.getMetadata)(entityOrType).fields)
|
|
182
|
+
.filter((f) => f.required)
|
|
183
|
+
.map((f) => f.fieldName);
|
|
184
|
+
}
|
|
185
|
+
exports.getRequiredKeys = getRequiredKeys;
|
|
186
|
+
const tagToConstructorMap = new Map();
|
|
187
|
+
/** Processes the metas based on any custom calls to the `configApi` hooks. */
|
|
188
|
+
function configureMetadata(metas) {
|
|
189
|
+
metas.forEach((meta) => {
|
|
190
|
+
// Add each constructor into our tag -> constructor map for future lookups
|
|
191
|
+
tagToConstructorMap.set(meta.tagName, meta.cstr);
|
|
192
|
+
// Look for reactive validation rules to reverse
|
|
193
|
+
meta.config.__data.rules.forEach((rule) => {
|
|
194
|
+
if (rule.hint) {
|
|
195
|
+
const reversals = (0, reverseHint_1.reverseHint)(meta.cstr, rule.hint);
|
|
196
|
+
// For each reversal, tell its config about the reverse hint to force-re-validate
|
|
197
|
+
// the original rule's instance any time it changes.
|
|
198
|
+
reversals.forEach(([otherEntity, reverseHint]) => {
|
|
199
|
+
(0, EntityManager_1.getMetadata)(otherEntity).config.__data.reactiveRules.push(reverseHint);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
// Look for reactive async derived values rules to reverse
|
|
204
|
+
Object.entries(meta.config.__data.asyncDerivedFields).forEach(([, entry]) => {
|
|
205
|
+
const hint = entry[0];
|
|
206
|
+
const reversals = (0, reverseHint_1.reverseHint)(meta.cstr, hint);
|
|
207
|
+
reversals.forEach(([otherEntity, reverseHint]) => {
|
|
208
|
+
(0, EntityManager_1.getMetadata)(otherEntity).config.__data.reactiveDerivedValues.push(reverseHint);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
exports.configureMetadata = configureMetadata;
|
|
214
|
+
function getEm(entity) {
|
|
215
|
+
return entity.em;
|
|
216
|
+
}
|
|
217
|
+
exports.getEm = getEm;
|
|
218
|
+
function getRelations(entity) {
|
|
219
|
+
return Object.values(entity).filter((v) => v instanceof AbstractRelationImpl_1.AbstractRelationImpl);
|
|
220
|
+
}
|
|
221
|
+
exports.getRelations = getRelations;
|
|
222
|
+
function getConstructorFromTaggedId(id) {
|
|
223
|
+
const tag = (0, keys_1.tagFromId)(id);
|
|
224
|
+
return tagToConstructorMap.get(tag) ?? (0, utils_1.fail)(`Unknown tag: "${tag}" `);
|
|
225
|
+
}
|
|
226
|
+
exports.getConstructorFromTaggedId = getConstructorFromTaggedId;
|
|
227
|
+
function maybeGetConstructorFromReference(value) {
|
|
228
|
+
const id = (0, keys_1.maybeResolveReferenceToId)(value);
|
|
229
|
+
return id ? getConstructorFromTaggedId(id) : undefined;
|
|
230
|
+
}
|
|
231
|
+
exports.maybeGetConstructorFromReference = maybeGetConstructorFromReference;
|
|
232
|
+
function equal(a, b) {
|
|
233
|
+
return a === b || (a instanceof Date && b instanceof Date && a.getTime() == b.getTime());
|
|
234
|
+
}
|
|
235
|
+
function isOneToManyField(ormField) {
|
|
236
|
+
return ormField.kind === "o2m";
|
|
237
|
+
}
|
|
238
|
+
exports.isOneToManyField = isOneToManyField;
|
|
239
|
+
function isManyToOneField(ormField) {
|
|
240
|
+
return ormField.kind === "m2o";
|
|
241
|
+
}
|
|
242
|
+
exports.isManyToOneField = isManyToOneField;
|
|
243
|
+
function isManyToManyField(ormField) {
|
|
244
|
+
return ormField.kind === "m2m";
|
|
245
|
+
}
|
|
246
|
+
exports.isManyToManyField = isManyToManyField;
|
|
247
|
+
function isOneToOneField(ormField) {
|
|
248
|
+
return ormField.kind === "o2o";
|
|
249
|
+
}
|
|
250
|
+
exports.isOneToOneField = isOneToOneField;
|
|
251
|
+
function isPolymorphicField(ormField) {
|
|
252
|
+
return ormField.kind === "poly";
|
|
253
|
+
}
|
|
254
|
+
exports.isPolymorphicField = isPolymorphicField;
|
|
255
|
+
function isReferenceField(ormField) {
|
|
256
|
+
return ormField.kind === "m2o" || ormField.kind === "o2o" || ormField.kind === "poly";
|
|
257
|
+
}
|
|
258
|
+
exports.isReferenceField = isReferenceField;
|
|
259
|
+
function isCollectionField(ormField) {
|
|
260
|
+
return ormField.kind === "o2m" || ormField.kind === "m2m";
|
|
261
|
+
}
|
|
262
|
+
exports.isCollectionField = isCollectionField;
|
|
263
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Entity, EntityConstructor } from "./EntityManager";
|
|
2
|
+
declare type HasTagName = {
|
|
3
|
+
tagName: string;
|
|
4
|
+
idType: "int" | "uuid";
|
|
5
|
+
};
|
|
6
|
+
export declare function maybeResolveReferenceToId(value: any): string | undefined;
|
|
7
|
+
/** Converts `value` to a number, i.e. for string ids, unless its undefined. */
|
|
8
|
+
export declare function keyToNumber(meta: HasTagName, value: string | number): number;
|
|
9
|
+
export declare function keyToNumber(meta: HasTagName, value: string | number | undefined): number | undefined;
|
|
10
|
+
/** Converts `value` to a tagged string, i.e. for string ids, unless its undefined. */
|
|
11
|
+
export declare function keyToString(meta: HasTagName, value: any): string | undefined;
|
|
12
|
+
/** Fails if any keys are tagged; used by internal functions b/c we still allow most direct API input to be untagged. */
|
|
13
|
+
export declare function assertIdsAreTagged(keys: readonly string[]): void;
|
|
14
|
+
/** Tags a potentially untagged id, while our API inputs still accept either tagged or untagged ids. */
|
|
15
|
+
export declare function tagId(meta: HasTagName, id: string | number): string;
|
|
16
|
+
export declare function tagId(cstr: EntityConstructor<any>, id: string | number): string;
|
|
17
|
+
export declare function tagId(meta: HasTagName, id: string | number | null | undefined): string | undefined;
|
|
18
|
+
export declare function tagId(cstr: EntityConstructor<any>, id: string | number | null | undefined): string | undefined;
|
|
19
|
+
/** Adds the tag prefixes. */
|
|
20
|
+
export declare function tagIds(meta: HasTagName, keys: readonly (string | number)[]): readonly string[];
|
|
21
|
+
export declare function tagIds(cstr: EntityConstructor<any>, keys: readonly (string | number)[]): readonly string[];
|
|
22
|
+
export declare function deTagId(meta: HasTagName, id: string | number): string;
|
|
23
|
+
export declare function deTagId(entity: Entity): string;
|
|
24
|
+
/** Removes the tag prefixes so we can use the keys for SQL operations. */
|
|
25
|
+
export declare function deTagIds(meta: HasTagName, keys: readonly string[]): readonly string[];
|
|
26
|
+
/** Removes the tag prefixes so we can use the keys for SQL operations. */
|
|
27
|
+
export declare function unsafeDeTagIds(keys: readonly string[]): readonly string[];
|
|
28
|
+
/** Given a tagged id, returns its tag. */
|
|
29
|
+
export declare function tagFromId(key: string): string;
|
|
30
|
+
export {};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.unsafeDeTagIds = exports.deTagId = exports.
|
|
4
|
-
const EntityManager_1 = require("./EntityManager");
|
|
3
|
+
exports.tagFromId = exports.unsafeDeTagIds = exports.deTagIds = exports.deTagId = exports.tagIds = exports.tagId = exports.assertIdsAreTagged = exports.keyToString = exports.keyToNumber = exports.maybeResolveReferenceToId = void 0;
|
|
5
4
|
const BaseEntity_1 = require("./BaseEntity");
|
|
5
|
+
const EntityManager_1 = require("./EntityManager");
|
|
6
6
|
const tagDelimiter = ":";
|
|
7
7
|
// Before a referred-to object is saved, we keep its instance in our data
|
|
8
8
|
// map, and then assume it will be persisted before we're asked to persist
|
|
9
9
|
function maybeResolveReferenceToId(value) {
|
|
10
|
-
return typeof value === "number" || typeof value === "string" ? value : value
|
|
10
|
+
return typeof value === "number" || typeof value === "string" ? value : value?.id;
|
|
11
11
|
}
|
|
12
12
|
exports.maybeResolveReferenceToId = maybeResolveReferenceToId;
|
|
13
13
|
function keyToNumber(meta, value) {
|
|
@@ -20,19 +20,26 @@ function keyToNumber(meta, value) {
|
|
|
20
20
|
else if (typeof value === "string") {
|
|
21
21
|
const [tag, id] = value.split(tagDelimiter);
|
|
22
22
|
if (id === undefined) {
|
|
23
|
-
return
|
|
23
|
+
return maybeNumberUnlessUuid(meta, value);
|
|
24
24
|
}
|
|
25
25
|
if (tag !== meta.tagName) {
|
|
26
26
|
throw new Error(`Invalid tagged id, expected tag ${meta.tagName}, got ${value}`);
|
|
27
27
|
}
|
|
28
|
-
return
|
|
28
|
+
return maybeNumberUnlessUuid(meta, id);
|
|
29
29
|
}
|
|
30
30
|
else {
|
|
31
31
|
throw new Error(`Invalid key ${value}`);
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
exports.keyToNumber = keyToNumber;
|
|
35
|
-
|
|
35
|
+
// If we're using UUIDs, just lie to the type system and pretend they're numbers.
|
|
36
|
+
function maybeNumberUnlessUuid(meta, key) {
|
|
37
|
+
if (meta.idType === "uuid") {
|
|
38
|
+
return key;
|
|
39
|
+
}
|
|
40
|
+
return Number(key);
|
|
41
|
+
}
|
|
42
|
+
/** Converts `value` to a tagged string, i.e. for string ids, unless its undefined. */
|
|
36
43
|
function keyToString(meta, value) {
|
|
37
44
|
return value === undefined || value === null ? undefined : `${meta.tagName}:${value}`;
|
|
38
45
|
}
|
|
@@ -45,28 +52,53 @@ function assertIdsAreTagged(keys) {
|
|
|
45
52
|
}
|
|
46
53
|
}
|
|
47
54
|
exports.assertIdsAreTagged = assertIdsAreTagged;
|
|
48
|
-
|
|
49
|
-
|
|
55
|
+
function tagId(metaOrCstr, id) {
|
|
56
|
+
if (typeof id === "number") {
|
|
57
|
+
return `${tagName(metaOrCstr)}${tagDelimiter}${id}`;
|
|
58
|
+
}
|
|
59
|
+
if (id === null || id === undefined) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
50
62
|
if (id.includes(tagDelimiter)) {
|
|
63
|
+
const [tag] = id.split(tagDelimiter);
|
|
64
|
+
if (tag !== tagName(metaOrCstr)) {
|
|
65
|
+
throw new Error(`Invalid tagged id, expected tag ${tagName(metaOrCstr)}, got ${id}`);
|
|
66
|
+
}
|
|
51
67
|
return id;
|
|
52
68
|
}
|
|
53
|
-
return `${
|
|
69
|
+
return `${tagName(metaOrCstr)}${tagDelimiter}${id}`;
|
|
54
70
|
}
|
|
55
|
-
exports.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return keys.map((k) => deTagId(meta, k));
|
|
71
|
+
exports.tagId = tagId;
|
|
72
|
+
function tagIds(metaOrCstr, keys) {
|
|
73
|
+
return keys.map((k) => tagId(metaOrCstr, k));
|
|
59
74
|
}
|
|
60
|
-
exports.
|
|
75
|
+
exports.tagIds = tagIds;
|
|
61
76
|
function deTagId(entityOrMeta, id) {
|
|
62
|
-
const meta = entityOrMeta instanceof BaseEntity_1.BaseEntity ? EntityManager_1.getMetadata(entityOrMeta) : entityOrMeta;
|
|
63
|
-
id = id
|
|
77
|
+
const meta = entityOrMeta instanceof BaseEntity_1.BaseEntity ? (0, EntityManager_1.getMetadata)(entityOrMeta) : entityOrMeta;
|
|
78
|
+
id = id ?? entityOrMeta.id;
|
|
64
79
|
return keyToNumber(meta, id).toString();
|
|
65
80
|
}
|
|
66
81
|
exports.deTagId = deTagId;
|
|
67
82
|
/** Removes the tag prefixes so we can use the keys for SQL operations. */
|
|
83
|
+
function deTagIds(meta, keys) {
|
|
84
|
+
return keys.map((k) => deTagId(meta, k));
|
|
85
|
+
}
|
|
86
|
+
exports.deTagIds = deTagIds;
|
|
87
|
+
/** Removes the tag prefixes so we can use the keys for SQL operations. */
|
|
68
88
|
function unsafeDeTagIds(keys) {
|
|
69
89
|
return keys.map((k) => k.split(tagDelimiter)).map((t) => (t.length === 0 ? t[0] : t[1]));
|
|
70
90
|
}
|
|
71
91
|
exports.unsafeDeTagIds = unsafeDeTagIds;
|
|
92
|
+
/** Given a tagged id, returns its tag. */
|
|
93
|
+
function tagFromId(key) {
|
|
94
|
+
const parts = key.split(tagDelimiter);
|
|
95
|
+
if (parts.length !== 2) {
|
|
96
|
+
fail(`Unknown tagged id format: "${key}"`);
|
|
97
|
+
}
|
|
98
|
+
return parts[0];
|
|
99
|
+
}
|
|
100
|
+
exports.tagFromId = tagFromId;
|
|
101
|
+
function tagName(metaOrCstr) {
|
|
102
|
+
return typeof metaOrCstr === "function" ? (0, EntityManager_1.getMetadata)(metaOrCstr).tagName : metaOrCstr.tagName;
|
|
103
|
+
}
|
|
72
104
|
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,8 @@ declare type LoadLike<U> = {
|
|
|
4
4
|
};
|
|
5
5
|
/** Generically matches a property or zero-arg method that returns a promise. */
|
|
6
6
|
declare type PromiseFnLike<U> = () => PromiseLike<U>;
|
|
7
|
-
/** Given a parent type
|
|
8
|
-
declare type MaybeArray<
|
|
7
|
+
/** Given a parent type P, and a new type V, returns V[] if P is already an array, i.e. we're in flatMap mode. */
|
|
8
|
+
declare type MaybeArray<P, V> = P extends ReadonlyArray<any> ? [V] extends [ReadonlyArray<infer U>] ? DropUndefined<U>[] : DropUndefined<V>[] : V;
|
|
9
9
|
/** Given a type T that we come across in the path, de-array it to continue our flatMap-ish semantics. */
|
|
10
10
|
declare type MaybeDropArray<T> = T extends ReadonlyArray<infer U> ? U : T;
|
|
11
11
|
declare type DropUndefined<T> = Exclude<T, undefined>;
|
|
@@ -20,7 +20,7 @@ async function loadLens(start, fn) {
|
|
|
20
20
|
for await (const path of paths) {
|
|
21
21
|
if (Array.isArray(current)) {
|
|
22
22
|
current = (await Promise.all(current.map((c) => maybeLoad(c, path)))).flat();
|
|
23
|
-
current = [...new Set(current)];
|
|
23
|
+
current = [...new Set(current.filter((c) => c !== undefined))];
|
|
24
24
|
}
|
|
25
25
|
else {
|
|
26
26
|
current = await maybeLoad(current, path);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadLens.js","sourceRoot":"","sources":["../../src/loadLens.ts"],"names":[],"mappings":";;;AAuCA;;;;;;;;GAQG;AACH,8FAA8F;AAC9F,6FAA6F;AAC7F,6DAA6D;AACtD,KAAK,UAAU,QAAQ,CAAU,KAAQ,EAAE,EAAiC;IACjF,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,OAAO,GAAQ,KAAK,CAAC;IACzB,qCAAqC;IACrC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7E,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;SACrE;aAAM;YACL,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SAC1C;KACF;IACD,OAAO,OAAQ,CAAC;AAClB,CAAC;AAbD,4BAaC;AAED,SAAS,SAAS,CAAC,MAAW,EAAE,IAAY;IAC1C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE;QAC3C,OAAO,SAAS,CAAC;KAClB;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,EAAE;QACzD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;KACrB;SAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;QAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KAC5B;SAAM;QACL,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO,CAAU,KAAQ,EAAE,EAAiC;IAC1E,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,OAAO,GAAQ,KAAK,CAAC;IACzB,qCAAqC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACvD,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;SACjC;aAAM;YACL,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SACnC;KACF;IACD,OAAO,OAAQ,CAAC;AAClB,CAAC;AAbD,0BAaC;AAED,SAAS,QAAQ,CAAC,MAAW,EAAE,IAAY;IACzC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE;QAC3C,OAAO,SAAS,CAAC;KAClB;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,EAAE;QACxD,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,UAAU,EAAE;YACnC,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC;SACpB;aAAM;YACL,OAAO,KAAK,CAAC,GAAG,CAAC;SAClB;KACF;SAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;QAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KAC5B;SAAM;QACL,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAED,SAAS,YAAY,CAAC,EAAY;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,EAAE,EACF;QACE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;YAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7B,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CACF,CAAC;IACF,sEAAsE;IACtE,EAAE,CAAC,KAAY,CAAC,CAAC;IACjB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** Marks a given `T[P]` as the loaded/synchronous version of the collection. */
|
|
2
|
+
import { Entity, OptsOf } from "./EntityManager";
|
|
3
|
+
import { AsyncProperty, Collection, LoadedCollection, LoadedProperty, LoadedReference, OneToOneReference, Reference, Relation } from "./relations";
|
|
4
|
+
import { LoadedOneToOneReference } from "./relations/OneToOneReference";
|
|
5
|
+
import { NullOrDefinedOr } from "./utils";
|
|
6
|
+
declare type MarkLoaded<T extends Entity, P, H = {}> = P extends OneToOneReference<T, infer U> ? LoadedOneToOneReference<T, Loaded<U, H>> : P extends Reference<T, infer U, infer N> ? LoadedReference<T, Loaded<U, H>, N> : P extends Collection<T, infer U> ? LoadedCollection<T, Loaded<U, H>> : P extends AsyncProperty<T, infer V> ? LoadedProperty<T, V> : unknown;
|
|
7
|
+
/**
|
|
8
|
+
* A helper type for `New` that marks every `Reference` and `LoadedCollection` in `T` as loaded.
|
|
9
|
+
*
|
|
10
|
+
* We also look in opts `O` for the "`U`" type, i.e. the next level up/down in the graph,
|
|
11
|
+
* because the call site's opts may be using an also-marked loaded parent/child as an opt,
|
|
12
|
+
* so this will infer the type of that parent/child and use that for the `U` type.
|
|
13
|
+
*
|
|
14
|
+
* This means things like `entity.parent.get.grandParent.get` will work on the resulting
|
|
15
|
+
* type.
|
|
16
|
+
*
|
|
17
|
+
* Note that this is also purposefully broken out of `New` because of some weirdness
|
|
18
|
+
* around type narrowing that wasn't working when inlined into `New`.
|
|
19
|
+
*/
|
|
20
|
+
declare type MaybeUseOptsType<T extends Entity, O, K extends keyof T & keyof O> = O[K] extends NullOrDefinedOr<infer OK> ? OK extends Entity ? T[K] extends OneToOneReference<T, infer U> ? LoadedOneToOneReference<T, U> : T[K] extends Reference<T, infer U, infer N> ? LoadedReference<T, OK, N> : never : OK extends Array<infer OU> ? OU extends Entity ? T[K] extends Collection<T, infer U> ? LoadedCollection<T, OU> : never : T[K] : T[K] : never;
|
|
21
|
+
/**
|
|
22
|
+
* Marks all references/collections of `T` as loaded, i.e. for newly instantiated entities where
|
|
23
|
+
* we know there are no already-existing rows with fk's to this new entity in the database.
|
|
24
|
+
*
|
|
25
|
+
* `O` is the generic from the call site so that if the caller passes `{ author: SomeLoadedAuthor }`,
|
|
26
|
+
* we'll prefer that type, as it might have more nested load hints that we can't otherwise assume.
|
|
27
|
+
*/
|
|
28
|
+
export declare type New<T extends Entity, O extends OptsOf<T> = OptsOf<T>> = T & {
|
|
29
|
+
[K in keyof T]: K extends keyof O ? MaybeUseOptsType<T, O, K> : MarkLoaded<T, T[K]>;
|
|
30
|
+
};
|
|
31
|
+
/** Detects whether an entity is newly created, and so we can treat all of the relations as loaded. */
|
|
32
|
+
export declare function isNew<T extends Entity>(e: T): e is New<T>;
|
|
33
|
+
/** Given an entity `T` that is being populated with hints `H`, marks the `H` attributes as populated. */
|
|
34
|
+
export declare type Loaded<T extends Entity, H extends LoadHint<T>> = T & {
|
|
35
|
+
[K in keyof T]: H extends NestedLoadHint<T> ? LoadedIfInNestedHint<T, K, H> : H extends ReadonlyArray<infer U> ? LoadedIfInKeyHint<T, K, U> : LoadedIfInKeyHint<T, K, H>;
|
|
36
|
+
};
|
|
37
|
+
declare type LoadedIfInNestedHint<T extends Entity, K extends keyof T, H> = K extends keyof H ? MarkLoaded<T, T[K], H[K]> : unknown;
|
|
38
|
+
declare type LoadedIfInKeyHint<T extends Entity, K extends keyof T, H> = K extends H ? MarkLoaded<T, T[K]> : unknown;
|
|
39
|
+
/** From any `Relations` field in `T`, i.e. for loader hints. */
|
|
40
|
+
export declare type RelationsIn<T extends Entity> = SubType<T, Relation<any, any>>;
|
|
41
|
+
export declare type Loadable<T extends Entity> = SubType<T, AsyncProperty<any, any> | Relation<any, any>>;
|
|
42
|
+
declare type SubType<T, C> = Pick<T, {
|
|
43
|
+
[K in keyof T]: T[K] extends C ? K : never;
|
|
44
|
+
}[keyof T]>;
|
|
45
|
+
export declare type LoadHint<T extends Entity> = keyof Loadable<T> | ReadonlyArray<keyof Loadable<T>> | NestedLoadHint<T>;
|
|
46
|
+
export declare type NestedLoadHint<T extends Entity> = {
|
|
47
|
+
[K in keyof Loadable<T>]?: T[K] extends Relation<any, infer U> ? LoadHint<U> : T[K] extends AsyncProperty<any, any> ? {} : never;
|
|
48
|
+
};
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isNew = void 0;
|
|
4
|
+
/** Detects whether an entity is newly created, and so we can treat all of the relations as loaded. */
|
|
5
|
+
function isNew(e) {
|
|
6
|
+
return e.id === undefined;
|
|
7
|
+
}
|
|
8
|
+
exports.isNew = isNew;
|
|
9
|
+
//# sourceMappingURL=loaded.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loaded.js","sourceRoot":"","sources":["../../src/loaded.ts"],"names":[],"mappings":";;;AAyEA,sGAAsG;AACtG,SAAgB,KAAK,CAAmB,CAAI;IAC1C,OAAO,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;AAC5B,CAAC;AAFD,sBAEC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ActualFactoryOpts, Entity, EntityConstructor, EntityManager, IdOf,
|
|
1
|
+
import { ActualFactoryOpts, Entity, EntityConstructor, EntityManager, IdOf, OptsOf } from "./EntityManager";
|
|
2
|
+
import { New } from "./index";
|
|
2
3
|
/**
|
|
3
4
|
* DeepPartial-esque type specific to our `newTestInstance` factory.
|
|
4
5
|
*
|
|
@@ -24,6 +25,37 @@ export declare function newTestInstance<T extends Entity>(em: EntityManager, cst
|
|
|
24
25
|
* debugging purposes.
|
|
25
26
|
*/
|
|
26
27
|
export declare const testIndex = "TEST_INDEX";
|
|
28
|
+
/**
|
|
29
|
+
* A marker value for the default `newTestInstance` behavior.
|
|
30
|
+
*
|
|
31
|
+
* Useful for passing arguments to `newTestInstance` where you sometimes want to
|
|
32
|
+
* provide a specific value, and other times ask for the "pick a default" behavior
|
|
33
|
+
* (i.e. you don't want to pass `undefined` b/c that means explicitly "leave this
|
|
34
|
+
* key unset").
|
|
35
|
+
*
|
|
36
|
+
* Note that this is a function so that we can infer the return type as basically
|
|
37
|
+
* `any` without really using `any` (which would disable type-checking in the rest
|
|
38
|
+
* of the expression).
|
|
39
|
+
*/
|
|
40
|
+
export declare function defaultValue<T>(): T;
|
|
41
|
+
/**
|
|
42
|
+
* Allows a factory to provide a default, i.e. for a field that would otherwise
|
|
43
|
+
* be optional, but still have that field be override by opts & use, without
|
|
44
|
+
* accidentally creating an extra entity as a side-effect.
|
|
45
|
+
*
|
|
46
|
+
* I.e.:
|
|
47
|
+
*
|
|
48
|
+
* ```typescript
|
|
49
|
+
* export function newAuthor(em: Entity, opts: FactoryOpts<Author>) {
|
|
50
|
+
* return newTestInstance(em, Author, {
|
|
51
|
+
* // publisher is not technically required, but make one
|
|
52
|
+
* publisher: maybeNew<Publisher>({}),
|
|
53
|
+
* ...opts,
|
|
54
|
+
* });
|
|
55
|
+
* }
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function maybeNew<T extends Entity>(opts?: ActualFactoryOpts<T>): FactoryEntityOpt<T>;
|
|
27
59
|
/**
|
|
28
60
|
* Returns a unique-ish test index for putting in `name` fields.
|
|
29
61
|
*
|
|
@@ -34,9 +66,11 @@ export declare const testIndex = "TEST_INDEX";
|
|
|
34
66
|
* Despite the name, these are 1-based, i.e. the first `Author` is `a1`.
|
|
35
67
|
*/
|
|
36
68
|
export declare function getTestIndex<T extends Entity>(em: EntityManager, type: EntityConstructor<T>): number;
|
|
37
|
-
declare type DefinedOr<T> = T | undefined;
|
|
69
|
+
declare type DefinedOr<T> = T | undefined | null;
|
|
38
70
|
declare type DeepPartialOpts<T extends Entity> = AllowRelationsOrPartials<OptsOf<T>>;
|
|
71
|
+
/** What a factory can accept for a given entity. */
|
|
72
|
+
export declare type FactoryEntityOpt<T extends Entity> = T | IdOf<T> | ActualFactoryOpts<T>;
|
|
39
73
|
declare type AllowRelationsOrPartials<T> = {
|
|
40
|
-
[P in keyof T]?: T[P] extends DefinedOr<infer U> ? U extends Array<infer V> ? V extends Entity ? Array<
|
|
74
|
+
[P in keyof T]?: T[P] extends DefinedOr<infer U> ? U extends Array<infer V> ? V extends Entity ? Array<FactoryEntityOpt<V>> : T[P] : U extends Entity ? FactoryEntityOpt<U> : T[P] : T[P];
|
|
41
75
|
};
|
|
42
76
|
export {};
|