oak-domain 2.4.0 → 2.4.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.
Files changed (160) hide show
  1. package/lib/actions/action.d.ts +16 -16
  2. package/lib/actions/action.js +17 -17
  3. package/lib/actions/relation.d.ts +5 -5
  4. package/lib/actions/relation.js +38 -38
  5. package/lib/base-app-domain/ActionDefDict.d.ts +5 -5
  6. package/lib/base-app-domain/ActionDefDict.js +7 -7
  7. package/lib/base-app-domain/EntityDict.d.ts +12 -12
  8. package/lib/base-app-domain/EntityDict.js +2 -2
  9. package/lib/base-app-domain/Modi/Action.d.ts +10 -10
  10. package/lib/base-app-domain/Modi/Action.js +14 -14
  11. package/lib/base-app-domain/Modi/Schema.d.ts +146 -146
  12. package/lib/base-app-domain/Modi/Schema.js +2 -2
  13. package/lib/base-app-domain/Modi/Storage.d.ts +3 -3
  14. package/lib/base-app-domain/Modi/Storage.js +60 -60
  15. package/lib/base-app-domain/ModiEntity/Schema.d.ts +162 -162
  16. package/lib/base-app-domain/ModiEntity/Schema.js +2 -2
  17. package/lib/base-app-domain/ModiEntity/Storage.d.ts +3 -3
  18. package/lib/base-app-domain/ModiEntity/Storage.js +26 -26
  19. package/lib/base-app-domain/Oper/Schema.d.ts +144 -144
  20. package/lib/base-app-domain/Oper/Schema.js +2 -2
  21. package/lib/base-app-domain/Oper/Storage.d.ts +3 -3
  22. package/lib/base-app-domain/Oper/Storage.js +29 -29
  23. package/lib/base-app-domain/OperEntity/Schema.d.ts +178 -178
  24. package/lib/base-app-domain/OperEntity/Schema.js +2 -2
  25. package/lib/base-app-domain/OperEntity/Storage.d.ts +3 -3
  26. package/lib/base-app-domain/OperEntity/Storage.js +26 -26
  27. package/lib/base-app-domain/Storage.d.ts +3 -3
  28. package/lib/base-app-domain/Storage.js +15 -15
  29. package/lib/base-app-domain/User/Schema.d.ts +128 -128
  30. package/lib/base-app-domain/User/Schema.js +2 -2
  31. package/lib/base-app-domain/User/Storage.d.ts +3 -3
  32. package/lib/base-app-domain/User/Storage.js +25 -25
  33. package/lib/base-app-domain/_SubQuery.d.ts +36 -36
  34. package/lib/base-app-domain/_SubQuery.js +2 -2
  35. package/lib/base-app-domain/index.d.ts +3 -3
  36. package/lib/base-app-domain/index.js +6 -6
  37. package/lib/checkers/index.d.ts +5 -5
  38. package/lib/checkers/index.js +15 -15
  39. package/lib/compiler/env.d.ts +11 -11
  40. package/lib/compiler/env.js +39 -39
  41. package/lib/compiler/schemalBuilder.d.ts +2 -2
  42. package/lib/compiler/schemalBuilder.js +3303 -3301
  43. package/lib/compiler/uiBuilder.d.ts +1 -1
  44. package/lib/compiler/uiBuilder.js +3 -3
  45. package/lib/entities/Modi.d.ts +11 -11
  46. package/lib/entities/Modi.js +46 -46
  47. package/lib/entities/ModiEntity.d.ts +8 -8
  48. package/lib/entities/ModiEntity.js +15 -15
  49. package/lib/entities/Oper.d.ts +10 -10
  50. package/lib/entities/Oper.js +17 -17
  51. package/lib/entities/OperEntity.d.ts +8 -8
  52. package/lib/entities/OperEntity.js +15 -15
  53. package/lib/entities/User.d.ts +7 -7
  54. package/lib/entities/User.js +12 -12
  55. package/lib/store/AsyncRowStore.d.ts +48 -48
  56. package/lib/store/AsyncRowStore.js +183 -183
  57. package/lib/store/CascadeStore.d.ts +91 -91
  58. package/lib/store/CascadeStore.js +1590 -1594
  59. package/lib/store/SyncRowStore.d.ts +29 -29
  60. package/lib/store/SyncRowStore.js +48 -48
  61. package/lib/store/TriggerExecutor.d.ts +32 -32
  62. package/lib/store/TriggerExecutor.js +527 -527
  63. package/lib/store/actionDef.d.ts +9 -9
  64. package/lib/store/actionDef.js +333 -135
  65. package/lib/store/checker.d.ts +13 -13
  66. package/lib/store/checker.js +498 -498
  67. package/lib/store/filter.d.ts +109 -109
  68. package/lib/store/filter.js +893 -893
  69. package/lib/store/modi.d.ts +13 -13
  70. package/lib/store/modi.js +198 -198
  71. package/lib/store/relation.d.ts +13 -13
  72. package/lib/store/relation.js +66 -66
  73. package/lib/store/selection.d.ts +7 -7
  74. package/lib/store/selection.js +235 -235
  75. package/lib/triggers/index.d.ts +6 -6
  76. package/lib/triggers/index.js +11 -11
  77. package/lib/triggers/modi.d.ts +5 -5
  78. package/lib/triggers/modi.js +72 -72
  79. package/lib/types/Action.d.ts +18 -18
  80. package/lib/types/Action.js +2 -2
  81. package/lib/types/AppLoader.d.ts +11 -11
  82. package/lib/types/AppLoader.js +10 -10
  83. package/lib/types/Aspect.d.ts +12 -12
  84. package/lib/types/Aspect.js +4 -4
  85. package/lib/types/Auth.d.ts +66 -66
  86. package/lib/types/Auth.js +2 -2
  87. package/lib/types/Connector.d.ts +26 -26
  88. package/lib/types/Connector.js +9 -9
  89. package/lib/types/Context.d.ts +7 -7
  90. package/lib/types/Context.js +3 -3
  91. package/lib/types/DataType.d.ts +18 -18
  92. package/lib/types/DataType.js +5 -5
  93. package/lib/types/Demand.d.ts +77 -77
  94. package/lib/types/Demand.js +9 -9
  95. package/lib/types/Endpoint.d.ts +11 -10
  96. package/lib/types/Endpoint.js +3 -3
  97. package/lib/types/Entity.d.ts +183 -176
  98. package/lib/types/Entity.js +14 -14
  99. package/lib/types/Exception.d.ts +98 -88
  100. package/lib/types/Exception.js +283 -267
  101. package/lib/types/Expression.d.ts +163 -163
  102. package/lib/types/Expression.js +427 -427
  103. package/lib/types/Geo.d.ts +18 -18
  104. package/lib/types/Geo.js +2 -2
  105. package/lib/types/Locale.d.ts +24 -24
  106. package/lib/types/Locale.js +2 -2
  107. package/lib/types/Logger.d.ts +5 -5
  108. package/lib/types/Logger.js +3 -3
  109. package/lib/types/Polyfill.d.ts +23 -23
  110. package/lib/types/Polyfill.js +2 -2
  111. package/lib/types/Port.d.ts +17 -17
  112. package/lib/types/Port.js +2 -2
  113. package/lib/types/RowStore.d.ts +12 -12
  114. package/lib/types/RowStore.js +34 -34
  115. package/lib/types/Storage.d.ts +56 -56
  116. package/lib/types/Storage.js +2 -2
  117. package/lib/types/Timer.d.ts +13 -13
  118. package/lib/types/Timer.js +2 -2
  119. package/lib/types/Trigger.d.ts +100 -100
  120. package/lib/types/Trigger.js +39 -39
  121. package/lib/types/Txn.d.ts +2 -2
  122. package/lib/types/Txn.js +3 -3
  123. package/lib/types/Watcher.d.ts +19 -19
  124. package/lib/types/Watcher.js +4 -4
  125. package/lib/types/index.d.ts +21 -21
  126. package/lib/types/index.js +24 -24
  127. package/lib/types/schema/DataTypes.d.ts +32 -32
  128. package/lib/types/schema/DataTypes.js +3 -3
  129. package/lib/utils/SimpleConnector.d.ts +30 -30
  130. package/lib/utils/SimpleConnector.js +117 -117
  131. package/lib/utils/assert.d.ts +5 -5
  132. package/lib/utils/assert.js +9 -9
  133. package/lib/utils/concurrent.d.ts +15 -15
  134. package/lib/utils/concurrent.js +89 -89
  135. package/lib/utils/cron.d.ts +1 -1
  136. package/lib/utils/cron.js +18 -18
  137. package/lib/utils/date.d.ts +1 -1
  138. package/lib/utils/date.js +18 -18
  139. package/lib/utils/geo.d.ts +4 -4
  140. package/lib/utils/geo.js +24 -24
  141. package/lib/utils/lodash.d.ts +20 -20
  142. package/lib/utils/lodash.js +55 -55
  143. package/lib/utils/random/random.d.ts +1 -1
  144. package/lib/utils/random/random.js +24 -24
  145. package/lib/utils/random/random.mp.d.ts +1 -1
  146. package/lib/utils/random/random.mp.js +25 -25
  147. package/lib/utils/random/random.web.d.ts +1 -1
  148. package/lib/utils/random/random.web.js +17 -17
  149. package/lib/utils/string.d.ts +22 -22
  150. package/lib/utils/string.js +70 -70
  151. package/lib/utils/uuid.d.ts +12 -12
  152. package/lib/utils/uuid.js +194 -194
  153. package/lib/utils/validator.d.ts +23 -23
  154. package/lib/utils/validator.js +123 -123
  155. package/package.json +48 -48
  156. package/src/entities/Modi.ts +68 -68
  157. package/src/entities/ModiEntity.ts +24 -24
  158. package/src/entities/Oper.ts +28 -28
  159. package/src/entities/OperEntity.ts +24 -24
  160. package/src/entities/User.ts +19 -19
