@cabloy/module-glob 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.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # @cabloy/module-glob
@@ -0,0 +1,15 @@
1
+ declare const _default: {
2
+ glob: typeof eggBornMglob;
3
+ };
4
+ export default _default;
5
+ declare function eggBornMglob(options: any): {
6
+ suites: {};
7
+ modules: {};
8
+ modulesArray: never[];
9
+ modulesLocal: {};
10
+ modulesGlobal: {};
11
+ modulesMonkey: {};
12
+ suitesLocal: {};
13
+ suitesVendor: {};
14
+ };
15
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,454 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const path = require('path');
4
+ const fse = require('fs-extra');
5
+ const semver = require('semver');
6
+ const chalk = require('chalk');
7
+ const boxen = require('boxen');
8
+ const eggBornUtils = require('egg-born-utils');
9
+ const mparse = require('@cabloy/module-parse').default;
10
+ const boxenOptions = { padding: 1, margin: 1, align: 'center', borderColor: 'yellow', borderStyle: 'round' };
11
+ exports.default = {
12
+ glob: eggBornMglob,
13
+ };
14
+ const __pathSuites = [
15
+ {
16
+ prefix: 'src/suite/',
17
+ vendor: false,
18
+ },
19
+ {
20
+ prefix: 'src/suite-vendor/',
21
+ vendor: true,
22
+ },
23
+ ];
24
+ const __pathsModules = [
25
+ {
26
+ prefix: 'src/module/',
27
+ vendor: false,
28
+ public: false,
29
+ fronts: [{ js: 'front/src/main.js' }, { js: 'dist/front.js' }],
30
+ backends: [
31
+ { js: 'backend/src/main.js', static: 'backend/static' },
32
+ { js: 'dist/backend.js', static: 'dist/staticBackend' },
33
+ ],
34
+ },
35
+ {
36
+ prefix: 'src/module-system/',
37
+ vendor: false,
38
+ public: false,
39
+ fronts: [{ js: 'front/src/main.js' }, { js: 'dist/front.js' }],
40
+ backends: [
41
+ { js: 'backend/src/main.js', static: 'backend/static' },
42
+ { js: 'dist/backend.js', static: 'dist/staticBackend' },
43
+ ],
44
+ },
45
+ {
46
+ prefix: 'src/suite/*/modules/',
47
+ vendor: false,
48
+ public: false,
49
+ fronts: [{ js: 'front/src/main.js' }, { js: 'dist/front.js' }],
50
+ backends: [
51
+ { js: 'backend/src/main.js', static: 'backend/static' },
52
+ { js: 'dist/backend.js', static: 'dist/staticBackend' },
53
+ ],
54
+ },
55
+ {
56
+ prefix: 'src/module-vendor/',
57
+ vendor: true,
58
+ public: false,
59
+ fronts: [{ js: 'dist/front.js' }, { js: 'front/src/main.js' }],
60
+ backends: [
61
+ { js: 'dist/backend.js', static: 'dist/staticBackend' },
62
+ { js: 'backend/src/main.js', static: 'backend/static' },
63
+ ],
64
+ },
65
+ {
66
+ prefix: 'src/suite-vendor/*/modules/',
67
+ vendor: true,
68
+ public: false,
69
+ fronts: [{ js: 'dist/front.js' }, { js: 'front/src/main.js' }],
70
+ backends: [
71
+ { js: 'dist/backend.js', static: 'dist/staticBackend' },
72
+ { js: 'backend/src/main.js', static: 'backend/static' },
73
+ ],
74
+ },
75
+ {
76
+ prefix: 'node_modules/egg-born-module-',
77
+ vendor: true,
78
+ public: true,
79
+ node_modules: true,
80
+ fronts: [{ js: 'dist/front.js' }, { js: 'front/src/main.js' }],
81
+ backends: [
82
+ { js: 'dist/backend.js', static: 'dist/staticBackend' },
83
+ { js: 'backend/src/main.js', static: 'backend/static' },
84
+ ],
85
+ },
86
+ ];
87
+ // type: front/backend/all
88
+ function eggBornMglob(options) {
89
+ const { projectPath, disabledModules, disabledSuites, log, type } = options;
90
+ // context
91
+ const context = {
92
+ options,
93
+ suites: {},
94
+ modules: {},
95
+ modulesArray: [],
96
+ modulesLast: [],
97
+ //
98
+ modulesLocal: {},
99
+ modulesGlobal: {},
100
+ modulesMonkey: {},
101
+ //
102
+ suitesLocal: {},
103
+ suitesVendor: {},
104
+ //
105
+ disabledModules: __getDisabledModules(disabledModules),
106
+ disabledSuites: __getDisabledSuites(disabledSuites),
107
+ };
108
+ // parse suites
109
+ const suites = __parseSuites(projectPath);
110
+ // parse modules
111
+ const modules = __parseModules(projectPath, type);
112
+ // bind suites modules
113
+ __bindSuitesModules(suites, modules);
114
+ // check suites
115
+ __checkSuites(context, suites);
116
+ // order
117
+ __orderModules(context, modules);
118
+ // log
119
+ __logModules(context, log);
120
+ __logSuites(context, log);
121
+ // ok
122
+ return {
123
+ suites: context.suites,
124
+ modules: context.modules,
125
+ modulesArray: context.modulesArray,
126
+ //
127
+ modulesLocal: context.modulesLocal,
128
+ modulesGlobal: context.modulesGlobal,
129
+ modulesMonkey: context.modulesMonkey,
130
+ //
131
+ suitesLocal: context.suitesLocal,
132
+ suitesVendor: context.suitesVendor,
133
+ };
134
+ }
135
+ function __orderModules(context, modules) {
136
+ // 'a-version' first
137
+ __pushModule(context, modules, 'a-version');
138
+ // others
139
+ for (const key in modules) {
140
+ if (key !== 'a-version') {
141
+ __pushModule(context, modules, key);
142
+ }
143
+ }
144
+ // combine last
145
+ for (const module of context.modulesLast) {
146
+ context.modulesArray.push(module);
147
+ }
148
+ }
149
+ function __pushModule(context, modules, moduleRelativeName) {
150
+ // check if disable
151
+ if (context.disabledModules[moduleRelativeName])
152
+ return false;
153
+ // module
154
+ const module = modules[moduleRelativeName];
155
+ if (module.__ordering)
156
+ return true;
157
+ module.__ordering = true;
158
+ // dependencies
159
+ if (!__orderDependencies(context, modules, module, moduleRelativeName)) {
160
+ context.disabledModules[moduleRelativeName] = true;
161
+ return false;
162
+ }
163
+ // push this
164
+ context.modules[moduleRelativeName] = module;
165
+ if (module.package && module.package.eggBornModule && module.package.eggBornModule.last === true) {
166
+ context.modulesLast.push(module);
167
+ }
168
+ else {
169
+ context.modulesArray.push(module);
170
+ }
171
+ return true;
172
+ }
173
+ function __orderDependencies(context, modules, module, moduleRelativeName) {
174
+ if (context.options.disableCheckDependencies)
175
+ return true;
176
+ if (!module.package.eggBornModule || !module.package.eggBornModule.dependencies)
177
+ return true;
178
+ let enabled = true;
179
+ const dependencies = module.package.eggBornModule.dependencies;
180
+ for (const key in dependencies) {
181
+ const subModule = modules[key];
182
+ if (!subModule) {
183
+ const message = chalk.keyword('orange')(`module ${moduleRelativeName} disabled`) +
184
+ ', because ' +
185
+ chalk.keyword('cyan')(`module ${key} not exists`);
186
+ console.log('\n' + boxen(message, boxenOptions) + '\n');
187
+ enabled = false; // process.exit(0);
188
+ continue;
189
+ }
190
+ const subModuleVersion = dependencies[key];
191
+ if (semver.lt(subModule.package.version, subModuleVersion)) {
192
+ console.warn(chalk.cyan(`module ${key} is old`));
193
+ process.exit(0);
194
+ }
195
+ if (!__pushModule(context, modules, key)) {
196
+ enabled = false;
197
+ }
198
+ }
199
+ return enabled;
200
+ }
201
+ function __parseModules(projectPath, type) {
202
+ const modules = {};
203
+ for (const __path of __pathsModules) {
204
+ const prefix = `${projectPath}/${__path.prefix}`;
205
+ const filePkgs = eggBornUtils.tools.globbySync(`${prefix}*/package.json`);
206
+ for (let filePkg of filePkgs) {
207
+ // name
208
+ let name = filePkg.split('/').slice(-2)[0];
209
+ // check if '-' prefix exists
210
+ if (name.substring(0, 1) === '-') {
211
+ // skip
212
+ continue;
213
+ }
214
+ // check if full name
215
+ if (!__path.public && name.indexOf('egg-born-module-') > -1) {
216
+ const pathSrc = path.join(prefix, name);
217
+ name = name.substring('egg-born-module-'.length);
218
+ filePkg = path.join(prefix, name, 'package.json');
219
+ const pathDest = path.join(prefix, name);
220
+ fse.moveSync(pathSrc, pathDest);
221
+ // throw new Error(`Should use relative name for local module: ${name}`);
222
+ }
223
+ // info
224
+ const info = mparse.parseInfo(name, 'module');
225
+ if (!info) {
226
+ throw new Error(`module name is not valid: ${name}`);
227
+ }
228
+ info.vendor = __path.vendor;
229
+ info.public = __path.public;
230
+ info.node_modules = __path.node_modules;
231
+ // check if exists
232
+ if (!modules[info.relativeName]) {
233
+ // meta
234
+ const _package = require(filePkg);
235
+ const root = path.dirname(filePkg);
236
+ const moduleMeta = {
237
+ name,
238
+ info,
239
+ root,
240
+ pkg: filePkg,
241
+ package: _package,
242
+ js: {},
243
+ static: {},
244
+ };
245
+ const _moduleMeta = __parseModule(__path, moduleMeta, type);
246
+ if (_moduleMeta) {
247
+ // enhance check public
248
+ // if (_moduleMeta.info.public) {
249
+ const file = _moduleMeta.js.front || _moduleMeta.js.backend;
250
+ _moduleMeta.info.public = file.replace(/\\/g, '/').indexOf('/dist/') > -1;
251
+ // }
252
+ // record
253
+ modules[info.relativeName] = _moduleMeta;
254
+ }
255
+ }
256
+ }
257
+ }
258
+ return modules;
259
+ }
260
+ function __parseModule(__path, moduleMeta, type) {
261
+ const root = moduleMeta.root;
262
+ // front
263
+ if (type !== 'backend') {
264
+ for (const item of __path.fronts) {
265
+ const file = path.join(root, item.js);
266
+ if (fse.existsSync(file)) {
267
+ moduleMeta.js.front = file;
268
+ break;
269
+ }
270
+ }
271
+ if (!moduleMeta.js.front) {
272
+ return null;
273
+ }
274
+ }
275
+ // backend
276
+ if (type !== 'front') {
277
+ for (const item of __path.backends) {
278
+ const file = path.join(root, item.js);
279
+ if (fse.existsSync(file)) {
280
+ moduleMeta.js.backend = file;
281
+ const staticBackendPath = path.normalize(path.join(root, item.static));
282
+ moduleMeta.static.backend = staticBackendPath;
283
+ break;
284
+ }
285
+ }
286
+ if (!moduleMeta.js.backend) {
287
+ return null;
288
+ }
289
+ }
290
+ // ok
291
+ return moduleMeta;
292
+ }
293
+ function __logModules(context, log) {
294
+ for (const module of context.modulesArray) {
295
+ const relativeName = module.info.relativeName;
296
+ if (module.info.monkey) {
297
+ context.modulesMonkey[relativeName] = module;
298
+ }
299
+ if (module.info.public) {
300
+ context.modulesGlobal[relativeName] = module;
301
+ }
302
+ else {
303
+ context.modulesLocal[relativeName] = module;
304
+ }
305
+ }
306
+ if (!log)
307
+ return;
308
+ // log
309
+ console.log(chalk.yellow('\n=== Local Modules ==='));
310
+ for (const key in context.modulesLocal) {
311
+ console.log(chalk.cyan('> ' + key));
312
+ }
313
+ console.log(chalk.yellow('\n=== Global Modules ==='));
314
+ for (const key in context.modulesGlobal) {
315
+ console.log(chalk.cyan('> ' + key));
316
+ }
317
+ console.log(chalk.yellow('\n=== Monkey Modules ==='));
318
+ for (const key in context.modulesMonkey) {
319
+ console.log(chalk.cyan('> ' + key));
320
+ }
321
+ console.log(chalk.keyword('orange')(`\n=== Total Modules: ${context.modulesArray.length} ===`));
322
+ // console.log('\n');
323
+ }
324
+ function __logSuites(context, log) {
325
+ for (const suiteName in context.suites) {
326
+ const suite = context.suites[suiteName];
327
+ if (suite.info.vendor) {
328
+ context.suitesVendor[suiteName] = suite;
329
+ }
330
+ else {
331
+ context.suitesLocal[suiteName] = suite;
332
+ }
333
+ }
334
+ if (!log)
335
+ return;
336
+ // log
337
+ console.log(chalk.yellow('\n=== Local Suites ==='));
338
+ for (const key in context.suitesLocal) {
339
+ console.log(chalk.cyan('> ' + key));
340
+ }
341
+ console.log(chalk.yellow('\n=== Vendor Suites ==='));
342
+ for (const key in context.suitesVendor) {
343
+ console.log(chalk.cyan('> ' + key));
344
+ }
345
+ console.log(chalk.keyword('orange')(`\n=== Total Suites: ${Object.keys(context.suites).length} ===`));
346
+ console.log('\n');
347
+ }
348
+ function __getDisabledModules(disabledModules) {
349
+ const disabledModulesMap = {};
350
+ if (disabledModules && disabledModules.length > 0) {
351
+ for (const moduleName of disabledModules) {
352
+ disabledModulesMap[moduleName] = true;
353
+ }
354
+ }
355
+ return disabledModulesMap;
356
+ }
357
+ function __getDisabledSuites(disabledSuites) {
358
+ const disabledSuitesMap = {};
359
+ if (disabledSuites && disabledSuites.length > 0) {
360
+ for (const suiteName of disabledSuites) {
361
+ disabledSuitesMap[suiteName] = true;
362
+ }
363
+ }
364
+ return disabledSuitesMap;
365
+ }
366
+ function __parseSuites(projectPath) {
367
+ const suites = {};
368
+ for (const __path of __pathSuites) {
369
+ const prefix = `${projectPath}/${__path.prefix}`;
370
+ const filePkgs = eggBornUtils.tools.globbySync(`${prefix}*/package.json`);
371
+ for (let filePkg of filePkgs) {
372
+ // name
373
+ let name = filePkg.split('/').slice(-2)[0];
374
+ // check if '-' prefix exists
375
+ if (name.substring(0, 1) === '-') {
376
+ // skip
377
+ continue;
378
+ }
379
+ // check if full name
380
+ if (name.indexOf('egg-born-suite-') > -1) {
381
+ const pathSrc = path.join(prefix, name);
382
+ name = name.substring('egg-born-suite-'.length);
383
+ filePkg = path.join(prefix, name, 'package.json');
384
+ const pathDest = path.join(prefix, name);
385
+ fse.moveSync(pathSrc, pathDest);
386
+ // throw new Error(`Should use relative name for local suite: ${name}`);
387
+ }
388
+ // info
389
+ const info = mparse.parseInfo(name, 'suite');
390
+ if (!info) {
391
+ throw new Error(`suite name is not valid: ${name}`);
392
+ }
393
+ info.vendor = __path.vendor;
394
+ // check if exists
395
+ if (!suites[info.relativeName]) {
396
+ // meta
397
+ const _package = require(filePkg);
398
+ const root = path.dirname(filePkg);
399
+ suites[info.relativeName] = {
400
+ name,
401
+ info,
402
+ root,
403
+ pkg: filePkg,
404
+ package: _package,
405
+ modules: [],
406
+ };
407
+ }
408
+ }
409
+ }
410
+ // ok
411
+ return suites;
412
+ }
413
+ const __suite_pattern1 = /src\/suite\/([^\/]+)\/modules/;
414
+ const __suite_pattern2 = /src\/suite-vendor\/([^\/]+)\/modules/;
415
+ function __bindSuitesModules(suites, modules) {
416
+ for (const moduleName in modules) {
417
+ const module = modules[moduleName];
418
+ // check
419
+ let res = module.root.match(__suite_pattern1);
420
+ if (!res) {
421
+ res = module.root.match(__suite_pattern2);
422
+ }
423
+ if (!res)
424
+ continue;
425
+ // suiteName
426
+ const suiteName = res[1];
427
+ const suite = suites[suiteName];
428
+ if (!suite) {
429
+ // means disabled
430
+ delete modules[moduleName];
431
+ }
432
+ else {
433
+ // bind
434
+ module.suite = suiteName;
435
+ suite.modules.push(moduleName);
436
+ }
437
+ }
438
+ }
439
+ function __checkSuites(context, suites) {
440
+ for (const key in suites) {
441
+ const suite = suites[key];
442
+ // check if disable
443
+ if (!context.disabledSuites[key]) {
444
+ context.suites[key] = suite;
445
+ }
446
+ else {
447
+ // disabledModules
448
+ for (const moduleName of suite.modules) {
449
+ context.disabledModules[moduleName] = true;
450
+ }
451
+ }
452
+ }
453
+ }
454
+ //# sourceMappingURL=index.js.map
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@cabloy/module-glob",
3
+ "version": "1.0.0",
4
+ "description": "cabloy module-glob",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "files": [
11
+ "dist/**/*.js",
12
+ "dist/**/*.d.ts"
13
+ ],
14
+ "scripts": {
15
+ "lint": "eslint ."
16
+ },
17
+ "keywords": [
18
+ "egg",
19
+ "egg-born",
20
+ "framework",
21
+ "cabloy"
22
+ ],
23
+ "author": "zhennann",
24
+ "license": "MIT",
25
+ "dependencies": {}
26
+ }