oak-domain 4.0.3 → 4.2.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 (73) hide show
  1. package/lib/base-app-domain/ActionAuth/Schema.d.ts +1 -2
  2. package/lib/base-app-domain/ActionDefDict.d.ts +2 -2
  3. package/lib/base-app-domain/I18n/Schema.d.ts +1 -2
  4. package/lib/base-app-domain/Modi/Schema.d.ts +1 -2
  5. package/lib/base-app-domain/ModiEntity/Schema.d.ts +1 -2
  6. package/lib/base-app-domain/Oper/Schema.d.ts +8 -3
  7. package/lib/base-app-domain/Oper/Storage.js +19 -1
  8. package/lib/base-app-domain/OperEntity/Schema.d.ts +1 -2
  9. package/lib/base-app-domain/Path/Schema.d.ts +1 -2
  10. package/lib/base-app-domain/Relation/Schema.d.ts +1 -2
  11. package/lib/base-app-domain/RelationAuth/Schema.d.ts +1 -2
  12. package/lib/base-app-domain/User/Action.d.ts +1 -0
  13. package/lib/base-app-domain/User/Action.js +3 -3
  14. package/lib/base-app-domain/User/Schema.d.ts +1 -2
  15. package/lib/base-app-domain/UserEntityClaim/Schema.d.ts +1 -2
  16. package/lib/base-app-domain/UserEntityGrant/Action.d.ts +5 -5
  17. package/lib/base-app-domain/UserEntityGrant/Action.js +5 -5
  18. package/lib/base-app-domain/UserEntityGrant/Schema.d.ts +1 -2
  19. package/lib/base-app-domain/UserRelation/Schema.d.ts +1 -2
  20. package/lib/compiler/localeBuilder.d.ts +27 -27
  21. package/lib/compiler/localeBuilder.js +215 -215
  22. package/lib/compiler/routerBuilder.js +263 -263
  23. package/lib/compiler/schemalBuilder.js +1058 -460
  24. package/lib/entities/Oper.d.ts +2 -1
  25. package/lib/entities/Oper.js +16 -1
  26. package/lib/entities/User.d.ts +10 -0
  27. package/lib/entities/User.js +3 -2
  28. package/lib/index.d.ts +0 -22
  29. package/lib/index.js +1 -35
  30. package/lib/store/AsyncRowStore.d.ts +2 -1
  31. package/lib/store/AsyncRowStore.js +180 -180
  32. package/lib/store/CascadeStore.js +7 -31
  33. package/lib/store/RelationAuth.d.ts +103 -103
  34. package/lib/store/RelationAuth.js +1209 -1343
  35. package/lib/store/SyncRowStore.d.ts +1 -1
  36. package/lib/store/TriggerExecutor.js +1 -1
  37. package/lib/store/actionDef.js +4 -4
  38. package/lib/store/checker.js +487 -487
  39. package/lib/triggers/index.d.ts +2 -2
  40. package/lib/triggers/index.js +21 -1
  41. package/lib/types/Aspect.d.ts +1 -1
  42. package/lib/types/Configuration.d.ts +42 -0
  43. package/lib/types/Configuration.js +3 -0
  44. package/lib/types/Connector.d.ts +1 -1
  45. package/lib/types/Context.d.ts +1 -1
  46. package/lib/types/Entity.d.ts +4 -4
  47. package/lib/types/Environment.d.ts +3 -0
  48. package/lib/types/Exception.d.ts +155 -155
  49. package/lib/types/Exception.js +436 -436
  50. package/lib/types/Sync.d.ts +48 -0
  51. package/lib/types/Sync.js +8 -0
  52. package/lib/types/index.d.ts +1 -0
  53. package/lib/types/index.js +1 -0
  54. package/lib/utils/SimpleConnector.d.ts +1 -1
  55. package/lib/utils/SimpleConnector.js +1 -1
  56. package/lib/utils/assert.d.ts +0 -1
  57. package/lib/utils/projection.d.ts +1 -1
  58. package/lib/utils/relationPath.d.ts +31 -0
  59. package/lib/utils/relationPath.js +202 -0
  60. package/package.json +51 -51
  61. package/src/entities/ActionAuth.ts +41 -41
  62. package/src/entities/I18n.ts +45 -45
  63. package/src/entities/Modi.ts +69 -69
  64. package/src/entities/ModiEntity.ts +26 -26
  65. package/src/entities/Oper.ts +48 -32
  66. package/src/entities/OperEntity.ts +27 -27
  67. package/src/entities/Path.ts +43 -43
  68. package/src/entities/Relation.ts +43 -43
  69. package/src/entities/RelationAuth.ts +44 -44
  70. package/src/entities/User.ts +48 -48
  71. package/src/entities/UserEntityClaim.ts +29 -29
  72. package/src/entities/UserEntityGrant.ts +24 -24
  73. package/src/entities/UserRelation.ts +50 -50
