xshell 0.0.25 → 0.0.29

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/i18n/dict.js CHANGED
@@ -9,9 +9,12 @@ class Dict {
9
9
  if (!key)
10
10
  return '';
11
11
  const item = this._dict[key];
12
- if (!item || !language)
13
- return item || '';
14
- return item[language] || '';
12
+ if (language)
13
+ return item ?
14
+ item[language] || ''
15
+ :
16
+ '';
17
+ return item;
15
18
  }
16
19
  to_resources() {
17
20
  return Object.entries(this._dict).reduce((acc, [key, item]) => {
package/i18n/dict.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dict.js","sourceRoot":"","sources":["dict.ts"],"names":[],"mappings":";;;AAEA,MAAa,IAAI;IAGb,YAAa,QAAe,EAAE;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC;IAID,GAAG,CAAE,GAAW,EAAE,QAAmB;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAA;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,IAAI,EAAE,CAAA;QACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC/B,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;AA9BD,oBA8BC;AAeD,kBAAe,IAAI,CAAA","sourcesContent":["import { Language } from './index'\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) return ''\n const item = this._dict[key]\n if (!item || !language) return item || ''\n return item[language] || ''\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\n\nexport default Dict\n"]}
1
+ {"version":3,"file":"dict.js","sourceRoot":"","sources":["dict.ts"],"names":[],"mappings":";;;AAEA,MAAa,IAAI;IAGb,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;AAeD,kBAAe,IAAI,CAAA","sourcesContent":["import { Language } from './index'\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\n\nexport default Dict\n"]}
@@ -44,9 +44,9 @@ export declare type Config = Partial<(typeof DEFAULT_CONFIG) & {
44
44
  lineEnding?: '\n';
45
45
  };
46
46
  }>;
47
- /** 扫描源码中的词条,以及收集未翻译的词条。生成 scanneds.json 和 untranslateds.json
48
- * rootdir 要扫描根目录 [ process.cwd() ]
49
- * config 配置信息
47
+ /** 扫描源码中的词条,以及收集未翻译的词条,将结果保存到 dict.json 和 untranslateds.json
48
+ - `process.cwd()` rootdir 要扫描根目录
49
+ - config 配置信息
50
50
  */
51
51
  export declare function scanner(rootdir?: string, config?: Config): void;
52
52
  export default scanner;
@@ -30,7 +30,7 @@ const DEFAULT_CONFIG = {
30
30
  // 相对于根目录
31
31
  output: 'i18n/',
32
32
  // 若是相对路径,则以 output 为基准进行解析
33
- dict: ['dict.json', 'scanneds.json'],
33
+ dict: ['dict.json', 'untranslateds.json'],
34
34
  lngs: ['zh', 'en', 'ja', 'ko'],
35
35
  ns: ['translation'],
36
36
  defaultLng: 'zh',
@@ -99,9 +99,9 @@ const DEFAULT_CONFIG = {
99
99
  }
100
100
  };
101
101
  const VALID_EXTENTIONS = new Set(['.js', '.jsx', '.ts', '.tsx', '.ejs']);
102
- /** 扫描源码中的词条,以及收集未翻译的词条。生成 scanneds.json 和 untranslateds.json
103
- * rootdir 要扫描根目录 [ process.cwd() ]
104
- * config 配置信息
102
+ /** 扫描源码中的词条,以及收集未翻译的词条,将结果保存到 dict.json 和 untranslateds.json
103
+ - `process.cwd()` rootdir 要扫描根目录
104
+ - config 配置信息
105
105
  */
106
106
  function scanner(rootdir = upath_1.default.normalize(process.cwd()), config = {}) {
107
107
  const output = upath_1.default.resolve(rootdir, config.output || DEFAULT_CONFIG.output);
@@ -120,14 +120,19 @@ function scanner(rootdir = upath_1.default.normalize(process.cwd()), config = {}
120
120
  lineEnding: '\n'
121
121
  }
122
122
  };
123
- let dict = config.dict.reduce((dict, fp_dict) => dict.merge((0, utils_1.try_require)(upath_1.default.resolve(output, fp_dict)), { print: false, overwrite: true }), new rwdict_1.default());
123
+ let dict = new rwdict_1.default();
124
+ for (const fp_dict of config.dict)
125
+ dict.merge((0, utils_1.try_require)(upath_1.default.resolve(output, fp_dict)), { print: false, overwrite: true });
124
126
  let c_files = 0;
125
127
  let c_scanneds = 0;
126
128
  let errors = [];
127
- // 扫描出的词条及已有的翻译
128
- let scanneds = {};
129
129
  // 所有语言的扫描统计信息
130
- let stats = Object.fromEntries(index_1.LANGUAGES.map((language) => [language, { translateds: new Set(), untranslateds: new Set() }]));
130
+ let stats = {};
131
+ for (const language of index_1.LANGUAGES)
132
+ stats[language] = {
133
+ translateds: new Set(),
134
+ untranslateds: new Set()
135
+ };
131
136
  let spinner = (0, ora_1.default)({ interval: 66 }).start('Scanning...');
132
137
  function on_scanned(text, { language, key, defaultValue, count, context }) {
133
138
  // console.log(text, { language, key, defaultValue, count, context })
@@ -148,10 +153,6 @@ function scanner(rootdir = upath_1.default.normalize(process.cwd()), config = {}
148
153
  '';
149
154
  if (language === 'zh' && !context)
150
155
  return;
151
- scanneds[key] = {
152
- ...scanneds[key],
153
- [language]: translation
154
- };
155
156
  if (translation)
156
157
  stat.translateds.add(key);
157
158
  else
@@ -220,9 +221,9 @@ function scanner(rootdir = upath_1.default.normalize(process.cwd()), config = {}
220
221
  // ------------ 打印 cli 统计表
221
222
  const table = new cli_table3_1.default({
222
223
  head: [
223
- 'Language',
224
- 'Untranslated'.red,
225
- 'Translated'.green,
224
+ '语言',
225
+ '未翻译'.red,
226
+ '已翻译'.green,
226
227
  ],
227
228
  colAligns: ['right', 'right', 'right', 'right'],
228
229
  style: { head: [] },
@@ -294,28 +295,36 @@ function scanner(rootdir = upath_1.default.normalize(process.cwd()), config = {}
294
295
  }
295
296
  else
296
297
  console.log('\n所有词条都至少含有英文翻译.'.green);
297
- // ------------ 生成 scanneds.json
298
- const fp_scanneds = upath_1.default.resolve(config.output, 'scanneds.json');
299
- this.push(new_vinyl_file(fp_scanneds, scanneds));
298
+ // ------------ 生成 untranslateds.json (扫描到词条还没有英文翻译)
299
+ const fp_untranslateds = upath_1.default.resolve(config.output, 'untranslateds.json');
300
+ let untranslateds = {};
301
+ for (const key of stats.en.untranslateds) {
302
+ let item = { ...dict.get(key) };
303
+ item.en || (item.en = '');
304
+ item.ja || (item.ja = '');
305
+ item.ko || (item.ko = '');
306
+ untranslateds[key] = item;
307
+ }
308
+ this.push(new_vinyl_file(fp_untranslateds, untranslateds));
300
309
  // ------------ 写入 dict.json
301
310
  const fp_dict_new = upath_1.default.resolve(output, 'dict.json');
302
311
  this.push(new_vinyl_file(fp_dict_new, dict.to_json(true) + '\n'));
303
- console.log(`\n\n${'⚠️ 请检查扫描结果'.yellow} ${fp_scanneds.underline.blue} ${'和新生成的词典文件'.yellow} ${fp_dict_new.underline.blue}`);
304
- console.log('\n请手动补全扫描结果 scanneds.json 中未翻译的词条'.yellow);
305
- console.log('\n');
306
- console.log('通过以上方法补充翻译后重新运行扫描,会根据 scanneds.json 更新 dict.json'.yellow);
307
- console.log('最后 dict.json 所包含的词条会被打包进 js, 通过 new I18N(<dict.json>) 或 i18n.init(<dict.json>) 加载'.yellow);
308
- console.log();
309
- console.log(`${'详细文档请查看:'.yellow} ${'https://github.com/ShenHongFei/xshell/tree/master/i18n'.blue.underline}`);
312
+ console.log(`\n\n${'请手动补全未翻译的词条: '.yellow}${fp_untranslateds.underline.blue}\n` +
313
+ `${'请检查新生成的词典文件: '.yellow}${fp_dict_new.underline.blue}\n` +
314
+ '\n' +
315
+ '补全 untranslateds.json 后需要重新运行扫描,会根据 untranslateds.json 更新 dict.json\n'.yellow +
316
+ '最后 dict.json 所包含的词条会被打包进 js, 通过 new I18N(<dict.json>) 或 i18n.init(<dict.json>) 加载\n\n'.yellow +
317
+ `${'详细文档请查看: '.yellow}${'https://github.com/ShenHongFei/xshell/tree/master/i18n'.blue.underline}`);
310
318
  cb();
311
319
  }))
312
320
  // 写入词条文件
313
321
  .pipe(vinyl_fs_1.default.dest(rootdir))
314
322
  .on('end', () => {
315
- errors.forEach(errorHandler => errorHandler());
323
+ for (const error_handler of errors)
324
+ error_handler();
316
325
  if (!errors.length)
317
326
  return;
318
- console.log('https://www.i18next.com/translation-function/essentials\n以上错误可能是由不规范的词条标记导致,标记规范可见:%s', ''.blue.underline);
327
+ console.log(`以上错误可能是由不规范的词条标记导致,标记规范可见:\n${'https://www.i18next.com/translation-function/essentials'.blue.underline}`);
319
328
  });
320
329
  }
321
330
  exports.scanner = scanner;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import i18n_scanner from 'i18next-scanner'\nimport path from 'upath'\nimport ejs from 'ejs'\nimport vfs from 'vinyl-fs'\nimport map from 'map-stream'\nimport sort from 'gulp-sort'\nimport ora from 'ora'\nimport cli_truncate from 'cli-truncate'\nimport Vinyl from 'vinyl'\nimport through2 from 'through2'\nimport CliTable from 'cli-table3'\nimport type { Transform } from 'stream'\n\nimport { LANGUAGES } from '../index'\nimport type { Language } from '../index'\nimport Dict from '../rwdict'\nimport type { _Dict } from '../dict'\nimport { try_require } from '../utils'\n\nimport '../../prototype.js'\n\nimport { mix_parse_trans_from_string_by_babel } from './parser'\n\n\n\n/** 默认 i18next 扫描配置 */\nconst DEFAULT_CONFIG = {\n debug: false,\n \n input: [\n // 'src/**/*.{js,jsx,ts,tsx}',\n '!i18n/**', // Use ! to filter out files or directories\n '!node_modules/**',\n '!**/*.d.ts',\n ],\n \n // 相对于根目录\n output: 'i18n/',\n \n // 若是相对路径,则以 output 为基准进行解析\n dict: ['dict.json', 'scanneds.json'],\n \n lngs: ['zh', 'en', 'ja', 'ko'],\n ns: ['translation'],\n defaultLng: 'zh',\n defaultNs: 'translation',\n\n func: {\n list: [ 'i18next.t', 'i18n.t', 'i18n.__', 't', '__' ],\n extensions: [ ], // 避免在 transform 中执行原生的 parseFuncFromString\n },\n \n trans: {\n extensions: [ ], // 避免在 transform 中执行原生的 parseTransFromString\n fallbackKey: true,\n \n babylon: {\n sourceType: 'module',\n \n allowAwaitOutsideFunction: true,\n \n // https://babeljs.io/docs/en/babel-parser\n plugins: [\n // Language extensions\n 'jsx',\n 'typescript',\n \n // ECMAScript proposals\n 'classProperties',\n 'classPrivateProperties',\n 'classPrivateMethods',\n 'classStaticBlock',\n 'decimal',\n ['decorators', { decoratorsBeforeExport: true }],\n 'doExpressions',\n 'exportDefaultFrom',\n 'functionBind',\n 'importAssertions',\n 'moduleBlocks',\n 'moduleStringNames',\n 'partialApplication',\n ['pipelineOperator', { proposal: 'smart' }],\n 'privateIn',\n ['recordAndTuple', { syntaxType: 'bar' }],\n 'throwExpressions',\n 'topLevelAwait',\n ],\n } as import('@babel/parser').ParserOptions,\n \n // 实际并没有用到 acorn, 用了 babel\n acorn: {\n ecmaVersion: 'latest',\n sourceType: 'module', // defaults to 'module'\n // Check out https://github.com/acornjs/acorn/tree/master/acorn#interface for additional options\n }\n },\n \n // 禁用 : 和 . 作为 seperator\n keySeparator: false, // char to separate keys\n nsSeparator: false, // char to split namespace from key\n \n // Context Form\n context: true, // whether to add context form key\n contextFallback: true, // whether to add a fallback key as well as the context form key\n contextSeparator: '_', // char to split context from key\n\n // Plural\n // whether to add plural form key\n plural (language: string, ns: string, key: string, options: any /** Config */) {\n return language === 'en'\n }, \n pluralFallback: true, // whether to add a fallback key as well as the plural form key\n pluralSeparator: '_', // char to split plural from key\n \n // interpolation options\n interpolation: {\n prefix: '{{', // prefix for interpolation\n suffix: '}}' // suffix for interpolation\n }\n}\n\nconst VALID_EXTENTIONS = new Set(['.js', '.jsx', '.ts', '.tsx', '.ejs'])\n\nexport type Config = Partial<(typeof DEFAULT_CONFIG) & {\n defaultValue?: string\n resource?: { loadPath?: string, savePath?: string, jsonIndent?: number, lineEnding?: '\\n' }\n}>\n\n\n/** 扫描源码中的词条,以及收集未翻译的词条。生成 scanneds.json 和 untranslateds.json\n* rootdir 要扫描根目录 [ process.cwd() ]\n* config 配置信息\n*/\nexport function scanner (rootdir: string = path.normalize(process.cwd()), config: Config = { }) {\n const output = path.resolve(rootdir, config.output || DEFAULT_CONFIG.output)\n \n if (!config.input.length)\n throw new Error('运行 i18n-scan 请指定 --input')\n \n const input = [...config.input, ...DEFAULT_CONFIG.input]\n \n config = {\n ...DEFAULT_CONFIG,\n ...config,\n input,\n output,\n resource: {\n loadPath: '',\n savePath: path.resolve(output, 'translation/{{lng}}.js'),\n jsonIndent: 4,\n lineEnding: '\\n'\n }\n }\n \n \n let dict = config.dict.reduce( (dict, fp_dict) => \n dict.merge( try_require( path.resolve(output, fp_dict)), { print: false, overwrite: true }),\n new Dict())\n \n let c_files = 0\n let c_scanneds = 0\n let errors = []\n \n // 扫描出的词条及已有的翻译\n let scanneds: _Dict = { }\n \n // 所有语言的扫描统计信息\n let stats = Object.fromEntries(\n LANGUAGES.map( (language) => [language, { translateds: new Set<string>(), untranslateds: new Set<string>() }])\n )\n \n let spinner = ora({ interval: 66 }).start('Scanning...')\n \n \n \n function on_scanned (text: string, { language, key, defaultValue, count, context }: { language?: Language, key?: string, defaultValue?: string, count?: number, context?: string }) {\n // console.log(text, { language, key, defaultValue, count, context })\n \n text = text || defaultValue\n \n if (!key)\n key = context ? `${text}_${context}` : text\n \n if (!language) {\n for (const language of LANGUAGES)\n on_scanned(text, { language, key, count, context })\n return\n }\n \n // console.log(text, { language, key, defaultValue, count, context })\n // debugger\n \n const stat = stats[language]\n \n // 获取已有翻译\n const translation = \n dict.get(key, language) || \n language === 'zh' && text || \n ''\n \n if (language === 'zh' && !context) return\n \n scanneds[key] = {\n ... scanneds[key],\n [language]: translation\n }\n \n if (translation)\n stat.translateds.add(key)\n else\n stat.untranslateds.add(key)\n \n if (language === 'en' && count !== undefined)\n on_scanned(text, { language, key: `${key}_plural`, context })\n }\n \n \n function new_vinyl_file (_path: string, data: string | object) {\n return new Vinyl({\n cwd: rootdir,\n base: rootdir,\n path: path.resolve(config.output, _path),\n contents: Buffer.from(typeof data === 'string' ? data : JSON.stringify(data, null, 4))\n })\n }\n \n \n // ------------ scan by file\n vfs\n .src(config.input, { cwd: rootdir, sync: false })\n \n // 每个文件扫描前,统计文件数量\n .pipe(\n map( (file: Vinyl, cb: Function, count: number) => {\n // 支持 `// @i18n-noscan` 忽略扫描\n if (/\\/\\/\\s*@i18n-noscan\\s/.test(file.contents.toString())) return cb()\n c_files++\n cb(null, file)\n })\n )\n \n // 对文件进行排序,保证词条有一定的顺序\n .pipe( sort() )\n \n // 分析代码提取词条\n .pipe(\n i18n_scanner.createStream( config, function transform (this: { parser: any }, file: Vinyl, encoding: string, callback: Function): void {\n const { parser } = this\n const ext = path.extname(file.path)\n \n // 只扫描源码文件\n if (!VALID_EXTENTIONS.has(ext)) {\n callback()\n return\n }\n \n c_scanneds++\n const percent = Math.round( (100 * c_scanneds) / c_files )\n const text = `Scanning (${percent}%): ${file.path.green}`\n spinner.text = cli_truncate(text, process.stdout.columns - 5, { position: 'middle', })\n \n let code = file.contents.toString()\n \n if (ext === '.ejs')\n code = ejs.compile( code, { filename: file.path, client: true, legacyInclude: true } as any ).toString()\n \n \n // --- 添加代码中扫描到的 i18n.t('key') 中的 key 到 parser\n // parser.parseFuncFromString 使用 esprima 来解析代码,esprima 仍然不支持 optional chaining !!\n parser.parseFuncFromString(code.replace(/\\?\\.\\[/g, '[').replace(/\\?\\.\\(/g, '(').replace(/\\?\\./g, '.'), on_scanned)\n \n // --- 添加代码中扫描到的 Trans 组件中的 key 到 parser\n if (ext === '.jsx' || ext === '.tsx') {\n // parser.parseTransFromString 使用 acorn 解析代码,不支持 TypeScript,添加 parser.parseTransFromStringByBabel\n mix_parse_trans_from_string_by_babel(parser)\n parser.parseTransFromStringByBabel(\n code,\n { filepath: file.path },\n on_scanned,\n (error: Error) => { errors.push(error) }\n )\n }\n \n setTimeout(callback, 0)\n })\n )\n \n // 创建词条文件\n .pipe(\n through2.obj(\n /** i18n-scanner 会把扫描结果以每个语言一个文件的形式提供,这里解析扫描结果\n * file: 翻译 resource 文件,其中 file.contents 包含翻译的扫描结果\n */\n function write (this: Transform, file: Vinyl, encoding: string, cb: Function) { cb() },\n \n /** 生成 stats.json, unmarkeds.md; 打印 untranslated / unmarkeds */\n function flush (this: Transform, cb: Function) {\n // ------------ stats.json\n this.push(new_vinyl_file('stats.json', \n Object.fromEntries(\n Object.entries(stats).map( ([l, { translateds, untranslateds }]) => \n [l, { translateds: Array.from(translateds), untranslateds: Array.from(untranslateds) }])\n )\n ))\n \n \n // ------------ 打印 cli 统计表\n const table = new CliTable({\n head: [\n 'Language',\n 'Untranslated'.red,\n 'Translated'.green,\n ],\n colAligns: ['right', 'right', 'right', 'right'],\n style: { head: [] },\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n })\n \n Object.entries(stats).forEach( ([lang, stat]) => {\n table.push([\n lang, \n String(stat.untranslateds.size).red, \n String(stat.translateds.size).green\n ] as any)\n })\n \n \n \n spinner.stop()\n console.log(`Scanned ${c_files} files. Occured ${errors.length} errors.`)\n console.log(table.toString())\n \n \n // ------------ 生成 unmarkeds.md 统计\n /*\n const fp_unmarked = path.resolve(config.output, 'unmarkeds.md')\n \n if (fs.existsSync(fp_unmarked))\n rimraf.sync(fp_unmarked)\n \n if (unmarkeds.length) {\n console.log(colors.yellow(`\\n⚠️ 发现未标记的中文字符 ${unmarkeds.length} 处:\\n`))\n unmarkeds.forEach(({ value, filepath, loc: { start } }, index) => {\n if (index >= 5) return\n console.log( ` ${colors.white(`'${value}'`)}\\t${colors.blue.underline(`${path.relative(rootdir, filepath)}:${start.line}:${start.column + 1}`)}` )\n })\n }\n \n this.push( new_vinyl_file( fp_unmarked, \n unmarkeds.map( ({ value, filepath, loc }) =>\n '- [' + value.trim() + '](' + path.relative( config.output, path.resolve(rootdir, filepath || '') ) + '#L' + loc.start.line + ')'\n ).join('\\n') + '\\n'\n ))\n \n \n if (unmarkeds.length > 5) {\n console.log(' ...')\n console.log(colors.yellow(`\\n 完整未标记词条请查看 ${colors.blue.underline(path.relative(rootdir, fp_unmarked))}`))\n }\n */\n \n const en_untranslateds = stats.en.untranslateds\n if (en_untranslateds.size) {\n console.log('\\n未翻译的英文词条:'.yellow)\n Array.from(en_untranslateds).slice(0, 10).forEach( untranslated => {\n console.log(untranslated)\n })\n if (en_untranslateds.size > 10) {\n console.log('...')\n console.log(`--- 共 ${en_untranslateds.size} 个未翻译的英文词条 ---`)\n }\n } else\n console.log('\\n所有词条都至少含有英文翻译.'.green)\n \n \n // ------------ 生成 scanneds.json\n const fp_scanneds = path.resolve(config.output, 'scanneds.json')\n this.push(\n new_vinyl_file(fp_scanneds, scanneds)\n )\n \n // ------------ 写入 dict.json\n const fp_dict_new = path.resolve(output, 'dict.json')\n this.push( new_vinyl_file( fp_dict_new, dict.to_json(true) + '\\n' ))\n \n console.log(`\\n\\n${'⚠️ 请检查扫描结果'.yellow} ${fp_scanneds.underline.blue} ${'和新生成的词典文件'.yellow} ${fp_dict_new.underline.blue}`)\n console.log('\\n请手动补全扫描结果 scanneds.json 中未翻译的词条'.yellow)\n console.log('\\n')\n console.log('通过以上方法补充翻译后重新运行扫描,会根据 scanneds.json 更新 dict.json'.yellow)\n console.log('最后 dict.json 所包含的词条会被打包进 js, 通过 new I18N(<dict.json>) 或 i18n.init(<dict.json>) 加载'.yellow)\n console.log()\n console.log(`${'详细文档请查看:'.yellow} ${'https://github.com/ShenHongFei/xshell/tree/master/i18n'.blue.underline}`)\n \n cb()\n }\n )\n )\n \n // 写入词条文件\n .pipe(\n vfs.dest(rootdir)\n )\n \n .on('end', () => {\n errors.forEach( errorHandler => errorHandler() )\n if (!errors.length) return\n console.log(\n 'https://www.i18next.com/translation-function/essentials\\n以上错误可能是由不规范的词条标记导致,标记规范可见:%s',\n ''.blue.underline\n )\n })\n}\n\nexport default scanner\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import i18n_scanner from 'i18next-scanner'\nimport path from 'upath'\nimport ejs from 'ejs'\nimport vfs from 'vinyl-fs'\nimport map from 'map-stream'\nimport sort from 'gulp-sort'\nimport ora from 'ora'\nimport cli_truncate from 'cli-truncate'\nimport Vinyl from 'vinyl'\nimport through2 from 'through2'\nimport CliTable from 'cli-table3'\nimport type { Transform } from 'stream'\n\nimport { LANGUAGES } from '../index'\nimport type { Language } from '../index'\nimport Dict from '../rwdict'\nimport type { _Dict } from '../dict'\nimport { try_require } from '../utils'\n\nimport '../../prototype.js'\n\nimport { mix_parse_trans_from_string_by_babel } from './parser'\n\n\n\n/** 默认 i18next 扫描配置 */\nconst DEFAULT_CONFIG = {\n debug: false,\n \n input: [\n // 'src/**/*.{js,jsx,ts,tsx}',\n '!i18n/**', // Use ! to filter out files or directories\n '!node_modules/**',\n '!**/*.d.ts',\n ],\n \n // 相对于根目录\n output: 'i18n/',\n \n // 若是相对路径,则以 output 为基准进行解析\n dict: ['dict.json', 'untranslateds.json'],\n \n lngs: ['zh', 'en', 'ja', 'ko'],\n ns: ['translation'],\n defaultLng: 'zh',\n defaultNs: 'translation',\n\n func: {\n list: [ 'i18next.t', 'i18n.t', 'i18n.__', 't', '__' ],\n extensions: [ ], // 避免在 transform 中执行原生的 parseFuncFromString\n },\n \n trans: {\n extensions: [ ], // 避免在 transform 中执行原生的 parseTransFromString\n fallbackKey: true,\n \n babylon: {\n sourceType: 'module',\n \n allowAwaitOutsideFunction: true,\n \n // https://babeljs.io/docs/en/babel-parser\n plugins: [\n // Language extensions\n 'jsx',\n 'typescript',\n \n // ECMAScript proposals\n 'classProperties',\n 'classPrivateProperties',\n 'classPrivateMethods',\n 'classStaticBlock',\n 'decimal',\n ['decorators', { decoratorsBeforeExport: true }],\n 'doExpressions',\n 'exportDefaultFrom',\n 'functionBind',\n 'importAssertions',\n 'moduleBlocks',\n 'moduleStringNames',\n 'partialApplication',\n ['pipelineOperator', { proposal: 'smart' }],\n 'privateIn',\n ['recordAndTuple', { syntaxType: 'bar' }],\n 'throwExpressions',\n 'topLevelAwait',\n ],\n } as import('@babel/parser').ParserOptions,\n \n // 实际并没有用到 acorn, 用了 babel\n acorn: {\n ecmaVersion: 'latest',\n sourceType: 'module', // defaults to 'module'\n // Check out https://github.com/acornjs/acorn/tree/master/acorn#interface for additional options\n }\n },\n \n // 禁用 : 和 . 作为 seperator\n keySeparator: false, // char to separate keys\n nsSeparator: false, // char to split namespace from key\n \n // Context Form\n context: true, // whether to add context form key\n contextFallback: true, // whether to add a fallback key as well as the context form key\n contextSeparator: '_', // char to split context from key\n\n // Plural\n // whether to add plural form key\n plural (language: string, ns: string, key: string, options: any /** Config */) {\n return language === 'en'\n }, \n pluralFallback: true, // whether to add a fallback key as well as the plural form key\n pluralSeparator: '_', // char to split plural from key\n \n // interpolation options\n interpolation: {\n prefix: '{{', // prefix for interpolation\n suffix: '}}' // suffix for interpolation\n }\n}\n\nconst VALID_EXTENTIONS = new Set(['.js', '.jsx', '.ts', '.tsx', '.ejs'])\n\nexport type Config = Partial<(typeof DEFAULT_CONFIG) & {\n defaultValue?: string\n resource?: { loadPath?: string, savePath?: string, jsonIndent?: number, lineEnding?: '\\n' }\n}>\n\n\n/** 扫描源码中的词条,以及收集未翻译的词条,将结果保存到 dict.json 和 untranslateds.json\n - `process.cwd()` rootdir 要扫描根目录\n - config 配置信息\n*/\nexport function scanner (rootdir: string = path.normalize(process.cwd()), config: Config = { }) {\n const output = path.resolve(rootdir, config.output || DEFAULT_CONFIG.output)\n \n if (!config.input.length)\n throw new Error('运行 i18n-scan 请指定 --input')\n \n const input = [...config.input, ...DEFAULT_CONFIG.input]\n \n config = {\n ...DEFAULT_CONFIG,\n ...config,\n input,\n output,\n resource: {\n loadPath: '',\n savePath: path.resolve(output, 'translation/{{lng}}.js'),\n jsonIndent: 4,\n lineEnding: '\\n'\n }\n }\n \n let dict = new Dict()\n \n for (const fp_dict of config.dict)\n dict.merge(\n try_require(\n path.resolve(output, fp_dict)\n ), { print: false, overwrite: true }\n )\n \n \n let c_files = 0\n let c_scanneds = 0\n let errors = []\n \n // 所有语言的扫描统计信息\n let stats: Record<Language, { translateds: Set<string>, untranslateds: Set<string> }> = { } as any\n \n for (const language of LANGUAGES)\n stats[language] = {\n translateds: new Set<string>(),\n untranslateds: new Set<string>()\n }\n \n \n let spinner = ora({ interval: 66 }).start('Scanning...')\n \n \n \n function on_scanned (text: string, { language, key, defaultValue, count, context }: { language?: Language, key?: string, defaultValue?: string, count?: number, context?: string }) {\n // console.log(text, { language, key, defaultValue, count, context })\n \n text = text || defaultValue\n \n if (!key)\n key = context ? `${text}_${context}` : text\n \n if (!language) {\n for (const language of LANGUAGES)\n on_scanned(text, { language, key, count, context })\n return\n }\n \n // console.log(text, { language, key, defaultValue, count, context })\n // debugger\n \n const stat = stats[language]\n \n // 获取已有翻译\n const translation = \n dict.get(key, language) || \n language === 'zh' && text || \n ''\n \n if (language === 'zh' && !context)\n return\n \n if (translation)\n stat.translateds.add(key)\n else\n stat.untranslateds.add(key)\n \n if (language === 'en' && count !== undefined)\n on_scanned(text, { language, key: `${key}_plural`, context })\n }\n \n \n function new_vinyl_file (_path: string, data: string | object) {\n return new Vinyl({\n cwd: rootdir,\n base: rootdir,\n path: path.resolve(config.output, _path),\n contents: Buffer.from(typeof data === 'string' ? data : JSON.stringify(data, null, 4))\n })\n }\n \n \n // ------------ scan by file\n vfs\n .src(config.input, { cwd: rootdir, sync: false })\n \n // 每个文件扫描前,统计文件数量\n .pipe(\n map( (file: Vinyl, cb: Function, count: number) => {\n // 支持 `// @i18n-noscan` 忽略扫描\n if (/\\/\\/\\s*@i18n-noscan\\s/.test(file.contents.toString())) return cb()\n c_files++\n cb(null, file)\n })\n )\n \n // 对文件进行排序,保证词条有一定的顺序\n .pipe( sort() )\n \n // 分析代码提取词条\n .pipe(\n i18n_scanner.createStream( config, function transform (this: { parser: any }, file: Vinyl, encoding: string, callback: Function): void {\n const { parser } = this\n const ext = path.extname(file.path)\n \n // 只扫描源码文件\n if (!VALID_EXTENTIONS.has(ext)) {\n callback()\n return\n }\n \n c_scanneds++\n const percent = Math.round( (100 * c_scanneds) / c_files )\n const text = `Scanning (${percent}%): ${file.path.green}`\n spinner.text = cli_truncate(text, process.stdout.columns - 5, { position: 'middle', })\n \n let code = file.contents.toString()\n \n if (ext === '.ejs')\n code = ejs.compile( code, { filename: file.path, client: true, legacyInclude: true } as any ).toString()\n \n \n // --- 添加代码中扫描到的 i18n.t('key') 中的 key 到 parser\n // parser.parseFuncFromString 使用 esprima 来解析代码,esprima 仍然不支持 optional chaining !!\n parser.parseFuncFromString(code.replace(/\\?\\.\\[/g, '[').replace(/\\?\\.\\(/g, '(').replace(/\\?\\./g, '.'), on_scanned)\n \n // --- 添加代码中扫描到的 Trans 组件中的 key 到 parser\n if (ext === '.jsx' || ext === '.tsx') {\n // parser.parseTransFromString 使用 acorn 解析代码,不支持 TypeScript,添加 parser.parseTransFromStringByBabel\n mix_parse_trans_from_string_by_babel(parser)\n parser.parseTransFromStringByBabel(\n code,\n { filepath: file.path },\n on_scanned,\n (error: Error) => { errors.push(error) }\n )\n }\n \n setTimeout(callback, 0)\n })\n )\n \n // 创建词条文件\n .pipe(\n through2.obj(\n /** i18n-scanner 会把扫描结果以每个语言一个文件的形式提供,这里解析扫描结果\n * file: 翻译 resource 文件,其中 file.contents 包含翻译的扫描结果\n */\n function write (this: Transform, file: Vinyl, encoding: string, cb: Function) { cb() },\n \n /** 生成 stats.json, unmarkeds.md; 打印 untranslated / unmarkeds */\n function flush (this: Transform, cb: Function) {\n // ------------ stats.json\n this.push(new_vinyl_file('stats.json', \n Object.fromEntries(\n Object.entries(stats).map( ([l, { translateds, untranslateds }]) => \n [l, { translateds: Array.from(translateds), untranslateds: Array.from(untranslateds) }])\n )\n ))\n \n \n // ------------ 打印 cli 统计表\n const table = new CliTable({\n head: [\n '语言',\n '未翻译'.red,\n '已翻译'.green,\n ],\n colAligns: ['right', 'right', 'right', 'right'],\n style: { head: [] },\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n })\n \n Object.entries(stats).forEach( ([lang, stat]) => {\n table.push([\n lang, \n String(stat.untranslateds.size).red, \n String(stat.translateds.size).green\n ] as any)\n })\n \n \n \n spinner.stop()\n console.log(`Scanned ${c_files} files. Occured ${errors.length} errors.`)\n console.log(table.toString())\n \n \n // ------------ 生成 unmarkeds.md 统计\n /*\n const fp_unmarked = path.resolve(config.output, 'unmarkeds.md')\n \n if (fs.existsSync(fp_unmarked))\n rimraf.sync(fp_unmarked)\n \n if (unmarkeds.length) {\n console.log(colors.yellow(`\\n⚠️ 发现未标记的中文字符 ${unmarkeds.length} 处:\\n`))\n unmarkeds.forEach(({ value, filepath, loc: { start } }, index) => {\n if (index >= 5) return\n console.log( ` ${colors.white(`'${value}'`)}\\t${colors.blue.underline(`${path.relative(rootdir, filepath)}:${start.line}:${start.column + 1}`)}` )\n })\n }\n \n this.push( new_vinyl_file( fp_unmarked, \n unmarkeds.map( ({ value, filepath, loc }) =>\n '- [' + value.trim() + '](' + path.relative( config.output, path.resolve(rootdir, filepath || '') ) + '#L' + loc.start.line + ')'\n ).join('\\n') + '\\n'\n ))\n \n \n if (unmarkeds.length > 5) {\n console.log(' ...')\n console.log(colors.yellow(`\\n 完整未标记词条请查看 ${colors.blue.underline(path.relative(rootdir, fp_unmarked))}`))\n }\n */\n \n const en_untranslateds = stats.en.untranslateds\n if (en_untranslateds.size) {\n console.log('\\n未翻译的英文词条:'.yellow)\n Array.from(en_untranslateds).slice(0, 10).forEach( untranslated => {\n console.log(untranslated)\n })\n if (en_untranslateds.size > 10) {\n console.log('...')\n console.log(`--- 共 ${en_untranslateds.size} 个未翻译的英文词条 ---`)\n }\n } else\n console.log('\\n所有词条都至少含有英文翻译.'.green)\n \n \n // ------------ 生成 untranslateds.json (扫描到词条还没有英文翻译)\n const fp_untranslateds = path.resolve(config.output, 'untranslateds.json')\n \n let untranslateds: _Dict = { }\n \n for (const key of stats.en.untranslateds) {\n let item = { ...dict.get(key) }\n item.en ||= ''\n item.ja ||= ''\n item.ko ||= ''\n untranslateds[key] = item\n }\n \n this.push(\n new_vinyl_file(fp_untranslateds, untranslateds)\n )\n \n \n // ------------ 写入 dict.json\n const fp_dict_new = path.resolve(output, 'dict.json')\n this.push( new_vinyl_file( fp_dict_new, dict.to_json(true) + '\\n' ))\n \n console.log(\n `\\n\\n${'请手动补全未翻译的词条: '.yellow}${fp_untranslateds.underline.blue}\\n` +\n `${'请检查新生成的词典文件: '.yellow}${fp_dict_new.underline.blue}\\n` +\n '\\n' +\n '补全 untranslateds.json 后需要重新运行扫描,会根据 untranslateds.json 更新 dict.json\\n'.yellow +\n '最后 dict.json 所包含的词条会被打包进 js, 通过 new I18N(<dict.json>) 或 i18n.init(<dict.json>) 加载\\n\\n'.yellow +\n `${'详细文档请查看: '.yellow}${'https://github.com/ShenHongFei/xshell/tree/master/i18n'.blue.underline}`\n )\n \n cb()\n }\n )\n )\n \n // 写入词条文件\n .pipe(\n vfs.dest(rootdir)\n )\n \n .on('end', () => {\n for (const error_handler of errors)\n error_handler()\n if (!errors.length)\n return\n console.log(`以上错误可能是由不规范的词条标记导致,标记规范可见:\\n${'https://www.i18next.com/translation-function/essentials'.blue.underline}`)\n })\n}\n\nexport default scanner\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xshell",
3
- "version": "0.0.25",
3
+ "version": "0.0.29",
4
4
  "main": "./index.js",
5
5
  "bin": {
6
6
  "xshell": "./xshell.js",
@@ -17,7 +17,7 @@
17
17
  "type": "commonjs",
18
18
  "engines": {
19
19
  "node": ">=17.1.0",
20
- "vscode": ">=1.63.0"
20
+ "vscode": "^1.63.1"
21
21
  },
22
22
  "scripts": {
23
23
  "start": "node --title=xshell --inspect=0.0.0.0:8420 ./xshell.js",
@@ -65,9 +65,9 @@
65
65
  ]
66
66
  },
67
67
  "dependencies": {
68
- "@babel/core": "^7.16.0",
69
- "@babel/parser": "^7.16.4",
70
- "@babel/traverse": "^7.16.3",
68
+ "@babel/core": "^7.16.7",
69
+ "@babel/parser": "^7.16.7",
70
+ "@babel/traverse": "^7.16.7",
71
71
  "@koa/cors": "^3.1.0",
72
72
  "byte-size": "^8.1.0",
73
73
  "chalk": "^4.1.2",
@@ -83,37 +83,37 @@
83
83
  "fs-monkey": "^1.0.3",
84
84
  "gulp-sort": "^2.0.0",
85
85
  "hash-string": "^1.0.0",
86
+ "i18next": "^21.6.5",
86
87
  "i18next-scanner": "^3.1.0",
87
- "i18next": "^21.6.0",
88
88
  "iconv-lite": "^0.6.3",
89
89
  "js-cookie": "^3.0.1",
90
+ "koa": "^2.13.4",
90
91
  "koa-compress": "^5.1.0",
91
92
  "koa-useragent": "^4.0.0",
92
- "koa": "^2.13.4",
93
93
  "lodash": "^4.17.21",
94
94
  "map-stream": "0.0.7",
95
- "memfs": "^3.4.0",
95
+ "memfs": "^3.4.1",
96
96
  "ora": "=5.4.1",
97
97
  "promise-retry": "^2.0.1",
98
98
  "qs": "^6.10.2",
99
- "react-i18next": "^11.15.0",
100
99
  "react": "^17.0.2",
100
+ "react-i18next": "^11.15.3",
101
101
  "readdir-enhanced": "^6.0.4",
102
- "request-promise-native": "^1.0.9",
103
102
  "request": "^2.88.2",
103
+ "request-promise-native": "^1.0.9",
104
104
  "resolve-path": "^1.4.0",
105
105
  "rimraf": "^3.0.2",
106
106
  "stream-buffers": "^3.0.2",
107
107
  "strip-ansi": "=6.0.0",
108
108
  "tough-cookie": "^4.0.0",
109
109
  "tslib": "^2.3.1",
110
- "typescript": "^4.5.3",
110
+ "typescript": "^4.5.4",
111
111
  "upath": "^2.0.1",
112
- "vinyl-fs": "^3.0.3",
113
- "vinyl": "^2.2.1"
112
+ "vinyl": "^2.2.1",
113
+ "vinyl-fs": "^3.0.3"
114
114
  },
115
115
  "devDependencies": {
116
- "@babel/types": "^7.16.0",
116
+ "@babel/types": "^7.16.7",
117
117
  "@types/babel__traverse": "^7.14.2",
118
118
  "@types/chardet": "^0.8.1",
119
119
  "@types/cheerio": "^0.22.30",
@@ -122,19 +122,21 @@
122
122
  "@types/fs-extra": "^9.0.13",
123
123
  "@types/gulp-sort": "2.0.0",
124
124
  "@types/js-cookie": "^3.0.1",
125
- "@types/koa-compress": "^4.0.3",
126
125
  "@types/koa": "^2.13.4",
126
+ "@types/koa-compress": "^4.0.3",
127
127
  "@types/lodash": "^4.14.178",
128
- "@types/node": "^16.11.12",
128
+ "@types/node": "^17.0.8",
129
129
  "@types/promise-retry": "^1.1.3",
130
130
  "@types/qs": "^6.9.7",
131
- "@types/react": "^17.0.37",
131
+ "@types/react": "^17.0.38",
132
+ "@types/request": "^2.48.8",
132
133
  "@types/request-promise-native": "^1.0.18",
133
- "@types/request": "^2.48.7",
134
134
  "@types/rimraf": "^3.0.2",
135
135
  "@types/stream-buffers": "^3.0.4",
136
136
  "@types/tampermonkey": "^4.0.5",
137
137
  "@types/vinyl-fs": "^2.4.12",
138
- "@types/vscode": "^1.63.0"
138
+ "@types/vscode": "^1.63.1",
139
+ "source-map-loader": "^3.0.1",
140
+ "ts-loader": "^9.2.6"
139
141
  }
140
142
  }
package/prototype.d.ts CHANGED
@@ -55,9 +55,7 @@ declare global {
55
55
  - flags?: `''` regexp flags
56
56
  - pattern_placeholder?: `/\{.*?\}/g`
57
57
  */
58
- find(this: string, pattern: string, preservations?: string, flags?: string, pattern_placeholder?: RegExp): {
59
- [name: string]: string;
60
- };
58
+ find(this: string, pattern: string, preservations?: string, flags?: string, pattern_placeholder?: RegExp): Record<string, string>;
61
59
  /** - type?: `'single'` */
62
60
  quote(this: string, type?: keyof typeof quotes | 'psh'): string;
63
61
  /** - shape?: `'parenthesis'` */
package/prototype.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"prototype.js","sourceRoot":"","sources":["prototype.ts"],"names":[],"mappings":"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","sourcesContent":["declare global {\n interface String {\n readonly width: number\n \n // --- util methods\n /** truncate string with fixed width and preserve color */\n truncate (this: string, width: number): string\n \n /** pad string to `<width>` \n - character?: `' '`\n - position?: `'right'`\n */\n pad (this: string, width: number, { character, position }?: { character?: string, position?: 'left' | 'right'}): string\n \n limit (this: string, width: number, { character, position }?: { character?: string, position?: 'left' | 'right'}): string\n \n to_regx (this: string, preservations?: string, flags?: string): RegExp\n \n to_bool (this: string): boolean\n \n /** string pattern replacement\n - pattern: pattern of matched string part\n - pattern_: pattern of target string part\n - preservations?: `''` preserved regexp characters\n - flags?: `''` regexp flags\n - transformer?: `(name, matched) => matched || ''` placeholder transformer\n - pattern_placeholder?: `/\\{.*?\\}/g`\n \n ```ts\n 'g:/acgn/海贼王/[Skytree][海贼王][One_Piece][893][GB_BIG5_JP][X264_AAC][1080P][CRRIP][天空树双语字幕组].mkv'.reformat( \n '{dirp}/[Skytree][海贼王][{ en_name: \\\\w+ }][{ episode: \\\\d+ }][GB_BIG5_JP][{encoding}_AAC][1080P][CRRIP][天空树双语字幕组].{format}', \n 'g:/acgn/海贼王/{episode} {encoding}.{format}', \n '\\\\+', \n 'i', \n (name, value) => name === 'episode' ? String(+value + 1) : value.toLowerCase() \n )\n ```\n */\n refmt ( this: string,\n pattern: string,\n \n pattern_: string,\n \n preservations?: string,\n \n flags?: string,\n \n transformer?: (name: string, value: string, placeholders: { [name: string]: string }) => string,\n \n pattern_placeholder?: RegExp\n \n ): string\n \n \n /** string pattern match\n ```ts\n 'git+https://github.com/tamino-martinius/node-ts-dedent-123.git'.find(\n '^{protocol:[\\\\w+]+}://{hostname:[\\\\w\\\\.]+}/{username}/{project}-{index:\\\\d+}.{suffix}', '^', 'i'\n )\n {\n protocol: 'git+https',\n hostname: 'github.com',\n ...\n }\n ```\n \n - preservations?: `''` preserved regexp characters\n - flags?: `''` regexp flags\n - pattern_placeholder?: `/\\{.*?\\}/g`\n */\n find (this: string,\n \n pattern: string, \n \n preservations?: string, \n \n flags?: string, \n \n pattern_placeholder?: RegExp\n \n ): { [name: string]: string }\n \n \n /** - type?: `'single'` */\n quote (this: string, type?: keyof typeof quotes | 'psh'): string\n \n /** - shape?: `'parenthesis'` */\n bracket (this: string, shape?: keyof typeof brackets): string\n \n surround (this: string, left: string, right?: string): string\n \n surround_tag (this: string, tag_name: string): string\n \n to_lf (this: string): string\n \n to_crlf (this: string): string\n \n /** 'xxx'.replace(/pattern/g, '') \n if pattern is string then RegExp will add flags (default 'g'), else ignore flags\n */\n rm (this: string, pattern: string | RegExp, flags?: string): string\n \n \n // --- chalk colors\n readonly red: string\n readonly red_: string\n \n readonly green: string\n readonly green_: string\n \n readonly yellow: string\n readonly yellow_: string\n \n readonly blue: string\n readonly blue_: string\n \n readonly magenta: string\n readonly magenta_: string\n \n readonly cyan: string\n readonly cyan_: string\n \n readonly grey: string\n \n readonly underline: string\n \n strip_ansi (this: string): string\n \n \n // --- text processing\n /** split string to lines and strip last '' after last \\n */\n split_lines (this: string): string[]\n \n trim_doc_comment (this: string): string\n \n split_indent (this: string): { indent: number, text: string }\n \n \n to_base64 (this: string): string\n \n /** - buffer: `false` return raw Buffer */\n decode_base64 (this: string): string\n decode_base64 (this: string, buffer: true): Buffer\n decode_base64 (this: string, buffer?: boolean): string | Buffer\n \n \n space (this: string): string\n \n \n // --- path ops\n fdir: string\n \n /** path.basename, e.g. \n - D:/0/aaa.txt -> aaa.txt\n - D:/aaa/ -> aaa\n */\n fname: string\n \n /** .txt */\n fext: string\n \n /** fs.existsSync */\n fexists: boolean\n \n is_dir: boolean\n \n to_slash (this: string): string\n \n to_backslash (this: string): string\n }\n \n \n interface Date {\n /** - ms?: `false` show ms */\n to_str (this: Date, ms?: boolean): string\n \n to_date_str (this: Date): string\n \n to_time_str (this: Date): string\n }\n \n \n interface Number {\n /** 12.4 KB (1 KB = 1024 B) */\n to_fsize_str (this: number, units?: 'iec' | 'metric'): string\n \n \n to_bin_str (this: number): string\n \n to_hex_str (this: number, length?: number): string\n \n to_oct_str (this: number): string\n }\n \n \n interface Array<T> {\n last: T\n \n log (this: string[], limit?: number): void\n \n indent (this: string[], width: number, c?: string): string[]\n \n indent2to4 (this: string[]): string[]\n \n \n // --- text processing\n /**\n - trim_line?: `true`\n - rm_empty_lines?: `true`\n - rm_last_empty_lines?: `false`\n */\n trim_lines (this: string[], { trim_line, rm_empty_lines, rm_last_empty_lines }?: { trim_line?: boolean, rm_empty_lines?: boolean, rm_last_empty_lines?: boolean }): string[]\n \n trim_license (this: string[]): string[]\n \n split_indents (this: string[]): { indent: number, text: string }[]\n \n join_lines (): string\n }\n}\n\n\nimport fs from 'fs'\n\nimport path from 'upath'\n// @ts-ignore\nimport byte_size from 'byte-size'\n\nimport EmojiRegex from 'emoji-regex'\n\nimport strip_ansi from 'strip-ansi'\nimport chalk from 'chalk'\n\nexport const emoji_regex = EmojiRegex()\n\nexport { chalk }\n\n\nexport function to_method_property_descriptors (methods: { [name: string]: Function }): PropertyDescriptorMap {\n return Object.fromEntries(\n Object.entries(methods)\n .map(([name, value]) => ([name, {\n configurable: true,\n writable: true,\n enumerable: false,\n value,\n } as PropertyDescriptor])\n ))\n}\n\n\nexport function to_getter_property_descriptors (getters: { [name: string]: Function }): PropertyDescriptorMap {\n return Object.fromEntries(\n Object.entries(getters)\n .map(([name, get]) => ([name, {\n configurable: true,\n enumerable: false,\n get,\n } as PropertyDescriptor])\n ))\n}\n\n\nexport const cjk = '([\\u2e80-\\u9fff\\uf900-\\ufaff])'\n\nexport const quotes = {\n single: \"'\",\n double: '\"',\n backtick: '`',\n}\n\nexport const brackets = {\n round: ['(', ')'],\n square: ['[', ']'],\n curly: ['{', '}'],\n pointy: ['<', '>'],\n corner: ['「', '」'],\n fat: ['【', '】'],\n tortoise_shell: ['〔', '〕'],\n} as const\n\nconst color_map = Object.fromEntries(\n ['red_', 'green_', 'yellow_', 'blue_', 'magenta_', 'cyan_'].map(color =>\n [color, `${color.slice(0, -1)}Bright`])\n)\n\n// ------------------------------------ String.prototype\nObject.defineProperties(String.prototype, {\n ... to_getter_property_descriptors({\n width (this: string) {\n const s = strip_ansi(\n this.replace(emoji_regex, ' ')\n )\n let width = 0\n for (let i = 0; i < s.length; i++) {\n const code = s.codePointAt(i)\n \n if (\n (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) || // ignore control characters\n code >= 0x300 && code <= 0x36f // ignore combining characters\n ) continue\n \n // surrogates\n if (code > 0xffff)\n i++\n \n width += is_codepoint_fullwidth(code) ? 2 : 1\n }\n return width\n }\n }),\n \n \n // ------------ text processing utils\n ... to_method_property_descriptors({\n /** truncate string with fixed width and preserve color */\n truncate (this: string, width: number) {\n const color_bak = this.startsWith('\\u001b') ? this.slice(0, 5) : ''\n const s = strip_ansi(this)\n if (width <= 2) return this.slice(0, width)\n let i_fitted = 0\n let fitted_width = 0\n let cur_width = 0\n for (let i = 0; i < s.length; i++) {\n const code = s.codePointAt(i)\n \n if (\n (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) || // Ignore control characters\n code >= 0x300 && code <= 0x36F // Ignore combining characters\n ) continue\n \n // surrogates (codepoint need two utf-16 encoding units, thus here skip the first in order to prevent repeated counting) \n if (code > 0xFFFF)\n i++\n \n const w = is_codepoint_fullwidth(code) ? 2 : 1\n \n if (cur_width + w + 2 <= width) {\n i_fitted = i\n fitted_width += w\n }\n \n cur_width += w\n \n if (cur_width > width) {\n const i_fitted_next = i_fitted + 1\n const t = s.slice(0, i_fitted_next) + ' '.repeat(width - 2 - fitted_width) + '…' \n return color_bak ? color_bak + t + '\\u001b[39m' : t\n }\n }\n return this\n },\n \n \n pad (this: string, width: number, { character = ' ', position = 'right' }: { character?: string, position?: 'left' | 'right'} = { }) {\n const _width = this.width\n if (_width >= width) return this\n if (position === 'right') return this + character.repeat( (width - _width) / character.width )\n return character.repeat(width - _width) + this\n },\n \n \n limit (this: string, width: number, { character = ' ', position = 'right' }: { character?: string, position?: 'left' | 'right'} = { }) {\n return this.pad(width, { character, position }).truncate(width)\n },\n \n \n to_regx (this: string, preservations: string, flags = ''): RegExp {\n const preserved_chars = new Set(preservations)\n const replace_chars: string = Array.prototype.filter.call('|\\\\{}()[]^$+*?.-', (c: string) => !preserved_chars.has(c))\n .map((c: string) => \n c === ']' ? '\\\\]' : c\n ).join('')\n \n return new RegExp( this.replace(new RegExp(`[${replace_chars}]`, 'g'), '\\\\$&'), flags)\n },\n \n \n to_bool (this: string) {\n return this.length && this !== '0' && this.toLowerCase() !== 'false'\n },\n \n refmt (this: string, \n pattern : string,\n pattern_: string,\n preservations: string = '',\n flags = '',\n transformer: (name: string, value: string, placeholders: { [name: string]: string }) => string = (name, value) => value || '',\n pattern_placeholder = /\\{.*?\\}/g,\n ): string {\n // --- convert pattern to pattern_regx\n let last_end = 0\n \n // placeholder matched group indexes\n let $placeholders: Record<string, number> = { }\n \n let regx_parts = [ ]\n \n function add_part (left: number, right?: number) {\n const part = pattern.slice(left, right)\n if (part)\n regx_parts.push(\n part.to_regx(preservations).source.bracket()\n )\n }\n \n pattern.replace(pattern_placeholder, ($0, offset) => {\n add_part(last_end, offset)\n last_end = offset + $0.length\n \n const placeholder = $0.slice(1, -1)\n let [placeholder_name, placeholder_pattern] = placeholder.split(':').map(s => s.trim())\n let optional = false\n if (placeholder_name.endsWith('?')) {\n placeholder_name = placeholder_name.slice(0, -1)\n optional = true\n }\n $placeholders[placeholder_name] = regx_parts.push(\n placeholder_pattern ? \n `${placeholder_pattern.bracket()}${optional ? '?' : ''}`\n :\n '(.*?)'\n )\n return ''\n })\n \n add_part(last_end)\n \n // modify last (.*?) to greedy in order to satisfy the situation of .{suffix}\n regx_parts = regx_parts.filter(part => part)\n if (regx_parts.last === '(.*?)')\n regx_parts[regx_parts.length - 1] = '(.*)'\n \n const pattern_regx = new RegExp(regx_parts.join(''), flags)\n \n \n // --- match original string based on pattern_regx, and get result to build placeholders dict\n const matches = pattern_regx.exec(this)\n \n if (!matches) return this\n \n const placeholders = Object.fromEntries(\n Object.entries($placeholders)\n .map(([name, $i]) => [\n [name, matches[$i]],\n [`${name}.before`, matches[$i - 1] || ''],\n [`${name}.after`, matches[$i + 1] || ''],\n ])\n .flat()\n )\n \n \n // --- convert pattern_ to replacement_str, if transformer exists then apply on placeholder\n last_end = 0\n let replacement_parts = [ ]\n \n pattern_.replace(pattern_placeholder, ($0, offset) => {\n replacement_parts.push(\n pattern_.slice(last_end, offset)\n )\n last_end = offset + $0.length\n \n const placeholder_name = $0.slice(1, -1)\n \n replacement_parts.push(\n transformer(placeholder_name, placeholders[placeholder_name], placeholders)\n )\n \n return ''\n })\n replacement_parts.push(\n pattern_.slice(last_end)\n )\n \n return this.replace(pattern_regx, replacement_parts.join(''))\n },\n \n \n find (this: string,\n pattern: string, \n preservations: string = '', \n flags = '', \n pattern_placeholder = /\\{.*?\\}/g\n ): { [name: string]: string } {\n // --- convert pattern to pattern_regx\n let last_end = 0\n \n // placeholder matched group index\n let $placeholders: Record<string, number> = { }\n \n let regx_parts = [ ]\n \n function add_part (left: number, right?: number) {\n const part = pattern.slice(left, right)\n if (part)\n regx_parts.push(\n part.to_regx(preservations).source.bracket()\n )\n }\n \n pattern.replace(pattern_placeholder, ($0, offset) => {\n add_part(last_end, offset)\n last_end = offset + $0.length\n \n const placeholder = $0.slice(1, -1)\n let [placeholder_name, placeholder_pattern] = placeholder.split(':').map(s => s.trim())\n let optional = false\n if (placeholder_name.endsWith('?')) {\n placeholder_name = placeholder_name.slice(0, -1)\n optional = true\n }\n \n $placeholders[placeholder_name] = regx_parts.push(\n placeholder_pattern ? \n `${placeholder_pattern.bracket()}${optional ? '?' : ''}`\n :\n '(.*?)'\n )\n return ''\n })\n \n add_part(last_end)\n \n // convert last (.*?) to greedy, to make .{suffix} work\n regx_parts = regx_parts.filter(part => part)\n if (regx_parts[regx_parts.length - 1] === '(.*?)')\n regx_parts[regx_parts.length - 1] = '(.*)'\n \n const pattern_regx = new RegExp(regx_parts.join(''), flags)\n \n \n // --- match original string based on pattern_regx, and get result to build placeholders dict\n const matches = pattern_regx.exec(this)\n \n if (!matches) return { }\n \n return Object.fromEntries(\n Object.entries($placeholders)\n .map(([name, $i]) => \n [name, matches[$i] || '']\n )\n )\n },\n \n quote (this: string, type: keyof typeof quotes | 'psh' = 'single') {\n if (type === 'psh')\n return `& ${this.quote()}`\n return this.surround(quotes[type])\n },\n \n \n bracket (this: string, shape: keyof typeof brackets = 'round') {\n return this.surround(...brackets[shape] as [string, string])\n },\n \n \n surround (this: string, left: string, right?: string) {\n return left + this + (right || left)\n },\n \n surround_tag (this: string, tag_name: string): string {\n return '<' + tag_name + '>' + this + '</' + tag_name + '>'\n },\n \n \n to_lf (this: string) {\n return this.replace(/\\r\\n/g, '\\n')\n },\n \n \n to_crlf (this: string) {\n return this.replace(/\\n/g, '\\r\\n')\n },\n \n \n rm (this: string, pattern: string | RegExp, flags: string = 'g') {\n if (typeof pattern === 'string')\n pattern = new RegExp(pattern, flags)\n \n return this.replace(pattern, '')\n },\n \n \n split_lines (this: string, delimiter: string | RegExp = /\\r?\\n/) {\n let lines = this.split(delimiter)\n if (lines.last === '')\n lines.pop()\n return lines\n },\n \n \n split_indent (this: string): { indent: number, text: string } {\n let i = 0\n let indent = 0\n for (; i < this.length; i++)\n if (this[i] === ' ')\n indent += 1\n else if (this[i] === '\\t')\n indent += 4\n else\n break\n \n return {\n indent,\n text: this.slice(i)\n }\n },\n \n \n trim_doc_comment (this: string) {\n return '/** ' + this.slice(3, -2).replace(/\\s*\\*\\s*/g, ' ').replace(/@(param|params|return) \\{.*?\\}\\s*/g, '').trim() + ' */'\n },\n \n \n to_base64 (this: string) {\n return Buffer.from(this).toString('base64')\n },\n \n \n decode_base64 (this: string, buffer = false) {\n const buf = Buffer.from(this, 'base64')\n if (buffer)\n return buf\n return buf.toString()\n },\n \n \n strip_ansi (this: string) {\n return strip_ansi(this)\n },\n \n \n space (this: string) {\n if (!this) return this\n let text_: string\n text_ = this\n .replace(new RegExp(cjk + `(['\"])`, 'g'), '$1 $2')\n .replace(new RegExp(`(['\"])` + cjk, 'g'), '$1 $2')\n \n .replace(/([\"']+)\\s*(.+?)\\s*([\"']+)/g, '$1$2$3')\n \n .replace(new RegExp(cjk + '([\\\\+\\\\-\\\\*\\\\/=&\\\\\\\\\\\\|<>])([A-Za-z0-9])', 'g'), '$1 $2 $3')\n .replace(new RegExp('([A-Za-z0-9])([\\\\+\\\\-\\\\*\\\\/=&\\\\\\\\\\\\|<>])' + cjk, 'g'), '$1 $2 $3')\n \n const textBak = text_\n \n text_ = text_.replace(new RegExp(cjk + '([\\\\(\\\\[\\\\{<\\u201c]+(.*?)[\\\\)\\\\]\\\\}>\\u201d]+)' + cjk, 'g'), '$1 $2 $4')\n \n if (text_ === textBak)\n text_ = text_\n .replace(new RegExp(cjk + '([\\\\(\\\\[\\\\{<\\u201c>])', 'g'), '$1 $2')\n .replace(new RegExp('([\\\\)\\\\]\\\\}>\\u201d<])' + cjk, 'g'), '$1 $2')\n \n return text_\n // eslint-disable-next-line no-useless-escape\n .replace(/([\\(\\[\\{<\\u201c]+)(\\s*)(.+?)(\\s*)([\\)\\]\\}>\\u201d]+)/g, '$1$3$5')\n .replace(new RegExp(cjk + '([~!;:,\\\\.\\\\?\\u2026])([A-Za-z0-9])', 'g'), '$1$2 $3')\n .replace(new RegExp(cjk + '([A-Za-z0-9`\\\\$%\\\\^&\\\\*\\\\-=\\\\+\\\\\\\\\\\\|\\\\/@\\u00a1-\\u00ff\\u2022\\u2027\\u2150-\\u218f])', 'g'), '$1 $2')\n .replace(new RegExp('([A-Za-z0-9`\\\\$%\\\\^&\\\\*\\\\-=\\\\+\\\\\\\\\\\\|\\\\/@\\u00a1-\\u00ff\\u2022\\u2027\\u2150-\\u218f])' + cjk, 'g'), '$1 $2')\n }\n }),\n \n \n // ------------ chalk colors\n ... Object.fromEntries(\n [\n 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'grey', \n 'red_', 'green_', 'yellow_', 'blue_', 'magenta_', 'cyan_',\n 'underline',\n ].map(color =>\n ([color, {\n configurable: true,\n get (this: string) {\n return chalk[color_map[color] || color](this)\n }\n }]))\n ),\n \n \n // ------------ file path ops\n ... to_getter_property_descriptors({\n fdir (this: string) {\n const dir = path.dirname(this)\n return dir.endsWith('/') ? dir : `${dir}/`\n },\n \n fname (this: string) {\n return path.basename(this)\n },\n \n fext (this: string) {\n return path.extname(this)\n },\n \n fexists (this: string) {\n return fs.existsSync(this)\n },\n \n is_dir (this: string) {\n if (this.endsWith('/')) return true\n try {\n return fs.lstatSync(this).isDirectory()\n } catch (error) {\n return false\n }\n },\n }),\n \n ... to_method_property_descriptors({\n to_slash (this: string) {\n if (!this) return this\n return path.normalizeSafe(this)\n },\n \n to_backslash (this: string) {\n return this.replaceAll('/', '\\\\')\n },\n })\n})\n\n\n// ------------------------------------ Date.prototype\nObject.defineProperties(Date.prototype, to_method_property_descriptors({\n to_str (this: Date) {\n const [ampm, hour] = (() => {\n let hour = this.getHours()\n if (hour <= 6)\n return ['凌晨', hour]\n \n if (hour <= 8)\n return ['清晨', hour]\n \n if (hour <= 9)\n return ['早上', hour]\n \n if (hour <= 10)\n return ['上午', hour]\n \n if (hour <= 12)\n return ['中午', hour]\n \n hour -= 12\n \n if (hour <= 5)\n return ['下午', hour]\n \n if (hour <= 10)\n return ['晚上', hour]\n \n return ['深夜', hour]\n })()\n \n \n return '' +\n // year.month.date\n `${this.getFullYear()}.${String(this.getMonth() + 1).pad(2, { character: '0', position: 'left' })}.${String(this.getDate()).pad(2, { character: '0', position: 'left' })} ` +\n // 上午 10:03:02\n `${ampm} ${String(hour).pad(2, { character: '0', position: 'left' })}:${String(this.getMinutes()).pad(2, { character: '0', position: 'left' })}:${String(this.getSeconds()).pad(2, { character: '0', position: 'left' })}`\n },\n \n to_date_str (this: Date) {\n return this.to_str().split(' ')[0]\n },\n \n to_time_str (this: Date) {\n const [, ampm, time ] = this.to_str().split(' ')\n return `${ampm} ${time}`\n },\n}))\n\n\n\n// ------------------------------------ Number.prototype\nObject.defineProperties(Number.prototype, to_method_property_descriptors({\n to_fsize_str (this: number, units: 'iec' | 'metric' = 'iec') {\n const { value, unit } = byte_size(this, { units })\n return `${value} ${(unit as string).rm('i')}`\n },\n \n to_bin_str (this: number) {\n return `0b${this.toString(2)}`\n },\n \n to_hex_str (this: number, length?: number) {\n const s = this.toString(16)\n if (!length)\n length = Math.ceil(s.length / 4) * 4\n return `0x${'0'.repeat(length - s.length)}${s}`\n },\n \n to_oct_str (this: number) {\n return `0o${this.toString(8)}`\n },\n}))\n\n\n\n// ------------------------------------ Array.prototype\nObject.defineProperties(Array.prototype, {\n ... to_getter_property_descriptors({\n last (this: any[]) {\n return this[this.length - 1]\n }\n }),\n \n \n // --- text processing methods\n ... to_method_property_descriptors({\n log (this: string[], limit: number = 10000) {\n const text = this.join('\\n') + '\\n'\n if (limit === -1 || this.length <= limit)\n console.log(text)\n else if (limit > 0)\n console.log(text.slice(0, limit) + '\\n...'.blue)\n else \n console.log('...\\n'.blue + text.slice(limit))\n },\n \n trim_lines (this: string[], { trim_line = true, rm_empty_lines = true, rm_last_empty_lines = false }: { trim_line?: boolean, rm_empty_lines?: boolean, rm_last_empty_lines?: boolean } = { }) {\n if (!this.length) return this\n let lines = this\n \n if (trim_line)\n lines = lines.map(line => line.trim() )\n \n if (rm_empty_lines)\n return lines.filter( line => line )\n \n if (rm_last_empty_lines) {\n lines.reverse()\n const i_not_empty = lines.findIndex( line => line )\n if (i_not_empty !== -1)\n lines = lines.slice(i_not_empty)\n lines.reverse()\n return lines\n }\n \n return lines\n },\n \n \n trim_license (this: string[]) {\n const i = this.indexOf('/*')\n const j = this.indexOf('*/')\n if (i === 0 && this[i+1].includes('License'))\n return this.slice(j+1)\n else\n return this\n },\n \n split_indents (this: string[]): { indent: number, text: string }[] {\n return this.map(line => \n line.split_indent()\n )\n },\n \n indent (this: string[], width?: number, character: string = ' ') {\n return this.map(line => \n character.repeat(width) + line\n )\n },\n \n indent2to4 (this: string[]) {\n return this.split_indents()\n .map(line => \n ' '.repeat(\n Math.floor(line.indent / 2) * 4\n ) + line.text\n )\n },\n \n join_lines (this: string[], append = true) {\n return `${this.join('\\n')}${append ? '\\n' : ''}`\n }\n })\n})\n\n\nexport function to_json (obj: any, replacer?: any) {\n return JSON.stringify(obj, replacer, 4) + '\\n'\n}\n\nexport function to_json_safely (obj: any, replacer?: any) {\n return to_json(obj, replacer)\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n .replace(/<\\/script>/g, '<\\\\/script>')\n}\n\n\nexport function is_codepoint_fullwidth (codepoint: number) {\n // code points are derived from:\n // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n return (\n !Number.isNaN(codepoint) &&\n codepoint >= 0x1100 &&\n (\n codepoint <= 0x115f || // hangul jamo\n \n codepoint === 0x201c || codepoint === 0x201d || // \n codepoint === 0x2026 || // …\n codepoint === 0x203b || // ※\n \n // arrows\n (0x2190 <= codepoint && codepoint <= 0x21FF) ||\n \n codepoint === 0x2329 || // left-pointing angle bracket\n codepoint === 0x232a || // right-pointing angle bracket\n \n // ①\n (0x2460 <= codepoint && codepoint <= 0x24ff) ||\n \n // box drawing\n (0x2500 <= codepoint && codepoint <= 0x257f) ||\n \n // shapes, symbols, …\n (0x2580 <= codepoint && codepoint <= 0x2bef) ||\n \n // cjk radicals supplement .. enclosed cjk letters and months\n (0x2e80 <= codepoint && codepoint <= 0x3247 && codepoint !== 0x303f) ||\n \n // enclosed cjk letters and months .. cjk unified ideographs extension a\n (0x3250 <= codepoint && codepoint <= 0x4dbf) ||\n \n // cjk unified ideographs .. yi radicals\n (0x4E00 <= codepoint && codepoint <= 0xA4C6) ||\n \n // hangul jamo extended-a\n (0xa960 <= codepoint && codepoint <= 0xa97c) ||\n \n // hangul syllables\n (0xac00 <= codepoint && codepoint <= 0xd7a3) ||\n \n // cjk compatibility ideographs\n (0xf900 <= codepoint && codepoint <= 0xfaff) ||\n \n // vertical forms\n (0xfe10 <= codepoint && codepoint <= 0xfe19) ||\n \n // cjk compatibility forms .. small form variants\n (0xfe30 <= codepoint && codepoint <= 0xfe6b) ||\n \n // halfwidth and fullwidth forms\n (0xff01 <= codepoint && codepoint <= 0xff60) ||\n (0xffe0 <= codepoint && codepoint <= 0xffe6) ||\n \n // kana supplement\n (0x1b000 <= codepoint && codepoint <= 0x1b001) ||\n \n // enclosed ideographic supplement\n (0x1f200 <= codepoint && codepoint <= 0x1f251) ||\n \n // cjk unified ideographs extension b .. tertiary ideographic plane\n (0x20000 <= codepoint && codepoint <= 0x3fffd)\n )\n )\n}\n"]}
1
+ {"version":3,"file":"prototype.js","sourceRoot":"","sources":["prototype.ts"],"names":[],"mappings":"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","sourcesContent":["declare global {\n interface String {\n readonly width: number\n \n // --- util methods\n /** truncate string with fixed width and preserve color */\n truncate (this: string, width: number): string\n \n /** pad string to `<width>` \n - character?: `' '`\n - position?: `'right'`\n */\n pad (this: string, width: number, { character, position }?: { character?: string, position?: 'left' | 'right'}): string\n \n limit (this: string, width: number, { character, position }?: { character?: string, position?: 'left' | 'right'}): string\n \n to_regx (this: string, preservations?: string, flags?: string): RegExp\n \n to_bool (this: string): boolean\n \n /** string pattern replacement\n - pattern: pattern of matched string part\n - pattern_: pattern of target string part\n - preservations?: `''` preserved regexp characters\n - flags?: `''` regexp flags\n - transformer?: `(name, matched) => matched || ''` placeholder transformer\n - pattern_placeholder?: `/\\{.*?\\}/g`\n \n ```ts\n 'g:/acgn/海贼王/[Skytree][海贼王][One_Piece][893][GB_BIG5_JP][X264_AAC][1080P][CRRIP][天空树双语字幕组].mkv'.reformat( \n '{dirp}/[Skytree][海贼王][{ en_name: \\\\w+ }][{ episode: \\\\d+ }][GB_BIG5_JP][{encoding}_AAC][1080P][CRRIP][天空树双语字幕组].{format}', \n 'g:/acgn/海贼王/{episode} {encoding}.{format}', \n '\\\\+', \n 'i', \n (name, value) => name === 'episode' ? String(+value + 1) : value.toLowerCase() \n )\n ```\n */\n refmt ( this: string,\n pattern: string,\n \n pattern_: string,\n \n preservations?: string,\n \n flags?: string,\n \n transformer?: (name: string, value: string, placeholders: { [name: string]: string }) => string,\n \n pattern_placeholder?: RegExp\n \n ): string\n \n \n /** string pattern match\n ```ts\n 'git+https://github.com/tamino-martinius/node-ts-dedent-123.git'.find(\n '^{protocol:[\\\\w+]+}://{hostname:[\\\\w\\\\.]+}/{username}/{project}-{index:\\\\d+}.{suffix}', '^', 'i'\n )\n {\n protocol: 'git+https',\n hostname: 'github.com',\n ...\n }\n ```\n \n - preservations?: `''` preserved regexp characters\n - flags?: `''` regexp flags\n - pattern_placeholder?: `/\\{.*?\\}/g`\n */\n find (this: string,\n \n pattern: string, \n \n preservations?: string, \n \n flags?: string, \n \n pattern_placeholder?: RegExp\n \n ): Record<string, string>\n \n \n /** - type?: `'single'` */\n quote (this: string, type?: keyof typeof quotes | 'psh'): string\n \n /** - shape?: `'parenthesis'` */\n bracket (this: string, shape?: keyof typeof brackets): string\n \n surround (this: string, left: string, right?: string): string\n \n surround_tag (this: string, tag_name: string): string\n \n to_lf (this: string): string\n \n to_crlf (this: string): string\n \n /** 'xxx'.replace(/pattern/g, '') \n if pattern is string then RegExp will add flags (default 'g'), else ignore flags\n */\n rm (this: string, pattern: string | RegExp, flags?: string): string\n \n \n // --- chalk colors\n readonly red: string\n readonly red_: string\n \n readonly green: string\n readonly green_: string\n \n readonly yellow: string\n readonly yellow_: string\n \n readonly blue: string\n readonly blue_: string\n \n readonly magenta: string\n readonly magenta_: string\n \n readonly cyan: string\n readonly cyan_: string\n \n readonly grey: string\n \n readonly underline: string\n \n strip_ansi (this: string): string\n \n \n // --- text processing\n /** split string to lines and strip last '' after last \\n */\n split_lines (this: string): string[]\n \n trim_doc_comment (this: string): string\n \n split_indent (this: string): { indent: number, text: string }\n \n \n to_base64 (this: string): string\n \n /** - buffer: `false` return raw Buffer */\n decode_base64 (this: string): string\n decode_base64 (this: string, buffer: true): Buffer\n decode_base64 (this: string, buffer?: boolean): string | Buffer\n \n \n space (this: string): string\n \n \n // --- path ops\n fdir: string\n \n /** path.basename, e.g. \n - D:/0/aaa.txt -> aaa.txt\n - D:/aaa/ -> aaa\n */\n fname: string\n \n /** .txt */\n fext: string\n \n /** fs.existsSync */\n fexists: boolean\n \n is_dir: boolean\n \n to_slash (this: string): string\n \n to_backslash (this: string): string\n }\n \n \n interface Date {\n /** - ms?: `false` show ms */\n to_str (this: Date, ms?: boolean): string\n \n to_date_str (this: Date): string\n \n to_time_str (this: Date): string\n }\n \n \n interface Number {\n /** 12.4 KB (1 KB = 1024 B) */\n to_fsize_str (this: number, units?: 'iec' | 'metric'): string\n \n \n to_bin_str (this: number): string\n \n to_hex_str (this: number, length?: number): string\n \n to_oct_str (this: number): string\n }\n \n \n interface Array<T> {\n last: T\n \n log (this: string[], limit?: number): void\n \n indent (this: string[], width: number, c?: string): string[]\n \n indent2to4 (this: string[]): string[]\n \n \n // --- text processing\n /**\n - trim_line?: `true`\n - rm_empty_lines?: `true`\n - rm_last_empty_lines?: `false`\n */\n trim_lines (this: string[], { trim_line, rm_empty_lines, rm_last_empty_lines }?: { trim_line?: boolean, rm_empty_lines?: boolean, rm_last_empty_lines?: boolean }): string[]\n \n trim_license (this: string[]): string[]\n \n split_indents (this: string[]): { indent: number, text: string }[]\n \n join_lines (): string\n }\n}\n\n\nimport fs from 'fs'\n\nimport path from 'upath'\n// @ts-ignore\nimport byte_size from 'byte-size'\n\nimport EmojiRegex from 'emoji-regex'\n\nimport strip_ansi from 'strip-ansi'\nimport chalk from 'chalk'\n\nexport const emoji_regex = EmojiRegex()\n\nexport { chalk }\n\n\nexport function to_method_property_descriptors (methods: { [name: string]: Function }): PropertyDescriptorMap {\n return Object.fromEntries(\n Object.entries(methods)\n .map(([name, value]) => ([name, {\n configurable: true,\n writable: true,\n enumerable: false,\n value,\n } as PropertyDescriptor])\n ))\n}\n\n\nexport function to_getter_property_descriptors (getters: { [name: string]: Function }): PropertyDescriptorMap {\n return Object.fromEntries(\n Object.entries(getters)\n .map(([name, get]) => ([name, {\n configurable: true,\n enumerable: false,\n get,\n } as PropertyDescriptor])\n ))\n}\n\n\nexport const cjk = '([\\u2e80-\\u9fff\\uf900-\\ufaff])'\n\nexport const quotes = {\n single: \"'\",\n double: '\"',\n backtick: '`',\n}\n\nexport const brackets = {\n round: ['(', ')'],\n square: ['[', ']'],\n curly: ['{', '}'],\n pointy: ['<', '>'],\n corner: ['「', '」'],\n fat: ['【', '】'],\n tortoise_shell: ['〔', '〕'],\n} as const\n\nconst color_map = Object.fromEntries(\n ['red_', 'green_', 'yellow_', 'blue_', 'magenta_', 'cyan_'].map(color =>\n [color, `${color.slice(0, -1)}Bright`])\n)\n\n// ------------------------------------ String.prototype\nObject.defineProperties(String.prototype, {\n ... to_getter_property_descriptors({\n width (this: string) {\n const s = strip_ansi(\n this.replace(emoji_regex, ' ')\n )\n let width = 0\n for (let i = 0; i < s.length; i++) {\n const code = s.codePointAt(i)\n \n if (\n (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) || // ignore control characters\n code >= 0x300 && code <= 0x36f // ignore combining characters\n ) continue\n \n // surrogates\n if (code > 0xffff)\n i++\n \n width += is_codepoint_fullwidth(code) ? 2 : 1\n }\n return width\n }\n }),\n \n \n // ------------ text processing utils\n ... to_method_property_descriptors({\n /** truncate string with fixed width and preserve color */\n truncate (this: string, width: number) {\n const color_bak = this.startsWith('\\u001b') ? this.slice(0, 5) : ''\n const s = strip_ansi(this)\n if (width <= 2) return this.slice(0, width)\n let i_fitted = 0\n let fitted_width = 0\n let cur_width = 0\n for (let i = 0; i < s.length; i++) {\n const code = s.codePointAt(i)\n \n if (\n (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) || // Ignore control characters\n code >= 0x300 && code <= 0x36F // Ignore combining characters\n ) continue\n \n // surrogates (codepoint need two utf-16 encoding units, thus here skip the first in order to prevent repeated counting) \n if (code > 0xFFFF)\n i++\n \n const w = is_codepoint_fullwidth(code) ? 2 : 1\n \n if (cur_width + w + 2 <= width) {\n i_fitted = i\n fitted_width += w\n }\n \n cur_width += w\n \n if (cur_width > width) {\n const i_fitted_next = i_fitted + 1\n const t = s.slice(0, i_fitted_next) + ' '.repeat(width - 2 - fitted_width) + '…' \n return color_bak ? color_bak + t + '\\u001b[39m' : t\n }\n }\n return this\n },\n \n \n pad (this: string, width: number, { character = ' ', position = 'right' }: { character?: string, position?: 'left' | 'right'} = { }) {\n const _width = this.width\n if (_width >= width) return this\n if (position === 'right') return this + character.repeat( (width - _width) / character.width )\n return character.repeat(width - _width) + this\n },\n \n \n limit (this: string, width: number, { character = ' ', position = 'right' }: { character?: string, position?: 'left' | 'right'} = { }) {\n return this.pad(width, { character, position }).truncate(width)\n },\n \n \n to_regx (this: string, preservations: string, flags = ''): RegExp {\n const preserved_chars = new Set(preservations)\n const replace_chars: string = Array.prototype.filter.call('|\\\\{}()[]^$+*?.-', (c: string) => !preserved_chars.has(c))\n .map((c: string) => \n c === ']' ? '\\\\]' : c\n ).join('')\n \n return new RegExp( this.replace(new RegExp(`[${replace_chars}]`, 'g'), '\\\\$&'), flags)\n },\n \n \n to_bool (this: string) {\n return this.length && this !== '0' && this.toLowerCase() !== 'false'\n },\n \n refmt (this: string, \n pattern : string,\n pattern_: string,\n preservations: string = '',\n flags = '',\n transformer: (name: string, value: string, placeholders: { [name: string]: string }) => string = (name, value) => value || '',\n pattern_placeholder = /\\{.*?\\}/g,\n ): string {\n // --- convert pattern to pattern_regx\n let last_end = 0\n \n // placeholder matched group indexes\n let $placeholders: Record<string, number> = { }\n \n let regx_parts = [ ]\n \n function add_part (left: number, right?: number) {\n const part = pattern.slice(left, right)\n if (part)\n regx_parts.push(\n part.to_regx(preservations).source.bracket()\n )\n }\n \n pattern.replace(pattern_placeholder, ($0, offset) => {\n add_part(last_end, offset)\n last_end = offset + $0.length\n \n const placeholder = $0.slice(1, -1)\n let [placeholder_name, placeholder_pattern] = placeholder.split(':').map(s => s.trim())\n let optional = false\n if (placeholder_name.endsWith('?')) {\n placeholder_name = placeholder_name.slice(0, -1)\n optional = true\n }\n $placeholders[placeholder_name] = regx_parts.push(\n placeholder_pattern ? \n `${placeholder_pattern.bracket()}${optional ? '?' : ''}`\n :\n '(.*?)'\n )\n return ''\n })\n \n add_part(last_end)\n \n // modify last (.*?) to greedy in order to satisfy the situation of .{suffix}\n regx_parts = regx_parts.filter(part => part)\n if (regx_parts.last === '(.*?)')\n regx_parts[regx_parts.length - 1] = '(.*)'\n \n const pattern_regx = new RegExp(regx_parts.join(''), flags)\n \n \n // --- match original string based on pattern_regx, and get result to build placeholders dict\n const matches = pattern_regx.exec(this)\n \n if (!matches) return this\n \n const placeholders = Object.fromEntries(\n Object.entries($placeholders)\n .map(([name, $i]) => [\n [name, matches[$i]],\n [`${name}.before`, matches[$i - 1] || ''],\n [`${name}.after`, matches[$i + 1] || ''],\n ])\n .flat()\n )\n \n \n // --- convert pattern_ to replacement_str, if transformer exists then apply on placeholder\n last_end = 0\n let replacement_parts = [ ]\n \n pattern_.replace(pattern_placeholder, ($0, offset) => {\n replacement_parts.push(\n pattern_.slice(last_end, offset)\n )\n last_end = offset + $0.length\n \n const placeholder_name = $0.slice(1, -1)\n \n replacement_parts.push(\n transformer(placeholder_name, placeholders[placeholder_name], placeholders)\n )\n \n return ''\n })\n replacement_parts.push(\n pattern_.slice(last_end)\n )\n \n return this.replace(pattern_regx, replacement_parts.join(''))\n },\n \n \n find (this: string,\n pattern: string, \n preservations: string = '', \n flags = '', \n pattern_placeholder = /\\{.*?\\}/g\n ): Record<string, string> {\n // --- convert pattern to pattern_regx\n let last_end = 0\n \n // placeholder matched group index\n let $placeholders: Record<string, number> = { }\n \n let regx_parts = [ ]\n \n function add_part (left: number, right?: number) {\n const part = pattern.slice(left, right)\n if (part)\n regx_parts.push(\n part.to_regx(preservations).source.bracket()\n )\n }\n \n pattern.replace(pattern_placeholder, ($0, offset) => {\n add_part(last_end, offset)\n last_end = offset + $0.length\n \n const placeholder = $0.slice(1, -1)\n let [placeholder_name, placeholder_pattern] = placeholder.split(':').map(s => s.trim())\n let optional = false\n if (placeholder_name.endsWith('?')) {\n placeholder_name = placeholder_name.slice(0, -1)\n optional = true\n }\n \n $placeholders[placeholder_name] = regx_parts.push(\n placeholder_pattern ? \n `${placeholder_pattern.bracket()}${optional ? '?' : ''}`\n :\n '(.*?)'\n )\n return ''\n })\n \n add_part(last_end)\n \n // convert last (.*?) to greedy, to make .{suffix} work\n regx_parts = regx_parts.filter(part => part)\n if (regx_parts[regx_parts.length - 1] === '(.*?)')\n regx_parts[regx_parts.length - 1] = '(.*)'\n \n const pattern_regx = new RegExp(regx_parts.join(''), flags)\n \n \n // --- match original string based on pattern_regx, and get result to build placeholders dict\n const matches = pattern_regx.exec(this)\n \n if (!matches) return { }\n \n return Object.fromEntries(\n Object.entries($placeholders)\n .map(([name, $i]) => \n [name, matches[$i] || '']\n )\n )\n },\n \n quote (this: string, type: keyof typeof quotes | 'psh' = 'single') {\n if (type === 'psh')\n return `& ${this.quote()}`\n return this.surround(quotes[type])\n },\n \n \n bracket (this: string, shape: keyof typeof brackets = 'round') {\n return this.surround(...brackets[shape] as [string, string])\n },\n \n \n surround (this: string, left: string, right?: string) {\n return left + this + (right || left)\n },\n \n surround_tag (this: string, tag_name: string): string {\n return '<' + tag_name + '>' + this + '</' + tag_name + '>'\n },\n \n \n to_lf (this: string) {\n return this.replace(/\\r\\n/g, '\\n')\n },\n \n \n to_crlf (this: string) {\n return this.replace(/\\n/g, '\\r\\n')\n },\n \n \n rm (this: string, pattern: string | RegExp, flags: string = 'g') {\n if (typeof pattern === 'string')\n pattern = new RegExp(pattern, flags)\n \n return this.replace(pattern, '')\n },\n \n \n split_lines (this: string, delimiter: string | RegExp = /\\r?\\n/) {\n let lines = this.split(delimiter)\n if (lines.last === '')\n lines.pop()\n return lines\n },\n \n \n split_indent (this: string): { indent: number, text: string } {\n let i = 0\n let indent = 0\n for (; i < this.length; i++)\n if (this[i] === ' ')\n indent += 1\n else if (this[i] === '\\t')\n indent += 4\n else\n break\n \n return {\n indent,\n text: this.slice(i)\n }\n },\n \n \n trim_doc_comment (this: string) {\n return '/** ' + this.slice(3, -2).replace(/\\s*\\*\\s*/g, ' ').replace(/@(param|params|return) \\{.*?\\}\\s*/g, '').trim() + ' */'\n },\n \n \n to_base64 (this: string) {\n return Buffer.from(this).toString('base64')\n },\n \n \n decode_base64 (this: string, buffer = false) {\n const buf = Buffer.from(this, 'base64')\n if (buffer)\n return buf\n return buf.toString()\n },\n \n \n strip_ansi (this: string) {\n return strip_ansi(this)\n },\n \n \n space (this: string) {\n if (!this) return this\n let text_: string\n text_ = this\n .replace(new RegExp(cjk + `(['\"])`, 'g'), '$1 $2')\n .replace(new RegExp(`(['\"])` + cjk, 'g'), '$1 $2')\n \n .replace(/([\"']+)\\s*(.+?)\\s*([\"']+)/g, '$1$2$3')\n \n .replace(new RegExp(cjk + '([\\\\+\\\\-\\\\*\\\\/=&\\\\\\\\\\\\|<>])([A-Za-z0-9])', 'g'), '$1 $2 $3')\n .replace(new RegExp('([A-Za-z0-9])([\\\\+\\\\-\\\\*\\\\/=&\\\\\\\\\\\\|<>])' + cjk, 'g'), '$1 $2 $3')\n \n const textBak = text_\n \n text_ = text_.replace(new RegExp(cjk + '([\\\\(\\\\[\\\\{<\\u201c]+(.*?)[\\\\)\\\\]\\\\}>\\u201d]+)' + cjk, 'g'), '$1 $2 $4')\n \n if (text_ === textBak)\n text_ = text_\n .replace(new RegExp(cjk + '([\\\\(\\\\[\\\\{<\\u201c>])', 'g'), '$1 $2')\n .replace(new RegExp('([\\\\)\\\\]\\\\}>\\u201d<])' + cjk, 'g'), '$1 $2')\n \n return text_\n // eslint-disable-next-line no-useless-escape\n .replace(/([\\(\\[\\{<\\u201c]+)(\\s*)(.+?)(\\s*)([\\)\\]\\}>\\u201d]+)/g, '$1$3$5')\n .replace(new RegExp(cjk + '([~!;:,\\\\.\\\\?\\u2026])([A-Za-z0-9])', 'g'), '$1$2 $3')\n .replace(new RegExp(cjk + '([A-Za-z0-9`\\\\$%\\\\^&\\\\*\\\\-=\\\\+\\\\\\\\\\\\|\\\\/@\\u00a1-\\u00ff\\u2022\\u2027\\u2150-\\u218f])', 'g'), '$1 $2')\n .replace(new RegExp('([A-Za-z0-9`\\\\$%\\\\^&\\\\*\\\\-=\\\\+\\\\\\\\\\\\|\\\\/@\\u00a1-\\u00ff\\u2022\\u2027\\u2150-\\u218f])' + cjk, 'g'), '$1 $2')\n }\n }),\n \n \n // ------------ chalk colors\n ... Object.fromEntries(\n [\n 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'grey', \n 'red_', 'green_', 'yellow_', 'blue_', 'magenta_', 'cyan_',\n 'underline',\n ].map(color =>\n ([color, {\n configurable: true,\n get (this: string) {\n return chalk[color_map[color] || color](this)\n }\n }]))\n ),\n \n \n // ------------ file path ops\n ... to_getter_property_descriptors({\n fdir (this: string) {\n const dir = path.dirname(this)\n return dir.endsWith('/') ? dir : `${dir}/`\n },\n \n fname (this: string) {\n return path.basename(this)\n },\n \n fext (this: string) {\n return path.extname(this)\n },\n \n fexists (this: string) {\n return fs.existsSync(this)\n },\n \n is_dir (this: string) {\n if (this.endsWith('/')) return true\n try {\n return fs.lstatSync(this).isDirectory()\n } catch (error) {\n return false\n }\n },\n }),\n \n ... to_method_property_descriptors({\n to_slash (this: string) {\n if (!this) return this\n return path.normalizeSafe(this)\n },\n \n to_backslash (this: string) {\n return this.replaceAll('/', '\\\\')\n },\n })\n})\n\n\n// ------------------------------------ Date.prototype\nObject.defineProperties(Date.prototype, to_method_property_descriptors({\n to_str (this: Date) {\n const [ampm, hour] = (() => {\n let hour = this.getHours()\n if (hour <= 6)\n return ['凌晨', hour]\n \n if (hour <= 8)\n return ['清晨', hour]\n \n if (hour <= 9)\n return ['早上', hour]\n \n if (hour <= 10)\n return ['上午', hour]\n \n if (hour <= 12)\n return ['中午', hour]\n \n hour -= 12\n \n if (hour <= 5)\n return ['下午', hour]\n \n if (hour <= 10)\n return ['晚上', hour]\n \n return ['深夜', hour]\n })()\n \n \n return '' +\n // year.month.date\n `${this.getFullYear()}.${String(this.getMonth() + 1).pad(2, { character: '0', position: 'left' })}.${String(this.getDate()).pad(2, { character: '0', position: 'left' })} ` +\n // 上午 10:03:02\n `${ampm} ${String(hour).pad(2, { character: '0', position: 'left' })}:${String(this.getMinutes()).pad(2, { character: '0', position: 'left' })}:${String(this.getSeconds()).pad(2, { character: '0', position: 'left' })}`\n },\n \n to_date_str (this: Date) {\n return this.to_str().split(' ')[0]\n },\n \n to_time_str (this: Date) {\n const [, ampm, time ] = this.to_str().split(' ')\n return `${ampm} ${time}`\n },\n}))\n\n\n\n// ------------------------------------ Number.prototype\nObject.defineProperties(Number.prototype, to_method_property_descriptors({\n to_fsize_str (this: number, units: 'iec' | 'metric' = 'iec') {\n const { value, unit } = byte_size(this, { units })\n return `${value} ${(unit as string).rm('i')}`\n },\n \n to_bin_str (this: number) {\n return `0b${this.toString(2)}`\n },\n \n to_hex_str (this: number, length?: number) {\n const s = this.toString(16)\n if (!length)\n length = Math.ceil(s.length / 4) * 4\n return `0x${'0'.repeat(length - s.length)}${s}`\n },\n \n to_oct_str (this: number) {\n return `0o${this.toString(8)}`\n },\n}))\n\n\n\n// ------------------------------------ Array.prototype\nObject.defineProperties(Array.prototype, {\n ... to_getter_property_descriptors({\n last (this: any[]) {\n return this[this.length - 1]\n }\n }),\n \n \n // --- text processing methods\n ... to_method_property_descriptors({\n log (this: string[], limit: number = 10000) {\n const text = this.join('\\n') + '\\n'\n if (limit === -1 || this.length <= limit)\n console.log(text)\n else if (limit > 0)\n console.log(text.slice(0, limit) + '\\n...'.blue)\n else \n console.log('...\\n'.blue + text.slice(limit))\n },\n \n trim_lines (this: string[], { trim_line = true, rm_empty_lines = true, rm_last_empty_lines = false }: { trim_line?: boolean, rm_empty_lines?: boolean, rm_last_empty_lines?: boolean } = { }) {\n if (!this.length) return this\n let lines = this\n \n if (trim_line)\n lines = lines.map(line => line.trim() )\n \n if (rm_empty_lines)\n return lines.filter( line => line )\n \n if (rm_last_empty_lines) {\n lines.reverse()\n const i_not_empty = lines.findIndex( line => line )\n if (i_not_empty !== -1)\n lines = lines.slice(i_not_empty)\n lines.reverse()\n return lines\n }\n \n return lines\n },\n \n \n trim_license (this: string[]) {\n const i = this.indexOf('/*')\n const j = this.indexOf('*/')\n if (i === 0 && this[i+1].includes('License'))\n return this.slice(j+1)\n else\n return this\n },\n \n split_indents (this: string[]): { indent: number, text: string }[] {\n return this.map(line => \n line.split_indent()\n )\n },\n \n indent (this: string[], width?: number, character: string = ' ') {\n return this.map(line => \n character.repeat(width) + line\n )\n },\n \n indent2to4 (this: string[]) {\n return this.split_indents()\n .map(line => \n ' '.repeat(\n Math.floor(line.indent / 2) * 4\n ) + line.text\n )\n },\n \n join_lines (this: string[], append = true) {\n return `${this.join('\\n')}${append ? '\\n' : ''}`\n }\n })\n})\n\n\nexport function to_json (obj: any, replacer?: any) {\n return JSON.stringify(obj, replacer, 4) + '\\n'\n}\n\nexport function to_json_safely (obj: any, replacer?: any) {\n return to_json(obj, replacer)\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n .replace(/<\\/script>/g, '<\\\\/script>')\n}\n\n\nexport function is_codepoint_fullwidth (codepoint: number) {\n // code points are derived from:\n // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n return (\n !Number.isNaN(codepoint) &&\n codepoint >= 0x1100 &&\n (\n codepoint <= 0x115f || // hangul jamo\n \n codepoint === 0x201c || codepoint === 0x201d || // \n codepoint === 0x2026 || // …\n codepoint === 0x203b || // ※\n \n // arrows\n (0x2190 <= codepoint && codepoint <= 0x21FF) ||\n \n codepoint === 0x2329 || // left-pointing angle bracket\n codepoint === 0x232a || // right-pointing angle bracket\n \n // ①\n (0x2460 <= codepoint && codepoint <= 0x24ff) ||\n \n // box drawing\n (0x2500 <= codepoint && codepoint <= 0x257f) ||\n \n // shapes, symbols, …\n (0x2580 <= codepoint && codepoint <= 0x2bef) ||\n \n // cjk radicals supplement .. enclosed cjk letters and months\n (0x2e80 <= codepoint && codepoint <= 0x3247 && codepoint !== 0x303f) ||\n \n // enclosed cjk letters and months .. cjk unified ideographs extension a\n (0x3250 <= codepoint && codepoint <= 0x4dbf) ||\n \n // cjk unified ideographs .. yi radicals\n (0x4E00 <= codepoint && codepoint <= 0xA4C6) ||\n \n // hangul jamo extended-a\n (0xa960 <= codepoint && codepoint <= 0xa97c) ||\n \n // hangul syllables\n (0xac00 <= codepoint && codepoint <= 0xd7a3) ||\n \n // cjk compatibility ideographs\n (0xf900 <= codepoint && codepoint <= 0xfaff) ||\n \n // vertical forms\n (0xfe10 <= codepoint && codepoint <= 0xfe19) ||\n \n // cjk compatibility forms .. small form variants\n (0xfe30 <= codepoint && codepoint <= 0xfe6b) ||\n \n // halfwidth and fullwidth forms\n (0xff01 <= codepoint && codepoint <= 0xff60) ||\n (0xffe0 <= codepoint && codepoint <= 0xffe6) ||\n \n // kana supplement\n (0x1b000 <= codepoint && codepoint <= 0x1b001) ||\n \n // enclosed ideographic supplement\n (0x1f200 <= codepoint && codepoint <= 0x1f251) ||\n \n // cjk unified ideographs extension b .. tertiary ideographic plane\n (0x20000 <= codepoint && codepoint <= 0x3fffd)\n )\n )\n}\n"]}
package/repl.js CHANGED
@@ -191,9 +191,9 @@ function assign_var_decl(var_decl, destination = 'global') {
191
191
  function return_last_expr(statements) {
192
192
  if (!statements.length)
193
193
  return statements;
194
- const lastExpression = get_expr_of_stmt(statements.last);
195
- if (is_expr_stmt(lastExpression))
196
- return [...statements.slice(0, -1), factory.createReturnStatement(lastExpression.expression)];
194
+ const last_expr = get_expr_of_stmt(statements.last);
195
+ if (is_expr_stmt(last_expr))
196
+ return [...statements.slice(0, -1), factory.createReturnStatement(last_expr.expression)];
197
197
  else
198
198
  return statements;
199
199
  }
package/repl.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"repl.js","sourceRoot":"","sources":["repl.ts"],"names":[],"mappings":"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","sourcesContent":["import util from 'util'\nimport nvm from 'vm'\nimport repl from 'repl'\nimport process from 'process'\nimport fs from 'fs'\n\n\n\nimport {\n default as ts,\n type SourceFile,\n type Node,\n type Statement, \n type Modifier,\n type SyntaxKind as TSyntaxKind,\n type Identifier,\n type StringLiteral,\n type ExpressionStatement,\n type ObjectBindingPattern,\n type BindingElement,\n} from 'typescript'\n\nimport type { Context } from 'koa'\n\n\nimport './prototype'\nimport { log_section, log_line, delay, inspect, output_width } from './utils'\nimport { fread, fwrite, fwatchers, create_mfs, set_ufs, UFS } from './file'\nimport { fp_root } from './process.js'\n\n\ndeclare global {\n var __: any\n \n var started_at: Date\n \n var repl_router: (ctx: Context) => Promise<boolean>\n}\n\n\n// ------------ inspect options\n\nutil.inspect.defaultOptions.maxArrayLength = 40\ntry {\n util.inspect.defaultOptions.maxStringLength = 10000\n} catch {\n console.error('set util.inspect.defaultOptions.maxStringLength error')\n}\nutil.inspect.defaultOptions.breakLength = output_width\nutil.inspect.defaultOptions.colors = true\nutil.inspect.defaultOptions.compact = false\nutil.inspect.defaultOptions.getters = true\nutil.inspect.defaultOptions.depth = 2\nutil.inspect.defaultOptions.sorted = false\nutil.inspect.defaultOptions.showProxy = true\n\nutil.inspect.styles.number = 'green'\nutil.inspect.styles.string = 'cyan'\nutil.inspect.styles.boolean = 'blue'\nutil.inspect.styles.date = 'magenta'\nutil.inspect.styles.special = 'white'\n\n\n\n\nconst {\n factory,\n \n SyntaxKind, \n NodeFlags,\n ModifierFlags,\n \n isIdentifier: is_identifier, \n isNamedImports: is_named_imports,\n isImportDeclaration: is_import_decl,\n isAwaitExpression: is_await_expr,\n isExpressionStatement: is_expr_stmt,\n isVariableStatement: is_var_stmt,\n isNamespaceImport: is_namespace_import,\n isClassDeclaration: is_class_decl,\n isCallExpression: is_call_expr,\n isReturnStatement: is_return_stmt,\n isBinaryExpression: is_binary_expr,\n isFunctionDeclaration: is_func_decl,\n \n createPrinter: create_printer,\n} = ts\n\n\nlet inspection_limit = 10000\nlet printing_compiled_js = false\n\n\n\nexport function set_inspection_limit (limit: number = 10000) {\n if (limit === -1)\n limit = 50 * 10**4\n inspection_limit = limit\n}\n\n\nexport function set_printing_compiled_js (enabled: boolean) {\n printing_compiled_js = enabled\n}\n\n\n// ------------------------------------ Code Compilers, Transformers\nfunction resolve_kind (kind: TSyntaxKind) {\n if (kind === SyntaxKind.VariableStatement) return 'VariableStatement'\n return SyntaxKind[kind]\n}\n\n\nfunction print_ast (nodes: Node[] | Node, sourceFile: SourceFile) {\n function print_node (node: Node) {\n console.log(`${ resolve_kind(node.kind) }: ${ node.getText(sourceFile) }`)\n }\n if (Array.isArray(nodes))\n nodes.forEach( node => { print_node(node) })\n else\n print_node(nodes)\n}\n\n\nexport function parse_code (code: string) {\n return ts.createSourceFile('REPL.ts', code, ts.ScriptTarget.ESNext)\n}\n\n\nexport function generate_code (stmts: Statement[]) {\n return create_printer({ omitTrailingSemicolon: true, removeComments: false, newLine: ts.NewLineKind.LineFeed })\n .printFile(\n factory.updateSourceFile(\n ts.createSourceFile('output.ts', '', ts.ScriptTarget.ESNext),\n stmts\n )\n )\n}\n\n\n\nfunction trans_import_2_require (import_decl: Statement) {\n if (!is_import_decl(import_decl)) return import_decl\n \n const { importClause: import_clause, moduleSpecifier: module_specifier } = import_decl\n \n // require('module_specifier')\n const require_module_stmt = factory.createCallExpression( factory.createIdentifier('require'), [ ], [ module_specifier ])\n \n // aaa, bbb as ccc, default as ddd, ...\n // (import_clause.namedBindings as NamedImports).elements\n \n return [\n // import mod from 'mod'\n // global.mod = __importDefault(require(\"mod\")).default\n ... import_clause.name ? [\n factory.createExpressionStatement( factory.createAssignment(\n factory.createPropertyAccessExpression( factory.createIdentifier('global'), import_clause.name),\n factory.createPropertyAccessExpression( factory.createCallExpression( factory.createIdentifier('__importDefault'), [ ], [ require_module_stmt ]), 'default'),\n )\n ) ] : [ ],\n \n // import * as mod from 'mod'\n // global.mod = __importStar(require(\"mod\"))\n ... import_clause.namedBindings && is_namespace_import(import_clause.namedBindings) ? [\n factory.createExpressionStatement( factory.createAssignment(\n factory.createPropertyAccessExpression( factory.createIdentifier('global'), import_clause.namedBindings.name),\n factory.createCallExpression( factory.createIdentifier('__importStar'), [ ], [ require_module_stmt ])\n ))\n ] : [ ],\n \n \n // import { element2 as element2_, element3 as element3_, other, default as mod2 } from 'mod2'\n ... import_clause.namedBindings && is_named_imports(import_clause.namedBindings) ? [\n // var { element2: element2_, element3 } = __importDefault(require(\"mod\"))\n factory.createVariableStatement([ ], [ factory.createVariableDeclaration(\n factory.createObjectBindingPattern(\n // ImportSpecifier[] -> ObjectBindingPattern.BindingElement[]\n import_clause.namedBindings.elements.map( import_specifier => \n factory.createBindingElement(\n undefined, \n import_specifier.propertyName, \n import_specifier.name, \n import_specifier.propertyName?.text === 'default' ? require_module_stmt : undefined\n ))),\n undefined,\n undefined,\n require_module_stmt\n ) ]),\n \n // Object.assign(global, { element2_, element3 })\n factory.createExpressionStatement( factory.createCallExpression(\n factory.createPropertyAccessExpression( factory.createIdentifier('Object'), 'assign'),\n [ ],\n // ImportSpecifier[] -> ObjectBindingPattern.BindingElement[]\n [ factory.createIdentifier('global'), factory.createObjectLiteralExpression( import_clause.namedBindings.elements.map( import_specifier => factory.createShorthandPropertyAssignment(import_specifier.name) ), false) ]\n )),\n \n factory.createExpressionStatement(\n import_clause.namedBindings.elements.length === 1 ? \n // (a)\n factory.createParenthesizedExpression(import_clause.namedBindings.elements[0].name)\n : // ({ a: xxx, b: xxx })\n factory.createObjectLiteralExpression( import_clause.namedBindings.elements.map( import_specifier => factory.createShorthandPropertyAssignment(import_specifier.name) ), false)\n )\n ] : [ ],\n ]\n}\n\n\n/** export function foo () { } */\nfunction trans_export_stmt (stmt: Statement) {\n if (ts.isExportAssignment(stmt))\n return factory.createExpressionStatement(stmt.expression)\n \n function is_export_modifier (modifier: Modifier) {\n return modifier.flags & ModifierFlags.Export || modifier.flags & ModifierFlags.ExportDefault || modifier.kind === SyntaxKind.ExportKeyword\n }\n \n if (stmt.modifiers?.some( modifier => is_export_modifier(modifier) )) {\n // @ts-ignore\n stmt.modifiers = factory.createNodeArray<Modifier>(\n stmt.modifiers.filter( modifier => !is_export_modifier(modifier) )\n )\n return stmt\n }\n \n return stmt\n}\n\n\nfunction trans_require_2_import (stmt: Statement, source_file: SourceFile) {\n if (!is_var_stmt(stmt)) return stmt\n const { name, initializer: require_call } = stmt.declarationList.declarations[0]\n \n if (!is_call_expr(require_call) || require_call.expression.getText(source_file) !== 'require') return stmt\n \n const modpath = require_call.arguments[0] as StringLiteral\n \n // createNamedImports(createImportSpecifier())\n \n return factory.createImportDeclaration(\n undefined, \n undefined,\n factory.createImportClause(false, name as Identifier, undefined),\n modpath\n )\n}\n\n\n/** const a = 123, b = 234, { c, d: e } = obj */\nfunction trans_variable_decl_2_var (var_decl: Statement) {\n if (!is_var_stmt(var_decl)) return var_decl\n // @ts-ignore\n var_decl.declarationList.flags = NodeFlags.None\n return var_decl\n}\n\n\nfunction trans_class_decl_2_expr (class_decl: Statement) {\n if (!is_class_decl(class_decl)) return class_decl\n \n // stmts like 'export class C { }' were moved 'export modifier' in 'trans_export_stmt'\n \n return factory.createVariableStatement(\n [ ],\n factory.createVariableDeclarationList([\n factory.createVariableDeclaration(\n class_decl.name, \n undefined, \n undefined, \n factory.createClassExpression(undefined, undefined, class_decl.name, undefined, undefined, class_decl.members)\n )\n ]))\n}\n\n\nfunction get_expr_of_stmt (statement: Statement): ExpressionStatement | Statement {\n if (is_expr_stmt(statement))\n return statement\n \n if (is_var_stmt(statement)) {\n const { declarations } = statement.declarationList\n return factory.createExpressionStatement(\n declarations.length === 1 ?\n (() => {\n const { name } = declarations[0]\n if (is_identifier(name)) // const a = c\n return name\n else // const { a, b } = c\n return factory.createObjectLiteralExpression(\n name.elements\n .filter(({ name }: BindingElement) => \n is_identifier(name))\n .map(({ name }: BindingElement) => \n factory.createShorthandPropertyAssignment(name as Identifier))\n )\n })()\n :\n factory.createObjectLiteralExpression(\n declarations.map( var_decl => \n factory.createShorthandPropertyAssignment(var_decl.name as Identifier)),\n true)\n )\n }\n \n if (is_func_decl(statement))\n return factory.createExpressionStatement(statement.name)\n \n return statement\n}\n\nfunction trans_return_2_expr (stmt: Statement): Statement {\n if (!is_return_stmt(stmt)) return stmt\n return factory.createExpressionStatement(stmt.expression)\n}\n\n\nfunction assign_var_decl (var_decl: Statement, destination: string = 'global') {\n if (!is_var_stmt(var_decl))\n return [var_decl]\n \n // VariableDeclaration[] -> ObjectLiteral[]\n // const a = 123, b = 234, { c, d: e } = obj\n const obj_literal =\n factory.createObjectLiteralExpression(\n var_decl.declarationList.declarations.map( declaration => \n is_identifier(declaration.name) ?\n [ factory.createShorthandPropertyAssignment(declaration.name) ]\n : // ObjectBindingPattern\n (declaration.name as ObjectBindingPattern).elements.map( (element: BindingElement) => factory.createShorthandPropertyAssignment(element.name as Identifier))\n ).flat()\n , true\n )\n \n \n return [\n var_decl,\n factory.createExpressionStatement( factory.createCallExpression(\n factory.createPropertyAccessExpression( factory.createIdentifier('Object'), 'assign'),\n [ ],\n [ factory.createIdentifier(destination), obj_literal ]\n )),\n factory.createExpressionStatement(obj_literal)\n ]\n}\n\n\nfunction return_last_expr (statements: Statement[]) {\n if (!statements.length) return statements\n \n const lastExpression = get_expr_of_stmt(statements.last)\n if (is_expr_stmt(lastExpression))\n return [ ...statements.slice(0, -1), factory.createReturnStatement(lastExpression.expression) ]\n else\n return statements\n}\n\n\nfunction wrap_await_stmt (statements: Statement[], code: string) {\n function wrap (stmts: Statement[]) {\n return [\n factory.createExpressionStatement(\n factory.createCallExpression(\n factory.createFunctionExpression(\n [ factory.createModifier(SyntaxKind.AsyncKeyword) ],\n undefined,\n 'async_wrapper',\n [ ],\n [ ],\n undefined,\n factory.createBlock(\n return_last_expr(\n stmts.map(statement => assign_var_decl(statement)).flat()\n )\n , true)\n ),\n [ ],\n [ ]\n )\n ),\n ]\n }\n \n if (!code.includes('await')) return statements\n \n if (code.includes('await') && !code.includes('async ')) return wrap(statements)\n \n if (statements.some( stmt => (\n is_expr_stmt(stmt) && is_await_expr(stmt.expression) ||\n is_var_stmt(stmt) && stmt.declarationList.declarations.some( var_decl => \n var_decl.initializer && is_await_expr(var_decl.initializer)\n ) ||\n is_expr_stmt(stmt) && is_call_expr(stmt.expression) && stmt.expression.arguments.some( expr => is_await_expr(expr)) ||\n is_expr_stmt(stmt) && is_binary_expr(stmt.expression) && is_await_expr(stmt.expression.right)\n )))\n return wrap(statements)\n \n return statements\n}\n\n\nexport async function compile_ts ({\n fp, \n code, \n print = printing_compiled_js, \n save = false,\n}: {\n fp?: string\n code?: string\n print?: boolean\n save?: boolean\n} = { }): Promise<string> {\n if (!code && fp)\n code = await fread(fp)\n \n const source_file = parse_code(code)\n \n let statements: Statement[] = [...source_file.statements]\n statements = statements.map(trans_import_2_require).flat()\n statements = statements.map(trans_export_stmt)\n statements = statements.map(trans_class_decl_2_expr)\n statements = wrap_await_stmt(statements, code)\n statements = statements.map(trans_variable_decl_2_var)\n statements = statements.map(trans_return_2_expr)\n \n if (statements.length) {\n const last_stmt = statements[statements.length - 1]\n const last_expr = get_expr_of_stmt(last_stmt)\n if (last_expr !== last_stmt)\n statements = [...statements, last_expr]\n }\n \n \n code = generate_code(statements)\n \n let { diagnostics, outputText: output_text } = ts.transpileModule(code, { compilerOptions: ts_options_commonjs_repl })\n \n if (diagnostics.length) {\n console.log(diagnostics.join('\\n\\n\\n'))\n log_line()\n }\n \n if (print) {\n console.log(output_text)\n log_line()\n }\n \n if (fp && save)\n await fwrite(fp.replace(/\\.ts(x?)$/, '.js$1'), output_text)\n \n return output_text\n}\n\n\n/** tsconfig.compilerOptions */\nexport let ts_options: any\nexport let ts_options_commonjs: any\nexport let ts_options_commonjs_repl: any\n\nexport async function load_tsconfig () {\n const fp = `${fp_root}tsconfig.json`\n ;({ config: { compilerOptions: ts_options } } = ts.parseConfigFileTextToJson(\n fp, \n await fread(fp, { print: false })\n ))\n \n ts_options_commonjs = {\n ...ts_options,\n \n module: 'CommonJS',\n incremental: false,\n \n // determine CommonJS module require method\n esModuleInterop: true,\n }\n \n ts_options_commonjs_repl = {\n ...ts_options,\n \n module: 'CommonJS',\n esModuleInterop: true,\n \n // nvm.runInThisContext doesn't support inline source map\n sourceMap: false,\n }\n}\n\n\nlet eval_id = 0\n\nexport async function eval_ts (code: string) {\n try {\n const js = await compile_ts({ code })\n global.__ = await nvm.runInThisContext(js, `repl/${eval_id++}.ts`)\n \n return global.__\n } catch (error) {\n console.error(error)\n return error\n }\n}\n\n\n// ------------------------------------ repl\nexport async function repl_code (type: string, ...args: any[]) {\n log_line()\n \n // --- run code\n global.__ = await global['eval_' + type](...args)\n \n log_line()\n \n if (type !== 'shell')\n console.log(\n inspect(global.__, { limit: inspection_limit })\n )\n \n \n console.log('\\n'.repeat(2))\n}\n\n\nexport async function start_repl () {\n // ------------ load library\n log_section('xshell is booting ...', { time: true })\n \n log_mod_loaded('prototype')\n log_mod_loaded('utils')\n log_mod_loaded('file')\n \n const mfs = create_mfs()\n set_ufs(\n new UFS([mfs, fs])\n )\n log_mod_loaded('ufs')\n \n log_mod_loaded('process')\n log_mod_loaded('net')\n \n // --- prevent from exiting\n process.on('uncaughtException', error => {\n console.error(error)\n })\n \n // --- start nodejs repl\n repl.start({\n prompt: '',\n replMode: repl.REPL_MODE_SLOPPY,\n useGlobal: true,\n useColors: true,\n terminal: true,\n })\n \n log_section('repl initialized', { color: 'yellow', time: true })\n \n process.title = 'xshell'\n \n await Promise.all([\n pollute_global(),\n \n load_tsconfig(),\n \n (async () => {\n // --- http server\n log_section('server is initializing', { color: 'green', time: true })\n let { server } = await import('./server.js')\n await server.start()\n log_section('server initialized', { color: 'green', time: true })\n })(),\n ])\n \n log_section('xshell booted successfully', { color: 'red', time: true })\n console.log('xshell is listening at http://0.0.0.0:8421'.green)\n}\n\n\nexport async function stop () {\n log_section('xshell is exiting', { color: 'red' })\n \n for (const key in fwatchers)\n fwatchers[key].close()\n \n ;(await import('./server.js'))\n .server.stop()\n}\n\nexport async function exit () {\n await stop()\n await delay(100)\n process.exit()\n}\n\n\nexport async function pollute_global () {\n Object.assign(global, {\n __importDefault: (mod: any) => ((mod?.__esModule) ? mod : { default: mod }),\n __importStar: (mod: any) => {\n if (mod?.__esModule) return mod\n let result: { default?: any } = { }\n if (mod != null)\n for (let k in mod)\n if (Object.hasOwnProperty.call(mod, k))\n result[k] = mod[k]\n result.default = mod\n return result\n },\n exports: global\n })\n \n await Promise.all([\n pollute_module_default_export('upath', 'path'),\n pollute_module_default_export('cheerio', 'cheerio'),\n \n pollute_module_default_export('lodash/omit.js', 'omit'),\n pollute_module_default_export('lodash/sortBy.js', 'sort_by'),\n pollute_module_default_export('lodash/groupBy.js', 'group_by'),\n \n pollute_module_default_export('qs', 'qs'),\n \n pollute_module_exports('./prototype.js'),\n pollute_module_exports('./utils.js'),\n pollute_module_exports('./process.js'),\n pollute_module_exports('./file.js'),\n pollute_module_exports('./net.js'),\n pollute_module_exports('./server.js'),\n pollute_module_exports('./repl.js'),\n ])\n \n log_section('all modules were loaded', { color: 'green', time: true })\n}\n\n\nexport async function pollute_module_exports (fp_mod: string) {\n Object.assign(\n global,\n await import(fp_mod)\n )\n}\n\nexport async function pollute_module_default_export (fp_mod: string, name: string) {\n global[name] = (\n await import(fp_mod)\n ).default\n}\n\n\nfunction log_mod_loaded (id: string) {\n console.log(`${id.pad(20)}loaded`)\n}\n\n"]}
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["repl.ts"],"names":[],"mappings":"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","sourcesContent":["import util from 'util'\nimport nvm from 'vm'\nimport repl from 'repl'\nimport process from 'process'\nimport fs from 'fs'\n\n\n\nimport {\n default as ts,\n type SourceFile,\n type Node,\n type Statement, \n type Modifier,\n type SyntaxKind as TSyntaxKind,\n type Identifier,\n type StringLiteral,\n type ExpressionStatement,\n type ObjectBindingPattern,\n type BindingElement,\n} from 'typescript'\n\nimport type { Context } from 'koa'\n\n\nimport './prototype'\nimport { log_section, log_line, delay, inspect, output_width } from './utils'\nimport { fread, fwrite, fwatchers, create_mfs, set_ufs, UFS } from './file'\nimport { fp_root } from './process.js'\n\n\ndeclare global {\n var __: any\n \n var started_at: Date\n \n var repl_router: (ctx: Context) => Promise<boolean>\n}\n\n\n// ------------ inspect options\n\nutil.inspect.defaultOptions.maxArrayLength = 40\ntry {\n util.inspect.defaultOptions.maxStringLength = 10000\n} catch {\n console.error('set util.inspect.defaultOptions.maxStringLength error')\n}\nutil.inspect.defaultOptions.breakLength = output_width\nutil.inspect.defaultOptions.colors = true\nutil.inspect.defaultOptions.compact = false\nutil.inspect.defaultOptions.getters = true\nutil.inspect.defaultOptions.depth = 2\nutil.inspect.defaultOptions.sorted = false\nutil.inspect.defaultOptions.showProxy = true\n\nutil.inspect.styles.number = 'green'\nutil.inspect.styles.string = 'cyan'\nutil.inspect.styles.boolean = 'blue'\nutil.inspect.styles.date = 'magenta'\nutil.inspect.styles.special = 'white'\n\n\n\n\nconst {\n factory,\n \n SyntaxKind, \n NodeFlags,\n ModifierFlags,\n \n isIdentifier: is_identifier, \n isNamedImports: is_named_imports,\n isImportDeclaration: is_import_decl,\n isAwaitExpression: is_await_expr,\n isExpressionStatement: is_expr_stmt,\n isVariableStatement: is_var_stmt,\n isNamespaceImport: is_namespace_import,\n isClassDeclaration: is_class_decl,\n isCallExpression: is_call_expr,\n isReturnStatement: is_return_stmt,\n isBinaryExpression: is_binary_expr,\n isFunctionDeclaration: is_func_decl,\n \n createPrinter: create_printer,\n} = ts\n\n\nlet inspection_limit = 10000\nlet printing_compiled_js = false\n\n\n\nexport function set_inspection_limit (limit: number = 10000) {\n if (limit === -1)\n limit = 50 * 10**4\n inspection_limit = limit\n}\n\n\nexport function set_printing_compiled_js (enabled: boolean) {\n printing_compiled_js = enabled\n}\n\n\n// ------------------------------------ Code Compilers, Transformers\nfunction resolve_kind (kind: TSyntaxKind) {\n if (kind === SyntaxKind.VariableStatement) return 'VariableStatement'\n return SyntaxKind[kind]\n}\n\n\nfunction print_ast (nodes: Node[] | Node, sourceFile: SourceFile) {\n function print_node (node: Node) {\n console.log(`${ resolve_kind(node.kind) }: ${ node.getText(sourceFile) }`)\n }\n if (Array.isArray(nodes))\n nodes.forEach( node => { print_node(node) })\n else\n print_node(nodes)\n}\n\n\nexport function parse_code (code: string) {\n return ts.createSourceFile('REPL.ts', code, ts.ScriptTarget.ESNext)\n}\n\n\nexport function generate_code (stmts: Statement[]) {\n return create_printer({ omitTrailingSemicolon: true, removeComments: false, newLine: ts.NewLineKind.LineFeed })\n .printFile(\n factory.updateSourceFile(\n ts.createSourceFile('output.ts', '', ts.ScriptTarget.ESNext),\n stmts\n )\n )\n}\n\n\n\nfunction trans_import_2_require (import_decl: Statement) {\n if (!is_import_decl(import_decl)) return import_decl\n \n const { importClause: import_clause, moduleSpecifier: module_specifier } = import_decl\n \n // require('module_specifier')\n const require_module_stmt = factory.createCallExpression( factory.createIdentifier('require'), [ ], [ module_specifier ])\n \n // aaa, bbb as ccc, default as ddd, ...\n // (import_clause.namedBindings as NamedImports).elements\n \n return [\n // import mod from 'mod'\n // global.mod = __importDefault(require(\"mod\")).default\n ... import_clause.name ? [\n factory.createExpressionStatement( factory.createAssignment(\n factory.createPropertyAccessExpression( factory.createIdentifier('global'), import_clause.name),\n factory.createPropertyAccessExpression( factory.createCallExpression( factory.createIdentifier('__importDefault'), [ ], [ require_module_stmt ]), 'default'),\n )\n ) ] : [ ],\n \n // import * as mod from 'mod'\n // global.mod = __importStar(require(\"mod\"))\n ... import_clause.namedBindings && is_namespace_import(import_clause.namedBindings) ? [\n factory.createExpressionStatement( factory.createAssignment(\n factory.createPropertyAccessExpression( factory.createIdentifier('global'), import_clause.namedBindings.name),\n factory.createCallExpression( factory.createIdentifier('__importStar'), [ ], [ require_module_stmt ])\n ))\n ] : [ ],\n \n \n // import { element2 as element2_, element3 as element3_, other, default as mod2 } from 'mod2'\n ... import_clause.namedBindings && is_named_imports(import_clause.namedBindings) ? [\n // var { element2: element2_, element3 } = __importDefault(require(\"mod\"))\n factory.createVariableStatement([ ], [ factory.createVariableDeclaration(\n factory.createObjectBindingPattern(\n // ImportSpecifier[] -> ObjectBindingPattern.BindingElement[]\n import_clause.namedBindings.elements.map( import_specifier => \n factory.createBindingElement(\n undefined, \n import_specifier.propertyName, \n import_specifier.name, \n import_specifier.propertyName?.text === 'default' ? require_module_stmt : undefined\n ))),\n undefined,\n undefined,\n require_module_stmt\n ) ]),\n \n // Object.assign(global, { element2_, element3 })\n factory.createExpressionStatement( factory.createCallExpression(\n factory.createPropertyAccessExpression( factory.createIdentifier('Object'), 'assign'),\n [ ],\n // ImportSpecifier[] -> ObjectBindingPattern.BindingElement[]\n [ factory.createIdentifier('global'), factory.createObjectLiteralExpression( import_clause.namedBindings.elements.map( import_specifier => factory.createShorthandPropertyAssignment(import_specifier.name) ), false) ]\n )),\n \n factory.createExpressionStatement(\n import_clause.namedBindings.elements.length === 1 ? \n // (a)\n factory.createParenthesizedExpression(import_clause.namedBindings.elements[0].name)\n : // ({ a: xxx, b: xxx })\n factory.createObjectLiteralExpression( import_clause.namedBindings.elements.map( import_specifier => factory.createShorthandPropertyAssignment(import_specifier.name) ), false)\n )\n ] : [ ],\n ]\n}\n\n\n/** export function foo () { } */\nfunction trans_export_stmt (stmt: Statement) {\n if (ts.isExportAssignment(stmt))\n return factory.createExpressionStatement(stmt.expression)\n \n function is_export_modifier (modifier: Modifier) {\n return modifier.flags & ModifierFlags.Export || modifier.flags & ModifierFlags.ExportDefault || modifier.kind === SyntaxKind.ExportKeyword\n }\n \n if (stmt.modifiers?.some( modifier => is_export_modifier(modifier) )) {\n // @ts-ignore\n stmt.modifiers = factory.createNodeArray<Modifier>(\n stmt.modifiers.filter( modifier => !is_export_modifier(modifier) )\n )\n return stmt\n }\n \n return stmt\n}\n\n\nfunction trans_require_2_import (stmt: Statement, source_file: SourceFile) {\n if (!is_var_stmt(stmt)) return stmt\n const { name, initializer: require_call } = stmt.declarationList.declarations[0]\n \n if (!is_call_expr(require_call) || require_call.expression.getText(source_file) !== 'require') return stmt\n \n const modpath = require_call.arguments[0] as StringLiteral\n \n // createNamedImports(createImportSpecifier())\n \n return factory.createImportDeclaration(\n undefined, \n undefined,\n factory.createImportClause(false, name as Identifier, undefined),\n modpath\n )\n}\n\n\n/** const a = 123, b = 234, { c, d: e } = obj */\nfunction trans_variable_decl_2_var (var_decl: Statement) {\n if (!is_var_stmt(var_decl)) return var_decl\n // @ts-ignore\n var_decl.declarationList.flags = NodeFlags.None\n return var_decl\n}\n\n\nfunction trans_class_decl_2_expr (class_decl: Statement) {\n if (!is_class_decl(class_decl)) return class_decl\n \n // stmts like 'export class C { }' were moved 'export modifier' in 'trans_export_stmt'\n \n return factory.createVariableStatement(\n [ ],\n factory.createVariableDeclarationList([\n factory.createVariableDeclaration(\n class_decl.name, \n undefined, \n undefined, \n factory.createClassExpression(undefined, undefined, class_decl.name, undefined, undefined, class_decl.members)\n )\n ]))\n}\n\n\nfunction get_expr_of_stmt (statement: Statement): ExpressionStatement | Statement {\n if (is_expr_stmt(statement))\n return statement\n \n if (is_var_stmt(statement)) {\n const { declarations } = statement.declarationList\n return factory.createExpressionStatement(\n declarations.length === 1 ?\n (() => {\n const { name } = declarations[0]\n if (is_identifier(name)) // const a = c\n return name\n else // const { a, b } = c\n return factory.createObjectLiteralExpression(\n name.elements\n .filter(({ name }: BindingElement) => \n is_identifier(name))\n .map(({ name }: BindingElement) => \n factory.createShorthandPropertyAssignment(name as Identifier))\n )\n })()\n :\n factory.createObjectLiteralExpression(\n declarations.map( var_decl => \n factory.createShorthandPropertyAssignment(var_decl.name as Identifier)),\n true)\n )\n }\n \n if (is_func_decl(statement))\n return factory.createExpressionStatement(statement.name)\n \n return statement\n}\n\nfunction trans_return_2_expr (stmt: Statement): Statement {\n if (!is_return_stmt(stmt)) return stmt\n return factory.createExpressionStatement(stmt.expression)\n}\n\n\nfunction assign_var_decl (var_decl: Statement, destination: string = 'global') {\n if (!is_var_stmt(var_decl))\n return [var_decl]\n \n // VariableDeclaration[] -> ObjectLiteral[]\n // const a = 123, b = 234, { c, d: e } = obj\n const obj_literal =\n factory.createObjectLiteralExpression(\n var_decl.declarationList.declarations.map( declaration => \n is_identifier(declaration.name) ?\n [ factory.createShorthandPropertyAssignment(declaration.name) ]\n : // ObjectBindingPattern\n (declaration.name as ObjectBindingPattern).elements.map( (element: BindingElement) => factory.createShorthandPropertyAssignment(element.name as Identifier))\n ).flat()\n , true\n )\n \n \n return [\n var_decl,\n factory.createExpressionStatement( factory.createCallExpression(\n factory.createPropertyAccessExpression( factory.createIdentifier('Object'), 'assign'),\n [ ],\n [ factory.createIdentifier(destination), obj_literal ]\n )),\n factory.createExpressionStatement(obj_literal)\n ]\n}\n\n\nfunction return_last_expr (statements: Statement[]) {\n if (!statements.length) return statements\n \n const last_expr = get_expr_of_stmt(statements.last)\n if (is_expr_stmt(last_expr))\n return [ ...statements.slice(0, -1), factory.createReturnStatement(last_expr.expression) ]\n else\n return statements\n}\n\n\nfunction wrap_await_stmt (statements: Statement[], code: string) {\n function wrap (stmts: Statement[]) {\n return [\n factory.createExpressionStatement(\n factory.createCallExpression(\n factory.createFunctionExpression(\n [ factory.createModifier(SyntaxKind.AsyncKeyword) ],\n undefined,\n 'async_wrapper',\n [ ],\n [ ],\n undefined,\n factory.createBlock(\n return_last_expr(\n stmts.map(statement => assign_var_decl(statement)).flat()\n )\n , true)\n ),\n [ ],\n [ ]\n )\n ),\n ]\n }\n \n if (!code.includes('await')) return statements\n \n if (code.includes('await') && !code.includes('async ')) return wrap(statements)\n \n if (statements.some( stmt => (\n is_expr_stmt(stmt) && is_await_expr(stmt.expression) ||\n is_var_stmt(stmt) && stmt.declarationList.declarations.some( var_decl => \n var_decl.initializer && is_await_expr(var_decl.initializer)\n ) ||\n is_expr_stmt(stmt) && is_call_expr(stmt.expression) && stmt.expression.arguments.some( expr => is_await_expr(expr)) ||\n is_expr_stmt(stmt) && is_binary_expr(stmt.expression) && is_await_expr(stmt.expression.right)\n )))\n return wrap(statements)\n \n return statements\n}\n\n\nexport async function compile_ts ({\n fp, \n code, \n print = printing_compiled_js, \n save = false,\n}: {\n fp?: string\n code?: string\n print?: boolean\n save?: boolean\n} = { }): Promise<string> {\n if (!code && fp)\n code = await fread(fp)\n \n const source_file = parse_code(code)\n \n let statements: Statement[] = [...source_file.statements]\n statements = statements.map(trans_import_2_require).flat()\n statements = statements.map(trans_export_stmt)\n statements = statements.map(trans_class_decl_2_expr)\n statements = wrap_await_stmt(statements, code)\n statements = statements.map(trans_variable_decl_2_var)\n statements = statements.map(trans_return_2_expr)\n \n if (statements.length) {\n const last_stmt = statements[statements.length - 1]\n const last_expr = get_expr_of_stmt(last_stmt)\n if (last_expr !== last_stmt)\n statements = [...statements, last_expr]\n }\n \n \n code = generate_code(statements)\n \n let { diagnostics, outputText: output_text } = ts.transpileModule(code, { compilerOptions: ts_options_commonjs_repl })\n \n if (diagnostics.length) {\n console.log(diagnostics.join('\\n\\n\\n'))\n log_line()\n }\n \n if (print) {\n console.log(output_text)\n log_line()\n }\n \n if (fp && save)\n await fwrite(fp.replace(/\\.ts(x?)$/, '.js$1'), output_text)\n \n return output_text\n}\n\n\n/** tsconfig.compilerOptions */\nexport let ts_options: any\nexport let ts_options_commonjs: any\nexport let ts_options_commonjs_repl: any\n\nexport async function load_tsconfig () {\n const fp = `${fp_root}tsconfig.json`\n ;({ config: { compilerOptions: ts_options } } = ts.parseConfigFileTextToJson(\n fp, \n await fread(fp, { print: false })\n ))\n \n ts_options_commonjs = {\n ...ts_options,\n \n module: 'CommonJS',\n incremental: false,\n \n // determine CommonJS module require method\n esModuleInterop: true,\n }\n \n ts_options_commonjs_repl = {\n ...ts_options,\n \n module: 'CommonJS',\n esModuleInterop: true,\n \n // nvm.runInThisContext doesn't support inline source map\n sourceMap: false,\n }\n}\n\n\nlet eval_id = 0\n\nexport async function eval_ts (code: string) {\n try {\n const js = await compile_ts({ code })\n global.__ = await nvm.runInThisContext(js, `repl/${eval_id++}.ts`)\n \n return global.__\n } catch (error) {\n console.error(error)\n return error\n }\n}\n\n\n// ------------------------------------ repl\nexport async function repl_code (type: string, ...args: any[]) {\n log_line()\n \n // --- run code\n global.__ = await global['eval_' + type](...args)\n \n log_line()\n \n if (type !== 'shell')\n console.log(\n inspect(global.__, { limit: inspection_limit })\n )\n \n \n console.log('\\n'.repeat(2))\n}\n\n\nexport async function start_repl () {\n // ------------ load library\n log_section('xshell is booting ...', { time: true })\n \n log_mod_loaded('prototype')\n log_mod_loaded('utils')\n log_mod_loaded('file')\n \n const mfs = create_mfs()\n set_ufs(\n new UFS([mfs, fs])\n )\n log_mod_loaded('ufs')\n \n log_mod_loaded('process')\n log_mod_loaded('net')\n \n // --- prevent from exiting\n process.on('uncaughtException', error => {\n console.error(error)\n })\n \n // --- start nodejs repl\n repl.start({\n prompt: '',\n replMode: repl.REPL_MODE_SLOPPY,\n useGlobal: true,\n useColors: true,\n terminal: true,\n })\n \n log_section('repl initialized', { color: 'yellow', time: true })\n \n process.title = 'xshell'\n \n await Promise.all([\n pollute_global(),\n \n load_tsconfig(),\n \n (async () => {\n // --- http server\n log_section('server is initializing', { color: 'green', time: true })\n let { server } = await import('./server.js')\n await server.start()\n log_section('server initialized', { color: 'green', time: true })\n })(),\n ])\n \n log_section('xshell booted successfully', { color: 'red', time: true })\n console.log('xshell is listening at http://0.0.0.0:8421'.green)\n}\n\n\nexport async function stop () {\n log_section('xshell is exiting', { color: 'red' })\n \n for (const key in fwatchers)\n fwatchers[key].close()\n \n ;(await import('./server.js'))\n .server.stop()\n}\n\nexport async function exit () {\n await stop()\n await delay(100)\n process.exit()\n}\n\n\nexport async function pollute_global () {\n Object.assign(global, {\n __importDefault: (mod: any) => ((mod?.__esModule) ? mod : { default: mod }),\n __importStar: (mod: any) => {\n if (mod?.__esModule) return mod\n let result: { default?: any } = { }\n if (mod != null)\n for (let k in mod)\n if (Object.hasOwnProperty.call(mod, k))\n result[k] = mod[k]\n result.default = mod\n return result\n },\n exports: global\n })\n \n await Promise.all([\n pollute_module_default_export('upath', 'path'),\n pollute_module_default_export('cheerio', 'cheerio'),\n \n pollute_module_default_export('lodash/omit.js', 'omit'),\n pollute_module_default_export('lodash/sortBy.js', 'sort_by'),\n pollute_module_default_export('lodash/groupBy.js', 'group_by'),\n \n pollute_module_default_export('qs', 'qs'),\n \n pollute_module_exports('./prototype.js'),\n pollute_module_exports('./utils.js'),\n pollute_module_exports('./process.js'),\n pollute_module_exports('./file.js'),\n pollute_module_exports('./net.js'),\n pollute_module_exports('./server.js'),\n pollute_module_exports('./repl.js'),\n ])\n \n log_section('all modules were loaded', { color: 'green', time: true })\n}\n\n\nexport async function pollute_module_exports (fp_mod: string) {\n Object.assign(\n global,\n await import(fp_mod)\n )\n}\n\nexport async function pollute_module_default_export (fp_mod: string, name: string) {\n global[name] = (\n await import(fp_mod)\n ).default\n}\n\n\nfunction log_mod_loaded (id: string) {\n console.log(`${id.pad(20)}loaded`)\n}\n\n"]}
package/server.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- /// <reference path="server.d.ts" />
2
1
  /// <reference types="node" />
3
2
  import { type Server as HttpServer } from 'http';
4
3
  import { default as nodefs } from 'fs';
@@ -51,9 +50,10 @@ export declare const server: {
51
50
  */
52
51
  rpc(ctx: Context): Promise<void>;
53
52
  logger(ctx: Context): void;
54
- try_send(ctx: Context, fp: string, { fs, root }: {
53
+ try_send(ctx: Context, fp: string, { fs, root, log_404, }: {
55
54
  fs?: (typeof nodefs) | UFS;
56
55
  root: string;
56
+ log_404?: boolean;
57
57
  }): Promise<boolean>;
58
58
  /** send file at `path` with the given `options` to the koa `ctx`. */
59
59
  fsend(ctx: Context, path: string, { fs, root, absolute }?: {
package/server.js CHANGED
@@ -221,13 +221,13 @@ exports.server = {
221
221
  // --- print log
222
222
  console.log(s);
223
223
  },
224
- async try_send(ctx, fp, { fs = file_js_1.ufs, root }) {
224
+ async try_send(ctx, fp, { fs = file_js_1.ufs, root, log_404, }) {
225
225
  const { request: { _path, path, method }, response, } = ctx;
226
226
  if (!(typeof response.body === 'undefined') || response.status !== 404)
227
227
  return true;
228
228
  if (method !== 'HEAD' && method !== 'GET')
229
229
  return false;
230
- function log_404() {
230
+ function _log_404() {
231
231
  let s = `${' '.repeat(13)} ${method.toLowerCase()} 404: ${path}`;
232
232
  if (_path !== path)
233
233
  s += ` ${_path.bracket()}`;
@@ -240,7 +240,8 @@ exports.server = {
240
240
  catch (error) {
241
241
  if (error.status !== 404)
242
242
  throw error;
243
- log_404();
243
+ if (log_404)
244
+ _log_404();
244
245
  return false;
245
246
  }
246
247
  },
package/server.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createServer as http_create_server,\n type Server as HttpServer,\n} from 'http'\n\nimport zlib from 'zlib'\nimport {\n default as nodefs,\n type Stats\n} from 'fs'\nimport { promisify } from 'util'\n\n// --- 3rd party\nimport upath from 'upath'\nimport invoke from 'lodash/invoke.js'\nimport qs from 'qs'\nimport resolve_safely from 'resolve-path'\n\n\n// --- koa & koa middleware\nimport {\n default as Koa,\n type Context,\n type Next\n} from 'koa'\n\nimport KoaCors from '@koa/cors'\nimport KoaCompress from 'koa-compress'\nimport {\n userAgent as KoaUserAgent,\n type UserAgentContext\n} from 'koa-useragent'\n\n\ndeclare module 'koa' {\n interface Request {\n _path: string\n body: any\n }\n \n interface Context {\n compress: boolean\n userAgent: UserAgentContext['userAgent'] & { isWechat: boolean }\n }\n}\n\n// --- my libs\nimport { request as _request } from './net.js'\nimport { stream_to_buffer, inspect, output_width } from './utils.js'\nimport { ufs, type UFS } from './file.js'\n\n\ndeclare module 'http' {\n interface IncomingMessage {\n tunnel?: boolean\n id?: string\n body?: Buffer\n }\n \n interface ServerResponse {\n body?: Buffer\n }\n}\n\n// ------------ my server\nexport const server = {\n app: null as Koa,\n \n handler: null as ReturnType<Koa['callback']>,\n \n server_80: null as HttpServer,\n \n \n /** start http server and listen */\n async start () {\n // --- init koa app\n let app = new Koa()\n \n app.on('error', (error, ctx) => {\n console.error(error)\n console.log(ctx)\n })\n \n app.use(\n this.entry.bind(this)\n )\n \n app.use(KoaCompress({\n br: {\n // https://nodejs.org/api/zlib.html#zlib_class_brotlioptions\n params: {\n [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n [zlib.constants.BROTLI_PARAM_QUALITY]: 6 // default 11 (maximized compression), may lead to news/get generated 14mb json taking 24s\n },\n },\n threshold: 512\n }))\n \n app.use(\n KoaCors({ credentials: true })\n )\n app.use(KoaUserAgent)\n \n app.use(this.router.bind(this))\n \n this.app = app\n \n this.handler = this.app.callback()\n \n this.server_80 = http_create_server(this.handler)\n \n await new Promise<void>(resolve => {\n this.server_80.listen(8421, resolve)\n })\n },\n \n \n stop () {\n this.server_80.close()\n },\n \n \n async entry (ctx: Context, next: Next) {\n let { response } = ctx\n \n await this.parse(ctx)\n \n // ------------ next\n try {\n await next()\n } catch (error) {\n if (error.status !== 404)\n console.error(error)\n response.status = error.status || 500\n response.body = inspect(error, { colors: false })\n response.type = 'text/plain'\n }\n },\n \n \n /** \n parse req.body to request.body \n process request.ip\n */\n async parse (ctx: Context) {\n const {\n request,\n req,\n req: { tunnel },\n } = ctx\n \n if (!tunnel) {\n const buf = await stream_to_buffer(req)\n if (buf.length)\n req.body = buf\n }\n \n // --- parse request.ip\n request.ip = (request.headers['x-real-ip'] as string || request.ip).replace(/^::ffff:/, '')\n \n \n // --- parse body\n if (!req.body) return\n \n if (ctx.is('application/json') || ctx.is('text/plain'))\n request.body = JSON.parse(req.body.toString())\n else if (ctx.is('application/x-www-form-urlencoded'))\n request.body = qs.parse(req.body.toString())\n else if (ctx.is('multipart/form-data')) {\n throw new Error('multipart/form-data is not supported')\n } else\n request.body = req.body\n },\n \n \n async router (ctx: Context, next: Next) {\n let { request } = ctx\n const _path = request._path = decodeURIComponent(request.path)\n Object.defineProperty(request, 'path', {\n value: _path,\n configurable: true,\n enumerable: true,\n writable: true\n })\n \n const { path } = request\n \n // ------------ /repl/rpc\n if (path === '/api/rpc') {\n await this.rpc(ctx)\n return\n }\n \n \n // ------------ log\n this.logger(ctx)\n \n // ------------ repl_router hook\n if (await global.repl_router?.(ctx))\n return\n \n await next?.()\n },\n \n \n /** args are array http://localhost/repl/rpc?func=to_json&args=aaa&args=bbb \n should use POST when arg is number, otherwise type will be string \n queries:\n - func: function name\n - args?: `[]` args array\n - ignore?: `false` don't serialize result into response\n - async?: `false` don't wait\n */\n async rpc (ctx: Context) {\n const { request: { query, body }, response } = ctx\n \n let { func, args = [], ignore = false, async: _async = false }: { func: string, args: any[] | string, ignore: boolean | string, async: boolean | string } = { ...query, ...body }\n \n if (!func) {\n let error = new Error('rpc no func')\n ;(error as any).status = 400\n throw error\n }\n \n if (!Array.isArray(args))\n args = [args]\n \n // ?async=1 or ?async=0 or ?async=false\n if (typeof ignore === 'string')\n ignore = ignore.to_bool()\n \n if (typeof _async === 'string')\n _async = _async.to_bool()\n \n try {\n const presult = invoke(global, func, ...args)\n \n if (_async) {\n response.body = ''\n return\n }\n \n const result = await presult\n \n if (ignore) {\n response.body = ''\n return\n }\n \n response.body = JSON.stringify(result) || ''\n } catch (error) {\n error.status = 500\n throw error\n }\n },\n \n \n logger (ctx: Context) {\n const { request } = ctx\n const {\n query, \n body, \n path, _path, \n protocol,\n host,\n req: { httpVersion: http_version },\n ip,\n } = request\n \n let { method } = request\n \n const ua = ctx.userAgent\n \n \n let s = ''\n \n // --- time\n s += `${new Date().to_time_str()} `\n \n \n // --- ip\n s += (ip || '').pad(40) + ' '\n \n \n // --- ua\n s += (() => {\n let t = ''\n if (ua.isMobile)\n t += 'mobile'\n if (ua.isDesktop)\n t += 'desktop'\n if (ua.isBot)\n t += `${ t ? ' ' : '' }${'robot'.blue}`\n if (ua.platform !== 'unknown' && !ua.os.startsWith('Windows'))\n t += '/' + ua.platform.toLowerCase().replace('apple mac', 'mac')\n if (ua.os !== 'unknown' && ua.platform !== 'Android')\n t += '/' + ua.os.toLowerCase()\n if (ua.browser !== 'unknown')\n t += '/' + ua.browser.toLowerCase()\n if (ua.isWechat)\n t += '/weixin'\n if (ua.version !== 'unknown')\n t += '/' + ua.version.split('.').slice(0, 2).join('.')\n return t\n })().pad(40) + ' '\n \n \n // --- https/2.0\n // if (req.tunnel) `tunnel/${http_version}`.pad(10).cyan\n s += `${`${protocol.pad(5)}/${http_version}`.pad(10)} `\n \n \n // --- method\n method = method.toLowerCase()\n s += method === 'get' ? method.pad(10) : method.pad(10).yellow\n \n \n // --- host\n s += `${host.pad(20)} `\n \n \n // --- path\n s += (() => {\n if (path.toLowerCase() !== _path.toLowerCase())\n return `${_path.blue} → ${path}`\n if (!path.includes('.'))\n return path.yellow\n return path\n })()\n \n \n // --- query\n if (Object.keys(query).length) {\n let t = inspect(query, { compact: true })\n .replace('[Object: null prototype] ', '')\n \n if (t.endsWith('\\n'))\n t = t.slice(0, -1)\n \n s += (s + t).width > output_width ? '\\n' : ' '\n \n s += t\n }\n \n \n // --- body\n if (body && Object.keys(body).length)\n s += '\\n' + inspect(body).replace('[Object: null prototype] ', '')\n \n \n // --- print log\n console.log(s)\n },\n \n \n async try_send (\n ctx: Context, \n fp: string,\n {\n fs = ufs, \n root\n }: {\n fs?: (typeof nodefs) | UFS\n root: string\n }) {\n const {\n request: { _path, path, method },\n response,\n } = ctx\n \n if (!(typeof response.body === 'undefined') || response.status !== 404) return true\n \n if (method !== 'HEAD' && method !== 'GET') return false\n \n function log_404 () {\n let s = `${' '.repeat(13)} ${method.toLowerCase()} 404: ${path}`\n if (_path !== path)\n s += ` ${_path.bracket()}`\n console.log(s.red)\n }\n \n try {\n await this.fsend(ctx, fp, { fs, root })\n return true\n } catch (error) {\n if (error.status !== 404) throw error\n log_404()\n return false\n }\n },\n \n \n /** send file at `path` with the given `options` to the koa `ctx`. */\n async fsend (\n ctx: Context,\n path: string,\n {\n fs = nodefs,\n root,\n absolute\n }: {\n /** `fs` */\n fs?: (typeof nodefs) | UFS\n \n root?: string\n \n /** `false` */\n absolute?: boolean\n \n } = { } as any\n ) {\n const { request, response, req } = ctx\n \n if (!absolute && !root)\n throw new Error('fsend with `!absolute && !root`')\n \n if (absolute)\n path = upath.resolve(path)\n else {\n if (path.startsWith(root))\n path = path.slice(root.length)\n \n if (path.startsWith('/'))\n path = path.slice(1)\n \n try {\n path = upath.normalize(\n resolve_safely(root, path)\n )\n } catch (error) {\n error.message += `, path = ${path}`\n throw error\n }\n }\n \n \n // stat\n let stats: Stats\n try {\n stats = await promisify(fs.stat)(path)\n } catch (error) {\n if (['ENOENT', 'ENAMETOOLONG', 'ENOTDIR'].includes(error.code)) {\n error.status = 404\n throw error\n }\n \n error.status = 500\n error.message = `fs.stat 出错: ${error.message}`\n throw error\n }\n \n \n if (stats.size >= 100 * 2**20) {\n let error = new Error('body.length >= 100 mb')\n ;(error as any).status = 500\n throw error\n }\n \n \n if (!req.tunnel) {\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Ranges\n // advertise server support of partial requests\n response.set('accept-ranges', 'bytes')\n }\n \n if (!response.get('cache-control'))\n response.set('cache-control', 'max-age=0, must-revalidate')\n \n if (!response.get('last-modified'))\n response.set('last-modified', stats.mtime ? stats.mtime.toUTCString() : new Date().toUTCString())\n \n const fext = path.fext\n \n if (!response.type)\n response.type = fext\n \n if (fext === '.pdf')\n response.set('content-disposition', `attachment; filename=\"${encodeURIComponent(path.fname)}\"`)\n \n if (request.fresh) {\n response.status = 304\n // 以上会自动设置 response.body = null\n return path\n }\n \n if (request.headers.range) {\n if (req.tunnel) {\n response.status = 400\n response.body = ''\n return\n }\n \n try {\n const range_header = request.headers.range\n const range_value = /=(.*)$/.exec(range_header)[1]\n const range = /^[\\w]*?(\\d*)-(\\d*)$/.exec(range_value)\n \n let start = range[1] ? parseInt(range[1]) : undefined\n let end = range[2] ? parseInt(range[2]) : stats.size - 1\n \n if (typeof start == 'undefined') {\n start = (stats.size - end)\n end = (stats.size - 1)\n }\n \n const chunksize = (end - start + 1)\n \n response.status = 206\n response.set('content-length', String(chunksize))\n response.set('content-range', `bytes ${start}-${end}/${stats.size}`)\n response.body = fs.createReadStream(path, { start, end })\n } catch (err) {\n response.status = 416\n response.set('content-length', String(stats.size))\n response.set('content-range', `bytes */${stats.size}`)\n response.body = fs.createReadStream(path)\n }\n } else {\n response.set('content-length', String(stats.size))\n response.body = fs.createReadStream(path)\n }\n \n return path\n }\n}\n\n\nexport default server\n\nexport type Server = typeof server\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":";;;;AAAA,+BAGa;AAEb,6DAAuB;AACvB,yDAGW;AACX,+BAAgC;AAEhC,gBAAgB;AAChB,+DAAyB;AACzB,8EAAqC;AACrC,yDAAmB;AACnB,6EAAyC;AAGzC,2BAA2B;AAC3B,2DAIY;AAEZ,kEAA+B;AAC/B,6EAAsC;AACtC,iDAGsB;AAiBtB,yCAAoE;AACpE,uCAAyC;AAezC,yBAAyB;AACZ,QAAA,MAAM,GAAG;IAClB,GAAG,EAAE,IAAW;IAEhB,OAAO,EAAE,IAAmC;IAE5C,SAAS,EAAE,IAAkB;IAG7B,mCAAmC;IACnC,KAAK,CAAC,KAAK;QACP,mBAAmB;QACnB,IAAI,GAAG,GAAG,IAAI,aAAG,EAAE,CAAA;QAEnB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,GAAG,CAAC,GAAG,CACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CACxB,CAAA;QAED,GAAG,CAAC,GAAG,CAAC,IAAA,sBAAW,EAAC;YAChB,EAAE,EAAE;gBACA,4DAA4D;gBAC5D,MAAM,EAAE;oBACJ,CAAC,cAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,cAAI,CAAC,SAAS,CAAC,gBAAgB;oBACnE,CAAC,cAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAE,0FAA0F;iBACvI;aACJ;YACD,SAAS,EAAE,GAAG;SACjB,CAAC,CAAC,CAAA;QAEH,GAAG,CAAC,GAAG,CACH,IAAA,cAAO,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CACjC,CAAA;QACD,GAAG,CAAC,GAAG,CAAC,yBAAY,CAAC,CAAA;QAErB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAE/B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QAEd,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAElC,IAAI,CAAC,SAAS,GAAI,IAAA,mBAAkB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAElD,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YAC9B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACN,CAAC;IAGD,IAAI;QACA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;IAGD,KAAK,CAAC,KAAK,CAAE,GAAY,EAAE,IAAU;QACjC,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;QAEtB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAErB,oBAAoB;QACpB,IAAI;YACA,MAAM,IAAI,EAAE,CAAA;SACf;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;gBACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACxB,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,CAAA;YACrC,QAAQ,CAAC,IAAI,GAAG,IAAA,kBAAO,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;YACjD,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAA;SAC/B;IACL,CAAC;IAGD;;;MAGE;IACF,KAAK,CAAC,KAAK,CAAE,GAAY;QACrB,MAAM,EACF,OAAO,EACP,GAAG,EACH,GAAG,EAAE,EAAE,MAAM,EAAE,GAClB,GAAG,GAAG,CAAA;QAEP,IAAI,CAAC,MAAM,EAAE;YACT,MAAM,GAAG,GAAG,MAAM,IAAA,2BAAgB,EAAC,GAAG,CAAC,CAAA;YACvC,IAAI,GAAG,CAAC,MAAM;gBACV,GAAG,CAAC,IAAI,GAAG,GAAG,CAAA;SACrB;QAED,uBAAuB;QACvB,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAW,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;QAG3F,iBAAiB;QACjB,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,OAAM;QAErB,IAAI,GAAG,CAAC,EAAE,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC;YAClD,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;aAC7C,IAAI,GAAG,CAAC,EAAE,CAAC,mCAAmC,CAAC;YAChD,OAAO,CAAC,IAAI,GAAG,YAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;aAC3C,IAAI,GAAG,CAAC,EAAE,CAAC,qBAAqB,CAAC,EAAE;YACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;SAC1D;;YACG,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;IAC/B,CAAC;IAGD,KAAK,CAAC,MAAM,CAAE,GAAY,EAAE,IAAU;QAClC,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAA;QACrB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9D,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;YACnC,KAAK,EAAE,KAAK;YACZ,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAA;QAEF,MAAM,EAAE,IAAI,EAAE,GAAI,OAAO,CAAA;QAEzB,yBAAyB;QACzB,IAAI,IAAI,KAAK,UAAU,EAAE;YACrB,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnB,OAAM;SACT;QAGD,mBAAmB;QACnB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAEhB,gCAAgC;QAChC,IAAI,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC;YAC/B,OAAM;QAEV,MAAM,IAAI,EAAE,EAAE,CAAA;IAClB,CAAC;IAGD;;;;;;;MAOE;IACF,KAAK,CAAC,GAAG,CAAE,GAAY;QACnB,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;QAElD,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,GAAG,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,GAA8F,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA;QAEjL,IAAI,CAAC,IAAI,EAAE;YACP,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,CACnC;YAAC,KAAa,CAAC,MAAM,GAAG,GAAG,CAAA;YAC5B,MAAM,KAAK,CAAA;SACd;QAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACpB,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;QAEjB,uCAAuC;QACvC,IAAI,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;QAE7B,IAAI,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;QAE7B,IAAI;YACA,MAAM,OAAO,GAAG,IAAA,mBAAM,EAAC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAA;YAE7C,IAAI,MAAM,EAAE;gBACR,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAA;gBAClB,OAAM;aACT;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAA;YAE5B,IAAI,MAAM,EAAE;gBACR,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAA;gBAClB,OAAM;aACT;YAED,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;SAC/C;QAAC,OAAO,KAAK,EAAE;YACZ,KAAK,CAAC,MAAM,GAAG,GAAG,CAAA;YAClB,MAAM,KAAK,CAAA;SACd;IACL,CAAC;IAGD,MAAM,CAAE,GAAY;QAChB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAA;QACvB,MAAM,EACF,KAAK,EACL,IAAI,EACJ,IAAI,EAAE,KAAK,EACX,QAAQ,EACR,IAAI,EACJ,GAAG,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,EAClC,EAAE,GACL,GAAG,OAAO,CAAA;QAEX,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;QAExB,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAA;QAGxB,IAAI,CAAC,GAAG,EAAE,CAAA;QAEV,WAAW;QACX,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,CAAA;QAGtC,SAAS;QACT,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAA;QAG9B,SAAS;QACT,CAAC,IAAI,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,GAAG,EAAE,CAAA;YACV,IAAI,EAAE,CAAC,QAAQ;gBACX,CAAC,IAAI,QAAQ,CAAA;YACjB,IAAI,EAAE,CAAC,SAAS;gBACZ,CAAC,IAAI,SAAS,CAAA;YAClB,IAAI,EAAE,CAAC,KAAK;gBACR,CAAC,IAAI,GAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YAC3C,IAAI,EAAE,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;gBACzD,CAAC,IAAI,GAAG,GAAI,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;YACrE,IAAI,EAAE,CAAC,EAAE,KAAW,SAAS,IAAI,EAAE,CAAC,QAAQ,KAAK,SAAS;gBACtD,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAA;YAClC,IAAI,EAAE,CAAC,OAAO,KAAM,SAAS;gBACzB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;YACvC,IAAI,EAAE,CAAC,QAAQ;gBACX,CAAC,IAAI,SAAS,CAAA;YAClB,IAAI,EAAE,CAAC,OAAO,KAAM,SAAS;gBACzB,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC1D,OAAO,CAAC,CAAA;QACZ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAA;QAGnB,gBAAgB;QAChB,wDAAwD;QACxD,CAAC,IAAI,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAA;QAG1D,aAAa;QACb,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;QAC7B,CAAC,IAAI,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAA;QAG9D,WAAW;QACX,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAA;QAGxB,WAAW;QACX,CAAC,IAAI,CAAC,GAAG,EAAE;YACP,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE;gBAC1C,OAAO,GAAG,KAAK,CAAC,IAAI,MAAM,IAAI,EAAE,CAAA;YACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACnB,OAAO,IAAI,CAAC,MAAM,CAAA;YACtB,OAAO,IAAI,CAAA;QACf,CAAC,CAAC,EAAE,CAAA;QAGJ,YAAY;QACZ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;YAC3B,IAAI,CAAC,GAAG,IAAA,kBAAO,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;iBACpC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAA;YAE7C,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAChB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAEtB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,uBAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;YAEjD,CAAC,IAAI,CAAC,CAAA;SACT;QAGD,WAAW;QACX,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;YAChC,CAAC,IAAI,IAAI,GAAG,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAA;QAGtE,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC;IAGD,KAAK,CAAC,QAAQ,CACV,GAAY,EACZ,EAAU,EACV,EACI,EAAE,GAAG,aAAG,EACR,IAAI,EACJ,OAAO,GAKd;QACG,MAAM,EACF,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAChC,QAAQ,GACX,GAAG,GAAG,CAAA;QAEP,IAAI,CAAC,CAAC,OAAO,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QAEnF,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO,KAAK,CAAA;QAEvD,SAAS,QAAQ;YACb,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,WAAW,EAAE,SAAS,IAAI,EAAE,CAAA;YACnE,IAAI,KAAK,KAAK,IAAI;gBACd,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAA;YAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;QAED,IAAI;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;YACvC,OAAO,IAAI,CAAA;SACd;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,KAAK,CAAA;YACrC,IAAI,OAAO;gBACP,QAAQ,EAAE,CAAA;YACd,OAAO,KAAK,CAAA;SACf;IACL,CAAC;IAGD,sEAAsE;IACtE,KAAK,CAAC,KAAK,CACP,GAAY,EACZ,IAAY,EACZ,EACI,EAAE,GAAG,YAAM,EACX,IAAI,EACJ,QAAQ,KAUR,EAAU;QAEd,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;QAEtC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI;YAClB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QAEtD,IAAI,QAAQ;YACR,IAAI,GAAG,eAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;aACzB;YACD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBACrB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAElC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBACpB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAExB,IAAI;gBACA,IAAI,GAAG,eAAK,CAAC,SAAS,CAClB,IAAA,sBAAc,EAAC,IAAI,EAAE,IAAI,CAAC,CAC7B,CAAA;aACJ;YAAC,OAAO,KAAK,EAAE;gBACZ,KAAK,CAAC,OAAO,IAAI,YAAY,IAAI,EAAE,CAAA;gBACnC,MAAM,KAAK,CAAA;aACd;SACJ;QAGD,OAAO;QACP,IAAI,KAAY,CAAA;QAChB,IAAI;YACA,KAAK,GAAG,MAAM,IAAA,gBAAS,EAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAA;SACzC;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBAC5D,KAAK,CAAC,MAAM,GAAG,GAAG,CAAA;gBAClB,MAAM,KAAK,CAAA;aACd;YAED,KAAK,CAAC,MAAM,GAAG,GAAG,CAAA;YAClB,KAAK,CAAC,OAAO,GAAG,eAAe,KAAK,CAAC,OAAO,EAAE,CAAA;YAC9C,MAAM,KAAK,CAAA;SACd;QAGD,IAAI,KAAK,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC,IAAE,EAAE,EAAE;YAC3B,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAC7C;YAAC,KAAa,CAAC,MAAM,GAAG,GAAG,CAAA;YAC5B,MAAM,KAAK,CAAA;SACd;QAGD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;YACb,0EAA0E;YAC1E,+CAA+C;YAC/C,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,CAAA;SACzC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;YAC9B,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,4BAA4B,CAAC,CAAA;QAE/D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;YAC9B,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QAErG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QAEtB,IAAI,CAAC,QAAQ,CAAC,IAAI;YACd,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAA;QAExB,IAAI,IAAI,KAAK,MAAM;YACf,QAAQ,CAAC,GAAG,CAAC,qBAAqB,EAAE,yBAAyB,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAEnG,IAAI,OAAO,CAAC,KAAK,EAAE;YACf,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAA;YACrB,+BAA+B;YAC/B,OAAO,IAAI,CAAA;SACd;QAED,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE;YACvB,IAAI,GAAG,CAAC,MAAM,EAAE;gBACZ,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAA;gBACrB,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAA;gBAClB,OAAM;aACT;YAED,IAAI;gBACA,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAA;gBAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;gBAClD,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;gBAErD,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;gBACrD,IAAI,GAAG,GAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAA;gBAE1D,IAAI,OAAO,KAAK,IAAI,WAAW,EAAE;oBAC7B,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;oBAC1B,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;iBACzB;gBAED,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAA;gBAEnC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAA;gBACrB,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;gBACjD,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;gBACpE,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;aAC5D;YAAC,OAAO,GAAG,EAAE;gBACV,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAA;gBACrB,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;gBAClD,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;gBACtD,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;aAC5C;SACJ;aAAM;YACH,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YAClD,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;SAC5C;QAED,OAAO,IAAI,CAAA;IACf,CAAC;CACJ,CAAA;AAGD,kBAAe,cAAM,CAAA","sourcesContent":["import {\n createServer as http_create_server,\n type Server as HttpServer,\n} from 'http'\n\nimport zlib from 'zlib'\nimport {\n default as nodefs,\n type Stats\n} from 'fs'\nimport { promisify } from 'util'\n\n// --- 3rd party\nimport upath from 'upath'\nimport invoke from 'lodash/invoke.js'\nimport qs from 'qs'\nimport resolve_safely from 'resolve-path'\n\n\n// --- koa & koa middleware\nimport {\n default as Koa,\n type Context,\n type Next\n} from 'koa'\n\nimport KoaCors from '@koa/cors'\nimport KoaCompress from 'koa-compress'\nimport {\n userAgent as KoaUserAgent,\n type UserAgentContext\n} from 'koa-useragent'\n\n\ndeclare module 'koa' {\n interface Request {\n _path: string\n body: any\n }\n \n interface Context {\n compress: boolean\n userAgent: UserAgentContext['userAgent'] & { isWechat: boolean }\n }\n}\n\n// --- my libs\nimport { request as _request } from './net.js'\nimport { stream_to_buffer, inspect, output_width } from './utils.js'\nimport { ufs, type UFS } from './file.js'\n\n\ndeclare module 'http' {\n interface IncomingMessage {\n tunnel?: boolean\n id?: string\n body?: Buffer\n }\n \n interface ServerResponse {\n body?: Buffer\n }\n}\n\n// ------------ my server\nexport const server = {\n app: null as Koa,\n \n handler: null as ReturnType<Koa['callback']>,\n \n server_80: null as HttpServer,\n \n \n /** start http server and listen */\n async start () {\n // --- init koa app\n let app = new Koa()\n \n app.on('error', (error, ctx) => {\n console.error(error)\n console.log(ctx)\n })\n \n app.use(\n this.entry.bind(this)\n )\n \n app.use(KoaCompress({\n br: {\n // https://nodejs.org/api/zlib.html#zlib_class_brotlioptions\n params: {\n [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,\n [zlib.constants.BROTLI_PARAM_QUALITY]: 6 // default 11 (maximized compression), may lead to news/get generated 14mb json taking 24s\n },\n },\n threshold: 512\n }))\n \n app.use(\n KoaCors({ credentials: true })\n )\n app.use(KoaUserAgent)\n \n app.use(this.router.bind(this))\n \n this.app = app\n \n this.handler = this.app.callback()\n \n this.server_80 = http_create_server(this.handler)\n \n await new Promise<void>(resolve => {\n this.server_80.listen(8421, resolve)\n })\n },\n \n \n stop () {\n this.server_80.close()\n },\n \n \n async entry (ctx: Context, next: Next) {\n let { response } = ctx\n \n await this.parse(ctx)\n \n // ------------ next\n try {\n await next()\n } catch (error) {\n if (error.status !== 404)\n console.error(error)\n response.status = error.status || 500\n response.body = inspect(error, { colors: false })\n response.type = 'text/plain'\n }\n },\n \n \n /** \n parse req.body to request.body \n process request.ip\n */\n async parse (ctx: Context) {\n const {\n request,\n req,\n req: { tunnel },\n } = ctx\n \n if (!tunnel) {\n const buf = await stream_to_buffer(req)\n if (buf.length)\n req.body = buf\n }\n \n // --- parse request.ip\n request.ip = (request.headers['x-real-ip'] as string || request.ip).replace(/^::ffff:/, '')\n \n \n // --- parse body\n if (!req.body) return\n \n if (ctx.is('application/json') || ctx.is('text/plain'))\n request.body = JSON.parse(req.body.toString())\n else if (ctx.is('application/x-www-form-urlencoded'))\n request.body = qs.parse(req.body.toString())\n else if (ctx.is('multipart/form-data')) {\n throw new Error('multipart/form-data is not supported')\n } else\n request.body = req.body\n },\n \n \n async router (ctx: Context, next: Next) {\n let { request } = ctx\n const _path = request._path = decodeURIComponent(request.path)\n Object.defineProperty(request, 'path', {\n value: _path,\n configurable: true,\n enumerable: true,\n writable: true\n })\n \n const { path } = request\n \n // ------------ /repl/rpc\n if (path === '/api/rpc') {\n await this.rpc(ctx)\n return\n }\n \n \n // ------------ log\n this.logger(ctx)\n \n // ------------ repl_router hook\n if (await global.repl_router?.(ctx))\n return\n \n await next?.()\n },\n \n \n /** args are array http://localhost/repl/rpc?func=to_json&args=aaa&args=bbb \n should use POST when arg is number, otherwise type will be string \n queries:\n - func: function name\n - args?: `[]` args array\n - ignore?: `false` don't serialize result into response\n - async?: `false` don't wait\n */\n async rpc (ctx: Context) {\n const { request: { query, body }, response } = ctx\n \n let { func, args = [], ignore = false, async: _async = false }: { func: string, args: any[] | string, ignore: boolean | string, async: boolean | string } = { ...query, ...body }\n \n if (!func) {\n let error = new Error('rpc no func')\n ;(error as any).status = 400\n throw error\n }\n \n if (!Array.isArray(args))\n args = [args]\n \n // ?async=1 or ?async=0 or ?async=false\n if (typeof ignore === 'string')\n ignore = ignore.to_bool()\n \n if (typeof _async === 'string')\n _async = _async.to_bool()\n \n try {\n const presult = invoke(global, func, ...args)\n \n if (_async) {\n response.body = ''\n return\n }\n \n const result = await presult\n \n if (ignore) {\n response.body = ''\n return\n }\n \n response.body = JSON.stringify(result) || ''\n } catch (error) {\n error.status = 500\n throw error\n }\n },\n \n \n logger (ctx: Context) {\n const { request } = ctx\n const {\n query, \n body, \n path, _path, \n protocol,\n host,\n req: { httpVersion: http_version },\n ip,\n } = request\n \n let { method } = request\n \n const ua = ctx.userAgent\n \n \n let s = ''\n \n // --- time\n s += `${new Date().to_time_str()} `\n \n \n // --- ip\n s += (ip || '').pad(40) + ' '\n \n \n // --- ua\n s += (() => {\n let t = ''\n if (ua.isMobile)\n t += 'mobile'\n if (ua.isDesktop)\n t += 'desktop'\n if (ua.isBot)\n t += `${ t ? ' ' : '' }${'robot'.blue}`\n if (ua.platform !== 'unknown' && !ua.os.startsWith('Windows'))\n t += '/' + ua.platform.toLowerCase().replace('apple mac', 'mac')\n if (ua.os !== 'unknown' && ua.platform !== 'Android')\n t += '/' + ua.os.toLowerCase()\n if (ua.browser !== 'unknown')\n t += '/' + ua.browser.toLowerCase()\n if (ua.isWechat)\n t += '/weixin'\n if (ua.version !== 'unknown')\n t += '/' + ua.version.split('.').slice(0, 2).join('.')\n return t\n })().pad(40) + ' '\n \n \n // --- https/2.0\n // if (req.tunnel) `tunnel/${http_version}`.pad(10).cyan\n s += `${`${protocol.pad(5)}/${http_version}`.pad(10)} `\n \n \n // --- method\n method = method.toLowerCase()\n s += method === 'get' ? method.pad(10) : method.pad(10).yellow\n \n \n // --- host\n s += `${host.pad(20)} `\n \n \n // --- path\n s += (() => {\n if (path.toLowerCase() !== _path.toLowerCase())\n return `${_path.blue} → ${path}`\n if (!path.includes('.'))\n return path.yellow\n return path\n })()\n \n \n // --- query\n if (Object.keys(query).length) {\n let t = inspect(query, { compact: true })\n .replace('[Object: null prototype] ', '')\n \n if (t.endsWith('\\n'))\n t = t.slice(0, -1)\n \n s += (s + t).width > output_width ? '\\n' : ' '\n \n s += t\n }\n \n \n // --- body\n if (body && Object.keys(body).length)\n s += '\\n' + inspect(body).replace('[Object: null prototype] ', '')\n \n \n // --- print log\n console.log(s)\n },\n \n \n async try_send (\n ctx: Context, \n fp: string,\n {\n fs = ufs, \n root,\n log_404,\n }: {\n fs?: (typeof nodefs) | UFS\n root: string\n log_404?: boolean\n }) {\n const {\n request: { _path, path, method },\n response,\n } = ctx\n \n if (!(typeof response.body === 'undefined') || response.status !== 404) return true\n \n if (method !== 'HEAD' && method !== 'GET') return false\n \n function _log_404 () {\n let s = `${' '.repeat(13)} ${method.toLowerCase()} 404: ${path}`\n if (_path !== path)\n s += ` ${_path.bracket()}`\n console.log(s.red)\n }\n \n try {\n await this.fsend(ctx, fp, { fs, root })\n return true\n } catch (error) {\n if (error.status !== 404) throw error\n if (log_404)\n _log_404()\n return false\n }\n },\n \n \n /** send file at `path` with the given `options` to the koa `ctx`. */\n async fsend (\n ctx: Context,\n path: string,\n {\n fs = nodefs,\n root,\n absolute\n }: {\n /** `fs` */\n fs?: (typeof nodefs) | UFS\n \n root?: string\n \n /** `false` */\n absolute?: boolean\n \n } = { } as any\n ) {\n const { request, response, req } = ctx\n \n if (!absolute && !root)\n throw new Error('fsend with `!absolute && !root`')\n \n if (absolute)\n path = upath.resolve(path)\n else {\n if (path.startsWith(root))\n path = path.slice(root.length)\n \n if (path.startsWith('/'))\n path = path.slice(1)\n \n try {\n path = upath.normalize(\n resolve_safely(root, path)\n )\n } catch (error) {\n error.message += `, path = ${path}`\n throw error\n }\n }\n \n \n // stat\n let stats: Stats\n try {\n stats = await promisify(fs.stat)(path)\n } catch (error) {\n if (['ENOENT', 'ENAMETOOLONG', 'ENOTDIR'].includes(error.code)) {\n error.status = 404\n throw error\n }\n \n error.status = 500\n error.message = `fs.stat 出错: ${error.message}`\n throw error\n }\n \n \n if (stats.size >= 100 * 2**20) {\n let error = new Error('body.length >= 100 mb')\n ;(error as any).status = 500\n throw error\n }\n \n \n if (!req.tunnel) {\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Ranges\n // advertise server support of partial requests\n response.set('accept-ranges', 'bytes')\n }\n \n if (!response.get('cache-control'))\n response.set('cache-control', 'max-age=0, must-revalidate')\n \n if (!response.get('last-modified'))\n response.set('last-modified', stats.mtime ? stats.mtime.toUTCString() : new Date().toUTCString())\n \n const fext = path.fext\n \n if (!response.type)\n response.type = fext\n \n if (fext === '.pdf')\n response.set('content-disposition', `attachment; filename=\"${encodeURIComponent(path.fname)}\"`)\n \n if (request.fresh) {\n response.status = 304\n // 以上会自动设置 response.body = null\n return path\n }\n \n if (request.headers.range) {\n if (req.tunnel) {\n response.status = 400\n response.body = ''\n return\n }\n \n try {\n const range_header = request.headers.range\n const range_value = /=(.*)$/.exec(range_header)[1]\n const range = /^[\\w]*?(\\d*)-(\\d*)$/.exec(range_value)\n \n let start = range[1] ? parseInt(range[1]) : undefined\n let end = range[2] ? parseInt(range[2]) : stats.size - 1\n \n if (typeof start == 'undefined') {\n start = (stats.size - end)\n end = (stats.size - 1)\n }\n \n const chunksize = (end - start + 1)\n \n response.status = 206\n response.set('content-length', String(chunksize))\n response.set('content-range', `bytes ${start}-${end}/${stats.size}`)\n response.body = fs.createReadStream(path, { start, end })\n } catch (err) {\n response.status = 416\n response.set('content-length', String(stats.size))\n response.set('content-range', `bytes */${stats.size}`)\n response.body = fs.createReadStream(path)\n }\n } else {\n response.set('content-length', String(stats.size))\n response.body = fs.createReadStream(path)\n }\n \n return path\n }\n}\n\n\nexport default server\n\nexport type Server = typeof server\n"]}
@@ -1,3 +1,5 @@
1
1
  export declare function delay(milliseconds: number): Promise<void>;
2
2
  /** 拼接 TypedArrays 生成一个完整的 Uint8Array */
3
3
  export declare function concat(arrays: ArrayBufferView[]): Uint8Array;
4
+ /** 字符串字典序比较 */
5
+ export declare function strcmp(l: string, r: string): 0 | 1 | -1;
package/utils.browser.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.concat = exports.delay = void 0;
3
+ exports.strcmp = exports.concat = exports.delay = void 0;
4
4
  async function delay(milliseconds) {
5
5
  return new Promise(resolve => {
6
6
  setTimeout(() => {
@@ -24,4 +24,13 @@ function concat(arrays) {
24
24
  return buf;
25
25
  }
26
26
  exports.concat = concat;
27
+ /** 字符串字典序比较 */
28
+ function strcmp(l, r) {
29
+ if (l === r)
30
+ return 0;
31
+ if (l < r)
32
+ return -1;
33
+ return 1;
34
+ }
35
+ exports.strcmp = strcmp;
27
36
  //# sourceMappingURL=utils.browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.browser.js","sourceRoot":"","sources":["utils.browser.ts"],"names":[],"mappings":";;;AAAO,KAAK,UAAU,KAAK,CAAE,YAAoB;IAC7C,OAAO,IAAI,OAAO,CAAQ,OAAO,CAAC,EAAE;QAChC,UAAU,CAAC,GAAG,EAAE;YACZ,OAAO,EAAE,CAAA;QACb,CAAC,EAAE,YAAY,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;AACN,CAAC;AAND,sBAMC;AAGD,wCAAwC;AACxC,SAAgB,MAAM,CAAE,MAAyB;IAC7C,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,IAAI,MAAM;QAClB,MAAM,IAAI,CAAC,CAAC,UAAU,CAAA;IAE1B,IAAI,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;IAChC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;QACpB,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAA;QACtE,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC1B,MAAM,IAAI,SAAS,CAAC,UAAU,CAAA;KACjC;IAED,OAAO,GAAG,CAAA;AACd,CAAC;AAdD,wBAcC","sourcesContent":["export async function delay (milliseconds: number) {\n return new Promise<void>( resolve => {\n setTimeout(() => {\n resolve()\n }, milliseconds)\n })\n}\n\n\n/** 拼接 TypedArrays 生成一个完整的 Uint8Array */\nexport function concat (arrays: ArrayBufferView[]) {\n let length = 0\n for (const a of arrays)\n length += a.byteLength\n \n let buf = new Uint8Array(length)\n let offset = 0\n for (const a of arrays) {\n const uint8view = new Uint8Array(a.buffer, a.byteOffset, a.byteLength)\n buf.set(uint8view, offset)\n offset += uint8view.byteLength\n }\n \n return buf\n}\n"]}
1
+ {"version":3,"file":"utils.browser.js","sourceRoot":"","sources":["utils.browser.ts"],"names":[],"mappings":";;;AAAO,KAAK,UAAU,KAAK,CAAE,YAAoB;IAC7C,OAAO,IAAI,OAAO,CAAQ,OAAO,CAAC,EAAE;QAChC,UAAU,CAAC,GAAG,EAAE;YACZ,OAAO,EAAE,CAAA;QACb,CAAC,EAAE,YAAY,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;AACN,CAAC;AAND,sBAMC;AAGD,wCAAwC;AACxC,SAAgB,MAAM,CAAE,MAAyB;IAC7C,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,IAAI,MAAM;QAClB,MAAM,IAAI,CAAC,CAAC,UAAU,CAAA;IAE1B,IAAI,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;IAChC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;QACpB,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAA;QACtE,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC1B,MAAM,IAAI,SAAS,CAAC,UAAU,CAAA;KACjC;IAED,OAAO,GAAG,CAAA;AACd,CAAC;AAdD,wBAcC;AAGD,eAAe;AACf,SAAgB,MAAM,CAAE,CAAS,EAAE,CAAS;IACxC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IACrB,IAAI,CAAC,GAAG,CAAC;QAAI,OAAO,CAAC,CAAC,CAAA;IACtB,OAAO,CAAC,CAAA;AACZ,CAAC;AAJD,wBAIC","sourcesContent":["export async function delay (milliseconds: number) {\n return new Promise<void>( resolve => {\n setTimeout(() => {\n resolve()\n }, milliseconds)\n })\n}\n\n\n/** 拼接 TypedArrays 生成一个完整的 Uint8Array */\nexport function concat (arrays: ArrayBufferView[]) {\n let length = 0\n for (const a of arrays)\n length += a.byteLength\n \n let buf = new Uint8Array(length)\n let offset = 0\n for (const a of arrays) {\n const uint8view = new Uint8Array(a.buffer, a.byteOffset, a.byteLength)\n buf.set(uint8view, offset)\n offset += uint8view.byteLength\n }\n \n return buf\n}\n\n\n/** 字符串字典序比较 */\nexport function strcmp (l: string, r: string) {\n if (l === r) return 0\n if (l < r) return -1\n return 1\n}\n"]}