xshell 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,10 +16,10 @@
16
16
  <img alt='npm downloads' src='https://img.shields.io/npm/dt/xshell?style=flat-square&color=brightgreen' />
17
17
  </a>
18
18
  <a href='https://marketplace.visualstudio.com/items?itemName=ShenHongFei.xshell' target='_blank'>
19
- <img alt='vscode extension version' src='https://vsmarketplacebadge.apphb.com/version/ShenHongFei.xshell.svg?style=flat-square&color=4c98cf' />
19
+ <img alt='vscode extension version' src='https://vsmarketplacebadges.dev/version/ShenHongFei.xshell.svg?style=flat-square&color=4c98cf' />
20
20
  </a>
21
21
  <a href='https://marketplace.visualstudio.com/items?itemName=ShenHongFei.xshell' target='_blank'>
22
- <img alt='vscode extension installs' src='https://vsmarketplacebadge.apphb.com/installs/ShenHongFei.xshell.svg?style=flat-square&color=4c98cf' />
22
+ <img alt='vscode extension installs' src='https://vsmarketplacebadges.dev/installs/ShenHongFei.xshell.svg?style=flat-square&color=4c98cf' />
23
23
  </a>
24
24
  </p>
25
25
 
package/file.d.ts CHANGED
@@ -91,7 +91,7 @@ export declare function flist(fpd: string, options?: {
91
91
  }): Promise<string[]>;
92
92
  export declare function fstat(fp: string): Promise<fs.BigIntStats>;
93
93
  /** 删除文件或文件夹 delete files or folders
94
- - fp: 路径 file path
94
+ - fp: 文件或文件夹的完整路径 The full path to the file or folder
95
95
  - options?:
96
96
  - print?: `true`
97
97
 
@@ -101,8 +101,12 @@ export declare function fdelete(fp: string, { print }?: {
101
101
  print?: boolean;
102
102
  }): Promise<boolean>;
103
103
  /** 复制文件或文件夹 copy file or direcotry
104
- - src: 源 文件/文件夹 完整路径 src file/directory absolute path
105
- - dst: 目标 文件/文件夹 完整路径 dst file/directory absolute path
104
+ - fp_src: 源 文件/文件夹 完整路径 src file/directory absolute path
105
+ - fp_dst: 目标 文件/文件夹 完整路径 dst file/directory absolute path
106
+ - options?:
107
+ print?: `true`
108
+ overwrite?: `true`
109
+
106
110
  @example
107
111
  fcopy('d:/temp/camera/', 'd:/camera/') */