@@ -1,263 +1,263 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildRouter = void 0;
4
- const tslib_1 = require("tslib");
5
- const path_1 = require("path");
6
- const fs_extra_1 = require("fs-extra");
7
- const assert_1 = tslib_1.__importDefault(require("assert"));
8
- const ts = tslib_1.__importStar(require("typescript"));
9
- const node_watch_1 = tslib_1.__importDefault(require("node-watch"));
10
- const { factory } = ts;
11
- const NameSpaceDescDict = {};
12
- function checkPageDir(dir, relativePath, ns, type) {
13
- let changed = false;
14
- const { pages } = NameSpaceDescDict[ns];
15
- const subdirs = [];
16
- const files = (0, fs_extra_1.readdirSync)(dir);
17
- files.forEach((file) => {
18
- const filepath = (0, path_1.join)(dir, file);
19
- const stat = (0, fs_extra_1.statSync)(filepath);
20
- if (stat.isFile() &&
21
- ['web.tsx', 'web.pc.tsx', 'render.native.tsx', 'render.ios.tsx', 'render.android.tsx', 'index.xml'].includes(file)) {
22
- if (!pages.hasOwnProperty(dir)) {
23
- const indexJsonFile = (0, path_1.join)(dir, 'index.json');
24
- let oakDisablePulldownRefresh = false;
25
- if ((0, fs_extra_1.existsSync)(indexJsonFile)) {
26
- const { enablePullDownRefresh = true, } = require(indexJsonFile);
27
- oakDisablePulldownRefresh =
28
- !enablePullDownRefresh;
29
- }
30
- pages[dir] = {
31
- path: relativePath.replace(/\\/g, '/'),
32
- oakDisablePulldownRefresh,
33
- hasNative: ['render.native.tsx', 'render.ios.tsx', 'render.android.tsx'].includes(file),
34
- hasWeb: ['web.tsx', 'web.pc.tsx'].includes(file),
35
- hasWechatMp: file === 'index.xml',
36
- };
37
- changed = true;
38
- }
39
- else {
40
- if (['render.native.tsx', 'render.ios.tsx', 'render.android.tsx'].includes(file) && type === 'native') {
41
- if (pages[dir].hasNative === false) {
42
- pages[dir].hasNative = true;
43
- changed = true;
44
- }
45
- }
46
- else if (['web.tsx', 'web.pc.tsx'].includes(file) && type === 'web') {
47
- if (pages[dir].hasWeb === false) {
48
- pages[dir].hasWeb = true;
49
- changed = true;
50
- }
51
- }
52
- else {
53
- if (pages[dir].hasWechatMp === false && type === 'wechatMp') {
54
- pages[dir].hasWechatMp = true;
55
- }
56
- }
57
- }
58
- }
59
- else if (stat.isDirectory()) {
60
- subdirs.push(file);
61
- }
62
- });
63
- return {
64
- subdirs,
65
- changed,
66
- };
67
- }
68
- function traverseNsDir(nsDir, ns, type) {
69
- NameSpaceDescDict[ns] = {
70
- pages: {}
71
- };
72
- const { pages } = NameSpaceDescDict[ns];
73
- const traverse = (dir, relativePath) => {
74
- const { subdirs } = checkPageDir(dir, relativePath, ns, type);
75
- subdirs.forEach((subdir) => {
76
- const dir2 = (0, path_1.join)(dir, subdir);
77
- const relativePath2 = (0, path_1.join)(relativePath, subdir);
78
- traverse(dir2, relativePath2);
79
- });
80
- };
81
- traverse(nsDir, '');
82
- }
83
- function traversePageDir(projectDir, type) {
84
- const pageDir = (0, path_1.join)(projectDir, 'src', 'pages');
85
- const namespaces = (0, fs_extra_1.readdirSync)(pageDir);
86
- namespaces.forEach((ns) => {
87
- const nsDir = (0, path_1.join)(pageDir, ns);
88
- const stat = (0, fs_extra_1.statSync)(nsDir);
89
- if (stat.isDirectory()) {
90
- traverseNsDir(nsDir, ns, type);
91
- }
92
- });
93
- }
94
- function makeWebAllRouters(namespaceDir, projectDir, routerFileDir) {
95
- const nss = (0, fs_extra_1.readdirSync)(namespaceDir);
96
- return factory.createArrayLiteralExpression(nss.map((ns) => {
97
- (0, assert_1.default)(NameSpaceDescDict[ns], `${ns}在pages下没有对应的目录`);
98
- const { pages } = NameSpaceDescDict[ns];
99
- const nsIndexJsonFile = (0, path_1.join)(namespaceDir, ns, 'index.json');
100
- let path2 = `/${ns}`;
101
- let notFound2 = '', first2 = '';
102
- if ((0, fs_extra_1.existsSync)(nsIndexJsonFile)) {
103
- const { path, notFound, first } = require(nsIndexJsonFile);
104
- if (path) {
105
- path2 = path.replace(/\\/g, '/');
106
- }
107
- if (notFound) {
108
- notFound2 = notFound.replace(/\\/g, '/');
109
- }
110
- if (first) {
111
- first2 = first.replace(/\\/g, '/');
112
- if (first2.startsWith('/')) {
113
- first2 = first2.slice(1);
114
- }
115
- }
116
- }
117
- let firstPage;
118
- const children = Object.values(pages).filter((ele) => ele.hasWeb).map(({ path, oakDisablePulldownRefresh }) => {
119
- const properties = [
120
- factory.createPropertyAssignment('path', factory.createStringLiteral(path)),
121
- factory.createPropertyAssignment('namespace', factory.createStringLiteral(path2)),
122
- factory.createPropertyAssignment('meta', factory.createObjectLiteralExpression([
123
- factory.createPropertyAssignment('oakDisablePulldownRefresh', oakDisablePulldownRefresh ? factory.createTrue() : factory.createFalse())
124
- ])),
125
- factory.createPropertyAssignment(factory.createIdentifier("Component"), factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("React"), factory.createIdentifier("lazy")), undefined, [factory.createArrowFunction(undefined, undefined, [], undefined, factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), factory.createCallExpression(factory.createIdentifier('import'), undefined, [
126
- factory.createStringLiteral((0, path_1.relative)(routerFileDir, (0, path_1.join)(projectDir, 'src', 'pages', ns, path)).replace(/\\/g, '/'))
127
- ]))]))
128
- ];
129
- if (first2 === path) {
130
- const firstProperties = [...properties];
131
- firstProperties.push(factory.createPropertyAssignment('isFirst', factory.createTrue()));
132
- firstPage = factory.createObjectLiteralExpression(firstProperties, true);
133
- }
134
- return factory.createObjectLiteralExpression(properties, true);
135
- });
136
- if (firstPage) {
137
- children.push(firstPage);
138
- }
139
- if (notFound2) {
140
- children.push(factory.createObjectLiteralExpression([
141
- factory.createPropertyAssignment('path', factory.createStringLiteral('*')),
142
- factory.createPropertyAssignment('namespace', factory.createStringLiteral(path2)),
143
- factory.createPropertyAssignment(factory.createIdentifier("Component"), factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("React"), factory.createIdentifier("lazy")), undefined, [factory.createArrowFunction(undefined, undefined, [], undefined, factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), factory.createCallExpression(factory.createIdentifier('import'), undefined, [
144
- factory.createStringLiteral((0, path_1.relative)(routerFileDir, (0, path_1.join)(projectDir, 'src', 'pages', ns, notFound2)).replace(/\\/g, '/'))
145
- ]))]))
146
- ], true));
147
- }
148
- return factory.createObjectLiteralExpression([
149
- factory.createPropertyAssignment('path', factory.createStringLiteral(path2)),
150
- factory.createPropertyAssignment('namespace', factory.createStringLiteral(path2)),
151
- factory.createPropertyAssignment(factory.createIdentifier("Component"), factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("React"), factory.createIdentifier("lazy")), undefined, [factory.createArrowFunction(undefined, undefined, [], undefined, factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), factory.createCallExpression(factory.createIdentifier('import'), undefined, [
152
- factory.createStringLiteral((0, path_1.relative)(routerFileDir, (0, path_1.join)(namespaceDir, ns)).replace(/\\/g, '/'))
153
- ]))])),
154
- factory.createPropertyAssignment('children', factory.createArrayLiteralExpression(children))
155
- ], true);
156
- }), true);
157
- }
158
- function judgeUseOakRouterBuilder(statements) {
159
- const stmt = statements[0];
160
- return ts.isExpressionStatement(stmt) && ts.isStringLiteral(stmt.expression) && stmt.expression.text === 'use oak router builder';
161
- }
162
- function outputInWebAppDir(appDir) {
163
- const routerFileName = (0, path_1.join)(appDir, 'router', 'allRouters.ts');
164
- if ((0, fs_extra_1.existsSync)(routerFileName)) {
165
- const program = ts.createProgram([routerFileName], {
166
- removeComments: false,
167
- });
168
- const routerFile = program.getSourceFile(routerFileName);
169
- (0, assert_1.default)(routerFile);
170
- const namespaceDir = (0, path_1.join)(appDir, 'namespaces');
171
- const { statements } = routerFile;
172
- if (judgeUseOakRouterBuilder(statements)) {
173
- statements.forEach((statement) => {
174
- if (ts.isVariableStatement(statement)) {
175
- const declaration = statement.declarationList.declarations.find(declaration => ts.isIdentifier(declaration.name) && declaration.name.text === 'allRouters');
176
- if (declaration) {
177
- Object.assign(declaration, {
178
- initializer: makeWebAllRouters(namespaceDir, (0, path_1.join)(appDir, '../../../..'), (0, path_1.dirname)(routerFileName))
179
- });
180
- }
181
- }
182
- });
183
- const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed, removeComments: false });
184
- const result = printer.printNode(ts.EmitHint.Unspecified, routerFile, routerFile);
185
- (0, fs_extra_1.writeFileSync)(routerFileName, result);
186
- }
187
- }
188
- else {
189
- console.warn(`${appDir}的目录结构未按照标准建立,缺少了${routerFileName}`);
190
- }
191
- }
192
- function outputInWebDir(dir) {
193
- const srcAppDir = (0, path_1.join)(dir, 'src', 'app');
194
- const apps = (0, fs_extra_1.readdirSync)(srcAppDir);
195
- apps.forEach((app) => {
196
- const appDir = (0, path_1.join)(srcAppDir, app);
197
- const stat = (0, fs_extra_1.statSync)(appDir);
198
- if (stat.isDirectory()) {
199
- outputInWebAppDir(appDir);
200
- }
201
- });
202
- }
203
- function watchDir(projectDir, startupDir, type) {
204
- const srcPageDir = (0, path_1.join)(projectDir, 'src', 'pages');
205
- console.log('watch dir ', srcPageDir);
206
- if (startupDir.startsWith('web')) {
207
- const srcAppDir = (0, path_1.join)(projectDir, startupDir, 'src', 'app');
208
- const apps = (0, fs_extra_1.readdirSync)(srcAppDir);
209
- const tryOutputAppDir = (ns) => {
210
- apps.forEach((app) => {
211
- const appDir = (0, path_1.join)(srcAppDir, app);
212
- const namespaceDir = (0, path_1.join)(appDir, 'namespaces');
213
- const namespaces = (0, fs_extra_1.readdirSync)(namespaceDir);
214
- if (namespaces.includes(ns)) {
215
- outputInWebAppDir(appDir);
216
- }
217
- });
218
- };
219
- (0, node_watch_1.default)(srcPageDir, {
220
- recursive: true,
221
- filter: new RegExp('web\.tsx|web\.pc\.tsx|index\.xml|render\.(native|ios|android)\.tsx'),
222
- }, (evt, filepath) => {
223
- const dir = (0, path_1.dirname)(filepath);
224
- const relativeDir = (0, path_1.relative)((0, path_1.join)(projectDir, 'src', 'pages'), filepath);
225
- const ns = relativeDir.split('\\')[0];
226
- const relativePath = (0, path_1.relative)(ns, (0, path_1.dirname)(relativeDir));
227
- const { pages } = NameSpaceDescDict[ns];
228
- console.log(filepath, dir, ns);
229
- if (evt === 'remove') {
230
- if ((0, fs_extra_1.existsSync)(dir)) {
231
- const { changed } = checkPageDir(dir, relativePath, ns, type);
232
- if (changed) {
233
- tryOutputAppDir(ns);
234
- }
235
- }
236
- else {
237
- delete pages[dir];
238
- tryOutputAppDir(ns);
239
- }
240
- }
241
- else {
242
- const { changed } = checkPageDir(dir, relativePath, ns, type);
243
- if (changed) {
244
- tryOutputAppDir(ns);
245
- }
246
- }
247
- });
248
- }
249
- }
250
- function buildRouter(projectDir, startupDir, watch) {
251
- const type = startupDir.startsWith('web') ? 'web' : (startupDir.startsWith('native') ? 'native' : 'wechatMp');
252
- traversePageDir(projectDir, type);
253
- const subDir = (0, fs_extra_1.readdirSync)(projectDir);
254
- (0, assert_1.default)(subDir.includes(startupDir));
255
- if (startupDir.startsWith('web')) {
256
- outputInWebDir((0, path_1.join)(projectDir, startupDir));
257
- }
258
- // todo native
259
- if (watch) {
260
- watchDir(projectDir, startupDir, type);
261
- }
262
- }
263
- exports.buildRouter = buildRouter;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildRouter = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const path_1 = require("path");
6
+ const fs_extra_1 = require("fs-extra");
7
+ const assert_1 = tslib_1.__importDefault(require("assert"));
8
+ const ts = tslib_1.__importStar(require("typescript"));
9
+ const node_watch_1 = tslib_1.__importDefault(require("node-watch"));
10
+ const { factory } = ts;
11
+ const NameSpaceDescDict = {};
12
+ function checkPageDir(dir, relativePath, ns, type) {
13
+ let changed = false;
14
+ const { pages } = NameSpaceDescDict[ns];
15
+ const subdirs = [];
16
+ const files = (0, fs_extra_1.readdirSync)(dir);
17
+ files.forEach((file) => {
18
+ const filepath = (0, path_1.join)(dir, file);
19
+ const stat = (0, fs_extra_1.statSync)(filepath);
20
+ if (stat.isFile() &&
21
+ ['web.tsx', 'web.pc.tsx', 'render.native.tsx', 'render.ios.tsx', 'render.android.tsx', 'index.xml'].includes(file)) {
22
+ if (!pages.hasOwnProperty(dir)) {
23
+ const indexJsonFile = (0, path_1.join)(dir, 'index.json');
24
+ let oakDisablePulldownRefresh = false;
25
+ if ((0, fs_extra_1.existsSync)(indexJsonFile)) {
26
+ const { enablePullDownRefresh = true, } = require(indexJsonFile);
27
+ oakDisablePulldownRefresh =
28
+ !enablePullDownRefresh;
29
+ }
30
+ pages[dir] = {
31
+ path: relativePath.replace(/\\/g, '/'),
32
+ oakDisablePulldownRefresh,
33
+ hasNative: ['render.native.tsx', 'render.ios.tsx', 'render.android.tsx'].includes(file),
34
+ hasWeb: ['web.tsx', 'web.pc.tsx'].includes(file),
35
+ hasWechatMp: file === 'index.xml',
36
+ };
37
+ changed = true;
38
+ }
39
+ else {
40
+ if (['render.native.tsx', 'render.ios.tsx', 'render.android.tsx'].includes(file) && type === 'native') {
41
+ if (pages[dir].hasNative === false) {
42
+ pages[dir].hasNative = true;
43
+ changed = true;
44
+ }
45
+ }
46
+ else if (['web.tsx', 'web.pc.tsx'].includes(file) && type === 'web') {
47
+ if (pages[dir].hasWeb === false) {
48
+ pages[dir].hasWeb = true;
49
+ changed = true;
50
+ }
51
+ }
52
+ else {
53
+ if (pages[dir].hasWechatMp === false && type === 'wechatMp') {
54
+ pages[dir].hasWechatMp = true;
55
+ }
56
+ }
57
+ }
58
+ }
59
+ else if (stat.isDirectory()) {
60
+ subdirs.push(file);
61
+ }
62
+ });
63
+ return {
64
+ subdirs,
65
+ changed,
66
+ };
67
+ }
68
+ function traverseNsDir(nsDir, ns, type) {
69
+ NameSpaceDescDict[ns] = {
70
+ pages: {}
71
+ };
72
+ const { pages } = NameSpaceDescDict[ns];
73
+ const traverse = (dir, relativePath) => {
74
+ const { subdirs } = checkPageDir(dir, relativePath, ns, type);
75
+ subdirs.forEach((subdir) => {
76
+ const dir2 = (0, path_1.join)(dir, subdir);
77
+ const relativePath2 = (0, path_1.join)(relativePath, subdir);
78
+ traverse(dir2, relativePath2);
79
+ });
80
+ };
81
+ traverse(nsDir, '');
82
+ }
83
+ function traversePageDir(projectDir, type) {
84
+ const pageDir = (0, path_1.join)(projectDir, 'src', 'pages');
85
+ const namespaces = (0, fs_extra_1.readdirSync)(pageDir);
86
+ namespaces.forEach((ns) => {
87
+ const nsDir = (0, path_1.join)(pageDir, ns);
88
+ const stat = (0, fs_extra_1.statSync)(nsDir);
89
+ if (stat.isDirectory()) {
90
+ traverseNsDir(nsDir, ns, type);
91
+ }
92
+ });
93
+ }
94
+ function makeWebAllRouters(namespaceDir, projectDir, routerFileDir) {
95
+ const nss = (0, fs_extra_1.readdirSync)(namespaceDir);
96
+ return factory.createArrayLiteralExpression(nss.map((ns) => {
97
+ (0, assert_1.default)(NameSpaceDescDict[ns], `${ns}在pages下没有对应的目录`);
98
+ const { pages } = NameSpaceDescDict[ns];
99
+ const nsIndexJsonFile = (0, path_1.join)(namespaceDir, ns, 'index.json');
100
+ let path2 = `/${ns}`;
101
+ let notFound2 = '', first2 = '';
102
+ if ((0, fs_extra_1.existsSync)(nsIndexJsonFile)) {
103
+ const { path, notFound, first } = require(nsIndexJsonFile);
104
+ if (path) {
105
+ path2 = path.replace(/\\/g, '/');
106
+ }
107
+ if (notFound) {
108
+ notFound2 = notFound.replace(/\\/g, '/');
109
+ }
110
+ if (first) {
111
+ first2 = first.replace(/\\/g, '/');
112
+ if (first2.startsWith('/')) {
113
+ first2 = first2.slice(1);
114
+ }
115
+ }
116
+ }
117
+ let firstPage;
118
+ const children = Object.values(pages).filter((ele) => ele.hasWeb).map(({ path, oakDisablePulldownRefresh }) => {
119
+ const properties = [
120
+ factory.createPropertyAssignment('path', factory.createStringLiteral(path)),
121
+ factory.createPropertyAssignment('namespace', factory.createStringLiteral(path2)),
122
+ factory.createPropertyAssignment('meta', factory.createObjectLiteralExpression([
123
+ factory.createPropertyAssignment('oakDisablePulldownRefresh', oakDisablePulldownRefresh ? factory.createTrue() : factory.createFalse())
124
+ ])),
125
+ factory.createPropertyAssignment(factory.createIdentifier("Component"), factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("React"), factory.createIdentifier("lazy")), undefined, [factory.createArrowFunction(undefined, undefined, [], undefined, factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), factory.createCallExpression(factory.createIdentifier('import'), undefined, [
126
+ factory.createStringLiteral((0, path_1.relative)(routerFileDir, (0, path_1.join)(projectDir, 'src', 'pages', ns, path)).replace(/\\/g, '/'))
127
+ ]))]))
128
+ ];
129
+ if (first2 === path) {
130
+ const firstProperties = [...properties];
131
+ firstProperties.push(factory.createPropertyAssignment('isFirst', factory.createTrue()));
132
+ firstPage = factory.createObjectLiteralExpression(firstProperties, true);
133
+ }
134
+ return factory.createObjectLiteralExpression(properties, true);
135
+ });
136
+ if (firstPage) {
137
+ children.push(firstPage);
138
+ }
139
+ if (notFound2) {
140
+ children.push(factory.createObjectLiteralExpression([
141
+ factory.createPropertyAssignment('path', factory.createStringLiteral('*')),
142
+ factory.createPropertyAssignment('namespace', factory.createStringLiteral(path2)),
143
+ factory.createPropertyAssignment(factory.createIdentifier("Component"), factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("React"), factory.createIdentifier("lazy")), undefined, [factory.createArrowFunction(undefined, undefined, [], undefined, factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), factory.createCallExpression(factory.createIdentifier('import'), undefined, [
144
+ factory.createStringLiteral((0, path_1.relative)(routerFileDir, (0, path_1.join)(projectDir, 'src', 'pages', ns, notFound2)).replace(/\\/g, '/'))
145
+ ]))]))
146
+ ], true));
147
+ }
148
+ return factory.createObjectLiteralExpression([
149
+ factory.createPropertyAssignment('path', factory.createStringLiteral(path2)),
150
+ factory.createPropertyAssignment('namespace', factory.createStringLiteral(path2)),
151
+ factory.createPropertyAssignment(factory.createIdentifier("Component"), factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("React"), factory.createIdentifier("lazy")), undefined, [factory.createArrowFunction(undefined, undefined, [], undefined, factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), factory.createCallExpression(factory.createIdentifier('import'), undefined, [
152
+ factory.createStringLiteral((0, path_1.relative)(routerFileDir, (0, path_1.join)(namespaceDir, ns)).replace(/\\/g, '/'))
153
+ ]))])),
154
+ factory.createPropertyAssignment('children', factory.createArrayLiteralExpression(children))
155
+ ], true);
156
+ }), true);
157
+ }
158
+ function judgeUseOakRouterBuilder(statements) {
159
+ const stmt = statements[0];
160
+ return ts.isExpressionStatement(stmt) && ts.isStringLiteral(stmt.expression) && stmt.expression.text === 'use oak router builder';
161
+ }
162
+ function outputInWebAppDir(appDir) {
163
+ const routerFileName = (0, path_1.join)(appDir, 'router', 'allRouters.ts');
164
+ if ((0, fs_extra_1.existsSync)(routerFileName)) {
165
+ const program = ts.createProgram([routerFileName], {
166
+ removeComments: false,
167
+ });
168
+ const routerFile = program.getSourceFile(routerFileName);
169
+ (0, assert_1.default)(routerFile);
170
+ const namespaceDir = (0, path_1.join)(appDir, 'namespaces');
171
+ const { statements } = routerFile;
172
+ if (judgeUseOakRouterBuilder(statements)) {
173
+ statements.forEach((statement) => {
174
+ if (ts.isVariableStatement(statement)) {
175
+ const declaration = statement.declarationList.declarations.find(declaration => ts.isIdentifier(declaration.name) && declaration.name.text === 'allRouters');
176
+ if (declaration) {
177
+ Object.assign(declaration, {
178
+ initializer: makeWebAllRouters(namespaceDir, (0, path_1.join)(appDir, '../../../..'), (0, path_1.dirname)(routerFileName))
179
+ });
180
+ }
181
+ }
182
+ });
183
+ const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed, removeComments: false });
184
+ const result = printer.printNode(ts.EmitHint.Unspecified, routerFile, routerFile);
185
+ (0, fs_extra_1.writeFileSync)(routerFileName, result);
186
+ }
187
+ }
188
+ else {
189
+ console.warn(`${appDir}的目录结构未按照标准建立,缺少了${routerFileName}`);
190
+ }
191
+ }
192
+ function outputInWebDir(dir) {
193
+ const srcAppDir = (0, path_1.join)(dir, 'src', 'app');
194
+ const apps = (0, fs_extra_1.readdirSync)(srcAppDir);
195
+ apps.forEach((app) => {
196
+ const appDir = (0, path_1.join)(srcAppDir, app);
197
+ const stat = (0, fs_extra_1.statSync)(appDir);
198
+ if (stat.isDirectory()) {
199
+ outputInWebAppDir(appDir);
200
+ }
201
+ });
202
+ }
203
+ function watchDir(projectDir, startupDir, type) {
204
+ const srcPageDir = (0, path_1.join)(projectDir, 'src', 'pages');
205
+ console.log('watch dir ', srcPageDir);
206
+ if (startupDir.startsWith('web')) {
207
+ const srcAppDir = (0, path_1.join)(projectDir, startupDir, 'src', 'app');
208
+ const apps = (0, fs_extra_1.readdirSync)(srcAppDir);
209
+ const tryOutputAppDir = (ns) => {
210
+ apps.forEach((app) => {
211
+ const appDir = (0, path_1.join)(srcAppDir, app);
212
+ const namespaceDir = (0, path_1.join)(appDir, 'namespaces');
213
+ const namespaces = (0, fs_extra_1.readdirSync)(namespaceDir);
214
+ if (namespaces.includes(ns)) {
215
+ outputInWebAppDir(appDir);
216
+ }
217
+ });
218
+ };
219
+ (0, node_watch_1.default)(srcPageDir, {
220
+ recursive: true,
221
+ filter: new RegExp('web\.tsx|web\.pc\.tsx|index\.xml|render\.(native|ios|android)\.tsx'),
222
+ }, (evt, filepath) => {
223
+ const dir = (0, path_1.dirname)(filepath);
224
+ const relativeDir = (0, path_1.relative)((0, path_1.join)(projectDir, 'src', 'pages'), filepath);
225
+ const ns = relativeDir.split('\\')[0];
226
+ const relativePath = (0, path_1.relative)(ns, (0, path_1.dirname)(relativeDir));
227
+ const { pages } = NameSpaceDescDict[ns];
228
+ console.log(filepath, dir, ns);
229
+ if (evt === 'remove') {
230
+ if ((0, fs_extra_1.existsSync)(dir)) {
231
+ const { changed } = checkPageDir(dir, relativePath, ns, type);
232
+ if (changed) {
233
+ tryOutputAppDir(ns);
234
+ }
235
+ }
236
+ else {
237
+ delete pages[dir];
238
+ tryOutputAppDir(ns);
239
+ }
240
+ }
241
+ else {
242
+ const { changed } = checkPageDir(dir, relativePath, ns, type);
243
+ if (changed) {
244
+ tryOutputAppDir(ns);
245
+ }
246
+ }
247
+ });
248
+ }
249
+ }
250
+ function buildRouter(projectDir, startupDir, watch) {
251
+ const type = startupDir.startsWith('web') ? 'web' : (startupDir.startsWith('native') ? 'native' : 'wechatMp');
252
+ traversePageDir(projectDir, type);
253
+ const subDir = (0, fs_extra_1.readdirSync)(projectDir);
254
+ (0, assert_1.default)(subDir.includes(startupDir));
255
+ if (startupDir.startsWith('web')) {
256
+ outputInWebDir((0, path_1.join)(projectDir, startupDir));
257
+ }
258
+ // todo native
259
+ if (watch) {
260
+ watchDir(projectDir, startupDir, type);
261
+ }
262
+ }
263
+ exports.buildRouter = buildRouter;