@@ -1,9 +1,9 @@
1
- import { ActionDictOfEntityDict, BBWatcher, Checker, EntityDict, StorageSchema, Trigger } from "../types";
2
- import { SyncContext } from "./SyncRowStore";
3
- import { AsyncContext } from "./AsyncRowStore";
4
- export declare function getFullProjection<ED extends EntityDict, T extends keyof ED>(entity: T, schema: StorageSchema<ED>): ED[T]["Selection"]["data"];
5
- export declare function analyzeActionDefDict<ED extends EntityDict, Cxt extends SyncContext<ED> | AsyncContext<ED>>(schema: StorageSchema<ED>, actionDefDict: ActionDictOfEntityDict<ED>): {
6
- triggers: Trigger<ED, keyof ED, Cxt>[];
7
- checkers: Checker<ED, keyof ED, Cxt>[];
8
- watchers: BBWatcher<ED, keyof ED>[];
9
- };
1
+ import { ActionDictOfEntityDict, BBWatcher, Checker, EntityDict, StorageSchema, Trigger } from "../types";
2
+ import { SyncContext } from "./SyncRowStore";
3
+ import { AsyncContext } from "./AsyncRowStore";
4
+ export declare function getFullProjection<ED extends EntityDict, T extends keyof ED>(entity: T, schema: StorageSchema<ED>): ED[T]["Selection"]["data"];
5
+ export declare function analyzeActionDefDict<ED extends EntityDict, Cxt extends SyncContext<ED> | AsyncContext<ED>>(schema: StorageSchema<ED>, actionDefDict: ActionDictOfEntityDict<ED>): {
6
+ triggers: Trigger<ED, keyof ED, Cxt>[];
7
+ checkers: Checker<ED, keyof ED, Cxt>[];
8
+ watchers: BBWatcher<ED, keyof ED>[];
9
+ };
@@ -1,135 +1,333 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.analyzeActionDefDict = exports.getFullProjection = void 0;
4
- var tslib_1 = require("tslib");
5
- function getFullProjection(entity, schema) {
6
- var attributes = schema[entity].attributes;
7
- var projection = {
8
- id: 1,
9
- $$createAt$$: 1,
10
- $$updateAt$$: 1,
11
- $$deleteAt$$: 1,
12
- };
13
- Object.keys(attributes).forEach(function (k) {
14
- var _a;
15
- return Object.assign(projection, (_a = {},
16
- _a[k] = 1,
17
- _a));
18
- });
19
- return projection;
20
- }
21
- exports.getFullProjection = getFullProjection;
22
- function makeIntrinsicWatchers(schema) {
23
- var _this = this;
24
- var watchers = [];
25
- var _loop_1 = function (entity) {
26
- var attributes = schema[entity].attributes;
27
- var now = Date.now();
28
- var expiresAt = attributes.expiresAt, expired = attributes.expired;
29
- if (expiresAt && expiresAt.type === 'datetime' && expired && expired.type === 'boolean') {
30
- // 如果有定义expiresAtexpired,则自动生成一个检查的watcher
31
- watchers.push({
32
- entity: entity,
33
- name: "\u5BF9\u8C61".concat(entity, "\u4E0A\u7684\u8FC7\u671F\u81EA\u52A8watcher"),
34
- filter: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
35
- return tslib_1.__generator(this, function (_a) {
36
- return [2 /*return*/, {
37
- expired: false,
38
- expiresAt: {
39
- $lte: now,
40
- },
41
- }];
42
- });
43
- }); },
44
- action: 'update',
45
- actionData: {
46
- expired: true,
47
- },
48
- });
49
- }
50
- };
51
- for (var entity in schema) {
52
- _loop_1(entity);
53
- }
54
- return watchers;
55
- }
56
- function analyzeActionDefDict(schema, actionDefDict) {
57
- var checkers = [];
58
- var triggers = [];
59
- for (var entity in actionDefDict) {
60
- var _loop_2 = function (attr) {
61
- var def = actionDefDict[entity][attr];
62
- var _a = def, stm = _a.stm, is = _a.is;
63
- var _loop_3 = function (action) {
64
- var _b, _c;
65
- var actionStm = stm[action];
66
- var conditionalFilter = typeof actionStm[0] === 'string' ? (_b = {},
67
- _b[attr] = actionStm[0],
68
- _b) : (_c = {},
69
- _c[attr] = {
70
- $in: actionStm[0],
71
- },
72
- _c);
73
- checkers.push({
74
- action: action,
75
- type: 'row',
76
- entity: entity,
77
- filter: conditionalFilter,
78
- errMsg: '',
79
- });
80
- checkers.push({
81
- action: action,
82
- type: 'data',
83
- entity: entity,
84
- priority: 10,
85
- checker: function (data) {
86
- var _a;
87
- Object.assign(data, (_a = {},
88
- _a[attr] = stm[action][1],
89
- _a));
90
- }
91
- });
92
- };
93
- for (var action in stm) {
94
- _loop_3(action);
95
- }
96
- if (is) {
97
- checkers.push({
98
- action: 'create',
99
- type: 'data',
100
- entity: entity,
101
- priority: 10,
102
- checker: function (data) {
103
- var _a;
104
- if (data instanceof Array) {
105
- data.forEach(function (ele) {
106
- var _a;
107
- if (!ele[attr]) {
108
- Object.assign(ele, (_a = {},
109
- _a[attr] = is,
110
- _a));
111
- }
112
- });
113
- }
114
- else {
115
- if (!data[attr]) {
116
- Object.assign(data, (_a = {},
117
- _a[attr] = is,
118
- _a));
119
- }
120
- }
121
- }
122
- });
123
- }
124
- };
125
- for (var attr in actionDefDict[entity]) {
126
- _loop_2(attr);
127
- }
128
- }
129
- return {
130
- triggers: triggers,
131
- checkers: checkers,
132
- watchers: makeIntrinsicWatchers(schema),
133
- };
134
- }
135
- exports.analyzeActionDefDict = analyzeActionDefDict;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeActionDefDict = exports.getFullProjection = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var types_1 = require("../types");
6
+ var lodash_1 = require("../utils/lodash");
7
+ var filter_1 = require("./filter");
8
+ function getFullProjection(entity, schema) {
9
+ var attributes = schema[entity].attributes;
10
+ var projection = {
11
+ id: 1,
12
+ $$createAt$$: 1,
13
+ $$updateAt$$: 1,
14
+ $$deleteAt$$: 1,
15
+ };
16
+ Object.keys(attributes).forEach(function (k) {
17
+ var _a;
18
+ return Object.assign(projection, (_a = {},
19
+ _a[k] = 1,
20
+ _a));
21
+ });
22
+ return projection;
23
+ }
24
+ exports.getFullProjection = getFullProjection;
25
+ function makeIntrinsicWatchers(schema) {
26
+ var watchers = [];
27
+ for (var entity in schema) {
28
+ var attributes = schema[entity].attributes;
29
+ var expiresAt = attributes.expiresAt, expired = attributes.expired;
30
+ if (expiresAt && expiresAt.type === 'datetime' && expired && expired.type === 'boolean') {
31
+ // 如果有定义expiresAt和expired,则自动生成一个检查的watcher
32
+ watchers.push({
33
+ entity: entity,
34
+ name: "\u5BF9\u8C61".concat(entity, "\u4E0A\u7684\u8FC7\u671F\u81EA\u52A8watcher"),
35
+ filter: function () {
36
+ return {
37
+ expired: false,
38
+ expiresAt: {
39
+ $lte: Date.now(),
40
+ },
41
+ };
42
+ },
43
+ action: 'update',
44
+ actionData: {
45
+ expired: true,
46
+ },
47
+ });
48
+ }
49
+ }
50
+ return watchers;
51
+ }
52
+ function checkUniqueBetweenRows(rows, uniqAttrs) {
53
+ // 先检查这些行本身之间有无unique冲突
54
+ var uniqRows = (0, lodash_1.uniqBy)(rows, function (d) {
55
+ var e_1, _a;
56
+ var s = '';
57
+ try {
58
+ for (var uniqAttrs_1 = tslib_1.__values(uniqAttrs), uniqAttrs_1_1 = uniqAttrs_1.next(); !uniqAttrs_1_1.done; uniqAttrs_1_1 = uniqAttrs_1.next()) {
59
+ var a = uniqAttrs_1_1.value;
60
+ if (d[a] === null || d[a] === undefined) {
61
+ s + d.id;
62
+ }
63
+ else {
64
+ s + "-".concat(d[a]);
65
+ }
66
+ }
67
+ }
68
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
69
+ finally {
70
+ try {
71
+ if (uniqAttrs_1_1 && !uniqAttrs_1_1.done && (_a = uniqAttrs_1.return)) _a.call(uniqAttrs_1);
72
+ }
73
+ finally { if (e_1) throw e_1.error; }
74
+ }
75
+ return s;
76
+ });
77
+ if (uniqRows.length < rows.length) {
78
+ throw new types_1.OakUniqueViolationException([{
79
+ attrs: uniqAttrs,
80
+ }]);
81
+ }
82
+ }
83
+ function checkCountLessThan(count, uniqAttrs, than, id) {
84
+ if (than === void 0) { than = 0; }
85
+ if (count instanceof Promise) {
86
+ return count.then(function (count2) {
87
+ if (count2 > than) {
88
+ throw new types_1.OakUniqueViolationException([{
89
+ id: id,
90
+ attrs: uniqAttrs,
91
+ }]);
92
+ }
93
+ });
94
+ }
95
+ if (count > than) {
96
+ throw new types_1.OakUniqueViolationException([{
97
+ id: id,
98
+ attrs: uniqAttrs,
99
+ }]);
100
+ }
101
+ }
102
+ function checkUnique(entity, row, context, uniqAttrs, extraFilter) {
103
+ var filter = (0, lodash_1.pick)(row, uniqAttrs);
104
+ for (var a in filter) {
105
+ if (filter[a] === null || filter[a] === undefined) {
106
+ delete filter[a];
107
+ }
108
+ }
109
+ if (Object.keys(filter).length < uniqAttrs.length) {
110
+ // 说明有null值,不需要检查约束
111
+ return;
112
+ }
113
+ var filter2 = extraFilter ? (0, filter_1.addFilterSegment)([filter, extraFilter]) : filter;
114
+ var count = context.count(entity, { filter: filter2 }, { dontCollect: true });
115
+ return checkCountLessThan(count, uniqAttrs, 0, row.id);
116
+ }
117
+ function analyzeActionDefDict(schema, actionDefDict) {
118
+ var _a;
119
+ var checkers = [];
120
+ var triggers = [];
121
+ // action状态转换矩阵相应的checker
122
+ for (var entity in actionDefDict) {
123
+ var _loop_1 = function (attr) {
124
+ var def = actionDefDict[entity][attr];
125
+ var _b = def, stm = _b.stm, is = _b.is;
126
+ var _loop_3 = function (action) {
127
+ var _c, _d;
128
+ var actionStm = stm[action];
129
+ var conditionalFilter = typeof actionStm[0] === 'string' ? (_c = {},
130
+ _c[attr] = actionStm[0],
131
+ _c) : (_d = {},
132
+ _d[attr] = {
133
+ $in: actionStm[0],
134
+ },
135
+ _d);
136
+ checkers.push({
137
+ action: action,
138
+ type: 'row',
139
+ entity: entity,
140
+ filter: conditionalFilter,
141
+ errMsg: '',
142
+ });
143
+ checkers.push({
144
+ action: action,
145
+ type: 'data',
146
+ entity: entity,
147
+ priority: 10,
148
+ checker: function (data) {
149
+ var _a;
150
+ Object.assign(data, (_a = {},
151
+ _a[attr] = stm[action][1],
152
+ _a));
153
+ }
154
+ });
155
+ };
156
+ for (var action in stm) {
157
+ _loop_3(action);
158
+ }
159
+ if (is) {
160
+ checkers.push({
161
+ action: 'create',
162
+ type: 'data',
163
+ entity: entity,
164
+ priority: 10,
165
+ checker: function (data) {
166
+ var _a;
167
+ if (data instanceof Array) {
168
+ data.forEach(function (ele) {
169
+ var _a;
170
+ if (!ele[attr]) {
171
+ Object.assign(ele, (_a = {},
172
+ _a[attr] = is,
173
+ _a));
174
+ }
175
+ });
176
+ }
177
+ else {
178
+ if (!data[attr]) {
179
+ Object.assign(data, (_a = {},
180
+ _a[attr] = is,
181
+ _a));
182
+ }
183
+ }
184
+ }
185
+ });
186
+ }
187
+ };
188
+ for (var attr in actionDefDict[entity]) {
189
+ _loop_1(attr);
190
+ }
191
+ }
192
+ var _loop_2 = function (entity) {
193
+ var e_2, _e;
194
+ var indexes = schema[entity].indexes;
195
+ if (indexes) {
196
+ var _loop_4 = function (index) {
197
+ if ((_a = index.config) === null || _a === void 0 ? void 0 : _a.unique) {
198
+ var attributes = index.attributes;
199
+ var uniqAttrs_2 = attributes.map(function (ele) { return ele.name; });
200
+ checkers.push({
201
+ entity: entity,
202
+ action: 'create',
203
+ type: 'logical',
204
+ priority: 20,
205
+ checker: function (operation, context) {
206
+ var data = operation.data;
207
+ if (data instanceof Array) {
208
+ checkUniqueBetweenRows(data, uniqAttrs_2);
209
+ var checkResult = data.map(function (ele) { return checkUnique(entity, ele, context, uniqAttrs_2); });
210
+ if (checkResult[0] instanceof Promise) {
211
+ return Promise.all(checkResult).then(function () { return undefined; });
212
+ }
213
+ }
214
+ else {
215
+ return checkUnique(entity, data, context, uniqAttrs_2);
216
+ }
217
+ }
218
+ }, {
219
+ entity: entity,
220
+ action: 'update',
221
+ type: 'logical',
222
+ priority: 20,
223
+ checker: function (operation, context) {
224
+ var e_3, _a, e_4, _b, _c;
225
+ var _d = operation, data = _d.data, operationFilter = _d.filter;
226
+ var attrs = Object.keys(data);
227
+ var refAttrs = (0, lodash_1.intersection)(attrs, uniqAttrs_2);
228
+ if (refAttrs.length === 0) {
229
+ // 如果本次更新和unique约束的属性之间没有交集则直接返回
230
+ return;
231
+ }
232
+ try {
233
+ for (var refAttrs_1 = (e_3 = void 0, tslib_1.__values(refAttrs)), refAttrs_1_1 = refAttrs_1.next(); !refAttrs_1_1.done; refAttrs_1_1 = refAttrs_1.next()) {
234
+ var attr = refAttrs_1_1.value;
235
+ // 如果有更新为null值,不用再检查约束
236
+ if (data[attr] === null || data[attr] === undefined) {
237
+ return;
238
+ }
239
+ }
240
+ }
241
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
242
+ finally {
243
+ try {
244
+ if (refAttrs_1_1 && !refAttrs_1_1.done && (_a = refAttrs_1.return)) _a.call(refAttrs_1);
245
+ }
246
+ finally { if (e_3) throw e_3.error; }
247
+ }
248
+ if (refAttrs.length === uniqAttrs_2.length) {
249
+ // 如果更新了全部属性,直接检查
250
+ var filter = (0, lodash_1.pick)(data, refAttrs);
251
+ // 在这些行以外的行不和更新后的键值冲突
252
+ var count = context.count(entity, {
253
+ filter: (0, filter_1.addFilterSegment)([filter, {
254
+ $not: operationFilter,
255
+ }]),
256
+ }, { dontCollect: true });
257
+ var checkCount = checkCountLessThan(count, uniqAttrs_2);
258
+ // 更新的行只能有一行
259
+ var rowCount = context.count(entity, {
260
+ filter: operationFilter,
261
+ }, { dontCollect: true });
262
+ var checkRowCount = checkCountLessThan(rowCount, uniqAttrs_2, 1);
263
+ // 如果更新的行数为零似乎也可以,但这应该不可能出现吧,by Xc 20230131
264
+ if (checkRowCount instanceof Promise) {
265
+ return Promise.all([checkCount, checkRowCount]).then(function () { return undefined; });
266
+ }
267
+ }
268
+ // 否则需要结合本行现有的属性来进行检查
269
+ var projection = { id: 1 };
270
+ try {
271
+ for (var uniqAttrs_3 = (e_4 = void 0, tslib_1.__values(uniqAttrs_2)), uniqAttrs_3_1 = uniqAttrs_3.next(); !uniqAttrs_3_1.done; uniqAttrs_3_1 = uniqAttrs_3.next()) {
272
+ var attr = uniqAttrs_3_1.value;
273
+ Object.assign(projection, (_c = {},
274
+ _c[attr] = 1,
275
+ _c));
276
+ }
277
+ }
278
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
279
+ finally {
280
+ try {
281
+ if (uniqAttrs_3_1 && !uniqAttrs_3_1.done && (_b = uniqAttrs_3.return)) _b.call(uniqAttrs_3);
282
+ }
283
+ finally { if (e_4) throw e_4.error; }
284
+ }
285
+ var checkWithRows = function (rows2) {
286
+ var rows22 = rows2.map(function (ele) { return Object.assign(ele, data); });
287
+ // 先检查这些行本身之间是否冲突
288
+ checkUniqueBetweenRows(rows22, uniqAttrs_2);
289
+ var checkResults = rows22.map(function (row) { return checkUnique(entity, row, context, uniqAttrs_2, {
290
+ $not: operationFilter
291
+ }); });
292
+ if (checkResults[0] instanceof Promise) {
293
+ return Promise.all(checkResults).then(function () { return undefined; });
294
+ }
295
+ };
296
+ var currentRows = context.select(entity, {
297
+ data: projection,
298
+ filter: operationFilter,
299
+ }, { dontCollect: true });
300
+ if (currentRows instanceof Promise) {
301
+ return currentRows.then(function (row2) { return checkWithRows(row2); });
302
+ }
303
+ return checkWithRows(currentRows);
304
+ }
305
+ });
306
+ }
307
+ };
308
+ try {
309
+ for (var indexes_1 = (e_2 = void 0, tslib_1.__values(indexes)), indexes_1_1 = indexes_1.next(); !indexes_1_1.done; indexes_1_1 = indexes_1.next()) {
310
+ var index = indexes_1_1.value;
311
+ _loop_4(index);
312
+ }
313
+ }
314
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
315
+ finally {
316
+ try {
317
+ if (indexes_1_1 && !indexes_1_1.done && (_e = indexes_1.return)) _e.call(indexes_1);
318
+ }
319
+ finally { if (e_2) throw e_2.error; }
320
+ }
321
+ }
322
+ };
323
+ // unique索引相应的checker
324
+ for (var entity in schema) {
325
+ _loop_2(entity);
326
+ }
327
+ return {
328
+ triggers: triggers,
329
+ checkers: checkers,
330
+ watchers: makeIntrinsicWatchers(schema),
331
+ };
332
+ }
333
+ exports.analyzeActionDefDict = analyzeActionDefDict;
@@ -1,13 +1,13 @@
1
- import { AuthDefDict, Checker, EntityDict, OperateOption, SelectOption, StorageSchema, Trigger } from "../types";
2
- import { EntityDict as BaseEntityDict } from '../base-app-domain';
3
- import { AsyncContext } from "./AsyncRowStore";
4
- import { SyncContext } from './SyncRowStore';
5
- export declare function translateCheckerInAsyncContext<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED>>(checker: Checker<ED, keyof ED, Cxt>): {
6
- fn: Trigger<ED, keyof ED, Cxt>['fn'];
7
- when: 'before' | 'after';
8
- };
9
- export declare function translateCheckerInSyncContext<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends SyncContext<ED>>(checker: Checker<ED, T, Cxt>): {
10
- fn: (operation: ED[T]['Operation'], context: Cxt, option: OperateOption | SelectOption) => void;
11
- when: 'before' | 'after';
12
- };
13
- export declare function createAuthCheckers<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>>(schema: StorageSchema<ED>, authDict: AuthDefDict<ED>): Checker<ED, keyof ED, Cxt>[];
1
+ import { AuthDefDict, Checker, EntityDict, OperateOption, SelectOption, StorageSchema, Trigger } from "../types";
2
+ import { EntityDict as BaseEntityDict } from '../base-app-domain';
3
+ import { AsyncContext } from "./AsyncRowStore";
4
+ import { SyncContext } from './SyncRowStore';
5
+ export declare function translateCheckerInAsyncContext<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED>>(checker: Checker<ED, keyof ED, Cxt>): {
6
+ fn: Trigger<ED, keyof ED, Cxt>['fn'];
7
+ when: 'before' | 'after';
8
+ };
9
+ export declare function translateCheckerInSyncContext<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends SyncContext<ED>>(checker: Checker<ED, T, Cxt>): {
10
+ fn: (operation: ED[T]['Operation'], context: Cxt, option: OperateOption | SelectOption) => void;
11
+ when: 'before' | 'after';
12
+ };
13
+ export declare function createAuthCheckers<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>>(schema: StorageSchema<ED>, authDict: AuthDefDict<ED>): Checker<ED, keyof ED, Cxt>[];