xshell 0.0.54 → 0.0.55

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.
Files changed (59) hide show
  1. package/chalk.browser.d.ts +1 -1
  2. package/chalk.browser.js +3 -19
  3. package/chalk.browser.js.map +1 -1
  4. package/extension.cjs +55780 -0
  5. package/extension.cjs.map +1 -0
  6. package/file.d.ts +3 -3
  7. package/file.js +74 -97
  8. package/file.js.map +1 -1
  9. package/i18n/dict.js +1 -5
  10. package/i18n/dict.js.map +1 -1
  11. package/i18n/i18n-scan.js +9 -12
  12. package/i18n/i18n-scan.js.map +1 -1
  13. package/i18n/index.js +11 -16
  14. package/i18n/index.js.map +1 -1
  15. package/i18n/rwdict.js +3 -7
  16. package/i18n/rwdict.js.map +1 -1
  17. package/i18n/scanner/checker.js +6 -11
  18. package/i18n/scanner/checker.js.map +1 -1
  19. package/i18n/scanner/index.js +39 -44
  20. package/i18n/scanner/index.js.map +1 -1
  21. package/i18n/scanner/parser.js +15 -19
  22. package/i18n/scanner/parser.js.map +1 -1
  23. package/i18n/utils.js +3 -7
  24. package/i18n/utils.js.map +1 -1
  25. package/index.js +5 -8
  26. package/index.js.map +1 -1
  27. package/net.browser.js +6 -13
  28. package/net.browser.js.map +1 -1
  29. package/net.d.ts +2 -2
  30. package/net.js +50 -63
  31. package/net.js.map +1 -1
  32. package/package.json +14 -14
  33. package/process.d.ts +3 -3
  34. package/process.js +18 -23
  35. package/process.js.map +1 -1
  36. package/prototype.browser.js +24 -32
  37. package/prototype.browser.js.map +1 -1
  38. package/prototype.d.ts +1 -1
  39. package/prototype.js +37 -46
  40. package/prototype.js.map +1 -1
  41. package/repl.js +66 -80
  42. package/repl.js.map +1 -1
  43. package/server.d.ts +3 -3
  44. package/server.js +32 -37
  45. package/server.js.map +1 -1
  46. package/toaster.browser.js +6 -9
  47. package/toaster.browser.js.map +1 -1
  48. package/toaster.sass +1 -1
  49. package/tsconfig.json +3 -3
  50. package/ufs.d.ts +1 -1
  51. package/ufs.js +5 -9
  52. package/ufs.js.map +1 -1
  53. package/utils.browser.js +4 -11
  54. package/utils.browser.js.map +1 -1
  55. package/utils.d.ts +3 -3
  56. package/utils.js +41 -62
  57. package/utils.js.map +1 -1
  58. package/xshell.js +2 -4
  59. package/xshell.js.map +1 -1
package/file.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- /// <reference types="node" />
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ /// <reference types="node" resolution-mode="require"/>
4
4
  import { promises as fsp, default as fs } from 'fs';
