@rolster/vinegar 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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/index.js +199 -0
  3. package/dist/cjs/index.js.map +1 -0
  4. package/dist/es/index.js +185 -0
  5. package/dist/es/index.js.map +1 -0
  6. package/dist/esm/database.d.ts +7 -0
  7. package/dist/esm/database.js +3 -0
  8. package/dist/esm/database.js.map +1 -0
  9. package/dist/esm/datasource.d.ts +10 -0
  10. package/dist/esm/datasource.js +3 -0
  11. package/dist/esm/datasource.js.map +1 -0
  12. package/dist/esm/entity-link.d.ts +9 -0
  13. package/dist/esm/entity-link.js +7 -0
  14. package/dist/esm/entity-link.js.map +1 -0
  15. package/dist/esm/entity-manager.d.ts +49 -0
  16. package/dist/esm/entity-manager.js +108 -0
  17. package/dist/esm/entity-manager.js.map +1 -0
  18. package/dist/esm/entity-sync.d.ts +14 -0
  19. package/dist/esm/entity-sync.js +38 -0
  20. package/dist/esm/entity-sync.js.map +1 -0
  21. package/dist/esm/entity-update.d.ts +9 -0
  22. package/dist/esm/entity-update.js +8 -0
  23. package/dist/esm/entity-update.js.map +1 -0
  24. package/dist/esm/entity.d.ts +4 -0
  25. package/dist/esm/entity.js +6 -0
  26. package/dist/esm/entity.js.map +1 -0
  27. package/dist/esm/index.d.ts +11 -0
  28. package/dist/esm/index.js +12 -0
  29. package/dist/esm/index.js.map +1 -0
  30. package/dist/esm/model.d.ts +13 -0
  31. package/dist/esm/model.js +2 -0
  32. package/dist/esm/model.js.map +1 -0
  33. package/dist/esm/persistent-unit.d.ts +3 -0
  34. package/dist/esm/persistent-unit.js +3 -0
  35. package/dist/esm/persistent-unit.js.map +1 -0
  36. package/dist/esm/procedure.d.ts +3 -0
  37. package/dist/esm/procedure.js +3 -0
  38. package/dist/esm/procedure.js.map +1 -0
  39. package/dist/esm/repository.d.ts +8 -0
  40. package/dist/esm/repository.js +3 -0
  41. package/dist/esm/repository.js.map +1 -0
  42. package/package.json +56 -0
  43. package/readme.md +23 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Rolster Technology
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,199 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var helpersAdvanced = require('@rolster/helpers-advanced');
6
+
7
+ class EntityDatabase {
8
+ }
9
+
10
+ class EntityDataSource {
11
+ }
12
+
13
+ class EntityLink {
14
+ constructor(entity, bindable = true) {
15
+ this.entity = entity;
16
+ this.bindable = bindable;
17
+ }
18
+ }
19
+
20
+ class EntityManager {
21
+ }
22
+ class RolsterEntityManager {
23
+ constructor(source) {
24
+ this.source = source;
25
+ this.links = [];
26
+ this.updates = [];
27
+ this.syncs = [];
28
+ this.destroys = [];
29
+ this.hiddens = [];
30
+ this.procedures = [];
31
+ this.relations = new Map();
32
+ }
33
+ persist(link) {
34
+ this.links.push(link);
35
+ }
36
+ update(update) {
37
+ const { bindable, entity, model } = update;
38
+ if (bindable) {
39
+ this.relation(entity, model);
40
+ }
41
+ this.updates.push(update);
42
+ }
43
+ sync(sync) {
44
+ const { bindable, entity, model } = sync;
45
+ if (bindable) {
46
+ this.relation(entity, model);
47
+ }
48
+ this.syncs.push(sync);
49
+ }
50
+ destroy(entity) {
51
+ this.select(entity).present((model) => {
52
+ isHidden(model) ? this.hiddens.push(model) : this.destroys.push(model);
53
+ });
54
+ }
55
+ procedure(procedure) {
56
+ this.procedures.push(procedure);
57
+ }
58
+ relation({ uuid }, model) {
59
+ this.relations.set(uuid, model);
60
+ }
61
+ select({ uuid }) {
62
+ return helpersAdvanced.Optional.build(this.relations.has(uuid) ? this.relations.get(uuid) : undefined);
63
+ }
64
+ async flush() {
65
+ await this.persistAll();
66
+ await this.updateAll();
67
+ await this.syncAll();
68
+ await this.hiddenAll();
69
+ await this.destroyAll();
70
+ await this.procedureAll();
71
+ this.dispose();
72
+ }
73
+ dispose() {
74
+ this.relations.clear();
75
+ this.links = [];
76
+ this.updates = [];
77
+ this.syncs = [];
78
+ this.destroys = [];
79
+ this.hiddens = [];
80
+ this.procedures = [];
81
+ }
82
+ persistAll() {
83
+ const { links, source } = this;
84
+ return Promise.all(links.map((link) => helpersAdvanced.fromPromise(link.createModel(this)).then((model) => {
85
+ const { bindable, entity } = link;
86
+ if (bindable) {
87
+ this.relation(entity, model);
88
+ }
89
+ return source.insert(model);
90
+ })));
91
+ }
92
+ updateAll() {
93
+ const { source, updates } = this;
94
+ return Promise.all(updates.map(({ model }) => source.update(model)));
95
+ }
96
+ syncAll() {
97
+ const { destroys, source, syncs } = this;
98
+ return Promise.all(syncs
99
+ .filter(({ model }) => !destroys.includes(model))
100
+ .reduce((syncs, sync) => {
101
+ const dirty = sync.verify();
102
+ if (dirty) {
103
+ const { model } = sync;
104
+ syncs.push({ model, dirty });
105
+ }
106
+ return syncs;
107
+ }, [])
108
+ .map(({ model, dirty }) => source.update(model, dirty)));
109
+ }
110
+ destroyAll() {
111
+ const { destroys, source } = this;
112
+ return Promise.all(destroys.map((destroy) => source.delete(destroy)));
113
+ }
114
+ hiddenAll() {
115
+ const { hiddens, source } = this;
116
+ return Promise.all(hiddens.map((hidden) => source.hidden(hidden)));
117
+ }
118
+ procedureAll() {
119
+ const { procedures, source } = this;
120
+ return Promise.all(procedures.map((procedure) => source.procedure(procedure)));
121
+ }
122
+ }
123
+ function isHidden(model) {
124
+ return 'hidden' in model && 'hiddenAt' in model;
125
+ }
126
+
127
+ class EntitySync {
128
+ constructor(entity, model, bindable = true) {
129
+ this.entity = entity;
130
+ this.model = model;
131
+ this.bindable = bindable;
132
+ this.firstStatus = this.mapperModel(model);
133
+ }
134
+ verify() {
135
+ this.sync();
136
+ return this.createDirty();
137
+ }
138
+ mapperModel(model) {
139
+ const dirty = {};
140
+ Object.keys(model).forEach((key) => {
141
+ dirty[key] = model[key];
142
+ });
143
+ return dirty;
144
+ }
145
+ createDirty() {
146
+ const currentStatus = this.mapperModel(this.model);
147
+ const modelDirty = {};
148
+ let dirty = false;
149
+ Object.keys(currentStatus).forEach((key) => {
150
+ if (currentStatus[key] !== this.firstStatus[key]) {
151
+ dirty = true;
152
+ modelDirty[key] = currentStatus[key];
153
+ }
154
+ });
155
+ if (isUpdated(this.model)) {
156
+ modelDirty['updatedAt'] = new Date();
157
+ }
158
+ return dirty ? modelDirty : undefined;
159
+ }
160
+ }
161
+ function isUpdated(model) {
162
+ return 'updatedAt' in model;
163
+ }
164
+
165
+ class EntityUpdate {
166
+ constructor(entity, model, bindable = true) {
167
+ this.entity = entity;
168
+ this.model = model;
169
+ this.bindable = bindable;
170
+ }
171
+ }
172
+
173
+ class Entity {
174
+ constructor(uuid) {
175
+ this.uuid = uuid;
176
+ }
177
+ }
178
+
179
+ class PersistentUnit {
180
+ }
181
+
182
+ class Procedure {
183
+ }
184
+
185
+ class Repository {
186
+ }
187
+
188
+ exports.Entity = Entity;
189
+ exports.EntityDataSource = EntityDataSource;
190
+ exports.EntityDatabase = EntityDatabase;
191
+ exports.EntityLink = EntityLink;
192
+ exports.EntityManager = EntityManager;
193
+ exports.EntitySync = EntitySync;
194
+ exports.EntityUpdate = EntityUpdate;
195
+ exports.PersistentUnit = PersistentUnit;
196
+ exports.Procedure = Procedure;
197
+ exports.Repository = Repository;
198
+ exports.RolsterEntityManager = RolsterEntityManager;
199
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../esm/database.js","../esm/datasource.js","../esm/entity-link.js","../esm/entity-manager.js","../esm/entity-sync.js","../esm/entity-update.js","../esm/entity.js","../esm/persistent-unit.js","../esm/procedure.js","../esm/repository.js"],"sourcesContent":["export class EntityDatabase {\r\n}\r\n//# sourceMappingURL=database.js.map","export class EntityDataSource {\r\n}\r\n//# sourceMappingURL=datasource.js.map","export class EntityLink {\r\n constructor(entity, bindable = true) {\r\n this.entity = entity;\r\n this.bindable = bindable;\r\n }\r\n}\r\n//# sourceMappingURL=entity-link.js.map","import { Optional, fromPromise } from '@rolster/helpers-advanced';\r\nexport class EntityManager {\r\n}\r\nexport class RolsterEntityManager {\r\n constructor(source) {\r\n this.source = source;\r\n this.links = [];\r\n this.updates = [];\r\n this.syncs = [];\r\n this.destroys = [];\r\n this.hiddens = [];\r\n this.procedures = [];\r\n this.relations = new Map();\r\n }\r\n persist(link) {\r\n this.links.push(link);\r\n }\r\n update(update) {\r\n const { bindable, entity, model } = update;\r\n if (bindable) {\r\n this.relation(entity, model);\r\n }\r\n this.updates.push(update);\r\n }\r\n sync(sync) {\r\n const { bindable, entity, model } = sync;\r\n if (bindable) {\r\n this.relation(entity, model);\r\n }\r\n this.syncs.push(sync);\r\n }\r\n destroy(entity) {\r\n this.select(entity).present((model) => {\r\n isHidden(model) ? this.hiddens.push(model) : this.destroys.push(model);\r\n });\r\n }\r\n procedure(procedure) {\r\n this.procedures.push(procedure);\r\n }\r\n relation({ uuid }, model) {\r\n this.relations.set(uuid, model);\r\n }\r\n select({ uuid }) {\r\n return Optional.build(this.relations.has(uuid) ? this.relations.get(uuid) : undefined);\r\n }\r\n async flush() {\r\n await this.persistAll();\r\n await this.updateAll();\r\n await this.syncAll();\r\n await this.hiddenAll();\r\n await this.destroyAll();\r\n await this.procedureAll();\r\n this.dispose();\r\n }\r\n dispose() {\r\n this.relations.clear();\r\n this.links = [];\r\n this.updates = [];\r\n this.syncs = [];\r\n this.destroys = [];\r\n this.hiddens = [];\r\n this.procedures = [];\r\n }\r\n persistAll() {\r\n const { links, source } = this;\r\n return Promise.all(links.map((link) => fromPromise(link.createModel(this)).then((model) => {\r\n const { bindable, entity } = link;\r\n if (bindable) {\r\n this.relation(entity, model);\r\n }\r\n return source.insert(model);\r\n })));\r\n }\r\n updateAll() {\r\n const { source, updates } = this;\r\n return Promise.all(updates.map(({ model }) => source.update(model)));\r\n }\r\n syncAll() {\r\n const { destroys, source, syncs } = this;\r\n return Promise.all(syncs\r\n .filter(({ model }) => !destroys.includes(model))\r\n .reduce((syncs, sync) => {\r\n const dirty = sync.verify();\r\n if (dirty) {\r\n const { model } = sync;\r\n syncs.push({ model, dirty });\r\n }\r\n return syncs;\r\n }, [])\r\n .map(({ model, dirty }) => source.update(model, dirty)));\r\n }\r\n destroyAll() {\r\n const { destroys, source } = this;\r\n return Promise.all(destroys.map((destroy) => source.delete(destroy)));\r\n }\r\n hiddenAll() {\r\n const { hiddens, source } = this;\r\n return Promise.all(hiddens.map((hidden) => source.hidden(hidden)));\r\n }\r\n procedureAll() {\r\n const { procedures, source } = this;\r\n return Promise.all(procedures.map((procedure) => source.procedure(procedure)));\r\n }\r\n}\r\nfunction isHidden(model) {\r\n return 'hidden' in model && 'hiddenAt' in model;\r\n}\r\n//# sourceMappingURL=entity-manager.js.map","export class EntitySync {\r\n constructor(entity, model, bindable = true) {\r\n this.entity = entity;\r\n this.model = model;\r\n this.bindable = bindable;\r\n this.firstStatus = this.mapperModel(model);\r\n }\r\n verify() {\r\n this.sync();\r\n return this.createDirty();\r\n }\r\n mapperModel(model) {\r\n const dirty = {};\r\n Object.keys(model).forEach((key) => {\r\n dirty[key] = model[key];\r\n });\r\n return dirty;\r\n }\r\n createDirty() {\r\n const currentStatus = this.mapperModel(this.model);\r\n const modelDirty = {};\r\n let dirty = false;\r\n Object.keys(currentStatus).forEach((key) => {\r\n if (currentStatus[key] !== this.firstStatus[key]) {\r\n dirty = true;\r\n modelDirty[key] = currentStatus[key];\r\n }\r\n });\r\n if (isUpdated(this.model)) {\r\n modelDirty['updatedAt'] = new Date();\r\n }\r\n return dirty ? modelDirty : undefined;\r\n }\r\n}\r\nfunction isUpdated(model) {\r\n return 'updatedAt' in model;\r\n}\r\n//# sourceMappingURL=entity-sync.js.map","export class EntityUpdate {\r\n constructor(entity, model, bindable = true) {\r\n this.entity = entity;\r\n this.model = model;\r\n this.bindable = bindable;\r\n }\r\n}\r\n//# sourceMappingURL=entity-update.js.map","export class Entity {\r\n constructor(uuid) {\r\n this.uuid = uuid;\r\n }\r\n}\r\n//# sourceMappingURL=entity.js.map","export class PersistentUnit {\r\n}\r\n//# sourceMappingURL=persistent-unit.js.map","export class Procedure {\r\n}\r\n//# sourceMappingURL=procedure.js.map","export class Repository {\r\n}\r\n//# sourceMappingURL=repository.js.map"],"names":["Optional","fromPromise"],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ import { Optional, fromPromise } from '@rolster/helpers-advanced';
2
+
3
+ class EntityDatabase {
4
+ }
5
+
6
+ class EntityDataSource {
7
+ }
8
+
9
+ class EntityLink {
10
+ constructor(entity, bindable = true) {
11
+ this.entity = entity;
12
+ this.bindable = bindable;
13
+ }
14
+ }
15
+
16
+ class EntityManager {
17
+ }
18
+ class RolsterEntityManager {
19
+ constructor(source) {
20
+ this.source = source;
21
+ this.links = [];
22
+ this.updates = [];
23
+ this.syncs = [];
24
+ this.destroys = [];
25
+ this.hiddens = [];
26
+ this.procedures = [];
27
+ this.relations = new Map();
28
+ }
29
+ persist(link) {
30
+ this.links.push(link);
31
+ }
32
+ update(update) {
33
+ const { bindable, entity, model } = update;
34
+ if (bindable) {
35
+ this.relation(entity, model);
36
+ }
37
+ this.updates.push(update);
38
+ }
39
+ sync(sync) {
40
+ const { bindable, entity, model } = sync;
41
+ if (bindable) {
42
+ this.relation(entity, model);
43
+ }
44
+ this.syncs.push(sync);
45
+ }
46
+ destroy(entity) {
47
+ this.select(entity).present((model) => {
48
+ isHidden(model) ? this.hiddens.push(model) : this.destroys.push(model);
49
+ });
50
+ }
51
+ procedure(procedure) {
52
+ this.procedures.push(procedure);
53
+ }
54
+ relation({ uuid }, model) {
55
+ this.relations.set(uuid, model);
56
+ }
57
+ select({ uuid }) {
58
+ return Optional.build(this.relations.has(uuid) ? this.relations.get(uuid) : undefined);
59
+ }
60
+ async flush() {
61
+ await this.persistAll();
62
+ await this.updateAll();
63
+ await this.syncAll();
64
+ await this.hiddenAll();
65
+ await this.destroyAll();
66
+ await this.procedureAll();
67
+ this.dispose();
68
+ }
69
+ dispose() {
70
+ this.relations.clear();
71
+ this.links = [];
72
+ this.updates = [];
73
+ this.syncs = [];
74
+ this.destroys = [];
75
+ this.hiddens = [];
76
+ this.procedures = [];
77
+ }
78
+ persistAll() {
79
+ const { links, source } = this;
80
+ return Promise.all(links.map((link) => fromPromise(link.createModel(this)).then((model) => {
81
+ const { bindable, entity } = link;
82
+ if (bindable) {
83
+ this.relation(entity, model);
84
+ }
85
+ return source.insert(model);
86
+ })));
87
+ }
88
+ updateAll() {
89
+ const { source, updates } = this;
90
+ return Promise.all(updates.map(({ model }) => source.update(model)));
91
+ }
92
+ syncAll() {
93
+ const { destroys, source, syncs } = this;
94
+ return Promise.all(syncs
95
+ .filter(({ model }) => !destroys.includes(model))
96
+ .reduce((syncs, sync) => {
97
+ const dirty = sync.verify();
98
+ if (dirty) {
99
+ const { model } = sync;
100
+ syncs.push({ model, dirty });
101
+ }
102
+ return syncs;
103
+ }, [])
104
+ .map(({ model, dirty }) => source.update(model, dirty)));
105
+ }
106
+ destroyAll() {
107
+ const { destroys, source } = this;
108
+ return Promise.all(destroys.map((destroy) => source.delete(destroy)));
109
+ }
110
+ hiddenAll() {
111
+ const { hiddens, source } = this;
112
+ return Promise.all(hiddens.map((hidden) => source.hidden(hidden)));
113
+ }
114
+ procedureAll() {
115
+ const { procedures, source } = this;
116
+ return Promise.all(procedures.map((procedure) => source.procedure(procedure)));
117
+ }
118
+ }
119
+ function isHidden(model) {
120
+ return 'hidden' in model && 'hiddenAt' in model;
121
+ }
122
+
123
+ class EntitySync {
124
+ constructor(entity, model, bindable = true) {
125
+ this.entity = entity;
126
+ this.model = model;
127
+ this.bindable = bindable;
128
+ this.firstStatus = this.mapperModel(model);
129
+ }
130
+ verify() {
131
+ this.sync();
132
+ return this.createDirty();
133
+ }
134
+ mapperModel(model) {
135
+ const dirty = {};
136
+ Object.keys(model).forEach((key) => {
137
+ dirty[key] = model[key];
138
+ });
139
+ return dirty;
140
+ }
141
+ createDirty() {
142
+ const currentStatus = this.mapperModel(this.model);
143
+ const modelDirty = {};
144
+ let dirty = false;
145
+ Object.keys(currentStatus).forEach((key) => {
146
+ if (currentStatus[key] !== this.firstStatus[key]) {
147
+ dirty = true;
148
+ modelDirty[key] = currentStatus[key];
149
+ }
150
+ });
151
+ if (isUpdated(this.model)) {
152
+ modelDirty['updatedAt'] = new Date();
153
+ }
154
+ return dirty ? modelDirty : undefined;
155
+ }
156
+ }
157
+ function isUpdated(model) {
158
+ return 'updatedAt' in model;
159
+ }
160
+
161
+ class EntityUpdate {
162
+ constructor(entity, model, bindable = true) {
163
+ this.entity = entity;
164
+ this.model = model;
165
+ this.bindable = bindable;
166
+ }
167
+ }
168
+
169
+ class Entity {
170
+ constructor(uuid) {
171
+ this.uuid = uuid;
172
+ }
173
+ }
174
+
175
+ class PersistentUnit {
176
+ }
177
+
178
+ class Procedure {
179
+ }
180
+
181
+ class Repository {
182
+ }
183
+
184
+ export { Entity, EntityDataSource, EntityDatabase, EntityLink, EntityManager, EntitySync, EntityUpdate, PersistentUnit, Procedure, Repository, RolsterEntityManager };
185
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../esm/database.js","../esm/datasource.js","../esm/entity-link.js","../esm/entity-manager.js","../esm/entity-sync.js","../esm/entity-update.js","../esm/entity.js","../esm/persistent-unit.js","../esm/procedure.js","../esm/repository.js"],"sourcesContent":["export class EntityDatabase {\r\n}\r\n//# sourceMappingURL=database.js.map","export class EntityDataSource {\r\n}\r\n//# sourceMappingURL=datasource.js.map","export class EntityLink {\r\n constructor(entity, bindable = true) {\r\n this.entity = entity;\r\n this.bindable = bindable;\r\n }\r\n}\r\n//# sourceMappingURL=entity-link.js.map","import { Optional, fromPromise } from '@rolster/helpers-advanced';\r\nexport class EntityManager {\r\n}\r\nexport class RolsterEntityManager {\r\n constructor(source) {\r\n this.source = source;\r\n this.links = [];\r\n this.updates = [];\r\n this.syncs = [];\r\n this.destroys = [];\r\n this.hiddens = [];\r\n this.procedures = [];\r\n this.relations = new Map();\r\n }\r\n persist(link) {\r\n this.links.push(link);\r\n }\r\n update(update) {\r\n const { bindable, entity, model } = update;\r\n if (bindable) {\r\n this.relation(entity, model);\r\n }\r\n this.updates.push(update);\r\n }\r\n sync(sync) {\r\n const { bindable, entity, model } = sync;\r\n if (bindable) {\r\n this.relation(entity, model);\r\n }\r\n this.syncs.push(sync);\r\n }\r\n destroy(entity) {\r\n this.select(entity).present((model) => {\r\n isHidden(model) ? this.hiddens.push(model) : this.destroys.push(model);\r\n });\r\n }\r\n procedure(procedure) {\r\n this.procedures.push(procedure);\r\n }\r\n relation({ uuid }, model) {\r\n this.relations.set(uuid, model);\r\n }\r\n select({ uuid }) {\r\n return Optional.build(this.relations.has(uuid) ? this.relations.get(uuid) : undefined);\r\n }\r\n async flush() {\r\n await this.persistAll();\r\n await this.updateAll();\r\n await this.syncAll();\r\n await this.hiddenAll();\r\n await this.destroyAll();\r\n await this.procedureAll();\r\n this.dispose();\r\n }\r\n dispose() {\r\n this.relations.clear();\r\n this.links = [];\r\n this.updates = [];\r\n this.syncs = [];\r\n this.destroys = [];\r\n this.hiddens = [];\r\n this.procedures = [];\r\n }\r\n persistAll() {\r\n const { links, source } = this;\r\n return Promise.all(links.map((link) => fromPromise(link.createModel(this)).then((model) => {\r\n const { bindable, entity } = link;\r\n if (bindable) {\r\n this.relation(entity, model);\r\n }\r\n return source.insert(model);\r\n })));\r\n }\r\n updateAll() {\r\n const { source, updates } = this;\r\n return Promise.all(updates.map(({ model }) => source.update(model)));\r\n }\r\n syncAll() {\r\n const { destroys, source, syncs } = this;\r\n return Promise.all(syncs\r\n .filter(({ model }) => !destroys.includes(model))\r\n .reduce((syncs, sync) => {\r\n const dirty = sync.verify();\r\n if (dirty) {\r\n const { model } = sync;\r\n syncs.push({ model, dirty });\r\n }\r\n return syncs;\r\n }, [])\r\n .map(({ model, dirty }) => source.update(model, dirty)));\r\n }\r\n destroyAll() {\r\n const { destroys, source } = this;\r\n return Promise.all(destroys.map((destroy) => source.delete(destroy)));\r\n }\r\n hiddenAll() {\r\n const { hiddens, source } = this;\r\n return Promise.all(hiddens.map((hidden) => source.hidden(hidden)));\r\n }\r\n procedureAll() {\r\n const { procedures, source } = this;\r\n return Promise.all(procedures.map((procedure) => source.procedure(procedure)));\r\n }\r\n}\r\nfunction isHidden(model) {\r\n return 'hidden' in model && 'hiddenAt' in model;\r\n}\r\n//# sourceMappingURL=entity-manager.js.map","export class EntitySync {\r\n constructor(entity, model, bindable = true) {\r\n this.entity = entity;\r\n this.model = model;\r\n this.bindable = bindable;\r\n this.firstStatus = this.mapperModel(model);\r\n }\r\n verify() {\r\n this.sync();\r\n return this.createDirty();\r\n }\r\n mapperModel(model) {\r\n const dirty = {};\r\n Object.keys(model).forEach((key) => {\r\n dirty[key] = model[key];\r\n });\r\n return dirty;\r\n }\r\n createDirty() {\r\n const currentStatus = this.mapperModel(this.model);\r\n const modelDirty = {};\r\n let dirty = false;\r\n Object.keys(currentStatus).forEach((key) => {\r\n if (currentStatus[key] !== this.firstStatus[key]) {\r\n dirty = true;\r\n modelDirty[key] = currentStatus[key];\r\n }\r\n });\r\n if (isUpdated(this.model)) {\r\n modelDirty['updatedAt'] = new Date();\r\n }\r\n return dirty ? modelDirty : undefined;\r\n }\r\n}\r\nfunction isUpdated(model) {\r\n return 'updatedAt' in model;\r\n}\r\n//# sourceMappingURL=entity-sync.js.map","export class EntityUpdate {\r\n constructor(entity, model, bindable = true) {\r\n this.entity = entity;\r\n this.model = model;\r\n this.bindable = bindable;\r\n }\r\n}\r\n//# sourceMappingURL=entity-update.js.map","export class Entity {\r\n constructor(uuid) {\r\n this.uuid = uuid;\r\n }\r\n}\r\n//# sourceMappingURL=entity.js.map","export class PersistentUnit {\r\n}\r\n//# sourceMappingURL=persistent-unit.js.map","export class Procedure {\r\n}\r\n//# sourceMappingURL=procedure.js.map","export class Repository {\r\n}\r\n//# sourceMappingURL=repository.js.map"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare abstract class EntityDatabase {
2
+ abstract connect(): Promise<void>;
3
+ abstract disconnect(full?: boolean): Promise<void>;
4
+ abstract transaction(): Promise<void>;
5
+ abstract commit(): Promise<void>;
6
+ abstract rollback(): Promise<void>;
7
+ }
@@ -0,0 +1,3 @@
1
+ export class EntityDatabase {
2
+ }
3
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/database.ts"],"names":[],"mappings":"AAAA,MAAM,OAAgB,cAAc;CAUnC"}
@@ -0,0 +1,10 @@
1
+ import { ModelDirty } from './entity-sync';
2
+ import { Procedure } from './procedure';
3
+ import { BaseModel, ModelHidden } from './model';
4
+ export declare abstract class EntityDataSource {
5
+ abstract insert(model: BaseModel): Promise<void>;
6
+ abstract update(model: BaseModel, dirty?: ModelDirty): Promise<void>;
7
+ abstract delete(model: BaseModel): Promise<void>;
8
+ abstract hidden(model: ModelHidden): Promise<void>;
9
+ abstract procedure(procedure: Procedure): Promise<void>;
10
+ }
@@ -0,0 +1,3 @@
1
+ export class EntityDataSource {
2
+ }
3
+ //# sourceMappingURL=datasource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasource.js","sourceRoot":"","sources":["../../src/datasource.ts"],"names":[],"mappings":"AAIA,MAAM,OAAgB,gBAAgB;CAUrC"}
@@ -0,0 +1,9 @@
1
+ import { EntityManager } from './entity-manager';
2
+ import { Entity } from './entity';
3
+ import { BaseModel } from './model';
4
+ export declare abstract class EntityLink<E extends Entity, M extends BaseModel> {
5
+ readonly entity: E;
6
+ readonly bindable: boolean;
7
+ constructor(entity: E, bindable?: boolean);
8
+ abstract createModel(manager: EntityManager): M | Promise<M>;
9
+ }
@@ -0,0 +1,7 @@
1
+ export class EntityLink {
2
+ constructor(entity, bindable = true) {
3
+ this.entity = entity;
4
+ this.bindable = bindable;
5
+ }
6
+ }
7
+ //# sourceMappingURL=entity-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-link.js","sourceRoot":"","sources":["../../src/entity-link.ts"],"names":[],"mappings":"AAIA,MAAM,OAAgB,UAAU;IAC9B,YAA4B,MAAS,EAAkB,WAAW,IAAI;QAA1C,WAAM,GAAN,MAAM,CAAG;QAAkB,aAAQ,GAAR,QAAQ,CAAO;IAAG,CAAC;CAG3E"}
@@ -0,0 +1,49 @@
1
+ import { Optional } from '@rolster/helpers-advanced';
2
+ import { EntityDataSource } from './datasource';
3
+ import { EntityLink } from './entity-link';
4
+ import { EntitySync } from './entity-sync';
5
+ import { EntityUpdate } from './entity-update';
6
+ import { Entity } from './entity';
7
+ import { BaseModel } from './model';
8
+ import { Procedure } from './procedure';
9
+ type BaseEntityLink = EntityLink<Entity, BaseModel>;
10
+ type BaseEntityUpdate = EntityUpdate<Entity, BaseModel>;
11
+ type BaseEntitySync = EntitySync<Entity, BaseModel>;
12
+ export declare abstract class EntityManager {
13
+ abstract persist(link: BaseEntityLink): void;
14
+ abstract update(update: BaseEntityUpdate): void;
15
+ abstract sync(sync: BaseEntitySync): void;
16
+ abstract destroy(entity: Entity): void;
17
+ abstract procedure(procedure: Procedure): void;
18
+ abstract relation(entity: Entity, model: BaseModel): void;
19
+ abstract select<T extends BaseModel>(entity: Entity): Optional<T>;
20
+ abstract flush(): Promise<void>;
21
+ abstract dispose(): void;
22
+ }
23
+ export declare class RolsterEntityManager implements EntityManager {
24
+ private source;
25
+ private relations;
26
+ private links;
27
+ private updates;
28
+ private syncs;
29
+ private destroys;
30
+ private hiddens;
31
+ private procedures;
32
+ constructor(source: EntityDataSource);
33
+ persist(link: BaseEntityLink): void;
34
+ update(update: BaseEntityUpdate): void;
35
+ sync(sync: BaseEntitySync): void;
36
+ destroy(entity: Entity): void;
37
+ procedure(procedure: Procedure): void;
38
+ relation({ uuid }: Entity, model: BaseModel): void;
39
+ select<T extends BaseModel>({ uuid }: Entity): Optional<T>;
40
+ flush(): Promise<void>;
41
+ dispose(): void;
42
+ private persistAll;
43
+ private updateAll;
44
+ private syncAll;
45
+ private destroyAll;
46
+ private hiddenAll;
47
+ private procedureAll;
48
+ }
49
+ export {};
@@ -0,0 +1,108 @@
1
+ import { Optional, fromPromise } from '@rolster/helpers-advanced';
2
+ export class EntityManager {
3
+ }
4
+ export class RolsterEntityManager {
5
+ constructor(source) {
6
+ this.source = source;
7
+ this.links = [];
8
+ this.updates = [];
9
+ this.syncs = [];
10
+ this.destroys = [];
11
+ this.hiddens = [];
12
+ this.procedures = [];
13
+ this.relations = new Map();
14
+ }
15
+ persist(link) {
16
+ this.links.push(link);
17
+ }
18
+ update(update) {
19
+ const { bindable, entity, model } = update;
20
+ if (bindable) {
21
+ this.relation(entity, model);
22
+ }
23
+ this.updates.push(update);
24
+ }
25
+ sync(sync) {
26
+ const { bindable, entity, model } = sync;
27
+ if (bindable) {
28
+ this.relation(entity, model);
29
+ }
30
+ this.syncs.push(sync);
31
+ }
32
+ destroy(entity) {
33
+ this.select(entity).present((model) => {
34
+ isHidden(model) ? this.hiddens.push(model) : this.destroys.push(model);
35
+ });
36
+ }
37
+ procedure(procedure) {
38
+ this.procedures.push(procedure);
39
+ }
40
+ relation({ uuid }, model) {
41
+ this.relations.set(uuid, model);
42
+ }
43
+ select({ uuid }) {
44
+ return Optional.build(this.relations.has(uuid) ? this.relations.get(uuid) : undefined);
45
+ }
46
+ async flush() {
47
+ await this.persistAll();
48
+ await this.updateAll();
49
+ await this.syncAll();
50
+ await this.hiddenAll();
51
+ await this.destroyAll();
52
+ await this.procedureAll();
53
+ this.dispose();
54
+ }
55
+ dispose() {
56
+ this.relations.clear();
57
+ this.links = [];
58
+ this.updates = [];
59
+ this.syncs = [];
60
+ this.destroys = [];
61
+ this.hiddens = [];
62
+ this.procedures = [];
63
+ }
64
+ persistAll() {
65
+ const { links, source } = this;
66
+ return Promise.all(links.map((link) => fromPromise(link.createModel(this)).then((model) => {
67
+ const { bindable, entity } = link;
68
+ if (bindable) {
69
+ this.relation(entity, model);
70
+ }
71
+ return source.insert(model);
72
+ })));
73
+ }
74
+ updateAll() {
75
+ const { source, updates } = this;
76
+ return Promise.all(updates.map(({ model }) => source.update(model)));
77
+ }
78
+ syncAll() {
79
+ const { destroys, source, syncs } = this;
80
+ return Promise.all(syncs
81
+ .filter(({ model }) => !destroys.includes(model))
82
+ .reduce((syncs, sync) => {
83
+ const dirty = sync.verify();
84
+ if (dirty) {
85
+ const { model } = sync;
86
+ syncs.push({ model, dirty });
87
+ }
88
+ return syncs;
89
+ }, [])
90
+ .map(({ model, dirty }) => source.update(model, dirty)));
91
+ }
92
+ destroyAll() {
93
+ const { destroys, source } = this;
94
+ return Promise.all(destroys.map((destroy) => source.delete(destroy)));
95
+ }
96
+ hiddenAll() {
97
+ const { hiddens, source } = this;
98
+ return Promise.all(hiddens.map((hidden) => source.hidden(hidden)));
99
+ }
100
+ procedureAll() {
101
+ const { procedures, source } = this;
102
+ return Promise.all(procedures.map((procedure) => source.procedure(procedure)));
103
+ }
104
+ }
105
+ function isHidden(model) {
106
+ return 'hidden' in model && 'hiddenAt' in model;
107
+ }
108
+ //# sourceMappingURL=entity-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-manager.js","sourceRoot":"","sources":["../../src/entity-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAkBlE,MAAM,OAAgB,aAAa;CAkBlC;AAED,MAAM,OAAO,oBAAoB;IAe/B,YAAoB,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;QAZpC,UAAK,GAAqB,EAAE,CAAC;QAE7B,YAAO,GAAuB,EAAE,CAAC;QAEjC,UAAK,GAAqB,EAAE,CAAC;QAE7B,aAAQ,GAAgB,EAAE,CAAC;QAE3B,YAAO,GAAkB,EAAE,CAAC;QAE5B,eAAU,GAAgB,EAAE,CAAC;QAGnC,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAChD,CAAC;IAEM,OAAO,CAAC,IAAoB;QACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAEM,MAAM,CAAC,MAAwB;QACpC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QAE3C,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;SAC9B;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAEM,IAAI,CAAC,IAAoB;QAC9B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAEzC,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;SAC9B;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAEM,OAAO,CAAC,MAAc;QAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACpC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,SAAS,CAAC,SAAoB;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAEM,QAAQ,CAAC,EAAE,IAAI,EAAU,EAAE,KAAgB;QAChD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAEM,MAAM,CAAsB,EAAE,IAAI,EAAU;QACjD,OAAO,QAAQ,CAAC,KAAK,CACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAO,CAAC,CAAC,CAAC,SAAS,CACvE,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE1B,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAEvB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC;IAEO,UAAU;QAChB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAE/B,OAAO,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACjB,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACjD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YAElC,IAAI,QAAQ,EAAE;gBACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;aAC9B;YAED,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CACH,CACF,CAAC;IACJ,CAAC;IAEO,SAAS;QACf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEjC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAEO,OAAO;QACb,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAEzC,OAAO,OAAO,CAAC,GAAG,CAChB,KAAK;aACF,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aAChD,MAAM,CAAC,CAAC,KAAoB,EAAE,IAAI,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAE5B,IAAI,KAAK,EAAE;gBACT,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;gBAEvB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;aAC9B;YAED,OAAO,KAAK,CAAC;QACf,CAAC,EAAE,EAAE,CAAC;aACL,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAC1D,CAAC;IACJ,CAAC;IAEO,UAAU;QAChB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAElC,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,SAAS;QACf,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAEjC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IAEO,YAAY;QAClB,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAEpC,OAAO,OAAO,CAAC,GAAG,CAChB,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAC3D,CAAC;IACJ,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,KAAU;IAC1B,OAAO,QAAQ,IAAI,KAAK,IAAI,UAAU,IAAI,KAAK,CAAC;AAClD,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Entity } from './entity';
2
+ import { BaseModel } from './model';
3
+ export type ModelDirty = Record<string, any>;
4
+ export declare abstract class EntitySync<E extends Entity, M extends BaseModel> {
5
+ readonly entity: E;
6
+ readonly model: M;
7
+ readonly bindable: boolean;
8
+ private firstStatus;
9
+ constructor(entity: E, model: M, bindable?: boolean);
10
+ abstract sync(): void;
11
+ verify(): Undefined<ModelDirty>;
12
+ private mapperModel;
13
+ private createDirty;
14
+ }
@@ -0,0 +1,38 @@
1
+ export class EntitySync {
2
+ constructor(entity, model, bindable = true) {
3
+ this.entity = entity;
4
+ this.model = model;
5
+ this.bindable = bindable;
6
+ this.firstStatus = this.mapperModel(model);
7
+ }
8
+ verify() {
9
+ this.sync();
10
+ return this.createDirty();
11
+ }
12
+ mapperModel(model) {
13
+ const dirty = {};
14
+ Object.keys(model).forEach((key) => {
15
+ dirty[key] = model[key];
16
+ });
17
+ return dirty;
18
+ }
19
+ createDirty() {
20
+ const currentStatus = this.mapperModel(this.model);
21
+ const modelDirty = {};
22
+ let dirty = false;
23
+ Object.keys(currentStatus).forEach((key) => {
24
+ if (currentStatus[key] !== this.firstStatus[key]) {
25
+ dirty = true;
26
+ modelDirty[key] = currentStatus[key];
27
+ }
28
+ });
29
+ if (isUpdated(this.model)) {
30
+ modelDirty['updatedAt'] = new Date();
31
+ }
32
+ return dirty ? modelDirty : undefined;
33
+ }
34
+ }
35
+ function isUpdated(model) {
36
+ return 'updatedAt' in model;
37
+ }
38
+ //# sourceMappingURL=entity-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-sync.js","sourceRoot":"","sources":["../../src/entity-sync.ts"],"names":[],"mappings":"AAKA,MAAM,OAAgB,UAAU;IAG9B,YACkB,MAAS,EACT,KAAQ,EACR,WAAW,IAAI;QAFf,WAAM,GAAN,MAAM,CAAG;QACT,UAAK,GAAL,KAAK,CAAG;QACR,aAAQ,GAAR,QAAQ,CAAO;QAE/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAIM,MAAM;QACX,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAEO,WAAW,CAAC,KAAQ;QAC1B,MAAM,KAAK,GAAe,EAAE,CAAC;QAE7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACjC,KAAK,CAAC,GAAG,CAAC,GAAI,KAAa,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,WAAW;QACjB,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnD,MAAM,UAAU,GAAe,EAAE,CAAC;QAElC,IAAI,KAAK,GAAG,KAAK,CAAC;QAElB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACzC,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;gBAChD,KAAK,GAAG,IAAI,CAAC;gBACb,UAAU,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;aACtC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACzB,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;SACtC;QAED,OAAO,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACxC,CAAC;CACF;AAED,SAAS,SAAS,CAAC,KAAU;IAC3B,OAAO,WAAW,IAAI,KAAK,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Entity } from './entity';
2
+ import { BaseModel } from './model';
3
+ export declare abstract class EntityUpdate<E extends Entity, M extends BaseModel> {
4
+ readonly entity: E;
5
+ readonly model: M;
6
+ readonly bindable: boolean;
7
+ constructor(entity: E, model: M, bindable?: boolean);
8
+ abstract update(): void;
9
+ }
@@ -0,0 +1,8 @@
1
+ export class EntityUpdate {
2
+ constructor(entity, model, bindable = true) {
3
+ this.entity = entity;
4
+ this.model = model;
5
+ this.bindable = bindable;
6
+ }
7
+ }
8
+ //# sourceMappingURL=entity-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-update.js","sourceRoot":"","sources":["../../src/entity-update.ts"],"names":[],"mappings":"AAGA,MAAM,OAAgB,YAAY;IAChC,YACkB,MAAS,EACT,KAAQ,EACR,WAAW,IAAI;QAFf,WAAM,GAAN,MAAM,CAAG;QACT,UAAK,GAAL,KAAK,CAAG;QACR,aAAQ,GAAR,QAAQ,CAAO;IAC9B,CAAC;CAGL"}
@@ -0,0 +1,4 @@
1
+ export declare class Entity {
2
+ readonly uuid: string;
3
+ constructor(uuid: string);
4
+ }
@@ -0,0 +1,6 @@
1
+ export class Entity {
2
+ constructor(uuid) {
3
+ this.uuid = uuid;
4
+ }
5
+ }
6
+ //# sourceMappingURL=entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/entity.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,MAAM;IACjB,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;CAC7C"}
@@ -0,0 +1,11 @@
1
+ export * from './database';
2
+ export * from './datasource';
3
+ export * from './entity-link';
4
+ export * from './entity-manager';
5
+ export * from './entity-sync';
6
+ export * from './entity-update';
7
+ export * from './entity';
8
+ export * from './model';
9
+ export * from './persistent-unit';
10
+ export * from './procedure';
11
+ export * from './repository';
@@ -0,0 +1,12 @@
1
+ export * from './database';
2
+ export * from './datasource';
3
+ export * from './entity-link';
4
+ export * from './entity-manager';
5
+ export * from './entity-sync';
6
+ export * from './entity-update';
7
+ export * from './entity';
8
+ export * from './model';
9
+ export * from './persistent-unit';
10
+ export * from './procedure';
11
+ export * from './repository';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface BaseModel {
2
+ id: number;
3
+ }
4
+ export interface ModelUpdated extends BaseModel {
5
+ updatedAt?: Date;
6
+ }
7
+ export interface ModelHidden extends BaseModel {
8
+ hidden: boolean;
9
+ hiddenAt?: Date;
10
+ }
11
+ export interface Model extends ModelHidden {
12
+ updatedAt?: Date;
13
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export declare abstract class PersistentUnit {
2
+ abstract flush(): Promise<void>;
3
+ }
@@ -0,0 +1,3 @@
1
+ export class PersistentUnit {
2
+ }
3
+ //# sourceMappingURL=persistent-unit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent-unit.js","sourceRoot":"","sources":["../../src/persistent-unit.ts"],"names":[],"mappings":"AAAA,MAAM,OAAgB,cAAc;CAEnC"}
@@ -0,0 +1,3 @@
1
+ export declare abstract class Procedure {
2
+ abstract execute(...args: any): Promise<void>;
3
+ }
@@ -0,0 +1,3 @@
1
+ export class Procedure {
2
+ }
3
+ //# sourceMappingURL=procedure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procedure.js","sourceRoot":"","sources":["../../src/procedure.ts"],"names":[],"mappings":"AAAA,MAAM,OAAgB,SAAS;CAE9B"}
@@ -0,0 +1,8 @@
1
+ import { Optional } from '@rolster/helpers-advanced';
2
+ import { Entity } from './entity';
3
+ export declare abstract class Repository<T extends Entity> {
4
+ abstract persist(entity: T): Promise<void>;
5
+ abstract findByUuid(uuid: string): Promise<Optional<T>>;
6
+ abstract findAll(): Promise<T[]>;
7
+ abstract destroy(entity: T): Promise<void>;
8
+ }
@@ -0,0 +1,3 @@
1
+ export class Repository {
2
+ }
3
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"AAGA,MAAM,OAAgB,UAAU;CAQ/B"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@rolster/vinegar",
3
+ "version": "1.0.0",
4
+ "description": "Container package of basic classes to implement a clean architecture.",
5
+ "module": "dist/esm/index.js",
6
+ "main": "dist/cjs/index.js",
7
+ "unpkg": "dist/es/index.js",
8
+ "types": "dist/esm/index.d.ts",
9
+ "license": "MIT",
10
+ "author": "Rolster Technology <rolster.developments@gmail.com>",
11
+ "contributors": [
12
+ {
13
+ "name": "Daniel Andrés Castillo Pedroza",
14
+ "email": "ing.dacastillop@gmail.com"
15
+ }
16
+ ],
17
+ "files": [
18
+ "dist/"
19
+ ],
20
+ "scripts": {
21
+ "prettier": "prettier . --write",
22
+ "clean": "rimraf ./dist",
23
+ "build": "npm run clean && tsc -p tsconfig.json && rollup -c rollup.config.js",
24
+ "test": "jest --coverage",
25
+ "test:watch": "jest --coverage --watch",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "dependencies": {
29
+ "@rolster/helpers-advanced": "^1.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@rollup/plugin-commonjs": "^25.0.4",
33
+ "@rollup/plugin-node-resolve": "^15.2.1",
34
+ "@rollup/plugin-typescript": "^11.1.3",
35
+ "@rolster/types": "^1.0.0",
36
+ "@types/jest": "^29.5.1",
37
+ "jest": "^29.5.0",
38
+ "prettier": "^3.0.3",
39
+ "rimraf": "^3.0.2",
40
+ "rollup": "^2.32.0",
41
+ "ts-jest": "^29.1.0",
42
+ "tslib": "^2.4.0",
43
+ "typescript": "^4.9.3"
44
+ },
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "https://github.com/rolster-developments/typescript-vinegar.git"
48
+ },
49
+ "keywords": [
50
+ "rolster",
51
+ "typescript",
52
+ "vinegar",
53
+ "hexagonal",
54
+ "clean-architecture"
55
+ ]
56
+ }
package/readme.md ADDED
@@ -0,0 +1,23 @@
1
+ # Rolster Vinegar
2
+
3
+ Container package of basic classes to implement a clean architecture.
4
+
5
+ ## Installation
6
+
7
+ ```
8
+ npm i @rolster/vinegar
9
+ ```
10
+
11
+ ## Configuration
12
+
13
+ You must install the `@rolster/types` to define package data types, which are configured by adding them to the `files` property of the `tsconfig.json` file.
14
+
15
+ ```json
16
+ {
17
+ "files": ["node_modules/@rolster/types/index.d.ts"]
18
+ }
19
+ ```
20
+
21
+ ## Contributing
22
+
23
+ - Daniel Andrés Castillo Pedroza :rocket: