oak-domain 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 (89) hide show
  1. package/lib/OakError.d.ts +7 -0
  2. package/lib/OakError.js +29 -0
  3. package/lib/actions/action.d.ts +6 -0
  4. package/lib/actions/action.js +12 -0
  5. package/lib/actions/relation.d.ts +1 -0
  6. package/lib/actions/relation.js +2 -0
  7. package/lib/compiler/env.d.ts +10 -0
  8. package/lib/compiler/env.js +26 -0
  9. package/lib/compiler/schemalBuilder.d.ts +2 -0
  10. package/lib/compiler/schemalBuilder.js +2738 -0
  11. package/lib/compiler/uiBuilder.d.ts +1 -0
  12. package/lib/compiler/uiBuilder.js +3 -0
  13. package/lib/compiler/utils.d.ts +2 -0
  14. package/lib/compiler/utils.js +11 -0
  15. package/lib/store/CascadeStore.d.ts +38 -0
  16. package/lib/store/CascadeStore.js +681 -0
  17. package/lib/store/TriggerExecutor.d.ts +30 -0
  18. package/lib/store/TriggerExecutor.js +549 -0
  19. package/lib/store/UniversalContext.d.ts +26 -0
  20. package/lib/store/UniversalContext.js +208 -0
  21. package/lib/store/actionDef.d.ts +8 -0
  22. package/lib/store/actionDef.js +241 -0
  23. package/lib/store/filter.d.ts +36 -0
  24. package/lib/store/filter.js +121 -0
  25. package/lib/store/relation.d.ts +13 -0
  26. package/lib/store/relation.js +64 -0
  27. package/lib/store/watchers.d.ts +2 -0
  28. package/lib/store/watchers.js +32 -0
  29. package/lib/types/Action.d.ts +14 -0
  30. package/lib/types/Action.js +2 -0
  31. package/lib/types/AppLoader.d.ts +11 -0
  32. package/lib/types/AppLoader.js +10 -0
  33. package/lib/types/Aspect.d.ts +12 -0
  34. package/lib/types/Aspect.js +4 -0
  35. package/lib/types/Auth.d.ts +28 -0
  36. package/lib/types/Auth.js +2 -0
  37. package/lib/types/Connector.d.ts +26 -0
  38. package/lib/types/Connector.js +9 -0
  39. package/lib/types/Context.d.ts +14 -0
  40. package/lib/types/Context.js +3 -0
  41. package/lib/types/DataType.d.ts +17 -0
  42. package/lib/types/DataType.js +5 -0
  43. package/lib/types/Demand.d.ts +77 -0
  44. package/lib/types/Demand.js +9 -0
  45. package/lib/types/Entity.d.ts +138 -0
  46. package/lib/types/Entity.js +8 -0
  47. package/lib/types/Exception.d.ts +48 -0
  48. package/lib/types/Exception.js +178 -0
  49. package/lib/types/Expression.d.ts +132 -0
  50. package/lib/types/Expression.js +378 -0
  51. package/lib/types/Geo.d.ts +18 -0
  52. package/lib/types/Geo.js +2 -0
  53. package/lib/types/Locale.d.ts +24 -0
  54. package/lib/types/Locale.js +2 -0
  55. package/lib/types/Logger.d.ts +5 -0
  56. package/lib/types/Logger.js +3 -0
  57. package/lib/types/Polyfill.d.ts +23 -0
  58. package/lib/types/Polyfill.js +2 -0
  59. package/lib/types/RowStore.d.ts +22 -0
  60. package/lib/types/RowStore.js +33 -0
  61. package/lib/types/Storage.d.ts +48 -0
  62. package/lib/types/Storage.js +2 -0
  63. package/lib/types/Trigger.d.ts +105 -0
  64. package/lib/types/Trigger.js +24 -0
  65. package/lib/types/Txn.d.ts +2 -0
  66. package/lib/types/Txn.js +3 -0
  67. package/lib/types/Watcher.d.ts +19 -0
  68. package/lib/types/Watcher.js +4 -0
  69. package/lib/types/index.d.ts +18 -0
  70. package/lib/types/index.js +30 -0
  71. package/lib/types/schema/DataTypes.d.ts +32 -0
  72. package/lib/types/schema/DataTypes.js +3 -0
  73. package/lib/utils/SimpleConnector.d.ts +29 -0
  74. package/lib/utils/SimpleConnector.js +145 -0
  75. package/lib/utils/assert.d.ts +5 -0
  76. package/lib/utils/assert.js +11 -0
  77. package/lib/utils/concurrent.d.ts +15 -0
  78. package/lib/utils/concurrent.js +138 -0
  79. package/lib/utils/geo.d.ts +4 -0
  80. package/lib/utils/geo.js +24 -0
  81. package/lib/utils/lodash.d.ts +16 -0
  82. package/lib/utils/lodash.js +32 -0
  83. package/lib/utils/string.d.ts +2 -0
  84. package/lib/utils/string.js +11 -0
  85. package/lib/utils/uuid.d.ts +2 -0
  86. package/lib/utils/uuid.js +11 -0
  87. package/lib/utils/validator.d.ts +23 -0
  88. package/lib/utils/validator.js +123 -0
  89. package/package.json +38 -0