5
5
  declare type FileHandle = fsp.FileHandle & {
6
6
  fp: string;
package/file.js CHANGED
@@ -1,25 +1,20 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.f2utf8 = exports.freplace = exports.fwatch = exports.fwatchers = exports.flink = exports.fmkdir = exports.frename = exports.fmove = exports.fcopy = exports.fdelete = exports.fstat = exports.flist = exports.fappend = exports.fwrite = exports.fread_json = exports.fread_lines = exports.fread = exports.create_mfs = exports.fopen = exports.fexists = exports.MFS = void 0;
4
- const tslib_1 = require("tslib");
5
- const fs_1 = tslib_1.__importStar(require("fs"));
6
- const upath_1 = tslib_1.__importDefault(require("upath"));
7
- const iconv_lite_1 = tslib_1.__importDefault(require("iconv-lite"));
8
- const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
9
- const rimraf_1 = tslib_1.__importDefault(require("rimraf"));
10
- const debounce_js_1 = tslib_1.__importDefault(require("lodash/debounce.js"));
11
- const memfs_1 = tslib_1.__importDefault(require("memfs"));
12
- exports.MFS = memfs_1.default;
13
- const prototype_js_1 = require("./prototype.js");
14
- tslib_1.__exportStar(require("./ufs.js"), exports);
1
+ import { promises as fsp, default as fs, } from 'fs';
2
+ import path from 'upath';
3
+ import iconv from 'iconv-lite';
4
+ import fse from 'fs-extra';
5
+ import rimraf from 'rimraf';
6
+ import debounce from 'lodash/debounce.js';
7
+ import MFS from 'memfs';
8
+ import { to_json } from './prototype.js';
9
+ export * from './ufs.js';
10
+ export { MFS };
15
11
  /** Does the file/folder pointed to by fp exist? */
16
- function fexists(fp, { print = true } = {}) {
17
- const exists = fs_1.default.existsSync(fp);
12
+ export function fexists(fp, { print = true } = {}) {
13
+ const exists = fs.existsSync(fp);
18
14
  if (print)
19
15
  console.log(exists ? 'exists:' : 'not exists:', fp);
20
16
  return exists;
21
17
  }
22
- exports.fexists = fexists;
23
18
  /**
24
19
  open file, return FileHandle
25
20
  Some characters (`< > : " / \ | ? *`) are reserved under Windows as documented
@@ -30,54 +25,49 @@ exports.fexists = fexists;
30
25
  - options?:
31
26
  - mode?: `'0o666'` Sets the file mode (permission and sticky bits) if the file is created.
32
27
  */
33
- async function fopen(fp, flags, { mode, print } = {}) {
28
+ export async function fopen(fp, flags, { mode, print } = {}) {
34
29
  if (print)
35
30
  console.log('fopen:', fp);
36
- return Object.assign(await fs_1.promises.open(fp, flags, mode), {
31
+ return Object.assign(await fsp.open(fp, flags, mode), {
37
32
  fp,
38
33
  flags,
39
34
  mode
40
35
  });
41
36
  }
42
- exports.fopen = fopen;
43
- function create_mfs() {
44
- let mfs = memfs_1.default.createFsFromVolume(new memfs_1.default.Volume());
45
- mfs.join = upath_1.default.join.bind(upath_1.default);
37
+ export function create_mfs() {
38
+ let mfs = MFS.createFsFromVolume(new MFS.Volume());
39
+ mfs.join = path.join.bind(path);
46
40
  mfs.is_mfs = true;
47
41
  return mfs;
48
42
  }
49
- exports.create_mfs = create_mfs;
50
- async function fread(fp, { dir, encoding = 'utf-8', print = true } = {}) {
43
+ export async function fread(fp, { dir, encoding = 'utf-8', print = true } = {}) {
51
44
  if (dir)
52
- fp = upath_1.default.join(dir, fp);
53
- else if (!upath_1.default.isAbsolute(fp))
45
+ fp = path.join(dir, fp);
46
+ else if (!path.isAbsolute(fp))
54
47
  throw new Error('fp must be absolute path, or pass in \'dir\' parameter');
55
48
  if (print)
56
49
  console.log(`read: ${fp}`);
57
- const buffer = await fs_1.promises.readFile(fp);
50
+ const buffer = await fsp.readFile(fp);
58
51
  if (encoding === 'binary')
59
52
  return buffer;
60
53
  if (encoding === 'utf-8')
61
54
  return buffer.toString('utf8');
62
55
  if (encoding === 'auto') {
63
- const { detect } = await Promise.resolve().then(() => tslib_1.__importStar(require('chardet')));
56
+ const { detect } = await import('chardet');
64
57
  encoding = detect(buffer);
65
58
  if (print)
66
59
  console.log(`${fp} probably has encoding: ${encoding.toLowerCase()}`);
67
60
  }
68
- return iconv_lite_1.default.decode(buffer, encoding);
61
+ return iconv.decode(buffer, encoding);
69
62
  }
70
- exports.fread = fread;
71
- async function fread_lines(fp, options = {}) {
63
+ export async function fread_lines(fp, options = {}) {
72
64
  return (await fread(fp, options))
73
65
  .split_lines();
74
66
  }
75
- exports.fread_lines = fread_lines;
76
- async function fread_json(fp, options = {}) {
67
+ export async function fread_json(fp, options = {}) {
77
68
  return JSON.parse(await fread(fp, options));
78
69
  }
79
- exports.fread_json = fread_json;
80
- async function fwrite(fp, data, { dir, encoding = 'utf-8', print = true, mkdir = false, } = {}) {
70
+ export async function fwrite(fp, data, { dir, encoding = 'utf-8', print = true, mkdir = false, } = {}) {
81
71
  const is_handle = typeof fp === 'object' && fp && 'fd' in fp;
82
72
  if (is_handle) {
83
73
  if (print)
@@ -85,39 +75,37 @@ async function fwrite(fp, data, { dir, encoding = 'utf-8', print = true, mkdir =
85
75
  }
86
76
  else {
87
77
  if (dir)
88
- fp = upath_1.default.join(dir, fp);
89
- else if (!upath_1.default.isAbsolute(fp))
78
+ fp = path.join(dir, fp);
79
+ else if (!path.isAbsolute(fp))
90
80
  throw new Error('fp must be absolute path, or pass in "dir" parameter');
91
81
  if (print)
92
82
  console.log('write:', fp);
93
83
  }
94
84
  if (encoding === 'gb18030')
95
- data = iconv_lite_1.default.encode(data, encoding);
85
+ data = iconv.encode(data, encoding);
96
86
  if (!Buffer.isBuffer(data) && typeof data !== 'string')
97
- data = (0, prototype_js_1.to_json)(data);
87
+ data = to_json(data);
98
88
  try {
99
- await fs_1.promises.writeFile(fp, data);
89
+ await fsp.writeFile(fp, data);
100
90
  }
101
91
  catch (error) {
102
92
  if (!mkdir || error.code !== 'ENOENT' || is_handle)
103
93
  throw error;
104
94
  await fmkdir(fp.fdir);
105
- await fs_1.promises.writeFile(fp, data);
95
+ await fsp.writeFile(fp, data);
106
96
  }
107
97
  }
108
- exports.fwrite = fwrite;
109
- async function fappend(fp, data, { dir, print = true } = {}) {
98
+ export async function fappend(fp, data, { dir, print = true } = {}) {
110
99
  if (dir)
111
- fp = upath_1.default.join(dir, fp);
112
- else if (!upath_1.default.isAbsolute(fp))
100
+ fp = path.join(dir, fp);
101
+ else if (!path.isAbsolute(fp))
113
102
  throw new Error('fp must be absolute path, or pass in "dir" parameter');
114
103
  if (print)
115
104
  console.log('append:', fp);
116
105
  if (!Buffer.isBuffer(data) && typeof data !== 'string')
117
106
  throw new Error('data is not Buffer or string');
118
- await fs_1.promises.appendFile(fp, data);
107
+ await fsp.appendFile(fp, data);
119
108
  }
120
- exports.fappend = fappend;
121
109
  /**
122
110
  - fpd: absolute path of directory
123
111
  - optoins?:
@@ -127,9 +115,9 @@ exports.fappend = fappend;
127
115
  - filter?: `true` RegExp | (fp: string) => any, Note that when deep = true,
128
116
  directories and files in directories that are filtered out by the filter will not be included in the results
129
117
  */
130
- async function flist(fpd, options = {}) {
118
+ export async function flist(fpd, options = {}) {
131
119
  const { filter, deep = false, absolute = false, print = true, } = options;
132
- if (!upath_1.default.isAbsolute(fpd))
120
+ if (!path.isAbsolute(fpd))
133
121
  throw new Error(`fpd (${fpd}) must be absolute path`);
134
122
  if (!fpd.endsWith('/'))
135
123
  throw new Error(`Argument fpd (${fpd}) must end with /`);
@@ -137,7 +125,7 @@ async function flist(fpd, options = {}) {
137
125
  // 都调用了 uv_fs_scandir, 且调用参数相同,仅仅是 Node.js 侧的回调不同 AfterScanDir / AfterScanDirWithTypes
138
126
  // 回调中通过 uv_fs_scandir_next 获取到每个条目的信息,而 uv_fs_scandir_next 中都会读取 type
139
127
  // 速度上:都在 0.2 ms 左右就可以完成
140
- const files = await fs_1.promises.readdir(fpd, {
128
+ const files = await fsp.readdir(fpd, {
141
129
  withFileTypes: true,
142
130
  encoding: 'utf-8',
143
131
  });
@@ -166,28 +154,26 @@ async function flist(fpd, options = {}) {
166
154
  :
167
155
  fps;
168
156
  }
169
- exports.flist = flist;
170
- async function fstat(fp) {
171
- if (!upath_1.default.isAbsolute(fp))
157
+ export async function fstat(fp) {
158
+ if (!path.isAbsolute(fp))
172
159
  throw new Error(`fp (${fp}) must be absolute path`);
173
- return fs_1.promises.stat(fp, { bigint: true });
160
+ return fsp.stat(fp, { bigint: true });
174
161
  }
175
- exports.fstat = fstat;
176
162
  /** delete file or directory (use rimraf to delete directory fast)
177
163
  - fp: path
178
164
  - options?:
179
165
  - print?: `true` (effective only delete single file)
180
166
  */
181
- async function fdelete(fp, { print = true, fast = false } = {}) {
167
+ export async function fdelete(fp, { print = true, fast = false } = {}) {
182
168
  if (fp.length < 6)
183
169
  throw new Error(`${fp} too short`);
184
- if (!upath_1.default.isAbsolute(fp))
170
+ if (!path.isAbsolute(fp))
185
171
  throw new Error('fpd must be absolute path');
186
172
  if (fp.endsWith('/')) {
187
173
  if (print)
188
174
  console.log(`delete directory: ${fp}`.red);
189
175
  await new Promise((resolve, reject) => {
190
- (0, rimraf_1.default)(fp, { glob: false, disableGlob: true }, error => {
176
+ rimraf(fp, { glob: false, disableGlob: true }, error => {
191
177
  if (error)
192
178
  reject(error);
193
179
  else
@@ -198,42 +184,39 @@ async function fdelete(fp, { print = true, fast = false } = {}) {
198
184
  else {
199
185
  if (print)
200
186
  console.log('delete:', fp);
201
- await fs_1.promises.unlink(fp);
187
+ await fsp.unlink(fp);
202
188
  }
203
189
  }
204
- exports.fdelete = fdelete;
205
190
  /** copy file or direcotry
206
191
  - src: src file/directory absolute path
207
192
  - dst: dst file/directory absolute path
208
193
  @example
209
194
  fcopy('d:/temp/camera/', 'd:/camera/')
210
195
  */
211
- async function fcopy(fp_src, fp_dst, { print = true, overwrite = true, } = {}) {
196
+ export async function fcopy(fp_src, fp_dst, { print = true, overwrite = true, } = {}) {
212
197
  if (fp_src.endsWith('/') !== fp_dst.endsWith('/'))
213
198
  throw new Error('fp_src and fp_dst must be both file path or directory path');
214
- if (!upath_1.default.isAbsolute(fp_src) || !upath_1.default.isAbsolute(fp_dst))
199
+ if (!path.isAbsolute(fp_src) || !path.isAbsolute(fp_dst))
215
200
  throw new Error('fp_src and fp_dst must be absolute path');
216
201
  if (print)
217
202
  console.log(`copy: ${fp_src} → ${fp_dst}`);
218
- await fs_extra_1.default.copy(fp_src, fp_dst, { overwrite, errorOnExist: true });
203
+ await fse.copy(fp_src, fp_dst, { overwrite, errorOnExist: true });
219
204
  }
220
- exports.fcopy = fcopy;
221
205
  /** move file or direcotry
222
206
  - src: src file/directory absolute path
223
207
  - dst: dst file/directory absolute path
224
208
  @example
225
209
  fmove('d:/temp/camera/', 'd:/camera/')
226
210
  */
227
- async function fmove(src, dst, { overwrite = false, print = true } = {}) {
211
+ export async function fmove(src, dst, { overwrite = false, print = true } = {}) {
228
212
  if (src.endsWith('/') !== dst.endsWith('/'))
229
213
  throw new Error('src and dst must be both file path or directory path');
230
- if (!upath_1.default.isAbsolute(src) || !upath_1.default.isAbsolute(dst))
214
+ if (!path.isAbsolute(src) || !path.isAbsolute(dst))
231
215
  throw new Error('src and dst must be absolute path');
232
216
  if (print)
233
217
  console.log(`move: ${src} → ${dst}`);
234
- await fs_extra_1.default.move(src, dst, { overwrite });
218
+ await fse.move(src, dst, { overwrite });
235
219
  }
236
- exports.fmove = fmove;
237
220
  /** rename file
238
221
  - fp: current filename/path
239
222
  - fp_: new filename/path
@@ -242,20 +225,19 @@ exports.fmove = fmove;
242
225
  - print?: `true`
243
226
  - overwrite?: `true` better performance without check
244
227
  */
245
- async function frename(fp, fp_, { fpd, print = true, overwrite = true } = {}) {
228
+ export async function frename(fp, fp_, { fpd, print = true, overwrite = true } = {}) {
246
229
  if (fpd) {
247
- fp = upath_1.default.join(fpd, fp);
248
- fp_ = upath_1.default.join(fpd, fp_);
230
+ fp = path.join(fpd, fp);
231
+ fp_ = path.join(fpd, fp_);
249
232
  }
250
- else if (!upath_1.default.isAbsolute(fp) || !upath_1.default.isAbsolute(fp_))
233
+ else if (!path.isAbsolute(fp) || !path.isAbsolute(fp_))
251
234
  throw new Error('fp and fp_ must be absolute path');
252
235
  if (print)
253
236
  console.log('rename:', fp, '→', fp_);
254
237
  if (!overwrite && fexists(fp_))
255
238
  throw new Error(`file already exists:${fp_}`);
256
- await fs_1.promises.rename(fp, fp_);
239
+ await fsp.rename(fp, fp_);
257
240
  }
258
- exports.frename = frename;
259
241
  /**
260
242
  Create folders recursively, make sure the folder pointed to by fpd exists
261
243
  Returns the first created folder or undefined
@@ -265,13 +247,13 @@ exports.frename = frename;
265
247
  - print?: `true`
266
248
  - mode?: `'0o777'`
267
249
  */
268
- async function fmkdir(fpd, { print = true, mode, } = {}) {
269
- if (!upath_1.default.isAbsolute(fpd))
250
+ export async function fmkdir(fpd, { print = true, mode, } = {}) {
251
+ if (!path.isAbsolute(fpd))
270
252
  throw new Error(`fpd must be an absolute path: ${fpd}`);
271
253
  if (!fpd.endsWith('/'))
272
254
  throw new Error(`fpd must end with /: ${fpd}`);
273
255
  // CallingfsPromises.mkdir() when path is a directory that exists results in a rejection only when recursive is false.
274
- const fpd_ = (await fs_1.promises.mkdir(fpd, { recursive: true, mode }))?.replaceAll('\\', '/');
256
+ const fpd_ = (await fsp.mkdir(fpd, { recursive: true, mode }))?.replaceAll('\\', '/');
275
257
  if (fpd_) {
276
258
  if (print)
277
259
  console.log('folder created:', fpd);
@@ -280,13 +262,12 @@ async function fmkdir(fpd, { print = true, mode, } = {}) {
280
262
  console.log('folder already exists:', fpd);
281
263
  return fpd_;
282
264
  }
283
- exports.fmkdir = fmkdir;
284
265
  /**
285
266
  - fp_real: current real file/directory path
286
267
  - fp_link: target file/directory path
287
268
  */
288
- async function flink(fp_real, fp_link, { junction = false, print = true } = {}) {
289
- if (!upath_1.default.isAbsolute(fp_real) || !upath_1.default.isAbsolute(fp_link))
269
+ export async function flink(fp_real, fp_link, { junction = false, print = true } = {}) {
270
+ if (!path.isAbsolute(fp_real) || !path.isAbsolute(fp_link))
290
271
  throw new Error('fp must be absolute path');
291
272
  const is_fpd_real = fp_real.endsWith('/');
292
273
  const is_fpd_link = fp_link.endsWith('/');
@@ -297,12 +278,11 @@ async function flink(fp_real, fp_link, { junction = false, print = true } = {})
297
278
  if (print)
298
279
  console.log(`source file ${fp_real} linked to ${fp_link}`);
299
280
  if (junction)
300
- fs_1.promises.symlink(fp_real, fp_link, 'junction');
281
+ fsp.symlink(fp_real, fp_link, 'junction');
301
282
  else
302
- fs_1.promises.symlink(fp_real, fp_link, is_fpd_real ? 'dir' : 'file');
283
+ fsp.symlink(fp_real, fp_link, is_fpd_real ? 'dir' : 'file');
303
284
  }
304
- exports.flink = flink;
305
- exports.fwatchers = {};
285
+ export let fwatchers = {};
306
286
  /**
307
287
  - fp: path of file or directory
308
288
  - callback: called when modified
@@ -318,41 +298,39 @@ exports.fwatchers = {};
318
298
  The listener callback is attached to the 'change' event fired by fs.FSWatcher, but it is not the same thing as the 'change' value of event.
319
299
 
320
300
  */
321
- async function fwatch(fp, onchange, { exec = true } = {}) {
322
- if (!upath_1.default.isAbsolute(fp))
301
+ export async function fwatch(fp, onchange, { exec = true } = {}) {
302
+ if (!path.isAbsolute(fp))
323
303
  throw new Error('fp must be absolute path');
324
- const _watcher = exports.fwatchers[fp];
304
+ const _watcher = fwatchers[fp];
325
305
  if (_watcher)
326
306
  _watcher.close();
327
307
  if (exec)
328
308
  await onchange('change', fp.fname);
329
309
  const start = new Date().getTime();
330
- const debounced_onchange = (0, debounce_js_1.default)((event, fname) => {
310
+ const debounced_onchange = debounce((event, fname) => {
331
311
  if (new Date().getTime() - start < 800)
332
312
  return;
333
313
  console.log(`file ${event}: ${fname}`);
334
- onchange(event, upath_1.default.normalize(fname));
314
+ onchange(event, path.normalize(fname));
335
315
  }, 500, { leading: false, trailing: true });
336
- let watcher = fs_1.default.watch(fp, debounced_onchange);
316
+ let watcher = fs.watch(fp, debounced_onchange);
337
317
  watcher.on('error', error => {
338
318
  console.error(error);
339
319
  });
340
- return exports.fwatchers[fp] = watcher;
320
+ return fwatchers[fp] = watcher;
341
321
  }
342
- exports.fwatch = fwatch;
343
322
  /** open a file and replace certain pattern */
344
- async function freplace(fp, pattern, replacement) {
323
+ export async function freplace(fp, pattern, replacement) {
345
324
  await fwrite(fp, (await fread(fp))
346
325
  .replaceAll(pattern, replacement));
347
326
  }
348
- exports.freplace = freplace;
349
327
  /** convert file encoding to UTF-8
350
328
  - fp: file absolute path
351
329
  - options?:
352
330
  - dryrun?: `true`
353
331
  - encoding?: `'auto'`
354
332
  */
355
- async function f2utf8(fp, { dryrun = true, encoding = 'auto', } = {}) {
333
+ export async function f2utf8(fp, { dryrun = true, encoding = 'auto', } = {}) {
356
334
  const text = await fread(fp, { encoding });
357
335
  if (dryrun) {
358
336
  console.log(text.slice(0, 10000));
@@ -363,5 +341,4 @@ async function f2utf8(fp, { dryrun = true, encoding = 'auto', } = {}) {
363
341
  await fcopy(fp, fp_bak);
364
342
  await fwrite(fp, text);
365
343
  }
366
- exports.f2utf8 = f2utf8;
367
344
  //# sourceMappingURL=file.js.map
package/file.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","sourceRoot":"","sources":["file.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n promises as fsp,\n default as fs,\n} from 'fs'\ntype FileHandle = fsp.FileHandle & { fp: string }\n\nimport path from 'upath'\nimport iconv from 'iconv-lite'\nimport fse from 'fs-extra'\nimport rimraf from 'rimraf'\n\nimport debounce from 'lodash/debounce.js'\n\n\nimport MFS from 'memfs'\ndeclare module 'memfs' {\n interface IFs {\n join: typeof path.join\n is_mfs: true\n }\n}\n\nimport { to_json } from './prototype.js'\nexport * from './ufs.js'\n\n\nexport { MFS }\n\nexport type Encoding = 'utf-8' | 'gb18030' | 'shift-jis' | 'binary'\n\n\n/** Does the file/folder pointed to by fp exist? */\nexport function fexists (fp: string, { print = true }: { print?: boolean } = { }) {\n const exists = fs.existsSync(fp)\n \n if (print)\n console.log(\n exists ? 'exists:' : 'not exists:',\n fp\n )\n \n return exists\n}\n\n\n/**\n open file, return FileHandle \n Some characters (`< > : \" / \\ | ? *`) are reserved under Windows as documented\n by [Naming Files, Paths, and Namespaces](https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file). Under NTFS, if the filename contains\n a colon, Node.js will open a file system stream, as described by [this MSDN page](https://docs.microsoft.com/en-us/windows/desktop/FileIO/using-streams).\n \n - flags: `'r'`\n - options?:\n - mode?: `'0o666'` Sets the file mode (permission and sticky bits) if the file is created.\n*/\nexport async function fopen (\n fp: string,\n flags: string | number,\n {\n mode,\n print\n }: {\n mode?: fs.Mode\n print?: boolean\n } = { }\n) {\n if (print)\n console.log('fopen:', fp)\n return Object.assign(\n await fsp.open(fp, flags, mode),\n {\n fp,\n flags,\n mode\n }\n )\n}\n\n\nexport function create_mfs () {\n let mfs = MFS.createFsFromVolume(\n new MFS.Volume()\n )\n \n mfs.join = path.join.bind(path)\n mfs.is_mfs = true\n \n return mfs\n}\n\n\nexport async function fread (fp: string): Promise<string>\nexport async function fread (fp: string, { dir, encoding, print }?: { dir?: string, encoding: 'binary', print?: boolean }): Promise<Buffer>\nexport async function fread (fp: string, { dir, encoding, print }?: { dir?: string, encoding?: Encoding | 'auto', print?: boolean }): Promise<string>\nexport async function fread (fp: string, {\n dir, \n encoding = 'utf-8', \n print = true\n}: {\n dir?: string\n encoding?: Encoding | 'auto'\n print?: boolean } = { }\n) {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path, or pass in \\'dir\\' parameter')\n \n if (print)\n console.log(`read: ${fp}`)\n \n const buffer = await fsp.readFile(fp)\n \n if (encoding === 'binary')\n return buffer\n \n if (encoding === 'utf-8')\n return buffer.toString('utf8')\n \n if (encoding === 'auto') {\n const { detect } = await import('chardet')\n encoding = detect(buffer) as any\n if (print)\n console.log(`${fp} probably has encoding: ${encoding.toLowerCase()}`)\n }\n \n return iconv.decode(buffer, encoding)\n}\n\nexport async function fread_lines (fp: string, options: { dir?: string, encoding?: Exclude<Encoding, 'binary'> | 'auto', print?: boolean } = { }) {\n return (await fread(fp, options))\n .split_lines()\n}\n\nexport async function fread_json <T = any> (fp: string, options: { dir?: string, encoding?: Encoding, print?: boolean } = { }): Promise<T> {\n return JSON.parse(\n await fread(fp, options)\n )\n}\n\n\nexport async function fwrite (fp: string | FileHandle, data: Buffer, options?: { dir?: string, print?: boolean, mkdir?: boolean }): Promise<void>\nexport async function fwrite (fp: string | FileHandle, data: any, options?: { dir?: string, encoding?: Encoding, print?: boolean, mkdir?: boolean }): Promise<void>\nexport async function fwrite (\n fp: string | FileHandle,\n data: any,\n {\n dir,\n encoding = 'utf-8',\n print = true,\n mkdir = false,\n }: {\n dir?: string\n encoding?: Encoding\n print?: boolean\n mkdir?: boolean\n } = { }\n) {\n const is_handle = typeof fp === 'object' && fp && 'fd' in fp\n if (is_handle) {\n if (print)\n console.log('write:', (fp as FileHandle).fp)\n } else {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp as string))\n throw new Error('fp must be absolute path, or pass in \"dir\" parameter')\n \n if (print)\n console.log('write:', fp)\n }\n \n if (encoding === 'gb18030')\n data = iconv.encode(data, encoding)\n \n if (!Buffer.isBuffer(data) && typeof data !== 'string')\n data = to_json(data)\n \n try {\n await fsp.writeFile(fp, data)\n } catch (error) {\n if (!mkdir || error.code !== 'ENOENT' || is_handle)\n throw error\n \n await fmkdir((fp as string).fdir)\n await fsp.writeFile(fp, data)\n }\n}\n\nexport async function fappend (fp: string, data: any, { dir, print = true }: { dir?: string, print?: boolean } = { }) {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path, or pass in \"dir\" parameter')\n \n if (print)\n console.log('append:', fp)\n \n if (!Buffer.isBuffer(data) && typeof data !== 'string')\n throw new Error('data is not Buffer or string')\n \n await fsp.appendFile(fp, data)\n}\n\n\n/**\n - fpd: absolute path of directory\n - optoins?:\n - deep?: `false` recursively\n - absolute?: `false` Return, print full path instead of relative path\n - print?: `true`\n - filter?: `true` RegExp | (fp: string) => any, Note that when deep = true, \n directories and files in directories that are filtered out by the filter will not be included in the results\n*/\nexport async function flist (\n fpd: string,\n options: {\n filter?: RegExp | ((fp: string) => any)\n deep?: boolean\n absolute?: boolean\n print?: boolean\n } = { }\n): Promise<string[]> {\n const {\n filter,\n deep = false,\n absolute = false,\n print = true,\n } = options\n \n if (!path.isAbsolute(fpd))\n throw new Error(`fpd (${fpd}) must be absolute path`)\n \n if (!fpd.endsWith('/'))\n throw new Error(`Argument fpd (${fpd}) must end with /`)\n \n // readdir withFileTypes 参数在底层有什么区别,速度上有什么差异\n // 都调用了 uv_fs_scandir, 且调用参数相同,仅仅是 Node.js 侧的回调不同 AfterScanDir / AfterScanDirWithTypes\n // 回调中通过 uv_fs_scandir_next 获取到每个条目的信息,而 uv_fs_scandir_next 中都会读取 type\n // 速度上:都在 0.2 ms 左右就可以完成\n \n const files = await fsp.readdir(fpd, {\n withFileTypes: true,\n encoding: 'utf-8',\n })\n \n const filter_regexp = filter instanceof RegExp\n const filter_fn = Boolean(filter && !filter_regexp)\n \n let fps: string[] = [ ]\n \n for (const file of files) {\n const fp = \n (absolute ? fpd : '') +\n file.name +\n (file.isDirectory() ? '/' : '')\n \n if (filter_regexp && !filter.test(fp))\n continue\n \n if (filter_fn && !(filter as Function)(fp))\n continue\n \n if (print)\n console.log(\n deep || absolute ? fpd + fp : fp\n )\n \n fps.push(fp)\n }\n \n return deep ? (\n await Promise.all(\n fps.map(async fp => \n fp.endsWith('/') ?\n [\n fp,\n ... (await flist(\n absolute ? fp : fpd + fp,\n options\n )).map(fp_ => \n absolute ? fp_ : fp + fp_)\n ]\n :\n fp)\n )\n ).flat()\n :\n fps\n}\n\n\nexport async function fstat (fp: string) {\n if (!path.isAbsolute(fp))\n throw new Error(`fp (${fp}) must be absolute path`)\n \n return fsp.stat(fp, { bigint: true })\n}\n\n\n/** delete file or directory (use rimraf to delete directory fast) \n - fp: path\n - options?:\n - print?: `true` (effective only delete single file)\n*/\nexport async function fdelete (fp: string, { print = true, fast = false }: { print?: boolean, fast?: boolean } = { }) {\n if (fp.length < 6) throw new Error(`${fp} too short`)\n if (!path.isAbsolute(fp))\n throw new Error('fpd must be absolute path')\n \n if (fp.endsWith('/')) {\n if (print)\n console.log(`delete directory: ${fp}`.red)\n await new Promise<void>((resolve, reject) => {\n rimraf(fp, { glob: false, disableGlob: true }, error => {\n if (error)\n reject(error)\n else\n resolve()\n })\n })\n } else {\n if (print)\n console.log('delete:', fp)\n await fsp.unlink(fp)\n }\n}\n\n\n/** copy file or direcotry\n - src: src file/directory absolute path\n - dst: dst file/directory absolute path\n @example\n fcopy('d:/temp/camera/', 'd:/camera/')\n*/\nexport async function fcopy (fp_src: string, fp_dst: string, {\n print = true,\n overwrite = true,\n}: {\n print?: boolean\n overwrite?: boolean\n} = { }) {\n if (fp_src.endsWith('/') !== fp_dst.endsWith('/'))\n throw new Error('fp_src and fp_dst must be both file path or directory path')\n \n if (!path.isAbsolute(fp_src) || !path.isAbsolute(fp_dst))\n throw new Error('fp_src and fp_dst must be absolute path')\n \n if (print)\n console.log(`copy: ${fp_src} → ${fp_dst}`)\n \n await fse.copy(fp_src, fp_dst, { overwrite, errorOnExist: true })\n}\n\n\n/** move file or direcotry\n - src: src file/directory absolute path\n - dst: dst file/directory absolute path\n @example\n fmove('d:/temp/camera/', 'd:/camera/')\n*/\nexport async function fmove (src: string, dst: string, {\n overwrite = false,\n print = true\n}: {\n overwrite?: boolean\n print?: boolean\n} = { }) {\n if (src.endsWith('/') !== dst.endsWith('/'))\n throw new Error('src and dst must be both file path or directory path')\n \n if (!path.isAbsolute(src) || !path.isAbsolute(dst))\n throw new Error('src and dst must be absolute path')\n \n if (print)\n console.log(`move: ${src} → ${dst}`)\n \n await fse.move(src, dst, { overwrite })\n}\n\n\n/** rename file \n - fp: current filename/path\n - fp_: new filename/path\n - options?:\n - fpd?: fp and fp_ is in same directory\n - print?: `true`\n - overwrite?: `true` better performance without check\n */\nexport async function frename (\n fp: string, \n fp_: string,\n {\n fpd,\n print = true,\n overwrite = true\n }: {\n fpd?: string\n print?: boolean\n overwrite?: boolean\n } = { }\n) {\n if (fpd) {\n fp = path.join(fpd, fp)\n fp_ = path.join(fpd, fp_)\n } else if (!path.isAbsolute(fp) || !path.isAbsolute(fp_))\n throw new Error('fp and fp_ must be absolute path')\n \n if (print)\n console.log('rename:', fp, '→', fp_)\n \n if (!overwrite && fexists(fp_))\n throw new Error(`file already exists:${fp_}`)\n \n await fsp.rename(fp, fp_)\n}\n\n\n/**\n Create folders recursively, make sure the folder pointed to by fpd exists \n Returns the first created folder or undefined\n \n - fpd: Folder full path\n - options?:\n - print?: `true`\n - mode?: `'0o777'`\n*/\nexport async function fmkdir (\n fpd: string,\n {\n print = true,\n mode,\n }: {\n print?: boolean\n \n /** `0o777` A file mode. If a string is passed, it is parsed as an octal integer. */\n mode?: string | number\n } = { }\n) {\n if (!path.isAbsolute(fpd))\n throw new Error(`fpd must be an absolute path: ${fpd}`)\n \n if (!fpd.endsWith('/'))\n throw new Error(`fpd must end with /: ${fpd}`)\n \n // CallingfsPromises.mkdir() when path is a directory that exists results in a rejection only when recursive is false.\n const fpd_ = (\n await fsp.mkdir(fpd, { recursive: true, mode })\n )?.replaceAll('\\\\', '/')\n \n if (fpd_) {\n if (print)\n console.log('folder created:', fpd)\n } else\n if (print)\n console.log('folder already exists:', fpd)\n \n return fpd_\n}\n\n\n/** \n - fp_real: current real file/directory path\n - fp_link: target file/directory path\n*/\nexport async function flink (\n fp_real: string, \n fp_link: string, \n {\n junction = false,\n print = true \n }: { \n junction?: boolean\n print?: boolean\n} = { }) {\n if (!path.isAbsolute(fp_real) || !path.isAbsolute(fp_link))\n throw new Error('fp must be absolute path')\n \n const is_fpd_real = fp_real.endsWith('/')\n const is_fpd_link = fp_link.endsWith('/')\n \n if (is_fpd_real !== is_fpd_link)\n throw new Error('fp_real and fp_link must be both file path or folder path')\n \n if (fexists(fp_link))\n throw new Error(`${ is_fpd_link ? 'folder' : 'file' } exists: ${fp_link}, could not create link`)\n \n if (print)\n console.log(`source file ${fp_real} linked to ${fp_link}`)\n \n if (junction)\n fsp.symlink(fp_real, fp_link, 'junction')\n else\n fsp.symlink(fp_real, fp_link, is_fpd_real ? 'dir' : 'file')\n}\n\n\nexport let fwatchers: Record<string, fs.FSWatcher> = { }\n\n/**\n - fp: path of file or directory\n - callback: called when modified\n - exec: call callback when watch is executed\n \n save fs.FSWatcher in watchers, subsequent call will auto close existing watcher for the same fp\n \n https://nodejs.org/dist/latest-v15.x/docs/api/fs.html#fs_fs_watch_filename_options_listener \n The listener callback gets two arguments (event, fname). \n event is either 'rename' or 'change', and filename is the name of the file which triggered the event.\n On most platforms, 'rename' is emitted whenever a filename appears or disappears in the directory.\n \n The listener callback is attached to the 'change' event fired by fs.FSWatcher, but it is not the same thing as the 'change' value of event. \n \n*/\nexport async function fwatch (\n fp: string,\n onchange: (event: string, fname: string) => any, \n { exec = true }: { exec?: boolean } = { }\n) {\n if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path')\n \n const _watcher = fwatchers[fp]\n if (_watcher)\n _watcher.close()\n \n if (exec)\n await onchange('change', fp.fname)\n \n const start = new Date().getTime()\n \n const debounced_onchange = debounce(\n (event, fname) => {\n if (new Date().getTime() - start < 800)\n return\n console.log(`file ${event}: ${fname}`)\n onchange(event, path.normalize(fname))\n },\n 500,\n { leading: false, trailing: true }\n )\n \n let watcher = fs.watch(fp, debounced_onchange)\n watcher.on('error', error => {\n console.error(error)\n })\n return fwatchers[fp] = watcher\n}\n\n\n/** open a file and replace certain pattern */\nexport async function freplace (fp: string, pattern: string | RegExp, replacement: string) {\n await fwrite(\n fp,\n (await fread(fp))\n .replaceAll(pattern, replacement)\n )\n}\n\n/** convert file encoding to UTF-8\n - fp: file absolute path\n - options?:\n - dryrun?: `true`\n - encoding?: `'auto'`\n*/\nexport async function f2utf8 (fp: string, {\n dryrun = true,\n encoding = 'auto',\n}: {\n dryrun?: boolean\n encoding?: Encoding | 'auto'\n} = { }) {\n const text = await fread(fp, { encoding })\n if (dryrun) {\n console.log(text.slice(0, 10000))\n return\n }\n \n const fp_bak = `${fp.fdir}${fp.fname.replace(/(.*?)(\\.[^.]+)?$/, '$1.bak$2')}`\n if (!fexists(fp_bak))\n await fcopy(fp, fp_bak)\n \n await fwrite(fp, text)\n}\n\n"]}
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["file.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n promises as fsp,\n default as fs,\n} from 'fs'\ntype FileHandle = fsp.FileHandle & { fp: string }\n\nimport path from 'upath'\nimport iconv from 'iconv-lite'\nimport fse from 'fs-extra'\nimport rimraf from 'rimraf'\n\nimport debounce from 'lodash/debounce.js'\n\n\nimport MFS from 'memfs'\ndeclare module 'memfs' {\n interface IFs {\n join: typeof path.join\n is_mfs: true\n }\n}\n\nimport { to_json } from './prototype.js'\nexport * from './ufs.js'\n\n\nexport { MFS }\n\nexport type Encoding = 'utf-8' | 'gb18030' | 'shift-jis' | 'binary'\n\n\n/** Does the file/folder pointed to by fp exist? */\nexport function fexists (fp: string, { print = true }: { print?: boolean } = { }) {\n const exists = fs.existsSync(fp)\n \n if (print)\n console.log(\n exists ? 'exists:' : 'not exists:',\n fp\n )\n \n return exists\n}\n\n\n/**\n open file, return FileHandle \n Some characters (`< > : \" / \\ | ? *`) are reserved under Windows as documented\n by [Naming Files, Paths, and Namespaces](https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file). Under NTFS, if the filename contains\n a colon, Node.js will open a file system stream, as described by [this MSDN page](https://docs.microsoft.com/en-us/windows/desktop/FileIO/using-streams).\n \n - flags: `'r'`\n - options?:\n - mode?: `'0o666'` Sets the file mode (permission and sticky bits) if the file is created.\n*/\nexport async function fopen (\n fp: string,\n flags: string | number,\n {\n mode,\n print\n }: {\n mode?: fs.Mode\n print?: boolean\n } = { }\n) {\n if (print)\n console.log('fopen:', fp)\n return Object.assign(\n await fsp.open(fp, flags, mode),\n {\n fp,\n flags,\n mode\n }\n )\n}\n\n\nexport function create_mfs () {\n let mfs = MFS.createFsFromVolume(\n new MFS.Volume()\n )\n \n mfs.join = path.join.bind(path)\n mfs.is_mfs = true\n \n return mfs\n}\n\n\nexport async function fread (fp: string): Promise<string>\nexport async function fread (fp: string, { dir, encoding, print }?: { dir?: string, encoding: 'binary', print?: boolean }): Promise<Buffer>\nexport async function fread (fp: string, { dir, encoding, print }?: { dir?: string, encoding?: Encoding | 'auto', print?: boolean }): Promise<string>\nexport async function fread (fp: string, {\n dir, \n encoding = 'utf-8', \n print = true\n}: {\n dir?: string\n encoding?: Encoding | 'auto'\n print?: boolean } = { }\n) {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path, or pass in \\'dir\\' parameter')\n \n if (print)\n console.log(`read: ${fp}`)\n \n const buffer = await fsp.readFile(fp)\n \n if (encoding === 'binary')\n return buffer\n \n if (encoding === 'utf-8')\n return buffer.toString('utf8')\n \n if (encoding === 'auto') {\n const { detect } = await import('chardet')\n encoding = detect(buffer) as any\n if (print)\n console.log(`${fp} probably has encoding: ${encoding.toLowerCase()}`)\n }\n \n return iconv.decode(buffer, encoding)\n}\n\nexport async function fread_lines (fp: string, options: { dir?: string, encoding?: Exclude<Encoding, 'binary'> | 'auto', print?: boolean } = { }) {\n return (await fread(fp, options))\n .split_lines()\n}\n\nexport async function fread_json <T = any> (fp: string, options: { dir?: string, encoding?: Encoding, print?: boolean } = { }): Promise<T> {\n return JSON.parse(\n await fread(fp, options)\n )\n}\n\n\nexport async function fwrite (fp: string | FileHandle, data: Buffer, options?: { dir?: string, print?: boolean, mkdir?: boolean }): Promise<void>\nexport async function fwrite (fp: string | FileHandle, data: any, options?: { dir?: string, encoding?: Encoding, print?: boolean, mkdir?: boolean }): Promise<void>\nexport async function fwrite (\n fp: string | FileHandle,\n data: any,\n {\n dir,\n encoding = 'utf-8',\n print = true,\n mkdir = false,\n }: {\n dir?: string\n encoding?: Encoding\n print?: boolean\n mkdir?: boolean\n } = { }\n) {\n const is_handle = typeof fp === 'object' && fp && 'fd' in fp\n if (is_handle) {\n if (print)\n console.log('write:', (fp as FileHandle).fp)\n } else {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp as string))\n throw new Error('fp must be absolute path, or pass in \"dir\" parameter')\n \n if (print)\n console.log('write:', fp)\n }\n \n if (encoding === 'gb18030')\n data = iconv.encode(data, encoding)\n \n if (!Buffer.isBuffer(data) && typeof data !== 'string')\n data = to_json(data)\n \n try {\n await fsp.writeFile(fp, data)\n } catch (error) {\n if (!mkdir || error.code !== 'ENOENT' || is_handle)\n throw error\n \n await fmkdir((fp as string).fdir)\n await fsp.writeFile(fp, data)\n }\n}\n\nexport async function fappend (fp: string, data: any, { dir, print = true }: { dir?: string, print?: boolean } = { }) {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path, or pass in \"dir\" parameter')\n \n if (print)\n console.log('append:', fp)\n \n if (!Buffer.isBuffer(data) && typeof data !== 'string')\n throw new Error('data is not Buffer or string')\n \n await fsp.appendFile(fp, data)\n}\n\n\n/**\n - fpd: absolute path of directory\n - optoins?:\n - deep?: `false` recursively\n - absolute?: `false` Return, print full path instead of relative path\n - print?: `true`\n - filter?: `true` RegExp | (fp: string) => any, Note that when deep = true, \n directories and files in directories that are filtered out by the filter will not be included in the results\n*/\nexport async function flist (\n fpd: string,\n options: {\n filter?: RegExp | ((fp: string) => any)\n deep?: boolean\n absolute?: boolean\n print?: boolean\n } = { }\n): Promise<string[]> {\n const {\n filter,\n deep = false,\n absolute = false,\n print = true,\n } = options\n \n if (!path.isAbsolute(fpd))\n throw new Error(`fpd (${fpd}) must be absolute path`)\n \n if (!fpd.endsWith('/'))\n throw new Error(`Argument fpd (${fpd}) must end with /`)\n \n // readdir withFileTypes 参数在底层有什么区别,速度上有什么差异\n // 都调用了 uv_fs_scandir, 且调用参数相同,仅仅是 Node.js 侧的回调不同 AfterScanDir / AfterScanDirWithTypes\n // 回调中通过 uv_fs_scandir_next 获取到每个条目的信息,而 uv_fs_scandir_next 中都会读取 type\n // 速度上:都在 0.2 ms 左右就可以完成\n \n const files = await fsp.readdir(fpd, {\n withFileTypes: true,\n encoding: 'utf-8',\n })\n \n const filter_regexp = filter instanceof RegExp\n const filter_fn = Boolean(filter && !filter_regexp)\n \n let fps: string[] = [ ]\n \n for (const file of files) {\n const fp = \n (absolute ? fpd : '') +\n file.name +\n (file.isDirectory() ? '/' : '')\n \n if (filter_regexp && !filter.test(fp))\n continue\n \n if (filter_fn && !(filter as Function)(fp))\n continue\n \n if (print)\n console.log(\n deep || absolute ? fpd + fp : fp\n )\n \n fps.push(fp)\n }\n \n return deep ? (\n await Promise.all(\n fps.map(async fp => \n fp.endsWith('/') ?\n [\n fp,\n ... (await flist(\n absolute ? fp : fpd + fp,\n options\n )).map(fp_ => \n absolute ? fp_ : fp + fp_)\n ]\n :\n fp)\n )\n ).flat()\n :\n fps\n}\n\n\nexport async function fstat (fp: string) {\n if (!path.isAbsolute(fp))\n throw new Error(`fp (${fp}) must be absolute path`)\n \n return fsp.stat(fp, { bigint: true })\n}\n\n\n/** delete file or directory (use rimraf to delete directory fast) \n - fp: path\n - options?:\n - print?: `true` (effective only delete single file)\n*/\nexport async function fdelete (fp: string, { print = true, fast = false }: { print?: boolean, fast?: boolean } = { }) {\n if (fp.length < 6) throw new Error(`${fp} too short`)\n if (!path.isAbsolute(fp))\n throw new Error('fpd must be absolute path')\n \n if (fp.endsWith('/')) {\n if (print)\n console.log(`delete directory: ${fp}`.red)\n await new Promise<void>((resolve, reject) => {\n rimraf(fp, { glob: false, disableGlob: true }, error => {\n if (error)\n reject(error)\n else\n resolve()\n })\n })\n } else {\n if (print)\n console.log('delete:', fp)\n await fsp.unlink(fp)\n }\n}\n\n\n/** copy file or direcotry\n - src: src file/directory absolute path\n - dst: dst file/directory absolute path\n @example\n fcopy('d:/temp/camera/', 'd:/camera/')\n*/\nexport async function fcopy (fp_src: string, fp_dst: string, {\n print = true,\n overwrite = true,\n}: {\n print?: boolean\n overwrite?: boolean\n} = { }) {\n if (fp_src.endsWith('/') !== fp_dst.endsWith('/'))\n throw new Error('fp_src and fp_dst must be both file path or directory path')\n \n if (!path.isAbsolute(fp_src) || !path.isAbsolute(fp_dst))\n throw new Error('fp_src and fp_dst must be absolute path')\n \n if (print)\n console.log(`copy: ${fp_src} → ${fp_dst}`)\n \n await fse.copy(fp_src, fp_dst, { overwrite, errorOnExist: true })\n}\n\n\n/** move file or direcotry\n - src: src file/directory absolute path\n - dst: dst file/directory absolute path\n @example\n fmove('d:/temp/camera/', 'd:/camera/')\n*/\nexport async function fmove (src: string, dst: string, {\n overwrite = false,\n print = true\n}: {\n overwrite?: boolean\n print?: boolean\n} = { }) {\n if (src.endsWith('/') !== dst.endsWith('/'))\n throw new Error('src and dst must be both file path or directory path')\n \n if (!path.isAbsolute(src) || !path.isAbsolute(dst))\n throw new Error('src and dst must be absolute path')\n \n if (print)\n console.log(`move: ${src} → ${dst}`)\n \n await fse.move(src, dst, { overwrite })\n}\n\n\n/** rename file \n - fp: current filename/path\n - fp_: new filename/path\n - options?:\n - fpd?: fp and fp_ is in same directory\n - print?: `true`\n - overwrite?: `true` better performance without check\n */\nexport async function frename (\n fp: string, \n fp_: string,\n {\n fpd,\n print = true,\n overwrite = true\n }: {\n fpd?: string\n print?: boolean\n overwrite?: boolean\n } = { }\n) {\n if (fpd) {\n fp = path.join(fpd, fp)\n fp_ = path.join(fpd, fp_)\n } else if (!path.isAbsolute(fp) || !path.isAbsolute(fp_))\n throw new Error('fp and fp_ must be absolute path')\n \n if (print)\n console.log('rename:', fp, '→', fp_)\n \n if (!overwrite && fexists(fp_))\n throw new Error(`file already exists:${fp_}`)\n \n await fsp.rename(fp, fp_)\n}\n\n\n/**\n Create folders recursively, make sure the folder pointed to by fpd exists \n Returns the first created folder or undefined\n \n - fpd: Folder full path\n - options?:\n - print?: `true`\n - mode?: `'0o777'`\n*/\nexport async function fmkdir (\n fpd: string,\n {\n print = true,\n mode,\n }: {\n print?: boolean\n \n /** `0o777` A file mode. If a string is passed, it is parsed as an octal integer. */\n mode?: string | number\n } = { }\n) {\n if (!path.isAbsolute(fpd))\n throw new Error(`fpd must be an absolute path: ${fpd}`)\n \n if (!fpd.endsWith('/'))\n throw new Error(`fpd must end with /: ${fpd}`)\n \n // CallingfsPromises.mkdir() when path is a directory that exists results in a rejection only when recursive is false.\n const fpd_ = (\n await fsp.mkdir(fpd, { recursive: true, mode })\n )?.replaceAll('\\\\', '/')\n \n if (fpd_) {\n if (print)\n console.log('folder created:', fpd)\n } else\n if (print)\n console.log('folder already exists:', fpd)\n \n return fpd_\n}\n\n\n/** \n - fp_real: current real file/directory path\n - fp_link: target file/directory path\n*/\nexport async function flink (\n fp_real: string, \n fp_link: string, \n {\n junction = false,\n print = true \n }: { \n junction?: boolean\n print?: boolean\n} = { }) {\n if (!path.isAbsolute(fp_real) || !path.isAbsolute(fp_link))\n throw new Error('fp must be absolute path')\n \n const is_fpd_real = fp_real.endsWith('/')\n const is_fpd_link = fp_link.endsWith('/')\n \n if (is_fpd_real !== is_fpd_link)\n throw new Error('fp_real and fp_link must be both file path or folder path')\n \n if (fexists(fp_link))\n throw new Error(`${ is_fpd_link ? 'folder' : 'file' } exists: ${fp_link}, could not create link`)\n \n if (print)\n console.log(`source file ${fp_real} linked to ${fp_link}`)\n \n if (junction)\n fsp.symlink(fp_real, fp_link, 'junction')\n else\n fsp.symlink(fp_real, fp_link, is_fpd_real ? 'dir' : 'file')\n}\n\n\nexport let fwatchers: Record<string, fs.FSWatcher> = { }\n\n/**\n - fp: path of file or directory\n - callback: called when modified\n - exec: call callback when watch is executed\n \n save fs.FSWatcher in watchers, subsequent call will auto close existing watcher for the same fp\n \n https://nodejs.org/dist/latest-v15.x/docs/api/fs.html#fs_fs_watch_filename_options_listener \n The listener callback gets two arguments (event, fname). \n event is either 'rename' or 'change', and filename is the name of the file which triggered the event.\n On most platforms, 'rename' is emitted whenever a filename appears or disappears in the directory.\n \n The listener callback is attached to the 'change' event fired by fs.FSWatcher, but it is not the same thing as the 'change' value of event. \n \n*/\nexport async function fwatch (\n fp: string,\n onchange: (event: string, fname: string) => any, \n { exec = true }: { exec?: boolean } = { }\n) {\n if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path')\n \n const _watcher = fwatchers[fp]\n if (_watcher)\n _watcher.close()\n \n if (exec)\n await onchange('change', fp.fname)\n \n const start = new Date().getTime()\n \n const debounced_onchange = debounce(\n (event, fname) => {\n if (new Date().getTime() - start < 800)\n return\n console.log(`file ${event}: ${fname}`)\n onchange(event, path.normalize(fname))\n },\n 500,\n { leading: false, trailing: true }\n )\n \n let watcher = fs.watch(fp, debounced_onchange)\n watcher.on('error', error => {\n console.error(error)\n })\n return fwatchers[fp] = watcher\n}\n\n\n/** open a file and replace certain pattern */\nexport async function freplace (fp: string, pattern: string | RegExp, replacement: string) {\n await fwrite(\n fp,\n (await fread(fp))\n .replaceAll(pattern, replacement)\n )\n}\n\n/** convert file encoding to UTF-8\n - fp: file absolute path\n - options?:\n - dryrun?: `true`\n - encoding?: `'auto'`\n*/\nexport async function f2utf8 (fp: string, {\n dryrun = true,\n encoding = 'auto',\n}: {\n dryrun?: boolean\n encoding?: Encoding | 'auto'\n} = { }) {\n const text = await fread(fp, { encoding })\n if (dryrun) {\n console.log(text.slice(0, 10000))\n return\n }\n \n const fp_bak = `${fp.fdir}${fp.fname.replace(/(.*?)(\\.[^.]+)?$/, '$1.bak$2')}`\n if (!fexists(fp_bak))\n await fcopy(fp, fp_bak)\n \n await fwrite(fp, text)\n}\n\n"]}
package/i18n/dict.js CHANGED
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Dict = void 0;
4
- class Dict {
1
+ export class Dict {
5
2
  _dict;
6
3
  constructor(_dict = {}) {
7
4
  this._dict = _dict;
@@ -33,5 +30,4 @@ class Dict {
33
30
  });
34
31
  }
35
32
  }
36
- exports.Dict = Dict;
37
33
  //# sourceMappingURL=dict.js.map
package/i18n/dict.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dict.js","sourceRoot":"","sources":["dict.ts"],"names":[],"mappings":";;;AAEA,MAAa,IAAI;IACb,KAAK,CAAO;IAEZ,YAAa,QAAe,EAAE;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC;IAID,GAAG,CAAE,GAAW,EAAE,QAAmB;QACjC,IAAI,CAAC,GAAG;YACJ,OAAO,EAAE,CAAA;QAEb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAE5B,IAAI,QAAQ;YACR,OAAO,IAAI,CAAC,CAAC;gBACL,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;gBACxB,CAAC;oBACG,EAAE,CAAA;QAEd,OAAO,IAAI,CAAA;IACf,CAAC;IAED,YAAY;QACR,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;YAC3D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAE,CAAC,CAAE,QAAQ,EAAE,WAAW,CAAE,EAAE,EAAE;gBACxD,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE,OAAM;gBAC1C,GAAG,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,WAAW,CAAA;YAChD,CAAC,CAAC,CAAA;YACF,OAAO,GAAG,CAAA;QACd,CAAC,EAAE;YACC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAG,EAAE;YACxB,EAAE,EAAE,EAAE,WAAW,EAAE,EAAG,EAAE;YACxB,EAAE,EAAE,EAAE,WAAW,EAAE,EAAG,EAAE;YACxB,EAAE,EAAE,EAAE,WAAW,EAAE,EAAG,EAAE;SAC3B,CAAC,CAAA;IACN,CAAC;CACJ;AAtCD,oBAsCC","sourcesContent":["import type { Language } from './index.js'\n\nexport class Dict {\n _dict: _Dict\n \n constructor (_dict: _Dict = {}) {\n this._dict = _dict\n }\n \n get (key: string): Item | undefined\n get (key: string, language: Language): string | ''\n get (key: string, language?: Language) {\n if (!key)\n return ''\n \n const item = this._dict[key]\n \n if (language)\n return item ?\n item[language] || ''\n :\n ''\n \n return item\n }\n \n to_resources () {\n return Object.entries(this._dict).reduce( (acc, [key, item]) => {\n Object.entries(item).forEach( ([ language, translation ]) => {\n if (!translation || !acc[language]) return\n acc[language].translation[key] = translation\n })\n return acc\n }, {\n zh: { translation: { } },\n en: { translation: { } },\n ja: { translation: { } },\n ko: { translation: { } },\n })\n }\n}\n\n\n/** 配置字段 */\nexport type Item = {\n [language in Language]?: string\n}\n\n\n/** JSON.parse(词典文件.json) 得到的对象 */\nexport interface _Dict {\n [key: string]: Item\n}\n"]}
1
+ {"version":3,"file":"dict.js","sourceRoot":"","sources":["dict.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,IAAI;IACb,KAAK,CAAO;IAEZ,YAAa,QAAe,EAAE;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC;IAID,GAAG,CAAE,GAAW,EAAE,QAAmB;QACjC,IAAI,CAAC,GAAG;YACJ,OAAO,EAAE,CAAA;QAEb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAE5B,IAAI,QAAQ;YACR,OAAO,IAAI,CAAC,CAAC;gBACL,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;gBACxB,CAAC;oBACG,EAAE,CAAA;QAEd,OAAO,IAAI,CAAA;IACf,CAAC;IAED,YAAY;QACR,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;YAC3D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAE,CAAC,CAAE,QAAQ,EAAE,WAAW,CAAE,EAAE,EAAE;gBACxD,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE,OAAM;gBAC1C,GAAG,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,WAAW,CAAA;YAChD,CAAC,CAAC,CAAA;YACF,OAAO,GAAG,CAAA;QACd,CAAC,EAAE;YACC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAG,EAAE;YACxB,EAAE,EAAE,EAAE,WAAW,EAAE,EAAG,EAAE;YACxB,EAAE,EAAE,EAAE,WAAW,EAAE,EAAG,EAAE;YACxB,EAAE,EAAE,EAAE,WAAW,EAAE,EAAG,EAAE;SAC3B,CAAC,CAAA;IACN,CAAC;CACJ","sourcesContent":["import type { Language } from './index.js'\n\nexport class Dict {\n _dict: _Dict\n \n constructor (_dict: _Dict = {}) {\n this._dict = _dict\n }\n \n get (key: string): Item | undefined\n get (key: string, language: Language): string | ''\n get (key: string, language?: Language) {\n if (!key)\n return ''\n \n const item = this._dict[key]\n \n if (language)\n return item ?\n item[language] || ''\n :\n ''\n \n return item\n }\n \n to_resources () {\n return Object.entries(this._dict).reduce( (acc, [key, item]) => {\n Object.entries(item).forEach( ([ language, translation ]) => {\n if (!translation || !acc[language]) return\n acc[language].translation[key] = translation\n })\n return acc\n }, {\n zh: { translation: { } },\n en: { translation: { } },\n ja: { translation: { } },\n ko: { translation: { } },\n })\n }\n}\n\n\n/** 配置字段 */\nexport type Item = {\n [language in Language]?: string\n}\n\n\n/** JSON.parse(词典文件.json) 得到的对象 */\nexport interface _Dict {\n [key: string]: Item\n}\n"]}
package/i18n/i18n-scan.js CHANGED
@@ -1,21 +1,18 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- const tslib_1 = require("tslib");
5
- const upath_1 = tslib_1.__importDefault(require("upath"));
6
- const commander_1 = require("commander");
7
- const index_js_1 = require("./scanner/index.js");
8
- const utils_js_1 = require("./utils.js");
2
+ import path from 'upath';
3
+ import { program } from 'commander';
4
+ import { scanner } from './scanner/index.js';
5
+ import { try_load_dict } from './utils.js';
9
6
  (async function main() {
10
- commander_1.program.name('i18n-scan')
11
- .option('-r, --rootdir [rootdir]', '根目录:默认为当前工作目录', upath_1.default.normalize(process.cwd()))
7
+ program.name('i18n-scan')
8
+ .option('-r, --rootdir [rootdir]', '根目录:默认为当前工作目录', path.normalize(process.cwd()))
12
9
  .option('-i, --input [input]', '扫描 pattern:多个 pattern 用分号分割,采用 glob pattern 匹配,如 `src/**/*.{js,jsx,ts,tsx}`', v => v.split(';'))
13
10
  .option('-o, --output [output]', 'i18n 目录:默认为 <rootdir>/i18n/')
14
11
  .option('-c, --config [config]', '自定义配置文件,默认为 <rootdir>/i18n/config.js ,可参考默认配置 xshell/i18n/index.ts 以及 https://github.com/i18next/i18next-scanner', 'i18n/config.js')
15
12
  .parse(process.argv);
16
- const { rootdir, config, input, output } = commander_1.program.opts();
17
- (0, index_js_1.scanner)(rootdir, {
18
- ...await (0, utils_js_1.try_load_dict)(upath_1.default.resolve(rootdir, config)),
13
+ const { rootdir, config, input, output } = program.opts();
14
+ scanner(rootdir, {
15
+ ...await try_load_dict(path.resolve(rootdir, config)),
19
16
  ...input ? { input } : {},
20
17
  ...output ? { output } : {},
21
18
  });
@@ -1 +1 @@
1
- {"version":3,"file":"i18n-scan.js","sourceRoot":"","sources":["i18n-scan.ts"],"names":[],"mappings":";;;;AAEA,0DAAwB;AACxB,yCAAmC;AAEnC,iDAA4C;AAC5C,yCAEC;AAAA,CAAC,KAAK,UAAU,IAAI;IACjB,mBAAO,CAAC,IAAI,CAAC,WAAW,CAAC;SACpB,MAAM,CAAC,yBAAyB,EAAK,eAAe,EAAE,eAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;SACpF,MAAM,CAAC,qBAAqB,EAAS,6EAA6E,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACtI,MAAM,CAAC,uBAAuB,EAAO,6BAA6B,CAAC;SACnE,MAAM,CAAC,uBAAuB,EAAO,kHAAkH,EAAE,gBAAgB,CAAC;SAC1K,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAExB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,mBAAO,CAAC,IAAI,EAAE,CAAA;IACzD,IAAA,kBAAO,EAAC,OAAO,EAAE;QACb,GAAI,MAAM,IAAA,wBAAa,EACnB,eAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAChC;QACD,GAAI,KAAK,CAAE,CAAC,CAAE,EAAE,KAAK,EAAE,CAAG,CAAC,CAAE,EAAG;QAChC,GAAI,MAAM,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,CAAE,CAAC,CAAE,EAAG;KACnC,CAAC,CAAA;AACN,CAAC,CAAC,EAAE,CAAA","sourcesContent":["#!/usr/bin/env node\n\nimport path from 'upath'\nimport { program } from 'commander'\n\nimport { scanner } from './scanner/index.js'\nimport { try_load_dict } from './utils.js'\n\n;(async function main () {\n program.name('i18n-scan')\n .option('-r, --rootdir [rootdir]' , '根目录:默认为当前工作目录', path.normalize(process.cwd()))\n .option('-i, --input [input]' , '扫描 pattern:多个 pattern 用分号分割,采用 glob pattern 匹配,如 `src/**/*.{js,jsx,ts,tsx}`', v => v.split(';'))\n .option('-o, --output [output]' , 'i18n 目录:默认为 <rootdir>/i18n/')\n .option('-c, --config [config]' , '自定义配置文件,默认为 <rootdir>/i18n/config.js ,可参考默认配置 xshell/i18n/index.ts 以及 https://github.com/i18next/i18next-scanner', 'i18n/config.js')\n .parse(process.argv)\n \n const { rootdir, config, input, output } = program.opts()\n scanner(rootdir, {\n ... await try_load_dict(\n path.resolve(rootdir, config)\n ),\n ... input ? { input } : { },\n ... output ? { output } : { },\n })\n})()\n"]}
1
+ {"version":3,"file":"i18n-scan.js","sourceRoot":"","sources":["i18n-scan.ts"],"names":[],"mappings":";AAEA,OAAO,IAAI,MAAM,OAAO,CAAA;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAEzC;AAAA,CAAC,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;SACpB,MAAM,CAAC,yBAAyB,EAAK,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;SACpF,MAAM,CAAC,qBAAqB,EAAS,6EAA6E,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACtI,MAAM,CAAC,uBAAuB,EAAO,6BAA6B,CAAC;SACnE,MAAM,CAAC,uBAAuB,EAAO,kHAAkH,EAAE,gBAAgB,CAAC;SAC1K,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAExB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IACzD,OAAO,CAAC,OAAO,EAAE;QACb,GAAI,MAAM,aAAa,CACnB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAChC;QACD,GAAI,KAAK,CAAE,CAAC,CAAE,EAAE,KAAK,EAAE,CAAG,CAAC,CAAE,EAAG;QAChC,GAAI,MAAM,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,CAAE,CAAC,CAAE,EAAG;KACnC,CAAC,CAAA;AACN,CAAC,CAAC,EAAE,CAAA","sourcesContent":["#!/usr/bin/env node\n\nimport path from 'upath'\nimport { program } from 'commander'\n\nimport { scanner } from './scanner/index.js'\nimport { try_load_dict } from './utils.js'\n\n;(async function main () {\n program.name('i18n-scan')\n .option('-r, --rootdir [rootdir]' , '根目录:默认为当前工作目录', path.normalize(process.cwd()))\n .option('-i, --input [input]' , '扫描 pattern:多个 pattern 用分号分割,采用 glob pattern 匹配,如 `src/**/*.{js,jsx,ts,tsx}`', v => v.split(';'))\n .option('-o, --output [output]' , 'i18n 目录:默认为 <rootdir>/i18n/')\n .option('-c, --config [config]' , '自定义配置文件,默认为 <rootdir>/i18n/config.js ,可参考默认配置 xshell/i18n/index.ts 以及 https://github.com/i18next/i18next-scanner', 'i18n/config.js')\n .parse(process.argv)\n \n const { rootdir, config, input, output } = program.opts()\n scanner(rootdir, {\n ... await try_load_dict(\n path.resolve(rootdir, config)\n ),\n ... input ? { input } : { },\n ... output ? { output } : { },\n })\n})()\n"]}