@cocojs/cli 0.0.1-alpha.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.
@@ -0,0 +1,788 @@
1
+ 'use strict';
2
+
3
+ var process$1 = require('node:process');
4
+ var fs = require('fs');
5
+ var fse = require('fs-extra');
6
+ var path$1 = require('path');
7
+ var path = require('node:path');
8
+ var chokidar = require('chokidar');
9
+
10
+ function _interopNamespaceDefault(e) {
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var process__namespace = /*#__PURE__*/_interopNamespaceDefault(process$1);
28
+ var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
29
+ var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path$1);
30
+
31
+ function _arrayLikeToArray(r, a) {
32
+ (null == a || a > r.length) && (a = r.length);
33
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
34
+ return n;
35
+ }
36
+ function _arrayWithoutHoles(r) {
37
+ if (Array.isArray(r)) return _arrayLikeToArray(r);
38
+ }
39
+ function asyncGeneratorStep(n, t, e, r, o, a, c) {
40
+ try {
41
+ var i = n[a](c),
42
+ u = i.value;
43
+ } catch (n) {
44
+ return void e(n);
45
+ }
46
+ i.done ? t(u) : Promise.resolve(u).then(r, o);
47
+ }
48
+ function _asyncToGenerator(n) {
49
+ return function () {
50
+ var t = this,
51
+ e = arguments;
52
+ return new Promise(function (r, o) {
53
+ var a = n.apply(t, e);
54
+ function _next(n) {
55
+ asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
56
+ }
57
+ function _throw(n) {
58
+ asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
59
+ }
60
+ _next(void 0);
61
+ });
62
+ };
63
+ }
64
+ function _classCallCheck(a, n) {
65
+ if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
66
+ }
67
+ function _defineProperties(e, r) {
68
+ for (var t = 0; t < r.length; t++) {
69
+ var o = r[t];
70
+ o.enumerable = o.enumerable || false, o.configurable = true, "value" in o && (o.writable = true), Object.defineProperty(e, _toPropertyKey(o.key), o);
71
+ }
72
+ }
73
+ function _createClass(e, r, t) {
74
+ return r && _defineProperties(e.prototype, r), Object.defineProperty(e, "prototype", {
75
+ writable: false
76
+ }), e;
77
+ }
78
+ function _createForOfIteratorHelper(r, e) {
79
+ var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
80
+ if (!t) {
81
+ if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) {
82
+ t && (r = t);
83
+ var n = 0,
84
+ F = function () {};
85
+ return {
86
+ s: F,
87
+ n: function () {
88
+ return n >= r.length ? {
89
+ done: true
90
+ } : {
91
+ done: false,
92
+ value: r[n++]
93
+ };
94
+ },
95
+ e: function (r) {
96
+ throw r;
97
+ },
98
+ f: F
99
+ };
100
+ }
101
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
102
+ }
103
+ var o,
104
+ a = true,
105
+ u = false;
106
+ return {
107
+ s: function () {
108
+ t = t.call(r);
109
+ },
110
+ n: function () {
111
+ var r = t.next();
112
+ return a = r.done, r;
113
+ },
114
+ e: function (r) {
115
+ u = true, o = r;
116
+ },
117
+ f: function () {
118
+ try {
119
+ a || null == t.return || t.return();
120
+ } finally {
121
+ if (u) throw o;
122
+ }
123
+ }
124
+ };
125
+ }
126
+ function _defineProperty(e, r, t) {
127
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
128
+ value: t,
129
+ enumerable: true,
130
+ configurable: true,
131
+ writable: true
132
+ }) : e[r] = t, e;
133
+ }
134
+ function _iterableToArray(r) {
135
+ if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
136
+ }
137
+ function _nonIterableSpread() {
138
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
139
+ }
140
+ function ownKeys(e, r) {
141
+ var t = Object.keys(e);
142
+ if (Object.getOwnPropertySymbols) {
143
+ var o = Object.getOwnPropertySymbols(e);
144
+ r && (o = o.filter(function (r) {
145
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
146
+ })), t.push.apply(t, o);
147
+ }
148
+ return t;
149
+ }
150
+ function _objectSpread2(e) {
151
+ for (var r = 1; r < arguments.length; r++) {
152
+ var t = null != arguments[r] ? arguments[r] : {};
153
+ r % 2 ? ownKeys(Object(t), true).forEach(function (r) {
154
+ _defineProperty(e, r, t[r]);
155
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
156
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
157
+ });
158
+ }
159
+ return e;
160
+ }
161
+ function _regenerator() {
162
+ /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
163
+ var e,
164
+ t,
165
+ r = "function" == typeof Symbol ? Symbol : {},
166
+ n = r.iterator || "@@iterator",
167
+ o = r.toStringTag || "@@toStringTag";
168
+ function i(r, n, o, i) {
169
+ var c = n && n.prototype instanceof Generator ? n : Generator,
170
+ u = Object.create(c.prototype);
171
+ return _regeneratorDefine(u, "_invoke", function (r, n, o) {
172
+ var i,
173
+ c,
174
+ u,
175
+ f = 0,
176
+ p = o || [],
177
+ y = false,
178
+ G = {
179
+ p: 0,
180
+ n: 0,
181
+ v: e,
182
+ a: d,
183
+ f: d.bind(e, 4),
184
+ d: function (t, r) {
185
+ return i = t, c = 0, u = e, G.n = r, a;
186
+ }
187
+ };
188
+ function d(r, n) {
189
+ for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {
190
+ var o,
191
+ i = p[t],
192
+ d = G.p,
193
+ l = i[2];
194
+ r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));
195
+ }
196
+ if (o || r > 1) return a;
197
+ throw y = true, n;
198
+ }
199
+ return function (o, p, l) {
200
+ if (f > 1) throw TypeError("Generator is already running");
201
+ for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {
202
+ i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);
203
+ try {
204
+ if (f = 2, i) {
205
+ if (c || (o = "next"), t = i[o]) {
206
+ if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object");
207
+ if (!t.done) return t;
208
+ u = t.value, c < 2 && (c = 0);
209
+ } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1);
210
+ i = e;
211
+ } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;
212
+ } catch (t) {
213
+ i = e, c = 1, u = t;
214
+ } finally {
215
+ f = 1;
216
+ }
217
+ }
218
+ return {
219
+ value: t,
220
+ done: y
221
+ };
222
+ };
223
+ }(r, o, i), true), u;
224
+ }
225
+ var a = {};
226
+ function Generator() {}
227
+ function GeneratorFunction() {}
228
+ function GeneratorFunctionPrototype() {}
229
+ t = Object.getPrototypeOf;
230
+ var c = [][n] ? t(t([][n]())) : (_regeneratorDefine(t = {}, n, function () {
231
+ return this;
232
+ }), t),
233
+ u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);
234
+ function f(e) {
235
+ return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e;
236
+ }
237
+ return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine(u), _regeneratorDefine(u, o, "Generator"), _regeneratorDefine(u, n, function () {
238
+ return this;
239
+ }), _regeneratorDefine(u, "toString", function () {
240
+ return "[object Generator]";
241
+ }), (_regenerator = function () {
242
+ return {
243
+ w: i,
244
+ m: f
245
+ };
246
+ })();
247
+ }
248
+ function _regeneratorDefine(e, r, n, t) {
249
+ var i = Object.defineProperty;
250
+ try {
251
+ i({}, "", {});
252
+ } catch (e) {
253
+ i = 0;
254
+ }
255
+ _regeneratorDefine = function (e, r, n, t) {
256
+ function o(r, n) {
257
+ _regeneratorDefine(e, r, function (e) {
258
+ return this._invoke(r, n, e);
259
+ });
260
+ }
261
+ r ? i ? i(e, r, {
262
+ value: n,
263
+ enumerable: !t,
264
+ configurable: !t,
265
+ writable: !t
266
+ }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2));
267
+ }, _regeneratorDefine(e, r, n, t);
268
+ }
269
+ function _toConsumableArray(r) {
270
+ return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
271
+ }
272
+ function _toPrimitive(t, r) {
273
+ if ("object" != typeof t || !t) return t;
274
+ var e = t[Symbol.toPrimitive];
275
+ if (void 0 !== e) {
276
+ var i = e.call(t, r);
277
+ if ("object" != typeof i) return i;
278
+ throw new TypeError("@@toPrimitive must return a primitive value.");
279
+ }
280
+ return ("string" === r ? String : Number)(t);
281
+ }
282
+ function _toPropertyKey(t) {
283
+ var i = _toPrimitive(t, "string");
284
+ return "symbol" == typeof i ? i : i + "";
285
+ }
286
+ function _typeof(o) {
287
+ "@babel/helpers - typeof";
288
+
289
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
290
+ return typeof o;
291
+ } : function (o) {
292
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
293
+ }, _typeof(o);
294
+ }
295
+ function _unsupportedIterableToArray(r, a) {
296
+ if (r) {
297
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
298
+ var t = {}.toString.call(r).slice(8, -1);
299
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
300
+ }
301
+ }
302
+
303
+ var Project = /*#__PURE__*/function () {
304
+ function Project(projectPath) {
305
+ var _this = this;
306
+ _classCallCheck(this, Project);
307
+ // 项目所在文件夹的绝对路径
308
+ _defineProperty(this, "absPath", '');
309
+ _defineProperty(this, "genFullPath", function (name) {
310
+ return path.join(_this.srcAbsPath, name);
311
+ });
312
+ this.absPath = path.join(process.cwd(), projectPath);
313
+ }
314
+ return _createClass(Project, [{
315
+ key: "srcAbsPath",
316
+ get: function get() {
317
+ return path.join(this.absPath, "src");
318
+ }
319
+ }, {
320
+ key: "propertiesAbsPath",
321
+ get: function get() {
322
+ return path.join(this.absPath, "properties");
323
+ }
324
+ }, {
325
+ key: "dotCocoAbsPath",
326
+ get: function get() {
327
+ return path.join(this.srcAbsPath, Project.DOT_COCO_DIR);
328
+ }
329
+ }, {
330
+ key: "applicationTsFileAbsPath",
331
+ get: function get() {
332
+ return path.join(this.srcAbsPath, Project.APPLICATION);
333
+ }
334
+ }]);
335
+ }();
336
+ _defineProperty(Project, "DOT_COCO_DIR", '.coco');
337
+ _defineProperty(Project, "APPLICATION", 'application.ts');
338
+ _defineProperty(Project, "VIEW_DIR", 'view');
339
+ _defineProperty(Project, "CONFIG_DIR", 'config');
340
+ _defineProperty(Project, "PAGE_DIR", 'page');
341
+ _defineProperty(Project, "LAYOUT_DIR", 'layout');
342
+ _defineProperty(Project, "Flow_DIR", 'flow');
343
+ _defineProperty(Project, "API_DIR", 'api');
344
+ _defineProperty(Project, "STORE_DIR", 'store');
345
+ _defineProperty(Project, "GLOBAL_DATA_DIR", 'global-data');
346
+ _defineProperty(Project, "COMPONENTS_DIR", 'component');
347
+
348
+ /**
349
+ * 构建.coco文件夹
350
+ */
351
+ function genIndexTsx(project, iocComponents) {
352
+ // 2. 生成.coco文件
353
+ var importStatements = iocComponents.map(function (_ref) {
354
+ var className = _ref.className,
355
+ filePath = _ref.filePath;
356
+ var relativePath = path$1.relative(project.dotCocoAbsPath, filePath);
357
+ var extLen = path$1.extname(relativePath).length;
358
+ var relativePathNoExt = relativePath.slice(0, relativePath.length - extLen);
359
+ return "export { default as ".concat(className, " } from '").concat(relativePathNoExt, "';");
360
+ });
361
+ var dotCocoDir = project.genFullPath(Project.DOT_COCO_DIR);
362
+ fse.ensureDirSync(dotCocoDir);
363
+ fs.writeFileSync(path$1.join(dotCocoDir, 'index.tsx'), appendExport(importStatements), {
364
+ encoding: 'utf-8'
365
+ });
366
+ }
367
+ function appendExport(importStatements) {
368
+ var pre = "";
369
+ var append = "\nimport { Application } from \"@cocojs/mvc\";\nimport applicationJson from \"./application.json\";\nexport { Application };\n\n".concat(process__namespace.env.NODE_ENV === 'test' ? "\n// \u6D4B\u8BD5\u65F6\u7531\u6D4B\u8BD5\u7528\u4F8B\u542F\u52A8Application\n" : "\nconst application = new Application(applicationJson);\napplication.start();\n ", "\n ");
370
+ return pre.concat(importStatements.join('\n')).concat(append);
371
+ }
372
+
373
+ var cmdDefaultEnvMap = {
374
+ dev: 'dev',
375
+ build: 'prod'
376
+ };
377
+ var defaultPropertiesName = 'application.json';
378
+ /**
379
+ * 综合NODE_ENV和命令得到运行时配置文件名
380
+ * 如果有NODE_ENV,则返回
381
+ * 如果没有,则考虑dev和build默认设定
382
+ */
383
+ var propertiesFileName = function propertiesFileName(cmd) {
384
+ var env = process$1.env.NODE_ENV || cmdDefaultEnvMap[cmd] || '';
385
+ return env ? "application.".concat(env, ".json") : defaultPropertiesName;
386
+ };
387
+
388
+ function readFile(filepath) {
389
+ var content = '{}';
390
+ if (fs.existsSync(filepath)) {
391
+ content = fs.readFileSync(filepath, 'utf8');
392
+ }
393
+ return content;
394
+ }
395
+ function merge(project, cmd) {
396
+ var defaultConfigStr = readFile(path$1.join(project.absPath, "properties/".concat(defaultPropertiesName)));
397
+ var envConfigStr = readFile(path$1.join(project.absPath, "properties/".concat(propertiesFileName(cmd))));
398
+ var defaultConfig = {};
399
+ try {
400
+ defaultConfig = JSON.parse(defaultConfigStr);
401
+ } catch (error) {
402
+ // 写了一半的配置文件
403
+ }
404
+ var envConfig = {};
405
+ try {
406
+ envConfig = JSON.parse(envConfigStr);
407
+ } catch (error) {
408
+ // 写了一半的配置文件
409
+ }
410
+ var config = merge2properties(defaultConfig, envConfig);
411
+ var filePath = path$1.join(project.absPath, 'src/.coco/application.json');
412
+ fs.writeFileSync(filePath, JSON.stringify(config, null, 2), {
413
+ encoding: 'utf-8'
414
+ });
415
+ }
416
+ // 从前往后依次合并配置对象
417
+ function merge2properties() {
418
+ for (var _len = arguments.length, configs = new Array(_len), _key = 0; _key < _len; _key++) {
419
+ configs[_key] = arguments[_key];
420
+ }
421
+ if (configs.length === 0) {
422
+ return {};
423
+ }
424
+ return configs.reduce(function (prev, currentConfig) {
425
+ return doMerge(prev, currentConfig);
426
+ });
427
+ }
428
+ function doMerge(config1, config2) {
429
+ var type1 = _typeof(config1);
430
+ var type2 = _typeof(config2);
431
+ if (type1 !== type2) {
432
+ return config2;
433
+ } else if (type2 === 'string' || type2 === 'boolean' || type2 === 'number' || config2 === null || Array.isArray(config2)) {
434
+ return config2;
435
+ }
436
+ var keys2 = Object.keys(config2);
437
+ var merged = _objectSpread2({}, config1);
438
+ for (var _i = 0, _keys = keys2; _i < _keys.length; _i++) {
439
+ var key = _keys[_i];
440
+ merged[key] = doMerge(config1[key], config2[key]);
441
+ }
442
+ return merged;
443
+ }
444
+
445
+ // console.log(numberToLetter(0)); // A
446
+ // console.log(numberToLetter(1)); // B
447
+ // console.log(numberToLetter(25)); // Z
448
+ // console.log(numberToLetter(26)); // AA
449
+ // console.log(numberToLetter(27)); // AB
450
+ // console.log(numberToLetter(51)); // AZ
451
+ // console.log(numberToLetter(52)); // BA
452
+ function numberToLetter(n) {
453
+ var result = '';
454
+ while (n >= 0) {
455
+ result = String.fromCharCode(n % 26 + 65) + result;
456
+ n = Math.floor(n / 26) - 1;
457
+ if (n < 0) break;
458
+ }
459
+ return result;
460
+ }
461
+
462
+ var PATH_TYPE;
463
+ (function (PATH_TYPE) {
464
+ PATH_TYPE[PATH_TYPE["FOLDER"] = 0] = "FOLDER";
465
+ PATH_TYPE[PATH_TYPE["FILE"] = 1] = "FILE";
466
+ })(PATH_TYPE || (PATH_TYPE = {}));
467
+ var number = 0;
468
+ var RE_DEFAULT_EXPORT = /export\s+default\s+(\w+);?\s?/;
469
+ function scanOneFile(filePath, decorator) {
470
+ var content = fs__namespace.readFileSync(filePath, 'utf-8');
471
+ if (content.includes(decorator) && RE_DEFAULT_EXPORT.test(content)) {
472
+ // todo 需要校验export出来的class名称和注解的是否一致
473
+ // const className = RE_DEFAULT_EXPORT.exec(content)[1];
474
+ return {
475
+ className: numberToLetter(number++),
476
+ filePath: filePath
477
+ };
478
+ }
479
+ return null;
480
+ }
481
+ function doScan(type, _path, fileExt, decorator) {
482
+ var result = [];
483
+ if (!fs__namespace.existsSync(_path)) {
484
+ return result;
485
+ }
486
+ if (type === PATH_TYPE.FOLDER) {
487
+ var files = fs__namespace.readdirSync(_path);
488
+ var _iterator = _createForOfIteratorHelper(files),
489
+ _step;
490
+ try {
491
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
492
+ var file = _step.value;
493
+ var filePath = path__namespace.join(_path, file);
494
+ var stat = fs__namespace.statSync(filePath);
495
+ if (stat.isDirectory()) {
496
+ var find = doScan(PATH_TYPE.FOLDER, filePath, fileExt, decorator);
497
+ if (find.length) {
498
+ result.push.apply(result, _toConsumableArray(find));
499
+ }
500
+ } else if (stat.isFile() && path__namespace.extname(filePath) === fileExt) {
501
+ var r = scanOneFile(filePath, decorator);
502
+ if (r) {
503
+ result.push(r);
504
+ }
505
+ }
506
+ }
507
+ } catch (err) {
508
+ _iterator.e(err);
509
+ } finally {
510
+ _iterator.f();
511
+ }
512
+ } else if (type === PATH_TYPE.FILE) {
513
+ var _r = scanOneFile(_path, decorator);
514
+ if (_r) {
515
+ result.push(_r);
516
+ }
517
+ }
518
+ return result;
519
+ }
520
+ var scanPathConfig = [{
521
+ // 配置项
522
+ type: PATH_TYPE.FOLDER,
523
+ path: Project.CONFIG_DIR,
524
+ fileExt: '.ts',
525
+ decorator: '@configuration'
526
+ }, {
527
+ // 布局
528
+ type: PATH_TYPE.FOLDER,
529
+ path: Project.LAYOUT_DIR,
530
+ fileExt: '.tsx',
531
+ decorator: '@layout'
532
+ }, {
533
+ // 页面
534
+ type: PATH_TYPE.FOLDER,
535
+ path: Project.PAGE_DIR,
536
+ fileExt: '.tsx',
537
+ decorator: '@page'
538
+ }, {
539
+ // 控制器
540
+ type: PATH_TYPE.FOLDER,
541
+ path: Project.Flow_DIR,
542
+ fileExt: '.ts',
543
+ decorator: '@flow'
544
+ }, {
545
+ // 通用组件
546
+ type: PATH_TYPE.FOLDER,
547
+ path: Project.COMPONENTS_DIR,
548
+ fileExt: '.ts',
549
+ decorator: '@component'
550
+ }, {
551
+ // 接口
552
+ type: PATH_TYPE.FOLDER,
553
+ path: Project.API_DIR,
554
+ fileExt: '.ts',
555
+ decorator: '@api'
556
+ }, {
557
+ // 视图
558
+ type: PATH_TYPE.FOLDER,
559
+ path: Project.VIEW_DIR,
560
+ fileExt: '.tsx',
561
+ decorator: '@view'
562
+ }, {
563
+ // 全局数据
564
+ type: PATH_TYPE.FOLDER,
565
+ path: Project.GLOBAL_DATA_DIR,
566
+ fileExt: '.ts',
567
+ decorator: '@globalData'
568
+ }, {
569
+ // 全局状态
570
+ type: PATH_TYPE.FOLDER,
571
+ path: Project.STORE_DIR,
572
+ fileExt: '.ts',
573
+ decorator: '@store'
574
+ }, {
575
+ // 入口文件
576
+ type: PATH_TYPE.FILE,
577
+ path: Project.APPLICATION,
578
+ fileExt: '.ts',
579
+ decorator: '@webApplication'
580
+ }];
581
+ var scan = function scan(project) {
582
+ return scanPathConfig.reduce(function (prev, curr) {
583
+ prev.push.apply(prev, _toConsumableArray(doScan(curr.type, project.genFullPath(curr.path), curr.fileExt, curr.decorator)));
584
+ return prev;
585
+ }, []);
586
+ };
587
+
588
+ var DotCocoBuilder = /*#__PURE__*/_createClass(
589
+ /**
590
+ * 目前仅支持单体应用,为了单元测试,可以传入子应用相对项目根的路径
591
+ * @param monorepoPath
592
+ */
593
+ function DotCocoBuilder() {
594
+ var _this = this;
595
+ var monorepoPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '.';
596
+ _classCallCheck(this, DotCocoBuilder);
597
+ _defineProperty(this, "project", void 0);
598
+ _defineProperty(this, "iocComponents", void 0);
599
+ _defineProperty(this, "cmd", void 0);
600
+ _defineProperty(this, "srcWatcher", void 0);
601
+ _defineProperty(this, "propertiesWatcher", void 0);
602
+ _defineProperty(this, "ensureEmptyDotCocoFolder", function (project) {
603
+ if (fs.existsSync(project.dotCocoAbsPath)) {
604
+ fs.rmSync(project.dotCocoAbsPath, {
605
+ recursive: true
606
+ });
607
+ }
608
+ fs.mkdirSync(project.dotCocoAbsPath);
609
+ });
610
+ /**
611
+ * 完成构建前的准备工作
612
+ */
613
+ _defineProperty(this, "build", function () {
614
+ _this.ensureEmptyDotCocoFolder(_this.project);
615
+ merge(_this.project, _this.cmd);
616
+ genIndexTsx(_this.project, _this.iocComponents);
617
+ });
618
+ _defineProperty(this, "isTsTsxFile", function (path) {
619
+ return path.endsWith('.ts') || path.endsWith('.tsx');
620
+ });
621
+ _defineProperty(this, "handleAddFile", function (filePath) {
622
+ if (_this.isTsTsxFile(filePath)) {
623
+ var _path$parse = path.parse(filePath),
624
+ dir = _path$parse.dir,
625
+ ext = _path$parse.ext;
626
+ var match = scanPathConfig.find(function (item) {
627
+ return dir.startsWith(item.path) && item.fileExt === ext;
628
+ });
629
+ if (!match) {
630
+ return;
631
+ }
632
+ var scanRlt = scanOneFile(_this.project.genFullPath(filePath), match.decorator);
633
+ if (scanRlt !== null) {
634
+ if (!_this.iocComponents.find(function (i) {
635
+ return i.filePath === scanRlt.filePath;
636
+ })) {
637
+ // 新增一个组件
638
+ _this.iocComponents.push(scanRlt);
639
+ genIndexTsx(_this.project, _this.iocComponents);
640
+ }
641
+ }
642
+ }
643
+ });
644
+ _defineProperty(this, "handleDeleteFile", function (filePath) {
645
+ if (_this.isTsTsxFile(filePath)) {
646
+ var fullPath = _this.project.genFullPath(filePath);
647
+ var index = _this.iocComponents.findIndex(function (i) {
648
+ return i.filePath === fullPath;
649
+ });
650
+ if (index > 0) {
651
+ _this.iocComponents.splice(index, 1);
652
+ genIndexTsx(_this.project, _this.iocComponents);
653
+ }
654
+ }
655
+ });
656
+ _defineProperty(this, "watchSrc", function () {
657
+ _this.srcWatcher = chokidar.watch(_this.project.srcAbsPath, {
658
+ ignored: function ignored(absPath, stats) {
659
+ // 忽略.coco文件夹
660
+ var srcPath = path.relative(_this.project.srcAbsPath, absPath);
661
+ return srcPath.startsWith('.coco');
662
+ },
663
+ ignoreInitial: true,
664
+ cwd: _this.project.srcAbsPath
665
+ });
666
+ _this.srcWatcher.on('add', _this.handleAddFile);
667
+ _this.srcWatcher.on('change', _this.handleAddFile);
668
+ _this.srcWatcher.on('unlink', _this.handleDeleteFile);
669
+ });
670
+ _defineProperty(this, "watchProperties", function () {
671
+ _this.propertiesWatcher = chokidar.watch(_this.project.propertiesAbsPath, {
672
+ ignored: function ignored(absPath, stats) {
673
+ var filename = path.relative(_this.project.propertiesAbsPath, absPath);
674
+ if (absPath === _this.project.propertiesAbsPath || filename === defaultPropertiesName || filename === propertiesFileName(_this.cmd)) {
675
+ return false;
676
+ }
677
+ return true;
678
+ },
679
+ ignoreInitial: true,
680
+ cwd: _this.project.srcAbsPath
681
+ });
682
+ _this.propertiesWatcher.on('add', function () {
683
+ return merge(_this.project, _this.cmd);
684
+ });
685
+ _this.propertiesWatcher.on('change', function () {
686
+ return merge(_this.project, _this.cmd);
687
+ });
688
+ _this.propertiesWatcher.on('unlink', function () {
689
+ return merge(_this.project, _this.cmd);
690
+ });
691
+ });
692
+ _defineProperty(this, "startWatch", function () {
693
+ _this.watchSrc();
694
+ _this.watchProperties();
695
+ });
696
+ _defineProperty(this, "stopWatch", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
697
+ return _regenerator().w(function (_context) {
698
+ while (1) switch (_context.n) {
699
+ case 0:
700
+ if (!_this.srcWatcher) {
701
+ _context.n = 2;
702
+ break;
703
+ }
704
+ _context.n = 1;
705
+ return _this.srcWatcher.close();
706
+ case 1:
707
+ _this.srcWatcher = null;
708
+ case 2:
709
+ if (!_this.propertiesWatcher) {
710
+ _context.n = 4;
711
+ break;
712
+ }
713
+ _context.n = 3;
714
+ return _this.propertiesWatcher.close();
715
+ case 3:
716
+ _this.propertiesWatcher = null;
717
+ case 4:
718
+ return _context.a(2);
719
+ }
720
+ }, _callee);
721
+ })));
722
+ this.project = new Project(monorepoPath);
723
+ this.iocComponents = scan(this.project);
724
+ });
725
+
726
+ function startListening(builder) {
727
+ var watching = false;
728
+ process$1.on('message', function (msg) {
729
+ switch (msg) {
730
+ case 'build-once':
731
+ {
732
+ builder.build();
733
+ process$1.send('build-success');
734
+ break;
735
+ }
736
+ case 'build-and-watch':
737
+ {
738
+ builder.build();
739
+ process$1.send('init-build-success');
740
+ watching = true;
741
+ builder.startWatch();
742
+ break;
743
+ }
744
+ default:
745
+ {
746
+ process$1.send("dot coco process rcv msg:[".concat(msg, "]"));
747
+ break;
748
+ }
749
+ }
750
+ });
751
+ function handleTerminate() {
752
+ return _handleTerminate.apply(this, arguments);
753
+ }
754
+ function _handleTerminate() {
755
+ _handleTerminate = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
756
+ return _regenerator().w(function (_context) {
757
+ while (1) switch (_context.n) {
758
+ case 0:
759
+ if (!watching) {
760
+ _context.n = 2;
761
+ break;
762
+ }
763
+ _context.n = 1;
764
+ return builder.stopWatch();
765
+ case 1:
766
+ watching = false;
767
+ case 2:
768
+ process$1.exit(0);
769
+ case 3:
770
+ return _context.a(2);
771
+ }
772
+ }, _callee);
773
+ }));
774
+ return _handleTerminate.apply(this, arguments);
775
+ }
776
+ process$1.on('SIGTERM', handleTerminate);
777
+ process$1.on('SIGINT', handleTerminate);
778
+ }
779
+ function startAsProcess() {
780
+ var secondArgv = process$1.argv[2];
781
+ if (secondArgv === 'run-as-process') {
782
+ var builder = new DotCocoBuilder();
783
+ startListening(builder);
784
+ }
785
+ }
786
+ startAsProcess();
787
+
788
+ module.exports = DotCocoBuilder;