@strapi/database 5.12.1 → 5.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connection.js +43 -0
- package/dist/connection.js.map +1 -0
- package/dist/connection.mjs +41 -0
- package/dist/connection.mjs.map +1 -0
- package/dist/dialects/dialect.js +54 -0
- package/dist/dialects/dialect.js.map +1 -0
- package/dist/dialects/dialect.mjs +52 -0
- package/dist/dialects/dialect.mjs.map +1 -0
- package/dist/dialects/index.js +44 -0
- package/dist/dialects/index.js.map +1 -0
- package/dist/dialects/index.mjs +42 -0
- package/dist/dialects/index.mjs.map +1 -0
- package/dist/dialects/mysql/constants.js +8 -0
- package/dist/dialects/mysql/constants.js.map +1 -0
- package/dist/dialects/mysql/constants.mjs +5 -0
- package/dist/dialects/mysql/constants.mjs.map +1 -0
- package/dist/dialects/mysql/database-inspector.js +35 -0
- package/dist/dialects/mysql/database-inspector.js.map +1 -0
- package/dist/dialects/mysql/database-inspector.mjs +33 -0
- package/dist/dialects/mysql/database-inspector.mjs.map +1 -0
- package/dist/dialects/mysql/index.js +75 -0
- package/dist/dialects/mysql/index.js.map +1 -0
- package/dist/dialects/mysql/index.mjs +73 -0
- package/dist/dialects/mysql/index.mjs.map +1 -0
- package/dist/dialects/mysql/schema-inspector.js +297 -0
- package/dist/dialects/mysql/schema-inspector.js.map +1 -0
- package/dist/dialects/mysql/schema-inspector.mjs +295 -0
- package/dist/dialects/mysql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/postgresql/index.js +62 -0
- package/dist/dialects/postgresql/index.js.map +1 -0
- package/dist/dialects/postgresql/index.mjs +60 -0
- package/dist/dialects/postgresql/index.mjs.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.js +316 -0
- package/dist/dialects/postgresql/schema-inspector.js.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.mjs +314 -0
- package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/sqlite/index.js +82 -0
- package/dist/dialects/sqlite/index.js.map +1 -0
- package/dist/dialects/sqlite/index.mjs +80 -0
- package/dist/dialects/sqlite/index.mjs.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.js +211 -0
- package/dist/dialects/sqlite/schema-inspector.js.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.mjs +209 -0
- package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -0
- package/dist/entity-manager/entity-repository.js +139 -0
- package/dist/entity-manager/entity-repository.js.map +1 -0
- package/dist/entity-manager/entity-repository.mjs +137 -0
- package/dist/entity-manager/entity-repository.mjs.map +1 -0
- package/dist/entity-manager/index.js +1186 -0
- package/dist/entity-manager/index.js.map +1 -0
- package/dist/entity-manager/index.mjs +1184 -0
- package/dist/entity-manager/index.mjs.map +1 -0
- package/dist/entity-manager/morph-relations.js +73 -0
- package/dist/entity-manager/morph-relations.js.map +1 -0
- package/dist/entity-manager/morph-relations.mjs +69 -0
- package/dist/entity-manager/morph-relations.mjs.map +1 -0
- package/dist/entity-manager/regular-relations.js +247 -0
- package/dist/entity-manager/regular-relations.js.map +1 -0
- package/dist/entity-manager/regular-relations.mjs +242 -0
- package/dist/entity-manager/regular-relations.mjs.map +1 -0
- package/dist/entity-manager/relations-orderer.js +221 -0
- package/dist/entity-manager/relations-orderer.js.map +1 -0
- package/dist/entity-manager/relations-orderer.mjs +218 -0
- package/dist/entity-manager/relations-orderer.mjs.map +1 -0
- package/dist/errors/database.js +13 -0
- package/dist/errors/database.js.map +1 -0
- package/dist/errors/database.mjs +11 -0
- package/dist/errors/database.mjs.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/index.mjs +7 -0
- package/dist/errors/index.mjs.map +1 -0
- package/dist/errors/invalid-date.js +13 -0
- package/dist/errors/invalid-date.js.map +1 -0
- package/dist/errors/invalid-date.mjs +11 -0
- package/dist/errors/invalid-date.mjs.map +1 -0
- package/dist/errors/invalid-datetime.js +13 -0
- package/dist/errors/invalid-datetime.js.map +1 -0
- package/dist/errors/invalid-datetime.mjs +11 -0
- package/dist/errors/invalid-datetime.mjs.map +1 -0
- package/dist/errors/invalid-relation.js +13 -0
- package/dist/errors/invalid-relation.js.map +1 -0
- package/dist/errors/invalid-relation.mjs +11 -0
- package/dist/errors/invalid-relation.mjs.map +1 -0
- package/dist/errors/invalid-time.js +13 -0
- package/dist/errors/invalid-time.js.map +1 -0
- package/dist/errors/invalid-time.mjs +11 -0
- package/dist/errors/invalid-time.mjs.map +1 -0
- package/dist/errors/not-null.js +17 -0
- package/dist/errors/not-null.js.map +1 -0
- package/dist/errors/not-null.mjs +15 -0
- package/dist/errors/not-null.mjs.map +1 -0
- package/dist/fields/biginteger.js +9 -0
- package/dist/fields/biginteger.js.map +1 -0
- package/dist/fields/biginteger.mjs +7 -0
- package/dist/fields/biginteger.mjs.map +1 -0
- package/dist/fields/boolean.js +48 -0
- package/dist/fields/boolean.js.map +1 -0
- package/dist/fields/boolean.mjs +46 -0
- package/dist/fields/boolean.mjs.map +1 -0
- package/dist/fields/date.js +16 -0
- package/dist/fields/date.js.map +1 -0
- package/dist/fields/date.mjs +14 -0
- package/dist/fields/date.mjs.map +1 -0
- package/dist/fields/datetime.js +37 -0
- package/dist/fields/datetime.js.map +1 -0
- package/dist/fields/datetime.mjs +16 -0
- package/dist/fields/datetime.mjs.map +1 -0
- package/dist/fields/field.js +16 -0
- package/dist/fields/field.js.map +1 -0
- package/dist/fields/field.mjs +14 -0
- package/dist/fields/field.mjs.map +1 -0
- package/dist/fields/index.js +45 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/fields/index.mjs +43 -0
- package/dist/fields/index.mjs.map +1 -0
- package/dist/fields/json.js +36 -0
- package/dist/fields/json.js.map +1 -0
- package/dist/fields/json.mjs +34 -0
- package/dist/fields/json.mjs.map +1 -0
- package/dist/fields/number.js +20 -0
- package/dist/fields/number.js.map +1 -0
- package/dist/fields/number.mjs +18 -0
- package/dist/fields/number.mjs.map +1 -0
- package/dist/fields/shared/parsers.js +91 -0
- package/dist/fields/shared/parsers.js.map +1 -0
- package/dist/fields/shared/parsers.mjs +68 -0
- package/dist/fields/shared/parsers.mjs.map +1 -0
- package/dist/fields/string.js +16 -0
- package/dist/fields/string.js.map +1 -0
- package/dist/fields/string.mjs +14 -0
- package/dist/fields/string.mjs.map +1 -0
- package/dist/fields/time.js +17 -0
- package/dist/fields/time.js.map +1 -0
- package/dist/fields/time.mjs +15 -0
- package/dist/fields/time.mjs.map +1 -0
- package/dist/fields/timestamp.js +37 -0
- package/dist/fields/timestamp.js.map +1 -0
- package/dist/fields/timestamp.mjs +16 -0
- package/dist/fields/timestamp.mjs.map +1 -0
- package/dist/index.js +33 -8569
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -8532
- package/dist/index.mjs.map +1 -1
- package/dist/lifecycles/index.js +73 -0
- package/dist/lifecycles/index.js.map +1 -0
- package/dist/lifecycles/index.mjs +71 -0
- package/dist/lifecycles/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/index.js +10 -0
- package/dist/lifecycles/subscribers/index.js.map +1 -0
- package/dist/lifecycles/subscribers/index.mjs +8 -0
- package/dist/lifecycles/subscribers/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js +13 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs +11 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.js +55 -0
- package/dist/lifecycles/subscribers/timestamps.js.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.mjs +53 -0
- package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -0
- package/dist/metadata/index.js +24 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/index.mjs +16 -0
- package/dist/metadata/index.mjs.map +1 -0
- package/dist/metadata/metadata.js +100 -0
- package/dist/metadata/metadata.js.map +1 -0
- package/dist/metadata/metadata.mjs +98 -0
- package/dist/metadata/metadata.mjs.map +1 -0
- package/dist/metadata/relations.js +545 -0
- package/dist/metadata/relations.js.map +1 -0
- package/dist/metadata/relations.mjs +536 -0
- package/dist/metadata/relations.mjs.map +1 -0
- package/dist/migrations/common.js +8 -0
- package/dist/migrations/common.js.map +1 -0
- package/dist/migrations/common.mjs +6 -0
- package/dist/migrations/common.mjs.map +1 -0
- package/dist/migrations/index.js +39 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/index.mjs +37 -0
- package/dist/migrations/index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +179 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs +177 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +125 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +123 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js +41 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs +39 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js +45 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs +43 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +43 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +41 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/index.js +26 -0
- package/dist/migrations/internal-migrations/index.js.map +1 -0
- package/dist/migrations/internal-migrations/index.mjs +24 -0
- package/dist/migrations/internal-migrations/index.mjs.map +1 -0
- package/dist/migrations/internal.js +63 -0
- package/dist/migrations/internal.js.map +1 -0
- package/dist/migrations/internal.mjs +61 -0
- package/dist/migrations/internal.mjs.map +1 -0
- package/dist/migrations/logger.js +24 -0
- package/dist/migrations/logger.js.map +1 -0
- package/dist/migrations/logger.mjs +22 -0
- package/dist/migrations/logger.mjs.map +1 -0
- package/dist/migrations/storage.js +39 -0
- package/dist/migrations/storage.js.map +1 -0
- package/dist/migrations/storage.mjs +37 -0
- package/dist/migrations/storage.mjs.map +1 -0
- package/dist/migrations/users.js +87 -0
- package/dist/migrations/users.js.map +1 -0
- package/dist/migrations/users.mjs +85 -0
- package/dist/migrations/users.mjs.map +1 -0
- package/dist/query/helpers/join.js +127 -0
- package/dist/query/helpers/join.js.map +1 -0
- package/dist/query/helpers/join.mjs +122 -0
- package/dist/query/helpers/join.mjs.map +1 -0
- package/dist/query/helpers/order-by.js +167 -0
- package/dist/query/helpers/order-by.js.map +1 -0
- package/dist/query/helpers/order-by.mjs +163 -0
- package/dist/query/helpers/order-by.mjs.map +1 -0
- package/dist/query/helpers/populate/apply.js +592 -0
- package/dist/query/helpers/populate/apply.js.map +1 -0
- package/dist/query/helpers/populate/apply.mjs +590 -0
- package/dist/query/helpers/populate/apply.mjs.map +1 -0
- package/dist/query/helpers/populate/process.js +92 -0
- package/dist/query/helpers/populate/process.js.map +1 -0
- package/dist/query/helpers/populate/process.mjs +90 -0
- package/dist/query/helpers/populate/process.mjs.map +1 -0
- package/dist/query/helpers/search.js +67 -0
- package/dist/query/helpers/search.js.map +1 -0
- package/dist/query/helpers/search.mjs +65 -0
- package/dist/query/helpers/search.mjs.map +1 -0
- package/dist/query/helpers/streams/readable.js +131 -0
- package/dist/query/helpers/streams/readable.js.map +1 -0
- package/dist/query/helpers/streams/readable.mjs +129 -0
- package/dist/query/helpers/streams/readable.mjs.map +1 -0
- package/dist/query/helpers/transform.js +77 -0
- package/dist/query/helpers/transform.js.map +1 -0
- package/dist/query/helpers/transform.mjs +73 -0
- package/dist/query/helpers/transform.mjs.map +1 -0
- package/dist/query/helpers/where.js +372 -0
- package/dist/query/helpers/where.js.map +1 -0
- package/dist/query/helpers/where.mjs +369 -0
- package/dist/query/helpers/where.mjs.map +1 -0
- package/dist/query/query-builder.js +507 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/query-builder.mjs +505 -0
- package/dist/query/query-builder.mjs.map +1 -0
- package/dist/repairs/index.js +13 -0
- package/dist/repairs/index.js.map +1 -0
- package/dist/repairs/index.mjs +11 -0
- package/dist/repairs/index.mjs.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js +54 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs +52 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -0
- package/dist/schema/builder.js +354 -0
- package/dist/schema/builder.js.map +1 -0
- package/dist/schema/builder.mjs +352 -0
- package/dist/schema/builder.mjs.map +1 -0
- package/dist/schema/diff.js +379 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/diff.mjs +377 -0
- package/dist/schema/diff.mjs.map +1 -0
- package/dist/schema/index.js +93 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/index.mjs +91 -0
- package/dist/schema/index.mjs.map +1 -0
- package/dist/schema/schema.js +266 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/schema.mjs +264 -0
- package/dist/schema/schema.mjs.map +1 -0
- package/dist/schema/storage.js +58 -0
- package/dist/schema/storage.js.map +1 -0
- package/dist/schema/storage.mjs +56 -0
- package/dist/schema/storage.mjs.map +1 -0
- package/dist/transaction-context.js +65 -0
- package/dist/transaction-context.js.map +1 -0
- package/dist/transaction-context.mjs +63 -0
- package/dist/transaction-context.mjs.map +1 -0
- package/dist/utils/async-curry.js +19 -0
- package/dist/utils/async-curry.js.map +1 -0
- package/dist/utils/async-curry.mjs +17 -0
- package/dist/utils/async-curry.mjs.map +1 -0
- package/dist/utils/identifiers/hash.js +30 -0
- package/dist/utils/identifiers/hash.js.map +1 -0
- package/dist/utils/identifiers/hash.mjs +28 -0
- package/dist/utils/identifiers/hash.mjs.map +1 -0
- package/dist/utils/identifiers/index.js +414 -0
- package/dist/utils/identifiers/index.js.map +1 -0
- package/dist/utils/identifiers/index.mjs +411 -0
- package/dist/utils/identifiers/index.mjs.map +1 -0
- package/dist/utils/knex.js +21 -0
- package/dist/utils/knex.js.map +1 -0
- package/dist/utils/knex.mjs +18 -0
- package/dist/utils/knex.mjs.map +1 -0
- package/dist/utils/types.js +51 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/types.mjs +44 -0
- package/dist/utils/types.mjs.map +1 -0
- package/dist/validations/index.js +12 -0
- package/dist/validations/index.js.map +1 -0
- package/dist/validations/index.mjs +10 -0
- package/dist/validations/index.mjs.map +1 -0
- package/dist/validations/relations/bidirectional.js +64 -0
- package/dist/validations/relations/bidirectional.js.map +1 -0
- package/dist/validations/relations/bidirectional.mjs +62 -0
- package/dist/validations/relations/bidirectional.mjs.map +1 -0
- package/dist/validations/relations/index.js +13 -0
- package/dist/validations/relations/index.js.map +1 -0
- package/dist/validations/relations/index.mjs +11 -0
- package/dist/validations/relations/index.mjs.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var assert = require('assert');
|
|
4
|
+
var index = require('./subscribers/index.js');
|
|
5
|
+
var timestamps = require('./subscribers/timestamps.js');
|
|
6
|
+
var modelsLifecycles = require('./subscribers/models-lifecycles.js');
|
|
7
|
+
|
|
8
|
+
const createLifecyclesProvider = (db)=>{
|
|
9
|
+
let subscribers = [
|
|
10
|
+
timestamps.timestampsLifecyclesSubscriber,
|
|
11
|
+
modelsLifecycles.modelsLifecyclesSubscriber
|
|
12
|
+
];
|
|
13
|
+
let isLifecycleHooksDisabled = false;
|
|
14
|
+
return {
|
|
15
|
+
subscribe (subscriber) {
|
|
16
|
+
assert.strict(index.isValidSubscriber(subscriber), 'Invalid subscriber. Expected function or object');
|
|
17
|
+
subscribers.push(subscriber);
|
|
18
|
+
return ()=>subscribers.splice(subscribers.indexOf(subscriber), 1);
|
|
19
|
+
},
|
|
20
|
+
clear () {
|
|
21
|
+
subscribers = [];
|
|
22
|
+
},
|
|
23
|
+
disable () {
|
|
24
|
+
isLifecycleHooksDisabled = true;
|
|
25
|
+
},
|
|
26
|
+
enable () {
|
|
27
|
+
isLifecycleHooksDisabled = false;
|
|
28
|
+
},
|
|
29
|
+
createEvent (action, uid, properties, state) {
|
|
30
|
+
const model = db.metadata.get(uid);
|
|
31
|
+
return {
|
|
32
|
+
action,
|
|
33
|
+
model,
|
|
34
|
+
state,
|
|
35
|
+
...properties
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
/**
|
|
39
|
+
* @param {string} action
|
|
40
|
+
* @param {string} uid
|
|
41
|
+
* @param {{ params?: any, result?: any }} properties
|
|
42
|
+
* @param {Map<any, any>} states
|
|
43
|
+
*/ async run (action, uid, properties, states = new Map()) {
|
|
44
|
+
if (isLifecycleHooksDisabled) return states;
|
|
45
|
+
for(let i = 0; i < subscribers.length; i += 1){
|
|
46
|
+
const subscriber = subscribers[i];
|
|
47
|
+
if (typeof subscriber === 'function') {
|
|
48
|
+
const state = states.get(subscriber) || {};
|
|
49
|
+
const event = this.createEvent(action, uid, properties, state);
|
|
50
|
+
await subscriber(event);
|
|
51
|
+
if (event.state) {
|
|
52
|
+
states.set(subscriber, event.state || state);
|
|
53
|
+
}
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const hasAction = action in subscriber;
|
|
57
|
+
const hasModel = !subscriber.models || subscriber.models.includes(uid);
|
|
58
|
+
if (hasAction && hasModel) {
|
|
59
|
+
const state = states.get(subscriber) || {};
|
|
60
|
+
const event = this.createEvent(action, uid, properties, state);
|
|
61
|
+
await subscriber[action]?.(event);
|
|
62
|
+
if (event.state) {
|
|
63
|
+
states.set(subscriber, event.state);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return states;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
exports.createLifecyclesProvider = createLifecyclesProvider;
|
|
73
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/lifecycles/index.ts"],"sourcesContent":["import { strict as assert } from 'assert';\n\nimport * as subscriberUtils from './subscribers';\n\nimport type { Action, Event, Params, Subscriber } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nexport type State = Record<string, unknown>;\nexport type States = Map<Subscriber, State>;\n\nexport interface Properties {\n params: Params;\n result?: unknown;\n}\n\nexport interface LifecycleProvider {\n subscribe(subscriber: Subscriber): () => void;\n clear(): void;\n run(action: Action, uid: string, properties: Properties, states?: States): Promise<States>;\n createEvent(action: Action, uid: string, properties: Properties, state: State): Event;\n disable(): void;\n enable(): void;\n}\n\nexport const createLifecyclesProvider = (db: Database): LifecycleProvider => {\n let subscribers = [\n subscriberUtils.timestampsLifecyclesSubscriber,\n subscriberUtils.modelsLifecyclesSubscriber,\n ];\n\n let isLifecycleHooksDisabled = false;\n\n return {\n subscribe(subscriber) {\n assert(\n subscriberUtils.isValidSubscriber(subscriber),\n 'Invalid subscriber. Expected function or object'\n );\n\n subscribers.push(subscriber);\n\n return () => subscribers.splice(subscribers.indexOf(subscriber), 1);\n },\n\n clear() {\n subscribers = [];\n },\n\n disable() {\n isLifecycleHooksDisabled = true;\n },\n\n enable() {\n isLifecycleHooksDisabled = false;\n },\n\n createEvent(action, uid, properties, state): Event {\n const model = db.metadata.get(uid);\n\n return {\n action,\n model,\n state,\n ...properties,\n };\n },\n\n /**\n * @param {string} action\n * @param {string} uid\n * @param {{ params?: any, result?: any }} properties\n * @param {Map<any, any>} states\n */\n async run(action, uid, properties, states = new Map()) {\n if (isLifecycleHooksDisabled) return states;\n for (let i = 0; i < subscribers.length; i += 1) {\n const subscriber = subscribers[i];\n if (typeof subscriber === 'function') {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n await subscriber(event);\n if (event.state) {\n states.set(subscriber, event.state || state);\n }\n continue;\n }\n\n const hasAction = action in subscriber;\n const hasModel = !subscriber.models || subscriber.models.includes(uid);\n\n if (hasAction && hasModel) {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n\n await subscriber[action]?.(event);\n if (event.state) {\n states.set(subscriber, event.state);\n }\n }\n }\n\n return states;\n },\n };\n};\n"],"names":["createLifecyclesProvider","db","subscribers","subscriberUtils","isLifecycleHooksDisabled","subscribe","subscriber","assert","push","splice","indexOf","clear","disable","enable","createEvent","action","uid","properties","state","model","metadata","get","run","states","Map","i","length","event","set","hasAction","hasModel","models","includes"],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { strict } from 'assert';
|
|
2
|
+
import { isValidSubscriber } from './subscribers/index.mjs';
|
|
3
|
+
import { timestampsLifecyclesSubscriber } from './subscribers/timestamps.mjs';
|
|
4
|
+
import { modelsLifecyclesSubscriber } from './subscribers/models-lifecycles.mjs';
|
|
5
|
+
|
|
6
|
+
const createLifecyclesProvider = (db)=>{
|
|
7
|
+
let subscribers = [
|
|
8
|
+
timestampsLifecyclesSubscriber,
|
|
9
|
+
modelsLifecyclesSubscriber
|
|
10
|
+
];
|
|
11
|
+
let isLifecycleHooksDisabled = false;
|
|
12
|
+
return {
|
|
13
|
+
subscribe (subscriber) {
|
|
14
|
+
strict(isValidSubscriber(subscriber), 'Invalid subscriber. Expected function or object');
|
|
15
|
+
subscribers.push(subscriber);
|
|
16
|
+
return ()=>subscribers.splice(subscribers.indexOf(subscriber), 1);
|
|
17
|
+
},
|
|
18
|
+
clear () {
|
|
19
|
+
subscribers = [];
|
|
20
|
+
},
|
|
21
|
+
disable () {
|
|
22
|
+
isLifecycleHooksDisabled = true;
|
|
23
|
+
},
|
|
24
|
+
enable () {
|
|
25
|
+
isLifecycleHooksDisabled = false;
|
|
26
|
+
},
|
|
27
|
+
createEvent (action, uid, properties, state) {
|
|
28
|
+
const model = db.metadata.get(uid);
|
|
29
|
+
return {
|
|
30
|
+
action,
|
|
31
|
+
model,
|
|
32
|
+
state,
|
|
33
|
+
...properties
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
/**
|
|
37
|
+
* @param {string} action
|
|
38
|
+
* @param {string} uid
|
|
39
|
+
* @param {{ params?: any, result?: any }} properties
|
|
40
|
+
* @param {Map<any, any>} states
|
|
41
|
+
*/ async run (action, uid, properties, states = new Map()) {
|
|
42
|
+
if (isLifecycleHooksDisabled) return states;
|
|
43
|
+
for(let i = 0; i < subscribers.length; i += 1){
|
|
44
|
+
const subscriber = subscribers[i];
|
|
45
|
+
if (typeof subscriber === 'function') {
|
|
46
|
+
const state = states.get(subscriber) || {};
|
|
47
|
+
const event = this.createEvent(action, uid, properties, state);
|
|
48
|
+
await subscriber(event);
|
|
49
|
+
if (event.state) {
|
|
50
|
+
states.set(subscriber, event.state || state);
|
|
51
|
+
}
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const hasAction = action in subscriber;
|
|
55
|
+
const hasModel = !subscriber.models || subscriber.models.includes(uid);
|
|
56
|
+
if (hasAction && hasModel) {
|
|
57
|
+
const state = states.get(subscriber) || {};
|
|
58
|
+
const event = this.createEvent(action, uid, properties, state);
|
|
59
|
+
await subscriber[action]?.(event);
|
|
60
|
+
if (event.state) {
|
|
61
|
+
states.set(subscriber, event.state);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return states;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export { createLifecyclesProvider };
|
|
71
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/lifecycles/index.ts"],"sourcesContent":["import { strict as assert } from 'assert';\n\nimport * as subscriberUtils from './subscribers';\n\nimport type { Action, Event, Params, Subscriber } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nexport type State = Record<string, unknown>;\nexport type States = Map<Subscriber, State>;\n\nexport interface Properties {\n params: Params;\n result?: unknown;\n}\n\nexport interface LifecycleProvider {\n subscribe(subscriber: Subscriber): () => void;\n clear(): void;\n run(action: Action, uid: string, properties: Properties, states?: States): Promise<States>;\n createEvent(action: Action, uid: string, properties: Properties, state: State): Event;\n disable(): void;\n enable(): void;\n}\n\nexport const createLifecyclesProvider = (db: Database): LifecycleProvider => {\n let subscribers = [\n subscriberUtils.timestampsLifecyclesSubscriber,\n subscriberUtils.modelsLifecyclesSubscriber,\n ];\n\n let isLifecycleHooksDisabled = false;\n\n return {\n subscribe(subscriber) {\n assert(\n subscriberUtils.isValidSubscriber(subscriber),\n 'Invalid subscriber. Expected function or object'\n );\n\n subscribers.push(subscriber);\n\n return () => subscribers.splice(subscribers.indexOf(subscriber), 1);\n },\n\n clear() {\n subscribers = [];\n },\n\n disable() {\n isLifecycleHooksDisabled = true;\n },\n\n enable() {\n isLifecycleHooksDisabled = false;\n },\n\n createEvent(action, uid, properties, state): Event {\n const model = db.metadata.get(uid);\n\n return {\n action,\n model,\n state,\n ...properties,\n };\n },\n\n /**\n * @param {string} action\n * @param {string} uid\n * @param {{ params?: any, result?: any }} properties\n * @param {Map<any, any>} states\n */\n async run(action, uid, properties, states = new Map()) {\n if (isLifecycleHooksDisabled) return states;\n for (let i = 0; i < subscribers.length; i += 1) {\n const subscriber = subscribers[i];\n if (typeof subscriber === 'function') {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n await subscriber(event);\n if (event.state) {\n states.set(subscriber, event.state || state);\n }\n continue;\n }\n\n const hasAction = action in subscriber;\n const hasModel = !subscriber.models || subscriber.models.includes(uid);\n\n if (hasAction && hasModel) {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n\n await subscriber[action]?.(event);\n if (event.state) {\n states.set(subscriber, event.state);\n }\n }\n }\n\n return states;\n },\n };\n};\n"],"names":["createLifecyclesProvider","db","subscribers","subscriberUtils","isLifecycleHooksDisabled","subscribe","subscriber","assert","push","splice","indexOf","clear","disable","enable","createEvent","action","uid","properties","state","model","metadata","get","run","states","Map","i","length","event","set","hasAction","hasModel","models","includes"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('lodash');
|
|
4
|
+
|
|
5
|
+
const isValidSubscriber = (subscriber)=>{
|
|
6
|
+
return typeof subscriber === 'function' || typeof subscriber === 'object' && subscriber !== null;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
exports.isValidSubscriber = isValidSubscriber;
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/lifecycles/subscribers/index.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\nexport const isValidSubscriber = (subscriber: Subscriber) => {\n return (\n typeof subscriber === 'function' || (typeof subscriber === 'object' && subscriber !== null)\n );\n};\n\nexport { modelsLifecyclesSubscriber } from './models-lifecycles';\nexport { timestampsLifecyclesSubscriber } from './timestamps';\n"],"names":["isValidSubscriber","subscriber"],"mappings":";;;;AAEO,MAAMA,oBAAoB,CAACC,UAAAA,GAAAA;AAChC,IAAA,OACE,OAAOA,UAAe,KAAA,UAAA,IAAe,OAAOA,UAAAA,KAAe,YAAYA,UAAe,KAAA,IAAA;AAE1F;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/lifecycles/subscribers/index.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\nexport const isValidSubscriber = (subscriber: Subscriber) => {\n return (\n typeof subscriber === 'function' || (typeof subscriber === 'object' && subscriber !== null)\n );\n};\n\nexport { modelsLifecyclesSubscriber } from './models-lifecycles';\nexport { timestampsLifecyclesSubscriber } from './timestamps';\n"],"names":["isValidSubscriber","subscriber"],"mappings":";;AAEO,MAAMA,oBAAoB,CAACC,UAAAA,GAAAA;AAChC,IAAA,OACE,OAAOA,UAAe,KAAA,UAAA,IAAe,OAAOA,UAAAA,KAAe,YAAYA,UAAe,KAAA,IAAA;AAE1F;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* For each model try to run it's lifecycles function if any is defined
|
|
5
|
+
*/ const modelsLifecyclesSubscriber = async (event)=>{
|
|
6
|
+
const { model } = event;
|
|
7
|
+
if (model.lifecycles && event.action in model.lifecycles) {
|
|
8
|
+
await model.lifecycles[event.action]?.(event);
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
exports.modelsLifecyclesSubscriber = modelsLifecyclesSubscriber;
|
|
13
|
+
//# sourceMappingURL=models-lifecycles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-lifecycles.js","sources":["../../../src/lifecycles/subscribers/models-lifecycles.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\n/**\n * For each model try to run it's lifecycles function if any is defined\n */\nexport const modelsLifecyclesSubscriber: Subscriber = async (event) => {\n const { model } = event;\n\n if (model.lifecycles && event.action in model.lifecycles) {\n await model.lifecycles[event.action]?.(event);\n }\n};\n"],"names":["modelsLifecyclesSubscriber","event","model","lifecycles","action"],"mappings":";;AAEA;;IAGaA,MAAAA,0BAAAA,GAAyC,OAAOC,KAAAA,GAAAA;IAC3D,MAAM,EAAEC,KAAK,EAAE,GAAGD,KAAAA;IAElB,IAAIC,KAAAA,CAAMC,UAAU,IAAIF,KAAAA,CAAMG,MAAM,IAAIF,KAAAA,CAAMC,UAAU,EAAE;AACxD,QAAA,MAAMD,MAAMC,UAAU,CAACF,KAAMG,CAAAA,MAAM,CAAC,GAAGH,KAAAA,CAAAA;AACzC;AACF;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* For each model try to run it's lifecycles function if any is defined
|
|
3
|
+
*/ const modelsLifecyclesSubscriber = async (event)=>{
|
|
4
|
+
const { model } = event;
|
|
5
|
+
if (model.lifecycles && event.action in model.lifecycles) {
|
|
6
|
+
await model.lifecycles[event.action]?.(event);
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { modelsLifecyclesSubscriber };
|
|
11
|
+
//# sourceMappingURL=models-lifecycles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-lifecycles.mjs","sources":["../../../src/lifecycles/subscribers/models-lifecycles.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\n/**\n * For each model try to run it's lifecycles function if any is defined\n */\nexport const modelsLifecyclesSubscriber: Subscriber = async (event) => {\n const { model } = event;\n\n if (model.lifecycles && event.action in model.lifecycles) {\n await model.lifecycles[event.action]?.(event);\n }\n};\n"],"names":["modelsLifecyclesSubscriber","event","model","lifecycles","action"],"mappings":"AAEA;;IAGaA,MAAAA,0BAAAA,GAAyC,OAAOC,KAAAA,GAAAA;IAC3D,MAAM,EAAEC,KAAK,EAAE,GAAGD,KAAAA;IAElB,IAAIC,KAAAA,CAAMC,UAAU,IAAIF,KAAAA,CAAMG,MAAM,IAAIF,KAAAA,CAAMC,UAAU,EAAE;AACxD,QAAA,MAAMD,MAAMC,UAAU,CAACF,KAAMG,CAAAA,MAAM,CAAC,GAAGH,KAAAA,CAAAA;AACzC;AACF;;;;"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _ = require('lodash');
|
|
4
|
+
|
|
5
|
+
// NOTE: we could add onCreate & onUpdate on field level to do this instead
|
|
6
|
+
const timestampsLifecyclesSubscriber = {
|
|
7
|
+
/**
|
|
8
|
+
* Init createdAt & updatedAt before create
|
|
9
|
+
*/ beforeCreate (event) {
|
|
10
|
+
const { data } = event.params;
|
|
11
|
+
const now = new Date();
|
|
12
|
+
_.defaults(data, {
|
|
13
|
+
createdAt: now,
|
|
14
|
+
updatedAt: now
|
|
15
|
+
});
|
|
16
|
+
},
|
|
17
|
+
/**
|
|
18
|
+
* Init createdAt & updatedAt before create
|
|
19
|
+
* @param {Event} event
|
|
20
|
+
*/ beforeCreateMany (event) {
|
|
21
|
+
const { data } = event.params;
|
|
22
|
+
const now = new Date();
|
|
23
|
+
if (_.isArray(data)) {
|
|
24
|
+
data.forEach((data)=>_.defaults(data, {
|
|
25
|
+
createdAt: now,
|
|
26
|
+
updatedAt: now
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
/**
|
|
31
|
+
* Update updatedAt before update
|
|
32
|
+
* @param {Event} event
|
|
33
|
+
*/ beforeUpdate (event) {
|
|
34
|
+
const { data } = event.params;
|
|
35
|
+
const now = new Date();
|
|
36
|
+
_.assign(data, {
|
|
37
|
+
updatedAt: now
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
/**
|
|
41
|
+
* Update updatedAt before update
|
|
42
|
+
* @param {Event} event
|
|
43
|
+
*/ beforeUpdateMany (event) {
|
|
44
|
+
const { data } = event.params;
|
|
45
|
+
const now = new Date();
|
|
46
|
+
if (_.isArray(data)) {
|
|
47
|
+
data.forEach((data)=>_.assign(data, {
|
|
48
|
+
updatedAt: now
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
exports.timestampsLifecyclesSubscriber = timestampsLifecyclesSubscriber;
|
|
55
|
+
//# sourceMappingURL=timestamps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamps.js","sources":["../../../src/lifecycles/subscribers/timestamps.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Event, Subscriber } from '../types';\n\n// NOTE: we could add onCreate & onUpdate on field level to do this instead\nexport const timestampsLifecyclesSubscriber: Subscriber = {\n /**\n * Init createdAt & updatedAt before create\n */\n beforeCreate(event: Event) {\n const { data } = event.params;\n\n const now = new Date();\n _.defaults(data, { createdAt: now, updatedAt: now });\n },\n\n /**\n * Init createdAt & updatedAt before create\n * @param {Event} event\n */\n beforeCreateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.defaults(data, { createdAt: now, updatedAt: now }));\n }\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdate(event) {\n const { data } = event.params;\n\n const now = new Date();\n _.assign(data, { updatedAt: now });\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.assign(data, { updatedAt: now }));\n }\n },\n};\n"],"names":["timestampsLifecyclesSubscriber","beforeCreate","event","data","params","now","Date","_","defaults","createdAt","updatedAt","beforeCreateMany","isArray","forEach","beforeUpdate","assign","beforeUpdateMany"],"mappings":";;;;AAGA;MACaA,8BAA6C,GAAA;AACxD;;AAEC,MACDC,cAAaC,KAAY,EAAA;AACvB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAEC,CAAAA,QAAQ,CAACL,IAAM,EAAA;YAAEM,SAAWJ,EAAAA,GAAAA;YAAKK,SAAWL,EAAAA;AAAI,SAAA,CAAA;AACpD,KAAA;AAEA;;;AAGC,MACDM,kBAAiBT,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAO,CAAA,EAAA;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAEC,CAAAA,QAAQ,CAACL,IAAM,EAAA;oBAAEM,SAAWJ,EAAAA,GAAAA;oBAAKK,SAAWL,EAAAA;AAAI,iBAAA,CAAA,CAAA;AAC3E;AACF,KAAA;AAEA;;;AAGC,MACDS,cAAaZ,KAAK,EAAA;AAChB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAEQ,CAAAA,MAAM,CAACZ,IAAM,EAAA;YAAEO,SAAWL,EAAAA;AAAI,SAAA,CAAA;AAClC,KAAA;AAEA;;;AAGC,MACDW,kBAAiBd,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAO,CAAA,EAAA;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAEQ,CAAAA,MAAM,CAACZ,IAAM,EAAA;oBAAEO,SAAWL,EAAAA;AAAI,iBAAA,CAAA,CAAA;AACzD;AACF;AACF;;;;"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
|
|
3
|
+
// NOTE: we could add onCreate & onUpdate on field level to do this instead
|
|
4
|
+
const timestampsLifecyclesSubscriber = {
|
|
5
|
+
/**
|
|
6
|
+
* Init createdAt & updatedAt before create
|
|
7
|
+
*/ beforeCreate (event) {
|
|
8
|
+
const { data } = event.params;
|
|
9
|
+
const now = new Date();
|
|
10
|
+
_.defaults(data, {
|
|
11
|
+
createdAt: now,
|
|
12
|
+
updatedAt: now
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
/**
|
|
16
|
+
* Init createdAt & updatedAt before create
|
|
17
|
+
* @param {Event} event
|
|
18
|
+
*/ beforeCreateMany (event) {
|
|
19
|
+
const { data } = event.params;
|
|
20
|
+
const now = new Date();
|
|
21
|
+
if (_.isArray(data)) {
|
|
22
|
+
data.forEach((data)=>_.defaults(data, {
|
|
23
|
+
createdAt: now,
|
|
24
|
+
updatedAt: now
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
/**
|
|
29
|
+
* Update updatedAt before update
|
|
30
|
+
* @param {Event} event
|
|
31
|
+
*/ beforeUpdate (event) {
|
|
32
|
+
const { data } = event.params;
|
|
33
|
+
const now = new Date();
|
|
34
|
+
_.assign(data, {
|
|
35
|
+
updatedAt: now
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
/**
|
|
39
|
+
* Update updatedAt before update
|
|
40
|
+
* @param {Event} event
|
|
41
|
+
*/ beforeUpdateMany (event) {
|
|
42
|
+
const { data } = event.params;
|
|
43
|
+
const now = new Date();
|
|
44
|
+
if (_.isArray(data)) {
|
|
45
|
+
data.forEach((data)=>_.assign(data, {
|
|
46
|
+
updatedAt: now
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export { timestampsLifecyclesSubscriber };
|
|
53
|
+
//# sourceMappingURL=timestamps.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamps.mjs","sources":["../../../src/lifecycles/subscribers/timestamps.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Event, Subscriber } from '../types';\n\n// NOTE: we could add onCreate & onUpdate on field level to do this instead\nexport const timestampsLifecyclesSubscriber: Subscriber = {\n /**\n * Init createdAt & updatedAt before create\n */\n beforeCreate(event: Event) {\n const { data } = event.params;\n\n const now = new Date();\n _.defaults(data, { createdAt: now, updatedAt: now });\n },\n\n /**\n * Init createdAt & updatedAt before create\n * @param {Event} event\n */\n beforeCreateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.defaults(data, { createdAt: now, updatedAt: now }));\n }\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdate(event) {\n const { data } = event.params;\n\n const now = new Date();\n _.assign(data, { updatedAt: now });\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.assign(data, { updatedAt: now }));\n }\n },\n};\n"],"names":["timestampsLifecyclesSubscriber","beforeCreate","event","data","params","now","Date","_","defaults","createdAt","updatedAt","beforeCreateMany","isArray","forEach","beforeUpdate","assign","beforeUpdateMany"],"mappings":";;AAGA;MACaA,8BAA6C,GAAA;AACxD;;AAEC,MACDC,cAAaC,KAAY,EAAA;AACvB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAEC,CAAAA,QAAQ,CAACL,IAAM,EAAA;YAAEM,SAAWJ,EAAAA,GAAAA;YAAKK,SAAWL,EAAAA;AAAI,SAAA,CAAA;AACpD,KAAA;AAEA;;;AAGC,MACDM,kBAAiBT,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAO,CAAA,EAAA;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAEC,CAAAA,QAAQ,CAACL,IAAM,EAAA;oBAAEM,SAAWJ,EAAAA,GAAAA;oBAAKK,SAAWL,EAAAA;AAAI,iBAAA,CAAA,CAAA;AAC3E;AACF,KAAA;AAEA;;;AAGC,MACDS,cAAaZ,KAAK,EAAA;AAChB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAEQ,CAAAA,MAAM,CAACZ,IAAM,EAAA;YAAEO,SAAWL,EAAAA;AAAI,SAAA,CAAA;AAClC,KAAA;AAEA;;;AAGC,MACDW,kBAAiBd,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAO,CAAA,EAAA;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAEQ,CAAAA,MAAM,CAACZ,IAAM,EAAA;oBAAEO,SAAWL,EAAAA;AAAI,iBAAA,CAAA,CAAA;AACzD;AACF;AACF;;;;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var relations = require('./relations.js');
|
|
4
|
+
var metadata = require('./metadata.js');
|
|
5
|
+
|
|
6
|
+
// TODO: check if there isn't an attribute with an id already
|
|
7
|
+
/**
|
|
8
|
+
* Create Metadata from models configurations
|
|
9
|
+
*/ const createMetadata = (models)=>{
|
|
10
|
+
const metadata$1 = new metadata.Metadata();
|
|
11
|
+
if (models.length) {
|
|
12
|
+
metadata$1.loadModels(models);
|
|
13
|
+
}
|
|
14
|
+
return metadata$1;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
exports.hasInverseOrderColumn = relations.hasInverseOrderColumn;
|
|
18
|
+
exports.hasOrderColumn = relations.hasOrderColumn;
|
|
19
|
+
exports.isAnyToOne = relations.isAnyToOne;
|
|
20
|
+
exports.isBidirectional = relations.isBidirectional;
|
|
21
|
+
exports.isManyToAny = relations.isManyToAny;
|
|
22
|
+
exports.isOneToAny = relations.isOneToAny;
|
|
23
|
+
exports.createMetadata = createMetadata;
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/metadata/index.ts"],"sourcesContent":["import {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n} from './relations';\nimport { Metadata, Meta } from './metadata';\nimport type { Model } from '../types';\n\nexport type { Metadata, Meta };\nexport {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n};\n\n// TODO: check if there isn't an attribute with an id already\n/**\n * Create Metadata from models configurations\n */\nexport const createMetadata = (models: Model[]): Metadata => {\n const metadata = new Metadata();\n\n if (models.length) {\n metadata.loadModels(models);\n }\n\n return metadata;\n};\n"],"names":["createMetadata","models","metadata","Metadata","length","loadModels"],"mappings":";;;;;AAuBA;AACA;;IAGaA,MAAAA,cAAAA,GAAiB,CAACC,MAAAA,GAAAA;AAC7B,IAAA,MAAMC,aAAW,IAAIC,iBAAAA,EAAAA;IAErB,IAAIF,MAAAA,CAAOG,MAAM,EAAE;AACjBF,QAAAA,UAAAA,CAASG,UAAU,CAACJ,MAAAA,CAAAA;AACtB;IAEA,OAAOC,UAAAA;AACT;;;;;;;;;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { hasInverseOrderColumn, hasOrderColumn, isAnyToOne, isBidirectional, isManyToAny, isOneToAny } from './relations.mjs';
|
|
2
|
+
import { Metadata } from './metadata.mjs';
|
|
3
|
+
|
|
4
|
+
// TODO: check if there isn't an attribute with an id already
|
|
5
|
+
/**
|
|
6
|
+
* Create Metadata from models configurations
|
|
7
|
+
*/ const createMetadata = (models)=>{
|
|
8
|
+
const metadata = new Metadata();
|
|
9
|
+
if (models.length) {
|
|
10
|
+
metadata.loadModels(models);
|
|
11
|
+
}
|
|
12
|
+
return metadata;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { createMetadata };
|
|
16
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/metadata/index.ts"],"sourcesContent":["import {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n} from './relations';\nimport { Metadata, Meta } from './metadata';\nimport type { Model } from '../types';\n\nexport type { Metadata, Meta };\nexport {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n};\n\n// TODO: check if there isn't an attribute with an id already\n/**\n * Create Metadata from models configurations\n */\nexport const createMetadata = (models: Model[]): Metadata => {\n const metadata = new Metadata();\n\n if (models.length) {\n metadata.loadModels(models);\n }\n\n return metadata;\n};\n"],"names":["createMetadata","models","metadata","Metadata","length","loadModels"],"mappings":";;;AAuBA;AACA;;IAGaA,MAAAA,cAAAA,GAAiB,CAACC,MAAAA,GAAAA;AAC7B,IAAA,MAAMC,WAAW,IAAIC,QAAAA,EAAAA;IAErB,IAAIF,MAAAA,CAAOG,MAAM,EAAE;AACjBF,QAAAA,QAAAA,CAASG,UAAU,CAACJ,MAAAA,CAAAA;AACtB;IAEA,OAAOC,QAAAA;AACT;;;;"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _ = require('lodash/fp');
|
|
4
|
+
var index = require('../utils/identifiers/index.js');
|
|
5
|
+
var types = require('../utils/types.js');
|
|
6
|
+
var relations = require('./relations.js');
|
|
7
|
+
|
|
8
|
+
class Metadata extends Map {
|
|
9
|
+
// TODO: we expose the global identifiers in this way so that in the future we can instantiate our own
|
|
10
|
+
// However, it should NOT be done until all the methods used by metadata can be part of this metadata object
|
|
11
|
+
// and access this one; currently they all access the global identifiers directly.
|
|
12
|
+
get identifiers() {
|
|
13
|
+
return index.identifiers;
|
|
14
|
+
}
|
|
15
|
+
get(key) {
|
|
16
|
+
if (!super.has(key)) {
|
|
17
|
+
throw new Error(`Metadata for "${key}" not found`);
|
|
18
|
+
}
|
|
19
|
+
return super.get(key);
|
|
20
|
+
}
|
|
21
|
+
add(meta) {
|
|
22
|
+
return this.set(meta.uid, meta);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Validate the DB metadata, throwing an error if a duplicate DB table name is detected
|
|
26
|
+
*/ validate() {
|
|
27
|
+
const seenTables = new Map();
|
|
28
|
+
for (const meta of this.values()){
|
|
29
|
+
if (seenTables.get(meta.tableName)) {
|
|
30
|
+
throw new Error(`DB table "${meta.tableName}" already exists. Change the collectionName of the related content type.`);
|
|
31
|
+
}
|
|
32
|
+
seenTables.set(meta.tableName, true);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
loadModels(models) {
|
|
36
|
+
// init pass
|
|
37
|
+
for (const model of _.cloneDeep(models ?? [])){
|
|
38
|
+
const tableName = index.identifiers.getTableName(model.tableName);
|
|
39
|
+
this.add({
|
|
40
|
+
...model,
|
|
41
|
+
tableName,
|
|
42
|
+
attributes: {
|
|
43
|
+
...model.attributes
|
|
44
|
+
},
|
|
45
|
+
lifecycles: model.lifecycles ?? {},
|
|
46
|
+
indexes: model.indexes ?? [],
|
|
47
|
+
foreignKeys: model.foreignKeys ?? [],
|
|
48
|
+
columnToAttribute: {}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// build compos / relations
|
|
52
|
+
for (const meta of this.values()){
|
|
53
|
+
for (const [attributeName, attribute] of Object.entries(meta.attributes)){
|
|
54
|
+
try {
|
|
55
|
+
if (attribute.unstable_virtual) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (types.isRelationalAttribute(attribute)) {
|
|
59
|
+
relations.createRelation(attributeName, attribute, meta, this);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
createAttribute(attributeName, attribute);
|
|
63
|
+
} catch (error) {
|
|
64
|
+
if (error instanceof Error) {
|
|
65
|
+
throw new Error(`Error on attribute ${attributeName} in model ${meta.singularName}(${meta.uid}): ${error.message}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
for (const meta of this.values()){
|
|
71
|
+
const columnToAttribute = Object.keys(meta.attributes).reduce((acc, key)=>{
|
|
72
|
+
const attribute = meta.attributes[key];
|
|
73
|
+
if ('columnName' in attribute) {
|
|
74
|
+
return Object.assign(acc, {
|
|
75
|
+
[attribute.columnName || key]: key
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return Object.assign(acc, {
|
|
79
|
+
[key]: key
|
|
80
|
+
});
|
|
81
|
+
}, {});
|
|
82
|
+
meta.columnToAttribute = columnToAttribute;
|
|
83
|
+
}
|
|
84
|
+
this.validate();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const createAttribute = (attributeName, attribute)=>{
|
|
88
|
+
// if the attribute has already set its own column name, use that
|
|
89
|
+
// this will prevent us from shortening a name twice
|
|
90
|
+
if ('columnName' in attribute && attribute.columnName) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const columnName = index.identifiers.getColumnName(_.snakeCase(attributeName));
|
|
94
|
+
Object.assign(attribute, {
|
|
95
|
+
columnName
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
exports.Metadata = Metadata;
|
|
100
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sources":["../../src/metadata/metadata.ts"],"sourcesContent":["import { cloneDeep, snakeCase } from 'lodash/fp';\nimport { identifiers } from '../utils/identifiers';\nimport * as types from '../utils/types';\nimport { createRelation } from './relations';\nimport type { Attribute, Model } from '../types';\nimport type { ForeignKey, Index } from '../schema/types';\nimport type { Action, SubscriberFn } from '../lifecycles';\n\nexport interface Meta extends Model {\n columnToAttribute: Record<string, string>;\n indexes: Index[];\n foreignKeys: ForeignKey[];\n lifecycles: Partial<Record<Action, SubscriberFn>>;\n}\n\nexport class Metadata extends Map<string, Meta> {\n // TODO: we expose the global identifiers in this way so that in the future we can instantiate our own\n // However, it should NOT be done until all the methods used by metadata can be part of this metadata object\n // and access this one; currently they all access the global identifiers directly.\n get identifiers() {\n return identifiers;\n }\n\n get(key: string): Meta {\n if (!super.has(key)) {\n throw new Error(`Metadata for \"${key}\" not found`);\n }\n\n return super.get(key) as Meta;\n }\n\n add(meta: Meta) {\n return this.set(meta.uid, meta);\n }\n\n /**\n * Validate the DB metadata, throwing an error if a duplicate DB table name is detected\n */\n validate() {\n const seenTables = new Map();\n for (const meta of this.values()) {\n if (seenTables.get(meta.tableName)) {\n throw new Error(\n `DB table \"${meta.tableName}\" already exists. Change the collectionName of the related content type.`\n );\n }\n seenTables.set(meta.tableName, true);\n }\n }\n\n loadModels(models: Model[]) {\n // init pass\n for (const model of cloneDeep(models ?? [])) {\n const tableName = identifiers.getTableName(model.tableName);\n this.add({\n ...model,\n tableName,\n attributes: {\n ...model.attributes,\n },\n lifecycles: model.lifecycles ?? {},\n indexes: model.indexes ?? [],\n foreignKeys: model.foreignKeys ?? [],\n columnToAttribute: {},\n });\n }\n\n // build compos / relations\n for (const meta of this.values()) {\n for (const [attributeName, attribute] of Object.entries(meta.attributes)) {\n try {\n if (attribute.unstable_virtual) {\n continue;\n }\n\n if (types.isRelationalAttribute(attribute)) {\n createRelation(attributeName, attribute, meta, this);\n continue;\n }\n\n createAttribute(attributeName, attribute);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Error on attribute ${attributeName} in model ${meta.singularName}(${meta.uid}): ${error.message}`\n );\n }\n }\n }\n }\n\n for (const meta of this.values()) {\n const columnToAttribute = Object.keys(meta.attributes).reduce((acc, key) => {\n const attribute = meta.attributes[key];\n if ('columnName' in attribute) {\n return Object.assign(acc, { [attribute.columnName || key]: key });\n }\n\n return Object.assign(acc, { [key]: key });\n }, {});\n\n meta.columnToAttribute = columnToAttribute;\n }\n\n this.validate();\n }\n}\n\nconst createAttribute = (attributeName: string, attribute: Attribute) => {\n // if the attribute has already set its own column name, use that\n // this will prevent us from shortening a name twice\n if ('columnName' in attribute && attribute.columnName) {\n return;\n }\n\n const columnName = identifiers.getColumnName(snakeCase(attributeName));\n\n Object.assign(attribute, { columnName });\n};\n"],"names":["Metadata","Map","identifiers","get","key","has","Error","add","meta","set","uid","validate","seenTables","values","tableName","loadModels","models","model","cloneDeep","getTableName","attributes","lifecycles","indexes","foreignKeys","columnToAttribute","attributeName","attribute","Object","entries","unstable_virtual","types","createRelation","createAttribute","error","singularName","message","keys","reduce","acc","assign","columnName","getColumnName","snakeCase"],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { cloneDeep, snakeCase } from 'lodash/fp';
|
|
2
|
+
import { identifiers } from '../utils/identifiers/index.mjs';
|
|
3
|
+
import { isRelationalAttribute } from '../utils/types.mjs';
|
|
4
|
+
import { createRelation } from './relations.mjs';
|
|
5
|
+
|
|
6
|
+
class Metadata extends Map {
|
|
7
|
+
// TODO: we expose the global identifiers in this way so that in the future we can instantiate our own
|
|
8
|
+
// However, it should NOT be done until all the methods used by metadata can be part of this metadata object
|
|
9
|
+
// and access this one; currently they all access the global identifiers directly.
|
|
10
|
+
get identifiers() {
|
|
11
|
+
return identifiers;
|
|
12
|
+
}
|
|
13
|
+
get(key) {
|
|
14
|
+
if (!super.has(key)) {
|
|
15
|
+
throw new Error(`Metadata for "${key}" not found`);
|
|
16
|
+
}
|
|
17
|
+
return super.get(key);
|
|
18
|
+
}
|
|
19
|
+
add(meta) {
|
|
20
|
+
return this.set(meta.uid, meta);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validate the DB metadata, throwing an error if a duplicate DB table name is detected
|
|
24
|
+
*/ validate() {
|
|
25
|
+
const seenTables = new Map();
|
|
26
|
+
for (const meta of this.values()){
|
|
27
|
+
if (seenTables.get(meta.tableName)) {
|
|
28
|
+
throw new Error(`DB table "${meta.tableName}" already exists. Change the collectionName of the related content type.`);
|
|
29
|
+
}
|
|
30
|
+
seenTables.set(meta.tableName, true);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
loadModels(models) {
|
|
34
|
+
// init pass
|
|
35
|
+
for (const model of cloneDeep(models ?? [])){
|
|
36
|
+
const tableName = identifiers.getTableName(model.tableName);
|
|
37
|
+
this.add({
|
|
38
|
+
...model,
|
|
39
|
+
tableName,
|
|
40
|
+
attributes: {
|
|
41
|
+
...model.attributes
|
|
42
|
+
},
|
|
43
|
+
lifecycles: model.lifecycles ?? {},
|
|
44
|
+
indexes: model.indexes ?? [],
|
|
45
|
+
foreignKeys: model.foreignKeys ?? [],
|
|
46
|
+
columnToAttribute: {}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
// build compos / relations
|
|
50
|
+
for (const meta of this.values()){
|
|
51
|
+
for (const [attributeName, attribute] of Object.entries(meta.attributes)){
|
|
52
|
+
try {
|
|
53
|
+
if (attribute.unstable_virtual) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (isRelationalAttribute(attribute)) {
|
|
57
|
+
createRelation(attributeName, attribute, meta, this);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
createAttribute(attributeName, attribute);
|
|
61
|
+
} catch (error) {
|
|
62
|
+
if (error instanceof Error) {
|
|
63
|
+
throw new Error(`Error on attribute ${attributeName} in model ${meta.singularName}(${meta.uid}): ${error.message}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const meta of this.values()){
|
|
69
|
+
const columnToAttribute = Object.keys(meta.attributes).reduce((acc, key)=>{
|
|
70
|
+
const attribute = meta.attributes[key];
|
|
71
|
+
if ('columnName' in attribute) {
|
|
72
|
+
return Object.assign(acc, {
|
|
73
|
+
[attribute.columnName || key]: key
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return Object.assign(acc, {
|
|
77
|
+
[key]: key
|
|
78
|
+
});
|
|
79
|
+
}, {});
|
|
80
|
+
meta.columnToAttribute = columnToAttribute;
|
|
81
|
+
}
|
|
82
|
+
this.validate();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const createAttribute = (attributeName, attribute)=>{
|
|
86
|
+
// if the attribute has already set its own column name, use that
|
|
87
|
+
// this will prevent us from shortening a name twice
|
|
88
|
+
if ('columnName' in attribute && attribute.columnName) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const columnName = identifiers.getColumnName(snakeCase(attributeName));
|
|
92
|
+
Object.assign(attribute, {
|
|
93
|
+
columnName
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export { Metadata };
|
|
98
|
+
//# sourceMappingURL=metadata.mjs.map
|