@tmsfe/tmskit 0.0.7 → 0.0.8
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 +27 -27
- package/dist/index.cjs.js +1284 -983
- package/package.json +73 -75
- package/src/{gulp → compile}/build.js +5 -5
- package/src/{gulp → compile}/compile.js +90 -81
- package/src/{gulp → compile}/dev.js +129 -102
- package/src/{gulp → compile}/plugins/less.js +116 -116
- package/src/{gulp → compile}/plugins/mpCommonDep.js +131 -131
- package/src/{gulp → compile}/plugins/mpJsonDep.js +112 -108
- package/src/{gulp → compile}/plugins/mpWxmlDep.js +194 -194
- package/src/{gulp → compile}/plugins/postcss-font-base64.js +72 -72
- package/src/{gulp → compile}/plugins/replaceEnv.js +29 -29
- package/src/{gulp → compile}/plugins/utils/pluginError.js +25 -25
- package/src/config/constant.js +69 -71
- package/src/config/defaultTmsConfig.js +16 -16
- package/src/{utils → core}/buildAppJson.js +166 -221
- package/src/{utils → core}/checkDependencies.js +77 -77
- package/src/core/cloneModules.js +203 -0
- package/src/{utils → core}/handleError.js +18 -16
- package/src/core/isInIt.js +69 -0
- package/src/{utils/mpCiUtils.js → core/mpCi.js} +73 -73
- package/src/core/npm.js +218 -0
- package/src/core/symbolicLink.js +24 -0
- package/src/{utils/tkitUtils.js → core/tmsMpconfig.js} +234 -158
- package/src/entry.js +62 -60
- package/src/index.js +63 -62
- package/src/init.js +33 -33
- package/src/scripts/create/ask.js +63 -63
- package/src/scripts/create/generator.js +25 -25
- package/src/scripts/create/ignoreFiles.js +7 -7
- package/src/scripts/create/index.js +72 -72
- package/src/scripts/create/render.js +19 -19
- package/src/scripts/run/build/index.js +16 -17
- package/src/scripts/run/dev/index.js +42 -84
- package/src/scripts/run/index.js +97 -68
- package/src/scripts/run/init/index.js +95 -87
- package/src/scripts/run/install/index.js +31 -29
- package/src/utils/findCssImport.js +30 -30
- package/src/utils/global.js +22 -36
- package/src/utils/io.js +107 -106
- package/src/utils/log.js +47 -44
- package/src/utils/widgets.js +178 -167
- package/main.js +0 -3
- package/src/utils/cliUtils.js +0 -35
- package/src/utils/cloneModules.js +0 -116
- package/src/utils/npmUtils.js +0 -166
|
@@ -1,108 +1,112 @@
|
|
|
1
|
-
/* eslint-disable no-param-reassign */
|
|
2
|
-
const through = require('through2');
|
|
3
|
-
const path = require('path');
|
|
4
|
-
const { ext, fileInDir, diffContentCopyFile } = require('../../utils/io');
|
|
5
|
-
const { resolve } = require('../../utils/widgets');
|
|
6
|
-
const fs = require('fs');
|
|
7
|
-
const { pluginError } = require('./utils/pluginError');
|
|
8
|
-
const { dfsFindCommonDep } = require('./mpCommonDep');
|
|
9
|
-
|
|
10
|
-
function mpJsonDep(
|
|
11
|
-
tmsConfig,
|
|
12
|
-
module,
|
|
13
|
-
extensions = ['.json'],
|
|
14
|
-
filesExt = ['.wxml', '.json', '.js', '.ts', '.wxss', '.less'],
|
|
15
|
-
isWatch,
|
|
16
|
-
) {
|
|
17
|
-
const stream = through.obj(function (file, enc, cb) {
|
|
18
|
-
// 当前分析的文件的路径
|
|
19
|
-
const anaFileOriginFile = file.history[0];
|
|
20
|
-
const anaFileRelativeModule = path.relative(resolve(module.from), anaFileOriginFile);
|
|
21
|
-
const anaFileDestFile = resolve(tmsConfig.outputDir, module.to, anaFileRelativeModule);
|
|
22
|
-
|
|
23
|
-
if (file.isBuffer()) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
try {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
1
|
+
/* eslint-disable no-param-reassign */
|
|
2
|
+
const through = require('through2');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
const { ext, fileInDir, diffContentCopyFile } = require('../../utils/io');
|
|
5
|
+
const { resolve } = require('../../utils/widgets');
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const { pluginError } = require('./utils/pluginError');
|
|
8
|
+
const { dfsFindCommonDep } = require('./mpCommonDep');
|
|
9
|
+
|
|
10
|
+
function mpJsonDep(
|
|
11
|
+
tmsConfig,
|
|
12
|
+
module,
|
|
13
|
+
extensions = ['.json'],
|
|
14
|
+
filesExt = ['.wxml', '.json', '.js', '.ts', '.wxss', '.less'],
|
|
15
|
+
isWatch,
|
|
16
|
+
) {
|
|
17
|
+
const stream = through.obj(function (file, enc, cb) {
|
|
18
|
+
// 当前分析的文件的路径
|
|
19
|
+
const anaFileOriginFile = file.history[0];
|
|
20
|
+
const anaFileRelativeModule = path.relative(resolve(module.from), anaFileOriginFile);
|
|
21
|
+
const anaFileDestFile = resolve(tmsConfig.outputDir, module.to, anaFileRelativeModule);
|
|
22
|
+
|
|
23
|
+
if (file.isBuffer()) {
|
|
24
|
+
let contents = String(file.contents);
|
|
25
|
+
const copyModules = new Map();
|
|
26
|
+
try {
|
|
27
|
+
try {
|
|
28
|
+
contents = contents ? JSON.parse(contents) : {};
|
|
29
|
+
} catch (e) {
|
|
30
|
+
throw new Error(`解析${file.path}出现错误,请检查配置信息: ${e}`);
|
|
31
|
+
}
|
|
32
|
+
if (contents.usingComponents) {
|
|
33
|
+
Object.keys(tmsConfig.dependencies).forEach((includeName) => {
|
|
34
|
+
const includePath = tmsConfig.dependencies[includeName];
|
|
35
|
+
Object.keys(contents.usingComponents).forEach((componentKey) => {
|
|
36
|
+
const componentPath = contents.usingComponents[componentKey];
|
|
37
|
+
if (componentPath.indexOf(includeName) > -1) {
|
|
38
|
+
const depOriginPath = path.join(path.dirname(anaFileOriginFile), componentPath);
|
|
39
|
+
// 被依赖文件加上后缀
|
|
40
|
+
const { ext: extAlias, file: depOriginFile, extPath } = ext(depOriginPath, extensions);
|
|
41
|
+
|
|
42
|
+
const isFileInDir = fileInDir(includePath, depOriginFile);
|
|
43
|
+
if (!isFileInDir) {
|
|
44
|
+
pluginError(
|
|
45
|
+
new Error(`${anaFileOriginFile}引用的路径${depOriginFile}不在${includePath}不在文件夹内, 请检查应用路径`),
|
|
46
|
+
isWatch,
|
|
47
|
+
);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// eslint-disable-next-line
|
|
52
|
+
const reg = new RegExp(`^(\./\.\.\/)+.*\/${includeName}\/(.*)`);
|
|
53
|
+
const regRes = componentPath.match(reg) || [];
|
|
54
|
+
if (regRes[2]) {
|
|
55
|
+
const depDestPath = resolve(tmsConfig.outputDir, module.to, includeName, regRes[2]);
|
|
56
|
+
const depDestFile = depDestPath.endsWith(extAlias) ? depDestPath : depDestPath + extPath;
|
|
57
|
+
|
|
58
|
+
if (!copyModules.has(depDestFile)) {
|
|
59
|
+
copyModules.set(depDestFile, {
|
|
60
|
+
depOriginFile,
|
|
61
|
+
depOriginExt: extAlias,
|
|
62
|
+
depDestFile,
|
|
63
|
+
beforeDepPath: componentPath,
|
|
64
|
+
afterDepPath: path.relative(path.dirname(anaFileDestFile), depDestPath).replace(/\\/g, '/'),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
} catch (e) {
|
|
73
|
+
pluginError(e, isWatch);
|
|
74
|
+
}
|
|
75
|
+
// console.log('json copyModules', copyModules);
|
|
76
|
+
copyModules.forEach(({ depOriginFile, depOriginExt, depDestFile, beforeDepPath, afterDepPath }) => {
|
|
77
|
+
// 拷贝当前依赖组件几个部分 wxml、wxss、wxs、json
|
|
78
|
+
filesExt.forEach((extKey) => {
|
|
79
|
+
const originFile = depOriginFile.replace(depOriginExt, extKey);
|
|
80
|
+
const destFile = depDestFile.replace(depOriginExt, extKey);
|
|
81
|
+
|
|
82
|
+
if (fs.existsSync(originFile)) {
|
|
83
|
+
diffContentCopyFile(originFile, destFile);
|
|
84
|
+
|
|
85
|
+
const extensionsFilter = ['.js', '.ts', '.wxss', '.less'];
|
|
86
|
+
if (extensionsFilter.indexOf(extKey) > -1) {
|
|
87
|
+
const defs = dfsFindCommonDep(originFile, destFile, extensionsFilter);
|
|
88
|
+
// console.log('json defs', defs);
|
|
89
|
+
defs.forEach((item) => {
|
|
90
|
+
diffContentCopyFile(item.depOriginFile, item.depDestFile);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
contents = typeof contents === 'object' ? JSON.stringify(contents, null, 2) : contents;
|
|
96
|
+
const reg = new RegExp(`['"]${beforeDepPath}["']`, 'g');
|
|
97
|
+
contents = contents.replace(reg, `"${afterDepPath}"`);
|
|
98
|
+
});
|
|
99
|
+
contents = typeof contents === 'object' ? JSON.stringify(contents, null, 2) : contents;
|
|
100
|
+
file.contents = Buffer.from(contents);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
this.push(file);
|
|
104
|
+
cb();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
return stream;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
module.exports = {
|
|
111
|
+
mpJsonDep,
|
|
112
|
+
};
|
|
@@ -1,194 +1,194 @@
|
|
|
1
|
-
/* eslint-disable no-param-reassign */
|
|
2
|
-
const through = require('through2');
|
|
3
|
-
const htmlparser2 = require('htmlparser2');
|
|
4
|
-
const fs = require('fs');
|
|
5
|
-
const path = require('path');
|
|
6
|
-
const { diffContentCopyFile, ext, fileInDir } = require('../../utils/io');
|
|
7
|
-
const { resolve } = require('../../utils/widgets');
|
|
8
|
-
const { dfsFindCommonDep } = require('./mpCommonDep');
|
|
9
|
-
const { pluginError } = require('./utils/pluginError');
|
|
10
|
-
|
|
11
|
-
// 处理后缀(源码引入依赖时,不带后缀的情况)
|
|
12
|
-
const extFile = function (name, file) {
|
|
13
|
-
const extMap = {
|
|
14
|
-
import: '.wxml',
|
|
15
|
-
include: '.wxml',
|
|
16
|
-
wxs: '.wxs',
|
|
17
|
-
};
|
|
18
|
-
let extObj = {};
|
|
19
|
-
|
|
20
|
-
if (Object.keys(extMap).indexOf(name) > -1 && !file.endsWith(extMap[name])) {
|
|
21
|
-
extObj = ext(file, [extMap[name]]);
|
|
22
|
-
}
|
|
23
|
-
return {
|
|
24
|
-
extPath: extObj.extPath || '',
|
|
25
|
-
ext: extObj.ext || '',
|
|
26
|
-
file: extObj.file || file,
|
|
27
|
-
};
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const dfsFindWxmlDep = function (anaFileOriginFile, anaFileDestFile, isWatch = true) {
|
|
31
|
-
const resDep = {
|
|
32
|
-
image: new Map(),
|
|
33
|
-
wxml: new Map(),
|
|
34
|
-
wxs: new Map(),
|
|
35
|
-
};
|
|
36
|
-
function dfs(anaFileOriginFile, anaFileDestFile) {
|
|
37
|
-
let contents = '';
|
|
38
|
-
try {
|
|
39
|
-
contents = fs.readFileSync(anaFileOriginFile, 'utf8');
|
|
40
|
-
} catch (e) {
|
|
41
|
-
pluginError(e, isWatch);
|
|
42
|
-
}
|
|
43
|
-
const parser = new htmlparser2.Parser({
|
|
44
|
-
onopentag(name, attributes) {
|
|
45
|
-
if (attributes?.src?.startsWith('.')) {
|
|
46
|
-
const depOriginPath = path.join(path.dirname(anaFileOriginFile), attributes.src);
|
|
47
|
-
// 被依赖文件加上后缀
|
|
48
|
-
const { ext, file: depOriginFile, extPath } = extFile(name, depOriginPath);
|
|
49
|
-
|
|
50
|
-
if (!fs.existsSync(depOriginFile)) {
|
|
51
|
-
pluginError(
|
|
52
|
-
new Error(`${anaFileOriginFile}引用的路径${depOriginFile}找不到应用文件,请检查引用路径`),
|
|
53
|
-
isWatch,
|
|
54
|
-
);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const depDestPath = path.join(path.dirname(anaFileDestFile), attributes.src);
|
|
59
|
-
const depDestFile = depDestPath.endsWith(ext) ? depDestPath : depDestPath + extPath;
|
|
60
|
-
|
|
61
|
-
// 收集wxml依赖
|
|
62
|
-
if (['import', 'include'].indexOf(name) > -1) {
|
|
63
|
-
resDep.wxml.set(depDestFile, {
|
|
64
|
-
anaFileOriginFile,
|
|
65
|
-
anaFileDestFile,
|
|
66
|
-
depDestFile,
|
|
67
|
-
depOriginFile,
|
|
68
|
-
});
|
|
69
|
-
dfs(depOriginFile, depDestFile);
|
|
70
|
-
}
|
|
71
|
-
// 收集image依赖
|
|
72
|
-
// if (name === 'image') {
|
|
73
|
-
// resDep.image.set(attributes.src, {
|
|
74
|
-
// anaFileOriginFile,
|
|
75
|
-
// anaFileDestFile,
|
|
76
|
-
// depDestFile,
|
|
77
|
-
// depOriginFile,
|
|
78
|
-
// });
|
|
79
|
-
// dfs(depOriginFile, depDestFile);
|
|
80
|
-
// }
|
|
81
|
-
// 收集wxs依赖
|
|
82
|
-
if (name === 'wxs') {
|
|
83
|
-
resDep.wxs.set(depDestFile, {
|
|
84
|
-
anaFileOriginFile,
|
|
85
|
-
anaFileDestFile,
|
|
86
|
-
depDestFile,
|
|
87
|
-
depOriginFile,
|
|
88
|
-
});
|
|
89
|
-
const defs = dfsFindCommonDep(depOriginFile, depDestFile, ['.wxs']);
|
|
90
|
-
defs.forEach((item, key) => {
|
|
91
|
-
resDep.wxs.set(key, item);
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
},
|
|
96
|
-
});
|
|
97
|
-
parser.write(contents);
|
|
98
|
-
parser.end();
|
|
99
|
-
}
|
|
100
|
-
dfs(anaFileOriginFile, anaFileDestFile);
|
|
101
|
-
|
|
102
|
-
return resDep;
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
function mpWxmlDep(tmsConfig, module, isWatch) {
|
|
106
|
-
const stream = through.obj(function (file, enc, cb) {
|
|
107
|
-
// 依赖分析的文件
|
|
108
|
-
const anaFileOriginFile = file.history[0];
|
|
109
|
-
const anaFileRelativeModule = path.relative(resolve(module.from), anaFileOriginFile);
|
|
110
|
-
const anaFileDestFile = resolve(tmsConfig.outputDir, module.to, anaFileRelativeModule);
|
|
111
|
-
|
|
112
|
-
if (file.isBuffer()) {
|
|
113
|
-
let contents = String(file.contents);
|
|
114
|
-
const copyModules = new Map();
|
|
115
|
-
const parser = new htmlparser2.Parser({
|
|
116
|
-
onopentag(name, attributes) {
|
|
117
|
-
const nameFilter = ['import', 'include', 'wxs'];
|
|
118
|
-
if (nameFilter.indexOf(name) > -1 && attributes.src) {
|
|
119
|
-
const depOriginPath = path.join(path.dirname(anaFileOriginFile), attributes.src);
|
|
120
|
-
// 处理后缀(源码引入依赖时,后缀不全的情况)
|
|
121
|
-
const { ext, file: depOriginFile, extPath } = extFile(name, depOriginPath);
|
|
122
|
-
|
|
123
|
-
Object.keys(tmsConfig.dependencies).forEach((includeName) => {
|
|
124
|
-
if (attributes.src.indexOf(includeName) > -1) {
|
|
125
|
-
const includePath = tmsConfig.dependencies[includeName];
|
|
126
|
-
|
|
127
|
-
if (!fileInDir(includePath, depOriginFile)) {
|
|
128
|
-
pluginError(
|
|
129
|
-
new Error(`${anaFileOriginFile}引用路径${depOriginFile}不在${includePath}不在文件夹内, 请检查应用路径`),
|
|
130
|
-
isWatch,
|
|
131
|
-
);
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// eslint-disable-next-line
|
|
136
|
-
const reg = new RegExp(`^(
|
|
137
|
-
const regRes = attributes.src.match(reg) || [];
|
|
138
|
-
if (regRes[2]) {
|
|
139
|
-
const depDestPath = resolve(tmsConfig.outputDir, module.to, includeName, regRes[2]);
|
|
140
|
-
const depDestFile = depDestPath.endsWith(ext) ? depDestPath : depDestPath + extPath;
|
|
141
|
-
if (!copyModules.has(depDestFile)) {
|
|
142
|
-
copyModules.set(depDestFile, {
|
|
143
|
-
depOriginFile,
|
|
144
|
-
depDestFile,
|
|
145
|
-
beforeDepPath: attributes.src,
|
|
146
|
-
afterDepPath: path.relative(path.dirname(anaFileDestFile), depDestFile).replace(/\\/g, '/'),
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
},
|
|
154
|
-
});
|
|
155
|
-
parser.write(contents);
|
|
156
|
-
parser.end();
|
|
157
|
-
|
|
158
|
-
// console.log('wxml copyModules', copyModules);
|
|
159
|
-
copyModules.forEach(({ depOriginFile, depDestFile, beforeDepPath, afterDepPath }) => {
|
|
160
|
-
if (fs.existsSync(depOriginFile)) {
|
|
161
|
-
diffContentCopyFile(depOriginFile, depDestFile);
|
|
162
|
-
const reg = new RegExp(`['"]${beforeDepPath}["']`, 'g');
|
|
163
|
-
contents = contents.replace(reg, `"${afterDepPath}"`);
|
|
164
|
-
}
|
|
165
|
-
if (depOriginFile.endsWith('.wxml')) {
|
|
166
|
-
const defs = dfsFindWxmlDep(depOriginFile, depDestFile, isWatch);
|
|
167
|
-
// console.log('wxml defs', defs);
|
|
168
|
-
[...defs.wxml, ...defs.wxs].forEach(([, item]) => {
|
|
169
|
-
diffContentCopyFile(item.depOriginFile, item.depDestFile);
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
if (depOriginFile.endsWith('.wxs')) {
|
|
173
|
-
const defs = dfsFindCommonDep(depOriginFile, depDestFile, ['.wxs'], isWatch);
|
|
174
|
-
// console.log('wxs defs', defs);
|
|
175
|
-
defs.forEach((item) => {
|
|
176
|
-
diffContentCopyFile(item.depOriginFile, item.depDestFile);
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
file.contents = Buffer.from(contents);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
this.push(file);
|
|
185
|
-
cb();
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
return stream;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
module.exports = {
|
|
192
|
-
mpWxmlDep,
|
|
193
|
-
dfsFindWxmlDep,
|
|
194
|
-
};
|
|
1
|
+
/* eslint-disable no-param-reassign */
|
|
2
|
+
const through = require('through2');
|
|
3
|
+
const htmlparser2 = require('htmlparser2');
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const { diffContentCopyFile, ext, fileInDir } = require('../../utils/io');
|
|
7
|
+
const { resolve } = require('../../utils/widgets');
|
|
8
|
+
const { dfsFindCommonDep } = require('./mpCommonDep');
|
|
9
|
+
const { pluginError } = require('./utils/pluginError');
|
|
10
|
+
|
|
11
|
+
// 处理后缀(源码引入依赖时,不带后缀的情况)
|
|
12
|
+
const extFile = function (name, file) {
|
|
13
|
+
const extMap = {
|
|
14
|
+
import: '.wxml',
|
|
15
|
+
include: '.wxml',
|
|
16
|
+
wxs: '.wxs',
|
|
17
|
+
};
|
|
18
|
+
let extObj = {};
|
|
19
|
+
|
|
20
|
+
if (Object.keys(extMap).indexOf(name) > -1 && !file.endsWith(extMap[name])) {
|
|
21
|
+
extObj = ext(file, [extMap[name]]);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
extPath: extObj.extPath || '',
|
|
25
|
+
ext: extObj.ext || '',
|
|
26
|
+
file: extObj.file || file,
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const dfsFindWxmlDep = function (anaFileOriginFile, anaFileDestFile, isWatch = true) {
|
|
31
|
+
const resDep = {
|
|
32
|
+
image: new Map(),
|
|
33
|
+
wxml: new Map(),
|
|
34
|
+
wxs: new Map(),
|
|
35
|
+
};
|
|
36
|
+
function dfs(anaFileOriginFile, anaFileDestFile) {
|
|
37
|
+
let contents = '';
|
|
38
|
+
try {
|
|
39
|
+
contents = fs.readFileSync(anaFileOriginFile, 'utf8');
|
|
40
|
+
} catch (e) {
|
|
41
|
+
pluginError(e, isWatch);
|
|
42
|
+
}
|
|
43
|
+
const parser = new htmlparser2.Parser({
|
|
44
|
+
onopentag(name, attributes) {
|
|
45
|
+
if (attributes?.src?.startsWith('.')) {
|
|
46
|
+
const depOriginPath = path.join(path.dirname(anaFileOriginFile), attributes.src);
|
|
47
|
+
// 被依赖文件加上后缀
|
|
48
|
+
const { ext, file: depOriginFile, extPath } = extFile(name, depOriginPath);
|
|
49
|
+
|
|
50
|
+
if (!fs.existsSync(depOriginFile)) {
|
|
51
|
+
pluginError(
|
|
52
|
+
new Error(`${anaFileOriginFile}引用的路径${depOriginFile}找不到应用文件,请检查引用路径`),
|
|
53
|
+
isWatch,
|
|
54
|
+
);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const depDestPath = path.join(path.dirname(anaFileDestFile), attributes.src);
|
|
59
|
+
const depDestFile = depDestPath.endsWith(ext) ? depDestPath : depDestPath + extPath;
|
|
60
|
+
|
|
61
|
+
// 收集wxml依赖
|
|
62
|
+
if (['import', 'include'].indexOf(name) > -1) {
|
|
63
|
+
resDep.wxml.set(depDestFile, {
|
|
64
|
+
anaFileOriginFile,
|
|
65
|
+
anaFileDestFile,
|
|
66
|
+
depDestFile,
|
|
67
|
+
depOriginFile,
|
|
68
|
+
});
|
|
69
|
+
dfs(depOriginFile, depDestFile);
|
|
70
|
+
}
|
|
71
|
+
// 收集image依赖
|
|
72
|
+
// if (name === 'image') {
|
|
73
|
+
// resDep.image.set(attributes.src, {
|
|
74
|
+
// anaFileOriginFile,
|
|
75
|
+
// anaFileDestFile,
|
|
76
|
+
// depDestFile,
|
|
77
|
+
// depOriginFile,
|
|
78
|
+
// });
|
|
79
|
+
// dfs(depOriginFile, depDestFile);
|
|
80
|
+
// }
|
|
81
|
+
// 收集wxs依赖
|
|
82
|
+
if (name === 'wxs') {
|
|
83
|
+
resDep.wxs.set(depDestFile, {
|
|
84
|
+
anaFileOriginFile,
|
|
85
|
+
anaFileDestFile,
|
|
86
|
+
depDestFile,
|
|
87
|
+
depOriginFile,
|
|
88
|
+
});
|
|
89
|
+
const defs = dfsFindCommonDep(depOriginFile, depDestFile, ['.wxs']);
|
|
90
|
+
defs.forEach((item, key) => {
|
|
91
|
+
resDep.wxs.set(key, item);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
parser.write(contents);
|
|
98
|
+
parser.end();
|
|
99
|
+
}
|
|
100
|
+
dfs(anaFileOriginFile, anaFileDestFile);
|
|
101
|
+
|
|
102
|
+
return resDep;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
function mpWxmlDep(tmsConfig, module, isWatch) {
|
|
106
|
+
const stream = through.obj(function (file, enc, cb) {
|
|
107
|
+
// 依赖分析的文件
|
|
108
|
+
const anaFileOriginFile = file.history[0];
|
|
109
|
+
const anaFileRelativeModule = path.relative(resolve(module.from), anaFileOriginFile);
|
|
110
|
+
const anaFileDestFile = resolve(tmsConfig.outputDir, module.to, anaFileRelativeModule);
|
|
111
|
+
|
|
112
|
+
if (file.isBuffer()) {
|
|
113
|
+
let contents = String(file.contents);
|
|
114
|
+
const copyModules = new Map();
|
|
115
|
+
const parser = new htmlparser2.Parser({
|
|
116
|
+
onopentag(name, attributes) {
|
|
117
|
+
const nameFilter = ['import', 'include', 'wxs'];
|
|
118
|
+
if (nameFilter.indexOf(name) > -1 && attributes.src) {
|
|
119
|
+
const depOriginPath = path.join(path.dirname(anaFileOriginFile), attributes.src);
|
|
120
|
+
// 处理后缀(源码引入依赖时,后缀不全的情况)
|
|
121
|
+
const { ext, file: depOriginFile, extPath } = extFile(name, depOriginPath);
|
|
122
|
+
|
|
123
|
+
Object.keys(tmsConfig.dependencies).forEach((includeName) => {
|
|
124
|
+
if (attributes.src.indexOf(includeName) > -1) {
|
|
125
|
+
const includePath = tmsConfig.dependencies[includeName];
|
|
126
|
+
|
|
127
|
+
if (!fileInDir(includePath, depOriginFile)) {
|
|
128
|
+
pluginError(
|
|
129
|
+
new Error(`${anaFileOriginFile}引用路径${depOriginFile}不在${includePath}不在文件夹内, 请检查应用路径`),
|
|
130
|
+
isWatch,
|
|
131
|
+
);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// eslint-disable-next-line
|
|
136
|
+
const reg = new RegExp(`^(\./\.\.\/)+.*\/${includeName}\/(.*)`);
|
|
137
|
+
const regRes = attributes.src.match(reg) || [];
|
|
138
|
+
if (regRes[2]) {
|
|
139
|
+
const depDestPath = resolve(tmsConfig.outputDir, module.to, includeName, regRes[2]);
|
|
140
|
+
const depDestFile = depDestPath.endsWith(ext) ? depDestPath : depDestPath + extPath;
|
|
141
|
+
if (!copyModules.has(depDestFile)) {
|
|
142
|
+
copyModules.set(depDestFile, {
|
|
143
|
+
depOriginFile,
|
|
144
|
+
depDestFile,
|
|
145
|
+
beforeDepPath: attributes.src,
|
|
146
|
+
afterDepPath: path.relative(path.dirname(anaFileDestFile), depDestFile).replace(/\\/g, '/'),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
parser.write(contents);
|
|
156
|
+
parser.end();
|
|
157
|
+
|
|
158
|
+
// console.log('wxml copyModules', copyModules);
|
|
159
|
+
copyModules.forEach(({ depOriginFile, depDestFile, beforeDepPath, afterDepPath }) => {
|
|
160
|
+
if (fs.existsSync(depOriginFile)) {
|
|
161
|
+
diffContentCopyFile(depOriginFile, depDestFile);
|
|
162
|
+
const reg = new RegExp(`['"]${beforeDepPath}["']`, 'g');
|
|
163
|
+
contents = contents.replace(reg, `"${afterDepPath}"`);
|
|
164
|
+
}
|
|
165
|
+
if (depOriginFile.endsWith('.wxml')) {
|
|
166
|
+
const defs = dfsFindWxmlDep(depOriginFile, depDestFile, isWatch);
|
|
167
|
+
// console.log('wxml defs', defs);
|
|
168
|
+
[...defs.wxml, ...defs.wxs].forEach(([, item]) => {
|
|
169
|
+
diffContentCopyFile(item.depOriginFile, item.depDestFile);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (depOriginFile.endsWith('.wxs')) {
|
|
173
|
+
const defs = dfsFindCommonDep(depOriginFile, depDestFile, ['.wxs'], isWatch);
|
|
174
|
+
// console.log('wxs defs', defs);
|
|
175
|
+
defs.forEach((item) => {
|
|
176
|
+
diffContentCopyFile(item.depOriginFile, item.depDestFile);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
file.contents = Buffer.from(contents);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
this.push(file);
|
|
185
|
+
cb();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
return stream;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
module.exports = {
|
|
192
|
+
mpWxmlDep,
|
|
193
|
+
dfsFindWxmlDep,
|
|
194
|
+
};
|