file-lane 2.0.1-alpha.9 → 2.0.2-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/FileLane.d.ts +2 -1
- package/lib/FileLane.js +55 -35
- package/lib/FileLaneCompilation.js +0 -2
- package/lib/event/CompilationEvent.js +0 -2
- package/lib/event/FileEvent.js +0 -2
- package/lib/event/IEventDispatcher.js +0 -2
- package/lib/event/asyncEvent/AsyncEventDispatcher.js +0 -2
- package/lib/event/asyncEvent/DataEvent.js +0 -2
- package/lib/index.js +0 -2
- package/lib/interface/IFileLaneConfig.d.ts +7 -1
- package/lib/interface/IFileLaneConfig.js +0 -2
- package/lib/interface/IFileLaneContext.js +0 -2
- package/lib/interface/IFileParam.d.ts +2 -1
- package/lib/interface/IFileParam.js +0 -2
- package/lib/interface/ILoader.d.ts +1 -0
- package/lib/interface/ILoader.js +0 -2
- package/lib/interface/IPlugin.js +0 -2
- package/lib/utils/FileLaneUtil.d.ts +3 -0
- package/lib/utils/FileLaneUtil.js +23 -8
- package/package.json +3 -3
- package/lib/FileLane.js.map +0 -1
- package/lib/FileLaneCompilation.js.map +0 -1
- package/lib/event/CompilationEvent.js.map +0 -1
- package/lib/event/FileEvent.js.map +0 -1
- package/lib/event/IEventDispatcher.js.map +0 -1
- package/lib/event/asyncEvent/AsyncEventDispatcher.js.map +0 -1
- package/lib/event/asyncEvent/DataEvent.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/interface/IFileLaneConfig.js.map +0 -1
- package/lib/interface/IFileLaneContext.js.map +0 -1
- package/lib/interface/IFileParam.js.map +0 -1
- package/lib/interface/ILoader.js.map +0 -1
- package/lib/interface/IPlugin.js.map +0 -1
- package/lib/utils/FileLaneUtil.js.map +0 -1
package/lib/FileLane.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ declare class FileLane<O = any> {
|
|
|
12
12
|
private context;
|
|
13
13
|
private watcher?;
|
|
14
14
|
private compilation?;
|
|
15
|
+
private ws;
|
|
15
16
|
/**
|
|
16
17
|
* 实例化FileLane
|
|
17
18
|
* @param config fileLane 配置
|
|
@@ -54,7 +55,7 @@ declare class FileLane<O = any> {
|
|
|
54
55
|
private findLoader;
|
|
55
56
|
private triggerPlugins;
|
|
56
57
|
/**
|
|
57
|
-
*
|
|
58
|
+
* 运行转换初始的任务
|
|
58
59
|
*/
|
|
59
60
|
private runPreWorks;
|
|
60
61
|
/**
|
package/lib/FileLane.js
CHANGED
|
@@ -19,6 +19,7 @@ const chokidar_1 = __importDefault(require("chokidar"));
|
|
|
19
19
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
20
20
|
const lodash_1 = __importDefault(require("lodash"));
|
|
21
21
|
const path_1 = __importDefault(require("path"));
|
|
22
|
+
const ws_1 = __importDefault(require("ws"));
|
|
22
23
|
const FileLaneCompilation_1 = __importDefault(require("./FileLaneCompilation"));
|
|
23
24
|
const CompilationEvent_1 = __importDefault(require("./event/CompilationEvent"));
|
|
24
25
|
const FileEvent_1 = __importDefault(require("./event/FileEvent"));
|
|
@@ -43,12 +44,7 @@ class FileLane {
|
|
|
43
44
|
this.processExitHandler = () => {
|
|
44
45
|
this.dispose();
|
|
45
46
|
};
|
|
46
|
-
|
|
47
|
-
this.context = {
|
|
48
|
-
cwd,
|
|
49
|
-
projectPath: projectPath || cwd,
|
|
50
|
-
output: config.output
|
|
51
|
-
};
|
|
47
|
+
this.context = FileLaneUtil_1.default.createContext(config.output, projectPath);
|
|
52
48
|
process.on('exit', this.processExitHandler);
|
|
53
49
|
}
|
|
54
50
|
/**
|
|
@@ -60,11 +56,7 @@ class FileLane {
|
|
|
60
56
|
return __awaiter(this, void 0, void 0, function* () {
|
|
61
57
|
const errorList = this.validateConfig();
|
|
62
58
|
if (errorList && errorList.length) {
|
|
63
|
-
ColorConsole_1.default.
|
|
64
|
-
message: `\r\n${errorList.map((item, index) => `${index + 1}. ${item}`).join('\r\n')}\r\n`,
|
|
65
|
-
level: shared_utils_1.LOG_LEVEL.Error,
|
|
66
|
-
isOnlyPrintError: true
|
|
67
|
-
});
|
|
59
|
+
ColorConsole_1.default.error(`### file-lane ### ${errorList.map((item, index) => `${index + 1}. ${item}`).join('\r\n')}`);
|
|
68
60
|
return;
|
|
69
61
|
}
|
|
70
62
|
this.cleanOutput();
|
|
@@ -141,18 +133,28 @@ class FileLane {
|
|
|
141
133
|
build(fileList) {
|
|
142
134
|
return __awaiter(this, void 0, void 0, function* () {
|
|
143
135
|
this.initCompilation();
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
136
|
+
try {
|
|
137
|
+
yield this.runPreWorks(fileList);
|
|
138
|
+
this.triggerPlugins(new CompilationEvent_1.default(CompilationEvent_1.default.PROJECT_START));
|
|
139
|
+
for (let item of fileList) {
|
|
140
|
+
this.triggerPlugins(new FileEvent_1.default(FileEvent_1.default.FILE_START_COMPILATION, FileLaneUtil_1.default.pathToFileParam(item)));
|
|
141
|
+
yield this.buildFile(item);
|
|
142
|
+
this.triggerPlugins(new FileEvent_1.default(FileEvent_1.default.FILE_END_COMPILATION, FileLaneUtil_1.default.pathToFileParam(item)));
|
|
143
|
+
}
|
|
144
|
+
this.triggerPlugins(new CompilationEvent_1.default(CompilationEvent_1.default.PROJECT_END));
|
|
145
|
+
// 执行extra
|
|
146
|
+
this.triggerPlugins(new CompilationEvent_1.default(CompilationEvent_1.default.FLLOW_WORK_START));
|
|
147
|
+
yield this.runFollowWorks();
|
|
148
|
+
this.triggerPlugins(new CompilationEvent_1.default(CompilationEvent_1.default.FLLOW_WORK_END));
|
|
149
|
+
ColorConsole_1.default.success({
|
|
150
|
+
word: 'Success: build finish!',
|
|
151
|
+
style: ColorConsole_1.default.getStyle(shared_utils_1.LOG_LEVEL.Success)
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.log('error', error);
|
|
156
|
+
ColorConsole_1.default.throw(`ERROR: build error, ${error || 'unknown error'}`);
|
|
150
157
|
}
|
|
151
|
-
this.triggerPlugins(new CompilationEvent_1.default(CompilationEvent_1.default.PROJECT_END));
|
|
152
|
-
// 执行extra
|
|
153
|
-
this.triggerPlugins(new CompilationEvent_1.default(CompilationEvent_1.default.FLLOW_WORK_START));
|
|
154
|
-
yield this.runFollowWorks();
|
|
155
|
-
this.triggerPlugins(new CompilationEvent_1.default(CompilationEvent_1.default.FLLOW_WORK_END));
|
|
156
158
|
});
|
|
157
159
|
}
|
|
158
160
|
initCompilation() {
|
|
@@ -182,6 +184,18 @@ class FileLane {
|
|
|
182
184
|
// 循环loader,转换文件
|
|
183
185
|
let result = collectedFileList.concat();
|
|
184
186
|
for (let item of loaderList) {
|
|
187
|
+
// 转换 result 为 string 或流
|
|
188
|
+
result.forEach((fileItem) => {
|
|
189
|
+
const { content } = fileItem;
|
|
190
|
+
if (content) {
|
|
191
|
+
if (!item.raw && typeof content !== 'string') {
|
|
192
|
+
fileItem.content = content.toString();
|
|
193
|
+
}
|
|
194
|
+
else if (item.raw && !(content instanceof Buffer)) {
|
|
195
|
+
fileItem.content = Buffer.from(content);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
});
|
|
185
199
|
result = yield this.runLoader(result, item);
|
|
186
200
|
}
|
|
187
201
|
return result;
|
|
@@ -197,7 +211,7 @@ class FileLane {
|
|
|
197
211
|
const resolvePath = path_1.default.relative(this.context.projectPath, item.path);
|
|
198
212
|
// 将相对路径与输出路径拼接,形成最新的文件路径
|
|
199
213
|
const outputPath = path_1.default.join(buildPath, resolvePath);
|
|
200
|
-
return fs_extra_1.default.outputFile(outputPath, item.content || ''
|
|
214
|
+
return fs_extra_1.default.outputFile(outputPath, Buffer.from(item.content || ''));
|
|
201
215
|
}));
|
|
202
216
|
});
|
|
203
217
|
}
|
|
@@ -205,6 +219,7 @@ class FileLane {
|
|
|
205
219
|
return __awaiter(this, void 0, void 0, function* () {
|
|
206
220
|
const loader = new loaderType();
|
|
207
221
|
loader.context = this.context;
|
|
222
|
+
loader.compilerOption = this.compilerOption;
|
|
208
223
|
return loader.parser(fileList);
|
|
209
224
|
});
|
|
210
225
|
}
|
|
@@ -235,7 +250,7 @@ class FileLane {
|
|
|
235
250
|
});
|
|
236
251
|
}
|
|
237
252
|
/**
|
|
238
|
-
*
|
|
253
|
+
* 运行转换初始的任务
|
|
239
254
|
*/
|
|
240
255
|
runPreWorks(fileList) {
|
|
241
256
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -246,7 +261,8 @@ class FileLane {
|
|
|
246
261
|
yield item(this.context, fileList, this.config, this.compilerOption);
|
|
247
262
|
}
|
|
248
263
|
catch (error) {
|
|
249
|
-
//
|
|
264
|
+
// prework的item error
|
|
265
|
+
ColorConsole_1.default.throw((error === null || error === void 0 ? void 0 : error.toString()) || 'unkonw error');
|
|
250
266
|
}
|
|
251
267
|
}
|
|
252
268
|
}
|
|
@@ -269,8 +285,16 @@ class FileLane {
|
|
|
269
285
|
return __awaiter(this, void 0, void 0, function* () {
|
|
270
286
|
// 监听文件变化,并触发 build
|
|
271
287
|
this.listenFileChange(() => __awaiter(this, void 0, void 0, function* () {
|
|
288
|
+
var _a, _b, _c;
|
|
272
289
|
const fileList = this.collectFile();
|
|
290
|
+
if (!this.ws && ((_a = this.compilerOption) === null || _a === void 0 ? void 0 : _a.hasOwnProperty('server'))) {
|
|
291
|
+
const port = (_b = this.compilerOption.server) === null || _b === void 0 ? void 0 : _b.port;
|
|
292
|
+
this.ws = new ws_1.default(`ws://localhost:${port}`);
|
|
293
|
+
}
|
|
273
294
|
yield this.build(fileList);
|
|
295
|
+
(_c = this.ws) === null || _c === void 0 ? void 0 : _c.send(JSON.stringify({
|
|
296
|
+
type: 'restart'
|
|
297
|
+
}));
|
|
274
298
|
}));
|
|
275
299
|
});
|
|
276
300
|
}
|
|
@@ -285,9 +309,7 @@ class FileLane {
|
|
|
285
309
|
if (entryFileList) {
|
|
286
310
|
entryFileList.forEach((filePath) => {
|
|
287
311
|
if (FileUtil_1.default.include(filePath, this.config.include, this.config.exclude)) {
|
|
288
|
-
ColorConsole_1.default.log({
|
|
289
|
-
message: `file change: ${filePath}`
|
|
290
|
-
});
|
|
312
|
+
ColorConsole_1.default.log(`### file-lane ### file change: ${filePath}`);
|
|
291
313
|
files.push(filePath);
|
|
292
314
|
}
|
|
293
315
|
});
|
|
@@ -305,7 +327,9 @@ class FileLane {
|
|
|
305
327
|
* @param onChange
|
|
306
328
|
*/
|
|
307
329
|
listenFileChange(onChange) {
|
|
308
|
-
const watcher = chokidar_1.default.watch(this.context.projectPath
|
|
330
|
+
const watcher = chokidar_1.default.watch(this.context.projectPath, {
|
|
331
|
+
ignored: this.config.watchIgnores
|
|
332
|
+
});
|
|
309
333
|
const throttledOnChange = lodash_1.default.throttle(onChange, 1000, {
|
|
310
334
|
leading: true,
|
|
311
335
|
trailing: false
|
|
@@ -319,9 +343,7 @@ class FileLane {
|
|
|
319
343
|
};
|
|
320
344
|
watcher
|
|
321
345
|
.on('ready', () => {
|
|
322
|
-
ColorConsole_1.default.log(
|
|
323
|
-
message: 'Initial scan complete. Ready for Watch.'
|
|
324
|
-
});
|
|
346
|
+
ColorConsole_1.default.log(`### file-lane ### Initial scan complete. Ready for Watch.`);
|
|
325
347
|
watcher
|
|
326
348
|
.on('add', (path) => {
|
|
327
349
|
// 监听文件添加事件
|
|
@@ -338,7 +360,7 @@ class FileLane {
|
|
|
338
360
|
})
|
|
339
361
|
.on('error', (error) => {
|
|
340
362
|
// 监听错误
|
|
341
|
-
|
|
363
|
+
FileLaneUtil_1.default.checkError(error.message);
|
|
342
364
|
});
|
|
343
365
|
if (this.watcher) {
|
|
344
366
|
this.watcher.close();
|
|
@@ -357,5 +379,3 @@ class FileLane {
|
|
|
357
379
|
}
|
|
358
380
|
}
|
|
359
381
|
exports.default = FileLane;
|
|
360
|
-
|
|
361
|
-
//# sourceMappingURL=FileLane.js.map
|
package/lib/event/FileEvent.js
CHANGED
package/lib/index.js
CHANGED
|
@@ -2,7 +2,9 @@ import { MatchType } from '@aiot-toolkit/shared-utils/lib/utils/FileUtil';
|
|
|
2
2
|
import IFileLaneContext from './IFileLaneContext';
|
|
3
3
|
import ILoader from './ILoader';
|
|
4
4
|
import IPlugin from './IPlugin';
|
|
5
|
-
export type ILoaderClass = new (...args: any[]) => ILoader
|
|
5
|
+
export type ILoaderClass = (new (...args: any[]) => ILoader) & {
|
|
6
|
+
raw?: boolean;
|
|
7
|
+
};
|
|
6
8
|
/**
|
|
7
9
|
* IFileLaneConfig
|
|
8
10
|
*/
|
|
@@ -77,6 +79,10 @@ export default interface IFileLaneConfig<O = any> {
|
|
|
77
79
|
* uxInspect--[webpack, zipPhone, zipWatch, zipTv]
|
|
78
80
|
*/
|
|
79
81
|
followWorks?: FollowWork<O>[];
|
|
82
|
+
/**
|
|
83
|
+
* 配置watch时忽略的文件或者文件夹
|
|
84
|
+
*/
|
|
85
|
+
watchIgnores?: MatchType;
|
|
80
86
|
}
|
|
81
87
|
export type FollowWork<O = any> = (context: IFileLaneContext, config?: IFileLaneConfig, compilerOption?: O) => Promise<any>;
|
|
82
88
|
export type PreWork<O = any> = (context: IFileLaneContext, fileList: string[], config: IFileLaneConfig, compilerOption?: O) => Promise<any>;
|
package/lib/interface/ILoader.js
CHANGED
package/lib/interface/IPlugin.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import IFileLaneContext from '../interface/IFileLaneContext';
|
|
1
2
|
import IFileParam from '../interface/IFileParam';
|
|
2
3
|
/**
|
|
3
4
|
* FileLaneUtil
|
|
@@ -17,5 +18,7 @@ declare class FileLaneUtil {
|
|
|
17
18
|
* @param zipRootDirNames 可自定义压缩包内最外层目录的名称
|
|
18
19
|
*/
|
|
19
20
|
static zipProject(buildPath: string[], targetFile: string, zipRootDirNames?: string[]): Promise<void>;
|
|
21
|
+
static createContext(output: string, projectPath?: string): IFileLaneContext;
|
|
22
|
+
static checkError(message: string): void;
|
|
20
23
|
}
|
|
21
24
|
export default FileLaneUtil;
|
|
@@ -32,7 +32,7 @@ class FileLaneUtil {
|
|
|
32
32
|
if (readContent && fs_extra_1.default.existsSync(path)) {
|
|
33
33
|
const stats = fs_extra_1.default.statSync(path);
|
|
34
34
|
if (stats.isFile()) {
|
|
35
|
-
content = fs_extra_1.default.readFileSync(path
|
|
35
|
+
content = fs_extra_1.default.readFileSync(path);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
return {
|
|
@@ -55,17 +55,15 @@ class FileLaneUtil {
|
|
|
55
55
|
});
|
|
56
56
|
// 监听错误
|
|
57
57
|
archive.on('error', (err) => {
|
|
58
|
-
ColorConsole_1.default.
|
|
59
|
-
level: shared_utils_1.LOG_LEVEL.Error,
|
|
60
|
-
message: err.message
|
|
61
|
-
});
|
|
58
|
+
ColorConsole_1.default.throw(`${err.message}`);
|
|
62
59
|
reject();
|
|
63
60
|
});
|
|
64
61
|
// 监听写入流打开的事件
|
|
65
62
|
output.on('open', () => {
|
|
66
|
-
ColorConsole_1.default.
|
|
63
|
+
ColorConsole_1.default.info(`Write stream is open`);
|
|
67
64
|
});
|
|
68
65
|
output.on('close', () => {
|
|
66
|
+
ColorConsole_1.default.info(`Write stream is closed`);
|
|
69
67
|
resolve();
|
|
70
68
|
});
|
|
71
69
|
// 将压缩文件导入到输出流中
|
|
@@ -85,7 +83,24 @@ class FileLaneUtil {
|
|
|
85
83
|
});
|
|
86
84
|
});
|
|
87
85
|
}
|
|
86
|
+
static createContext(output, projectPath) {
|
|
87
|
+
const cwd = process.cwd();
|
|
88
|
+
return {
|
|
89
|
+
cwd,
|
|
90
|
+
projectPath: projectPath || cwd,
|
|
91
|
+
output
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
static checkError(message) {
|
|
95
|
+
if (message.includes('System limit for number of file watchers reached')) {
|
|
96
|
+
ColorConsole_1.default.error('There are too many files to watch, ', {
|
|
97
|
+
word: 'please configure the content to be ignored.',
|
|
98
|
+
style: {
|
|
99
|
+
bgColor: ColorConsole_1.default.getStyle(shared_utils_1.LOG_LEVEL.Error).color || '#FF0000'
|
|
100
|
+
}
|
|
101
|
+
}, '(For example, node_modules)');
|
|
102
|
+
}
|
|
103
|
+
ColorConsole_1.default.throw(`### file-lane ### watch error ${message}`);
|
|
104
|
+
}
|
|
88
105
|
}
|
|
89
106
|
exports.default = FileLaneUtil;
|
|
90
|
-
|
|
91
|
-
//# sourceMappingURL=FileLaneUtil.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "file-lane",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2-dev.2",
|
|
4
4
|
"description": "File conversion tool, can be one-to-one, one to N, N to one",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"file",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"test": "node ./__tests__/file-lane.test.js"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@aiot-toolkit/shared-utils": "2.0.
|
|
28
|
+
"@aiot-toolkit/shared-utils": "2.0.2-dev.2",
|
|
29
29
|
"archiver": "^6.0.1",
|
|
30
30
|
"chokidar": "^3.5.3",
|
|
31
31
|
"lodash": "^4.17.21"
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@types/archiver": "^5.3.2"
|
|
35
35
|
},
|
|
36
|
-
"gitHead": "
|
|
36
|
+
"gitHead": "4979839c27a3477f7e72f1f1ed167200bc1d48b5"
|
|
37
37
|
}
|
package/lib/FileLane.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["FileLane.ts"],"names":[],"mappings":"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","file":"FileLane.js","sourcesContent":["import { LOG_LEVEL } from '@aiot-toolkit/shared-utils'\nimport ColorConsole from '@aiot-toolkit/shared-utils/lib/ColorConsole'\nimport FileUtil from '@aiot-toolkit/shared-utils/lib/utils/FileUtil'\nimport chokidar from 'chokidar'\nimport Fs from 'fs-extra'\nimport Lodash from 'lodash'\nimport Path from 'path'\nimport FileLaneCompilation from './FileLaneCompilation'\nimport CompilationEvent from './event/CompilationEvent'\nimport FileEvent from './event/FileEvent'\nimport DataEvent from './event/asyncEvent/DataEvent'\nimport IFileLaneConfig, { ILoaderClass } from './interface/IFileLaneConfig'\nimport IFileLaneContext from './interface/IFileLaneContext'\nimport IFileParam from './interface/IFileParam'\nimport FileLaneUtil from './utils/FileLaneUtil'\n\n/**\n * FileLane\n *\n * 文件车道,用于将文件进行对应转换,支持1对1、1对N、N对1\n *\n * @description\n */\nclass FileLane<O = any> {\n private context: IFileLaneContext\n // 创建监听实例\n private watcher?: chokidar.FSWatcher\n\n private compilation?: FileLaneCompilation\n\n /**\n * 实例化FileLane\n * @param config fileLane 配置\n * @param projectPath 项目路径\n * @param compilerOption 编译参数,不同语言的项目具有的参数不同,即使同一项目开发者也会设置不同的参数\n */\n constructor(\n public readonly config: IFileLaneConfig<O>,\n projectPath?: string,\n public readonly compilerOption?: O\n ) {\n const cwd = process.cwd()\n this.context = {\n cwd,\n projectPath: projectPath || cwd,\n output: config.output\n }\n\n process.on('exit', this.processExitHandler)\n }\n\n /**\n * 运行\n * @param params\n * @returns\n */\n public async start(params?: {\n /**\n * 是否开启文件监听\n * 不开启--只运行一次\n * 开启--文件变化时会自动再次运行\n */\n watch?: boolean\n }) {\n const errorList = this.validateConfig()\n if (errorList && errorList.length) {\n ColorConsole.log({\n message: `\\r\\n${errorList.map((item, index) => `${index + 1}. ${item}`).join('\\r\\n')}\\r\\n`,\n level: LOG_LEVEL.Error,\n isOnlyPrintError: true\n })\n return\n }\n this.cleanOutput()\n const fileList = this.collectFile()\n if (!fileList || !fileList.length) {\n return\n }\n await this.build(fileList)\n if (params?.watch) {\n this.watch()\n }\n }\n\n private validateConfig(): string[] {\n const result: string[] = []\n // 校验上下文路径,路径是否真实存在,是否为文件夹\n const projectPath = this.context.projectPath\n if (Fs.existsSync(projectPath)) {\n if (!Fs.statSync(projectPath).isDirectory()) {\n result.push(`ProjectPath is not a folder`)\n }\n } else {\n result.push(`ProjectPath is not a real path`)\n }\n if (!this.config) {\n result.push(`Missing config`)\n } else {\n const { output, module } = this.config\n if (!output) {\n result.push(`Config missing output attribute`)\n }\n\n if (!module) {\n result.push(`Config missing module attribute`)\n } else {\n if (!module.rules) {\n result.push(`module missing rules attribute`)\n } else if (!module.rules.length) {\n result.push(`module.rules must have at least one item`)\n } else {\n module.rules.forEach((item, index) => {\n if (!item.test) {\n result.push(`rules[${index}] missing test attribute`)\n }\n if (!item.loader) {\n result.push(`rules[${index}] missing loader attribute`)\n } else if (!item.loader.length) {\n result.push(`rules[${index}]'loader must have at least one item`)\n }\n })\n }\n }\n }\n return result\n }\n\n private processExitHandler = () => {\n this.dispose()\n }\n\n public stop() {\n this.dispose()\n process.exit()\n }\n\n public dispose() {\n if (this.watcher) {\n this.watcher.close()\n }\n }\n\n /**\n *\n * @param fileList 原始文件列表\n */\n private async build(fileList: string[]): Promise<void> {\n this.initCompilation()\n await this.runPreWorks(fileList)\n this.triggerPlugins(new CompilationEvent(CompilationEvent.PROJECT_START))\n for (let item of fileList) {\n this.triggerPlugins(\n new FileEvent(FileEvent.FILE_START_COMPILATION, FileLaneUtil.pathToFileParam(item))\n )\n await this.buildFile(item)\n this.triggerPlugins(\n new FileEvent(FileEvent.FILE_END_COMPILATION, FileLaneUtil.pathToFileParam(item))\n )\n }\n this.triggerPlugins(new CompilationEvent(CompilationEvent.PROJECT_END))\n // 执行extra\n this.triggerPlugins(new CompilationEvent(CompilationEvent.FLLOW_WORK_START))\n await this.runFollowWorks()\n this.triggerPlugins(new CompilationEvent(CompilationEvent.FLLOW_WORK_END))\n }\n\n private initCompilation() {\n const { plugins } = this.config\n const compilation = new FileLaneCompilation()\n plugins?.forEach((item) => {\n item.compilation = compilation\n item.apply()\n })\n this.compilation = compilation\n }\n\n private async buildFile(filePath: string): Promise<void> {\n const fileList = await this.runLoaders(filePath)\n await this.writeFiles(fileList)\n }\n\n private async runLoaders(filePath: string): Promise<IFileParam[]> {\n // 拾取要处理的虚拟文件\n const { fileCollector } = this.config\n const collectedFileList = fileCollector\n ? fileCollector(filePath).map((item) => FileLaneUtil.pathToFileParam(item, true))\n : [FileLaneUtil.pathToFileParam(filePath, true)]\n // 查找到匹配的 loader\n const loaderList = this.findLoader(filePath)\n // 循环loader,转换文件\n let result = collectedFileList.concat()\n for (let item of loaderList) {\n result = await this.runLoader(result, item)\n }\n return result\n }\n\n private async writeFiles(fileList: IFileParam[]) {\n if (!fileList || !fileList.length) {\n return\n }\n const buildPath = this.outputPath\n return Promise.all(\n fileList.map((item) => {\n const resolvePath = Path.relative(this.context.projectPath, item.path)\n // 将相对路径与输出路径拼接,形成最新的文件路径\n const outputPath = Path.join(buildPath, resolvePath)\n return Fs.outputFile(outputPath, item.content || '', { encoding: 'utf-8' })\n })\n )\n }\n\n private async runLoader(fileList: IFileParam[], loaderType: ILoaderClass): Promise<IFileParam[]> {\n const loader = new loaderType()\n loader.context = this.context\n return loader.parser(fileList)\n }\n\n /**\n * 匹配符合条件的loader\n * @param filePath\n * @returns\n */\n private findLoader(filePath: string): ILoaderClass[] {\n const parse = Path.basename(filePath)\n const rules = this.config.module.rules\n let loaders: ILoaderClass[] = []\n for (let rule of rules) {\n // 1. 检查filePath是否符合规则test\n if (\n FileUtil.match(parse, rule.test) &&\n FileUtil.include(filePath, rule.include, rule.exclude)\n ) {\n // 2. 符合规则就添加到返回列表中\n loaders.push(...rule.loader)\n }\n }\n return loaders\n }\n\n private async triggerPlugins(event: DataEvent): Promise<void> {\n if (this.compilation) {\n return this.compilation.dispatch(event)\n }\n }\n\n /**\n * 运行转换后续的任务\n */\n private async runPreWorks(fileList: string[]): Promise<void> {\n const { preWorks } = this.config\n if (preWorks) {\n for (let item of preWorks) {\n try {\n await item(this.context, fileList, this.config, this.compilerOption)\n } catch (error) {\n // 报错 prework的item error\n }\n }\n }\n }\n\n /**\n * 运行转换后续的任务\n */\n private async runFollowWorks(): Promise<void> {\n const { followWorks } = this.config\n if (followWorks) {\n for (let item of followWorks) {\n await item(this.context, this.config, this.compilerOption)\n }\n }\n }\n\n private async watch(): Promise<void> {\n // 监听文件变化,并触发 build\n this.listenFileChange(async () => {\n const fileList = this.collectFile()\n await this.build(fileList)\n })\n }\n\n /**\n * 采集所有要处理的真实文件路径列表\n * @param entryFileList\n * @returns\n */\n private collectFile(entryFileList?: string[]): string[] {\n // 使用include projectPath获取所有要处理的真实文件\n let files: string[] = []\n if (entryFileList) {\n entryFileList.forEach((filePath) => {\n if (FileUtil.include(filePath, this.config.include, this.config.exclude)) {\n ColorConsole.log({\n message: `file change: ${filePath}`\n })\n files.push(filePath)\n }\n })\n } else {\n // 1.取出projectPath\n const projectPath = this.context.projectPath\n // 2. 循环文件夹,取出所有匹配的文件路径\n files = FileUtil.readAlldirSync(projectPath, this.config.include, this.config.exclude)\n }\n return files\n }\n\n /**\n * 监听文件变化\n * @param onChange\n */\n private listenFileChange(onChange: (fileList: string[]) => void) {\n const watcher = chokidar.watch(this.context.projectPath)\n const throttledOnChange = Lodash.throttle(onChange, 1000, {\n leading: true,\n trailing: false\n })\n const handler = (filePath: string) => {\n const { exclude, include } = this.config\n // 判断是否为删除,执行onChange回调\n if (FileUtil.include(filePath, include, exclude)) {\n throttledOnChange([filePath])\n }\n }\n watcher\n .on('ready', () => {\n ColorConsole.log({\n message: 'Initial scan complete. Ready for Watch.'\n })\n\n watcher\n .on('add', (path) => {\n // 监听文件添加事件\n handler(path)\n })\n .on('change', (path) => {\n // 监听文件修改事件\n handler(path)\n })\n .on('unlink', (filePath) => {\n // 监听文件删除事件\n handler(filePath)\n })\n })\n .on('error', (error) => {\n // 监听错误\n ColorConsole.log({ level: LOG_LEVEL.Error, message: error.message })\n })\n\n if (this.watcher) {\n this.watcher.close()\n }\n this.watcher = watcher\n }\n\n private get outputPath() {\n const { output, projectPath } = this.context\n return Path.join(projectPath, output)\n }\n /**\n * 清除输出文件夹\n */\n private cleanOutput() {\n Fs.removeSync(this.outputPath)\n }\n}\nexport default FileLane\n"],"sourceRoot":"../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["FileLaneCompilation.ts"],"names":[],"mappings":";;;;;AAAA,mGAA0E;AAE1E;;GAEG;AACH,MAAM,mBAAoB,SAAQ,8BAAoB;CAAG;AACzD,kBAAe,mBAAmB,CAAA","file":"FileLaneCompilation.js","sourcesContent":["import AsyncEventDispatcher from './event/asyncEvent/AsyncEventDispatcher'\n\n/**\n * FileLaneCompilation\n */\nclass FileLaneCompilation extends AsyncEventDispatcher {}\nexport default FileLaneCompilation\n"],"sourceRoot":"../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["event/CompilationEvent.ts"],"names":[],"mappings":";;;;;AAAA,uEAA8C;AAE9C;;GAEG;AACH,MAAM,gBAAiB,SAAQ,mBAAS;;AAC/B,8BAAa,GAAG,eAAe,CAAA;AAC/B,4BAAW,GAAG,aAAa,CAAA;AAE3B,iCAAgB,GAAG,kBAAkB,CAAA;AACrC,+BAAc,GAAG,gBAAgB,CAAA;AAE1C,kBAAe,gBAAgB,CAAA","file":"CompilationEvent.js","sourcesContent":["import DataEvent from './asyncEvent/DataEvent'\n\n/**\n * CompilationEvent\n */\nclass CompilationEvent extends DataEvent {\n static PROJECT_START = 'PROJECT_START'\n static PROJECT_END = 'PROJECT_END'\n\n static FLLOW_WORK_START = 'FLLOW_WORK_START'\n static FLLOW_WORK_END = 'FLLOW_WORK_END'\n}\nexport default CompilationEvent\n"],"sourceRoot":"../../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["event/FileEvent.ts"],"names":[],"mappings":";;;;;AACA,uEAA8C;AAE9C;;GAEG;AACH,MAAM,SAAU,SAAQ,mBAAqB;;AACpC,8BAAoB,GAAG,sBAAsB,CAAA;AAC7C,gCAAsB,GAAG,wBAAwB,CAAA;AAE1D,kBAAe,SAAS,CAAA","file":"FileEvent.js","sourcesContent":["import IFileParam from '../interface/IFileParam'\nimport DataEvent from './asyncEvent/DataEvent'\n\n/**\n * FileEvent\n */\nclass FileEvent extends DataEvent<IFileParam> {\n static FILE_END_COMPILATION = 'FILE_END_COMPILATION'\n static FILE_START_COMPILATION = 'FILE_START_COMPILATION'\n}\nexport default FileEvent\n"],"sourceRoot":"../../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["event/IEventDispatcher.ts"],"names":[],"mappings":"","file":"IEventDispatcher.js","sourcesContent":["import DataEvent from './asyncEvent/DataEvent'\n\ninterface IEventDispatcher<F extends Function = Function> {\n addEventListener(type: string, handler: F): void\n removeEventListener(type: string, handler: F): void\n removeAllListener(type: string): void\n dispatch(event: DataEvent): Promise<void>\n clear(): void\n}\n\nexport default IEventDispatcher\n"],"sourceRoot":"../../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["event/asyncEvent/AsyncEventDispatcher.ts"],"names":[],"mappings":";;;;;;;;;;;AAKA,MAAM,oBAAoB;IAA1B;QACU,cAAS,GAA0C,IAAI,GAAG,EAAE,CAAA;IAwDtE,CAAC;IAtDO,QAAQ,CAAC,KAAqB;;YAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;gBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBACvC,IAAI,SAAS,GAAG,CAAC,CAAA;gBACjB,IAAI,QAAQ,EAAE;oBACZ,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE;wBACzB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;4BACf,SAAS,EAAE,CAAA;4BACX,IAAI,SAAS,KAAK,QAAQ,CAAC,MAAM,EAAE;gCACjC,OAAO,EAAE,CAAA;6BACV;wBACH,CAAC,CAAC,CAAA;qBACH;iBACF;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAED,gBAAgB,CAAC,IAAY,EAAE,OAA0B;QACvD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;SAC7B;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC3C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;SACvB;IACH,CAAC;IAED,mBAAmB,CAAC,IAAY,EAAE,OAA0B;QAC1D,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YAC3B,OAAM;SACP;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,QAAQ,EAAE;YACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YACvC,IAAI,KAAK,IAAI,CAAC,EAAE;gBACd,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;aAC1B;SACF;IACH,CAAC;IACD,iBAAiB,CAAC,IAAY;QAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IACD,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;IAEO,WAAW,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAEO,WAAW,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;CACF;AAED,kBAAe,oBAAoB,CAAA","file":"AsyncEventDispatcher.js","sourcesContent":["import IEventDispatcher from '../IEventDispatcher'\nimport DataEvent from './DataEvent'\n\nexport type AsyncEventHandler = (event: DataEvent, callback: Function) => void\n\nclass AsyncEventDispatcher implements IEventDispatcher<AsyncEventHandler> {\n private _eventMap: Map<string, Array<AsyncEventHandler>> = new Map()\n\n async dispatch(event: DataEvent<any>): Promise<void> {\n return new Promise((resolve) => {\n const { type } = event\n const callList = this.getCallList(type)\n let callCount = 0\n if (callList) {\n for (let item of callList) {\n item(event, () => {\n callCount++\n if (callCount === callList.length) {\n resolve()\n }\n })\n }\n }\n })\n }\n\n addEventListener(type: string, handler: AsyncEventHandler) {\n if (!this.hasListener(type)) {\n this._eventMap.set(type, [])\n }\n const callList = this.getCallList(type)\n if (callList && !callList.includes(handler)) {\n callList.push(handler)\n }\n }\n\n removeEventListener(type: string, handler: AsyncEventHandler) {\n if (!this.hasListener(type)) {\n return\n }\n const callList = this.getCallList(type)\n if (callList) {\n const index = callList.indexOf(handler)\n if (index >= 0) {\n callList.splice(index, 1)\n }\n }\n }\n removeAllListener(type: string) {\n this._eventMap.delete(type)\n }\n clear(): void {\n this._eventMap.clear()\n }\n\n private hasListener(type: string) {\n return this._eventMap.has(type)\n }\n\n private getCallList(type: string) {\n return this._eventMap.get(type)\n }\n}\n\nexport default AsyncEventDispatcher\n"],"sourceRoot":"../../../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["event/asyncEvent/DataEvent.ts"],"names":[],"mappings":";;AAAA;;GAEG;AACH,MAAM,SAAS;IACb,YACkB,IAAY,EACZ,IAAQ;QADR,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAI;IACvB,CAAC;CACL;AACD,kBAAe,SAAS,CAAA","file":"DataEvent.js","sourcesContent":["/**\n * DataEvent\n */\nclass DataEvent<T = any> {\n constructor(\n public readonly type: string,\n public readonly data?: T\n ) {}\n}\nexport default DataEvent\n"],"sourceRoot":"../../../src"}
|
package/lib/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["index.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAiC;AAOxB,mBAPF,kBAAQ,CAOE","file":"index.js","sourcesContent":["import FileLane from './FileLane'\nimport IFileLaneConfig from './interface/IFileLaneConfig'\nimport IFileLaneContext from './interface/IFileLaneContext'\nimport IFileParam from './interface/IFileParam'\nimport ILoader from './interface/ILoader'\nimport IPlugin from './interface/IPlugin'\n\nexport { FileLane, IFileLaneConfig, IFileLaneContext, IFileParam, ILoader, IPlugin }\n"],"sourceRoot":"../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["interface/IFileLaneConfig.ts"],"names":[],"mappings":"","file":"IFileLaneConfig.js","sourcesContent":["import { MatchType } from '@aiot-toolkit/shared-utils/lib/utils/FileUtil'\nimport IFileLaneContext from './IFileLaneContext'\nimport ILoader from './ILoader'\nimport IPlugin from './IPlugin'\n\nexport type ILoaderClass = new (...args: any[]) => ILoader\n\n/**\n * IFileLaneConfig\n */\nexport default interface IFileLaneConfig<O = any> {\n /**\n * 文件收集器\n *\n *\n * @param path 文件路径\n *\n * @returns 要合并的文件路径\n *\n * @description 通常用于多转1,例如 src/a.hml -->[src/a.hml, src/a.js, src/a.css]\n * 不填写,表示直接使用源文件\n *\n */\n fileCollector?: (file: string) => string[]\n\n /**\n * 指定处理的文件范围\n *\n * 此属性的函数形式,在多转1可能很有用\n * 例如:a.js 做为js需要处理,但同目录存在 a.ux 时,则排除\n *\n * @example /^src/\n *\n */\n include?: MatchType\n\n exclude?: MatchType\n\n /**\n * 输出目录\n *\n */\n output: string\n\n /**\n * 文件转换配置\n */\n module: {\n /**\n * 转换规则\n */\n rules: {\n /**\n * 配置文件\n */\n test: MatchType\n loader: ILoaderClass[]\n exclude?: MatchType\n include?: MatchType\n }[]\n }\n\n /**\n * 插件\n *\n * 触发时机如下\n * 1. 每个文件转换完成\n * 2. 所有文件转换完成\n */\n plugins?: IPlugin[]\n\n /**\n * 前置工作\n *\n * @param context 上下文\n * @param fileList 待转换的文件列表\n * @returns\n */\n preWorks?: PreWork[]\n\n /**\n * 转换结束后续的工作\n *\n * xts--[zip]\n * ux--[webpack, zip]\n * uxInspect--[webpack, zipPhone, zipWatch, zipTv]\n */\n followWorks?: FollowWork<O>[]\n}\n\nexport type FollowWork<O = any> = (\n context: IFileLaneContext,\n config?: IFileLaneConfig,\n compilerOption?: O\n) => Promise<any>\n\nexport type PreWork<O = any> = (\n context: IFileLaneContext,\n fileList: string[],\n config: IFileLaneConfig,\n compilerOption?: O\n) => Promise<any>\n"],"sourceRoot":"../../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["interface/IFileLaneContext.ts"],"names":[],"mappings":"","file":"IFileLaneContext.js","sourcesContent":["/**\n * IFileLaneContext\n */\nexport default interface IFileLaneContext {\n cwd: string\n projectPath: string\n output: string\n [key: string]: any\n}\n"],"sourceRoot":"../../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["interface/IFileParam.ts"],"names":[],"mappings":"","file":"IFileParam.js","sourcesContent":["/**\n * IFileParam\n */\nexport default interface IFileParam<T = any> {\n path: string\n content?: string\n /**\n * 额外的内容,例如 sourceMap,位置映射列表等\n */\n extra?: T\n}\n"],"sourceRoot":"../../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["interface/ILoader.ts"],"names":[],"mappings":"","file":"ILoader.js","sourcesContent":["import IFileLaneContext from './IFileLaneContext'\nimport IFileParam from './IFileParam'\n\n/**\n * ILoader\n */\nexport default interface ILoader {\n context?: IFileLaneContext\n parser(files: IFileParam[]): Promise<IFileParam[]> | IFileParam[]\n}\n"],"sourceRoot":"../../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["interface/IPlugin.ts"],"names":[],"mappings":"","file":"IPlugin.js","sourcesContent":["import FileLaneCompilation from '../FileLaneCompilation'\nimport IFileLaneContext from './IFileLaneContext'\n\n/**\n * IPlugin\n */\nexport default interface IPlugin {\n context: IFileLaneContext\n compilation: FileLaneCompilation\n apply(): void\n}\n"],"sourceRoot":"../../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["utils/FileLaneUtil.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,6DAAsD;AACtD,+FAAsE;AACtE,wDAA+B;AAC/B,wDAAyB;AACzB,gDAAuB;AAEvB;;GAEG;AACH,MAAM,YAAY;IAChB;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CAAC,IAAY,EAAE,cAAuB,KAAK;QAC/D,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,IAAI,WAAW,IAAI,kBAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YACtC,MAAM,KAAK,GAAG,kBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC/B,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;gBAClB,OAAO,GAAG,kBAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;aACzC;SACF;QACD,OAAO;YACL,IAAI;YACJ,OAAO;SACR,CAAA;IACH,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAO,UAAU,CAAC,SAAmB,EAAE,UAAkB,EAAE,eAA0B;;YACzF,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC3C,MAAM,MAAM,GAAG,kBAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAA;gBAC/C,MAAM,OAAO,GAAG,kBAAQ,CAAC,MAAM,CAAC,KAAK,EAAE;oBACrC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;iBACnB,CAAC,CAAA;gBACF,OAAO;gBACP,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC1B,sBAAY,CAAC,GAAG,CAAC;wBACf,KAAK,EAAE,wBAAS,CAAC,KAAK;wBACtB,OAAO,EAAE,GAAG,CAAC,OAAO;qBACrB,CAAC,CAAA;oBACF,MAAM,EAAE,CAAA;gBACV,CAAC,CAAC,CAAA;gBACF,aAAa;gBACb,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;oBACrB,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;gBACzC,CAAC,CAAC,CAAA;gBACF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBACtB,OAAO,EAAE,CAAA;gBACX,CAAC,CAAC,CAAA;gBACF,eAAe;gBACf,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBAEpB,SAAS;gBACT,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAClC,MAAM,UAAU,GAAG,cAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA,CAAC,SAAS;oBAClD,IAAI,eAAe,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE;wBAC7C,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;qBAClD;yBAAM;wBACL,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;qBACtC;gBACH,CAAC,CAAC,CAAA;gBACF,aAAa;gBACb,OAAO,CAAC,QAAQ,EAAE,CAAA;YACpB,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;CACF;AACD,kBAAe,YAAY,CAAA","file":"FileLaneUtil.js","sourcesContent":["import { LOG_LEVEL } from '@aiot-toolkit/shared-utils'\nimport ColorConsole from '@aiot-toolkit/shared-utils/lib/ColorConsole'\nimport archiver from 'archiver'\nimport Fs from 'fs-extra'\nimport Path from 'path'\nimport IFileParam from '../interface/IFileParam'\n/**\n * FileLaneUtil\n */\nclass FileLaneUtil {\n /**\n * 文件路径转换为文件参数\n * @param path 路径\n * @param readContent 是否读取文件内容以设置 content 的值,默认 false\n * @returns\n */\n static pathToFileParam(path: string, readContent: boolean = false): IFileParam {\n let content = ''\n if (readContent && Fs.existsSync(path)) {\n const stats = Fs.statSync(path)\n if (stats.isFile()) {\n content = Fs.readFileSync(path, 'utf-8')\n }\n }\n return {\n path,\n content\n }\n }\n\n /**\n * 将buildPath文件夹的内容压缩成zip包,放置于targetPath路径下\n * @param buildPath\n * @param targetPath\n * @param zipRootDirNames 可自定义压缩包内最外层目录的名称\n */\n static async zipProject(buildPath: string[], targetFile: string, zipRootDirNames?: string[]) {\n return new Promise<void>((resolve, reject) => {\n const output = Fs.createWriteStream(targetFile)\n const archive = archiver.create('zip', {\n zlib: { level: 9 }\n })\n // 监听错误\n archive.on('error', (err) => {\n ColorConsole.log({\n level: LOG_LEVEL.Error,\n message: err.message\n })\n reject()\n })\n // 监听写入流打开的事件\n output.on('open', () => {\n ColorConsole.log({ message: `写入流已打开` })\n })\n output.on('close', () => {\n resolve()\n })\n // 将压缩文件导入到输出流中\n archive.pipe(output)\n\n // 指定压缩目录\n buildPath.forEach((folder, index) => {\n const folderName = Path.basename(folder) // 获取文件夹名\n if (zipRootDirNames && zipRootDirNames[index]) {\n archive.directory(folder, zipRootDirNames[index])\n } else {\n archive.directory(folder, folderName)\n }\n })\n // 完成压缩,关闭输出流\n archive.finalize()\n })\n }\n}\nexport default FileLaneUtil\n"],"sourceRoot":"../../src"}
|