@wiajs/core 1.1.28 → 1.1.30

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/util/wiapage.js CHANGED
@@ -1,143 +1,151 @@
1
- /* eslint-disable import/no-extraneous-dependencies */
2
-
3
1
  /**
4
- * 自动根据page目录文件生成 src目录的pages.js 文件
2
+ * 自动根据page目录文件生成 src目录的pages.js 文件,用于打包
3
+ */
4
+ import fs from 'node:fs'
5
+ import path from 'node:path'
6
+ import crypto from 'node:crypto'
7
+ import ld from 'lodash'
8
+
9
+ /** @typedef {object} Opts
10
+ * @prop {string[]} [file] - 发布文件或路径
11
+ * @prop {string[]} [exclude] - 排除路径或文件
5
12
  */
6
- const _ = require('lodash');
7
- const path = require('path');
8
- const crypto = require('crypto');
9
- const utils = require('utility');
10
- const fs = require('fs');
11
-
12
- let _cfg = {};
13
13
 
14
14
  /**
15
- * 检查指定项目文件是否更新,如更新则重新打包,并自动部署到腾讯云CDN
16
- * @param {string} dir 路径
17
- * @param {string} cfg 配置文件
15
+ * 生成 pages.js,引入 index.js,用于本地调试
16
+ * @param {string} dir - 路径
17
+ * @param {Opts} opts - 配置文件,设置打包文件和排除文件
18
18
  */
19
- async function pages(dir, cfg) {
20
- let R = '';
19
+ async function makePages(dir, opts) {
20
+ let R = ''
21
21
 
22
22
  try {
23
- const files = await getPage(dir, cfg);
24
- const pf = {}; // page file
23
+ const files = await getPage(dir, opts)
24
+ const pf = {} // page file
25
25
  files.forEach(v => {
26
- let name = '';
27
- const file = v;
26
+ let name = ''
27
+ const file = v
28
28
 
29
29
  // 去掉包含page路径
30
30
  if (v.includes('page/')) {
31
- const fl = path.parse(v.replace('page/', ''));
31
+ const fl = path.parse(v.replace('page/', ''))
32
32
  if (fl.dir) {
33
- name = `${fl.dir}/${fl.name}`;
34
- let ns = name.split('/');
35
- ns = ns.map(n => n[0].toUpperCase() + n.slice(1));
36
- name = ns.join('');
37
- pf[name] = `./${file}`;
33
+ name = `${fl.dir}/${fl.name}`
34
+ let ns = name.split('/')
35
+ ns = ns.map(n => n[0].toUpperCase() + n.slice(1))
36
+ name = ns.join('')
37
+ pf[name] = `./${file}`
38
38
  } else {
39
- name = fl.name[0].toUpperCase() + fl.name.slice(1);
40
- pf[name] = `./${file}`;
39
+ name = fl.name[0].toUpperCase() + fl.name.slice(1)
40
+ pf[name] = `./${file}`
41
41
  }
42
42
  }
43
- });
43
+ })
44
44
 
45
45
  // page下的文件写入pages.js文件
46
- if (!_.isEmpty(pf)) R = makeFile(pf, 'pages', dir);
46
+ if (!ld.isEmpty(pf)) R = makeFile(pf, 'pages', dir)
47
47
  } catch (err) {
48
- console.log(`pages exp:${err.message}`);
48
+ console.log(`makePages exp:${err.message}`)
49
49
  }
50
50
 
51
- return R;
51
+ return R
52
52
  }
53
53
 
54
54
  /**
55
- * webpack 打包文件,每个文件单独打包
55
+ * 获取page文件独立打包entry,用于发布
56
56
  * @param {string} dir 路径
57
- * @param {string} cfg 配置文件
57
+ * @param {Opts} opts 配置文件
58
58
  * 返回 {'page/login': './src/page/login.js'}
59
59
  */
60
- async function pack(dir, cfg) {
61
- const R = {};
60
+ async function getEntry(dir, opts) {
61
+ const R = {index: './src/entry.js'}
62
62
 
63
63
  try {
64
- const files = await getPage(dir, cfg);
65
- files.forEach(v => {
66
- const fl = path.parse(v);
67
- const name = `${fl.dir}/${fl.name}`;
68
- R[name] = `./src/${v}`;
69
- });
64
+ console.log({dir, opts}, 'getEntry')
65
+ const files = await getPage(dir, opts)
66
+ for (const v of files) {
67
+ const fl = path.parse(v)
68
+ const name = `${fl.dir}/${fl.name}`
69
+ R[name] = `./src/${v}`
70
+ }
70
71
  } catch (err) {
71
- console.log(`pack exp:${err.message}`);
72
+ console.log(`getEntry exp:${err.message}`)
72
73
  }
73
74
 
74
- return R;
75
+ return R
75
76
  }
76
77
 
77
78
  /**
78
- * 获取指定路径中的js文件列表
79
+ * 获取指定路径中的page目录中的js文件列表
79
80
  * @param {string} dir 路径
80
- * @param {string} cfg 配置文件
81
+ * @param {Opts} opts 配置文件
81
82
  * @returns {*[]}
82
83
  */
83
- async function getPage(dir, cfg) {
84
- const R = [];
84
+ async function getPage(dir, opts) {
85
+ const R = []
85
86
 
86
87
  try {
87
- dir = dir || process.cwd();
88
- const src = path.join(dir, './src');
89
- _cfg = cfg; // require(path.join(dir, './wia.config.js')); es6 模式不支持
90
- const rs = [];
91
- // 获取目标项目目录、子目录下的文件MD5对象
92
- await getFile(path.join(src, './page'), rs, src);
88
+ dir = dir || process.cwd()
89
+ const src = path.join(dir, './src')
90
+ /** @type {string[]} */
91
+ const rs = []
92
+ // 获取page目录、子目录下的文件
93
+ await getFile(path.join(src, './page'), rs, src)
93
94
 
94
95
  // 有js文件变化,html、less 暂未处理
95
- if (!_.isEmpty(rs)) {
96
- const pf = {}; // page file
96
+ if (rs?.length) {
97
+ const pf = {} // page file
97
98
  // f.R.JS.forEach((v) => { // forEach 回调函数是同步执行的,不用担心jf没有准备好!
98
99
 
99
100
  // eslint-disable-next-line
100
- for (const v of rs) {
101
- let pk = false; // 是否需重新编译 console.log('pages', {js: f.R.JS});
101
+ for (const r of rs) {
102
+ let mk = false // 是否需重新编译 console.log('pages', {js: f.R.JS});
102
103
 
103
104
  // eslint-disable-next-line
104
- for (let pf of _cfg.file) {
105
- // console.log({v, pf});
106
- // eslint-disable-line
107
- if (
108
- (pf.includes('.js') && v === pf) ||
109
- (!pf.includes('.js') && new RegExp(`^/?${pf}/`, 'i').test(v))
110
- ) {
111
- pk = true;
112
- break;
105
+ for (let v of opts.file) {
106
+ // console.log({v: r}, 'getPage')
107
+ // 文件
108
+ if (v.includes('.')) {
109
+ v = v.replace('.', '\\.').replace('*', '\\w+')
110
+ if (new RegExp(`^${v}$`, 'i').test(r)) {
111
+ mk = true
112
+ break
113
+ }
114
+ } else if (new RegExp(`^/?${v}/`, 'i').test(r)) {
115
+ mk = true
116
+ break
113
117
  }
114
118
  }
115
119
 
116
120
  // 排除
117
- if (pk) {
118
- // eslint-disable-next-line
119
- for (let pf of _cfg.exclude) {
120
- if (
121
- (pf.includes('.js') && v === pf) ||
122
- (!pf.includes('.js') && new RegExp(`^${pf}/`, 'i').test(v))
123
- ) {
124
- pk = false;
125
- break;
121
+ if (mk) {
122
+ for (let v of opts.exclude) {
123
+ // 文件
124
+ if (v.includes('.')) {
125
+ v = v.replace('.', '\\.').replace('*', '\\w+')
126
+ if (new RegExp(`^${v}$`, 'i').test(r)) {
127
+ console.log('getFile exclude', {v: r})
128
+ mk = false
129
+ break
130
+ }
131
+ } else if (new RegExp(`^/?${v}/`, 'i').test(r)) {
132
+ console.log('getFile exclude', {v: r})
133
+ mk = false
134
+ break
126
135
  }
127
136
  }
128
137
  }
129
- // console.log('getPage', {pk, v});
138
+
139
+ // console.log('getPage', {mk, v: r})
130
140
  // 需编译文件
131
- if (pk) {
132
- R.push(v);
133
- }
141
+ if (mk) R.push(r)
134
142
  }
135
143
  }
136
144
  } catch (err) {
137
- console.log(`getPage exp:${err.message}`);
145
+ console.log(`getPage exp:${err.message}`)
138
146
  }
139
147
 
140
- return R;
148
+ return R
141
149
  }
142
150
 
143
151
  /**
@@ -146,31 +154,34 @@ async function getPage(dir, cfg) {
146
154
  * @param {*} cb
147
155
  */
148
156
  function hash(tx) {
149
- let R = crypto.createHash('md5');
150
- R.update(tx);
151
- R = R.digest('hex');
152
- return R;
157
+ let R = crypto.createHash('md5')
158
+ R.update(tx)
159
+ R = R.digest('hex')
160
+ return R
153
161
  }
154
162
 
155
163
  /**
156
164
  * 将page中的js文件创建到pages.js中,方便调试
157
165
  * 也用来创建编译入口文件(entry.js),webpack最新5.xx版本自动将入口文件改为直接运行代码!
158
166
  * wia需要模块化,创建入口文件来解决该问题。
159
- * @param {*} pf
167
+ * @param {object} pf - page file
168
+ * @param {string} name - 文件名
169
+ * @param {string} [dir] - 路径,缺省为当前运行路径
160
170
  */
161
171
  function makeFile(pf, name, dir) {
162
- if (_.isEmpty(pf)) return '';
172
+ if (ld.isEmpty(pf)) return ''
163
173
 
164
- dir = dir || process.cwd();
165
- const src = path.join(dir, './src');
174
+ dir = dir || process.cwd()
175
+ const src = path.join(dir, './src')
166
176
 
167
- const p = [];
168
- const ns = [];
177
+ const p = []
178
+ const ns = []
179
+ // import 模块
169
180
  Object.keys(pf).forEach(k => {
170
- const f = pf[k].replace(/.js$/, '');
171
- p.push(`import ${k} from '${f}';`);
172
- ns.push(` '${f}': ${k},`);
173
- });
181
+ const f = pf[k].replace(/.js$/, '')
182
+ p.push(`import ${k} from '${f}';`)
183
+ ns.push(` '${f}': ${k},`)
184
+ })
174
185
 
175
186
  // Object.keys(pf).forEach(k => {
176
187
  // const n = k[0].toLowerCase() + k.slice(1);
@@ -186,102 +197,101 @@ function makeFile(pf, name, dir) {
186
197
  // }
187
198
  // `);
188
199
 
189
- // vite
200
+ // 定义输出变量,vite
190
201
  p.push(`
191
202
  const ${name} = {
192
203
  ${ns.join('\n')}
193
204
  };
194
205
 
195
206
  export default ${name};
196
- `);
207
+ `)
197
208
 
198
209
  // 将内容写入page.js 文件
199
- const ps = p.join('\n');
200
- if (!_.isEmpty(ps)) {
201
- const f = path.join(src, `./${name}.js`);
210
+ const ps = p.join('\n')
211
+ if (!ld.isEmpty(ps)) {
212
+ const f = path.join(src, `./${name}.js`)
202
213
  // 获取当前页面共用模块
203
- let lastH = '';
214
+ let lastH = ''
204
215
  if (fs.existsSync(f)) {
205
- const tx = fs.readFileSync(f, 'utf8');
206
- lastH = hash(tx);
216
+ const tx = fs.readFileSync(f, 'utf8')
217
+ lastH = hash(tx)
207
218
  }
208
219
  // 有变化,则更新pages文件
209
220
  if (hash(ps) !== lastH) {
210
221
  // console.log({f, ps});
211
- fs.writeFileSync(f, ps, e => e && console.log(`save ${f} exp:${e.message}`));
222
+ fs.writeFileSync(f, ps, e => e && console.log(`save ${f} exp:${e.message}`))
212
223
  }
213
224
  }
214
225
 
215
- return ps;
226
+ return ps
216
227
  }
217
228
 
218
229
  /**
219
230
  * 对指定文件夹下的子文件夹和文件进行递归,生成带MD5的hash值列表对象
220
231
  * 对于子目录文件, 生成嵌套对象, 如
221
232
  * {项目目录: {子目录:{xxx:e8461954cbf736f2e1d71cb84c72c2b4}}
222
- * @param {*} dir 文件路径
223
- * @param {*} rs 上次更新的hash文件对象
233
+ * @param {string} dir 文件路径
234
+ * @param {string[]} rs 上次更新的hash文件对象
235
+ * @param {string} [src] 源路径
224
236
  */
225
237
  async function getFile(dir, rs, src) {
226
- const tree = {};
238
+ const tree = {}
227
239
  try {
228
240
  // 获得当前文件夹下的所有的文件夹和文件,赋值给目录和文件数组变量
229
- const [dirs, files] = _(fs.readdirSync(dir)).partition(p =>
230
- fs.statSync(path.join(dir, p)).isDirectory()
231
- );
241
+ const [dirs, files] = ld(fs.readdirSync(dir)).partition(p => fs.statSync(path.join(dir, p)).isDirectory())
232
242
 
233
243
  // 对子文件夹进行递归,使用了Promise.all,并发执行
234
- const pms = [];
235
- dirs.forEach(v => pms.push(getFile(path.join(dir, v), rs, src)));
236
- await Promise.all(pms);
244
+ const pms = []
245
+ dirs.forEach(v => pms.push(getFile(path.join(dir, v), rs, src)))
246
+ await Promise.all(pms)
237
247
 
238
248
  // 当前目录下所有文件名进行同步hash计算
239
249
  // eslint-disable-next-line no-restricted-syntax
240
250
  files.forEach(f => {
241
251
  if (f.includes('.js') && rs) {
242
- let file = path.join(dir, f);
252
+ let file = path.join(dir, f)
243
253
  // 去掉项目根路径
244
- file = file.replace(src, '');
245
- if (file.startsWith(path.sep)) file = file.substr(1);
254
+ file = file.replace(src, '')
255
+ if (file.startsWith(path.sep)) file = file.slice(1)
246
256
 
247
- if (path.sep !== '/') file = file.replace(/\\/gim, '/'); // 统一路径为/,方便处理
257
+ if (path.sep !== '/') file = file.replace(/\\/gim, '/') // 统一路径为/,方便处理
248
258
 
249
- rs.push(file);
259
+ rs.push(file)
250
260
  }
251
- });
261
+ })
252
262
  } catch (e) {
253
- console.log(`getFile exp:${e.message}`);
263
+ console.log(`getFile exp:${e.message}`)
254
264
  }
255
265
 
256
- return tree;
266
+ return tree
257
267
  }
258
268
 
259
269
  function clear(dir) {
260
270
  try {
261
- dir = dir || process.cwd();
262
- const src = path.join(dir, './src');
271
+ dir = dir || process.cwd()
272
+ const src = path.join(dir, './src')
263
273
  const ps = `
264
274
  const pages = {};
265
275
 
266
276
  export default pages;
267
- `;
268
- let lastH = '';
269
- const f = path.join(src, './pages.js');
277
+ `
278
+ let lastH = ''
279
+ const f = path.join(src, './pages.js')
270
280
  if (fs.existsSync(f)) {
271
- const tx = fs.readFileSync(f, 'utf8');
272
- lastH = hash(tx);
281
+ const tx = fs.readFileSync(f, 'utf8')
282
+ lastH = hash(tx)
273
283
  }
274
284
  // 有变化,则更新pages文件
275
285
  if (hash(ps) !== lastH) {
276
- console.log('clear save...');
286
+ console.log('clear save...')
277
287
  // 将内容写入page.js 文件
278
- fs.writeFileSync(f, ps, e => e && console.log(`clear save ${f} exp:${e.message}`));
288
+ fs.writeFileSync(f, ps, e => e && console.log(`clear save ${f} exp:${e.message}`))
279
289
  }
280
290
  } catch (err) {
281
- console.log(`clear exp:${err.message}`);
291
+ console.log(`clear exp:${err.message}`)
282
292
  }
283
293
  }
284
294
 
285
295
  // pages(); // 单独调试用
286
296
 
287
- module.exports = {pages, pack, clear, makeFile};
297
+ export {makePages, getEntry as entry, clear, makeFile}