@@ -0,0 +1,2738 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __read = (this && this.__read) || function (o, n) {
22
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
23
+ if (!m) return o;
24
+ var i = m.call(o), r, ar = [], e;
25
+ try {
26
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
27
+ }
28
+ catch (error) { e = { error: error }; }
29
+ finally {
30
+ try {
31
+ if (r && !r.done && (m = i["return"])) m.call(i);
32
+ }
33
+ finally { if (e) throw e.error; }
34
+ }
35
+ return ar;
36
+ };
37
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
38
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
39
+ if (ar || !(i in from)) {
40
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
41
+ ar[i] = from[i];
42
+ }
43
+ }
44
+ return to.concat(ar || Array.prototype.slice.call(from));
45
+ };
46
+ var __values = (this && this.__values) || function(o) {
47
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
48
+ if (m) return m.call(o);
49
+ if (o && typeof o.length === "number") return {
50
+ next: function () {
51
+ if (o && i >= o.length) o = void 0;
52
+ return { value: o && o[i++], done: !o };
53
+ }
54
+ };
55
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
56
+ };
57
+ var __importDefault = (this && this.__importDefault) || function (mod) {
58
+ return (mod && mod.__esModule) ? mod : { "default": mod };
59
+ };
60
+ Object.defineProperty(exports, "__esModule", { value: true });
61
+ exports.buildSchema = exports.analyzeEntities = void 0;
62
+ var path_1 = __importDefault(require("path"));
63
+ var assert_1 = __importDefault(require("assert"));
64
+ var fs_1 = require("fs");
65
+ var fs_extra_1 = require("fs-extra");
66
+ var lodash_1 = require("lodash");
67
+ var ts = __importStar(require("typescript"));
68
+ var factory = ts.factory;
69
+ var env_1 = require("./env");
70
+ var string_1 = require("../utils/string");
71
+ var Schema = {};
72
+ var OneToMany = {};
73
+ var ManyToOne = {};
74
+ var ReversePointerEntities = {};
75
+ var ReversePointerRelations = {};
76
+ var ActionImportStatements = function () { return [
77
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("ActionDef"))])), factory.createStringLiteral("".concat((0, env_1.TYPE_PATH_IN_OAK_DOMAIN)(), "Action")), undefined),
78
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("GenericAction"))])), factory.createStringLiteral((0, env_1.ACTION_CONSTANT_IN_OAK_DOMAIN)()), undefined)
79
+ ]; };
80
+ var ActionAsts = {};
81
+ var SchemaAsts = {};
82
+ function addRelationship(many, one, key, notNull) {
83
+ var _a, _b;
84
+ var _c = ManyToOne, _d = many, manySet = _c[_d];
85
+ var one2 = one === 'Schema' ? many : one;
86
+ if (manySet) {
87
+ manySet.push([one2, key, notNull]);
88
+ }
89
+ else {
90
+ (0, lodash_1.assign)(ManyToOne, (_a = {},
91
+ _a[many] = [[one2, key, notNull]],
92
+ _a));
93
+ }
94
+ var _e = OneToMany, _f = one2, oneSet = _e[_f];
95
+ if (oneSet) {
96
+ oneSet.push([many, key, notNull]);
97
+ }
98
+ else {
99
+ (0, lodash_1.assign)(OneToMany, (_b = {},
100
+ _b[one2] = [[many, key, notNull]],
101
+ _b));
102
+ }
103
+ }
104
+ function createForeignRef(entity, foreignKey, ref) {
105
+ if (entity === foreignKey) {
106
+ return factory.createIdentifier(ref);
107
+ }
108
+ return factory.createQualifiedName(factory.createIdentifier(foreignKey), factory.createIdentifier(ref));
109
+ }
110
+ function pushStatementIntoActionAst(moduleName, node, sourceFile) {
111
+ var _a;
112
+ // let actionNames;
113
+ var actionDefName;
114
+ /* if (ts.isTypeAliasDeclaration(node) && node.name.text === 'ParticularAction') {
115
+ const { type } = node;
116
+ if (ts.isUnionTypeNode(type)) {
117
+ actionNames = type.types.map(
118
+ (ele) => {
119
+ assert(ts.isTypeReferenceNode(ele));
120
+ const text = (<ts.Identifier>ele.typeName).text;
121
+ assert(text.endsWith('Action'));
122
+ return firstLetterLowerCase(text.slice(0, text.length - 6));
123
+ }
124
+ )
125
+ }
126
+ else {
127
+ assert(ts.isTypeReferenceNode(type));
128
+ const text = (<ts.Identifier>type.typeName).text;
129
+ assert(text.endsWith('Action'));
130
+ actionNames = [firstLetterLowerCase(text.slice(0, text.length - 6))];
131
+ }
132
+ } */
133
+ if (ts.isVariableStatement(node)) {
134
+ var declarations = node.declarationList.declarations;
135
+ declarations.forEach(function (declaration) {
136
+ if (ts.isIdentifier(declaration.name) && declaration.name.text.endsWith('ActionDef')) {
137
+ var text = declaration.name.text;
138
+ actionDefName = (0, string_1.firstLetterLowerCase)(text.slice(0, text.length - 9));
139
+ }
140
+ });
141
+ }
142
+ if (ActionAsts[moduleName]) {
143
+ ActionAsts[moduleName].statements.push(node);
144
+ /* if (actionNames) {
145
+ ActionAsts[moduleName].actionNames = actionNames;
146
+ } */
147
+ if (actionDefName) {
148
+ ActionAsts[moduleName].actionDefNames.push(actionDefName);
149
+ }
150
+ }
151
+ else {
152
+ (0, lodash_1.assign)(ActionAsts, (_a = {},
153
+ _a[moduleName] = {
154
+ statements: __spreadArray(__spreadArray([], __read(ActionImportStatements()), false), [node], false),
155
+ sourceFile: sourceFile,
156
+ importedFrom: {},
157
+ // actionNames,
158
+ actionDefNames: actionDefName ? [actionDefName] : [],
159
+ },
160
+ _a));
161
+ }
162
+ }
163
+ function pushStatementIntoSchemaAst(moduleName, statement, sourceFile) {
164
+ var _a;
165
+ if (SchemaAsts[moduleName]) {
166
+ SchemaAsts[moduleName].statements.push(statement);
167
+ }
168
+ else {
169
+ (0, lodash_1.assign)(SchemaAsts, (_a = {},
170
+ _a[moduleName] = {
171
+ statements: [statement],
172
+ sourceFile: sourceFile,
173
+ },
174
+ _a));
175
+ }
176
+ }
177
+ /**
178
+ * 检查ActionDef是否满足合法的定义
179
+ * 1、ActionDef, Action, State三者命名是否一致
180
+ * @param actionDefNode
181
+ */
182
+ function checkActionDefNameConsistent(filename, actionDefNode) {
183
+ var name = actionDefNode.name, type = actionDefNode.type;
184
+ (0, assert_1.default)(ts.isTypeReferenceNode(type));
185
+ var typeArguments = type.typeArguments;
186
+ (0, assert_1.default)(typeArguments.length === 2);
187
+ var _a = __read(typeArguments, 2), actionNode = _a[0], stateNode = _a[1];
188
+ (0, assert_1.default)(ts.isIdentifier(name), "\u6587\u4EF6".concat(filename, "\u4E2D\u7684ActionDef").concat(name.text, "\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u53D8\u91CF"));
189
+ (0, assert_1.default)(name.text.endsWith('ActionDef'), "\u6587\u4EF6".concat(filename, "\u4E2D\u7684ActionDef").concat(name.text, "\u672A\u4EE5ActionDef\u7ED3\u5C3E"));
190
+ (0, assert_1.default)(ts.isTypeReferenceNode(actionNode) && ts.isTypeReferenceNode(stateNode), "\u6587\u4EF6".concat(filename, "\u4E2D\u7684ActionDef").concat(name.text, "\u7C7B\u578B\u58F0\u660E\u4E2D\u7684action\u548Cstate\u975E\u6CD5"));
191
+ (0, assert_1.default)(ts.isIdentifier(actionNode.typeName) && ts.isIdentifier(stateNode.typeName));
192
+ (0, assert_1.default)(actionNode.typeName.text.endsWith('Action'), "\u6587\u4EF6".concat(filename, "\u4E2D\u7684ActionDef").concat(name.text, "\u6240\u5F15\u7528\u7684Action").concat(actionNode.typeName, "\u672A\u4EE5Action\u7ED3\u5C3E"));
193
+ (0, assert_1.default)(stateNode.typeName.text.endsWith('State'), "\u6587\u4EF6".concat(filename, "\u4E2D\u7684ActionDef").concat(name.text, "\u6240\u5F15\u7528\u7684Action").concat(stateNode.typeName, "\u672A\u4EE5Action\u7ED3\u5C3E"));
194
+ var adfName = name.text.slice(0, name.text.length - 9);
195
+ var aName = actionNode.typeName.text.slice(0, actionNode.typeName.text.length - 6);
196
+ var sName = stateNode.typeName.text.slice(0, stateNode.typeName.text.length - 5);
197
+ (0, assert_1.default)(adfName === aName && aName === sName, "\u6587\u4EF6".concat(filename, "\u4E2D\u7684ActionDef").concat(name.text, "\u4E2DActionDef, Action\u548CState\u7684\u547D\u540D\u89C4\u5219\u4E0D\u4E00\u81F4"));
198
+ }
199
+ function addActionSource(moduleName, name, node) {
200
+ var _a;
201
+ var ast = ActionAsts[moduleName];
202
+ var moduleSpecifier = node.moduleSpecifier;
203
+ // 目前应该只会引用oak-domain/src/actions/action里的公共action
204
+ (0, assert_1.default)(ts.isStringLiteral(moduleSpecifier) && moduleSpecifier.text === (0, env_1.ACTION_CONSTANT_IN_OAK_DOMAIN)());
205
+ (0, lodash_1.assign)(ast.importedFrom, (_a = {},
206
+ _a[name.text] = node,
207
+ _a));
208
+ }
209
+ function getStringTextFromUnionStringLiterals(moduleName, filename, node, program) {
210
+ var _a;
211
+ var checker = program.getTypeChecker();
212
+ var symbol = checker.getSymbolAtLocation(node.typeName);
213
+ var declaration = symbol === null || symbol === void 0 ? void 0 : symbol.getDeclarations()[0];
214
+ var isImport = false;
215
+ /* const typee = checker.getDeclaredTypeOfSymbol(symbol!);
216
+
217
+ const declaration = typee.aliasSymbol!.getDeclarations()![0]; */
218
+ if (ts.isImportSpecifier(declaration)) {
219
+ isImport = true;
220
+ var typee = checker.getDeclaredTypeOfSymbol(symbol);
221
+ declaration = typee.aliasSymbol.getDeclarations()[0];
222
+ }
223
+ (0, assert_1.default)(ts.isTypeAliasDeclaration(declaration));
224
+ var type = declaration.type, name = declaration.name;
225
+ // assert(ts.isUnionTypeNode(type!) || ts.isLiteralTypeNode(type!), `${filename}中引用的action「${(<ts.Identifier>name).text}」的定义不是union和stringLiteral类型`);
226
+ // 如果这个action是从外部导入的,在这里要记下来此entity和这个导入之间的关系
227
+ if (isImport) {
228
+ var importDeclartion = symbol.getDeclarations()[0].parent.parent.parent;
229
+ (0, assert_1.default)(ts.isImportDeclaration(importDeclartion));
230
+ addActionSource(moduleName, name, importDeclartion);
231
+ }
232
+ else {
233
+ var ast = ActionAsts[moduleName];
234
+ (0, lodash_1.assign)(ast.importedFrom, (_a = {},
235
+ _a[name.text] = 'local',
236
+ _a));
237
+ }
238
+ var getStringLiteral = function (ele) {
239
+ (0, assert_1.default)(ts.isLiteralTypeNode(ele) && ts.isStringLiteral(ele.literal), "".concat(filename, "\u4E2D\u5F15\u7528\u7684action").concat(name.text, "\u4E2D\u5B58\u5728\u4E0D\u662Fstringliteral\u7684\u7C7B\u578B"));
240
+ (0, assert_1.default)(!ele.literal.text.includes('$'), "".concat(filename, "\u4E2D\u5F15\u7528\u7684action").concat(name.text, "\u4E2D\u7684action\u300C").concat(ele.literal.text, "\u300D\u5305\u542B\u975E\u6CD5\u5B57\u7B26$"));
241
+ (0, assert_1.default)(ele.literal.text.length > 0, "".concat(filename, "\u4E2D\u5F15\u7528\u7684action").concat(name.text, "\u4E2D\u7684action\u300C").concat(ele.literal.text, "\u300D\u957F\u5EA6\u975E\u6CD5"));
242
+ (0, assert_1.default)(ele.literal.text.length < env_1.STRING_LITERAL_MAX_LENGTH, "".concat(filename, "\u4E2D\u5F15\u7528\u7684action").concat(name.text, "\u4E2D\u7684action\u300C").concat(ele.literal.text, "\u300D\u957F\u5EA6\u8FC7\u957F"));
243
+ return ele.literal.text;
244
+ };
245
+ if (ts.isUnionTypeNode(type)) {
246
+ var actions = type.types.map(function (ele) { return getStringLiteral(ele); });
247
+ return actions;
248
+ }
249
+ else {
250
+ (0, assert_1.default)(ts.isLiteralTypeNode(type), "".concat(filename, "\u4E2D\u5F15\u7528\u7684action\u300C").concat(name.text, "\u300D\u7684\u5B9A\u4E49\u4E0D\u662Funion\u548CstringLiteral\u7C7B\u578B"));
251
+ var action = getStringLiteral(type);
252
+ return [action];
253
+ }
254
+ }
255
+ var RESERVED_ACTION_NAMES = ['GenericAction', 'ParticularAction'];
256
+ var action_1 = require("../actions/action");
257
+ var DataType_1 = require("../types/DataType");
258
+ var Entity_1 = require("../types/Entity");
259
+ function dealWithActions(moduleName, filename, node, program) {
260
+ var actionTexts = action_1.genericActions.map(function (ele) { return ele; });
261
+ if (ts.isUnionTypeNode(node)) {
262
+ var actionNames = node.types.map(function (ele) {
263
+ if (ts.isTypeReferenceNode(ele) && ts.isIdentifier(ele.typeName)) {
264
+ return ele.typeName.text;
265
+ }
266
+ }).filter(function (ele) { return !!ele; });
267
+ (0, assert_1.default)((0, lodash_1.intersection)(actionNames, env_1.RESERVED_ENTITIES).length === 0, "".concat(filename, "\u4E2D\u7684Action\u547D\u540D\u4E0D\u80FD\u662F\u300C").concat(RESERVED_ACTION_NAMES.join(','), "\u300D\u4E4B\u4E00"));
268
+ node.types.forEach(function (ele) {
269
+ if (ts.isTypeReferenceNode(ele)) {
270
+ actionTexts.push.apply(actionTexts, __spreadArray([], __read(getStringTextFromUnionStringLiterals(moduleName, filename, ele, program)), false));
271
+ }
272
+ else {
273
+ (0, assert_1.default)(ts.isLiteralTypeNode(ele) && ts.isStringLiteral(ele.literal), "\u3010".concat(moduleName, "\u3011action\u7684\u5B9A\u4E49\u65E2\u975EType\u4E5F\u4E0D\u662Fstring"));
274
+ actionTexts.push(ele.literal.text);
275
+ }
276
+ });
277
+ }
278
+ else if (ts.isTypeReferenceNode(node)) {
279
+ if (ts.isIdentifier(node.typeName)) {
280
+ (0, assert_1.default)(!RESERVED_ACTION_NAMES.includes(node.typeName.text), "".concat(filename, "\u4E2D\u7684Action\u547D\u540D\u4E0D\u80FD\u662F\u300C").concat(RESERVED_ACTION_NAMES.join(','), "\u300D\u4E4B\u4E00"));
281
+ }
282
+ actionTexts.push.apply(actionTexts, __spreadArray([], __read(getStringTextFromUnionStringLiterals(moduleName, filename, node, program)), false));
283
+ }
284
+ else {
285
+ (0, assert_1.default)(ts.isLiteralTypeNode(node) && ts.isStringLiteral(node.literal), "\u3010".concat(moduleName, "\u3011action\u7684\u5B9A\u4E49\u65E2\u975EType\u4E5F\u4E0D\u662Fstring"));
286
+ actionTexts.push(node.literal.text);
287
+ }
288
+ // 所有的action定义不能有重名
289
+ var ActionDict = {};
290
+ actionTexts.forEach(function (action) {
291
+ var _a;
292
+ (0, assert_1.default)(action.length <= env_1.STRING_LITERAL_MAX_LENGTH, "".concat(filename, "\u4E2D\u7684Action\u300C").concat(action, "\u300D\u547D\u540D\u957F\u5EA6\u5927\u4E8E").concat(env_1.STRING_LITERAL_MAX_LENGTH));
293
+ if (ActionDict.hasOwnProperty(action)) {
294
+ throw new Error("\u6587\u4EF6".concat(filename, "\u4E2D\uFF0CAction\u5B9A\u4E49\u4E0A\u7684\u3010").concat(action, "\u3011\u52A8\u4F5C\u5B58\u5728\u540C\u540D"));
295
+ }
296
+ else {
297
+ (0, lodash_1.assign)(ActionDict, (_a = {},
298
+ _a[action] = 1,
299
+ _a));
300
+ }
301
+ });
302
+ // 为每个action在schema中建立相应的state域(除了genericState)
303
+ // 放到actionDef的定义处去做。by Xc
304
+ }
305
+ function getEntityImported(declaration, filename) {
306
+ var moduleSpecifier = declaration.moduleSpecifier, importClause = declaration.importClause;
307
+ var entityImported;
308
+ if (ts.isStringLiteral(moduleSpecifier)) {
309
+ if (moduleSpecifier.text.startsWith('./')) {
310
+ entityImported = moduleSpecifier.text.slice(2);
311
+ }
312
+ else if (moduleSpecifier.text.startsWith((0, env_1.ENTITY_PATH_IN_OAK_GENERAL_BUSINESS)())) {
313
+ entityImported = moduleSpecifier.text.slice((0, env_1.ENTITY_PATH_IN_OAK_GENERAL_BUSINESS)().length);
314
+ }
315
+ }
316
+ if (entityImported) {
317
+ var namedBindings = importClause.namedBindings;
318
+ (0, assert_1.default)(ts.isNamedImports(namedBindings));
319
+ var elements = namedBindings.elements;
320
+ (0, assert_1.default)(elements.find(function (ele) { return ts.isImportSpecifier(ele) && ele.name.text === entityImported && ele.propertyName.text === 'Schema'; }), "\u300C".concat(filename, "\u300D\u5BFC\u5165\u7684\u5BF9\u8C61\u540D\u79F0\u548C\u5BF9\u8C61\u6240\u5728\u7684\u6587\u4EF6\u540D\u79F0\u300C").concat(entityImported, "\u300D\u4E0D\u7B26"));
321
+ return entityImported;
322
+ }
323
+ }
324
+ function checkLocaleEnumAttrs(node, attrs, filename) {
325
+ var members = node.members;
326
+ var memberKeys = members.map(function (ele) {
327
+ (0, assert_1.default)(ts.isPropertySignature(ele) && ts.isIdentifier(ele.name));
328
+ return ele.name.text;
329
+ });
330
+ var lack = (0, lodash_1.difference)(attrs, memberKeys);
331
+ if (lack.length > 0) {
332
+ throw new Error("".concat(filename, "\u4E2D\u7F3A\u5C11\u4E86\u5BF9").concat(lack.join(','), "\u5C5E\u6027\u7684locale\u5B9A\u4E49"));
333
+ }
334
+ }
335
+ function checkLocaleExpressionPropertyExists(root, attr, exists, filename) {
336
+ var properties = root.properties;
337
+ properties.forEach(function (ele) {
338
+ (0, assert_1.default)(ts.isPropertyAssignment(ele) && (ts.isIdentifier(ele.name) || ts.isStringLiteral(ele.name)) && ts.isObjectLiteralExpression(ele.initializer));
339
+ var p2 = ele.initializer.properties;
340
+ var pp = p2.find(function (ele2) {
341
+ (0, assert_1.default)(ts.isPropertyAssignment(ele2) && ts.isIdentifier(ele2.name));
342
+ return ele2.name.text === attr;
343
+ });
344
+ if (exists && !pp) {
345
+ throw new Error("".concat(filename, "\u4E2D\u7684locale\u5B9A\u4E49\u4E2D\u7684").concat(ele.name.text, "\u4E2D\u7F3A\u5C11\u4E86").concat(attr, "\u7684\u5B9A\u4E49"));
346
+ }
347
+ else if (!exists && pp) {
348
+ throw new Error("".concat(filename, "\u4E2D\u7684locale\u5B9A\u4E49\u4E2D\u7684").concat(ele.name.text, "\u4E2D\u6709\u591A\u4F59\u7684").concat(attr, "\u5B9A\u4E49"));
349
+ }
350
+ });
351
+ }
352
+ function analyzeEntity(filename, path, program) {
353
+ var _a;
354
+ var fullPath = "".concat(path, "/").concat(filename);
355
+ var sourceFile = program.getSourceFile(fullPath);
356
+ var moduleName = filename.split('.')[0];
357
+ var referencedSchemas = [];
358
+ var schemaAttrs = [];
359
+ var hasFulltextIndex = false;
360
+ var indexes;
361
+ var beforeSchema = true;
362
+ var hasActionDef = false;
363
+ var hasRelationDef = false;
364
+ var hasActionTypeAliasDeclaration = false;
365
+ var enumStringAttrs = [];
366
+ var states = [];
367
+ var localEnumStringTypes = [];
368
+ var localeDef = undefined;
369
+ ts.forEachChild(sourceFile, function (node) {
370
+ var _a, _b;
371
+ if (ts.isImportDeclaration(node)) {
372
+ var entityImported = getEntityImported(node, filename);
373
+ if (entityImported) {
374
+ referencedSchemas.push(entityImported);
375
+ }
376
+ }
377
+ if (ts.isInterfaceDeclaration(node)) {
378
+ // schema 定义
379
+ if (node.name.text === 'Schema') {
380
+ (0, assert_1.default)(!localeDef, "\u3010".concat(filename, "\u3011locale\u5B9A\u4E49\u987B\u5728Schema\u4E4B\u540E"));
381
+ var hasEntityAttr_1 = false;
382
+ var hasEntityIdAttr_1 = false;
383
+ var members = node.members, heritageClauses = node.heritageClauses;
384
+ (0, assert_1.default)(['EntityShape', 'FileCarrierEntityShape'].includes(heritageClauses[0].types[0].expression.text));
385
+ members.forEach(function (attrNode) {
386
+ var _a;
387
+ var _b = attrNode, type = _b.type, name = _b.name, questionToken = _b.questionToken;
388
+ var attrName = name.text;
389
+ if (ts.isTypeReferenceNode(type)
390
+ && ts.isIdentifier(type.typeName)) {
391
+ if ((referencedSchemas.includes(type.typeName.text) || type.typeName.text === 'Schema')) {
392
+ addRelationship(moduleName, type.typeName.text, attrName, !!questionToken);
393
+ schemaAttrs.push(attrNode);
394
+ }
395
+ else if (type.typeName.text === 'Array') {
396
+ // 这是一对多的反向指针的引用,需要特殊处理
397
+ var typeArguments = type.typeArguments;
398
+ (0, assert_1.default)(typeArguments.length === 1
399
+ && ts.isTypeReferenceNode(typeArguments[0])
400
+ && ts.isIdentifier(typeArguments[0].typeName)
401
+ && referencedSchemas.includes(typeArguments[0].typeName.text), "\u300C".concat(filename, "\u300D\u975E\u6CD5\u7684\u5C5E\u6027\u5B9A\u4E49\u300C").concat(attrName, "\u300D"));
402
+ var reverseEntity = typeArguments[0].typeName.text;
403
+ if (ReversePointerRelations[reverseEntity]) {
404
+ ReversePointerRelations[reverseEntity].push(moduleName);
405
+ }
406
+ else {
407
+ (0, lodash_1.assign)(ReversePointerRelations, (_a = {},
408
+ _a[reverseEntity] = [moduleName],
409
+ _a));
410
+ }
411
+ }
412
+ else {
413
+ schemaAttrs.push(attrNode);
414
+ if (localEnumStringTypes.includes(type.typeName.text)) {
415
+ enumStringAttrs.push(name.text);
416
+ }
417
+ }
418
+ }
419
+ else {
420
+ schemaAttrs.push(attrNode);
421
+ if (ts.isUnionTypeNode(type)) {
422
+ var types = type.types;
423
+ if (ts.isLiteralTypeNode(types[0]) && ts.isStringLiteral(types[0].literal)) {
424
+ enumStringAttrs.push(name.text);
425
+ }
426
+ }
427
+ }
428
+ if (attrName === 'entity'
429
+ && ts.isTypeReferenceNode(type)
430
+ && ts.isIdentifier(type.typeName)) {
431
+ var typeArguments = type.typeArguments;
432
+ if (type.typeName.text === 'String'
433
+ && typeArguments
434
+ && typeArguments.length === 1) {
435
+ var _c = __read(typeArguments, 1), node_1 = _c[0];
436
+ if (ts.isLiteralTypeNode(node_1) && ts.isNumericLiteral(node_1.literal)) {
437
+ if (parseInt(node_1.literal.text) > 32) {
438
+ console.warn("\u300C\u300D\u4E2Dentity\u5C5E\u6027\u5B9A\u4E49\u7684\u957F\u5EA6\u5927\u4E8E32\uFF0C\u8BF7\u786E\u8BA4\u5B83\u4E0D\u662F\u4E00\u4E2A\u53CD\u6307\u5BF9\u8C61");
439
+ }
440
+ else {
441
+ hasEntityAttr_1 = true;
442
+ }
443
+ }
444
+ }
445
+ }
446
+ if (attrName === 'entityId'
447
+ && ts.isTypeReferenceNode(type)
448
+ && ts.isIdentifier(type.typeName)) {
449
+ var typeArguments = type.typeArguments;
450
+ if (type.typeName.text === 'String'
451
+ && typeArguments
452
+ && typeArguments.length === 1) {
453
+ var _d = __read(typeArguments, 1), node_2 = _d[0];
454
+ if (ts.isLiteralTypeNode(node_2) && ts.isNumericLiteral(node_2.literal)) {
455
+ if (parseInt(node_2.literal.text) !== 64) {
456
+ console.warn("\u300C".concat(filename, "\u300D\u4E2DentityId\u5C5E\u6027\u5B9A\u4E49\u7684\u957F\u5EA6\u4E0D\u7B49\u4E8E64\uFF0C\u8BF7\u786E\u8BA4\u5B83\u4E0D\u662F\u4E00\u4E2A\u53CD\u6307\u5BF9\u8C61"));
457
+ }
458
+ else {
459
+ hasEntityIdAttr_1 = true;
460
+ }
461
+ }
462
+ }
463
+ }
464
+ });
465
+ if (hasEntityAttr_1 && hasEntityIdAttr_1) {
466
+ (0, lodash_1.assign)(ReversePointerEntities, (_a = {},
467
+ _a[moduleName] = 1,
468
+ _a));
469
+ }
470
+ beforeSchema = false;
471
+ }
472
+ else if (beforeSchema) {
473
+ // 本地规定的一些形状定义,直接使用
474
+ pushStatementIntoSchemaAst(moduleName, node, sourceFile);
475
+ }
476
+ }
477
+ if (ts.isTypeAliasDeclaration(node)) {
478
+ // action 定义
479
+ if (node.name.text === 'Action') {
480
+ (0, assert_1.default)(!localeDef, "\u3010".concat(filename, "\u3011locale\u5B9A\u4E49\u987B\u5728Action\u4E4B\u540E"));
481
+ hasActionDef = true;
482
+ hasActionTypeAliasDeclaration = true;
483
+ var modifiers = [factory.createModifier(ts.SyntaxKind.ExportKeyword)];
484
+ pushStatementIntoActionAst(moduleName, factory.updateTypeAliasDeclaration(node, node.decorators, modifiers, factory.createIdentifier('ParticularAction'), node.typeParameters, node.type), sourceFile);
485
+ pushStatementIntoActionAst(moduleName, factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Action"), undefined, factory.createUnionTypeNode([
486
+ factory.createTypeReferenceNode(factory.createIdentifier("GenericAction"), undefined),
487
+ factory.createTypeReferenceNode(factory.createIdentifier("ParticularAction"), undefined)
488
+ ])), sourceFile);
489
+ dealWithActions(moduleName, filename, node.type, program);
490
+ }
491
+ else if (node.name.text === 'Relation') {
492
+ (0, assert_1.default)(!localeDef, "\u3010".concat(filename, "\u3011locale\u5B9A\u4E49\u987B\u5728Action\u4E4B\u540E"));
493
+ // 增加userXXX对象的描述
494
+ if (ts.isLiteralTypeNode(node.type)) {
495
+ (0, assert_1.default)(ts.isStringLiteral(node.type.literal));
496
+ (0, assert_1.default)(node.type.literal.text.length < env_1.STRING_LITERAL_MAX_LENGTH, "Relation\u5B9A\u4E49\u7684\u5B57\u7B26\u4E32\u957F\u5EA6\u4E0D\u957F\u4E8E".concat(env_1.STRING_LITERAL_MAX_LENGTH, "\uFF08").concat(filename, "\uFF0C").concat(node.type.literal.text, "\uFF09"));
497
+ }
498
+ else {
499
+ (0, assert_1.default)(ts.isUnionTypeNode(node.type), "Relation\u7684\u5B9A\u4E49\u53EA\u80FD\u662Fstring\u7C7B\u578B\uFF08".concat(filename, "\uFF09"));
500
+ node.type.types.forEach(function (ele) {
501
+ (0, assert_1.default)(ts.isLiteralTypeNode(ele) && ts.isStringLiteral(ele.literal), "Relation\u7684\u5B9A\u4E49\u53EA\u80FD\u662Fstring\u7C7B\u578B\uFF08".concat(filename, "\uFF09"));
502
+ (0, assert_1.default)(ele.literal.text.length < env_1.STRING_LITERAL_MAX_LENGTH, "Relation\u5B9A\u4E49\u7684\u5B57\u7B26\u4E32\u957F\u5EA6\u4E0D\u957F\u4E8E".concat(env_1.STRING_LITERAL_MAX_LENGTH, "\uFF08").concat(filename, "\uFF0C").concat(ele.literal.text, "\uFF09"));
503
+ });
504
+ }
505
+ var entityLc = (0, string_1.firstLetterLowerCase)(moduleName);
506
+ var relationEntityName = "User".concat(moduleName);
507
+ var relationSchemaAttrs = [
508
+ factory.createPropertySignature(undefined, factory.createIdentifier("user"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("User"), undefined)),
509
+ factory.createPropertySignature(undefined, factory.createIdentifier(entityLc), undefined, factory.createTypeReferenceNode(factory.createIdentifier(moduleName), undefined)),
510
+ factory.createPropertySignature(undefined, factory.createIdentifier('relation'), undefined, node.type),
511
+ ];
512
+ (0, lodash_1.assign)(Schema, (_b = {},
513
+ _b[relationEntityName] = {
514
+ schemaAttrs: relationSchemaAttrs,
515
+ sourceFile: sourceFile,
516
+ },
517
+ _b));
518
+ addRelationship(relationEntityName, 'User', 'user', true);
519
+ addRelationship(relationEntityName, moduleName, entityLc, true);
520
+ hasRelationDef = true;
521
+ }
522
+ else if (node.name.text.endsWith('Action') || node.name.text.endsWith('State')) {
523
+ (0, assert_1.default)(!localeDef, "\u3010".concat(filename, "\u3011locale\u5B9A\u4E49\u987B\u5728Action/State\u4E4B\u540E"));
524
+ pushStatementIntoActionAst(moduleName, factory.updateTypeAliasDeclaration(node, node.decorators, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], node.name, node.typeParameters, node.type), sourceFile);
525
+ }
526
+ else if (beforeSchema) {
527
+ // 本地规定的一些形状定义,直接使用
528
+ pushStatementIntoSchemaAst(moduleName, node, sourceFile);
529
+ if (ts.isUnionTypeNode(node.type) && ts.isLiteralTypeNode(node.type.types[0]) && ts.isStringLiteral(node.type.types[0].literal)) {
530
+ // 本文件内定义的枚举类型
531
+ localEnumStringTypes.push(node.name.text);
532
+ }
533
+ }
534
+ }
535
+ if (ts.isVariableStatement(node)) {
536
+ var declarations = node.declarationList.declarations;
537
+ declarations.forEach(function (declaration) {
538
+ if (ts.isIdentifier(declaration.name) && declaration.name.text.endsWith('ActionDef')) {
539
+ if (declaration.type && ts.isTypeReferenceNode(declaration.type) && ts.isIdentifier(declaration.type.typeName) && declaration.type.typeName.text === 'ActionDef') {
540
+ // 是显示的actionDef定义
541
+ checkActionDefNameConsistent(filename, declaration);
542
+ var typeArguments = declaration.type.typeArguments;
543
+ (0, assert_1.default)(typeArguments.length === 2);
544
+ var _a = __read(typeArguments, 2), actionNode = _a[0], stateNode = _a[1];
545
+ var checker = program.getTypeChecker();
546
+ var symbol = checker.getSymbolAtLocation(actionNode.typeName);
547
+ var declaration2_1 = symbol.getDeclarations()[0];
548
+ if (declaration2_1.getSourceFile() === sourceFile) {
549
+ // pushStatementIntoActionAst(moduleName, <ts.TypeAliasDeclaration>declaration2, sourceFile);
550
+ }
551
+ symbol = checker.getSymbolAtLocation(stateNode.typeName);
552
+ declaration2_1 = symbol.getDeclarations()[0];
553
+ if (declaration2_1.getSourceFile() === sourceFile) {
554
+ // 检查state的定义合法
555
+ (0, assert_1.default)(ts.isTypeAliasDeclaration(declaration2_1) && ts.isUnionTypeNode(declaration2_1.type), "\u300C".concat(filename, "\u300DState\u300C").concat(declaration2_1.name, "\u300D\u7684\u5B9A\u4E49\u53EA\u80FD\u662F\u6216\u7ED3\u70B9"));
556
+ declaration2_1.type.types.forEach(function (type) {
557
+ (0, assert_1.default)(ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal), "\u300C".concat(filename, "\u300DState\u300C").concat(declaration2_1.name, "\u300D\u7684\u5B9A\u4E49\u53EA\u80FD\u662F\u5B57\u7B26\u4E32"));
558
+ (0, assert_1.default)(type.literal.text.length < env_1.STRING_LITERAL_MAX_LENGTH, "\u300C".concat(filename, "\u300DState\u300C").concat(type.literal.text, "\u300D\u7684\u957F\u5EA6\u5927\u4E8E\u300C").concat(env_1.STRING_LITERAL_MAX_LENGTH, "\u300D"));
559
+ });
560
+ /* pushStatementIntoActionAst(moduleName,
561
+ factory.updateTypeAliasDeclaration(
562
+ declaration2,
563
+ declaration2.decorators,
564
+ [factory.createModifier(ts.SyntaxKind.ExportKeyword)],
565
+ declaration2.name,
566
+ declaration2.typeParameters,
567
+ declaration2.type
568
+ ),
569
+ sourceFile); */
570
+ }
571
+ }
572
+ pushStatementIntoActionAst(moduleName, node, sourceFile);
573
+ var adName = declaration.name.text.slice(0, declaration.name.text.length - 9);
574
+ var attr = adName.concat('State');
575
+ schemaAttrs.push(factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(attr)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(factory.createIdentifier(attr))));
576
+ states.push((0, string_1.firstLetterLowerCase)(attr));
577
+ }
578
+ else if (declaration.type && (ts.isArrayTypeNode(declaration.type)
579
+ && ts.isTypeReferenceNode(declaration.type.elementType)
580
+ && ts.isIdentifier(declaration.type.elementType.typeName)
581
+ && declaration.type.elementType.typeName.text === 'Index'
582
+ || ts.isTypeReferenceNode(declaration.type)
583
+ && ts.isIdentifier(declaration.type.typeName)
584
+ && declaration.type.typeName.text === 'Array'
585
+ && ts.isTypeReferenceNode(declaration.type.typeArguments[0])
586
+ && ts.isIdentifier(declaration.type.typeArguments[0].typeName)
587
+ && declaration.type.typeArguments[0].typeName.text === 'Index')) {
588
+ // 对索引Index的定义
589
+ var indexNameDict_1 = {};
590
+ (0, assert_1.default)(ts.isArrayLiteralExpression(declaration.initializer), "\u300C".concat(filename, "\u300DIndex\u300C").concat(declaration.name.getText(), "\u300D\u7684\u5B9A\u4E49\u5FC5\u987B\u7B26\u5408\u89C4\u8303"));
591
+ // todo 这里应该先做一个类型检查的,但不知道怎么写 by Xc
592
+ // 检查索引的属性是否合法
593
+ var elements = declaration.initializer.elements;
594
+ elements.forEach(function (ele) {
595
+ var _a;
596
+ var isFulltextIndex = false;
597
+ (0, assert_1.default)(ts.isObjectLiteralExpression(ele));
598
+ var properties = ele.properties;
599
+ var attrProperty = properties.find(function (ele2) {
600
+ (0, assert_1.default)(ts.isPropertyAssignment(ele2));
601
+ return ele2.name.getText() === 'attributes';
602
+ });
603
+ (0, assert_1.default)(ts.isArrayLiteralExpression(attrProperty.initializer));
604
+ var nameProperty = properties.find(function (ele2) {
605
+ (0, assert_1.default)(ts.isPropertyAssignment(ele2));
606
+ return ele2.name.getText() === 'name';
607
+ });
608
+ (0, assert_1.default)(ts.isStringLiteral(nameProperty.initializer));
609
+ var indexName = nameProperty.initializer.text;
610
+ if (indexNameDict_1[indexName]) {
611
+ throw new Error("\u300C".concat(filename, "\u300D\u7D22\u5F15\u5B9A\u4E49\u91CD\u540D\u300C").concat(indexName, "\u300D"));
612
+ }
613
+ (0, lodash_1.assign)(indexNameDict_1, (_a = {},
614
+ _a[indexName] = true,
615
+ _a));
616
+ var configProperty = properties.find(function (ele2) {
617
+ (0, assert_1.default)(ts.isPropertyAssignment(ele2));
618
+ return ele2.name.getText() === 'config';
619
+ });
620
+ if (configProperty) {
621
+ (0, assert_1.default)(ts.isObjectLiteralExpression(configProperty.initializer));
622
+ var properties2 = configProperty.initializer.properties;
623
+ var typeProperty = properties2.find(function (ele2) {
624
+ (0, assert_1.default)(ts.isPropertyAssignment(ele2));
625
+ return ele2.name.getText() === 'type';
626
+ });
627
+ if (typeProperty && typeProperty.initializer.text === 'fulltext') {
628
+ // 定义了全文索引
629
+ if (hasFulltextIndex) {
630
+ throw new Error("\u300C".concat(filename, "\u300D\u53EA\u80FD\u5B9A\u4E49\u4E00\u4E2A\u5168\u6587\u7D22\u5F15"));
631
+ }
632
+ hasFulltextIndex = true;
633
+ isFulltextIndex = true;
634
+ }
635
+ }
636
+ var elements = attrProperty.initializer.elements;
637
+ // 每个属性都应该在schema中有值,且对象类型是可索引值
638
+ elements.forEach(function (ele2) {
639
+ (0, assert_1.default)(ts.isObjectLiteralExpression(ele2));
640
+ var properties2 = ele2.properties;
641
+ var nameProperty = properties2.find(function (ele3) {
642
+ (0, assert_1.default)(ts.isPropertyAssignment(ele3));
643
+ return ele3.name.getText() === 'name';
644
+ });
645
+ var indexAttrName = nameProperty.initializer.text;
646
+ if (!Entity_1.initinctiveAttributes.includes(indexAttrName)) {
647
+ var schemaNode = schemaAttrs.find(function (ele3) {
648
+ (0, assert_1.default)(ts.isPropertySignature(ele3));
649
+ return ele3.name.text === indexAttrName;
650
+ });
651
+ if (!schemaNode) {
652
+ throw new Error("\u300C".concat(filename, "\u300D\u4E2D\u7D22\u5F15\u300C").concat(indexName, "\u300D\u7684\u5C5E\u6027\u300C").concat(indexAttrName, "\u300D\u5B9A\u4E49\u975E\u6CD5"));
653
+ }
654
+ var type = schemaNode.type, name_1 = schemaNode.name;
655
+ var entity = (0, string_1.firstLetterLowerCase)(moduleName);
656
+ var _a = ManyToOne, _b = entity, manyToOneSet = _a[_b];
657
+ if (ts.isTypeReferenceNode(type)) {
658
+ var typeName = type.typeName;
659
+ if (ts.isIdentifier(typeName)) {
660
+ var text = typeName.text;
661
+ var text2_1 = text === 'Schema' ? entity : text;
662
+ var manyToOneItem = manyToOneSet && manyToOneSet.find(function (_a) {
663
+ var _b = __read(_a, 2), refEntity = _b[0], attrName = _b[1];
664
+ return refEntity === text2_1 && attrName === name_1.text;
665
+ });
666
+ if (!manyToOneItem) {
667
+ // 如果不是外键,则不能是Text, File
668
+ if (isFulltextIndex) {
669
+ (0, assert_1.default)(['Text', 'String'].includes(text2_1), "\u300C".concat(filename, "\u300D\u4E2D\u5168\u6587\u7D22\u5F15\u300C").concat(indexName, "\u300D\u5B9A\u4E49\u7684\u5C5E\u6027\u300C").concat(indexAttrName, "\u300D\u7C7B\u578B\u975E\u6CD5\uFF0C\u53EA\u80FD\u662FText/String"));
670
+ }
671
+ else {
672
+ (0, assert_1.default)(!DataType_1.unIndexedTypes.includes(text2_1), "\u300C".concat(filename, "\u300D\u4E2D\u7D22\u5F15\u300C").concat(indexName, "\u300D\u7684\u5C5E\u6027\u300C").concat(indexAttrName, "\u300D\u7684\u7C7B\u578B\u4E3A\u300C").concat(text2_1, "\u300D\uFF0C\u4E0D\u53EF\u7D22\u5F15"));
673
+ }
674
+ }
675
+ else {
676
+ (0, assert_1.default)(!isFulltextIndex, "\u300C".concat(filename, "\u300D\u4E2D\u5168\u6587\u7D22\u5F15\u300C").concat(indexName, "\u300D\u7684\u5C5E\u6027\u300C").concat(indexAttrName, "\u300D\u7C7B\u578B\u975E\u6CD5\uFF0C\u53EA\u80FD\u4E3AText/String"));
677
+ }
678
+ }
679
+ else {
680
+ (0, assert_1.default)(false); // 这是什么case,不确定
681
+ }
682
+ }
683
+ else {
684
+ (0, assert_1.default)(!isFulltextIndex, "\u300C".concat(filename, "\u300D\u4E2D\u5168\u6587\u7D22\u5F15\u300C").concat(indexName, "\u300D\u7684\u5C5E\u6027\u300C").concat(indexAttrName, "\u300D\u7C7B\u578B\u53EA\u80FD\u4E3AText/String"));
685
+ (0, assert_1.default)(ts.isUnionTypeNode(type) || ts.isLiteralTypeNode(type), "".concat(entity, "\u4E2D\u7D22\u5F15\u300C").concat(indexName, "\u300D\u7684\u5C5E\u6027").concat(name_1.text, "\u6709\u5B9A\u4E49\u975E\u6CD5"));
686
+ }
687
+ }
688
+ });
689
+ });
690
+ indexes = declaration.initializer;
691
+ }
692
+ else if (ts.isIdentifier(declaration.name) && declaration.name.text === 'locale') {
693
+ // locale定义
694
+ var type = declaration.type, initializer = declaration.initializer;
695
+ (0, assert_1.default)(ts.isObjectLiteralExpression(initializer));
696
+ (0, assert_1.default)(ts.isTypeReferenceNode(type) && ts.isIdentifier(type.typeName) && type.typeName.text === 'LocaleDef', 'locale定义的类型必须是LocaleDef');
697
+ var properties = initializer.properties;
698
+ (0, assert_1.default)(properties.length > 0, "".concat(filename, "\u81F3\u5C11\u9700\u8981\u6709\u4E00\u79CDlocale\u5B9A\u4E49"));
699
+ var allEnumStringAttrs = enumStringAttrs.concat(states);
700
+ var typeArguments = type.typeArguments;
701
+ (0, assert_1.default)(typeArguments &&
702
+ ts.isTypeReferenceNode(typeArguments[0])
703
+ && ts.isIdentifier(typeArguments[0].typeName) && typeArguments[0].typeName.text === 'Schema', "".concat(filename, "\u4E2D\u7F3A\u5C11locale\u5B9A\u4E49\uFF0C\u6216\u8005locale\u7C7B\u578B\u5B9A\u4E49\u7684\u7B2C\u4E00\u4E2A\u53C2\u6570\u4E0D\u662FSchema"));
704
+ if (hasActionDef) {
705
+ (0, assert_1.default)(ts.isTypeReferenceNode(typeArguments[1])
706
+ && ts.isIdentifier(typeArguments[1].typeName) && typeArguments[1].typeName.text === 'Action', "".concat(filename, "\u4E2Dlocale\u7C7B\u578B\u5B9A\u4E49\u7684\u7B2C\u4E8C\u4E2A\u53C2\u6570\u4E0D\u662FAction"));
707
+ // 检查每种locale定义中都应该有'action'域
708
+ checkLocaleExpressionPropertyExists(initializer, 'action', true, filename);
709
+ }
710
+ else {
711
+ (0, assert_1.default)(ts.isLiteralTypeNode(typeArguments[1])
712
+ && ts.isStringLiteral(typeArguments[1].literal), "".concat(filename, "\u4E2Dlocale\u7C7B\u578B\u5B9A\u4E49\u7684\u7B2C\u4E8C\u4E2A\u53C2\u6570\u4E0D\u662F\u5B57\u7B26\u4E32"));
713
+ checkLocaleExpressionPropertyExists(initializer, 'action', false, filename);
714
+ }
715
+ if (hasRelationDef) {
716
+ (0, assert_1.default)(ts.isTypeReferenceNode(typeArguments[2])
717
+ && ts.isIdentifier(typeArguments[2].typeName)
718
+ && typeArguments[2].typeName.text === 'Relation', "".concat(filename, "\u4E2D\u7684locale\u7C7B\u578B\u5B9A\u4E49\u7684\u7B2C\u4E09\u4E2A\u53C2\u6570\u4E0D\u662FRelation"));
719
+ // 检查每种locale定义中都应该有'r'域
720
+ checkLocaleExpressionPropertyExists(initializer, 'r', true, filename);
721
+ }
722
+ else {
723
+ (0, assert_1.default)(ts.isLiteralTypeNode(typeArguments[2])
724
+ && ts.isStringLiteral(typeArguments[2].literal), "".concat(filename, "\u4E2Dlocale\u7C7B\u578B\u5B9A\u4E49\u7684\u7B2C\u4E09\u4E2A\u53C2\u6570\u4E0D\u662F\u7A7A\u5B57\u7B26\u4E32"));
725
+ checkLocaleExpressionPropertyExists(initializer, 'r', false, filename);
726
+ }
727
+ if (allEnumStringAttrs.length > 0) {
728
+ (0, assert_1.default)(ts.isTypeLiteralNode(typeArguments[3]), "".concat(filename, "\u4E2D\u7684locale\u7C7B\u578B\u5B9A\u4E49\u7684\u7B2C\u56DB\u4E2A\u53C2\u6570\u4E0D\u662F{}"));
729
+ checkLocaleEnumAttrs(typeArguments[3], allEnumStringAttrs, filename);
730
+ // 检查每种locale定义中都应该有'v'域
731
+ checkLocaleExpressionPropertyExists(initializer, 'v', true, filename);
732
+ }
733
+ else {
734
+ (0, assert_1.default)(ts.isTypeLiteralNode(typeArguments[3]), "".concat(filename, "\u4E2D\u7684locale\u7C7B\u578B\u5B9A\u4E49\u7684\u7B2C\u56DB\u4E2A\u53C2\u6570\u4E0D\u662F{}"));
735
+ (0, assert_1.default)(typeArguments[3].members.length == 0, "".concat(filename, "\u4E2Dlocale\u7C7B\u578B\u5B9A\u4E49\u7684\u7B2C\u56DB\u4E2A\u53C2\u6570\u4E0D\u5E94\u5B58\u5728\u76F8\u5E94\u7684v\u5B9A\u4E49"));
736
+ // 检查每种locale定义中都应该有'v'域
737
+ checkLocaleExpressionPropertyExists(initializer, 'v', false, filename);
738
+ }
739
+ localeDef = initializer;
740
+ }
741
+ else {
742
+ throw new Error("\u4E0D\u80FD\u7406\u89E3\u7684\u5B9A\u4E49\u5185\u5BB9".concat(declaration.name.getText()));
743
+ }
744
+ });
745
+ }
746
+ });
747
+ if (hasActionDef && !hasActionTypeAliasDeclaration) {
748
+ throw new Error("".concat(filename, "\u4E2D\u6709Action\u5B9A\u4E49\uFF0C\u4F46\u6CA1\u6709\u5B9A\u4E49\u540D\u4E3AAction\u7684\u7C7B\u578B"));
749
+ }
750
+ (0, assert_1.default)(schemaAttrs.length > 0);
751
+ var schema = {
752
+ schemaAttrs: schemaAttrs,
753
+ sourceFile: sourceFile,
754
+ };
755
+ if (hasFulltextIndex) {
756
+ (0, lodash_1.assign)(schema, {
757
+ fulltextIndex: true,
758
+ });
759
+ }
760
+ if (indexes) {
761
+ (0, lodash_1.assign)(schema, {
762
+ indexes: indexes,
763
+ });
764
+ }
765
+ if (!localeDef) {
766
+ throw new Error("".concat(filename, "\u4E2D\u7F3A\u5C11\u4E86locale\u5B9A\u4E49"));
767
+ }
768
+ else {
769
+ (0, lodash_1.assign)(schema, {
770
+ locale: localeDef,
771
+ });
772
+ }
773
+ (0, lodash_1.assign)(Schema, (_a = {},
774
+ _a[moduleName] = schema,
775
+ _a));
776
+ }
777
+ /**
778
+ * 生成Schema
779
+ * @param statements
780
+ * @param schemaAttrs
781
+ * @param entity
782
+ */
783
+ function constructSchema(statements, entity) {
784
+ var e_1, _a, e_2, _b;
785
+ var schemaAttrs = Schema[entity].schemaAttrs;
786
+ var members = [
787
+ // id: String<64>
788
+ factory.createPropertySignature(undefined, factory.createIdentifier('id'), undefined, factory.createTypeReferenceNode(factory.createIdentifier('PrimaryKey'))),
789
+ // $$createAt$$: Datetime
790
+ factory.createPropertySignature(undefined, factory.createIdentifier('$$createAt$$'), undefined, factory.createTypeReferenceNode(factory.createIdentifier('Datetime'))),
791
+ // $$updateAt$$: Datetime
792
+ factory.createPropertySignature(undefined, factory.createIdentifier('$$updateAt$$'), undefined, factory.createTypeReferenceNode(factory.createIdentifier('Datetime'))),
793
+ // $$updateAt$$: Datetime
794
+ factory.createPropertySignature(undefined, factory.createIdentifier('$$deleteAt$$'), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([
795
+ factory.createTypeReferenceNode(factory.createIdentifier('Datetime')),
796
+ factory.createLiteralTypeNode(factory.createNull())
797
+ ]))
798
+ ];
799
+ var members2 = [];
800
+ var _c = ManyToOne, _d = entity, manyToOneSet = _c[_d];
801
+ var _e = OneToMany, _f = entity, oneToManySet = _e[_f];
802
+ var referenceEntities = [];
803
+ var _loop_1 = function (attr) {
804
+ var type = attr.type, name_2 = attr.name, questionToken = attr.questionToken;
805
+ var attrName = name_2.text;
806
+ if (ts.isTypeReferenceNode(type)) {
807
+ var typeName = type.typeName;
808
+ if (ts.isIdentifier(typeName)) {
809
+ var text = typeName.text;
810
+ var text2_2 = text === 'Schema' ? entity : text;
811
+ var manyToOneItem = manyToOneSet && manyToOneSet.find(function (_a) {
812
+ var _b = __read(_a, 2), refEntity = _b[0], attrName = _b[1];
813
+ return refEntity === text2_2 && attrName === attrName;
814
+ });
815
+ if (manyToOneItem) {
816
+ referenceEntities.push(text2_2);
817
+ members2.push(factory.createPropertySignature(undefined, name_2, questionToken, questionToken ? factory.createUnionTypeNode([
818
+ factory.createTypeReferenceNode(createForeignRef(entity, text2_2, 'Schema')),
819
+ factory.createLiteralTypeNode(factory.createNull())
820
+ ]) : factory.createTypeReferenceNode(createForeignRef(entity, text2_2, 'Schema'))));
821
+ var foreignKey = "".concat(attrName, "Id");
822
+ members.push(factory.createPropertySignature(undefined, factory.createIdentifier(foreignKey), questionToken, questionToken ? factory.createUnionTypeNode([
823
+ factory.createTypeReferenceNode(factory.createIdentifier('ForeignKey'), [
824
+ factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(text2_2)))
825
+ ]),
826
+ factory.createLiteralTypeNode(factory.createNull())
827
+ ]) : factory.createTypeReferenceNode(factory.createIdentifier('ForeignKey'), [
828
+ factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(text2_2)))
829
+ ])));
830
+ }
831
+ else {
832
+ // assert(types.includes(text), `${entity}中的属性${name.toString()}有非法的属性类型定义`);
833
+ // 处理entity这种特殊情况
834
+ if (ReversePointerRelations[entity] && attrName === 'entity') {
835
+ var entityUnionTypeNode = ReversePointerRelations[entity].map(function (ele) { return factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(ele))); });
836
+ if (process.env.COMPLING_AS_LIB) {
837
+ // 如果是建立 base-domain,还要容纳可能的其它对象引用
838
+ entityUnionTypeNode.push(factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword));
839
+ }
840
+ members.push(factory.createPropertySignature(undefined, name_2, questionToken, questionToken ? factory.createUnionTypeNode([
841
+ factory.createUnionTypeNode(entityUnionTypeNode),
842
+ factory.createLiteralTypeNode(factory.createNull())
843
+ ]) : factory.createUnionTypeNode(entityUnionTypeNode)));
844
+ }
845
+ else {
846
+ members.push(factory.createPropertySignature(undefined, name_2, questionToken, questionToken ? factory.createUnionTypeNode([
847
+ type,
848
+ factory.createLiteralTypeNode(factory.createNull())
849
+ ]) : type));
850
+ }
851
+ }
852
+ }
853
+ else {
854
+ (0, assert_1.default)(false); // 这是什么case,不确定
855
+ members.push(attr);
856
+ }
857
+ }
858
+ else {
859
+ (0, assert_1.default)(ts.isUnionTypeNode(type) || ts.isLiteralTypeNode(type), "".concat(entity, "\u6709\u975E\u6CD5\u7684\u5C5E\u6027\u7C7B\u578B\u5B9A\u4E49").concat(name_2.text));
860
+ members.push(factory.createPropertySignature(undefined, name_2, questionToken, questionToken ? factory.createUnionTypeNode([
861
+ type,
862
+ factory.createLiteralTypeNode(factory.createNull())
863
+ ]) : type));
864
+ }
865
+ };
866
+ try {
867
+ for (var schemaAttrs_1 = __values(schemaAttrs), schemaAttrs_1_1 = schemaAttrs_1.next(); !schemaAttrs_1_1.done; schemaAttrs_1_1 = schemaAttrs_1.next()) {
868
+ var attr = schemaAttrs_1_1.value;
869
+ _loop_1(attr);
870
+ }
871
+ }
872
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
873
+ finally {
874
+ try {
875
+ if (schemaAttrs_1_1 && !schemaAttrs_1_1.done && (_a = schemaAttrs_1.return)) _a.call(schemaAttrs_1);
876
+ }
877
+ finally { if (e_1) throw e_1.error; }
878
+ }
879
+ // 处理reverserPointer
880
+ var reverseOnes = ReversePointerRelations[entity];
881
+ if (reverseOnes) {
882
+ reverseOnes.forEach(function (one) {
883
+ referenceEntities.push(one);
884
+ members2.push(factory.createPropertySignature(undefined, (0, string_1.firstLetterLowerCase)(one), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'Schema'))));
885
+ });
886
+ }
887
+ var foreignKeySet = {};
888
+ if (oneToManySet) {
889
+ try {
890
+ for (var oneToManySet_1 = __values(oneToManySet), oneToManySet_1_1 = oneToManySet_1.next(); !oneToManySet_1_1.done; oneToManySet_1_1 = oneToManySet_1.next()) {
891
+ var oneToManyItem = oneToManySet_1_1.value;
892
+ var _g = __read(oneToManyItem, 2), entityName = _g[0], foreignKey = _g[1];
893
+ if (referenceEntities.indexOf(entityName) === -1) {
894
+ referenceEntities.push(entityName);
895
+ }
896
+ if (foreignKeySet.hasOwnProperty(entityName)) {
897
+ foreignKeySet[entityName].push(foreignKey);
898
+ }
899
+ else {
900
+ foreignKeySet[entityName] = [foreignKey];
901
+ }
902
+ }
903
+ }
904
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
905
+ finally {
906
+ try {
907
+ if (oneToManySet_1_1 && !oneToManySet_1_1.done && (_b = oneToManySet_1.return)) _b.call(oneToManySet_1);
908
+ }
909
+ finally { if (e_2) throw e_2.error; }
910
+ }
911
+ var _loop_2 = function (entityName) {
912
+ var entityNameLc = (0, string_1.firstLetterLowerCase)(entityName);
913
+ foreignKeySet[entityName].forEach(function (foreignKey) {
914
+ var identifier = "".concat(entityNameLc, "$").concat(foreignKey);
915
+ members2.push(factory.createPropertySignature(undefined, identifier, factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(factory.createIdentifier("Array"), [factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Schema'), undefined)])));
916
+ });
917
+ };
918
+ for (var entityName in foreignKeySet) {
919
+ _loop_2(entityName);
920
+ }
921
+ }
922
+ (0, lodash_1.uniq)(referenceEntities).forEach(function (ele) {
923
+ if (ele !== entity) {
924
+ statements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamespaceImport(factory.createIdentifier(ele))), factory.createStringLiteral("../".concat(ele, "/Schema"))));
925
+ }
926
+ });
927
+ // 在这里把需要直接拷贝过来的语句写入
928
+ if (SchemaAsts[entity]) {
929
+ statements.push.apply(statements, __spreadArray([], __read(SchemaAsts[entity].statements), false));
930
+ }
931
+ // if (keys(foreignKeySet).length > 0) {
932
+ // for (const fkItem in foreignKeySet) {
933
+ // const entityLc = fkItem.slice(0, 1).toLowerCase().concat(fkItem.slice(1));
934
+ // const foreignKeys = [];
935
+ // /* statements.push(
936
+ // factory.createTypeAliasDeclaration(
937
+ // undefined,
938
+ // undefined,
939
+ // factory.createIdentifier(`${fkItem}s`),
940
+ // undefined,
941
+ // factory.createTemplateLiteralType(
942
+ // factory.createTemplateHead(
943
+ // `${entityLc}s$`,
944
+ // `${entityLc}s$`
945
+ // ),
946
+ // [factory.createTemplateLiteralTypeSpan(
947
+ // factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
948
+ // factory.createTemplateTail(
949
+ // "",
950
+ // ""
951
+ // )
952
+ // )]
953
+ // )
954
+ // )
955
+ // ); */
956
+ // for (let iter = 1; iter < 11; iter++) {
957
+ // foreignKeys.push(`${entityLc}s$${iter}`);
958
+ // }
959
+ // statements.push(
960
+ // factory.createTypeAliasDeclaration(
961
+ // undefined,
962
+ // undefined,
963
+ // factory.createIdentifier(`${fkItem}s`),
964
+ // undefined,
965
+ // factory.createUnionTypeNode(
966
+ // foreignKeys.map(
967
+ // ele => factory.createLiteralTypeNode(factory.createStringLiteral(ele))
968
+ // )
969
+ // )
970
+ // )
971
+ // );
972
+ // }
973
+ // }
974
+ statements.push(factory.createTypeAliasDeclaration(undefined, [
975
+ factory.createModifier(ts.SyntaxKind.ExportKeyword)
976
+ ], factory.createIdentifier('OpSchema'), undefined, factory.createTypeLiteralNode(members)), factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("OpAttr"), undefined, factory.createTypeOperatorNode(ts.SyntaxKind.KeyOfKeyword, factory.createTypeReferenceNode(factory.createIdentifier("OpSchema"), undefined))));
977
+ statements.push(factory.createTypeAliasDeclaration(undefined, [
978
+ factory.createModifier(ts.SyntaxKind.ExportKeyword)
979
+ ], factory.createIdentifier('Schema'), undefined, factory.createIntersectionTypeNode([
980
+ factory.createTypeLiteralNode(members.concat(members2)),
981
+ factory.createMappedTypeNode(undefined, factory.createTypeParameterDeclaration(factory.createIdentifier("A"), factory.createTypeReferenceNode(factory.createIdentifier("ExpressionKey"), undefined), undefined), undefined, factory.createToken(ts.SyntaxKind.QuestionToken), factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), undefined)
982
+ ])));
983
+ }
984
+ /**
985
+ * 生成Query
986
+ * @param statements
987
+ * @param schemaAttrs
988
+ * @param entity
989
+ */
990
+ function constructFilter(statements, entity) {
991
+ var e_3, _a;
992
+ var _b = Schema[entity], schemaAttrs = _b.schemaAttrs, fulltextIndex = _b.fulltextIndex;
993
+ var members = [
994
+ // id: Q_StringValue
995
+ factory.createPropertySignature(undefined, factory.createIdentifier('id'), undefined, factory.createUnionTypeNode([
996
+ factory.createTypeReferenceNode(factory.createIdentifier('Q_StringValue')),
997
+ factory.createTypeReferenceNode(factory.createQualifiedName(factory.createIdentifier("SubQuery"), factory.createIdentifier("".concat(entity, "IdSubQuery"))))
998
+ ])),
999
+ // $$createAt$$: Q_DateValue
1000
+ factory.createPropertySignature(undefined, factory.createIdentifier('$$createAt$$'), undefined, factory.createTypeReferenceNode(factory.createIdentifier('Q_DateValue'))),
1001
+ // $$updateAt$$: Q_DateValue
1002
+ factory.createPropertySignature(undefined, factory.createIdentifier('$$updateAt$$'), undefined, factory.createTypeReferenceNode(factory.createIdentifier('Q_DateValue')))
1003
+ ];
1004
+ var _c = ManyToOne, _d = entity, manyToOneSet = _c[_d];
1005
+ var _loop_3 = function (attr) {
1006
+ var _e = attr, type = _e.type, name_3 = _e.name;
1007
+ var attrName = name_3.text;
1008
+ if (ts.isTypeReferenceNode(type)) {
1009
+ var typeName = type.typeName;
1010
+ if (ts.isIdentifier(typeName)) {
1011
+ var text = typeName.text;
1012
+ var type2 = void 0;
1013
+ switch (text) {
1014
+ case 'String':
1015
+ case 'Text':
1016
+ case 'Image':
1017
+ case 'File': {
1018
+ if (ReversePointerRelations[entity] && attrName === 'entity') {
1019
+ type2 = factory.createTypeReferenceNode('E');
1020
+ }
1021
+ else {
1022
+ type2 = factory.createTypeReferenceNode(factory.createIdentifier('Q_StringValue'));
1023
+ }
1024
+ break;
1025
+ }
1026
+ case 'Int':
1027
+ case 'Float':
1028
+ case 'Double': {
1029
+ type2 = factory.createTypeReferenceNode(factory.createIdentifier('Q_NumberValue'));
1030
+ break;
1031
+ }
1032
+ case 'Boolean': {
1033
+ type2 = factory.createTypeReferenceNode(factory.createIdentifier('Q_BooleanValue'));
1034
+ break;
1035
+ }
1036
+ case 'Datetime': {
1037
+ type2 = factory.createTypeReferenceNode(factory.createIdentifier('Q_DateValue'));
1038
+ break;
1039
+ }
1040
+ case 'SingleGeo':
1041
+ case 'Geo':
1042
+ case 'Object': {
1043
+ // object类型暂不支持查询
1044
+ break;
1045
+ }
1046
+ default: {
1047
+ var text2_3 = text === 'Schema' ? entity : text;
1048
+ var manyToOneItem = manyToOneSet && manyToOneSet.find(function (_a) {
1049
+ var _b = __read(_a, 1), refEntity = _b[0];
1050
+ return refEntity === text2_3;
1051
+ });
1052
+ if (manyToOneItem) {
1053
+ // 外键可能落到相应的子查询中
1054
+ members.push(factory.createPropertySignature(undefined, "".concat(name_3.text, "Id"), undefined, factory.createUnionTypeNode([
1055
+ factory.createTypeReferenceNode(factory.createIdentifier('Q_StringValue')),
1056
+ factory.createTypeReferenceNode(factory.createQualifiedName(factory.createIdentifier("SubQuery"), factory.createIdentifier("".concat(text2_3, "IdSubQuery"))), undefined)
1057
+ ])));
1058
+ type2 = factory.createTypeReferenceNode(createForeignRef(entity, text2_3, 'Filter'));
1059
+ }
1060
+ else {
1061
+ // 这里应该都是引用某个UnionType类型的定义了,如何判断?
1062
+ // const words = getStringTextFromUnionStringLiterals();
1063
+ type2 = factory.createTypeReferenceNode(factory.createIdentifier('Q_EnumValue'), [
1064
+ factory.createTypeReferenceNode(factory.createIdentifier(text), undefined)
1065
+ ]);
1066
+ }
1067
+ }
1068
+ }
1069
+ if (type2) {
1070
+ members.push(factory.createPropertySignature(undefined, name_3, undefined, type2));
1071
+ }
1072
+ }
1073
+ }
1074
+ else if (ts.isUnionTypeNode(type) && ts.isLiteralTypeNode(type.types[0]) || ts.isLiteralTypeNode(type)) {
1075
+ members.push(factory.createPropertySignature(undefined, name_3, undefined, factory.createTypeReferenceNode(factory.createIdentifier('Q_EnumValue'), [
1076
+ type
1077
+ ])));
1078
+ }
1079
+ else {
1080
+ // 此时应当是引用本地定义的shape
1081
+ }
1082
+ };
1083
+ try {
1084
+ for (var schemaAttrs_2 = __values(schemaAttrs), schemaAttrs_2_1 = schemaAttrs_2.next(); !schemaAttrs_2_1.done; schemaAttrs_2_1 = schemaAttrs_2.next()) {
1085
+ var attr = schemaAttrs_2_1.value;
1086
+ _loop_3(attr);
1087
+ }
1088
+ }
1089
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
1090
+ finally {
1091
+ try {
1092
+ if (schemaAttrs_2_1 && !schemaAttrs_2_1.done && (_a = schemaAttrs_2.return)) _a.call(schemaAttrs_2);
1093
+ }
1094
+ finally { if (e_3) throw e_3.error; }
1095
+ }
1096
+ // type AttrFilter = {};
1097
+ var eumUnionTypeNode = ReversePointerRelations[entity] && ReversePointerRelations[entity].map(function (ele) { return factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(ele))); });
1098
+ if (process.env.COMPLING_AS_LIB) {
1099
+ eumUnionTypeNode && eumUnionTypeNode.push(factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword));
1100
+ }
1101
+ statements.push(factory.createTypeAliasDeclaration(undefined, undefined, factory.createIdentifier('AttrFilter'), ReversePointerRelations[entity] ? [
1102
+ factory.createTypeParameterDeclaration(factory.createIdentifier("E"), undefined)
1103
+ ] : undefined, factory.createTypeLiteralNode(members)));
1104
+ /**
1105
+ *
1106
+ export type Filter = AttrFilter | Partial<ExprOp<OpSchema> | {
1107
+ [F in Q_LogicKey]: Filter[];
1108
+ } | {
1109
+ [F in Q_FullTextKey]: Q_FullTextValue;
1110
+ }>;
1111
+
1112
+ */
1113
+ var types = [
1114
+ factory.createTypeReferenceNode(factory.createIdentifier("AttrFilter"), ReversePointerRelations[entity] ? [factory.createTypeReferenceNode('E')] : undefined),
1115
+ factory.createTypeReferenceNode(factory.createIdentifier("ExprOp"), [
1116
+ factory.createTypeReferenceNode(factory.createIdentifier('OpAttr'))
1117
+ ]),
1118
+ ];
1119
+ // 如果还有其它类型的查询如全文,则加在types数组中
1120
+ if (fulltextIndex) {
1121
+ types.push(factory.createTypeReferenceNode('FulltextFilter'));
1122
+ }
1123
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Filter"), ReversePointerRelations[entity] ? [
1124
+ factory.createTypeParameterDeclaration(factory.createIdentifier("E"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Q_EnumValue"), [
1125
+ factory.createUnionTypeNode(eumUnionTypeNode)
1126
+ ]))
1127
+ ] : undefined, factory.createTypeReferenceNode(factory.createIdentifier("MakeFilter"), [factory.createIntersectionTypeNode(types)])));
1128
+ }
1129
+ /**
1130
+ * 构造Projection和OneAttrProjection
1131
+ * @param statements
1132
+ * @param entity
1133
+ */
1134
+ function constructProjection(statements, entity) {
1135
+ var _a, e_4, _b, e_5, _c;
1136
+ var schemaAttrs = Schema[entity].schemaAttrs;
1137
+ var properties = [
1138
+ ['id', true],
1139
+ ['$$createAt$$', false],
1140
+ ['$$updateAt$$', false],
1141
+ ];
1142
+ var foreignKeyProperties = (_a = {},
1143
+ _a[entity] = [''],
1144
+ _a);
1145
+ var _d = ManyToOne, _e = entity, manyToOneSet = _d[_e];
1146
+ var _loop_4 = function (attr) {
1147
+ var _j;
1148
+ var _k = attr, type = _k.type, name_4 = _k.name;
1149
+ var attrName = name_4.text;
1150
+ if (ts.isTypeReferenceNode(type)) {
1151
+ var typeName = type.typeName;
1152
+ if (ts.isIdentifier(typeName)) {
1153
+ var text = typeName.text;
1154
+ switch (text) {
1155
+ case 'String':
1156
+ case 'Text':
1157
+ case 'Int':
1158
+ case 'Float':
1159
+ case 'Double':
1160
+ case 'Boolean':
1161
+ case 'Datetime':
1162
+ case 'Image':
1163
+ case 'File':
1164
+ case 'SingleGeo':
1165
+ case 'Geo':
1166
+ case 'Object': {
1167
+ properties.push([name_4, false]);
1168
+ break;
1169
+ }
1170
+ default: {
1171
+ var text2_4 = text === 'Schema' ? entity : text;
1172
+ var manyToOneItem = manyToOneSet && manyToOneSet.find(function (_a) {
1173
+ var _b = __read(_a, 1), refEntity = _b[0];
1174
+ return refEntity === text2_4;
1175
+ });
1176
+ if (manyToOneItem) {
1177
+ // 外键投影
1178
+ properties.push(["".concat(attrName, "Id"), false, undefined], [name_4, false, factory.createTypeReferenceNode(createForeignRef(entity, text2_4, 'Projection')), factory.createTypeReferenceNode(createForeignRef(entity, text2_4, 'ExportProjection'))]);
1179
+ if (foreignKeyProperties.hasOwnProperty(text2_4)) {
1180
+ foreignKeyProperties[text2_4].push(attrName);
1181
+ }
1182
+ else {
1183
+ (0, lodash_1.assign)(foreignKeyProperties, (_j = {},
1184
+ _j[text2_4] = [attrName],
1185
+ _j));
1186
+ }
1187
+ }
1188
+ else {
1189
+ // todo 此处是对State的专门处理
1190
+ if (text.endsWith('State')) {
1191
+ properties.push([name_4, false, undefined]);
1192
+ }
1193
+ else {
1194
+ // 引用的shape
1195
+ properties.push([name_4, false, undefined]);
1196
+ }
1197
+ }
1198
+ }
1199
+ }
1200
+ }
1201
+ else {
1202
+ (0, assert_1.default)(false);
1203
+ }
1204
+ }
1205
+ else {
1206
+ // 增加了本身object的shape定义
1207
+ // assert(ts.isUnionTypeNode(type!) && ts.isLiteralTypeNode(type.types[0]) || ts.isLiteralTypeNode(type!));
1208
+ properties.push([name_4, false, undefined]);
1209
+ }
1210
+ };
1211
+ try {
1212
+ for (var schemaAttrs_3 = __values(schemaAttrs), schemaAttrs_3_1 = schemaAttrs_3.next(); !schemaAttrs_3_1.done; schemaAttrs_3_1 = schemaAttrs_3.next()) {
1213
+ var attr = schemaAttrs_3_1.value;
1214
+ _loop_4(attr);
1215
+ }
1216
+ }
1217
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
1218
+ finally {
1219
+ try {
1220
+ if (schemaAttrs_3_1 && !schemaAttrs_3_1.done && (_b = schemaAttrs_3.return)) _b.call(schemaAttrs_3);
1221
+ }
1222
+ finally { if (e_4) throw e_4.error; }
1223
+ }
1224
+ if (ReversePointerRelations[entity]) {
1225
+ ReversePointerRelations[entity].forEach(function (one) {
1226
+ var _a;
1227
+ var text2 = one === 'Schema' ? entity : one;
1228
+ properties.push([(0, string_1.firstLetterLowerCase)(one), false, factory.createTypeReferenceNode(createForeignRef(entity, one, 'Projection')), factory.createTypeReferenceNode(createForeignRef(entity, one, 'ExportProjection'))]);
1229
+ if (foreignKeyProperties.hasOwnProperty(one)) {
1230
+ foreignKeyProperties[text2].push('entity');
1231
+ }
1232
+ else {
1233
+ (0, lodash_1.assign)(foreignKeyProperties, (_a = {},
1234
+ _a[text2] = ['entity'],
1235
+ _a));
1236
+ }
1237
+ });
1238
+ }
1239
+ // 一对多的projection
1240
+ var _f = OneToMany, _g = entity, oneToManySet = _f[_g];
1241
+ if (oneToManySet) {
1242
+ var foreignKeySet = {};
1243
+ try {
1244
+ for (var oneToManySet_2 = __values(oneToManySet), oneToManySet_2_1 = oneToManySet_2.next(); !oneToManySet_2_1.done; oneToManySet_2_1 = oneToManySet_2.next()) {
1245
+ var oneToManyItem = oneToManySet_2_1.value;
1246
+ var _h = __read(oneToManyItem, 2), entityName = _h[0], foreignKey = _h[1];
1247
+ if (foreignKeySet.hasOwnProperty(entityName)) {
1248
+ foreignKeySet[entityName].push(foreignKey);
1249
+ }
1250
+ else {
1251
+ foreignKeySet[entityName] = [foreignKey];
1252
+ }
1253
+ }
1254
+ }
1255
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
1256
+ finally {
1257
+ try {
1258
+ if (oneToManySet_2_1 && !oneToManySet_2_1.done && (_c = oneToManySet_2.return)) _c.call(oneToManySet_2);
1259
+ }
1260
+ finally { if (e_5) throw e_5.error; }
1261
+ }
1262
+ var _loop_5 = function (entityName) {
1263
+ var entityNameLc = (0, string_1.firstLetterLowerCase)(entityName);
1264
+ foreignKeySet[entityName].forEach(function (foreignKey) {
1265
+ var identifier = "".concat(entityNameLc, "$").concat(foreignKey);
1266
+ properties.push([identifier, false,
1267
+ factory.createIntersectionTypeNode([
1268
+ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Selection'), undefined),
1269
+ factory.createTypeLiteralNode([
1270
+ factory.createPropertySignature(undefined, factory.createIdentifier("$entity"), undefined, factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(entityName))))
1271
+ ])
1272
+ ]),
1273
+ factory.createIntersectionTypeNode([
1274
+ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Exportation'), undefined),
1275
+ factory.createTypeLiteralNode([
1276
+ factory.createPropertySignature(undefined, factory.createIdentifier("$entity"), undefined, factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(entityName))))
1277
+ ])
1278
+ ])
1279
+ ]);
1280
+ });
1281
+ };
1282
+ for (var entityName in foreignKeySet) {
1283
+ _loop_5(entityName);
1284
+ }
1285
+ }
1286
+ var exprNode = factory.createTypeReferenceNode(factory.createIdentifier("Partial"), [
1287
+ factory.createTypeReferenceNode(factory.createIdentifier("ExprOp"), [
1288
+ factory.createTypeReferenceNode(factory.createIdentifier("OpAttr"), undefined)
1289
+ ])
1290
+ ]);
1291
+ var MetaPropertySignaturs = [
1292
+ factory.createPropertySignature(undefined, factory.createStringLiteral("#id"), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode('NodeId'))
1293
+ ];
1294
+ if (process.env.COMPLING_AS_LIB) {
1295
+ MetaPropertySignaturs.push(factory.createIndexSignature(undefined, undefined, [factory.createParameterDeclaration(undefined, undefined, undefined, factory.createIdentifier("k"), undefined, factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), undefined)], factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)));
1296
+ }
1297
+ // Projection,正常查询的投影
1298
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Projection"), undefined, factory.createIntersectionTypeNode([
1299
+ factory.createTypeLiteralNode(MetaPropertySignaturs.concat(properties.map(function (_a) {
1300
+ var _b = __read(_a, 3), n = _b[0], q = _b[1], v = _b[2];
1301
+ return factory.createPropertySignature(undefined, n, q ? undefined : factory.createToken(ts.SyntaxKind.QuestionToken), v || factory.createLiteralTypeNode(factory.createNumericLiteral("1")));
1302
+ }))),
1303
+ exprNode,
1304
+ ])));
1305
+ // ExportProjection,下载查询的投影
1306
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("ExportProjection"), undefined, factory.createIntersectionTypeNode([
1307
+ factory.createTypeLiteralNode(MetaPropertySignaturs.concat(properties.map(function (_a) {
1308
+ var _b = __read(_a, 4), n = _b[0], q = _b[1], v = _b[2], v2 = _b[3];
1309
+ return factory.createPropertySignature(undefined, n, factory.createToken(ts.SyntaxKind.QuestionToken), v2 || factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword));
1310
+ }))),
1311
+ exprNode,
1312
+ ])));
1313
+ // ${Entity}Projection,外键查询的专用投影
1314
+ for (var foreignKey in foreignKeyProperties) {
1315
+ var identifier = "".concat(foreignKey, "IdProjection");
1316
+ statements.push(factory.createTypeAliasDeclaration(undefined, undefined, factory.createIdentifier(identifier), undefined, factory.createTypeReferenceNode(factory.createIdentifier("OneOf"), [
1317
+ factory.createTypeLiteralNode(foreignKeyProperties[foreignKey].map(function (attr) { return factory.createPropertySignature(undefined, attr ? factory.createIdentifier("".concat(attr, "Id")) : 'id', undefined, factory.createLiteralTypeNode(factory.createNumericLiteral("1"))); }))
1318
+ ])));
1319
+ }
1320
+ }
1321
+ /**
1322
+ * 构造Query
1323
+ * @param statements
1324
+ * @param entity
1325
+ */
1326
+ function constructQuery(statements, entity) {
1327
+ var entityLc = (0, string_1.firstLetterLowerCase)(entity);
1328
+ /* statements.push(
1329
+ factory.createTypeAliasDeclaration(
1330
+ undefined,
1331
+ [factory.createModifier(ts.SyntaxKind.ExportKeyword)],
1332
+ factory.createIdentifier("Query"),
1333
+ undefined,
1334
+ factory.createIntersectionTypeNode([
1335
+ factory.createTypeLiteralNode([
1336
+ // 这里可以不写entity了
1337
+ factory.createPropertySignature(
1338
+ undefined,
1339
+ factory.createIdentifier("projection"),
1340
+ undefined,
1341
+ factory.createTypeReferenceNode(
1342
+ factory.createIdentifier("Projection"),
1343
+ undefined
1344
+ )
1345
+ ),
1346
+ factory.createPropertySignature(
1347
+ undefined,
1348
+ factory.createIdentifier("sort"),
1349
+ factory.createToken(ts.SyntaxKind.QuestionToken),
1350
+ factory.createTypeReferenceNode(
1351
+ factory.createIdentifier("Sorter"),
1352
+ undefined
1353
+ )
1354
+ )
1355
+ ]),
1356
+ factory.createTypeReferenceNode(
1357
+ factory.createIdentifier("OakFilter"),
1358
+ [
1359
+ factory.createLiteralTypeNode(factory.createStringLiteral("select")),
1360
+ factory.createTypeReferenceNode(
1361
+ factory.createIdentifier("Filter"),
1362
+ undefined
1363
+ )
1364
+ ]
1365
+ ),
1366
+ factory.createTypeReferenceNode(
1367
+ factory.createIdentifier("OakOperation"),
1368
+ [
1369
+ factory.createTypeReferenceNode(
1370
+ factory.createIdentifier("Operation"),
1371
+ undefined
1372
+ )
1373
+ ]
1374
+ )
1375
+ ])
1376
+ )
1377
+ ); */
1378
+ /**
1379
+ * export type ExportQuery = {
1380
+ entity: 'user';
1381
+ projection: ExportProjection;
1382
+ filter?: Filter;
1383
+ sort?: Sorter;
1384
+ indexFrom?: number;
1385
+ count?: number;
1386
+ };
1387
+ */
1388
+ /* statements.push(
1389
+ factory.createTypeAliasDeclaration(
1390
+ undefined,
1391
+ [factory.createModifier(ts.SyntaxKind.ExportKeyword)],
1392
+ factory.createIdentifier("ExportQuery"),
1393
+ undefined,
1394
+ factory.createIntersectionTypeNode([
1395
+ factory.createTypeLiteralNode([
1396
+ factory.createPropertySignature(
1397
+ undefined,
1398
+ factory.createIdentifier("projection"),
1399
+ undefined,
1400
+ factory.createTypeReferenceNode(
1401
+ factory.createIdentifier("ExportProjection"),
1402
+ undefined
1403
+ )
1404
+ ),
1405
+ factory.createPropertySignature(
1406
+ undefined,
1407
+ factory.createIdentifier("sort"),
1408
+ factory.createToken(ts.SyntaxKind.QuestionToken),
1409
+ factory.createTypeReferenceNode(
1410
+ factory.createIdentifier("Sorter"),
1411
+ undefined
1412
+ )
1413
+ )
1414
+ ]),
1415
+ factory.createTypeReferenceNode(
1416
+ factory.createIdentifier("OakFilter"),
1417
+ [
1418
+ factory.createLiteralTypeNode(factory.createStringLiteral("select")),
1419
+ factory.createTypeReferenceNode(
1420
+ factory.createIdentifier("Filter"),
1421
+ undefined
1422
+ )
1423
+ ]
1424
+ )
1425
+ ])
1426
+ )
1427
+ ); */
1428
+ // 对每个可能的外键的子查询,建立相应的${Entity}IdSubQuery
1429
+ var _a = ManyToOne, _b = entity, manyToOneSet = _a[_b];
1430
+ var manyToSelf = false;
1431
+ if (manyToOneSet) {
1432
+ (0, lodash_1.uniqBy)(manyToOneSet, function (_a) {
1433
+ var _b = __read(_a, 1), a = _b[0];
1434
+ return a;
1435
+ }).forEach(function (_a) {
1436
+ var _b = __read(_a, 2), oneEntity = _b[0], foreignKey = _b[1];
1437
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("".concat(oneEntity, "IdSubQuery")), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Selection"), [factory.createTypeReferenceNode(factory.createIdentifier("".concat(oneEntity, "IdProjection")), undefined)])));
1438
+ if (oneEntity === entity) {
1439
+ manyToSelf = true;
1440
+ }
1441
+ });
1442
+ }
1443
+ // 主键可能产生的子查询
1444
+ if (!manyToSelf) {
1445
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("".concat(entity, "IdSubQuery")), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Selection"), [factory.createTypeReferenceNode(factory.createIdentifier("".concat(entity, "IdProjection")), undefined)])));
1446
+ }
1447
+ }
1448
+ /**
1449
+ * 构造Sort
1450
+ * @param statements
1451
+ * @param entity
1452
+ */
1453
+ function constructSorter(statements, entity) {
1454
+ var e_6, _a;
1455
+ var schemaAttrs = Schema[entity].schemaAttrs;
1456
+ var members = [
1457
+ // id: 1
1458
+ factory.createPropertySignature(undefined, factory.createIdentifier("id"), undefined, factory.createLiteralTypeNode(factory.createNumericLiteral("1"))),
1459
+ // $$createAt$$: 1
1460
+ factory.createPropertySignature(undefined, factory.createIdentifier('$$createAt$$'), undefined, factory.createLiteralTypeNode(factory.createNumericLiteral("1"))),
1461
+ // $$updateAt$$: 1
1462
+ factory.createPropertySignature(undefined, factory.createIdentifier('$$updateAt$$'), undefined, factory.createLiteralTypeNode(factory.createNumericLiteral("1")))
1463
+ ];
1464
+ var _b = ManyToOne, _c = entity, manyToOneSet = _b[_c];
1465
+ var _loop_6 = function (attr) {
1466
+ var _d = attr, type = _d.type, name_5 = _d.name, questionToken = _d.questionToken;
1467
+ if (ts.isTypeReferenceNode(type)) {
1468
+ var typeName = type.typeName;
1469
+ if (ts.isIdentifier(typeName)) {
1470
+ var text = typeName.text;
1471
+ var type2 = void 0;
1472
+ switch (text) {
1473
+ case 'String':
1474
+ case 'Text':
1475
+ case 'Int':
1476
+ case 'Float':
1477
+ case 'Double':
1478
+ case 'Boolean':
1479
+ case 'Datetime':
1480
+ case 'Image':
1481
+ case 'File': {
1482
+ type2 = factory.createLiteralTypeNode(factory.createNumericLiteral("1"));
1483
+ break;
1484
+ }
1485
+ default: {
1486
+ var text2_5 = text === 'Schema' ? entity : text;
1487
+ var manyToOneItem = manyToOneSet && manyToOneSet.find(function (_a) {
1488
+ var _b = __read(_a, 1), refEntity = _b[0];
1489
+ return refEntity === text2_5;
1490
+ });
1491
+ if (manyToOneItem) {
1492
+ type2 = factory.createTypeReferenceNode(createForeignRef(entity, text2_5, 'SortAttr'));
1493
+ members.push(factory.createPropertySignature(undefined, "".concat(name_5.text, "Id"), undefined, factory.createLiteralTypeNode(factory.createNumericLiteral("1"))));
1494
+ }
1495
+ else if (!['Object'].includes(text)) {
1496
+ // todo 对State的专门处理
1497
+ type2 = factory.createLiteralTypeNode(factory.createNumericLiteral("1"));
1498
+ }
1499
+ }
1500
+ }
1501
+ if (type2) {
1502
+ members.push(factory.createPropertySignature(undefined, name_5, undefined, type2));
1503
+ }
1504
+ }
1505
+ }
1506
+ else if (ts.isUnionTypeNode(type) && ts.isLiteralTypeNode(type.types[0]) || ts.isLiteralTypeNode(type)) {
1507
+ members.push(factory.createPropertySignature(undefined, name_5, undefined, factory.createLiteralTypeNode(factory.createNumericLiteral("1"))));
1508
+ }
1509
+ else {
1510
+ // 本地规定的shape,非结构化属性不参与排序
1511
+ }
1512
+ };
1513
+ try {
1514
+ for (var schemaAttrs_4 = __values(schemaAttrs), schemaAttrs_4_1 = schemaAttrs_4.next(); !schemaAttrs_4_1.done; schemaAttrs_4_1 = schemaAttrs_4.next()) {
1515
+ var attr = schemaAttrs_4_1.value;
1516
+ _loop_6(attr);
1517
+ }
1518
+ }
1519
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
1520
+ finally {
1521
+ try {
1522
+ if (schemaAttrs_4_1 && !schemaAttrs_4_1.done && (_a = schemaAttrs_4.return)) _a.call(schemaAttrs_4);
1523
+ }
1524
+ finally { if (e_6) throw e_6.error; }
1525
+ }
1526
+ if (ReversePointerRelations[entity]) {
1527
+ ReversePointerRelations[entity].forEach(function (one) {
1528
+ members.push(factory.createPropertySignature(undefined, (0, string_1.firstLetterLowerCase)(one), undefined, factory.createTypeReferenceNode(createForeignRef(entity, one, 'SortAttr'))));
1529
+ });
1530
+ if (process.env.COMPLING_AS_LIB) {
1531
+ members.push(factory.createIndexSignature(undefined, undefined, [factory.createParameterDeclaration(undefined, undefined, undefined, factory.createIdentifier("k"), undefined, factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), undefined)], factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)));
1532
+ }
1533
+ }
1534
+ /**
1535
+ *
1536
+ export type SortAttr = OneOf<{
1537
+ id: 1;
1538
+ name: 1;
1539
+ nickname: 1;
1540
+ age: 1;
1541
+ gender: 1;
1542
+ $$createAt$$: 1;
1543
+ $$updateAt$$: 1;
1544
+ } & Record<FnCallKey, 1 | FnCallValue<AttrFilter>>>;
1545
+ */
1546
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("SortAttr"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("OneOf"), [factory.createIntersectionTypeNode([
1547
+ factory.createTypeLiteralNode(members),
1548
+ factory.createTypeReferenceNode(factory.createIdentifier("ExprOp"), [
1549
+ factory.createTypeReferenceNode(factory.createIdentifier('OpAttr'))
1550
+ ])
1551
+ ])])));
1552
+ /**
1553
+ * export type SortNode = {
1554
+ $attr: SortAttr;
1555
+ $direction?: 'asc' | 'desc';
1556
+ };
1557
+ */
1558
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("SortNode"), undefined, factory.createTypeLiteralNode([
1559
+ factory.createPropertySignature(undefined, factory.createIdentifier("$attr"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("SortAttr"), undefined)),
1560
+ factory.createPropertySignature(undefined, factory.createIdentifier("$direction"), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([
1561
+ factory.createLiteralTypeNode(factory.createStringLiteral("asc")),
1562
+ factory.createLiteralTypeNode(factory.createStringLiteral("desc"))
1563
+ ]))
1564
+ ])));
1565
+ /**
1566
+ * export type Sorter = SortNode[];
1567
+ */
1568
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Sorter"), undefined, factory.createArrayTypeNode(factory.createTypeReferenceNode(factory.createIdentifier("SortNode"), undefined))));
1569
+ }
1570
+ function constructFullAttrs(statements, entity) {
1571
+ var e_7, _a, e_8, _b;
1572
+ var _c = ManyToOne, _d = entity, manyToOneSet = _c[_d];
1573
+ var _e = OneToMany, _f = entity, oneToManySet = _e[_f];
1574
+ if (manyToOneSet && manyToOneSet.length) {
1575
+ var mtoAttrs = [];
1576
+ try {
1577
+ for (var manyToOneSet_1 = __values(manyToOneSet), manyToOneSet_1_1 = manyToOneSet_1.next(); !manyToOneSet_1_1.done; manyToOneSet_1_1 = manyToOneSet_1.next()) {
1578
+ var item = manyToOneSet_1_1.value;
1579
+ var _g = __read(item, 2), one = _g[0], key = _g[1];
1580
+ if (one === entity) {
1581
+ // 递归引用自身,因为typescript本身不支持递归,因此这里做一个显式的三层递归应该够用了
1582
+ mtoAttrs.push(factory.createTemplateLiteralType(factory.createTemplateHead("".concat(key, "."), "".concat(key, ".")), [factory.createTemplateLiteralTypeSpan(factory.createTypeReferenceNode(factory.createIdentifier("OpAttr"), undefined), factory.createTemplateTail("", ""))]), factory.createTemplateLiteralType(factory.createTemplateHead("".concat(key, ".").concat(key, "."), "".concat(key, ".").concat(key, ".")), [factory.createTemplateLiteralTypeSpan(factory.createTypeReferenceNode(factory.createIdentifier("OpAttr"), undefined), factory.createTemplateTail("", ""))]), factory.createTemplateLiteralType(factory.createTemplateHead("".concat(key, ".").concat(key, ".").concat(key, "."), "".concat(key, ".").concat(key, ".").concat(key, ".")), [factory.createTemplateLiteralTypeSpan(factory.createTypeReferenceNode(factory.createIdentifier("OpAttr"), undefined), factory.createTemplateTail("", ""))]));
1583
+ }
1584
+ else {
1585
+ mtoAttrs.push(factory.createTemplateLiteralType(factory.createTemplateHead("".concat(key, "."), "".concat(key, ".")), [factory.createTemplateLiteralTypeSpan(factory.createTypeReferenceNode(factory.createQualifiedName(factory.createIdentifier(one), factory.createIdentifier("NativeAttr")), undefined), factory.createTemplateTail("", ""))
1586
+ ]));
1587
+ }
1588
+ }
1589
+ }
1590
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
1591
+ finally {
1592
+ try {
1593
+ if (manyToOneSet_1_1 && !manyToOneSet_1_1.done && (_a = manyToOneSet_1.return)) _a.call(manyToOneSet_1);
1594
+ }
1595
+ finally { if (e_7) throw e_7.error; }
1596
+ }
1597
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("NativeAttr"), undefined, factory.createUnionTypeNode(__spreadArray([
1598
+ factory.createTypeReferenceNode(factory.createIdentifier("OpAttr"), undefined)
1599
+ ], __read(mtoAttrs), false))));
1600
+ }
1601
+ else {
1602
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("NativeAttr"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("OpAttr"), undefined)));
1603
+ }
1604
+ var foreignKeySet = {};
1605
+ if (oneToManySet && oneToManySet.length > 0) {
1606
+ try {
1607
+ for (var oneToManySet_3 = __values(oneToManySet), oneToManySet_3_1 = oneToManySet_3.next(); !oneToManySet_3_1.done; oneToManySet_3_1 = oneToManySet_3.next()) {
1608
+ var oneToManyItem = oneToManySet_3_1.value;
1609
+ var _h = __read(oneToManyItem, 2), entityName = _h[0], foreignKey = _h[1];
1610
+ if (foreignKeySet.hasOwnProperty(entityName)) {
1611
+ foreignKeySet[entityName].push(foreignKey);
1612
+ }
1613
+ else {
1614
+ foreignKeySet[entityName] = [foreignKey];
1615
+ }
1616
+ }
1617
+ }
1618
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
1619
+ finally {
1620
+ try {
1621
+ if (oneToManySet_3_1 && !oneToManySet_3_1.done && (_b = oneToManySet_3.return)) _b.call(oneToManySet_3);
1622
+ }
1623
+ finally { if (e_8) throw e_8.error; }
1624
+ }
1625
+ var otmAttrs_1 = [];
1626
+ var _loop_7 = function (entityName) {
1627
+ var entityNameLc = (0, string_1.firstLetterLowerCase)(entityName);
1628
+ if (foreignKeySet[entityName].length > 1) {
1629
+ foreignKeySet[entityName].forEach(function (foreignKey) {
1630
+ var head = "".concat(entityNameLc, "s$").concat(foreignKey);
1631
+ otmAttrs_1.push(factory.createTemplateLiteralType(factory.createTemplateHead("".concat(head, "$"), "".concat(head, "$")), [
1632
+ factory.createTemplateLiteralTypeSpan(factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword), factory.createTemplateMiddle(".", ".")),
1633
+ factory.createTemplateLiteralTypeSpan(factory.createTypeReferenceNode(entityName === entity
1634
+ ? factory.createIdentifier("NativeAttr")
1635
+ : factory.createQualifiedName(factory.createIdentifier(entityName), factory.createIdentifier("NativeAttr")), undefined), factory.createTemplateTail("", ""))
1636
+ ]));
1637
+ });
1638
+ }
1639
+ else {
1640
+ otmAttrs_1.push(factory.createTemplateLiteralType(factory.createTemplateHead("".concat(entityNameLc, "s$"), "".concat(entityNameLc, "s$")), [
1641
+ factory.createTemplateLiteralTypeSpan(factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword), factory.createTemplateMiddle(".", ".")),
1642
+ factory.createTemplateLiteralTypeSpan(factory.createTypeReferenceNode(entityName === entity
1643
+ ? factory.createIdentifier("NativeAttr")
1644
+ : factory.createQualifiedName(factory.createIdentifier(entityName), factory.createIdentifier("NativeAttr")), undefined), factory.createTemplateTail("", ""))
1645
+ ]));
1646
+ }
1647
+ };
1648
+ for (var entityName in foreignKeySet) {
1649
+ _loop_7(entityName);
1650
+ }
1651
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("FullAttr"), undefined, factory.createUnionTypeNode(__spreadArray([
1652
+ factory.createTypeReferenceNode(factory.createIdentifier("NativeAttr"), undefined)
1653
+ ], __read(otmAttrs_1), false))));
1654
+ }
1655
+ else {
1656
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("FullAttr"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("NativeAttr"), undefined)));
1657
+ }
1658
+ }
1659
+ function constructActions(statements, entity) {
1660
+ var e_9, _a, e_10, _b, e_11, _c, e_12, _d, e_13, _e, e_14, _f, e_15, _g, e_16, _h, e_17, _j;
1661
+ // Selection
1662
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("SelectOperation"), [
1663
+ factory.createTypeParameterDeclaration(factory.createIdentifier("P"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Projection"), undefined))
1664
+ ], factory.createTypeReferenceNode(factory.createIdentifier("OakOperation"), [
1665
+ factory.createLiteralTypeNode(factory.createStringLiteral("select")),
1666
+ factory.createTypeReferenceNode(factory.createIdentifier("P"), undefined),
1667
+ factory.createTypeReferenceNode(factory.createIdentifier("Filter"), undefined),
1668
+ factory.createTypeReferenceNode(factory.createIdentifier("Sorter"), undefined)
1669
+ ])), factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Selection"), [
1670
+ factory.createTypeParameterDeclaration(factory.createIdentifier("P"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Projection"), undefined))
1671
+ ], factory.createTypeReferenceNode(factory.createIdentifier("Omit"), [
1672
+ factory.createTypeReferenceNode(factory.createIdentifier("SelectOperation"), [
1673
+ factory.createTypeReferenceNode(factory.createIdentifier("P"), undefined)
1674
+ ]),
1675
+ factory.createLiteralTypeNode(factory.createStringLiteral("action"))
1676
+ ])));
1677
+ // Exportation
1678
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Exportation"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("OakOperation"), [
1679
+ factory.createLiteralTypeNode(factory.createStringLiteral("export")),
1680
+ factory.createTypeReferenceNode(factory.createIdentifier("ExportProjection"), undefined),
1681
+ factory.createTypeReferenceNode(factory.createIdentifier("Filter"), undefined),
1682
+ factory.createTypeReferenceNode(factory.createIdentifier("Sorter"), undefined)
1683
+ ])));
1684
+ var _k = ManyToOne, _l = entity, manyToOneSet = _k[_l];
1685
+ var _m = OneToMany, _o = entity, oneToManySet = _m[_o];
1686
+ var foreignKeySet = {};
1687
+ if (oneToManySet) {
1688
+ try {
1689
+ for (var oneToManySet_4 = __values(oneToManySet), oneToManySet_4_1 = oneToManySet_4.next(); !oneToManySet_4_1.done; oneToManySet_4_1 = oneToManySet_4.next()) {
1690
+ var oneToManyItem = oneToManySet_4_1.value;
1691
+ var _p = __read(oneToManyItem, 2), entityName = _p[0], foreignKey = _p[1];
1692
+ if (foreignKeySet.hasOwnProperty(entityName)) {
1693
+ foreignKeySet[entityName].push(foreignKey);
1694
+ }
1695
+ else {
1696
+ foreignKeySet[entityName] = [foreignKey];
1697
+ }
1698
+ }
1699
+ }
1700
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
1701
+ finally {
1702
+ try {
1703
+ if (oneToManySet_4_1 && !oneToManySet_4_1.done && (_a = oneToManySet_4.return)) _a.call(oneToManySet_4);
1704
+ }
1705
+ finally { if (e_9) throw e_9.error; }
1706
+ }
1707
+ }
1708
+ // CreateOperationData
1709
+ var foreignKeyAttrNode = [];
1710
+ if (manyToOneSet) {
1711
+ try {
1712
+ for (var manyToOneSet_2 = __values(manyToOneSet), manyToOneSet_2_1 = manyToOneSet_2.next(); !manyToOneSet_2_1.done; manyToOneSet_2_1 = manyToOneSet_2.next()) {
1713
+ var one = manyToOneSet_2_1.value;
1714
+ if (!ReversePointerRelations[entity] || !ReversePointerRelations[entity].includes(one[1])) {
1715
+ foreignKeyAttrNode.push(factory.createLiteralTypeNode(factory.createStringLiteral("".concat(one[1], "Id"))));
1716
+ }
1717
+ }
1718
+ }
1719
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
1720
+ finally {
1721
+ try {
1722
+ if (manyToOneSet_2_1 && !manyToOneSet_2_1.done && (_b = manyToOneSet_2.return)) _b.call(manyToOneSet_2);
1723
+ }
1724
+ finally { if (e_10) throw e_10.error; }
1725
+ }
1726
+ if (ReversePointerRelations[entity]) {
1727
+ foreignKeyAttrNode.push(factory.createLiteralTypeNode(factory.createStringLiteral('entity')), factory.createLiteralTypeNode(factory.createStringLiteral('entityId')));
1728
+ }
1729
+ }
1730
+ var adNodes = [
1731
+ factory.createTypeReferenceNode(factory.createIdentifier("FormCreateData"), [
1732
+ foreignKeyAttrNode.length > 0
1733
+ ? factory.createTypeReferenceNode(factory.createIdentifier("Omit"), [
1734
+ factory.createTypeReferenceNode(factory.createIdentifier("OpSchema"), undefined),
1735
+ factory.createUnionTypeNode(foreignKeyAttrNode)
1736
+ ])
1737
+ : factory.createTypeReferenceNode(factory.createIdentifier("OpSchema"), undefined)
1738
+ ])
1739
+ ];
1740
+ if (manyToOneSet) {
1741
+ /**
1742
+ * create的多对一有两种case
1743
+ * 如果关联对象是create,则对象的外键由关联对象的id决定
1744
+ * 如果关联对象是update,则关联对象的filter由对象决定其主键
1745
+ * 见cascadeStore
1746
+ */
1747
+ var upsertOneNodes = [];
1748
+ try {
1749
+ for (var manyToOneSet_3 = __values(manyToOneSet), manyToOneSet_3_1 = manyToOneSet_3.next(); !manyToOneSet_3_1.done; manyToOneSet_3_1 = manyToOneSet_3.next()) {
1750
+ var one = manyToOneSet_3_1.value;
1751
+ if (!ReversePointerRelations[entity] || !ReversePointerRelations[entity].includes(one[0])) {
1752
+ upsertOneNodes.push(factory.createUnionTypeNode([
1753
+ factory.createTypeLiteralNode([
1754
+ factory.createPropertySignature(undefined, factory.createIdentifier("".concat(one[1], "Id")), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([
1755
+ factory.createKeywordTypeNode(ts.SyntaxKind.NeverKeyword),
1756
+ factory.createLiteralTypeNode(factory.createNull())
1757
+ ])),
1758
+ factory.createPropertySignature(undefined, factory.createIdentifier(one[1]), one[2] ? factory.createToken(ts.SyntaxKind.QuestionToken) : undefined, factory.createTypeReferenceNode(createForeignRef(entity, one[0], 'CreateSingleOperation')))
1759
+ ]),
1760
+ factory.createTypeLiteralNode([
1761
+ factory.createPropertySignature(undefined, factory.createIdentifier("".concat(one[1], "Id")), one[2] ? factory.createToken(ts.SyntaxKind.QuestionToken) : undefined, factory.createTypeReferenceNode(factory.createIdentifier("String"), [factory.createLiteralTypeNode(factory.createNumericLiteral("64"))])),
1762
+ factory.createPropertySignature(undefined, factory.createIdentifier(one[1]), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one[0], 'UpdateOperation')))
1763
+ ])
1764
+ ]));
1765
+ }
1766
+ }
1767
+ }
1768
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
1769
+ finally {
1770
+ try {
1771
+ if (manyToOneSet_3_1 && !manyToOneSet_3_1.done && (_c = manyToOneSet_3.return)) _c.call(manyToOneSet_3);
1772
+ }
1773
+ finally { if (e_11) throw e_11.error; }
1774
+ }
1775
+ var reverseOneNodes = [];
1776
+ if (ReversePointerRelations[entity]) {
1777
+ try {
1778
+ for (var _q = __values(ReversePointerRelations[entity]), _r = _q.next(); !_r.done; _r = _q.next()) {
1779
+ var one = _r.value;
1780
+ reverseOneNodes.push(factory.createTypeLiteralNode([
1781
+ factory.createPropertySignature(undefined, factory.createIdentifier('entity'), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createKeywordTypeNode(ts.SyntaxKind.NeverKeyword)),
1782
+ factory.createPropertySignature(undefined, factory.createIdentifier('entityId'), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createKeywordTypeNode(ts.SyntaxKind.NeverKeyword)),
1783
+ factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(one)), undefined, // 反向指针好像不能为空,以后或许会有特例 by Xc
1784
+ factory.createTypeReferenceNode(createForeignRef(entity, one, 'CreateSingleOperation')))
1785
+ ]), factory.createTypeLiteralNode([
1786
+ factory.createPropertySignature(undefined, factory.createIdentifier('entity'), undefined, // 反向指针好像不能为空,以后或许会有特例 by Xc
1787
+ factory.createLiteralTypeNode(factory.createStringLiteral("".concat((0, string_1.firstLetterLowerCase)(one))))),
1788
+ factory.createPropertySignature(undefined, factory.createIdentifier('entityId'), undefined, // 反向指针好像不能为空,以后或许会有特例 by Xc
1789
+ factory.createTypeReferenceNode(factory.createIdentifier("String"), [factory.createLiteralTypeNode(factory.createNumericLiteral("64"))])),
1790
+ factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'UpdateOperation')))
1791
+ ]));
1792
+ }
1793
+ }
1794
+ catch (e_12_1) { e_12 = { error: e_12_1 }; }
1795
+ finally {
1796
+ try {
1797
+ if (_r && !_r.done && (_d = _q.return)) _d.call(_q);
1798
+ }
1799
+ finally { if (e_12) throw e_12.error; }
1800
+ }
1801
+ if (process.env.COMPLING_AS_LIB) {
1802
+ // 如果是base,要包容更多可能的反指
1803
+ reverseOneNodes.push(factory.createTypeLiteralNode([
1804
+ factory.createIndexSignature(undefined, undefined, [factory.createParameterDeclaration(undefined, undefined, undefined, factory.createIdentifier("K"), undefined, factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), undefined)], factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword))
1805
+ ]));
1806
+ }
1807
+ }
1808
+ if (upsertOneNodes.length > 0) {
1809
+ adNodes.push(factory.createIntersectionTypeNode(upsertOneNodes));
1810
+ }
1811
+ if (reverseOneNodes.length > 0) {
1812
+ adNodes.push(factory.createUnionTypeNode(reverseOneNodes));
1813
+ }
1814
+ }
1815
+ // 一对多
1816
+ var propertySignatures = [];
1817
+ if (process.env.COMPLING_AS_LIB) {
1818
+ propertySignatures.push(factory.createIndexSignature(undefined, undefined, [factory.createParameterDeclaration(undefined, undefined, undefined, factory.createIdentifier("k"), undefined, factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), undefined)], factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)));
1819
+ }
1820
+ if (oneToManySet) {
1821
+ var _loop_8 = function (entityName) {
1822
+ var entityNameLc = (0, string_1.firstLetterLowerCase)(entityName);
1823
+ foreignKeySet[entityName].forEach(function (foreignKey) {
1824
+ var identifier = "".concat(entityNameLc, "$").concat(foreignKey);
1825
+ var otmCreateOperationDataNode = factory.createTypeReferenceNode(factory.createIdentifier("Omit"), [
1826
+ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'CreateOperationData'), undefined),
1827
+ factory.createUnionTypeNode(foreignKey === 'entity' ? [
1828
+ factory.createLiteralTypeNode(factory.createStringLiteral("entity")),
1829
+ factory.createLiteralTypeNode(factory.createStringLiteral("entityId"))
1830
+ ] : [
1831
+ factory.createLiteralTypeNode(factory.createStringLiteral(foreignKey)),
1832
+ factory.createLiteralTypeNode(factory.createStringLiteral("".concat(foreignKey, "Id")))
1833
+ ])
1834
+ ]);
1835
+ var otmCreateOperationNode = factory.createTypeReferenceNode(factory.createIdentifier("OakOperation"), [
1836
+ factory.createLiteralTypeNode(factory.createStringLiteral("create")),
1837
+ factory.createUnionTypeNode([
1838
+ otmCreateOperationDataNode,
1839
+ factory.createArrayTypeNode(otmCreateOperationDataNode)
1840
+ ])
1841
+ ]);
1842
+ var otmUpdateOperationNode = factory.createTypeReferenceNode(factory.createIdentifier("OakOperation"), [
1843
+ factory.createLiteralTypeNode(factory.createStringLiteral("update")),
1844
+ factory.createTypeReferenceNode(factory.createIdentifier("Omit"), [
1845
+ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'UpdateOperationData'), undefined),
1846
+ factory.createUnionTypeNode(foreignKey === 'entity' ? [
1847
+ factory.createLiteralTypeNode(factory.createStringLiteral("entity")),
1848
+ factory.createLiteralTypeNode(factory.createStringLiteral("entityId"))
1849
+ ] : [
1850
+ factory.createLiteralTypeNode(factory.createStringLiteral(foreignKey)),
1851
+ factory.createLiteralTypeNode(factory.createStringLiteral("".concat(foreignKey, "Id")))
1852
+ ])
1853
+ ]),
1854
+ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'Filter'), undefined)
1855
+ ]);
1856
+ propertySignatures.push(factory.createPropertySignature(undefined, factory.createIdentifier(identifier), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([
1857
+ otmUpdateOperationNode,
1858
+ factory.createTypeReferenceNode(factory.createIdentifier("Array"), [factory.createUnionTypeNode([
1859
+ otmCreateOperationNode,
1860
+ otmUpdateOperationNode
1861
+ ])])
1862
+ ])));
1863
+ });
1864
+ };
1865
+ for (var entityName in foreignKeySet) {
1866
+ _loop_8(entityName);
1867
+ }
1868
+ }
1869
+ if (propertySignatures.length > 0) {
1870
+ adNodes.push(factory.createTypeLiteralNode(propertySignatures));
1871
+ }
1872
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("CreateOperationData"), undefined, factory.createIntersectionTypeNode(adNodes)));
1873
+ // CreateOperation
1874
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("CreateSingleOperation"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("OakOperation"), [
1875
+ factory.createLiteralTypeNode(factory.createStringLiteral("create")),
1876
+ factory.createTypeReferenceNode(factory.createIdentifier("CreateOperationData"))
1877
+ ])), factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("CreateMultipleOperation"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("OakOperation"), [
1878
+ factory.createLiteralTypeNode(factory.createStringLiteral("create")),
1879
+ factory.createTypeReferenceNode(factory.createIdentifier("Array"), [factory.createTypeReferenceNode(factory.createIdentifier("CreateOperationData"))])
1880
+ ])), factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("CreateOperation"), undefined, factory.createUnionTypeNode([
1881
+ factory.createTypeReferenceNode(factory.createIdentifier("CreateSingleOperation")),
1882
+ factory.createTypeReferenceNode(factory.createIdentifier("CreateMultipleOperation"))
1883
+ ])));
1884
+ // UpdateOperationData
1885
+ foreignKeyAttrNode = [];
1886
+ if (manyToOneSet) {
1887
+ try {
1888
+ for (var manyToOneSet_4 = __values(manyToOneSet), manyToOneSet_4_1 = manyToOneSet_4.next(); !manyToOneSet_4_1.done; manyToOneSet_4_1 = manyToOneSet_4.next()) {
1889
+ var one = manyToOneSet_4_1.value;
1890
+ if (!ReversePointerRelations[entity] || !ReversePointerRelations[entity].includes(one[1])) {
1891
+ foreignKeyAttrNode.push(factory.createLiteralTypeNode(factory.createStringLiteral("".concat(one[1], "Id"))));
1892
+ }
1893
+ }
1894
+ }
1895
+ catch (e_13_1) { e_13 = { error: e_13_1 }; }
1896
+ finally {
1897
+ try {
1898
+ if (manyToOneSet_4_1 && !manyToOneSet_4_1.done && (_e = manyToOneSet_4.return)) _e.call(manyToOneSet_4);
1899
+ }
1900
+ finally { if (e_13) throw e_13.error; }
1901
+ }
1902
+ if (ReversePointerRelations[entity]) {
1903
+ foreignKeyAttrNode.push(factory.createLiteralTypeNode(factory.createStringLiteral('entity')), factory.createLiteralTypeNode(factory.createStringLiteral('entityId')));
1904
+ }
1905
+ }
1906
+ adNodes = [
1907
+ factory.createTypeReferenceNode(factory.createIdentifier("FormUpdateData"), [
1908
+ foreignKeyAttrNode.length > 0 ? factory.createTypeReferenceNode(factory.createIdentifier("Omit"), [
1909
+ factory.createTypeReferenceNode(factory.createIdentifier("OpSchema"), undefined),
1910
+ factory.createUnionTypeNode(foreignKeyAttrNode)
1911
+ ]) : factory.createTypeReferenceNode(factory.createIdentifier("OpSchema"), undefined)
1912
+ ])
1913
+ ];
1914
+ if (manyToOneSet) {
1915
+ /**
1916
+ * update的多对一有三种case
1917
+ * 如果关联对象是create,则对象的外键由关联对象的id决定
1918
+ * 如果关联对象是update或者remove,则关联对象的filter由对象(的原行!注意这里的外键是不能变的!)决定其主键
1919
+ * 见cascadeStore
1920
+ */
1921
+ var upsertOneNodes = [];
1922
+ try {
1923
+ for (var manyToOneSet_5 = __values(manyToOneSet), manyToOneSet_5_1 = manyToOneSet_5.next(); !manyToOneSet_5_1.done; manyToOneSet_5_1 = manyToOneSet_5.next()) {
1924
+ var one = manyToOneSet_5_1.value;
1925
+ if (!ReversePointerRelations[entity] || !ReversePointerRelations[entity].includes(one[0])) {
1926
+ upsertOneNodes.push(factory.createUnionTypeNode([
1927
+ factory.createTypeLiteralNode([
1928
+ factory.createPropertySignature(undefined, factory.createIdentifier(one[1]), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([
1929
+ factory.createTypeReferenceNode(createForeignRef(entity, one[0], 'CreateSingleOperation')),
1930
+ factory.createTypeReferenceNode(createForeignRef(entity, one[0], 'UpdateOperation')),
1931
+ factory.createTypeReferenceNode(createForeignRef(entity, one[0], 'RemoveOperation'))
1932
+ ])),
1933
+ factory.createPropertySignature(undefined, factory.createIdentifier("".concat(one[1], "Id")), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)),
1934
+ ]),
1935
+ factory.createTypeLiteralNode([
1936
+ factory.createPropertySignature(undefined, factory.createIdentifier(one[1]), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)),
1937
+ factory.createPropertySignature(undefined, factory.createIdentifier("".concat(one[1], "Id")), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([
1938
+ factory.createTypeReferenceNode(factory.createIdentifier("String"), [factory.createLiteralTypeNode(factory.createNumericLiteral("64"))]),
1939
+ factory.createLiteralTypeNode(factory.createNull())
1940
+ ])),
1941
+ ])
1942
+ ]));
1943
+ }
1944
+ }
1945
+ }
1946
+ catch (e_14_1) { e_14 = { error: e_14_1 }; }
1947
+ finally {
1948
+ try {
1949
+ if (manyToOneSet_5_1 && !manyToOneSet_5_1.done && (_f = manyToOneSet_5.return)) _f.call(manyToOneSet_5);
1950
+ }
1951
+ finally { if (e_14) throw e_14.error; }
1952
+ }
1953
+ if (upsertOneNodes.length > 0) {
1954
+ adNodes.push(factory.createIntersectionTypeNode(upsertOneNodes));
1955
+ }
1956
+ var reverseOneNodes = [];
1957
+ if (ReversePointerRelations[entity]) {
1958
+ var refEntityLitrals = [];
1959
+ try {
1960
+ for (var _s = __values(ReversePointerRelations[entity]), _t = _s.next(); !_t.done; _t = _s.next()) {
1961
+ var one = _t.value;
1962
+ refEntityLitrals.push(factory.createLiteralTypeNode(factory.createStringLiteral("".concat((0, string_1.firstLetterLowerCase)(one)))));
1963
+ reverseOneNodes.push(factory.createTypeLiteralNode([
1964
+ factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([
1965
+ factory.createTypeReferenceNode(createForeignRef(entity, one, 'CreateSingleOperation')),
1966
+ factory.createTypeReferenceNode(createForeignRef(entity, one, 'UpdateOperation')),
1967
+ factory.createTypeReferenceNode(createForeignRef(entity, one, 'RemoveOperation'))
1968
+ ])),
1969
+ factory.createPropertySignature(undefined, factory.createIdentifier('entityId'), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)),
1970
+ factory.createPropertySignature(undefined, factory.createIdentifier('entity'), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword))
1971
+ ]));
1972
+ }
1973
+ }
1974
+ catch (e_15_1) { e_15 = { error: e_15_1 }; }
1975
+ finally {
1976
+ try {
1977
+ if (_t && !_t.done && (_g = _s.return)) _g.call(_s);
1978
+ }
1979
+ finally { if (e_15) throw e_15.error; }
1980
+ }
1981
+ if (process.env.COMPLING_AS_LIB) {
1982
+ // 如果是base,要包容更多可能的反指
1983
+ refEntityLitrals.push(factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword));
1984
+ }
1985
+ reverseOneNodes.push(factory.createTypeLiteralNode([
1986
+ factory.createPropertySignature(undefined, factory.createIdentifier('entity'), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([
1987
+ factory.createUnionTypeNode(refEntityLitrals),
1988
+ factory.createLiteralTypeNode(factory.createNull())
1989
+ ])),
1990
+ factory.createPropertySignature(undefined, factory.createIdentifier('entityId'), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([
1991
+ factory.createTypeReferenceNode(factory.createIdentifier("String"), [factory.createLiteralTypeNode(factory.createNumericLiteral("64"))]),
1992
+ factory.createLiteralTypeNode(factory.createNull())
1993
+ ]))
1994
+ ]));
1995
+ }
1996
+ if (reverseOneNodes.length > 0) {
1997
+ adNodes.push(factory.createUnionTypeNode(reverseOneNodes));
1998
+ }
1999
+ }
2000
+ var propertySignatures2 = [];
2001
+ if (process.env.COMPLING_AS_LIB) {
2002
+ propertySignatures2.push(factory.createIndexSignature(undefined, undefined, [factory.createParameterDeclaration(undefined, undefined, undefined, factory.createIdentifier("k"), undefined, factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), undefined)], factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)));
2003
+ }
2004
+ if (oneToManySet) {
2005
+ var _loop_9 = function (entityName) {
2006
+ var entityNameLc = (0, string_1.firstLetterLowerCase)(entityName);
2007
+ foreignKeySet[entityName].forEach(function (foreignKey) {
2008
+ var identifier = "".concat(entityNameLc, "s$").concat(foreignKey);
2009
+ var otmCreateOperationDataNode = factory.createTypeReferenceNode(factory.createIdentifier("Omit"), [
2010
+ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'CreateOperationData'), undefined),
2011
+ factory.createUnionTypeNode(foreignKey === 'entity' ? [
2012
+ factory.createLiteralTypeNode(factory.createStringLiteral("entity")),
2013
+ factory.createLiteralTypeNode(factory.createStringLiteral("entityId"))
2014
+ ] : [
2015
+ factory.createLiteralTypeNode(factory.createStringLiteral(foreignKey)),
2016
+ factory.createLiteralTypeNode(factory.createStringLiteral("".concat(foreignKey, "Id")))
2017
+ ])
2018
+ ]);
2019
+ var otmCreateOperationNode = factory.createTypeReferenceNode(factory.createIdentifier("OakOperation"), [
2020
+ factory.createLiteralTypeNode(factory.createStringLiteral("create")),
2021
+ factory.createUnionTypeNode([
2022
+ otmCreateOperationDataNode,
2023
+ factory.createArrayTypeNode(otmCreateOperationDataNode)
2024
+ ])
2025
+ ]);
2026
+ propertySignatures2.push(factory.createPropertySignature(undefined, factory.createIdentifier(identifier), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode([
2027
+ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'UpdateOperation'), undefined),
2028
+ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'RemoveOperation'), undefined),
2029
+ factory.createTypeReferenceNode(factory.createIdentifier("Array"), [factory.createUnionTypeNode([
2030
+ otmCreateOperationNode,
2031
+ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'UpdateOperation'), undefined),
2032
+ factory.createTypeReferenceNode(createForeignRef(entity, entityName, 'RemoveOperation'), undefined)
2033
+ ])])
2034
+ ])));
2035
+ });
2036
+ };
2037
+ for (var entityName in foreignKeySet) {
2038
+ _loop_9(entityName);
2039
+ }
2040
+ }
2041
+ if (propertySignatures2.length > 0) {
2042
+ adNodes.push(factory.createTypeLiteralNode(propertySignatures2));
2043
+ }
2044
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("UpdateOperationData"), undefined, factory.createIntersectionTypeNode(adNodes)));
2045
+ // UpdateOperation
2046
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("UpdateOperation"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("OakOperation"), [
2047
+ ActionAsts[entity] ?
2048
+ factory.createUnionTypeNode([
2049
+ factory.createTypeReferenceNode('ParticularAction'),
2050
+ factory.createLiteralTypeNode(factory.createStringLiteral("update"))
2051
+ ]) :
2052
+ factory.createLiteralTypeNode(factory.createStringLiteral("update")),
2053
+ factory.createTypeReferenceNode(factory.createIdentifier("UpdateOperationData")),
2054
+ factory.createTypeReferenceNode(factory.createIdentifier("Filter"), undefined),
2055
+ factory.createTypeReferenceNode(factory.createIdentifier("Sorter"), undefined)
2056
+ ])));
2057
+ // RemoveOperationData
2058
+ adNodes = [
2059
+ factory.createTypeLiteralNode([])
2060
+ ];
2061
+ if (manyToOneSet) {
2062
+ /**
2063
+ * remove的多对一有两种case
2064
+ * 如果关联对象动作是update或者remove,则关联对象的filter由对象(的原行!注意这里的外键是不能变的!)决定其主键
2065
+ * 见cascadeStore
2066
+ */
2067
+ var upsertOneNodes = [];
2068
+ try {
2069
+ for (var manyToOneSet_6 = __values(manyToOneSet), manyToOneSet_6_1 = manyToOneSet_6.next(); !manyToOneSet_6_1.done; manyToOneSet_6_1 = manyToOneSet_6.next()) {
2070
+ var one = manyToOneSet_6_1.value;
2071
+ if (!ReversePointerRelations[entity] || !ReversePointerRelations[entity].includes(one[0])) {
2072
+ upsertOneNodes.push(factory.createUnionTypeNode([
2073
+ factory.createTypeLiteralNode([
2074
+ factory.createPropertySignature(undefined, factory.createIdentifier(one[1]), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one[0], 'UpdateOperation')))
2075
+ ]),
2076
+ factory.createTypeLiteralNode([
2077
+ factory.createPropertySignature(undefined, factory.createIdentifier(one[1]), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one[0], 'RemoveOperation')))
2078
+ ])
2079
+ ]));
2080
+ }
2081
+ }
2082
+ }
2083
+ catch (e_16_1) { e_16 = { error: e_16_1 }; }
2084
+ finally {
2085
+ try {
2086
+ if (manyToOneSet_6_1 && !manyToOneSet_6_1.done && (_h = manyToOneSet_6.return)) _h.call(manyToOneSet_6);
2087
+ }
2088
+ finally { if (e_16) throw e_16.error; }
2089
+ }
2090
+ var reverseOneNodes = [];
2091
+ if (ReversePointerRelations[entity]) {
2092
+ var refEntityLitrals = [];
2093
+ try {
2094
+ for (var _u = __values(ReversePointerRelations[entity]), _v = _u.next(); !_v.done; _v = _u.next()) {
2095
+ var one = _v.value;
2096
+ refEntityLitrals.push(factory.createLiteralTypeNode(factory.createStringLiteral("".concat((0, string_1.firstLetterLowerCase)(one)))));
2097
+ reverseOneNodes.push(factory.createTypeLiteralNode([
2098
+ factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'UpdateOperation')))
2099
+ ]), factory.createTypeLiteralNode([
2100
+ factory.createPropertySignature(undefined, factory.createIdentifier((0, string_1.firstLetterLowerCase)(one)), factory.createToken(ts.SyntaxKind.QuestionToken), factory.createTypeReferenceNode(createForeignRef(entity, one, 'RemoveOperation')))
2101
+ ]));
2102
+ }
2103
+ }
2104
+ catch (e_17_1) { e_17 = { error: e_17_1 }; }
2105
+ finally {
2106
+ try {
2107
+ if (_v && !_v.done && (_j = _u.return)) _j.call(_u);
2108
+ }
2109
+ finally { if (e_17) throw e_17.error; }
2110
+ }
2111
+ if (process.env.COMPLING_AS_LIB) {
2112
+ reverseOneNodes.push(factory.createTypeLiteralNode([
2113
+ factory.createIndexSignature(undefined, undefined, [factory.createParameterDeclaration(undefined, undefined, undefined, factory.createIdentifier("k"), undefined, factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), undefined)], factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword))
2114
+ ]));
2115
+ }
2116
+ }
2117
+ if (upsertOneNodes.length > 0) {
2118
+ adNodes.push(factory.createIntersectionTypeNode(upsertOneNodes));
2119
+ }
2120
+ if (reverseOneNodes.length > 0) {
2121
+ adNodes.push(factory.createUnionTypeNode(reverseOneNodes));
2122
+ }
2123
+ }
2124
+ /**
2125
+ * remove的同时进行cascade update或者cascade remove,感觉用触发器会更自然,因为在用户界面上似乎不会有对应的操作。
2126
+ * 这部分代码暂时封闭 by Xc 20220501
2127
+ **/
2128
+ /* const propertySignatures3: ts.TypeElement[] = [];
2129
+ if (process.env.COMPLING_AS_LIB) {
2130
+ propertySignatures3.push(
2131
+ factory.createIndexSignature(
2132
+ undefined,
2133
+ undefined,
2134
+ [factory.createParameterDeclaration(
2135
+ undefined,
2136
+ undefined,
2137
+ undefined,
2138
+ factory.createIdentifier("k"),
2139
+ undefined,
2140
+ factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
2141
+ undefined
2142
+ )],
2143
+ factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword)
2144
+ )
2145
+ );
2146
+ }
2147
+ if (oneToManySet) {
2148
+ for (const entityName in foreignKeySet) {
2149
+ const entityNameLc = firstLetterLowerCase(entityName);
2150
+ foreignKeySet[entityName].forEach(
2151
+ (foreignKey) => {
2152
+ const identifier = `${entityNameLc}s$${foreignKey}`;
2153
+ propertySignatures3.push(
2154
+ factory.createPropertySignature(
2155
+ undefined,
2156
+ factory.createIdentifier(identifier),
2157
+ factory.createToken(ts.SyntaxKind.QuestionToken),
2158
+ factory.createUnionTypeNode([
2159
+ factory.createTypeReferenceNode(
2160
+ createForeignRef(entity, entityName, 'UpdateOperation'),
2161
+ undefined
2162
+ ),
2163
+ factory.createTypeReferenceNode(
2164
+ createForeignRef(entity, entityName, 'RemoveOperation'),
2165
+ undefined
2166
+ ),
2167
+ factory.createTypeReferenceNode(
2168
+ factory.createIdentifier("Array"),
2169
+ [factory.createUnionTypeNode([
2170
+ factory.createTypeReferenceNode(
2171
+ createForeignRef(entity, entityName, 'UpdateOperation'),
2172
+ undefined
2173
+ ),
2174
+ factory.createTypeReferenceNode(
2175
+ createForeignRef(entity, entityName, 'RemoveOperation'),
2176
+ undefined
2177
+ )
2178
+ ])]
2179
+ )
2180
+ ])
2181
+ )
2182
+ );
2183
+ }
2184
+ );
2185
+ }
2186
+ }
2187
+ if (propertySignatures3.length > 0) {
2188
+ adNodes.push(
2189
+ factory.createTypeLiteralNode(
2190
+ propertySignatures3
2191
+ )
2192
+ );
2193
+ } */
2194
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("RemoveOperationData"), undefined, factory.createIntersectionTypeNode(adNodes)));
2195
+ // RemoveOperation
2196
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("RemoveOperation"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("OakOperation"), [
2197
+ factory.createLiteralTypeNode(factory.createStringLiteral("remove")),
2198
+ factory.createTypeReferenceNode(factory.createIdentifier("RemoveOperationData"), undefined),
2199
+ factory.createTypeReferenceNode(factory.createIdentifier("Filter"), undefined),
2200
+ factory.createTypeReferenceNode(factory.createIdentifier("Sorter"), undefined)
2201
+ ])));
2202
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("Operation"), undefined, factory.createUnionTypeNode([
2203
+ factory.createTypeReferenceNode(factory.createIdentifier("CreateOperation"), undefined),
2204
+ factory.createTypeReferenceNode(factory.createIdentifier("UpdateOperation"), undefined),
2205
+ factory.createTypeReferenceNode(factory.createIdentifier("RemoveOperation"), undefined),
2206
+ factory.createTypeReferenceNode(factory.createIdentifier("SelectOperation"), undefined)
2207
+ ])));
2208
+ }
2209
+ var initialStatements = function () { return [
2210
+ // import { String, Text, Int, SpecificKey } from 'oak-domain/types/DataType';
2211
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([
2212
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('String')),
2213
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Int')),
2214
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Float')),
2215
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Double')),
2216
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Boolean')),
2217
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Text')),
2218
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Datetime')),
2219
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('File')),
2220
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Image')),
2221
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('PrimaryKey')),
2222
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('ForeignKey')),
2223
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Geo')),
2224
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('SingleGeo'))
2225
+ ])), factory.createStringLiteral("".concat((0, env_1.TYPE_PATH_IN_OAK_DOMAIN)(), "DataType"))),
2226
+ /* import {
2227
+ Q_DateValue, Q_LogicKey, Q_NumberValue, FnCallKey, FnCallValue,
2228
+ Q_StringValue, Q_FullTextKey, Q_FullTextValue, FnCallValueAs,
2229
+ Q_BooleanValue,
2230
+ } from 'oak-domain/types/Demand'; */
2231
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([
2232
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Q_DateValue')),
2233
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Q_BooleanValue')),
2234
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Q_NumberValue')),
2235
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Q_StringValue')),
2236
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('Q_EnumValue')),
2237
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('NodeId')),
2238
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('MakeFilter')),
2239
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('FulltextFilter')),
2240
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('ExprOp')),
2241
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier('ExpressionKey')),
2242
+ ])), factory.createStringLiteral("".concat((0, env_1.TYPE_PATH_IN_OAK_DOMAIN)(), "Demand"))),
2243
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([
2244
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier("OneOf")),
2245
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier("ValueOf"))
2246
+ ])), factory.createStringLiteral("".concat((0, env_1.TYPE_PATH_IN_OAK_DOMAIN)(), "Polyfill"))),
2247
+ // import * as SubQuery from '../_SubQuery';
2248
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamespaceImport(factory.createIdentifier("SubQuery"))), factory.createStringLiteral("../_SubQuery")),
2249
+ // import { Filter as OakFilter } from 'oak-domain/src/types/Entity';
2250
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([
2251
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier("FormCreateData")),
2252
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier("FormUpdateData")),
2253
+ factory.createImportSpecifier(false, factory.createIdentifier("Operation"), factory.createIdentifier("OakOperation"))
2254
+ ])), factory.createStringLiteral("".concat((0, env_1.TYPE_PATH_IN_OAK_DOMAIN)(), "Entity")), undefined)
2255
+ ]; };
2256
+ function outputSubQuery(outputDir, printer) {
2257
+ var statements = [];
2258
+ if (process.env.COMPLING_AS_LIB) {
2259
+ statements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("Selection"))])), factory.createStringLiteral("oak-domain/lib/types/Entity"), undefined));
2260
+ }
2261
+ for (var entity in Schema) {
2262
+ // import * as User from '../User/Schema';
2263
+ statements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamespaceImport(factory.createIdentifier(entity))), factory.createStringLiteral("./".concat(entity, "/Schema"))));
2264
+ }
2265
+ var entities = (0, lodash_1.keys)(Schema);
2266
+ var _loop_10 = function (one) {
2267
+ var identifier = "".concat(one, "IdSubQuery");
2268
+ var fromEntites = OneToMany[one] ? (0, lodash_1.uniq)(OneToMany[one]
2269
+ .filter(function (_a) {
2270
+ var _b = __read(_a, 2), e = _b[0], f = _b[1];
2271
+ return f !== 'entity';
2272
+ }).map(function (_a) {
2273
+ var _b = __read(_a, 1), e = _b[0];
2274
+ return e;
2275
+ })) : [];
2276
+ fromEntites.push(one);
2277
+ var inUnionTypeNode = fromEntites.map(function (ele) { return factory.createIntersectionTypeNode([
2278
+ factory.createTypeReferenceNode(factory.createQualifiedName(factory.createIdentifier(ele), factory.createIdentifier(identifier)), undefined),
2279
+ factory.createTypeLiteralNode([factory.createPropertySignature(undefined, factory.createIdentifier("entity"), undefined, factory.createLiteralTypeNode(factory.createStringLiteral((0, string_1.firstLetterLowerCase)(ele))))])
2280
+ ]); });
2281
+ if (process.env.COMPLING_AS_LIB) {
2282
+ // 如果是建立 base,这里要加上额外可能的对象信息
2283
+ inUnionTypeNode.push(factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
2284
+ }
2285
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier(identifier), undefined, factory.createMappedTypeNode(undefined, factory.createTypeParameterDeclaration(factory.createIdentifier("K"), factory.createUnionTypeNode([
2286
+ factory.createLiteralTypeNode(factory.createStringLiteral("$in")),
2287
+ factory.createLiteralTypeNode(factory.createStringLiteral("$nin"))
2288
+ ]), undefined), undefined, factory.createToken(ts.SyntaxKind.QuestionToken), factory.createUnionTypeNode(inUnionTypeNode), undefined)));
2289
+ };
2290
+ // 每个有manyToOne的Entity都会输出${One}IdSubQuery
2291
+ for (var one in Schema) {
2292
+ _loop_10(one);
2293
+ }
2294
+ var resultFile = ts.createSourceFile("someFileName.ts", "", ts.ScriptTarget.Latest, /*setParentNodes*/ false, ts.ScriptKind.TS);
2295
+ var result = printer.printNode(ts.EmitHint.Unspecified, factory.createSourceFile(statements, factory.createToken(ts.SyntaxKind.EndOfFileToken), ts.NodeFlags.None), resultFile);
2296
+ var fileName = path_1.default.join(outputDir, '_SubQuery.ts');
2297
+ (0, fs_1.writeFileSync)(fileName, result, { flag: 'w' });
2298
+ }
2299
+ function outputEntityDict(outputDir, printer) {
2300
+ var statements = [];
2301
+ var propertySignatures = [];
2302
+ for (var entity in Schema) {
2303
+ // import * as User from '../User/Schema';
2304
+ statements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, factory.createIdentifier("EntityDef"), factory.createIdentifier(entity))])), factory.createStringLiteral("./".concat(entity, "/Schema"))));
2305
+ var entityLc = (0, string_1.firstLetterLowerCase)(entity);
2306
+ propertySignatures.push(factory.createPropertySignature(undefined, factory.createIdentifier(entityLc), undefined, factory.createTypeReferenceNode(entity)));
2307
+ }
2308
+ if ( /* process.env.COMPLING_AS_LIB */false) {
2309
+ statements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("EntityDef"))])), factory.createStringLiteral("../types/Entity"), undefined), factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("EntityDict"), undefined, factory.createIntersectionTypeNode([
2310
+ factory.createTypeLiteralNode(propertySignatures),
2311
+ factory.createTypeLiteralNode([
2312
+ factory.createIndexSignature(undefined, undefined, [factory.createParameterDeclaration(undefined, undefined, undefined, factory.createIdentifier("E"), undefined, factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), undefined)], factory.createTypeReferenceNode(factory.createIdentifier("EntityDef"), undefined))
2313
+ ])
2314
+ ])));
2315
+ }
2316
+ else {
2317
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("EntityDict"), undefined, factory.createTypeLiteralNode(propertySignatures)));
2318
+ }
2319
+ var resultFile = ts.createSourceFile("someFileName.ts", "", ts.ScriptTarget.Latest, /*setParentNodes*/ false, ts.ScriptKind.TS);
2320
+ var result = printer.printNode(ts.EmitHint.Unspecified, factory.createSourceFile(statements, factory.createToken(ts.SyntaxKind.EndOfFileToken), ts.NodeFlags.None), resultFile);
2321
+ var fileName = path_1.default.join(outputDir, 'EntityDict.ts');
2322
+ (0, fs_1.writeFileSync)(fileName, result, { flag: 'w' });
2323
+ }
2324
+ function outputSchema(outputDir, printer) {
2325
+ for (var entity in Schema) {
2326
+ var statements = initialStatements();
2327
+ if (ActionAsts[entity]) {
2328
+ var _a = ActionAsts[entity], importedFrom = _a.importedFrom, actionDefNames = _a.actionDefNames;
2329
+ var localActions = ['Action', 'ParticularAction'];
2330
+ for (var a in importedFrom) {
2331
+ (0, assert_1.default)(a.endsWith('Action'));
2332
+ var s = a.slice(0, a.length - 6).concat('State');
2333
+ if (importedFrom[a] === 'local' && actionDefNames.includes((0, string_1.firstLetterLowerCase)(a.slice(0, a.length - 6)))) {
2334
+ localActions.push(s);
2335
+ }
2336
+ else if (actionDefNames.includes((0, string_1.firstLetterLowerCase)(a.slice(0, a.length - 6)))) {
2337
+ var moduleSpecifier = importedFrom[a].moduleSpecifier;
2338
+ statements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([
2339
+ factory.createImportSpecifier(false, undefined, factory.createIdentifier(s))
2340
+ ])), moduleSpecifier, undefined));
2341
+ }
2342
+ }
2343
+ statements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports(localActions.map(function (ele) { return factory.createImportSpecifier(false, undefined, factory.createIdentifier(ele)); }))), factory.createStringLiteral('./Action'), undefined));
2344
+ }
2345
+ else {
2346
+ statements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("GenericAction"))])), factory.createStringLiteral((0, env_1.ACTION_CONSTANT_IN_OAK_DOMAIN)()), undefined));
2347
+ }
2348
+ constructSchema(statements, entity);
2349
+ constructFilter(statements, entity);
2350
+ constructProjection(statements, entity);
2351
+ constructSorter(statements, entity);
2352
+ constructActions(statements, entity);
2353
+ constructQuery(statements, entity);
2354
+ constructFullAttrs(statements, entity);
2355
+ var EntityDefAttrs = [
2356
+ factory.createPropertySignature(undefined, factory.createIdentifier("Schema"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Schema"), undefined)),
2357
+ factory.createPropertySignature(undefined, factory.createIdentifier("OpSchema"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("OpSchema"), undefined)),
2358
+ factory.createPropertySignature(undefined, factory.createIdentifier("Action"), undefined, factory.createTypeReferenceNode(factory.createIdentifier(ActionAsts[entity] ? 'Action' : 'GenericAction'), undefined)),
2359
+ factory.createPropertySignature(undefined, factory.createIdentifier("Selection"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Selection"), undefined)),
2360
+ factory.createPropertySignature(undefined, factory.createIdentifier("Operation"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("Operation"), undefined)),
2361
+ factory.createPropertySignature(undefined, factory.createIdentifier("Create"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("CreateOperation"), undefined)),
2362
+ factory.createPropertySignature(undefined, factory.createIdentifier("Update"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("UpdateOperation"), undefined)),
2363
+ factory.createPropertySignature(undefined, factory.createIdentifier("Remove"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("RemoveOperation"), undefined)),
2364
+ factory.createPropertySignature(undefined, factory.createIdentifier("CreateSingle"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("CreateSingleOperation"), undefined)),
2365
+ factory.createPropertySignature(undefined, factory.createIdentifier("CreateMulti"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("CreateMultipleOperation"), undefined)),
2366
+ ];
2367
+ if (ActionAsts[entity]) {
2368
+ EntityDefAttrs.push(factory.createPropertySignature(undefined, factory.createIdentifier("ParticularAction"), undefined, factory.createTypeReferenceNode(factory.createIdentifier('ParticularAction'), undefined)));
2369
+ }
2370
+ statements.push(factory.createTypeAliasDeclaration(undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier("EntityDef"), undefined, factory.createTypeLiteralNode(EntityDefAttrs)));
2371
+ var result = printer.printList(ts.ListFormat.SourceFileStatements, factory.createNodeArray(statements), Schema[entity].sourceFile);
2372
+ var fileName = path_1.default.join(outputDir, entity, 'Schema.ts');
2373
+ (0, fs_1.writeFileSync)(fileName, result, { flag: 'w' });
2374
+ }
2375
+ }
2376
+ function outputAction(outputDir, printer) {
2377
+ var actionDictStatements = [];
2378
+ var propertyAssignments = [];
2379
+ for (var entity in ActionAsts) {
2380
+ var _a = ActionAsts[entity], sourceFile = _a.sourceFile, statements = _a.statements, importedFrom = _a.importedFrom, actionDefNames = _a.actionDefNames;
2381
+ var importStatements = [];
2382
+ for (var k in importedFrom) {
2383
+ (0, assert_1.default)(k.endsWith('Action'));
2384
+ if (importedFrom[k] !== 'local') {
2385
+ importStatements.push(importedFrom[k]);
2386
+ }
2387
+ }
2388
+ /* const actionDiff = difference(actionNames, actionDefNames);
2389
+ if (actionDiff.length > 0) {
2390
+ throw new Error(`action not conform to actionDef: ${actionDiff.join(',')}, entity: ${entity}`);
2391
+ } */
2392
+ statements.push(factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([factory.createVariableDeclaration(factory.createIdentifier("ActionDefDict"), undefined, undefined, factory.createObjectLiteralExpression(actionDefNames.map(function (ele) { return factory.createPropertyAssignment(factory.createIdentifier("".concat(ele, "State")), factory.createIdentifier("".concat((0, string_1.firstLetterUpperCase)(ele), "ActionDef"))); }), true))], ts.NodeFlags.Const)));
2393
+ /* const result = printer.printNode(
2394
+ ts.EmitHint.Unspecified,
2395
+ factory.createSourceFile(statements,
2396
+ factory.createToken(ts.SyntaxKind.EndOfFileToken),
2397
+ ts.NodeFlags.None),
2398
+ sourceFile
2399
+ ); */
2400
+ // 这里如果用printNode,stringLiteral的输出始终有个bug不知道如何处理
2401
+ var result_1 = printer.printList(ts.ListFormat.SourceFileStatements, factory.createNodeArray(importStatements.concat(statements)), sourceFile);
2402
+ var filename = path_1.default.join(outputDir, entity, 'Action.ts');
2403
+ (0, fs_1.writeFileSync)(filename, result_1, { flag: 'w' });
2404
+ actionDictStatements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, factory.createIdentifier("ActionDefDict"), factory.createIdentifier(entity))])), factory.createStringLiteral("./".concat(entity, "/Action"))));
2405
+ propertyAssignments.push(factory.createPropertyAssignment(factory.createIdentifier((0, string_1.firstLetterLowerCase)(entity)), factory.createIdentifier(entity)));
2406
+ }
2407
+ actionDictStatements.push(factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([factory.createVariableDeclaration(factory.createIdentifier("ActionDefDict"), undefined, undefined, factory.createObjectLiteralExpression(propertyAssignments, true))], ts.NodeFlags.Const)));
2408
+ var resultFile = ts.createSourceFile("someFileName.ts", "", ts.ScriptTarget.Latest, /*setParentNodes*/ false, ts.ScriptKind.TS);
2409
+ var result = printer.printNode(ts.EmitHint.Unspecified, factory.createSourceFile(actionDictStatements, factory.createToken(ts.SyntaxKind.EndOfFileToken), ts.NodeFlags.None), resultFile);
2410
+ var fileName = path_1.default.join(outputDir, 'ActionDefDict.ts');
2411
+ (0, fs_1.writeFileSync)(fileName, result, { flag: 'w' });
2412
+ }
2413
+ function constructAttributes(entity) {
2414
+ var schemaAttrs = Schema[entity].schemaAttrs;
2415
+ var _a = ManyToOne, _b = entity, manyToOneSet = _a[_b];
2416
+ var result = [];
2417
+ schemaAttrs.forEach(function (attr) {
2418
+ var attrAssignments = [];
2419
+ var name = attr.name, type = attr.type;
2420
+ var name2 = name;
2421
+ if (ts.isTypeReferenceNode(type)) {
2422
+ var typeName = type.typeName, typeArguments = type.typeArguments;
2423
+ if (ts.isIdentifier(typeName)) {
2424
+ var text = typeName.text;
2425
+ switch (text) {
2426
+ case 'String': {
2427
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("varchar")), factory.createPropertyAssignment(factory.createIdentifier("params"), factory.createObjectLiteralExpression([
2428
+ factory.createPropertyAssignment(factory.createIdentifier("length"), factory.createNumericLiteral(typeArguments[0].literal.text)),
2429
+ ], true)));
2430
+ break;
2431
+ }
2432
+ case 'Text':
2433
+ case 'Image':
2434
+ case 'File': {
2435
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("text")));
2436
+ break;
2437
+ }
2438
+ case 'Int':
2439
+ case 'Uint': {
2440
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("int")), factory.createPropertyAssignment(factory.createIdentifier("params"), factory.createObjectLiteralExpression([
2441
+ factory.createPropertyAssignment(factory.createIdentifier("width"), factory.createNumericLiteral(typeArguments[0].literal.text)),
2442
+ factory.createPropertyAssignment(factory.createIdentifier("signed"), text === 'Uint' ? factory.createFalse() : factory.createTrue())
2443
+ ], true)));
2444
+ break;
2445
+ }
2446
+ case 'Float': {
2447
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("float")), factory.createPropertyAssignment(factory.createIdentifier("params"), factory.createObjectLiteralExpression([
2448
+ factory.createPropertyAssignment(factory.createIdentifier("precision"), factory.createNumericLiteral(typeArguments[0].literal.text)),
2449
+ factory.createPropertyAssignment(factory.createIdentifier("scale"), factory.createNumericLiteral(typeArguments[1].literal.text))
2450
+ ], true)));
2451
+ break;
2452
+ }
2453
+ case 'Double': {
2454
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("double")), factory.createPropertyAssignment(factory.createIdentifier("params"), factory.createObjectLiteralExpression([
2455
+ factory.createPropertyAssignment(factory.createIdentifier("precision"), factory.createNumericLiteral(typeArguments[0].literal.text)),
2456
+ factory.createPropertyAssignment(factory.createIdentifier("scale"), factory.createNumericLiteral(typeArguments[1].literal.text))
2457
+ ], true)));
2458
+ break;
2459
+ }
2460
+ case 'Boolean': {
2461
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("boolean")));
2462
+ break;
2463
+ }
2464
+ case 'Datetime': {
2465
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("datetime")));
2466
+ break;
2467
+ }
2468
+ case 'SingleGeo':
2469
+ case 'Geo': {
2470
+ // object类型暂不支持查询
2471
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("geometry")));
2472
+ break;
2473
+ }
2474
+ case 'Object': {
2475
+ // object类型暂不支持查询
2476
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("object")));
2477
+ break;
2478
+ }
2479
+ default: {
2480
+ var text2_6 = text === 'Schema' ? entity : text;
2481
+ var manyToOneItem = manyToOneSet && manyToOneSet.find(function (_a) {
2482
+ var _b = __read(_a, 2), refEntity = _b[0], attrName = _b[1];
2483
+ return refEntity === text2_6 && attrName === attrName;
2484
+ });
2485
+ if (manyToOneItem) {
2486
+ // 外键
2487
+ name2 = factory.createIdentifier("".concat(name.text, "Id"));
2488
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("ref")), factory.createPropertyAssignment(factory.createIdentifier("ref"), factory.createStringLiteral((0, string_1.firstLetterLowerCase)(text2_6))));
2489
+ }
2490
+ else {
2491
+ if (text.endsWith('State')) {
2492
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("varchar")), factory.createPropertyAssignment(factory.createIdentifier("params"), factory.createObjectLiteralExpression([factory.createPropertyAssignment(factory.createIdentifier("length"), factory.createNumericLiteral(env_1.STRING_LITERAL_MAX_LENGTH))], true)));
2493
+ }
2494
+ else {
2495
+ // 引用的shape
2496
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("object")));
2497
+ }
2498
+ }
2499
+ }
2500
+ }
2501
+ }
2502
+ else {
2503
+ (0, assert_1.default)(false);
2504
+ }
2505
+ }
2506
+ else {
2507
+ if (ts.isUnionTypeNode(type)) {
2508
+ if (ts.isLiteralTypeNode(type.types[0])) {
2509
+ if (ts.isStringLiteral(type.types[0].literal)) {
2510
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("varchar")), factory.createPropertyAssignment(factory.createIdentifier("params"), factory.createObjectLiteralExpression([factory.createPropertyAssignment(factory.createIdentifier("length"), factory.createNumericLiteral(env_1.STRING_LITERAL_MAX_LENGTH))], true)));
2511
+ }
2512
+ else {
2513
+ (0, assert_1.default)(ts.isNumericLiteral(type.types[0].literal));
2514
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("int")), factory.createPropertyAssignment(factory.createIdentifier("params"), factory.createObjectLiteralExpression([
2515
+ factory.createPropertyAssignment(factory.createIdentifier("width"), factory.createNumericLiteral(env_1.INT_LITERL_DEFAULT_WIDTH))
2516
+ ], true)));
2517
+ }
2518
+ }
2519
+ else {
2520
+ // 否则是本地规定的shape,直接用object
2521
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("object")));
2522
+ }
2523
+ }
2524
+ else {
2525
+ if (ts.isLiteralTypeNode(type)) {
2526
+ if (ts.isStringLiteral(type.literal)) {
2527
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("varchar")), factory.createPropertyAssignment(factory.createIdentifier("params"), factory.createObjectLiteralExpression([factory.createPropertyAssignment(factory.createIdentifier("length"), factory.createNumericLiteral(env_1.STRING_LITERAL_MAX_LENGTH))], true)));
2528
+ }
2529
+ else {
2530
+ (0, assert_1.default)(ts.isNumericLiteral(type.literal));
2531
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("precision")), factory.createPropertyAssignment(factory.createIdentifier("params"), factory.createObjectLiteralExpression([
2532
+ factory.createPropertyAssignment(factory.createIdentifier("precision"), factory.createNumericLiteral(env_1.NUMERICAL_LITERL_DEFAULT_PRECISION)),
2533
+ factory.createPropertyAssignment(factory.createIdentifier("scale"), factory.createNumericLiteral(env_1.NUMERICAL_LITERL_DEFAULT_SCALE))
2534
+ ], true)));
2535
+ }
2536
+ }
2537
+ else {
2538
+ // 否则是本地规定的shape,直接用object
2539
+ attrAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("type"), factory.createStringLiteral("object")));
2540
+ }
2541
+ }
2542
+ }
2543
+ result.push(factory.createPropertyAssignment(name2, factory.createObjectLiteralExpression(attrAssignments, true)));
2544
+ });
2545
+ return result;
2546
+ }
2547
+ function outputLocale(outputDir, printer) {
2548
+ var locales = {};
2549
+ var entities = [];
2550
+ var _loop_11 = function (entity) {
2551
+ var _a = Schema[entity], locale = _a.locale, sourceFile = _a.sourceFile;
2552
+ if (locale) {
2553
+ var properties = locale.properties;
2554
+ properties.forEach(function (ele) {
2555
+ (0, assert_1.default)(ts.isPropertyAssignment(ele) && (ts.isIdentifier(ele.name) || ts.isStringLiteral(ele.name)) && ts.isObjectLiteralExpression(ele.initializer));
2556
+ var lng = ele.name.text;
2557
+ var result = printer.printList(ts.ListFormat.SourceFileStatements, factory.createNodeArray([
2558
+ factory.createReturnStatement(ele.initializer)
2559
+ ]), sourceFile);
2560
+ var data = Function(result)();
2561
+ var filename = path_1.default.join(outputDir, entity, 'locales', "".concat(lng, ".json"));
2562
+ (0, fs_1.writeFileSync)(filename, JSON.stringify(data), { flag: 'w' });
2563
+ if (locales[lng]) {
2564
+ locales[lng].push(entity);
2565
+ }
2566
+ else {
2567
+ locales[lng] = [entity];
2568
+ }
2569
+ });
2570
+ entities.push(entity);
2571
+ }
2572
+ };
2573
+ for (var entity in Schema) {
2574
+ _loop_11(entity);
2575
+ }
2576
+ for (var lng in locales) {
2577
+ if (locales[lng].length < entities.length) {
2578
+ var lack = (0, lodash_1.difference)(entities, locales[lng]);
2579
+ throw new Error("".concat(lng, "\u8BED\u8A00\u5B9A\u4E49\u4E2D\u7F3A\u5C11\u4E86\u5BF9\u8C61").concat(lack.join(','), "\u7684\u5B9A\u4E49\uFF0C\u8BF7\u68C0\u67E5\u76F8\u5E94\u7684\u5B9A\u4E49\u6587\u4EF6"));
2580
+ }
2581
+ /* const statements: ts.Statement[] = locales[lng].map(
2582
+ (entity) => factory.createImportDeclaration(
2583
+ undefined,
2584
+ undefined,
2585
+ factory.createImportClause(
2586
+ false,
2587
+ factory.createIdentifier(firstLetterLowerCase(entity)),
2588
+ undefined
2589
+ ),
2590
+ factory.createStringLiteral(`../${entity}/locales/${lng}`),
2591
+ undefined
2592
+ )
2593
+ );
2594
+
2595
+ statements.push(
2596
+ factory.createExportAssignment(
2597
+ undefined,
2598
+ undefined,
2599
+ undefined,
2600
+ factory.createObjectLiteralExpression(
2601
+ locales[lng].map(
2602
+ ele => factory.createShorthandPropertyAssignment(
2603
+ factory.createIdentifier(firstLetterLowerCase(ele)),
2604
+ undefined
2605
+ )
2606
+ ),
2607
+ true
2608
+ )
2609
+ )
2610
+ );
2611
+
2612
+ const result = printer.printList(
2613
+ ts.ListFormat.SourceFileStatements,
2614
+ factory.createNodeArray(statements),
2615
+ ts.createSourceFile("someFileName.ts", "", ts.ScriptTarget.Latest, false, ts.ScriptKind.TS));
2616
+ const filename = path.join(outputDir, '_locales', `${lng}.ts`);
2617
+ writeFileSync(filename, result, { flag: 'w' }); */
2618
+ }
2619
+ }
2620
+ function outputStorage(outputDir, printer) {
2621
+ var importStatements = [
2622
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("StorageSchema"))])), factory.createStringLiteral("".concat((0, env_1.TYPE_PATH_IN_OAK_DOMAIN)(), "Storage")), undefined),
2623
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("EntityDict"))])), factory.createStringLiteral("./EntityDict"), undefined)
2624
+ ];
2625
+ var entityAssignments = [];
2626
+ for (var entity in Schema) {
2627
+ var indexExpressions = [];
2628
+ var _a = Schema[entity], sourceFile = _a.sourceFile, fulltextIndex = _a.fulltextIndex, indexes = _a.indexes;
2629
+ var statements = [
2630
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("StorageDesc"))])), factory.createStringLiteral("".concat((0, env_1.TYPE_PATH_IN_OAK_DOMAIN)(), "Storage")), undefined),
2631
+ factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([factory.createImportSpecifier(false, undefined, factory.createIdentifier("OpSchema"))])), factory.createStringLiteral("./Schema"), undefined)
2632
+ ];
2633
+ var propertyAssignments = [];
2634
+ var attributes = constructAttributes(entity);
2635
+ propertyAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("attributes"), factory.createObjectLiteralExpression(attributes, true)));
2636
+ if (indexes) {
2637
+ indexExpressions.push.apply(indexExpressions, __spreadArray([], __read(indexes.elements), false));
2638
+ }
2639
+ if (indexExpressions.length > 0) {
2640
+ propertyAssignments.push(factory.createPropertyAssignment(factory.createIdentifier("indexes"), factory.createArrayLiteralExpression(indexExpressions, true)));
2641
+ }
2642
+ statements.push(factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([factory.createVariableDeclaration(factory.createIdentifier("desc"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("StorageDesc"), [
2643
+ factory.createTypeReferenceNode(factory.createIdentifier("OpSchema"), undefined)
2644
+ ]), factory.createObjectLiteralExpression(propertyAssignments, true))], ts.NodeFlags.Const)));
2645
+ var result_2 = printer.printList(ts.ListFormat.SourceFileStatements, factory.createNodeArray(statements), sourceFile);
2646
+ var filename_1 = path_1.default.join(outputDir, entity, 'Storage.ts');
2647
+ (0, fs_1.writeFileSync)(filename_1, result_2, { flag: 'w' });
2648
+ importStatements.push(factory.createImportDeclaration(undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports([
2649
+ factory.createImportSpecifier(false, factory.createIdentifier("desc"), factory.createIdentifier("".concat((0, string_1.firstLetterLowerCase)(entity), "Desc")))
2650
+ ])), factory.createStringLiteral("./".concat(entity, "/Storage")), undefined));
2651
+ entityAssignments.push(factory.createPropertyAssignment((0, string_1.firstLetterLowerCase)(entity), factory.createIdentifier("".concat((0, string_1.firstLetterLowerCase)(entity), "Desc"))));
2652
+ }
2653
+ importStatements.push(factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([factory.createVariableDeclaration(factory.createIdentifier("storageSchema"), undefined, factory.createTypeReferenceNode(factory.createIdentifier("StorageSchema"), [
2654
+ factory.createTypeReferenceNode('EntityDict')
2655
+ ]), factory.createObjectLiteralExpression(entityAssignments, true))], ts.NodeFlags.Const)));
2656
+ var result = printer.printList(ts.ListFormat.SourceFileStatements, factory.createNodeArray(importStatements), ts.createSourceFile("someFileName.ts", "", ts.ScriptTarget.Latest, /*setParentNodes*/ false, ts.ScriptKind.TS));
2657
+ var filename = path_1.default.join(outputDir, 'Storage.ts');
2658
+ (0, fs_1.writeFileSync)(filename, result, { flag: 'w' });
2659
+ }
2660
+ function resetOutputDir(outputDir) {
2661
+ (0, fs_extra_1.emptydirSync)(outputDir);
2662
+ for (var moduleName in Schema) {
2663
+ (0, fs_1.mkdirSync)(path_1.default.join(outputDir, moduleName));
2664
+ (0, fs_1.mkdirSync)(path_1.default.join(outputDir, moduleName, 'locales'));
2665
+ }
2666
+ (0, fs_1.mkdirSync)(path_1.default.join(outputDir, '_locales'));
2667
+ }
2668
+ function addReverseRelationship() {
2669
+ var e_18, _a;
2670
+ for (var reverseEntity in ReversePointerRelations) {
2671
+ if (!ReversePointerEntities.hasOwnProperty(reverseEntity)) {
2672
+ throw new Error("\u300C".concat(reverseEntity, "\u300D\u88AB\u5F15\u7528\u4E3A\u4E00\u4E2A\u53CD\u6307\u5BF9\u8C61\uFF0C\u4F46\u5176\u5B9A\u4E49\u4E2D\u7684entity\u548CentityId\u4E0D\u7B26\u5408\u8981\u6C42"));
2673
+ }
2674
+ try {
2675
+ for (var _b = (e_18 = void 0, __values(ReversePointerRelations[reverseEntity])), _c = _b.next(); !_c.done; _c = _b.next()) {
2676
+ var one = _c.value;
2677
+ addRelationship(reverseEntity, one, 'entity', false);
2678
+ }
2679
+ }
2680
+ catch (e_18_1) { e_18 = { error: e_18_1 }; }
2681
+ finally {
2682
+ try {
2683
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
2684
+ }
2685
+ finally { if (e_18) throw e_18.error; }
2686
+ }
2687
+ }
2688
+ }
2689
+ function outputPackageJson(outputDir) {
2690
+ var pj = {
2691
+ "name": process.env.COMPLING_AS_LIB ? "general-app-domain" : "oak-app-domain",
2692
+ "main": "index.ts"
2693
+ };
2694
+ var indexTs = "export * from './EntityDict';\n export * from './Storage';\n export * from './ActionDefDict';\n ";
2695
+ var filename = path_1.default.join(outputDir, 'index.ts');
2696
+ (0, fs_1.writeFileSync)(filename, indexTs, { flag: 'w' });
2697
+ filename = path_1.default.join(outputDir, 'package.json');
2698
+ (0, fs_1.writeFileSync)(filename, JSON.stringify(pj), { flag: 'w' });
2699
+ // 执行npm link
2700
+ /* try {
2701
+ execSync('npm link', {
2702
+ cwd: outputDir,
2703
+ });
2704
+ }
2705
+ catch (err) {
2706
+ console.error(err);
2707
+ } */
2708
+ }
2709
+ function analyzeEntities(inputDir) {
2710
+ var files = (0, fs_1.readdirSync)(inputDir);
2711
+ var fullFilenames = files.map(function (ele) {
2712
+ var entity = ele.slice(0, ele.indexOf('.'));
2713
+ if (env_1.RESERVED_ENTITIES.includes(entity) || env_1.RESERVED_ENTITIES.find(function (ele2) { return entity.startsWith(ele2); })) {
2714
+ throw new Error("".concat(ele, "\u662F\u7CFB\u7EDF\u4FDD\u7559\u5B57\uFF0C\u8BF7\u52FF\u4F7F\u7528\u5176\u5F53\u5BF9\u8C61\u540D\u6216\u5BF9\u8C61\u540D\u524D\u7F00"));
2715
+ }
2716
+ return "".concat(inputDir, "/").concat(ele);
2717
+ });
2718
+ var program = ts.createProgram(fullFilenames, { allowJs: true });
2719
+ files.forEach(function (filename) {
2720
+ analyzeEntity(filename, inputDir, program);
2721
+ });
2722
+ }
2723
+ exports.analyzeEntities = analyzeEntities;
2724
+ function buildSchema(outputDir) {
2725
+ addReverseRelationship();
2726
+ var printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
2727
+ resetOutputDir(outputDir);
2728
+ outputSchema(outputDir, printer);
2729
+ outputLocale(outputDir, printer);
2730
+ outputSubQuery(outputDir, printer);
2731
+ outputAction(outputDir, printer);
2732
+ outputEntityDict(outputDir, printer);
2733
+ outputStorage(outputDir, printer);
2734
+ //if (!process.env.COMPLING_AS_LIB) {
2735
+ outputPackageJson(outputDir);
2736
+ //}
2737
+ }
2738
+ exports.buildSchema = buildSchema;