file-lane 2.0.1-alpha.9 → 2.0.2-beta.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 +66 -36
- 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 +13 -2
- 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 -8
- 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,30 @@ 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'}`);
|
|
157
|
+
// 结束任务
|
|
158
|
+
process.exit();
|
|
150
159
|
}
|
|
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
160
|
});
|
|
157
161
|
}
|
|
158
162
|
initCompilation() {
|
|
@@ -182,6 +186,18 @@ class FileLane {
|
|
|
182
186
|
// 循环loader,转换文件
|
|
183
187
|
let result = collectedFileList.concat();
|
|
184
188
|
for (let item of loaderList) {
|
|
189
|
+
// 转换 result 为 string 或流
|
|
190
|
+
result.forEach((fileItem) => {
|
|
191
|
+
const { content } = fileItem;
|
|
192
|
+
if (content) {
|
|
193
|
+
if (!item.raw && typeof content !== 'string') {
|
|
194
|
+
fileItem.content = content.toString();
|
|
195
|
+
}
|
|
196
|
+
else if (item.raw && !(content instanceof Buffer)) {
|
|
197
|
+
fileItem.content = Buffer.from(content);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
});
|
|
185
201
|
result = yield this.runLoader(result, item);
|
|
186
202
|
}
|
|
187
203
|
return result;
|
|
@@ -197,7 +213,7 @@ class FileLane {
|
|
|
197
213
|
const resolvePath = path_1.default.relative(this.context.projectPath, item.path);
|
|
198
214
|
// 将相对路径与输出路径拼接,形成最新的文件路径
|
|
199
215
|
const outputPath = path_1.default.join(buildPath, resolvePath);
|
|
200
|
-
return fs_extra_1.default.outputFile(outputPath, item.content || ''
|
|
216
|
+
return fs_extra_1.default.outputFile(outputPath, Buffer.from(item.content || ''));
|
|
201
217
|
}));
|
|
202
218
|
});
|
|
203
219
|
}
|
|
@@ -205,6 +221,7 @@ class FileLane {
|
|
|
205
221
|
return __awaiter(this, void 0, void 0, function* () {
|
|
206
222
|
const loader = new loaderType();
|
|
207
223
|
loader.context = this.context;
|
|
224
|
+
loader.compilerOption = this.compilerOption;
|
|
208
225
|
return loader.parser(fileList);
|
|
209
226
|
});
|
|
210
227
|
}
|
|
@@ -235,7 +252,7 @@ class FileLane {
|
|
|
235
252
|
});
|
|
236
253
|
}
|
|
237
254
|
/**
|
|
238
|
-
*
|
|
255
|
+
* 运行转换初始的任务
|
|
239
256
|
*/
|
|
240
257
|
runPreWorks(fileList) {
|
|
241
258
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -246,7 +263,8 @@ class FileLane {
|
|
|
246
263
|
yield item(this.context, fileList, this.config, this.compilerOption);
|
|
247
264
|
}
|
|
248
265
|
catch (error) {
|
|
249
|
-
//
|
|
266
|
+
// prework的item error
|
|
267
|
+
ColorConsole_1.default.throw((error === null || error === void 0 ? void 0 : error.toString()) || 'unkonw error');
|
|
250
268
|
}
|
|
251
269
|
}
|
|
252
270
|
}
|
|
@@ -260,7 +278,15 @@ class FileLane {
|
|
|
260
278
|
const { followWorks } = this.config;
|
|
261
279
|
if (followWorks) {
|
|
262
280
|
for (let item of followWorks) {
|
|
263
|
-
|
|
281
|
+
try {
|
|
282
|
+
ColorConsole_1.default.info(`FollowWork: ${item.workerDescribe} start`);
|
|
283
|
+
yield item.worker(this.context, this.config, this.compilerOption);
|
|
284
|
+
ColorConsole_1.default.info(`FollowWork: ${item.workerDescribe} end`);
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
ColorConsole_1.default.throw(`FollowWork: ${item.workerDescribe} error, ${error}`);
|
|
288
|
+
process.exit();
|
|
289
|
+
}
|
|
264
290
|
}
|
|
265
291
|
}
|
|
266
292
|
});
|
|
@@ -269,8 +295,16 @@ class FileLane {
|
|
|
269
295
|
return __awaiter(this, void 0, void 0, function* () {
|
|
270
296
|
// 监听文件变化,并触发 build
|
|
271
297
|
this.listenFileChange(() => __awaiter(this, void 0, void 0, function* () {
|
|
298
|
+
var _a, _b, _c;
|
|
272
299
|
const fileList = this.collectFile();
|
|
300
|
+
if (!this.ws && ((_a = this.compilerOption) === null || _a === void 0 ? void 0 : _a.hasOwnProperty('server'))) {
|
|
301
|
+
const port = (_b = this.compilerOption.server) === null || _b === void 0 ? void 0 : _b.port;
|
|
302
|
+
this.ws = new ws_1.default(`ws://localhost:${port}`);
|
|
303
|
+
}
|
|
273
304
|
yield this.build(fileList);
|
|
305
|
+
(_c = this.ws) === null || _c === void 0 ? void 0 : _c.send(JSON.stringify({
|
|
306
|
+
type: 'restart'
|
|
307
|
+
}));
|
|
274
308
|
}));
|
|
275
309
|
});
|
|
276
310
|
}
|
|
@@ -285,9 +319,7 @@ class FileLane {
|
|
|
285
319
|
if (entryFileList) {
|
|
286
320
|
entryFileList.forEach((filePath) => {
|
|
287
321
|
if (FileUtil_1.default.include(filePath, this.config.include, this.config.exclude)) {
|
|
288
|
-
ColorConsole_1.default.log({
|
|
289
|
-
message: `file change: ${filePath}`
|
|
290
|
-
});
|
|
322
|
+
ColorConsole_1.default.log(`### file-lane ### file change: ${filePath}`);
|
|
291
323
|
files.push(filePath);
|
|
292
324
|
}
|
|
293
325
|
});
|
|
@@ -305,7 +337,9 @@ class FileLane {
|
|
|
305
337
|
* @param onChange
|
|
306
338
|
*/
|
|
307
339
|
listenFileChange(onChange) {
|
|
308
|
-
const watcher = chokidar_1.default.watch(this.context.projectPath
|
|
340
|
+
const watcher = chokidar_1.default.watch(this.context.projectPath, {
|
|
341
|
+
ignored: this.config.watchIgnores
|
|
342
|
+
});
|
|
309
343
|
const throttledOnChange = lodash_1.default.throttle(onChange, 1000, {
|
|
310
344
|
leading: true,
|
|
311
345
|
trailing: false
|
|
@@ -319,9 +353,7 @@ class FileLane {
|
|
|
319
353
|
};
|
|
320
354
|
watcher
|
|
321
355
|
.on('ready', () => {
|
|
322
|
-
ColorConsole_1.default.log(
|
|
323
|
-
message: 'Initial scan complete. Ready for Watch.'
|
|
324
|
-
});
|
|
356
|
+
ColorConsole_1.default.log(`### file-lane ### Initial scan complete. Ready for Watch.`);
|
|
325
357
|
watcher
|
|
326
358
|
.on('add', (path) => {
|
|
327
359
|
// 监听文件添加事件
|
|
@@ -338,7 +370,7 @@ class FileLane {
|
|
|
338
370
|
})
|
|
339
371
|
.on('error', (error) => {
|
|
340
372
|
// 监听错误
|
|
341
|
-
|
|
373
|
+
FileLaneUtil_1.default.checkError(error.message);
|
|
342
374
|
});
|
|
343
375
|
if (this.watcher) {
|
|
344
376
|
this.watcher.close();
|
|
@@ -357,5 +389,3 @@ class FileLane {
|
|
|
357
389
|
}
|
|
358
390
|
}
|
|
359
391
|
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
|
*/
|
|
@@ -76,7 +78,16 @@ export default interface IFileLaneConfig<O = any> {
|
|
|
76
78
|
* ux--[webpack, zip]
|
|
77
79
|
* uxInspect--[webpack, zipPhone, zipWatch, zipTv]
|
|
78
80
|
*/
|
|
79
|
-
followWorks?:
|
|
81
|
+
followWorks?: FollowWoker<O>[];
|
|
82
|
+
/**
|
|
83
|
+
* 配置watch时忽略的文件或者文件夹
|
|
84
|
+
*/
|
|
85
|
+
watchIgnores?: MatchType;
|
|
80
86
|
}
|
|
87
|
+
type FollowWoker<O> = {
|
|
88
|
+
worker: FollowWork<O>;
|
|
89
|
+
workerDescribe?: string;
|
|
90
|
+
};
|
|
81
91
|
export type FollowWork<O = any> = (context: IFileLaneContext, config?: IFileLaneConfig, compilerOption?: O) => Promise<any>;
|
|
82
92
|
export type PreWork<O = any> = (context: IFileLaneContext, fileList: string[], config: IFileLaneConfig, compilerOption?: O) => Promise<any>;
|
|
93
|
+
export {};
|
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,12 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "file-lane",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2-beta.2",
|
|
4
4
|
"description": "File conversion tool, can be one-to-one, one to N, N to one",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"file",
|
|
7
7
|
"conversion"
|
|
8
8
|
],
|
|
9
|
-
"author": "徐俊杰 <xujunjie1@xiaomi.com>",
|
|
10
9
|
"homepage": "",
|
|
11
10
|
"license": "ISC",
|
|
12
11
|
"main": "lib/index.js",
|
|
@@ -17,15 +16,11 @@
|
|
|
17
16
|
"files": [
|
|
18
17
|
"lib"
|
|
19
18
|
],
|
|
20
|
-
"repository": {
|
|
21
|
-
"type": "git",
|
|
22
|
-
"url": "ssh://xujunjie1@git.mioffice.cn:29418/vela/aiot-toolkit"
|
|
23
|
-
},
|
|
24
19
|
"scripts": {
|
|
25
20
|
"test": "node ./__tests__/file-lane.test.js"
|
|
26
21
|
},
|
|
27
22
|
"dependencies": {
|
|
28
|
-
"@aiot-toolkit/shared-utils": "2.0.
|
|
23
|
+
"@aiot-toolkit/shared-utils": "2.0.2-beta.2",
|
|
29
24
|
"archiver": "^6.0.1",
|
|
30
25
|
"chokidar": "^3.5.3",
|
|
31
26
|
"lodash": "^4.17.21"
|
|
@@ -33,5 +28,5 @@
|
|
|
33
28
|
"devDependencies": {
|
|
34
29
|
"@types/archiver": "^5.3.2"
|
|
35
30
|
},
|
|
36
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "5226bdb0ba61daef207531c2eaaf3d034e04c50f"
|
|
37
32
|
}
|
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"}
|