xshell 0.0.41 → 0.0.45
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/file.d.ts +5 -6
- package/file.js +38 -31
- package/file.js.map +1 -1
- package/i18n/dict.d.ts +0 -1
- package/i18n/dict.js +1 -1
- package/i18n/dict.js.map +1 -1
- package/i18n/i18n-scan.js +2 -2
- package/i18n/i18n-scan.js.map +1 -1
- package/i18n/index.d.ts +0 -1
- package/i18n/index.js +15 -5
- package/i18n/index.js.map +1 -1
- package/i18n/rwdict.d.ts +0 -1
- package/i18n/rwdict.js +0 -1
- package/i18n/rwdict.js.map +1 -1
- package/i18n/scanner/index.d.ts +1 -1
- package/i18n/scanner/index.js +5 -6
- package/i18n/scanner/index.js.map +1 -1
- package/net.browser.d.ts +9 -3
- package/net.browser.js +66 -19
- package/net.browser.js.map +1 -1
- package/net.d.ts +9 -4
- package/net.js +72 -32
- package/net.js.map +1 -1
- package/package.json +2 -3
- package/process.d.ts +1 -1
- package/process.js +3 -3
- package/process.js.map +1 -1
- package/repl.js +5 -11
- package/repl.js.map +1 -1
- package/server.js +5 -0
- package/server.js.map +1 -1
- package/toaster.browser.d.ts +0 -1
- package/toaster.browser.js +0 -1
- package/toaster.browser.js.map +1 -1
- package/tsconfig.json +1 -1
- package/ufs.js +1 -0
- package/ufs.js.map +1 -1
- package/utils.browser.d.ts +1 -1
- package/utils.d.ts +3 -1
- package/utils.js +17 -1
- package/utils.js.map +1 -1
package/file.d.ts
CHANGED
|
@@ -50,16 +50,18 @@ export declare function fappend(fp: string, data: any, { dir, print }?: {
|
|
|
50
50
|
- fpd: absolute path of directory
|
|
51
51
|
- optoins?:
|
|
52
52
|
- deep?: `false` recursively
|
|
53
|
-
- absolute?: `false`
|
|
53
|
+
- absolute?: `false` Return, print full path instead of relative path
|
|
54
54
|
- print?: `true`
|
|
55
|
-
- filter?: `true` RegExp | (fp: string) => any
|
|
55
|
+
- filter?: `true` RegExp | (fp: string) => any, Note that when deep = true,
|
|
56
|
+
directories and files in directories that are filtered out by the filter will not be included in the results
|
|
56
57
|
*/
|
|
57
|
-
export declare function flist(fpd: string,
|
|
58
|
+
export declare function flist(fpd: string, options?: {
|
|
58
59
|
filter?: RegExp | ((fp: string) => any);
|
|
59
60
|
deep?: boolean;
|
|
60
61
|
absolute?: boolean;
|
|
61
62
|
print?: boolean;
|
|
62
63
|
}): Promise<string[]>;
|
|
64
|
+
export declare function fstat(fp: string): Promise<fs.BigIntStats>;
|
|
63
65
|
/** delete file or directory (use rimraf to delete directory fast)
|
|
64
66
|
- fp: path
|
|
65
67
|
- options?:
|
|
@@ -114,9 +116,6 @@ export declare function flink(fp_real: string, fp_link: string, { junction, prin
|
|
|
114
116
|
junction?: boolean;
|
|
115
117
|
print?: boolean;
|
|
116
118
|
}): Promise<void>;
|
|
117
|
-
export declare function link_shortcut(target: string, name: string, { args }?: {
|
|
118
|
-
args?: string[];
|
|
119
|
-
}): void;
|
|
120
119
|
export declare let fwatchers: Record<string, fs.FSWatcher>;
|
|
121
120
|
/**
|
|
122
121
|
- fp: path of file or directory
|
package/file.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.f2utf8 = exports.freplace = exports.fwatch = exports.fwatchers = exports.
|
|
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.MFS = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const fs_1 = require("fs");
|
|
6
6
|
const upath_1 = tslib_1.__importDefault(require("upath"));
|
|
7
7
|
const iconv_lite_1 = tslib_1.__importDefault(require("iconv-lite"));
|
|
8
|
-
const readdir_enhanced_1 = require("readdir-enhanced");
|
|
9
8
|
const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
|
|
10
9
|
const rimraf_1 = tslib_1.__importDefault(require("rimraf"));
|
|
11
10
|
const debounce_js_1 = tslib_1.__importDefault(require("lodash/debounce.js"));
|
|
12
11
|
const memfs_1 = tslib_1.__importDefault(require("memfs"));
|
|
13
12
|
exports.MFS = memfs_1.default;
|
|
14
13
|
const prototype_js_1 = require("./prototype.js");
|
|
15
|
-
const utils_js_1 = require("./utils.js");
|
|
16
14
|
tslib_1.__exportStar(require("./ufs.js"), exports);
|
|
17
15
|
function create_mfs() {
|
|
18
16
|
let mfs = memfs_1.default.createFsFromVolume(new memfs_1.default.Volume());
|
|
@@ -81,34 +79,57 @@ exports.fappend = fappend;
|
|
|
81
79
|
- fpd: absolute path of directory
|
|
82
80
|
- optoins?:
|
|
83
81
|
- deep?: `false` recursively
|
|
84
|
-
- absolute?: `false`
|
|
82
|
+
- absolute?: `false` Return, print full path instead of relative path
|
|
85
83
|
- print?: `true`
|
|
86
|
-
- filter?: `true` RegExp | (fp: string) => any
|
|
84
|
+
- filter?: `true` RegExp | (fp: string) => any, Note that when deep = true,
|
|
85
|
+
directories and files in directories that are filtered out by the filter will not be included in the results
|
|
87
86
|
*/
|
|
88
|
-
async function flist(fpd,
|
|
87
|
+
async function flist(fpd, options = {}) {
|
|
88
|
+
const { filter, deep = false, absolute = false, print = true, } = options;
|
|
89
89
|
if (!upath_1.default.isAbsolute(fpd))
|
|
90
|
-
throw new Error(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
90
|
+
throw new Error(`fpd (${fpd}) must be absolute path`);
|
|
91
|
+
if (!fpd.endsWith('/'))
|
|
92
|
+
throw new Error(`Argument fpd (${fpd}) must end with /`);
|
|
93
|
+
// readdir withFileTypes 参数在底层有什么区别,速度上有什么差异
|
|
94
|
+
// 都调用了 uv_fs_scandir, 且调用参数相同,仅仅是 Node.js 侧的回调不同 AfterScanDir / AfterScanDirWithTypes
|
|
95
|
+
// 回调中通过 uv_fs_scandir_next 获取到每个条目的信息,而 uv_fs_scandir_next 中都会读取 type
|
|
96
|
+
// 速度上:都在 0.2 ms 左右就可以完成
|
|
97
|
+
const files = await fs_1.promises.readdir(fpd, {
|
|
98
|
+
withFileTypes: true,
|
|
99
|
+
encoding: 'utf-8',
|
|
95
100
|
});
|
|
96
|
-
let fps_ = [];
|
|
97
101
|
const filter_regexp = filter instanceof RegExp;
|
|
98
102
|
const filter_fn = Boolean(filter && !filter_regexp);
|
|
99
|
-
|
|
100
|
-
|
|
103
|
+
let fps = [];
|
|
104
|
+
for (const file of files) {
|
|
105
|
+
const fp = (absolute ? fpd : '') +
|
|
106
|
+
file.name +
|
|
107
|
+
(file.isDirectory() ? '/' : '');
|
|
101
108
|
if (filter_regexp && !filter.test(fp))
|
|
102
109
|
continue;
|
|
103
110
|
if (filter_fn && !filter(fp))
|
|
104
111
|
continue;
|
|
105
112
|
if (print)
|
|
106
113
|
console.log(fp);
|
|
107
|
-
|
|
114
|
+
fps.push(fp);
|
|
108
115
|
}
|
|
109
|
-
return
|
|
116
|
+
return deep ? (await Promise.all(fps.map(async (fp) => fp.endsWith('/') ?
|
|
117
|
+
[
|
|
118
|
+
fp,
|
|
119
|
+
...await flist(absolute ? fp : fpd + fp, options)
|
|
120
|
+
]
|
|
121
|
+
:
|
|
122
|
+
fp))).flat()
|
|
123
|
+
:
|
|
124
|
+
fps;
|
|
110
125
|
}
|
|
111
126
|
exports.flist = flist;
|
|
127
|
+
async function fstat(fp) {
|
|
128
|
+
if (!upath_1.default.isAbsolute(fp))
|
|
129
|
+
throw new Error(`fp (${fp}) must be absolute path`);
|
|
130
|
+
return fs_1.promises.stat(fp, { bigint: true });
|
|
131
|
+
}
|
|
132
|
+
exports.fstat = fstat;
|
|
112
133
|
/** delete file or directory (use rimraf to delete directory fast)
|
|
113
134
|
- fp: path
|
|
114
135
|
- options?:
|
|
@@ -195,7 +216,7 @@ exports.frename = frename;
|
|
|
195
216
|
async function fmkdir(fpd, options = {}) {
|
|
196
217
|
if (!upath_1.default.isAbsolute(fpd))
|
|
197
218
|
throw new Error('fpd must be absolute path');
|
|
198
|
-
options.print
|
|
219
|
+
options.print ??= true;
|
|
199
220
|
if (fpd.fexists)
|
|
200
221
|
if (fpd.is_dir) {
|
|
201
222
|
if (options.print && !options.suppress_existence)
|
|
@@ -233,20 +254,6 @@ async function flink(fp_real, fp_link, { junction = false, print = true } = {})
|
|
|
233
254
|
fs_1.promises.symlink(fp_real, fp_link, fp_real.is_dir ? 'dir' : 'file');
|
|
234
255
|
}
|
|
235
256
|
exports.flink = flink;
|
|
236
|
-
function link_shortcut(target, name, { args } = {}) {
|
|
237
|
-
const cmd = (0, utils_js_1.dedent) `
|
|
238
|
-
$wsh_shell = New-Object -comObject WScript.Shell
|
|
239
|
-
$shortcut = $wsh_shell.CreateShortcut("d:/links/#{name}.lnk")
|
|
240
|
-
$shortcut.TargetPath = '${target}'
|
|
241
|
-
$shortcut.Arguments = "${args || ''}"
|
|
242
|
-
$shortcut.WorkingDirectory = '${target.fdir}'
|
|
243
|
-
${target.is_dir ? '$shortcut.IconLocation = "%SystemRoot%\\System32\\SHELL32.dll,3"' : ''}
|
|
244
|
-
$shortcut.Save()
|
|
245
|
-
`;
|
|
246
|
-
console.log(cmd);
|
|
247
|
-
// await psh(cmd)
|
|
248
|
-
}
|
|
249
|
-
exports.link_shortcut = link_shortcut;
|
|
250
257
|
exports.fwatchers = {};
|
|
251
258
|
/**
|
|
252
259
|
- fp: path of file or directory
|
package/file.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.js","sourceRoot":"","sources":["file.ts"],"names":[],"mappings":";;;;AAAA,2BAA2C;AAG3C,0DAAwB;AACxB,oEAA8B;AAC9B,uDAA+C;AAC/C,gEAA0B;AAC1B,4DAA2B;AAE3B,6EAAyC;AAGzC,0DAAuB;AAad,cAbF,eAAG,CAaE;AALZ,iDAAwC;AACxC,yCAAmC;AACnC,mDAAwB;AAQxB,SAAgB,UAAU;IACtB,IAAI,GAAG,GAAG,eAAG,CAAC,kBAAkB,CAC5B,IAAI,eAAG,CAAC,MAAM,EAAE,CACnB,CAAA;IAED,GAAG,CAAC,IAAI,GAAG,eAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAI,CAAC,CAAA;IAC/B,GAAG,CAAC,MAAM,GAAG,IAAI,CAAA;IAEjB,OAAO,GAAG,CAAA;AACd,CAAC;AATD,gCASC;AAMM,KAAK,UAAU,KAAK,CAAE,EAAU,EAAE,EACrC,GAAG,EACH,QAAQ,GAAG,OAAO,EAClB,KAAK,GAAG,IAAI,KAIQ,EAAG;IAEvB,IAAI,GAAG;QACH,EAAE,GAAG,eAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;SACtB,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAE7E,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAE9B,MAAM,MAAM,GAAG,MAAM,aAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAErC,IAAI,QAAQ,KAAK,QAAQ;QACrB,OAAO,MAAM,CAAA;IAEjB,IAAI,QAAQ,KAAK,OAAO;QACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAElC,IAAI,QAAQ,KAAK,MAAM,EAAE;QACrB,MAAM,EAAE,MAAM,EAAE,GAAG,gEAAa,SAAS,GAAC,CAAA;QAC1C,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAQ,CAAA;QAChC,IAAI,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,2BAA2B,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;KAC5E;IAED,OAAO,oBAAK,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;AACzC,CAAC;AAjCD,sBAiCC;AAEM,KAAK,UAAU,WAAW,CAAE,EAAU,EAAE,UAA8F,EAAG;IAC5I,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;SAC5B,WAAW,EAAE,CAAA;AACtB,CAAC;AAHD,kCAGC;AAEM,KAAK,UAAU,UAAU,CAAY,EAAU,EAAE,UAAkE,EAAG;IACzH,OAAO,IAAI,CAAC,KAAK,CACb,MAAM,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAC3B,CAAA;AACL,CAAC;AAJD,gCAIC;AAKM,KAAK,UAAU,MAAM,CAAE,EAAU,EAAE,IAAS,EAAE,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,EAAE,KAAK,GAAG,IAAI,KAA6D,EAAG;IACxJ,IAAI,GAAG;QACH,EAAE,GAAG,eAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;SACtB,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IAE3E,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAE7B,IAAI,QAAQ,KAAK,SAAS;QACtB,IAAI,GAAG,oBAAK,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAEvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAClD,IAAI,GAAG,IAAA,sBAAO,EAAC,IAAI,CAAC,CAAA;IAExB,MAAM,aAAG,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;AACjC,CAAC;AAhBD,wBAgBC;AAEM,KAAK,UAAU,OAAO,CAAE,EAAU,EAAE,IAAS,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,KAAwC,EAAG;IAChH,IAAI,GAAG;QACH,EAAE,GAAG,eAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;SACtB,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IAE3E,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAE9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAClD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAEnD,MAAM,aAAG,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;AAClC,CAAC;AAbD,0BAaC;AAGD;;;;;;;EAOE;AACK,KAAK,UAAU,KAAK,CAAE,GAAW,EAAE,EACtC,MAAM,EACN,IAAI,GAAG,KAAK,EACZ,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,IAAI,KAMZ,EAAG;IACH,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAEhD,IAAI,GAAG,GAAG,MAAM,IAAA,+BAAY,EAAC,GAAG,EAAE;QAC9B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAG,CAAC;QACvC,IAAI;QACJ,KAAK,EAAE,KAAK;KACf,CAAC,CAAA;IAEF,IAAI,IAAI,GAAa,EAAG,CAAA;IAExB,MAAM,aAAa,GAAG,MAAM,YAAY,MAAM,CAAA;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,CAAA;IAEnD,KAAK,IAAI,EAAE,IAAI,GAAG,EAAE;QAChB,EAAE,GAAG,eAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QAEvB,IAAI,aAAa,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,SAAQ;QAEZ,IAAI,SAAS,IAAI,CAAE,MAAmB,CAAC,EAAE,CAAC;YACtC,SAAQ;QAEZ,IAAI,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAEnB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;KAChB;IAED,OAAO,IAAI,CAAA;AACf,CAAC;AAzCD,sBAyCC;AAGD;;;;EAIE;AACK,KAAK,UAAU,OAAO,CAAE,EAAU,EAAE,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,KAA0C,EAAG;IAChH,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;IACrD,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAEhD,IAAI,EAAE,CAAC,MAAM,EAAE;QACX,IAAI,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;QAC9C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,IAAA,gBAAM,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE;gBACnD,IAAI,KAAK;oBACL,MAAM,CAAC,KAAK,CAAC,CAAA;;oBAEb,OAAO,EAAE,CAAA;YACjB,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;KACL;SAAM;QACH,IAAI,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAC9B,MAAM,aAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;KACvB;AACL,CAAC;AArBD,0BAqBC;AAGD;;;;;EAKE;AACK,KAAK,UAAU,KAAK,CAAE,GAAW,EAAE,GAAW,EAAE,EACnD,KAAK,GAAG,IAAI,EACZ,SAAS,GAAG,IAAI,MAIhB,EAAG;IACH,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IAE3E,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAExD,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC,CAAA;IAExC,MAAM,kBAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;AAC/D,CAAC;AAjBD,sBAiBC;AAGD;;;;;EAKE;AACK,KAAK,UAAU,KAAK,CAAE,GAAW,EAAE,GAAW,EAAE,EACnD,SAAS,GAAG,KAAK,EACjB,KAAK,GAAG,IAAI,KAIZ,EAAG;IACH,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IAE3E,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAExD,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC,CAAA;IAExC,MAAM,kBAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;AAC3C,CAAC;AAjBD,sBAiBC;AAGD;;;;;;;GAOG;AACI,KAAK,UAAU,OAAO,CACzB,EAAU,EACV,GAAW,EACX,EACI,GAAG,EACH,KAAK,GAAG,IAAI,EACZ,SAAS,GAAG,IAAI,KAKhB,EAAG;IAEP,IAAI,GAAG,EAAE;QACL,EAAE,GAAG,eAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QACvB,GAAG,GAAG,eAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;KAC5B;SAAM,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IAEvD,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAExC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO;QACzB,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;IAEjD,MAAM,aAAG,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;AAC7B,CAAC;AA1BD,0BA0BC;AAGM,KAAK,UAAU,MAAM,CAAE,GAAW,EAAE,UAAuF,EAAG;IACjI,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAEhD,OAAO,CAAC,KAAK,KAAb,OAAO,CAAC,KAAK,GAAK,IAAI,EAAA;IAEtB,IAAI,GAAG,CAAC,OAAO;QACX,IAAI,GAAG,CAAC,MAAM,EAAE;YACZ,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,kBAAkB;gBAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAA;YACjD,OAAM;SACT;;YAAM,MAAM,IAAI,KAAK,CAAC,gEAAgE,GAAG,EAAE,CAAC,CAAA;SAC5F,IAAI,OAAO,CAAC,KAAK;QAClB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAE9B,MAAM,aAAG,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAC7C,CAAC;AAhBD,wBAgBC;AAGD;;;EAGE;AACK,KAAK,UAAU,KAAK,CACvB,OAAe,EACf,OAAe,EACf,EACI,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,IAAI,KAIhB,EAAG;IACH,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAEhD,IAAI,OAAO,CAAC,OAAO;QACf,IAAI,OAAO,CAAC,MAAM;YACd,OAAO,GAAG,eAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;aAC1C,IAAK,CAAC,MAAM,aAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,EAAG;YACpD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAA;YAC5C,OAAM;SACT;;YACG,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;IAGrF,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,cAAc,OAAO,EAAE,CAAC,CAAA;IAE9D,IAAI,QAAQ;QACR,aAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;;QAEzC,aAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AACtE,CAAC;AA9BD,sBA8BC;AAGD,SAAgB,aAAa,CAAE,MAAc,EAAE,IAAY,EAAE,EAAE,IAAI,KAA0B,EAAG;IAC5F,MAAM,GAAG,GAAG,IAAA,iBAAM,EAAA;;;wCAGkB,MAAM;wCACN,IAAI,IAAI,EAAE;wCACV,MAAM,CAAC,IAAI;UACxC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,kEAAkE,CAAC,CAAC,CAAC,EAAG;;KAE9F,CAAA;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAChB,iBAAiB;AACrB,CAAC;AAZD,sCAYC;AAGU,QAAA,SAAS,GAAiC,EAAG,CAAA;AAExD;;;;;;;;;;;;;;EAcE;AACK,KAAK,UAAU,MAAM,CACxB,EAAU,EACV,QAA+C,EAC/C,EAAE,IAAI,GAAG,IAAI,KAAyB,EAAG;IAEzC,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAE/C,MAAM,QAAQ,GAAG,iBAAS,CAAC,EAAE,CAAC,CAAA;IAC9B,IAAI,QAAQ;QACR,QAAQ,CAAC,KAAK,EAAE,CAAA;IAEpB,IAAI,IAAI;QACJ,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;IAEtC,MAAM,kBAAkB,GAAG,IAAA,qBAAQ,EAC/B,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACb,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,KAAK,EAAE,CAAC,CAAA;QAChD,QAAQ,CAAC,KAAK,EAAE,eAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1C,CAAC,EACD,GAAG,EACH,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CACrC,CAAA;IAED,IAAI,OAAO,GAAG,IAAA,UAAK,EAAC,EAAE,EAAE,kBAAkB,CAAC,CAAA;IAC3C,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IACF,OAAO,iBAAS,CAAC,EAAE,CAAC,GAAG,OAAO,CAAA;AAClC,CAAC;AA7BD,wBA6BC;AAGD,8CAA8C;AACvC,KAAK,UAAU,QAAQ,CAAE,EAAU,EAAE,OAAwB,EAAE,WAAmB;IACrF,MAAM,MAAM,CACR,EAAE,EACF,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;SACZ,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CACxC,CAAA;AACL,CAAC;AAND,4BAMC;AAED;;;;;EAKE;AACK,KAAK,UAAU,MAAM,CAAE,EAAU,EAAE,EACtC,MAAM,GAAG,IAAI,EACb,QAAQ,GAAG,MAAM,MAIjB,EAAG;IACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC1C,IAAI,MAAM,EAAE;QACR,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;QACjC,OAAM;KACT;IAED,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,UAAU,CAAC,EAAE,CAAA;IAC9E,IAAI,CAAC,MAAM,CAAC,OAAO;QACf,MAAM,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAE3B,MAAM,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;AAC1B,CAAC;AAlBD,wBAkBC","sourcesContent":["import { promises as fsp, watch } from 'fs'\nimport type fs from 'fs'\n\nimport path from 'upath'\nimport iconv from 'iconv-lite'\nimport { readdirAsync } from 'readdir-enhanced'\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'\nimport { dedent } from './utils.js'\nexport * from './ufs.js'\n\n\nexport { MFS }\n\nexport type Encoding = 'utf-8' | 'gb18030' | 'shift-jis' | 'binary'\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, data: Buffer, options?: { dir?: string, print?: boolean }): Promise<void>\nexport async function fwrite (fp: string, data: any, options?: { dir?: string, encoding?: Encoding, print?: boolean }): Promise<void>\nexport async function fwrite (fp: string, data: any, { dir, encoding = 'utf-8', print = true }: { dir?: string, encoding?: Encoding, 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('write:', fp)\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 await fsp.writeFile(fp, data)\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 absolute path\n - print?: `true`\n - filter?: `true` RegExp | (fp: string) => any\n*/\nexport async function flist (fpd: string, {\n filter, \n deep = false, \n absolute = false,\n print = true\n}: {\n filter?: RegExp | ((fp: string) => any)\n deep?: boolean\n absolute?: boolean\n print?: boolean\n} = { }) {\n if (!path.isAbsolute(fpd))\n throw new Error('fpd must be absolute path')\n \n let fps = await readdirAsync(fpd, {\n ...(absolute ? { basePath: fpd } : { }),\n deep,\n stats: false,\n })\n \n let fps_: string[] = [ ]\n \n const filter_regexp = filter instanceof RegExp\n const filter_fn = Boolean(filter && !filter_regexp)\n \n for (let fp of fps) {\n fp = path.normalize(fp)\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(fp)\n \n fps_.push(fp)\n }\n \n return fps_\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.is_dir) {\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 (src: string, dst: string, {\n print = true,\n overwrite = true,\n}: {\n print?: boolean\n overwrite?: 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(`copy: ${src} → ${dst}`)\n \n await fse.copy(src, 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 && fp_.fexists)\n throw new Error(`file already exists:${fp_}`)\n \n await fsp.rename(fp, fp_)\n}\n\n\nexport async function fmkdir (fpd: string, options: fs.MakeDirectoryOptions & { print?: boolean, suppress_existence?: boolean } = { }) {\n if (!path.isAbsolute(fpd))\n throw new Error('fpd must be absolute path')\n \n options.print ??= true\n \n if (fpd.fexists)\n if (fpd.is_dir) {\n if (options.print && !options.suppress_existence)\n console.log('directory already exists:', fpd)\n return\n } else throw new Error(`file with same name already exists, cannot create directory: ${fpd}`)\n else if (options.print)\n console.log('mkdir:', fpd)\n \n await fsp.mkdir(fpd, { recursive: true })\n}\n\n\n/** \n - fp_real: current real file path\n - fp_link: file path or 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('fpd must be absolute path')\n \n if (fp_link.fexists)\n if (fp_link.is_dir)\n fp_link = path.join(fp_link, fp_real.fname)\n else if ( (await fsp.lstat(fp_link)).isSymbolicLink() ) {\n console.log('link already exists:', fp_link)\n return\n } else\n throw new Error('file with same name already exists, cannot create new link')\n \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, fp_real.is_dir ? 'dir' : 'file')\n}\n\n\nexport function link_shortcut (target: string, name: string, { args }: { args?: string[] } = { }) {\n const cmd = dedent`\n $wsh_shell = New-Object -comObject WScript.Shell\n $shortcut = $wsh_shell.CreateShortcut(\"d:/links/#{name}.lnk\")\n $shortcut.TargetPath = '${target}'\n $shortcut.Arguments = \"${args || ''}\"\n $shortcut.WorkingDirectory = '${target.fdir}'\n ${ target.is_dir ? '$shortcut.IconLocation = \"%SystemRoot%\\\\System32\\\\SHELL32.dll,3\"' : '' }\n $shortcut.Save()\n `\n console.log(cmd)\n // await psh(cmd)\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 debounced_onchange = debounce(\n (event, fname) => {\n console.log(`file changed (${event}): ${fname}`)\n onchange(event, path.normalize(fname))\n },\n 500,\n { leading: false, trailing: true }\n )\n \n let watcher = 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 (!fp_bak.fexists)\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":";;;;AAAA,2BAGW;AAGX,0DAAwB;AACxB,oEAA8B;AAC9B,gEAA0B;AAC1B,4DAA2B;AAE3B,6EAAyC;AAGzC,0DAAuB;AAYd,cAZF,eAAG,CAYE;AAJZ,iDAAwC;AACxC,mDAAwB;AAQxB,SAAgB,UAAU;IACtB,IAAI,GAAG,GAAG,eAAG,CAAC,kBAAkB,CAC5B,IAAI,eAAG,CAAC,MAAM,EAAE,CACnB,CAAA;IAED,GAAG,CAAC,IAAI,GAAG,eAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAI,CAAC,CAAA;IAC/B,GAAG,CAAC,MAAM,GAAG,IAAI,CAAA;IAEjB,OAAO,GAAG,CAAA;AACd,CAAC;AATD,gCASC;AAMM,KAAK,UAAU,KAAK,CAAE,EAAU,EAAE,EACrC,GAAG,EACH,QAAQ,GAAG,OAAO,EAClB,KAAK,GAAG,IAAI,KAIQ,EAAG;IAEvB,IAAI,GAAG;QACH,EAAE,GAAG,eAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;SACtB,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAE7E,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAE9B,MAAM,MAAM,GAAG,MAAM,aAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAErC,IAAI,QAAQ,KAAK,QAAQ;QACrB,OAAO,MAAM,CAAA;IAEjB,IAAI,QAAQ,KAAK,OAAO;QACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAElC,IAAI,QAAQ,KAAK,MAAM,EAAE;QACrB,MAAM,EAAE,MAAM,EAAE,GAAG,gEAAa,SAAS,GAAC,CAAA;QAC1C,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAQ,CAAA;QAChC,IAAI,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,2BAA2B,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;KAC5E;IAED,OAAO,oBAAK,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;AACzC,CAAC;AAjCD,sBAiCC;AAEM,KAAK,UAAU,WAAW,CAAE,EAAU,EAAE,UAA8F,EAAG;IAC5I,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;SAC5B,WAAW,EAAE,CAAA;AACtB,CAAC;AAHD,kCAGC;AAEM,KAAK,UAAU,UAAU,CAAY,EAAU,EAAE,UAAkE,EAAG;IACzH,OAAO,IAAI,CAAC,KAAK,CACb,MAAM,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAC3B,CAAA;AACL,CAAC;AAJD,gCAIC;AAKM,KAAK,UAAU,MAAM,CAAE,EAAU,EAAE,IAAS,EAAE,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,EAAE,KAAK,GAAG,IAAI,KAA6D,EAAG;IACxJ,IAAI,GAAG;QACH,EAAE,GAAG,eAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;SACtB,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IAE3E,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAE7B,IAAI,QAAQ,KAAK,SAAS;QACtB,IAAI,GAAG,oBAAK,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAEvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAClD,IAAI,GAAG,IAAA,sBAAO,EAAC,IAAI,CAAC,CAAA;IAExB,MAAM,aAAG,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;AACjC,CAAC;AAhBD,wBAgBC;AAEM,KAAK,UAAU,OAAO,CAAE,EAAU,EAAE,IAAS,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,KAAwC,EAAG;IAChH,IAAI,GAAG;QACH,EAAE,GAAG,eAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;SACtB,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IAE3E,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAE9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAClD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAEnD,MAAM,aAAG,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;AAClC,CAAC;AAbD,0BAaC;AAGD;;;;;;;;EAQE;AACK,KAAK,UAAU,KAAK,CACvB,GAAW,EACX,UAKI,EAAG;IAEP,MAAM,EACF,MAAM,EACN,IAAI,GAAG,KAAK,EACZ,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,IAAI,GACf,GAAG,OAAO,CAAA;IAEX,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,yBAAyB,CAAC,CAAA;IAEzD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,mBAAmB,CAAC,CAAA;IAE5D,4CAA4C;IAC5C,sFAAsF;IACtF,sEAAsE;IACtE,wBAAwB;IAExB,MAAM,KAAK,GAAG,MAAM,aAAG,CAAC,OAAO,CAAC,GAAG,EAAE;QACjC,aAAa,EAAE,IAAI;QACnB,QAAQ,EAAE,OAAO;KACpB,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,MAAM,YAAY,MAAM,CAAA;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,CAAA;IAEnD,IAAI,GAAG,GAAa,EAAG,CAAA;IAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACtB,MAAM,EAAE,GACJ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI;YACT,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAEnC,IAAI,aAAa,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,SAAQ;QAEZ,IAAI,SAAS,IAAI,CAAE,MAAmB,CAAC,EAAE,CAAC;YACtC,SAAQ;QAEZ,IAAI,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAEnB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;KACf;IAED,OAAO,IAAI,CAAC,CAAC,CAAC,CACF,MAAM,OAAO,CAAC,GAAG,CACb,GAAG,CAAC,GAAG,CAAC,KAAK,EAAC,EAAE,EAAC,EAAE,CACf,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACd;YACI,EAAE;YACF,GAAI,MAAM,KAAK,CACX,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,EACxB,OAAO,CACV;SACJ;QACL,CAAC;YACG,EAAE,CAAC,CACd,CACJ,CAAC,IAAI,EAAE;QACZ,CAAC;YACG,GAAG,CAAA;AACf,CAAC;AAxED,sBAwEC;AAGM,KAAK,UAAU,KAAK,CAAE,EAAU;IACnC,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAA;IAEvD,OAAO,aAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;AACzC,CAAC;AALD,sBAKC;AAGD;;;;EAIE;AACK,KAAK,UAAU,OAAO,CAAE,EAAU,EAAE,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,KAA0C,EAAG;IAChH,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;IACrD,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAEhD,IAAI,EAAE,CAAC,MAAM,EAAE;QACX,IAAI,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;QAC9C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,IAAA,gBAAM,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE;gBACnD,IAAI,KAAK;oBACL,MAAM,CAAC,KAAK,CAAC,CAAA;;oBAEb,OAAO,EAAE,CAAA;YACjB,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;KACL;SAAM;QACH,IAAI,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAC9B,MAAM,aAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;KACvB;AACL,CAAC;AArBD,0BAqBC;AAGD;;;;;EAKE;AACK,KAAK,UAAU,KAAK,CAAE,GAAW,EAAE,GAAW,EAAE,EACnD,KAAK,GAAG,IAAI,EACZ,SAAS,GAAG,IAAI,MAIhB,EAAG;IACH,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IAE3E,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAExD,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC,CAAA;IAExC,MAAM,kBAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;AAC/D,CAAC;AAjBD,sBAiBC;AAGD;;;;;EAKE;AACK,KAAK,UAAU,KAAK,CAAE,GAAW,EAAE,GAAW,EAAE,EACnD,SAAS,GAAG,KAAK,EACjB,KAAK,GAAG,IAAI,KAIZ,EAAG;IACH,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IAE3E,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAExD,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC,CAAA;IAExC,MAAM,kBAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;AAC3C,CAAC;AAjBD,sBAiBC;AAGD;;;;;;;GAOG;AACI,KAAK,UAAU,OAAO,CACzB,EAAU,EACV,GAAW,EACX,EACI,GAAG,EACH,KAAK,GAAG,IAAI,EACZ,SAAS,GAAG,IAAI,KAKhB,EAAG;IAEP,IAAI,GAAG,EAAE;QACL,EAAE,GAAG,eAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QACvB,GAAG,GAAG,eAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;KAC5B;SAAM,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IAEvD,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAExC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO;QACzB,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;IAEjD,MAAM,aAAG,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;AAC7B,CAAC;AA1BD,0BA0BC;AAGM,KAAK,UAAU,MAAM,CAAE,GAAW,EAAE,UAAuF,EAAG;IACjI,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAEhD,OAAO,CAAC,KAAK,KAAK,IAAI,CAAA;IAEtB,IAAI,GAAG,CAAC,OAAO;QACX,IAAI,GAAG,CAAC,MAAM,EAAE;YACZ,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,kBAAkB;gBAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAA;YACjD,OAAM;SACT;;YAAM,MAAM,IAAI,KAAK,CAAC,gEAAgE,GAAG,EAAE,CAAC,CAAA;SAC5F,IAAI,OAAO,CAAC,KAAK;QAClB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAE9B,MAAM,aAAG,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAC7C,CAAC;AAhBD,wBAgBC;AAGD;;;EAGE;AACK,KAAK,UAAU,KAAK,CACvB,OAAe,EACf,OAAe,EACf,EACI,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,IAAI,KAIhB,EAAG;IACH,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAEhD,IAAI,OAAO,CAAC,OAAO;QACf,IAAI,OAAO,CAAC,MAAM;YACd,OAAO,GAAG,eAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;aAC1C,IAAK,CAAC,MAAM,aAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,EAAG;YACpD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAA;YAC5C,OAAM;SACT;;YACG,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;IAGrF,IAAI,KAAK;QACL,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,cAAc,OAAO,EAAE,CAAC,CAAA;IAE9D,IAAI,QAAQ;QACR,aAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;;QAEzC,aAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AACtE,CAAC;AA9BD,sBA8BC;AAGU,QAAA,SAAS,GAAiC,EAAG,CAAA;AAExD;;;;;;;;;;;;;;EAcE;AACK,KAAK,UAAU,MAAM,CACxB,EAAU,EACV,QAA+C,EAC/C,EAAE,IAAI,GAAG,IAAI,KAAyB,EAAG;IAEzC,IAAI,CAAC,eAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAE/C,MAAM,QAAQ,GAAG,iBAAS,CAAC,EAAE,CAAC,CAAA;IAC9B,IAAI,QAAQ;QACR,QAAQ,CAAC,KAAK,EAAE,CAAA;IAEpB,IAAI,IAAI;QACJ,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;IAEtC,MAAM,kBAAkB,GAAG,IAAA,qBAAQ,EAC/B,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACb,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,KAAK,EAAE,CAAC,CAAA;QAChD,QAAQ,CAAC,KAAK,EAAE,eAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1C,CAAC,EACD,GAAG,EACH,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CACrC,CAAA;IAED,IAAI,OAAO,GAAG,IAAA,UAAK,EAAC,EAAE,EAAE,kBAAkB,CAAC,CAAA;IAC3C,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IACF,OAAO,iBAAS,CAAC,EAAE,CAAC,GAAG,OAAO,CAAA;AAClC,CAAC;AA7BD,wBA6BC;AAGD,8CAA8C;AACvC,KAAK,UAAU,QAAQ,CAAE,EAAU,EAAE,OAAwB,EAAE,WAAmB;IACrF,MAAM,MAAM,CACR,EAAE,EACF,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;SACZ,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CACxC,CAAA;AACL,CAAC;AAND,4BAMC;AAED;;;;;EAKE;AACK,KAAK,UAAU,MAAM,CAAE,EAAU,EAAE,EACtC,MAAM,GAAG,IAAI,EACb,QAAQ,GAAG,MAAM,MAIjB,EAAG;IACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC1C,IAAI,MAAM,EAAE;QACR,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;QACjC,OAAM;KACT;IAED,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,UAAU,CAAC,EAAE,CAAA;IAC9E,IAAI,CAAC,MAAM,CAAC,OAAO;QACf,MAAM,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAE3B,MAAM,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;AAC1B,CAAC;AAlBD,wBAkBC","sourcesContent":["import {\n promises as fsp,\n watch,\n} from 'fs'\nimport type fs from 'fs'\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\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, data: Buffer, options?: { dir?: string, print?: boolean }): Promise<void>\nexport async function fwrite (fp: string, data: any, options?: { dir?: string, encoding?: Encoding, print?: boolean }): Promise<void>\nexport async function fwrite (fp: string, data: any, { dir, encoding = 'utf-8', print = true }: { dir?: string, encoding?: Encoding, 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('write:', fp)\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 await fsp.writeFile(fp, data)\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(fp)\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 )\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.is_dir) {\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 (src: string, dst: string, {\n print = true,\n overwrite = true,\n}: {\n print?: boolean\n overwrite?: 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(`copy: ${src} → ${dst}`)\n \n await fse.copy(src, 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 && fp_.fexists)\n throw new Error(`file already exists:${fp_}`)\n \n await fsp.rename(fp, fp_)\n}\n\n\nexport async function fmkdir (fpd: string, options: fs.MakeDirectoryOptions & { print?: boolean, suppress_existence?: boolean } = { }) {\n if (!path.isAbsolute(fpd))\n throw new Error('fpd must be absolute path')\n \n options.print ??= true\n \n if (fpd.fexists)\n if (fpd.is_dir) {\n if (options.print && !options.suppress_existence)\n console.log('directory already exists:', fpd)\n return\n } else throw new Error(`file with same name already exists, cannot create directory: ${fpd}`)\n else if (options.print)\n console.log('mkdir:', fpd)\n \n await fsp.mkdir(fpd, { recursive: true })\n}\n\n\n/** \n - fp_real: current real file path\n - fp_link: file path or 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('fpd must be absolute path')\n \n if (fp_link.fexists)\n if (fp_link.is_dir)\n fp_link = path.join(fp_link, fp_real.fname)\n else if ( (await fsp.lstat(fp_link)).isSymbolicLink() ) {\n console.log('link already exists:', fp_link)\n return\n } else\n throw new Error('file with same name already exists, cannot create new link')\n \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, fp_real.is_dir ? '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 debounced_onchange = debounce(\n (event, fname) => {\n console.log(`file changed (${event}): ${fname}`)\n onchange(event, path.normalize(fname))\n },\n 500,\n { leading: false, trailing: true }\n )\n \n let watcher = 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 (!fp_bak.fexists)\n await fcopy(fp, fp_bak)\n \n await fwrite(fp, text)\n}\n\n"]}
|
package/i18n/dict.d.ts
CHANGED
package/i18n/dict.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Dict = void 0;
|
|
4
4
|
class Dict {
|
|
5
|
+
_dict;
|
|
5
6
|
constructor(_dict = {}) {
|
|
6
7
|
this._dict = _dict;
|
|
7
8
|
}
|
|
@@ -33,5 +34,4 @@ class Dict {
|
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
36
|
exports.Dict = Dict;
|
|
36
|
-
exports.default = Dict;
|
|
37
37
|
//# 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;
|
|
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"]}
|
package/i18n/i18n-scan.js
CHANGED
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const upath_1 = tslib_1.__importDefault(require("upath"));
|
|
6
6
|
const commander_1 = require("commander");
|
|
7
|
-
const index_js_1 =
|
|
7
|
+
const index_js_1 = require("./scanner/index.js");
|
|
8
8
|
const utils_js_1 = require("./utils.js");
|
|
9
9
|
(async function main() {
|
|
10
10
|
commander_1.program.name('i18n-scan')
|
|
@@ -14,7 +14,7 @@ const utils_js_1 = require("./utils.js");
|
|
|
14
14
|
.option('-c, --config [config]', '自定义配置文件,默认为 <rootdir>/i18n/config.js ,可参考默认配置 xshell/i18n/index.ts 以及 https://github.com/i18next/i18next-scanner', 'i18n/config.js')
|
|
15
15
|
.parse(process.argv);
|
|
16
16
|
const { rootdir, config, input, output } = commander_1.program.opts();
|
|
17
|
-
(0, index_js_1.
|
|
17
|
+
(0, index_js_1.scanner)(rootdir, {
|
|
18
18
|
...await (0, utils_js_1.try_load_dict)(upath_1.default.resolve(rootdir, config)),
|
|
19
19
|
...input ? { input } : {},
|
|
20
20
|
...output ? { output } : {},
|
package/i18n/i18n-scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n-scan.js","sourceRoot":"","sources":["i18n-scan.ts"],"names":[],"mappings":";;;;AAEA,0DAAwB;AACxB,yCAAmC;AAEnC,
|
|
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"]}
|
package/i18n/index.d.ts
CHANGED
package/i18n/index.js
CHANGED
|
@@ -12,6 +12,20 @@ exports.LANGUAGES = ['zh', 'en', 'ja', 'ko'];
|
|
|
12
12
|
@see https://github.com/ShenHongFei/xshell/tree/master/i18n
|
|
13
13
|
*/
|
|
14
14
|
class I18N {
|
|
15
|
+
static LANGUAGE_REGEXP = /^(zh|en|ja|jp|ko)$/;
|
|
16
|
+
/** (ISO 639-1 标准语言代码) 可能取 zh, en, ja, ko */
|
|
17
|
+
language;
|
|
18
|
+
/** hostname shortcuts */
|
|
19
|
+
hosts;
|
|
20
|
+
/** url prefix shortcuts */
|
|
21
|
+
roots;
|
|
22
|
+
/** 标记静态文本,以便扫描词条,并在运行时根据当前语言获取翻译 */
|
|
23
|
+
t;
|
|
24
|
+
/** render: 翻译配置字段 */
|
|
25
|
+
r;
|
|
26
|
+
i18next;
|
|
27
|
+
/** react-i18next <Trans/> 组件 */
|
|
28
|
+
Trans = ({ children }) => children;
|
|
15
29
|
/** ```ts
|
|
16
30
|
import dict from './dict.json' // { "添加": { "en": "Add", "ja": "追加", "ko": "추가" } }
|
|
17
31
|
|
|
@@ -22,8 +36,6 @@ class I18N {
|
|
|
22
36
|
@see https://github.com/ShenHongFei/xshell/tree/master/i18n
|
|
23
37
|
*/
|
|
24
38
|
constructor(_dict, language) {
|
|
25
|
-
/** react-i18next <Trans/> 组件 */
|
|
26
|
-
this.Trans = ({ children }) => children;
|
|
27
39
|
const is_browser = typeof document !== 'undefined' && typeof window !== 'undefined';
|
|
28
40
|
const dict = new dict_js_1.Dict(_dict);
|
|
29
41
|
// --- if in bowser then detect language & intl
|
|
@@ -40,7 +52,7 @@ class I18N {
|
|
|
40
52
|
language = 'en';
|
|
41
53
|
// console.log(`language = ${language}`)
|
|
42
54
|
}
|
|
43
|
-
language
|
|
55
|
+
language ||= 'en';
|
|
44
56
|
this.language = language;
|
|
45
57
|
this.t = (text, options) => {
|
|
46
58
|
options = options || {};
|
|
@@ -113,6 +125,4 @@ class I18N {
|
|
|
113
125
|
}
|
|
114
126
|
}
|
|
115
127
|
exports.I18N = I18N;
|
|
116
|
-
I18N.LANGUAGE_REGEXP = /^(zh|en|ja|jp|ko)$/;
|
|
117
|
-
exports.default = I18N;
|
|
118
128
|
//# sourceMappingURL=index.js.map
|
package/i18n/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;AAAA,oDAAmB;AACnB,kEAA+B;AAC/B,8DAGgB;AAGhB,uCAIkB;AAKL,QAAA,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAA;AAS1D;;;EAGE;AACF,MAAa,IAAI;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import qs from 'qs'\nimport Cookies from 'js-cookie'\nimport {\n default as i18next,\n type i18n as I18Next\n} from 'i18next'\nimport type { Trans } from 'react-i18next'\n\nimport {\n Dict,\n type _Dict,\n type Item,\n} from './dict.js'\n\n\nexport type Language = 'zh' | 'en' | 'ja' | 'ko'\n\nexport const LANGUAGES = ['zh', 'en', 'ja', 'ko'] as const\n\ndeclare global {\n interface Window {\n language: Language\n }\n}\n\n\n/**\n 提供翻译文本功能,在浏览器环境下自动解析当前语言、国际/国内用户\n @see https://github.com/ShenHongFei/xshell/tree/master/i18n\n*/\nexport class I18N {\n static LANGUAGE_REGEXP = /^(zh|en|ja|jp|ko)$/\n \n \n /** (ISO 639-1 标准语言代码) 可能取 zh, en, ja, ko */\n language: Language\n \n /** hostname shortcuts */\n hosts: Hosts\n \n /** url prefix shortcuts */\n roots: Roots\n \n /** 标记静态文本,以便扫描词条,并在运行时根据当前语言获取翻译 */\n t : (text: string, options?: { language?: Language, context?: string, count?: number, [key: string]: any }) => string\n \n /** render: 翻译配置字段 */\n r : (field: Item | undefined | null, language?: Language) => string\n \n i18next: I18Next\n \n /** react-i18next <Trans/> 组件 */\n Trans: typeof Trans = ({ children }) => children as any\n \n \n /** ```ts\n import dict from './dict.json' // { \"添加\": { \"en\": \"Add\", \"ja\": \"追加\", \"ko\": \"추가\" } }\n \n const i18n = new I18N(dict, 'zh') // 创建实例,传入词典 dict 并指定语言(NodeJS 环境),\n const i18n = new I18N(dict) // 创建实例,传入词典 dict 并自动判断当前语言(浏览器环境),\n const i18n = new I18N({ }) // 创建实例,传入空词典\n ```\n @see https://github.com/ShenHongFei/xshell/tree/master/i18n\n */\n constructor (_dict: _Dict, language?: Language) {\n const is_browser = typeof document !== 'undefined' && typeof window !== 'undefined'\n \n const dict = new Dict(_dict)\n \n // --- if in bowser then detect language & intl\n if (is_browser) {\n const { search = '' } = document.location || { }\n const queries = qs.parse(search, { ignoreQueryPrefix: true })\n \n if (!language) {\n const lquery = queries.language as string // 暂时不考虑是数组的情况\n const lwindow = window.language\n const lbrowser = typeof navigator !== 'undefined' && navigator.language.slice(0, 2)\n \n language = (lquery || lwindow || Cookies.get('language') || lbrowser || 'en') as Language\n }\n \n if (!I18N.LANGUAGE_REGEXP.test(language))\n language = 'en'\n \n // console.log(`language = ${language}`)\n }\n \n language ||= 'en'\n \n this.language = language\n \n this.t = (text, options) => {\n options = options || { }\n \n const language = options.language || this.language\n \n return this.i18next.t(text, { ...options, lng: language, defaultValue: text })\n }\n \n this.r = (field, language = this.language) => \n field ?\n field[language] || field.en || field.zh || field as any || ''\n :\n field || ''\n \n // --- init i18next\n this.i18next = i18next.createInstance()\n \n if (is_browser)\n try {\n // 在无 React 的浏览器环境下避免 react-i18next 中执行 React.createContext() 报错\n // const React = require('react') as typeof import('react')\n const { initReactI18next, Trans: I18NextTrans } = require('react-i18next') as typeof import('react-i18next')\n this.i18next.use(initReactI18next)\n const _i18next = this.i18next\n // 绑定 Trans 组件的 i18n 到 this.i18next, 解决多个 i18next 冲突的问题\n // react-i18next/context.js 中 i18n 实例只在模块级别维护,多次 this.i18next.use(initReactI18next) 会覆盖前面的 i18n,导致 Trans 无法翻译\n // https://github.com/i18next/react-i18next/issues/726\n this.Trans = function Trans ({ i18n = _i18next, ...others }) {\n // 简单转发,性能更好\n return I18NextTrans({ i18n, ...others })\n // return React.createElement(I18NextTrans, { i18n, ...others } as any, children)\n // return <I18NextTrans {...{ i18n, ...others } }>{children}</I18NextTrans>\n }\n } catch { }\n \n this.i18next.init({\n lng: this.language,\n // LOCAL\n // debug: true,\n debug: false,\n fallbackLng: {\n en: ['zh'],\n ja: ['en', 'zh'],\n ko: ['en', 'zh'],\n },\n // 禁用 : 和 . 作为 seperator\n keySeparator: false,\n nsSeparator: false,\n resources: dict.to_resources(),\n interpolation: {\n escapeValue: false\n },\n react: {\n transKeepBasicHtmlNodesFor: []\n },\n })\n \n \n if (typeof window !== 'undefined' && window && !('i18n' in window))\n (window as any).i18n = this\n }\n \n \n /** 加载词典文件 (需要将这两行单独放一个文件里,以保证在 import 其他文件之前执行) \n \n @example\n import dict from './dict.json' // { \"添加\": { \"en\": \"Add\", \"ja\": \"追加\", \"ko\": \"추가\" } }\n i18n.init(dict)\n */\n init (dict: _Dict) {\n const resources = new Dict(dict).to_resources()\n for (const language in resources)\n this.i18next.addResources(language, 'translation', resources[language].translation)\n }\n \n toJSON () {\n return {\n language: this.language,\n }\n }\n}\n\n\nexport interface Hosts {\n \n}\n\n\nexport interface Roots {\n \n}\n\nexport type { _Dict, Item }\n\nexport interface I18NBasic {\n intl: boolean\n language: Language\n}\n"]}
|
package/i18n/rwdict.d.ts
CHANGED
package/i18n/rwdict.js
CHANGED
package/i18n/rwdict.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rwdict.js","sourceRoot":"","sources":["rwdict.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rwdict.js","sourceRoot":"","sources":["rwdict.ts"],"names":[],"mappings":"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","sourcesContent":["import '../prototype.js'\n\nimport type { Language } from './index.js'\nimport {\n Dict,\n type Item,\n type _Dict,\n} from './dict.js'\n\n\n/** read write Dict for scanner */\nexport class RWDict extends Dict {\n /** 更新词条 */\n set_item (key: string, item: Item, { print = true, placeholder = false, overwrite = false, dryrun = false, create = false } = { }) {\n if (!key || !item || typeof item !== 'object') throw new Error('key/item 错误')\n \n if (!item.zh && !item.en && !item.ja && !item.ko) {\n if (placeholder) {\n const empty_item = { en: '', ja: '', ko: '' }\n if (!dryrun && create)\n this._dict[key] = empty_item\n if (print)\n console.log(`${'+ '.green + key}: ${JSON.stringify(empty_item)}`)\n } else\n if (print)\n console.log(`${'! 未翻译:'.red}${key}`)\n \n return\n }\n \n Object.entries(item).forEach( ([language, translation]: [Language, string]) => {\n this.set_translation(key, language, translation, { print, overwrite, dryrun, create })\n })\n }\n \n \n /** 更新词条翻译 */\n set_translation (key: string, language: Language, translation: string, {\n /** 允许新增词条 */\n create = true, \n /** 允许更新翻译 */\n overwrite = false,\n print = true, \n placeholder = false, \n dryrun = false\n } = { }) {\n if (!key || !language) throw new Error('key/language 不能为空')\n if (!translation) return\n \n // --- add item\n let item = this._dict[key]\n \n const id = `(${key.replace(/\\n/g, '\\\\n')}).${language}`\n \n if (!item) {\n if (!create) {\n console.log(`${'+ '.red + id} ${translation.replace(/\\n/g, '\\\\n')}`)\n return\n }\n if (print)\n console.log(`${'+ '.green}${key.replace(/\\n/g, '\\\\n')}`)\n \n item = { }\n \n if (!dryrun)\n this._dict[key] = item\n }\n \n \n // --- update translation\n const _translation = item[language]\n \n \n // add\n if (!_translation) {\n if (print)\n console.log(`${'+ '.green + id}: ${translation.replace(/\\n/g, '\\\\n')}`)\n if (!dryrun)\n item[language] = translation\n return\n }\n \n // modify\n if (_translation !== translation)\n if (!overwrite) {\n console.error(`${`已存在 ${id} 词条:`.red} ${JSON.stringify(item)}`)\n console.error(`${'M? '.yellow}${_translation.replace(/\\n/g, '\\\\n')} → ${translation.replace(/\\n/g, '\\\\n')}`)\n if (!dryrun)\n console.error(`如要更新翻译请设置 { overwrite: true },否则使用 i18n.t('text', { context: 'xxx' }) 标记文本以区分。\\n`)\n return\n } else {\n if (print)\n console.log(`${'M '.yellow}${_translation.replace(/\\n/g, '\\\\n')} → ${translation.replace(/\\n/g, '\\\\n')}`)\n if (!dryrun)\n item[language] = translation\n }\n }\n \n /** 合并、更新词典 \n print?: true \n dryrun?: false \n overwrite?: false \n create?: true \n */\n merge (_dict: _Dict, { print = true, overwrite = false, dryrun = false, create = true } = { }) {\n Object.entries(_dict).forEach( ([key, item]) => {\n this.set_item(key, item, { print, overwrite, dryrun, create })\n })\n \n if (dryrun) {\n console.log('dry run completed'.green)\n return\n }\n \n if (print)\n console.log('词典合并完成'.green)\n \n return this\n }\n \n \n \n /** trim?: [true] 是否过滤掉空词条及空翻译 */ \n to_json (trim: boolean = true) {\n if (trim)\n this._dict = Object.fromEntries(\n (Object.entries(this._dict)\n .map( ([key, item]) => ([\n key,\n Object.fromEntries(\n Object.entries(item).filter( ([ language, translation ]) => translation )\n )\n ])\n ).filter( ([ key, item ]: [string, Item]) => Object.keys(item).length )\n )\n )\n \n return JSON.stringify(this._dict, null, 4)\n }\n}\n"]}
|
package/i18n/scanner/index.d.ts
CHANGED
package/i18n/scanner/index.js
CHANGED
|
@@ -15,7 +15,7 @@ const cli_table3_1 = tslib_1.__importDefault(require("cli-table3"));
|
|
|
15
15
|
require("../../prototype.js");
|
|
16
16
|
const utils_js_1 = require("../../utils.js");
|
|
17
17
|
const index_js_1 = require("../index.js");
|
|
18
|
-
const rwdict_js_1 =
|
|
18
|
+
const rwdict_js_1 = require("../rwdict.js");
|
|
19
19
|
const utils_js_2 = require("../utils.js");
|
|
20
20
|
const parser_js_1 = require("./parser.js");
|
|
21
21
|
/** 默认 i18next 扫描配置 */
|
|
@@ -120,7 +120,7 @@ async function scanner(rootdir = upath_1.default.normalize(process.cwd()), confi
|
|
|
120
120
|
lineEnding: '\n'
|
|
121
121
|
}
|
|
122
122
|
};
|
|
123
|
-
let dict = new rwdict_js_1.
|
|
123
|
+
let dict = new rwdict_js_1.RWDict();
|
|
124
124
|
for (const fp_dict of config.dict)
|
|
125
125
|
dict.merge(await (0, utils_js_2.try_load_dict)(upath_1.default.resolve(output, fp_dict)), { print: false, overwrite: true });
|
|
126
126
|
let c_files = 0;
|
|
@@ -307,9 +307,9 @@ async function scanner(rootdir = upath_1.default.normalize(process.cwd()), confi
|
|
|
307
307
|
let untranslateds = {};
|
|
308
308
|
for (const key of stats.en.untranslateds) {
|
|
309
309
|
let item = { ...dict.get(key) };
|
|
310
|
-
item.en
|
|
311
|
-
item.ja
|
|
312
|
-
item.ko
|
|
310
|
+
item.en ||= '';
|
|
311
|
+
item.ja ||= '';
|
|
312
|
+
item.ko ||= '';
|
|
313
313
|
untranslateds[key] = item;
|
|
314
314
|
}
|
|
315
315
|
this.push(new_vinyl_file(fp_untranslateds, untranslateds));
|
|
@@ -337,5 +337,4 @@ async function scanner(rootdir = upath_1.default.normalize(process.cwd()), confi
|
|
|
337
337
|
});
|
|
338
338
|
}
|
|
339
339
|
exports.scanner = scanner;
|
|
340
|
-
exports.default = scanner;
|
|
341
340
|
//# sourceMappingURL=index.js.map
|