108
112
  export declare function fcopy(fp_src: string, fp_dst: string, { print, overwrite, }?: {
package/file.js CHANGED
@@ -6,6 +6,7 @@ import debounce from 'lodash/debounce.js';
6
6
  import MFS from 'memfs';
7
7
  import { t } from './i18n/instance.js';
8
8
  import { to_json } from './prototype.js';
9
+ import { assert } from './utils.js';
9
10
  export * from './ufs.js';
10
11
  export { MFS };
11
12
  /** fp 所指向的 文件/ 文件夹 是否存在
@@ -159,17 +160,15 @@ export async function fstat(fp) {
159
160
  return fsp.stat(fp, { bigint: true });
160
161
  }
161
162
  /** 删除文件或文件夹 delete files or folders
162
- - fp: 路径 file path
163
+ - fp: 文件或文件夹的完整路径 The full path to the file or folder
163
164
  - options?:
164
165
  - print?: `true`
165
166
 
166
167
  返回是否实际进行了删除操作
167
168
  Returns whether the delete operation actually took place */
168
169
  export async function fdelete(fp, { print = true } = {}) {
169
- if (fp.length < 6)
170
- throw new Error(fp + t(' 太短'));
171
- if (!path.isAbsolute(fp))
172
- throw new Error(t('fp 必须是绝对路径'));
170
+ assert(fp.length >= 6, fp + t(' 太短,防止误删文件'));
171
+ assert(path.isAbsolute(fp), t('fp 必须是绝对路径'));
173
172
  try {
174
173
  await fsp.rm(fp, { recursive: true });
175
174
  if (print)
@@ -192,15 +191,17 @@ export async function fdelete(fp, { print = true } = {}) {
192
191
  }
193
192
  }
194
193
  /** 复制文件或文件夹 copy file or direcotry
195
- - src: 源 文件/文件夹 完整路径 src file/directory absolute path
196
- - dst: 目标 文件/文件夹 完整路径 dst file/directory absolute path
194
+ - fp_src: 源 文件/文件夹 完整路径 src file/directory absolute path
195
+ - fp_dst: 目标 文件/文件夹 完整路径 dst file/directory absolute path
196
+ - options?:
197
+ print?: `true`
198
+ overwrite?: `true`
199
+
197
200
  @example
198
201
  fcopy('d:/temp/camera/', 'd:/camera/') */
199
202
  export async function fcopy(fp_src, fp_dst, { print = true, overwrite = true, } = {}) {
200
- if (fp_src.endsWith('/') !== fp_dst.endsWith('/'))
201
- throw new Error(t('fp_src 和 fp_dst 必须同为文件路径或文件夹路径'));
202
- if (!path.isAbsolute(fp_src) || !path.isAbsolute(fp_dst))
203
- throw new Error(t('fp_src 和 fp_dst 必须为完整路径'));
203
+ assert(fp_src.endsWith('/') === fp_dst.endsWith('/'), t('fp_src 和 fp_dst 必须同为文件路径或文件夹路径'));
204
+ assert(path.isAbsolute(fp_src) && path.isAbsolute(fp_dst), t('fp_src 和 fp_dst 必须为完整路径'));
204
205
  if (print)
205
206
  console.log(t('复制'), fp_src, '→', fp_dst);
206
207
  await fse.copy(fp_src, fp_dst, { overwrite, errorOnExist: true });
@@ -248,10 +249,8 @@ export async function frename(fp, fp_, { fpd, print = true, overwrite = true } =
248
249
  - print?: `true`
249
250
  - mode?: `'0o777'` */
250
251
  export async function fmkdir(fpd, { print = true, mode, } = {}) {
251
- if (!path.isAbsolute(fpd))
252
- throw new Error(t('fpd 必须是绝对路径: ') + fpd);
253
- if (!fpd.endsWith('/'))
254
- throw new Error(t('fpd 必须以 / 结尾: ') + fpd);
252
+ assert(path.isAbsolute(fpd), t('fpd 必须是绝对路径: ') + fpd);
253
+ assert(fpd.endsWith('/'), t('fpd 必须以 / 结尾: ') + fpd);
255
254
  // CallingfsPromises.mkdir() when path is a directory that exists results in a rejection only when recursive is false.
256
255
  const fpd_ = (await fsp.mkdir(fpd, { recursive: true, mode }))?.replaceAll('\\', '/');
257
256
  if (fpd_) {
@@ -266,12 +265,10 @@ export async function fmkdir(fpd, { print = true, mode, } = {}) {
266
265
  - fp_real: 现在真实文件/文件夹的路径 current real file/directory path
267
266
  - fp_link: 目标链接文件/文件夹的路径 target file/directory path */
268
267
  export async function flink(fp_real, fp_link, { junction = false, print = true } = {}) {
269
- if (!path.isAbsolute(fp_real) || !path.isAbsolute(fp_link))
270
- throw new Error(t('fp 必须是绝对路径'));
268
+ assert(path.isAbsolute(fp_real) && path.isAbsolute(fp_link), t('fp 必须是绝对路径'));
271
269
  const is_fpd_real = fp_real.endsWith('/');
272
270
  const is_fpd_link = fp_link.endsWith('/');
273
- if (is_fpd_real !== is_fpd_link)
274
- throw new Error(t('fp_real 和 fp_link 必须同为文件路径或文件夹路径'));
271
+ assert(is_fpd_real === is_fpd_link, t('fp_real 和 fp_link 必须同为文件路径或文件夹路径'));
275
272
  if (fexists(fp_link))
276
273
  throw new Error(t('存在同名') + (is_fpd_link ? t('文件夹') : t('文件')) + ': ' + fp_link + t(',无法创建链接'));
277
274
  if (print)
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'\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\n\nimport { t } from './i18n/instance.js'\nimport { to_json } from './prototype.js'\n\n\nexport * from './ufs.js'\n\nexport { MFS }\n\nexport type Encoding = 'utf-8' | 'gb18030' | 'shift-jis' | 'binary'\n\n\n/** fp 所指向的 文件/ 文件夹 是否存在 \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(exists ? t('已存在') : t('不存在'), fp)\n \n return exists\n}\n\n\n/** 打开文件,返回 FileHandle \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. */\nexport async function fopen (\n fp: string,\n flags: string | number,\n { mode, print }: { mode?: fs.Mode, print?: boolean } = { }\n) {\n if (print)\n console.log(t('打开文件'), fp)\n \n return Object.assign(\n await fsp.open(fp, flags, mode),\n { fp, flags, mode }\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(t('fp 必须是绝对路径,或传入 dir 参数: ') + fp)\n \n if (print)\n console.log(t('读取'), fp)\n \n switch (encoding) {\n case 'utf-8':\n return fsp.readFile(fp, { encoding: 'utf-8' })\n \n case 'binary':\n return fsp.readFile(fp)\n \n default: {\n const buffer = await fsp.readFile(fp)\n \n if (encoding === 'auto') {\n const { detect } = await import('chardet')\n encoding = detect(buffer) as any\n if (print)\n console.log(fp + t(' 的编码可能是 ') + encoding.toLowerCase())\n }\n \n return iconv.decode(buffer, encoding)\n }\n }\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(await fread(fp, options))\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(t('写入'), (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(t('fp 必须是绝对路径,或传入 dir 参数: ') + fp)\n \n if (print)\n console.log(t('写入'), 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(t('fp 必须是绝对路径,或传入 dir 参数: ') + fp)\n \n if (print)\n console.log(t('追加'), fp)\n \n if (!Buffer.isBuffer(data) && typeof data !== 'string')\n throw new Error(t('data 不是 Buffer 或 string'))\n \n await fsp.appendFile(fp, data)\n}\n\n\n/**\n - fpd: 文件夹完整路径 absolute path of directory\n - options?:\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 注意当 deep = true 时被 filter 过滤掉的目录及目录中的文件不会包含在结果中 \n Note that when deep = true, directories and files in directories that are filtered out by the filter will not be included in the results */\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(t('参数 fpd: ') + fpd + t(' 必须是绝对路径'))\n \n if (!fpd.endsWith('/'))\n throw new Error(t('参数 fpd: ') + fpd + t(' 必须以 / 结尾'))\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 )).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 + t(' 必须是绝对路径'))\n \n return fsp.stat(fp, { bigint: true })\n}\n\n\n/** 删除文件或文件夹 delete files or folders \n - fp: 路径 file path\n - options?:\n - print?: `true`\n \n 返回是否实际进行了删除操作 \n Returns whether the delete operation actually took place */\nexport async function fdelete (fp: string, { print = true }: { print?: boolean } = { }) {\n if (fp.length < 6)\n throw new Error(fp + t(' 太短'))\n \n if (!path.isAbsolute(fp))\n throw new Error(t('fp 必须是绝对路径'))\n \n try {\n await fsp.rm(fp, { recursive: true })\n if (print)\n if (fp.endsWith('/'))\n console.log((t('删除了文件夹: ') + fp).red)\n else\n console.log((t('删除了文件: ') + fp).red)\n return true\n } catch (error) {\n if (error.code === 'ENOENT') {\n if (print)\n if (fp.endsWith('/'))\n console.log(t('文件夹已不存在: ') + fp)\n else\n console.log(t('文件已不存在: ') + fp)\n return false\n }\n \n throw error\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/') */\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(t('fp_src 和 fp_dst 必须同为文件路径或文件夹路径'))\n \n if (!path.isAbsolute(fp_src) || !path.isAbsolute(fp_dst))\n throw new Error(t('fp_src 和 fp_dst 必须为完整路径'))\n \n if (print)\n console.log(t('复制'), 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/') */\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(t('src 和 dst 必须同为文件路径或文件夹路径'))\n \n if (!path.isAbsolute(src) || !path.isAbsolute(dst))\n throw new Error(t('src 和 dst 必须为完整路径'))\n \n if (print)\n console.log(t('移动'), 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 和 fp_ 在同一文件夹内 fp and fp_ is in same directory\n - print?: `true`\n - overwrite?: `true` 默认覆盖(不检查效率更高) better performance without check */\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(t('fp 和 fp_ 必须是绝对路径'))\n \n if (print)\n console.log(t('重命名'), fp, '→', fp_)\n \n if (!overwrite && fexists(fp_))\n throw new Error(t('文件已存在:') + fp_)\n \n await fsp.rename(fp, fp_)\n}\n\n\n/**\n 递归创建文件夹,确保 fpd 指向的文件夹存在 Create folders recursively, make sure the folder pointed to by fpd exists \n 返回首个创建的文件夹或 undefined Returns the first created folder or undefined\n \n - fpd: 文件夹完整路径 Folder full path\n - options?:\n - print?: `true`\n - mode?: `'0o777'` */\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(t('fpd 必须是绝对路径: ') + fpd)\n \n if (!fpd.endsWith('/'))\n throw new Error(t('fpd 必须以 / 结尾: ') + 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(t('已创建文件夹'), fpd)\n } else\n if (print)\n console.log(t('已存在文件夹'), fpd)\n \n return fpd_\n}\n\n\n/** 创建软链接 Create soft links \n - fp_real: 现在真实文件/文件夹的路径 current real file/directory path\n - fp_link: 目标链接文件/文件夹的路径 target file/directory path */\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(t('fp 必须是绝对路径'))\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(t('fp_real 和 fp_link 必须同为文件路径或文件夹路径'))\n \n if (fexists(fp_link))\n throw new Error(t('存在同名') + (is_fpd_link ? t('文件夹') : t('文件')) + ': ' + fp_link + t(',无法创建链接'))\n \n if (print)\n console.log(t('已将源文件 ') + fp_real + t(' 链接到 ') + 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: `true` 首次 watch 时执行 onchange call callback when watch is executed\n \n 创建的 fs.FSWatcher 保存在 watchers 中, 再次调用相同的 fp 会自动关闭已有的 watcher \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. */\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(t('fp 必须是完整路径'))\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(t('文件修改 (') + 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/** 打开一个文件并搜索替换某个 pattern 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/** 将文件编码转为 UTF-8 convert file encoding to UTF-8\n - fp: 文件完整路径 file absolute path\n - options?:\n - dryrun?: `true`\n - encoding?: `'auto'` */\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'\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\n\nimport { t } from './i18n/instance.js'\nimport { to_json } from './prototype.js'\nimport { assert } from './utils.js'\n\n\nexport * from './ufs.js'\n\nexport { MFS }\n\nexport type Encoding = 'utf-8' | 'gb18030' | 'shift-jis' | 'binary'\n\n\n/** fp 所指向的 文件/ 文件夹 是否存在 \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(exists ? t('已存在') : t('不存在'), fp)\n \n return exists\n}\n\n\n/** 打开文件,返回 FileHandle \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. */\nexport async function fopen (\n fp: string,\n flags: string | number,\n { mode, print }: { mode?: fs.Mode, print?: boolean } = { }\n) {\n if (print)\n console.log(t('打开文件'), fp)\n \n return Object.assign(\n await fsp.open(fp, flags, mode),\n { fp, flags, mode }\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(t('fp 必须是绝对路径,或传入 dir 参数: ') + fp)\n \n if (print)\n console.log(t('读取'), fp)\n \n switch (encoding) {\n case 'utf-8':\n return fsp.readFile(fp, { encoding: 'utf-8' })\n \n case 'binary':\n return fsp.readFile(fp)\n \n default: {\n const buffer = await fsp.readFile(fp)\n \n if (encoding === 'auto') {\n const { detect } = await import('chardet')\n encoding = detect(buffer) as any\n if (print)\n console.log(fp + t(' 的编码可能是 ') + encoding.toLowerCase())\n }\n \n return iconv.decode(buffer, encoding)\n }\n }\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(await fread(fp, options))\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(t('写入'), (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(t('fp 必须是绝对路径,或传入 dir 参数: ') + fp)\n \n if (print)\n console.log(t('写入'), 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(t('fp 必须是绝对路径,或传入 dir 参数: ') + fp)\n \n if (print)\n console.log(t('追加'), fp)\n \n if (!Buffer.isBuffer(data) && typeof data !== 'string')\n throw new Error(t('data 不是 Buffer 或 string'))\n \n await fsp.appendFile(fp, data)\n}\n\n\n/**\n - fpd: 文件夹完整路径 absolute path of directory\n - options?:\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 注意当 deep = true 时被 filter 过滤掉的目录及目录中的文件不会包含在结果中 \n Note that when deep = true, directories and files in directories that are filtered out by the filter will not be included in the results */\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(t('参数 fpd: ') + fpd + t(' 必须是绝对路径'))\n \n if (!fpd.endsWith('/'))\n throw new Error(t('参数 fpd: ') + fpd + t(' 必须以 / 结尾'))\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 )).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 + t(' 必须是绝对路径'))\n \n return fsp.stat(fp, { bigint: true })\n}\n\n\n/** 删除文件或文件夹 delete files or folders \n - fp: 文件或文件夹的完整路径 The full path to the file or folder\n - options?:\n - print?: `true`\n \n 返回是否实际进行了删除操作 \n Returns whether the delete operation actually took place */\nexport async function fdelete (fp: string, { print = true }: { print?: boolean } = { }) {\n assert(fp.length >= 6, fp + t(' 太短,防止误删文件'))\n assert(path.isAbsolute(fp), t('fp 必须是绝对路径'))\n \n try {\n await fsp.rm(fp, { recursive: true })\n if (print)\n if (fp.endsWith('/'))\n console.log((t('删除了文件夹: ') + fp).red)\n else\n console.log((t('删除了文件: ') + fp).red)\n return true\n } catch (error) {\n if (error.code === 'ENOENT') {\n if (print)\n if (fp.endsWith('/'))\n console.log(t('文件夹已不存在: ') + fp)\n else\n console.log(t('文件已不存在: ') + fp)\n return false\n }\n \n throw error\n }\n}\n\n\n/** 复制文件或文件夹 copy file or direcotry\n - fp_src: 源 文件/文件夹 完整路径 src file/directory absolute path\n - fp_dst: 目标 文件/文件夹 完整路径 dst file/directory absolute path\n - options?:\n print?: `true`\n overwrite?: `true`\n \n @example\n fcopy('d:/temp/camera/', 'd:/camera/') */\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 assert(fp_src.endsWith('/') === fp_dst.endsWith('/'), t('fp_src 和 fp_dst 必须同为文件路径或文件夹路径'))\n assert(path.isAbsolute(fp_src) && path.isAbsolute(fp_dst), t('fp_src 和 fp_dst 必须为完整路径'))\n \n if (print)\n console.log(t('复制'), 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/') */\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(t('src 和 dst 必须同为文件路径或文件夹路径'))\n \n if (!path.isAbsolute(src) || !path.isAbsolute(dst))\n throw new Error(t('src 和 dst 必须为完整路径'))\n \n if (print)\n console.log(t('移动'), 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 和 fp_ 在同一文件夹内 fp and fp_ is in same directory\n - print?: `true`\n - overwrite?: `true` 默认覆盖(不检查效率更高) better performance without check */\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(t('fp 和 fp_ 必须是绝对路径'))\n \n if (print)\n console.log(t('重命名'), fp, '→', fp_)\n \n if (!overwrite && fexists(fp_))\n throw new Error(t('文件已存在:') + fp_)\n \n await fsp.rename(fp, fp_)\n}\n\n\n/**\n 递归创建文件夹,确保 fpd 指向的文件夹存在 Create folders recursively, make sure the folder pointed to by fpd exists \n 返回首个创建的文件夹或 undefined Returns the first created folder or undefined\n \n - fpd: 文件夹完整路径 Folder full path\n - options?:\n - print?: `true`\n - mode?: `'0o777'` */\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 assert(path.isAbsolute(fpd), t('fpd 必须是绝对路径: ') + fpd)\n assert(fpd.endsWith('/'), t('fpd 必须以 / 结尾: ') + 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(t('已创建文件夹'), fpd)\n } else\n if (print)\n console.log(t('已存在文件夹'), fpd)\n \n return fpd_\n}\n\n\n/** 创建软链接 Create soft links \n - fp_real: 现在真实文件/文件夹的路径 current real file/directory path\n - fp_link: 目标链接文件/文件夹的路径 target file/directory path */\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 assert(path.isAbsolute(fp_real) && path.isAbsolute(fp_link), t('fp 必须是绝对路径'))\n \n const is_fpd_real = fp_real.endsWith('/')\n const is_fpd_link = fp_link.endsWith('/')\n \n assert(is_fpd_real === is_fpd_link, t('fp_real 和 fp_link 必须同为文件路径或文件夹路径'))\n \n if (fexists(fp_link))\n throw new Error(t('存在同名') + (is_fpd_link ? t('文件夹') : t('文件')) + ': ' + fp_link + t(',无法创建链接'))\n \n if (print)\n console.log(t('已将源文件 ') + fp_real + t(' 链接到 ') + 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: `true` 首次 watch 时执行 onchange call callback when watch is executed\n \n 创建的 fs.FSWatcher 保存在 watchers 中, 再次调用相同的 fp 会自动关闭已有的 watcher \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. */\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(t('fp 必须是完整路径'))\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(t('文件修改 (') + 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/** 打开一个文件并搜索替换某个 pattern 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/** 将文件编码转为 UTF-8 convert file encoding to UTF-8\n - fp: 文件完整路径 file absolute path\n - options?:\n - dryrun?: `true`\n - encoding?: `'auto'` */\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.json CHANGED
@@ -247,5 +247,14 @@
247
247
  },
248
248
  "已存在文件夹": {
249
249
  "en": "folder already exists:"
250
+ },
251
+ " 太短,防止误删文件": {
252
+ "en": " is too short (prevent accidental deletion of files)"
253
+ },
254
+ "异常结束": {
255
+ "en": "exited abnormally"
256
+ },
257
+ "结束": {
258
+ "en": "exited"
250
259
  }
251
260
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xshell",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "bin": {
@@ -125,12 +125,12 @@
125
125
  "@types/node": "^18.11.18",
126
126
  "@types/promise-retry": "^1.1.3",
127
127
  "@types/qs": "^6.9.7",
128
- "@types/react": "^18.0.26",
128
+ "@types/react": "^18.0.27",
129
129
  "@types/request": "^2.48.8",
130
130
  "@types/request-promise-native": "^1.0.18",
131
131
  "@types/stream-buffers": "^3.0.4",
132
132
  "@types/tampermonkey": "^4.0.9",
133
- "@types/vinyl-fs": "^2.4.12",
133
+ "@types/vinyl-fs": "^3.0.0",
134
134
  "@types/vscode": "^1.74.0",
135
135
  "@types/ws": "^8.5.4",
136
136
  "source-map-loader": "^4.0.1",
package/process.d.ts CHANGED
@@ -5,7 +5,7 @@ import { type ChildProcess } from 'child_process';
5
5
  import './prototype.js';
6
6
  import { Encoding } from './file.js';
7
7
  import { inspect } from './utils.js';
8
- export declare const exe_node: string;
8
+ export declare const exe_nodejs: string;
9
9
  interface StartOptions {
10
10
  /** `继承当前工作目录 process.cwd()` 子进程的工作目录 `inherit the cwd` cwd of the child process. */
11
11
  cwd?: string;
@@ -94,13 +94,13 @@ export declare function call(exe: string, args?: string[], options?: CallOptions
94
94
  - detached?: `false` 是否断开和 child 的关系 (ignore stdio, unref) whether to break the connection with child (ignore stdio, unref)
95
95
  - throw_code?: `true` code 不为 0 时是否抛出异常 whether to throw Error when code is not 0
96
96
  */
97
- export declare function call_node(js: string, args?: string[], options?: CallOptions & {
97
+ export declare function call_nodejs(js: string, args?: string[], options?: CallOptions & {
98
98
  encoding?: 'utf-8' | 'gb18030';
99
99
  }): Promise<CallResult<string>>;
100
- interface TermOptions {
100
+ export interface TermOptions {
101
101
  /** `d:/t/` */
102
102
  cwd?: string;
103
- /** `false` 打印参数 */
103
+ /** `true` 打印参数 */
104
104
  print?: boolean;
105
105
  title?: string;
106
106
  }
@@ -124,5 +124,5 @@ export interface TermNodeOptions extends TermOptions {
124
124
  trace_warnings?: boolean;
125
125
  }
126
126
  /** 在 term tab 中创建 node.exe 进程 create the node.exe process in term tab */
127
- export declare function term_node(fp_js: string, args?: string[], { title, inspect, tsnode, break: _break, resolve, trace_warnings, ..._options }?: TermNodeOptions): Promise<ChildProcess>;
127
+ export declare function term_nodejs(fp_js: string, args?: string[], { title, inspect, tsnode, break: _break, resolve, trace_warnings, ..._options }?: TermNodeOptions): Promise<ChildProcess>;
128
128
  export {};
package/process.js CHANGED
@@ -4,7 +4,7 @@ import iconv from 'iconv-lite';
4
4
  import { t } from './i18n/instance.js';
5
5
  import './prototype.js';
6
6
  import { inspect } from './utils.js';
7
- export const exe_node = process.execPath.to_slash();
7
+ export const exe_nodejs = process.execPath.to_slash();
8
8
  /** start process
9
9
  - exe: .exe 路径或文件名 (建议使用完整路径,跳过 path 搜索,性能更高) path or filename (full path is recommanded to skip path searching for better perf)
10
10
  - args: `[]` 参数列表 arguments list
@@ -36,11 +36,13 @@ export async function start(exe, args = [], { cwd, encoding = 'utf-8', print = t
36
36
  if (typeof stdio === 'string')
37
37
  stdio = [stdio, stdio, stdio];
38
38
  if (print.command)
39
- console.log(((exe === exe_winterm ? 'term.exe' : exe) + ' ' +
40
- (args.filter(arg => arg !== '--suppressApplicationTitle').map(arg => arg.includes(' ') ?
41
- arg.quote()
39
+ console.log(((short_exe_names[exe] || (exe.includes(' ') ? exe.quote() : exe)) +
40
+ (args.length ?
41
+ ' ' + args.filter(arg => arg !== '--suppressApplicationTitle')
42
+ .map(arg => arg.includes(' ') ? arg.quote() : arg)
43
+ .join(' ')
42
44
  :
43
- arg).join(' '))).blue);
45
+ '')).blue);
44
46
  if (detached) {
45
47
  let child = spawn(exe, args, {
46
48
  ...options,
@@ -91,8 +93,9 @@ export async function call(exe, args = [], options = {}) {
91
93
  };
92
94
  if (typeof stdio === 'string')
93
95
  stdio = [stdio, stdio, stdio];
94
- const cmd = (exe.includes(' ') ? exe.quote() : exe) +
95
- (args.length ? (' ' + args.map(arg => arg.includes(' ') ? arg.quote() : arg).join(' '))
96
+ const cmd = (short_exe_names[exe] || (exe.includes(' ') ? exe.quote() : exe)) +
97
+ (args.length ? (' ' + args.map(arg => arg.includes(' ') ? arg.quote() : arg)
98
+ .join(' '))
96
99
  :
97
100
  '');
98
101
  if (print.command)
@@ -133,11 +136,11 @@ export async function call(exe, args = [], options = {}) {
133
136
  })()
134
137
  ]);
135
138
  const message = `${t('进程')} ${cmd} ` + (code ?
136
- `(pid: ${child.pid}) ${t('异常结束, 错误码:')} ${code}${signal ? `, ${t('信号:')} ${signal}` : ''}`
139
+ `(pid: ${child.pid}) ${throw_code ? t('异常结束') : t('结束')}, code: ${code}${signal ? `, signal: ${signal}` : ''}`
137
140
  :
138
141
  t('正常结束'));
139
- if (print.code || code || signal)
140
- console.log(message[code || signal ? 'red' : 'blue']);
142
+ if (print.code || (throw_code && (code || signal)))
143
+ console.log(message[(throw_code && (code || signal)) ? 'red' : 'blue']);
141
144
  const result = {
142
145
  pid: child.pid,
143
146
  stdout: encoding === 'binary' ?
@@ -171,8 +174,8 @@ export async function call(exe, args = [], options = {}) {
171
174
  - detached?: `false` 是否断开和 child 的关系 (ignore stdio, unref) whether to break the connection with child (ignore stdio, unref)
172
175
  - throw_code?: `true` code 不为 0 时是否抛出异常 whether to throw Error when code is not 0
173
176
  */
174
- export async function call_node(js, args = [], options) {
175
- return call(exe_node, [js, ...args], options);
177
+ export async function call_nodejs(js, args = [], options) {
178
+ return call(exe_nodejs, [js, ...args], options);
176
179
  }
177
180
  export const exe_winterm = `C:/Users/${userInfo().username}/AppData/Local/Microsoft/WindowsApps/wt.exe`;
178
181
  /** 新建 terminal 窗口执行进程 New Terminal window execution process
@@ -197,8 +200,8 @@ export function term(exe, args = [], { cwd = 'd:/t/', print = true, title,
197
200
  });
198
201
  }
199
202
  /** 在 term tab 中创建 node.exe 进程 create the node.exe process in term tab */
200
- export async function term_node(fp_js, args = [], { title, inspect, tsnode = false, break: _break, resolve = false, trace_warnings = false, ..._options } = {}) {
201
- return term(exe_node, [
203
+ export async function term_nodejs(fp_js, args = [], { title, inspect, tsnode = false, break: _break, resolve = false, trace_warnings = false, ..._options } = {}) {
204
+ return term(exe_nodejs, [
202
205
  ...trace_warnings ? ['--trace-warnings'] : [],
203
206
  ...resolve ? ['--experimental-specifier-resolution=node'] : [],
204
207
  ...title ? [`--title=${title}`] : [],
@@ -216,4 +219,8 @@ export async function term_node(fp_js, args = [], { title, inspect, tsnode = fal
216
219
  ..._options,
217
220
  });
218
221
  }
222
+ const short_exe_names = {
223
+ [exe_winterm]: 'term.exe',
224
+ [exe_nodejs]: 'node.exe'
225
+ };
219
226
  //# sourceMappingURL=process.js.map
package/process.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["process.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,EAGR,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;AAE7B,OAAO,KAAK,MAAM,YAAY,CAAA;AAE9B,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAA;AAEtC,OAAO,gBAAgB,CAAA;AAEvB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAGpC,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAA;AA0CnD;;;;;;;;;;EAUE;AACF,MAAM,CAAC,KAAK,UAAU,KAAK,CAAE,GAAW,EAAE,OAAiB,EAAG,EAAE,EAC5D,GAAG,EAEH,QAAQ,GAAG,OAAO,EAElB,KAAK,GAAG,IAAI,EAEZ,KAAK,GAAG,MAAM,EAEd,QAAQ,GAAG,KAAK,EAEhB,GAAG,EAEH,MAAM,EAAE,OAAO,GAAG,IAAI,MACR,EAAG;IACjB,MAAM,OAAO,GAAiB;QAC1B,GAAG;QACH,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,CAAC,OAAO;QACrB,KAAK;QACL,GAAI,GAAG,CAAC,CAAC,CAAC;YACN,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE;SAClC,CAAC,CAAC,CAAC,EAAG;KACV,CAAA;IAED,IAAI,OAAO,KAAK,KAAK,SAAS;QAC1B,KAAK,GAAG;YACJ,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,KAAK;SACd,CAAA;IAEL,IAAI,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAEjC,IAAI,KAAK,CAAC,OAAO;QACb,OAAO,CAAC,GAAG,CAAC,CACR,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;YAC9C,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACX,GAAG,KAAK,4BAA4B,CACvC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACR,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBACf,GAAG,CAAC,KAAK,EAAE;gBACf,CAAC;oBACG,GAAG,CACN,CAAC,IAAI,CAAC,GAAG,CAAC,CAClB,CACJ,CAAC,IAAI,CAAC,CAAA;IAEX,IAAI,QAAQ,EAAE;QACV,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YACzB,GAAG,OAAO;YACV,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAA;QAEF,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,OAAO,KAAK,CAAA;KACf;IAED,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAErC,qCAAqC;IACrC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;QACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM;QACnB,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAE1C,IACI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CACZ,CAAC,KAAK,QAAQ,CAAC;QAEnB,OAAO,KAAK,CAAA;IAEhB,IAAI,QAAQ,KAAK,QAAQ,EAAE;QACvB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;YACrB,IAAI,QAAQ,KAAK,OAAO;gBACpB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;;gBAEjC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAC5B,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CACZ,CAAA;YAExB,IAAI,KAAK,CAAC,MAAM;gBACZ,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;SACxD;QAED,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;YACrB,IAAI,QAAQ,KAAK,OAAO;gBACpB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;;gBAEjC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAC5B,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CACZ,CAAA;YAExB,IAAI,KAAK,CAAC,MAAM;gBACZ,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;SACxD;KACJ;IAED,OAAO,KAAK,CAAA;AAChB,CAAC;AAmCD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAE,GAAW,EAAE,OAAiB,EAAG,EAAE,UAAuB,EAAG;IACrF,MAAM,EACF,QAAQ,GAAG,OAAO,EAClB,UAAU,GAAG,IAAI,EACjB,KAAK,GACR,GAAG,OAAO,CAAA;IAEX,IAAI,EACA,KAAK,GAAG,MAAM,EACd,KAAK,GAAG,IAAI,EACf,GAAG,OAAO,CAAA;IAEX,IAAI,OAAO,KAAK,KAAK,SAAS;QAC1B,KAAK,GAAG;YACJ,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,KAAK;SACd,CAAA;IAEL,IAAI,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAEjC,MAAM,GAAG,GACL,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACvC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CACX,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACjB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CACxC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;gBACG,EAAE,CAAC,CAAA;IAEX,IAAI,KAAK,CAAC,OAAO;QACb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAEzB,IAAI,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;QAC/B,GAAG,OAAO;QACV,KAAK,EAAE,KAAK;KACf,CAAC,CAAA;IAEF,IAAI,KAAK;QACL,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAE5B,qBAAqB;IACrB,IAAI,OAAO,GAAwB,EAAG,CAAA;IACtC,IAAI,OAAO,GAAwB,EAAG,CAAA;IAEtC,IAAI,IAAmB,EACnB,MAAsB,CAAA;IAE1B,MAAM,OAAO,CAAC,GAAG,CAAC;QACd,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YACxB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAClC,IAAI,GAAG,KAAK,CAAA;gBACZ,MAAM,GAAG,OAAO,CAAA;gBAChB,OAAO,EAAE,CAAA;YACb,CAAC,CAAC,CAAA;QACN,CAAC,CAAC;QACF,CAAC,KAAK,IAAI,EAAE;YACR,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM;gBACnB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,MAAwC,EAAE;oBACtE,IAAI,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM;wBACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;oBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;iBACtB;QACT,CAAC,CAAC,EAAE;QACJ,CAAC,KAAK,IAAI,EAAE;YACR,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM;gBACnB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,MAAwC,EAAE;oBACtE,IAAI,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM;wBACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;oBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;iBACtB;QACT,CAAC,CAAC,EAAE;KACP,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,CACnC,IAAI,CAAC,CAAC;QACF,SAAS,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,IAAI,GAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAK,MAAO,EAAE,CAAC,CAAC,CAAC,EAAG,EAAE;QAClG,CAAC;YACG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAElB,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM;QAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAEzD,MAAM,MAAM,GAAG;QACX,GAAG,EAAE,KAAK,CAAC,GAAG;QAEd,MAAM,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,OAAmB,CAAC;YACtC,CAAC;gBACI,OAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAElC,MAAM,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,OAAmB,CAAC;YACtC,CAAC;gBACI,OAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAElC,IAAI;QAEJ,MAAM;QAEN,KAAK;QAEL,CAAC,OAAO,CAAC,MAAM,CAAC;YACZ,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC7C,CAAC;KACJ,CAAA;IAED,IAAI,IAAI,IAAI,UAAU;QAClB,MAAM,MAAM,CAAC,MAAM,CACf,IAAI,KAAK,CAAC,OAAO,CAAC,EAClB,MAAM,CACT,CAAA;IAEL,OAAO,MAAM,CAAA;AACjB,CAAC;AAGD;;;;;;;;;;;EAWE;AACF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAE,EAAU,EAAE,OAAiB,EAAE,EAAE,OAA0D;IACxH,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;AACjD,CAAC;AAkBD,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,QAAQ,EAAE,CAAC,QAAQ,6CAA6C,CAAA;AAEvG;;;;EAIE;AACF,MAAM,UAAU,IAAI,CAAE,GAAW,EAAE,OAAiB,EAAE,EAAE,EACpD,GAAG,GAAG,OAAO,EAEb,KAAK,GAAG,IAAI,EAEZ,KAAK;AAEL,MAAM;KACO,EAAG;IAGhB,OAAO,KAAK,CACR,WAAW,EACX;QACI,SAAS;QAET,IAAI,EAAE,GAAG;QAET,GAAI,KAAK,CAAC,CAAC,CAAC,CAAC,4BAA4B,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAG;QAElE,GAAG;QAEH,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACd,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;KAClC,EACD;QACI,KAAK;QACL,QAAQ,EAAE,IAAI;QACd,GAAG;QACH,MAAM;KACT,CACJ,CAAA;AACL,CAAC;AAqBD,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,SAAS,CAC3B,KAAa,EACb,OAAiB,EAAG,EACpB,EACI,KAAK,EACL,OAAO,EACP,MAAM,GAAG,KAAK,EACd,KAAK,EAAE,MAAM,EACb,OAAO,GAAG,KAAK,EACf,cAAc,GAAG,KAAK,EACtB,GAAG,QAAQ,KACM,EAAG;IAExB,OAAO,IAAI,CAAC,QAAQ,EAAE;QAClB,GAAI,cAAc,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAG;QAC/C,GAAI,OAAO,CAAC,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,CAAC,EAAG;QAChE,GAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAG;QACtC,GAAI,OAAO,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,CAAC,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC,CAAC,qBAAqB,OAAO,EAAE;SAC/E,CAAC,CAAC,CAAC,EAAG;QACP,GAAI,MAAM,CAAC,CAAC,CAAC;YACT,sBAAsB;YACtB,0CAA0C;SAC7C,CAAC,CAAC,CAAC,EAAG;QACP,KAAK;QACL,GAAI,IAAI;KACX,EAAE;QACC,KAAK;QACL,GAAG,QAAQ;KACd,CAAC,CAAA;AACN,CAAC","sourcesContent":["import {\n spawn,\n type SpawnOptions,\n type ChildProcess\n} from 'child_process'\nimport { Readable } from 'stream'\nimport { userInfo } from 'os'\n\nimport iconv from 'iconv-lite'\n\nimport { t } from './i18n/instance.js'\n\nimport './prototype.js'\nimport { Encoding } from './file.js'\nimport { inspect } from './utils.js'\n\n\nexport const exe_node = process.execPath.to_slash()\n\n\n// ------------------------------------ start & call\ninterface StartOptions {\n /** `继承当前工作目录 process.cwd()` 子进程的工作目录 `inherit the cwd` cwd of the child process. */\n cwd?: string\n \n /** `process.env` 覆盖/添加到 process.env 的环境变量 overwrite/add to process.env */\n env?: Record<string, string>\n \n /** `'utf-8'` 子进程输出编码 child output encoding */\n encoding?: Encoding\n \n /** `true` print 选项,支持设置细项 print option (with details) */\n print?: boolean | {\n stdout: boolean\n stderr: boolean\n command: boolean\n code: boolean\n }\n \n /** `'pipe'` 设置为 'ignore' 时忽略 stdio 处理 when 'ignore' then ignore stdio processing */\n stdio?: 'pipe' | 'ignore' | ['pipe' | 'ignore' | 'inherit', 'pipe' | 'ignore' | 'inherit', 'pipe' | 'ignore' | 'inherit']\n \n /** `false` 是否断开和 child 的关系 (ignore stdio, unref) whether to break the connection with child (ignore stdio, unref) */\n detached?: boolean\n \n /** 为 true 时会设置 UV_PROCESS_WINDOWS_HIDE \n 然后设置启动进程的参数 CREATE_NO_WINDOW, 和 SW_HIDE \n d:/0/libuv/src/win/process.c \n CREATE_NO_WINDOW:\n The process is a console application that is being run without a console window. \n Therefore, the console handle for the application is not set.\n This flag is ignored if the application is not a console application, or \n if it is used with either CREATE_NEW_CONSOLE or DETACHED_PROCESS.\n \n 具体有什么用还不清楚\n */\n window?: boolean\n}\n\n/** start process \n - exe: .exe 路径或文件名 (建议使用完整路径,跳过 path 搜索,性能更高) path or filename (full path is recommanded to skip path searching for better perf)\n - args: `[]` 参数列表 arguments list\n - options\n - cwd?: `fp_root`\n - env?: `process.env` 覆盖/添加到 process.env 的环境变量 overwrite/add to process.env\n - encoding?: `'utf-8'` 子进程输出编码 child output encoding\n - print?: `true` print 选项,支持设置细项 print option (with details)\n - stdio?: `'pipe'` 设置为 'ignore' 时忽略 stdio 处理 when 'ignore' then ignore stdio processing\n - detached?: `false` 是否断开和 child 的关系 (ignore stdio, unref) whether to break the connection with child (ignore stdio, unref)\n*/\nexport async function start (exe: string, args: string[] = [ ], {\n cwd,\n \n encoding = 'utf-8',\n \n print = true,\n \n stdio = 'pipe',\n \n detached = false,\n \n env,\n \n window: _window = true,\n}: StartOptions = { }): Promise<ChildProcess> {\n const options: SpawnOptions = {\n cwd,\n shell: false,\n windowsHide: !_window,\n stdio,\n ... env ? {\n env: { ...process.env, ...env }\n } : { },\n }\n \n if (typeof print === 'boolean')\n print = {\n stdout: print,\n stderr: print,\n command: print,\n code: print,\n }\n \n if (typeof stdio === 'string')\n stdio = [stdio, stdio, stdio]\n \n if (print.command)\n console.log((\n (exe === exe_winterm ? 'term.exe' : exe) + ' ' +\n (args.filter(arg => \n arg !== '--suppressApplicationTitle'\n ).map(arg =>\n arg.includes(' ') ? \n arg.quote()\n :\n arg\n ).join(' ')\n )\n ).blue)\n \n if (detached) {\n let child = spawn(exe, args, {\n ...options,\n stdio: 'ignore',\n detached: true,\n })\n \n child.unref()\n return child\n }\n \n let child = spawn(exe, args, options)\n \n // 防止 child spawn 失败时 crash nodejs 进程\n child.on('error', error => {\n console.error(error)\n })\n \n if (stdio[0] === 'pipe')\n child.stdin.setDefaultEncoding('utf8')\n \n if (\n stdio.every(s => \n s === 'ignore')\n )\n return child\n \n if (encoding !== 'binary') {\n if (stdio[1] === 'pipe') {\n if (encoding === 'utf-8')\n child.stdout.setEncoding('utf-8')\n else\n child.stdout = child.stdout.pipe(\n iconv.decodeStream(encoding)\n ) as any as Readable\n \n if (print.stdout)\n child.stdout.pipe(process.stdout, { end: false })\n }\n \n if (stdio[2] === 'pipe') {\n if (encoding === 'utf-8')\n child.stderr.setEncoding('utf-8')\n else\n child.stderr = child.stderr.pipe(\n iconv.decodeStream(encoding)\n ) as any as Readable\n \n if (print.stderr)\n child.stderr.pipe(process.stderr, { end: false })\n }\n }\n \n return child\n}\n\n\nexport interface CallOptions extends StartOptions {\n throw_code?: boolean\n input?: string\n}\n\nexport interface CallResult <T = string> {\n pid: number\n stdout: T\n stderr: T\n code: number | null\n signal: NodeJS.Signals | null\n child: ChildProcess\n [inspect.custom] (): string\n}\n\n\n/** call process for result\n - exe: .exe 路径或文件名 (建议使用路径,跳过 path 搜索,性能更高) path or filename (full path is recommanded to skip path searching for better perf)\n - args: `[]` 参数列表 arguments list\n - options?:\n - cwd?: `'d:/'`\n - env?: `process.env` 覆盖/添加到 process.env 的环境变量 overwrite/add to process.env\n - encoding?: `'utf-8'` 子进程输出编码 child output encoding\n - print?: `true` print 选项,支持设置细项 print option (with details)\n - stdio?: `'pipe'` 设置为 'ignore' 时忽略 stdio 处理 when 'ignore' then ignore stdio processing\n - input?: string, start 子进程之后写入到子进程 stdin 中的内容 After starting the sub-process, write to the content of the sub-process STDIN\n - detached?: `false` 是否断开和 child 的关系 (ignore stdio, unref) whether to break the connection with child (ignore stdio, unref)\n - throw_code?: `true` code 不为 0 时是否抛出异常 whether to throw Error when code is not 0\n*/\nexport async function call (exe: string, args?: string[]): Promise<CallResult<string>>\nexport async function call (exe: string, args?: string[], options?: CallOptions & { encoding?: 'utf-8' | 'gb18030' }): Promise<CallResult<string>>\nexport async function call (exe: string, args?: string[], options?: CallOptions & { encoding: 'binary' }): Promise<CallResult<Buffer>>\nexport async function call (exe: string, args: string[] = [ ], options: CallOptions = { }): Promise<CallResult<string | Buffer>> {\n const {\n encoding = 'utf-8', \n throw_code = true,\n input,\n } = options\n \n let {\n stdio = 'pipe',\n print = true\n } = options\n \n if (typeof print === 'boolean')\n print = {\n command: print,\n stdout: print,\n stderr: print,\n code: print,\n }\n \n if (typeof stdio === 'string')\n stdio = [stdio, stdio, stdio]\n \n const cmd = \n (exe.includes(' ') ? exe.quote() : exe) + \n (args.length ? (\n ' ' + args.map(arg => \n arg.includes(' ') ? arg.quote() : arg\n ).join(' '))\n :\n '')\n \n if (print.command)\n console.log(cmd.blue)\n \n let child = await start(exe, args, {\n ...options,\n print: false,\n })\n \n if (input)\n child.stdin.write(input)\n \n // --- collect output\n let stdouts: (string | Buffer)[] = [ ]\n let stderrs: (string | Buffer)[] = [ ]\n \n let code: number | null, \n signal: NodeJS.Signals\n \n await Promise.all([\n new Promise<void>(resolve => {\n child.once('exit', (_code, _signal) => {\n code = _code\n signal = _signal\n resolve()\n })\n }),\n (async () => {\n if (stdio[1] === 'pipe')\n for await (const chunk of child.stdout as AsyncIterable<string | Buffer>) {\n if (encoding !== 'binary' && print.stdout)\n process.stdout.write(chunk)\n stdouts.push(chunk)\n }\n })(),\n (async () => {\n if (stdio[2] === 'pipe')\n for await (const chunk of child.stderr as AsyncIterable<string | Buffer>) {\n if (encoding !== 'binary' && print.stderr)\n process.stderr.write(chunk)\n stderrs.push(chunk)\n }\n })()\n ])\n \n const message = `${t('进程')} ${cmd} ` + (\n code ? \n `(pid: ${child.pid}) ${t('异常结束, 错误码:')} ${code}${ signal ? `, ${t('信号:')} ${ signal }` : '' }`\n :\n t('正常结束'))\n \n if (print.code || code || signal)\n console.log(message[code || signal ? 'red' : 'blue'])\n \n const result = {\n pid: child.pid,\n \n stdout: encoding === 'binary' ?\n Buffer.concat(stdouts as Buffer[])\n :\n (stdouts as string[]).join(''),\n \n stderr: encoding === 'binary' ?\n Buffer.concat(stderrs as Buffer[])\n :\n (stderrs as string[]).join(''),\n \n code,\n \n signal,\n \n child,\n \n [inspect.custom] () {\n return inspect(this, { omit: ['child'] })\n }\n }\n \n if (code && throw_code)\n throw Object.assign(\n new Error(message), \n result\n )\n \n return result\n}\n\n\n/** call node <js> for result\n - js: .js 路径 (相对路径根据 cwd 解析) path (relative path will resolve based on cwd)\n - args: `[]` 参数列表 arguments list\n - options\n - cwd?: `'d:/'`\n - env?: `process.env` 覆盖/添加到 process.env 的环境变量 overwrite/add to process.env\n - encoding?: `'utf-8'` 子进程输出编码 child process output encoding\n - print?: `true` print 选项,支持设置细项 print option (with details)\n - stdio?: `'pipe'` 设置为 'ignore' 时忽略 stdio 处理 when 'ignore' then ignore stdio processing\n - detached?: `false` 是否断开和 child 的关系 (ignore stdio, unref) whether to break the connection with child (ignore stdio, unref)\n - throw_code?: `true` code 不为 0 时是否抛出异常 whether to throw Error when code is not 0\n*/\nexport async function call_node (js: string, args: string[] = [], options?: CallOptions & { encoding?: 'utf-8' | 'gb18030' }) {\n return call(exe_node, [js, ...args], options)\n}\n\n\n// ------------------------------------ term\ninterface TermOptions {\n /** `d:/t/` */\n cwd?: string\n \n /** `false` 打印参数 */\n print?: boolean\n \n title?: string\n \n // 不支持 background, 在 WinTerm 中后台创建标签页,而非创建并切换到该标签页\n // 不支持 icon\n // 不支持 env, WindowsTerminal 在调用 CreateProcess API 时没有传入 env\n}\n\nexport const exe_winterm = `C:/Users/${userInfo().username}/AppData/Local/Microsoft/WindowsApps/wt.exe`\n\n/** 新建 terminal 窗口执行进程 New Terminal window execution process\n - exe: exe 文件路径 exe file path\n - args: 调用参数 call parameter\n - options?: WinTermOptions\n*/\nexport function term (exe: string, args: string[] = [], {\n cwd = 'd:/t/',\n \n print = true,\n \n title,\n \n // env\n}: TermOptions = { }) {\n \n \n return start(\n exe_winterm,\n [\n 'new-tab',\n \n '-d', cwd,\n \n ... title ? ['--suppressApplicationTitle', '--title', title] : [ ],\n \n exe,\n \n ...args.map(arg => \n arg.replaceAll(';', '\\\\;')), \n ],\n {\n print,\n detached: true,\n cwd,\n // env\n }\n )\n}\n\n\nexport interface TermNodeOptions extends TermOptions {\n /** nodejs debugger port */\n inspect?: number\n \n /** break at first line */\n break?: boolean\n \n /** 使用 ts-node 直接运行 use ts-node to run directly */\n tsnode?: boolean\n \n /** `false` --experimental-specifier-resolution=node */\n resolve?: boolean\n \n /** `false` --trace-warnings */\n trace_warnings?: boolean\n}\n\n\n/** 在 term tab 中创建 node.exe 进程 create the node.exe process in term tab */\nexport async function term_node (\n fp_js: string, \n args: string[] = [ ],\n {\n title, \n inspect, \n tsnode = false,\n break: _break,\n resolve = false,\n trace_warnings = false,\n ..._options\n }: TermNodeOptions = { }\n) {\n return term(exe_node, [\n ... trace_warnings ? ['--trace-warnings'] : [ ],\n ... resolve ? ['--experimental-specifier-resolution=node'] : [ ],\n ... title ? [`--title=${title}`] : [ ],\n ... inspect ? [\n _break ? `--inspect-brk=0.0.0.0:${inspect}` : `--inspect=0.0.0.0:${inspect}`\n ] : [ ],\n ... tsnode ? [\n '--loader=ts-node/esm',\n '--experimental-specifier-resolution=node'\n ] : [ ],\n fp_js,\n ... args\n ], {\n title,\n ..._options,\n })\n}\n\n\n\n"]}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["process.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n spawn,\n type SpawnOptions,\n type ChildProcess\n} from 'child_process'\nimport { Readable } from 'stream'\nimport { userInfo } from 'os'\n\nimport iconv from 'iconv-lite'\n\nimport { t } from './i18n/instance.js'\n\nimport './prototype.js'\nimport { Encoding } from './file.js'\nimport { inspect } from './utils.js'\n\n\nexport const exe_nodejs = process.execPath.to_slash()\n\n\n// ------------------------------------ start & call\ninterface StartOptions {\n /** `继承当前工作目录 process.cwd()` 子进程的工作目录 `inherit the cwd` cwd of the child process. */\n cwd?: string\n \n /** `process.env` 覆盖/添加到 process.env 的环境变量 overwrite/add to process.env */\n env?: Record<string, string>\n \n /** `'utf-8'` 子进程输出编码 child output encoding */\n encoding?: Encoding\n \n /** `true` print 选项,支持设置细项 print option (with details) */\n print?: boolean | {\n stdout: boolean\n stderr: boolean\n command: boolean\n code: boolean\n }\n \n /** `'pipe'` 设置为 'ignore' 时忽略 stdio 处理 when 'ignore' then ignore stdio processing */\n stdio?: 'pipe' | 'ignore' | ['pipe' | 'ignore' | 'inherit', 'pipe' | 'ignore' | 'inherit', 'pipe' | 'ignore' | 'inherit']\n \n /** `false` 是否断开和 child 的关系 (ignore stdio, unref) whether to break the connection with child (ignore stdio, unref) */\n detached?: boolean\n \n /** 为 true 时会设置 UV_PROCESS_WINDOWS_HIDE \n 然后设置启动进程的参数 CREATE_NO_WINDOW, 和 SW_HIDE \n d:/0/libuv/src/win/process.c \n CREATE_NO_WINDOW:\n The process is a console application that is being run without a console window. \n Therefore, the console handle for the application is not set.\n This flag is ignored if the application is not a console application, or \n if it is used with either CREATE_NEW_CONSOLE or DETACHED_PROCESS.\n \n 具体有什么用还不清楚\n */\n window?: boolean\n}\n\n/** start process \n - exe: .exe 路径或文件名 (建议使用完整路径,跳过 path 搜索,性能更高) path or filename (full path is recommanded to skip path searching for better perf)\n - args: `[]` 参数列表 arguments list\n - options\n - cwd?: `fp_root`\n - env?: `process.env` 覆盖/添加到 process.env 的环境变量 overwrite/add to process.env\n - encoding?: `'utf-8'` 子进程输出编码 child output encoding\n - print?: `true` print 选项,支持设置细项 print option (with details)\n - stdio?: `'pipe'` 设置为 'ignore' 时忽略 stdio 处理 when 'ignore' then ignore stdio processing\n - detached?: `false` 是否断开和 child 的关系 (ignore stdio, unref) whether to break the connection with child (ignore stdio, unref)\n*/\nexport async function start (exe: string, args: string[] = [ ], {\n cwd,\n \n encoding = 'utf-8',\n \n print = true,\n \n stdio = 'pipe',\n \n detached = false,\n \n env,\n \n window: _window = true,\n}: StartOptions = { }): Promise<ChildProcess> {\n const options: SpawnOptions = {\n cwd,\n shell: false,\n windowsHide: !_window,\n stdio,\n ... env ? {\n env: { ...process.env, ...env }\n } : { },\n }\n \n if (typeof print === 'boolean')\n print = {\n stdout: print,\n stderr: print,\n command: print,\n code: print,\n }\n \n if (typeof stdio === 'string')\n stdio = [stdio, stdio, stdio]\n \n if (print.command)\n console.log((\n (short_exe_names[exe] || (exe.includes(' ') ? exe.quote() : exe)) +\n (args.length ? \n ' ' + args.filter(arg => arg !== '--suppressApplicationTitle')\n .map(arg => arg.includes(' ') ? arg.quote() : arg)\n .join(' ')\n :\n '')\n ).blue)\n \n if (detached) {\n let child = spawn(exe, args, {\n ...options,\n stdio: 'ignore',\n detached: true,\n })\n \n child.unref()\n return child\n }\n \n let child = spawn(exe, args, options)\n \n // 防止 child spawn 失败时 crash nodejs 进程\n child.on('error', error => {\n console.error(error)\n })\n \n if (stdio[0] === 'pipe')\n child.stdin.setDefaultEncoding('utf8')\n \n if (\n stdio.every(s => \n s === 'ignore')\n )\n return child\n \n if (encoding !== 'binary') {\n if (stdio[1] === 'pipe') {\n if (encoding === 'utf-8')\n child.stdout.setEncoding('utf-8')\n else\n child.stdout = child.stdout.pipe(\n iconv.decodeStream(encoding)\n ) as any as Readable\n \n if (print.stdout)\n child.stdout.pipe(process.stdout, { end: false })\n }\n \n if (stdio[2] === 'pipe') {\n if (encoding === 'utf-8')\n child.stderr.setEncoding('utf-8')\n else\n child.stderr = child.stderr.pipe(\n iconv.decodeStream(encoding)\n ) as any as Readable\n \n if (print.stderr)\n child.stderr.pipe(process.stderr, { end: false })\n }\n }\n \n return child\n}\n\n\nexport interface CallOptions extends StartOptions {\n throw_code?: boolean\n input?: string\n}\n\nexport interface CallResult <T = string> {\n pid: number\n stdout: T\n stderr: T\n code: number | null\n signal: NodeJS.Signals | null\n child: ChildProcess\n [inspect.custom] (): string\n}\n\n\n/** call process for result\n - exe: .exe 路径或文件名 (建议使用路径,跳过 path 搜索,性能更高) path or filename (full path is recommanded to skip path searching for better perf)\n - args: `[]` 参数列表 arguments list\n - options?:\n - cwd?: `'d:/'`\n - env?: `process.env` 覆盖/添加到 process.env 的环境变量 overwrite/add to process.env\n - encoding?: `'utf-8'` 子进程输出编码 child output encoding\n - print?: `true` print 选项,支持设置细项 print option (with details)\n - stdio?: `'pipe'` 设置为 'ignore' 时忽略 stdio 处理 when 'ignore' then ignore stdio processing\n - input?: string, start 子进程之后写入到子进程 stdin 中的内容 After starting the sub-process, write to the content of the sub-process STDIN\n - detached?: `false` 是否断开和 child 的关系 (ignore stdio, unref) whether to break the connection with child (ignore stdio, unref)\n - throw_code?: `true` code 不为 0 时是否抛出异常 whether to throw Error when code is not 0\n*/\nexport async function call (exe: string, args?: string[]): Promise<CallResult<string>>\nexport async function call (exe: string, args?: string[], options?: CallOptions & { encoding?: 'utf-8' | 'gb18030' }): Promise<CallResult<string>>\nexport async function call (exe: string, args?: string[], options?: CallOptions & { encoding: 'binary' }): Promise<CallResult<Buffer>>\nexport async function call (exe: string, args: string[] = [ ], options: CallOptions = { }): Promise<CallResult<string | Buffer>> {\n const {\n encoding = 'utf-8', \n throw_code = true,\n input,\n } = options\n \n let {\n stdio = 'pipe',\n print = true\n } = options\n \n if (typeof print === 'boolean')\n print = {\n command: print,\n stdout: print,\n stderr: print,\n code: print,\n }\n \n if (typeof stdio === 'string')\n stdio = [stdio, stdio, stdio]\n \n const cmd = \n (short_exe_names[exe] || (exe.includes(' ') ? exe.quote() : exe)) + \n (args.length ? (\n ' ' + args.map(arg => arg.includes(' ') ? arg.quote() : arg)\n .join(' '))\n :\n '')\n \n if (print.command)\n console.log(cmd.blue)\n \n let child = await start(exe, args, {\n ...options,\n print: false,\n })\n \n if (input)\n child.stdin.write(input)\n \n // --- collect output\n let stdouts: (string | Buffer)[] = [ ]\n let stderrs: (string | Buffer)[] = [ ]\n \n let code: number | null, \n signal: NodeJS.Signals\n \n await Promise.all([\n new Promise<void>(resolve => {\n child.once('exit', (_code, _signal) => {\n code = _code\n signal = _signal\n resolve()\n })\n }),\n (async () => {\n if (stdio[1] === 'pipe')\n for await (const chunk of child.stdout as AsyncIterable<string | Buffer>) {\n if (encoding !== 'binary' && print.stdout)\n process.stdout.write(chunk)\n stdouts.push(chunk)\n }\n })(),\n (async () => {\n if (stdio[2] === 'pipe')\n for await (const chunk of child.stderr as AsyncIterable<string | Buffer>) {\n if (encoding !== 'binary' && print.stderr)\n process.stderr.write(chunk)\n stderrs.push(chunk)\n }\n })()\n ])\n \n const message = `${t('进程')} ${cmd} ` + (\n code ? \n `(pid: ${child.pid}) ${ throw_code ? t('异常结束') : t('结束') }, code: ${code}${ signal ? `, signal: ${ signal }` : '' }`\n :\n t('正常结束'))\n \n if (print.code || (throw_code && (code || signal)))\n console.log(message[(throw_code && (code || signal)) ? 'red' : 'blue'])\n \n const result = {\n pid: child.pid,\n \n stdout: encoding === 'binary' ?\n Buffer.concat(stdouts as Buffer[])\n :\n (stdouts as string[]).join(''),\n \n stderr: encoding === 'binary' ?\n Buffer.concat(stderrs as Buffer[])\n :\n (stderrs as string[]).join(''),\n \n code,\n \n signal,\n \n child,\n \n [inspect.custom] () {\n return inspect(this, { omit: ['child'] })\n }\n }\n \n if (code && throw_code)\n throw Object.assign(\n new Error(message), \n result\n )\n \n return result\n}\n\n\n/** call node <js> for result\n - js: .js 路径 (相对路径根据 cwd 解析) path (relative path will resolve based on cwd)\n - args: `[]` 参数列表 arguments list\n - options\n - cwd?: `'d:/'`\n - env?: `process.env` 覆盖/添加到 process.env 的环境变量 overwrite/add to process.env\n - encoding?: `'utf-8'` 子进程输出编码 child process output encoding\n - print?: `true` print 选项,支持设置细项 print option (with details)\n - stdio?: `'pipe'` 设置为 'ignore' 时忽略 stdio 处理 when 'ignore' then ignore stdio processing\n - detached?: `false` 是否断开和 child 的关系 (ignore stdio, unref) whether to break the connection with child (ignore stdio, unref)\n - throw_code?: `true` code 不为 0 时是否抛出异常 whether to throw Error when code is not 0\n*/\nexport async function call_nodejs (js: string, args: string[] = [], options?: CallOptions & { encoding?: 'utf-8' | 'gb18030' }) {\n return call(exe_nodejs, [js, ...args], options)\n}\n\n\n// ------------------------------------ term\nexport interface TermOptions {\n /** `d:/t/` */\n cwd?: string\n \n /** `true` 打印参数 */\n print?: boolean\n \n title?: string\n \n // 不支持 background, 在 WinTerm 中后台创建标签页,而非创建并切换到该标签页\n // 不支持 icon\n // 不支持 env, WindowsTerminal 在调用 CreateProcess API 时没有传入 env\n}\n\nexport const exe_winterm = `C:/Users/${userInfo().username}/AppData/Local/Microsoft/WindowsApps/wt.exe`\n\n/** 新建 terminal 窗口执行进程 New Terminal window execution process\n - exe: exe 文件路径 exe file path\n - args: 调用参数 call parameter\n - options?: WinTermOptions\n*/\nexport function term (exe: string, args: string[] = [], {\n cwd = 'd:/t/',\n \n print = true,\n \n title,\n \n // env\n}: TermOptions = { }) {\n \n \n return start(\n exe_winterm,\n [\n 'new-tab',\n \n '-d', cwd,\n \n ... title ? ['--suppressApplicationTitle', '--title', title] : [ ],\n \n exe,\n \n ...args.map(arg => \n arg.replaceAll(';', '\\\\;')), \n ],\n {\n print,\n detached: true,\n cwd,\n // env\n }\n )\n}\n\n\nexport interface TermNodeOptions extends TermOptions {\n /** nodejs debugger port */\n inspect?: number\n \n /** break at first line */\n break?: boolean\n \n /** 使用 ts-node 直接运行 use ts-node to run directly */\n tsnode?: boolean\n \n /** `false` --experimental-specifier-resolution=node */\n resolve?: boolean\n \n /** `false` --trace-warnings */\n trace_warnings?: boolean\n}\n\n\n/** 在 term tab 中创建 node.exe 进程 create the node.exe process in term tab */\nexport async function term_nodejs (\n fp_js: string, \n args: string[] = [ ],\n {\n title, \n inspect, \n tsnode = false,\n break: _break,\n resolve = false,\n trace_warnings = false,\n ..._options\n }: TermNodeOptions = { }\n) {\n return term(exe_nodejs, [\n ... trace_warnings ? ['--trace-warnings'] : [ ],\n ... resolve ? ['--experimental-specifier-resolution=node'] : [ ],\n ... title ? [`--title=${title}`] : [ ],\n ... inspect ? [\n _break ? `--inspect-brk=0.0.0.0:${inspect}` : `--inspect=0.0.0.0:${inspect}`\n ] : [ ],\n ... tsnode ? [\n '--loader=ts-node/esm',\n '--experimental-specifier-resolution=node'\n ] : [ ],\n fp_js,\n ... args\n ], {\n title,\n ..._options,\n })\n}\n\n\nconst short_exe_names = {\n [exe_winterm]: 'term.exe',\n [exe_nodejs]: 'node.exe'\n} as const\n\n"]}
@@ -2,7 +2,7 @@ export declare function assert(assertion: any, message?: string): never | void;
2
2
  export declare function delay(milliseconds: number): Promise<void>;
3
3
  export declare function debug(milliseconds?: number): Promise<void>;
4
4
  /** 字符串字典序比较 */
5
- export declare function strcmp(l: string, r: string): 1 | -1 | 0;
5
+ export declare function strcmp(l: string, r: string): 0 | 1 | -1;
6
6
  /** 拼接 TypedArrays 生成一个完整的 Uint8Array */
7
7
  export declare function concat(arrays: ArrayBufferView[]): Uint8Array;
8
8
  /** 时间间隔 (milliseconds) 格式化 */
package/utils.d.ts CHANGED
@@ -17,7 +17,7 @@ export declare function unique<T>(iterable: T[] | Iterable<T>, selector?: string
17
17
  /** 排序对象中 key 的顺序,返回新的对象 */
18
18
  export declare function sort_keys<T>(obj: T): T;
19
19
  /** 字符串字典序比较 */
20
- export declare function strcmp(l: string, r: string): 1 | -1 | 0;
20
+ export declare function strcmp(l: string, r: string): 0 | 1 | -1;
21
21
  /** 拼接 TypedArrays 生成一个完整的 Uint8Array */
22
22
  export declare function concat(arrays: ArrayBufferView[]): Uint8Array;
23
23
  export declare function typed_array_to_buffer(view: ArrayBufferView): Buffer;