xshell 0.0.65 → 0.0.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/file.d.ts +36 -33
- package/file.js +76 -72
- package/file.js.map +1 -1
- package/i18n/README.md +5 -5
- package/i18n/index.d.ts +1 -1
- package/i18n/index.js +14 -18
- package/i18n/index.js.map +1 -1
- package/i18n/instance.d.ts +9 -0
- package/i18n/instance.js +6 -0
- package/i18n/instance.js.map +1 -0
- package/i18n/scanner/parser.js +1 -1
- package/i18n/scanner/parser.js.map +1 -1
- package/i18n/stats.json +207 -0
- package/i18n/untranslateds.json +1 -0
- package/net.browser.d.ts +1 -0
- package/net.browser.js +8 -6
- package/net.browser.js.map +1 -1
- package/net.d.ts +8 -8
- package/net.js +12 -12
- package/net.js.map +1 -1
- package/package.json +1 -1
- package/process.d.ts +63 -29
- package/process.js +63 -16
- package/process.js.map +1 -1
- package/prototype.browser.js +9 -8
- package/prototype.browser.js.map +1 -1
- package/prototype.js +9 -8
- package/prototype.js.map +1 -1
- package/repl.js +9 -8
- package/repl.js.map +1 -1
- package/utils.browser.d.ts +1 -1
- package/utils.browser.js +2 -1
- package/utils.browser.js.map +1 -1
- package/utils.d.ts +1 -1
- package/utils.js +2 -1
- package/utils.js.map +1 -1
package/i18n/README.md
CHANGED
|
@@ -6,7 +6,7 @@ npm install xshell
|
|
|
6
6
|
```
|
|
7
7
|
|
|
8
8
|
```typescript
|
|
9
|
-
import I18N from 'xshell/i18n'
|
|
9
|
+
import { I18N } from 'xshell/i18n/index.js'
|
|
10
10
|
|
|
11
11
|
const i18n = new I18N({
|
|
12
12
|
'你好,世界!': {
|
|
@@ -14,7 +14,7 @@ const i18n = new I18N({
|
|
|
14
14
|
ja: 'こんにちは世界!',
|
|
15
15
|
ko: '안녕하세요!'
|
|
16
16
|
}
|
|
17
|
-
}, /*
|
|
17
|
+
}, /* 可不传,会自动判断 */ 'ja')
|
|
18
18
|
|
|
19
19
|
console.log(i18n.t('你好,世界!'))
|
|
20
20
|
```
|
|
@@ -86,10 +86,10 @@ new I18N(_dict, 'en')
|
|
|
86
86
|
|
|
87
87
|
### 二、浏览器中使用
|
|
88
88
|
```typescript
|
|
89
|
-
import { I18N, Trans } from 'xshell/i18n'
|
|
89
|
+
import { I18N, Trans } from 'xshell/i18n/index.js'
|
|
90
90
|
import _dict from '<project>/i18n/dict.json' // 项目词典文件
|
|
91
91
|
|
|
92
|
-
export let i18n = new I18N(_dict /*
|
|
92
|
+
export let i18n = new I18N(_dict /* 可不传 language 参数,会自动判断 */)
|
|
93
93
|
|
|
94
94
|
const { t, r, Trans, intl } = i18n
|
|
95
95
|
|
|
@@ -118,7 +118,7 @@ if (obj === { zh: '中文', en: 'english', ja: '日本語', ko: '...' })
|
|
|
118
118
|
|
|
119
119
|
#### Trans 组件
|
|
120
120
|
```jsx
|
|
121
|
-
import { I18N, Trans } from 'xshell/i18n'
|
|
121
|
+
import { I18N, Trans } from 'xshell/i18n/index.js'
|
|
122
122
|
|
|
123
123
|
// import _dict from '<project>/i18n/dict.json'
|
|
124
124
|
const _dict = {
|
package/i18n/index.d.ts
CHANGED
package/i18n/index.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import qs from 'qs';
|
|
2
1
|
import Cookies from 'js-cookie';
|
|
3
2
|
import { default as i18next } from 'i18next';
|
|
4
3
|
import { Dict } from './dict.js';
|
|
5
4
|
export const LANGUAGES = ['zh', 'en', 'ja', 'ko'];
|
|
6
5
|
/**
|
|
7
|
-
|
|
6
|
+
提供翻译文本功能,自动解析当前语言
|
|
8
7
|
@see https://github.com/ShenHongFei/xshell/tree/master/i18n
|
|
9
8
|
*/
|
|
10
9
|
export class I18N {
|
|
@@ -32,23 +31,20 @@ export class I18N {
|
|
|
32
31
|
@see https://github.com/ShenHongFei/xshell/tree/master/i18n
|
|
33
32
|
*/
|
|
34
33
|
constructor(_dict, language) {
|
|
35
|
-
const is_browser = typeof
|
|
34
|
+
const is_browser = typeof window !== 'undefined' && typeof location !== 'undefined';
|
|
36
35
|
const dict = new Dict(_dict);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if (!I18N.LANGUAGE_REGEXP.test(language))
|
|
48
|
-
language = 'en';
|
|
49
|
-
// console.log(`language = ${language}`)
|
|
36
|
+
if (!language && is_browser)
|
|
37
|
+
language = (new URLSearchParams(location.search).get('language') ||
|
|
38
|
+
window.language ||
|
|
39
|
+
Cookies.get('language'));
|
|
40
|
+
if (!language)
|
|
41
|
+
language = Intl.DateTimeFormat().resolvedOptions().locale.slice(0, 2);
|
|
42
|
+
if (!I18N.LANGUAGE_REGEXP.test(language)) {
|
|
43
|
+
if (language)
|
|
44
|
+
console.error('invalid language:', language);
|
|
45
|
+
language = 'zh';
|
|
50
46
|
}
|
|
51
|
-
|
|
47
|
+
// console.log('language:', language)
|
|
52
48
|
this.language = language;
|
|
53
49
|
this.t = (text, options) => {
|
|
54
50
|
options = options || {};
|
|
@@ -56,7 +52,7 @@ export class I18N {
|
|
|
56
52
|
return this.i18next.t(text, { ...options, lng: language, defaultValue: text });
|
|
57
53
|
};
|
|
58
54
|
this.r = (field, language = this.language) => field ?
|
|
59
|
-
field[language] || field.
|
|
55
|
+
field[language] || field.zh || field.en || field || ''
|
|
60
56
|
:
|
|
61
57
|
field || '';
|
|
62
58
|
// --- init i18next
|
package/i18n/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import Cookies from 'js-cookie'\nimport { default as i18next, type i18n as I18Next } from 'i18next'\nimport type { Trans } from 'react-i18next'\n\nimport { Dict, type _Dict, type Item } from './dict.js'\n\n\nexport type Language = 'zh' | 'en' | 'ja' | 'ko'\n\nexport const LANGUAGES = ['zh', 'en', 'ja', 'ko'] as const\n\ndeclare global {\n interface Window {\n language: Language\n }\n}\n\n\n/**\n 提供翻译文本功能,自动解析当前语言\n @see https://github.com/ShenHongFei/xshell/tree/master/i18n\n*/\nexport class I18N {\n static LANGUAGE_REGEXP = /^(zh|en|ja|jp|ko)$/\n \n \n /** (ISO 639-1 标准语言代码) 可能取 zh, en, ja, ko */\n language: Language\n \n /** hostname shortcuts */\n hosts: Hosts\n \n /** url prefix shortcuts */\n roots: Roots\n \n /** 标记静态文本,以便扫描词条,并在运行时根据当前语言获取翻译 */\n t : (text: string, options?: { language?: Language, context?: string, count?: number, [key: string]: any }) => string\n \n /** render: 翻译配置字段 */\n r : (field: Item | undefined | null, language?: Language) => string\n \n i18next: I18Next\n \n /** react-i18next <Trans/> 组件 */\n Trans: typeof Trans = ({ children }) => children as any\n \n \n /** ```ts\n import dict from './dict.json' // { \"添加\": { \"en\": \"Add\", \"ja\": \"追加\", \"ko\": \"추가\" } }\n \n const i18n = new I18N(dict, 'zh') // 创建实例,传入词典 dict 并指定语言(NodeJS 环境),\n const i18n = new I18N(dict) // 创建实例,传入词典 dict 并自动判断当前语言(浏览器环境),\n const i18n = new I18N({ }) // 创建实例,传入空词典\n ```\n @see https://github.com/ShenHongFei/xshell/tree/master/i18n\n */\n constructor (_dict: _Dict, language?: Language) {\n const is_browser = typeof window !== 'undefined' && typeof location !== 'undefined'\n \n const dict = new Dict(_dict)\n \n if (!language && is_browser)\n language = (\n new URLSearchParams(location.search).get('language') || \n window.language || \n Cookies.get('language')\n ) as Language\n \n if (!language)\n language = Intl.DateTimeFormat().resolvedOptions().locale.slice(0, 2) as Language\n \n if (!I18N.LANGUAGE_REGEXP.test(language)) {\n if (language)\n console.error('invalid language:', language)\n language = 'zh'\n }\n \n // console.log('language:', language)\n \n this.language = language\n \n this.t = (text, options) => {\n options = options || { }\n \n const language = options.language || this.language\n \n return this.i18next.t(text, { ...options, lng: language, defaultValue: text })\n }\n \n this.r = (field, language = this.language) => \n field ?\n field[language] || field.zh || field.en || field as any || ''\n :\n field || ''\n \n // --- init i18next\n this.i18next = i18next.createInstance()\n \n if (is_browser)\n try {\n // 在无 React 的浏览器环境下避免 react-i18next 中执行 React.createContext() 报错\n // const React = require('react') as typeof import('react')\n const { initReactI18next, Trans: I18NextTrans } = require('react-i18next') as typeof import('react-i18next')\n this.i18next.use(initReactI18next)\n const _i18next = this.i18next\n // 绑定 Trans 组件的 i18n 到 this.i18next, 解决多个 i18next 冲突的问题\n // react-i18next/context.js 中 i18n 实例只在模块级别维护,多次 this.i18next.use(initReactI18next) 会覆盖前面的 i18n,导致 Trans 无法翻译\n // https://github.com/i18next/react-i18next/issues/726\n this.Trans = function Trans ({ i18n = _i18next, ...others }) {\n // 简单转发,性能更好\n return I18NextTrans({ i18n, ...others })\n // return React.createElement(I18NextTrans, { i18n, ...others } as any, children)\n // return <I18NextTrans {...{ i18n, ...others } }>{children}</I18NextTrans>\n }\n } catch { }\n \n this.i18next.init({\n lng: this.language,\n // LOCAL\n // debug: true,\n debug: false,\n fallbackLng: {\n en: ['zh'],\n ja: ['en', 'zh'],\n ko: ['en', 'zh'],\n },\n // 禁用 : 和 . 作为 seperator\n keySeparator: false,\n nsSeparator: false,\n resources: dict.to_resources(),\n interpolation: {\n escapeValue: false\n },\n react: {\n transKeepBasicHtmlNodesFor: []\n },\n })\n \n \n if (typeof window !== 'undefined' && window && !('i18n' in window))\n (window as any).i18n = this\n }\n \n \n /** 加载词典文件 (需要将这两行单独放一个文件里,以保证在 import 其他文件之前执行) \n \n @example\n import dict from './dict.json' // { \"添加\": { \"en\": \"Add\", \"ja\": \"追加\", \"ko\": \"추가\" } }\n i18n.init(dict)\n */\n init (dict: _Dict) {\n const resources = new Dict(dict).to_resources()\n for (const language in resources)\n this.i18next.addResources(language, 'translation', resources[language].translation)\n }\n \n toJSON () {\n return {\n language: this.language,\n }\n }\n}\n\n\nexport interface Hosts {\n \n}\n\n\nexport interface Roots {\n \n}\n\nexport type { _Dict, Item }\n\nexport interface I18NBasic {\n intl: boolean\n language: Language\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { I18N } from './index.js';
|
|
2
|
+
export declare let i18n: I18N;
|
|
3
|
+
declare const t: (text: string, options?: {
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
language?: import("./index.js").Language;
|
|
6
|
+
context?: string;
|
|
7
|
+
count?: number;
|
|
8
|
+
}) => string, language: import("./index.js").Language;
|
|
9
|
+
export { t, language };
|
package/i18n/instance.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance.js","sourceRoot":"","sources":["instance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,KAAK,MAAM,aAAa,CAAC,SAAS,IAAI,EAAE,MAAM,EAAE,CAAA;AAEvD,MAAM,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;AACjC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;AAC5B,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAA","sourcesContent":["import { I18N } from './index.js'\nimport _dict from './dict.json' assert { type: 'json' }\n\nexport let i18n = new I18N(_dict)\nconst { t, language } = i18n\nexport { t, language }\n"]}
|
package/i18n/scanner/parser.js
CHANGED
|
@@ -4,7 +4,7 @@ import _get from 'lodash/get.js';
|
|
|
4
4
|
import babel_traverse from '@babel/traverse';
|
|
5
5
|
const { default: traverse } = babel_traverse;
|
|
6
6
|
import { parse } from '@babel/parser';
|
|
7
|
-
import
|
|
7
|
+
import t from '@babel/types';
|
|
8
8
|
import '../../prototype.js';
|
|
9
9
|
// import { Checker } from './checker'
|
|
10
10
|
/** file:///D:/0/i18next-scanner/src/parser.js */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["parser.ts"],"names":[],"mappings":"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","sourcesContent":["import castArray from 'lodash/castArray.js'\nimport trim from 'lodash/trim.js'\nimport _get from 'lodash/get.js'\n\nimport babel_traverse from '@babel/traverse'\nconst { default: traverse } = babel_traverse\nimport { parse } from '@babel/parser'\nimport * as t from '@babel/types'\n\nimport '../../prototype.js'\n\n\n// import { Checker } from './checker'\n\n/** file:///D:/0/i18next-scanner/src/parser.js */\nexport function mix_parse_trans_from_string_by_babel (parser) {\n parser.parseTransFromStringByBabel = function parse_trans_from_string_by_babel (\n code: string, \n options = { }, \n custom_handler = null,\n on_error: (callback: Function) => void \n = () => { }\n ) {\n if (typeof options === 'function') {\n custom_handler = options\n options = { }\n }\n \n const {\n transformOptions = { }, // object\n component = this.options.trans.component, // string\n i18nKey = this.options.trans.i18nKey, // string\n defaultsKey = this.options.trans.defaultsKey, // string\n fallbackKey = this.options.trans.fallbackKey, // boolean|function\n babylon: babylon_options = this.options.trans.babylon, // object\n filepath,\n } = options as any\n \n const parseJSXElement = ({ node }) => {\n if (!node) return\n \n if (node.openingElement.name.name !== component) return\n \n \n const getLiteralValue = literal => {\n if (t.isTemplateLiteral(literal))\n return literal.quasis.map(element => element.value.cooked).join(\"\")\n \n return literal.value\n }\n \n const attr = castArray(node.openingElement.attributes).reduce(\n (acc, attribute) => {\n if (\n !t.isJSXAttribute(attribute) ||\n !t.isJSXIdentifier(attribute.name)\n ) return acc\n \n const { name } = attribute.name\n const value = attribute.value\n if (t.isLiteral(value))\n acc[name] = getLiteralValue(value)\n else if (t.isJSXExpressionContainer(value)) {\n const expression = value.expression\n if (t.isIdentifier(expression))\n acc[name] = expression.name\n else if (t.isLiteral(expression))\n acc[name] = getLiteralValue(expression)\n else if (t.isObjectExpression(expression)) {\n const properties = castArray(expression.properties)\n acc[name] = properties.reduce((obj, property) => {\n if (!t.isObjectProperty(property)) return obj\n if (t.isLiteral(property.value))\n obj[(property.key as any).name] = getLiteralValue(property.value)\n else // Unable to get value of the property\n obj[(property.key as any).name] = \"\"\n return obj\n }, { })\n /**\n * 防止 count 被忽略,如\n * ```jsx\n * <Trans count={arr.length}>\n * 一二三{{ count: arr.length }}\n * </Trans>\n * ```\n */\n } else if (name === \"count\")\n acc[name] = 0\n }\n return acc\n },\n { }\n )\n const transKey = trim(attr[i18nKey])\n \n const defaultsString = attr[defaultsKey] || \"\"\n if (typeof defaultsString !== \"string\")\n this.log(`defaults value must be a static string, saw ${defaultsString.yellow}`)\n \n \n // https://www.i18next.com/translation-function/essentials#overview-options\n const tOptions = attr.tOptions\n const options = {\n ...tOptions,\n defaultValue: defaultsString || nodes_to_string(node.children, filepath, on_error),\n fallbackKey,\n }\n \n if (Object.prototype.hasOwnProperty.call(attr, \"count\"))\n options.count = Number(attr.count) || 0\n \n \n if (Object.prototype.hasOwnProperty.call(attr, \"ns\")) {\n if (typeof options.ns !== \"string\")\n this.log(`The ns attribute must be a string, saw ${attr.ns?.yellow}`)\n \n options.ns = attr.ns\n }\n \n if (custom_handler) {\n custom_handler(transKey, options)\n return\n }\n \n this.set(transKey, options)\n }\n \n try {\n const ast = parse(code, { ...babylon_options })\n traverse(ast, { JSXElement: parseJSXElement, })\n // traverse(ast, Checker({ filepath }))\n } catch (err) {\n on_error(() => {\n console.error('')\n const { line, column } = (err && err.loc) || { line: 1, column: 1 }\n console.error([filepath, line, column].join(\":\").yellow)\n console.error(`Unable to parse ${component?.blue} component.\\n`.red)\n if (!filepath)\n console.error(String(code).red)\n console.error((\" \" + err.message).red)\n })\n }\n \n return this\n }\n}\n\n\nfunction nodes_to_string (nodes, filepath, onError) {\n let memo = ''\n let node_index = 0\n nodes.forEach((node, i) => {\n if (t.isJSXText(node) || t.isStringLiteral(node)) {\n const value = node.value\n .replace(/^[\\r\\n]+\\s*/g, \"\") // remove leading spaces containing a leading newline character\n .replace(/[\\r\\n]+\\s*$/g, \"\") // remove trailing spaces containing a leading newline character\n .replace(/[\\r\\n]+\\s*/g, \" \") // replace spaces containing a leading newline character with a single space character\n \n if (!value) return\n \n memo += value\n } else if (t.isJSXExpressionContainer(node)) {\n const { expression = { } } = node\n \n if (t.isNumericLiteral(expression)) // Numeric literal is ignored in react-i18next\n memo += ''\n if (t.isStringLiteral(expression))\n memo += expression.value\n else if (\n t.isObjectExpression(expression) &&\n t.isObjectProperty(_get(expression, 'properties[0]'))\n )\n memo += '{{' + (expression.properties[0] as any).key.name + '}}'\n else\n onError(() => {\n const { line, column } = (node.expression && node.expression.loc.start) || { line: 1, column: 1 }\n console.error('')\n console.error([filepath, line, column].join(\":\").yellow)\n console.error('Unsupported JSX expression. Only static values or {{interpolation}} blocks are supported.'.red)\n })\n \n } else if (node.children)\n memo += `<${node_index}>${nodes_to_string(node.children, filepath, onError)}</${node_index}>`\n \n \n node_index++\n })\n \n return memo\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["parser.ts"],"names":[],"mappings":"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","sourcesContent":["import castArray from 'lodash/castArray.js'\nimport trim from 'lodash/trim.js'\nimport _get from 'lodash/get.js'\n\nimport babel_traverse from '@babel/traverse'\nconst { default: traverse } = babel_traverse\n\nimport { parse } from '@babel/parser'\nimport t from '@babel/types'\n\nimport '../../prototype.js'\n\n\n// import { Checker } from './checker'\n\n/** file:///D:/0/i18next-scanner/src/parser.js */\nexport function mix_parse_trans_from_string_by_babel (parser) {\n parser.parseTransFromStringByBabel = function parse_trans_from_string_by_babel (\n code: string, \n options = { }, \n custom_handler = null,\n on_error: (callback: Function) => void \n = () => { }\n ) {\n if (typeof options === 'function') {\n custom_handler = options\n options = { }\n }\n \n const {\n transformOptions = { }, // object\n component = this.options.trans.component, // string\n i18nKey = this.options.trans.i18nKey, // string\n defaultsKey = this.options.trans.defaultsKey, // string\n fallbackKey = this.options.trans.fallbackKey, // boolean|function\n babylon: babylon_options = this.options.trans.babylon, // object\n filepath,\n } = options as any\n \n const parseJSXElement = ({ node }) => {\n if (!node) return\n \n if (node.openingElement.name.name !== component) return\n \n \n const getLiteralValue = literal => {\n if (t.isTemplateLiteral(literal))\n return literal.quasis.map(element => element.value.cooked).join(\"\")\n \n return literal.value\n }\n \n const attr = castArray(node.openingElement.attributes).reduce(\n (acc, attribute) => {\n if (\n !t.isJSXAttribute(attribute) ||\n !t.isJSXIdentifier(attribute.name)\n ) return acc\n \n const { name } = attribute.name\n const value = attribute.value\n if (t.isLiteral(value))\n acc[name] = getLiteralValue(value)\n else if (t.isJSXExpressionContainer(value)) {\n const expression = value.expression\n if (t.isIdentifier(expression))\n acc[name] = expression.name\n else if (t.isLiteral(expression))\n acc[name] = getLiteralValue(expression)\n else if (t.isObjectExpression(expression)) {\n const properties = castArray(expression.properties)\n acc[name] = properties.reduce((obj, property) => {\n if (!t.isObjectProperty(property)) return obj\n if (t.isLiteral(property.value))\n obj[(property.key as any).name] = getLiteralValue(property.value)\n else // Unable to get value of the property\n obj[(property.key as any).name] = \"\"\n return obj\n }, { })\n /**\n * 防止 count 被忽略,如\n * ```jsx\n * <Trans count={arr.length}>\n * 一二三{{ count: arr.length }}\n * </Trans>\n * ```\n */\n } else if (name === \"count\")\n acc[name] = 0\n }\n return acc\n },\n { }\n )\n const transKey = trim(attr[i18nKey])\n \n const defaultsString = attr[defaultsKey] || \"\"\n if (typeof defaultsString !== \"string\")\n this.log(`defaults value must be a static string, saw ${defaultsString.yellow}`)\n \n \n // https://www.i18next.com/translation-function/essentials#overview-options\n const tOptions = attr.tOptions\n const options = {\n ...tOptions,\n defaultValue: defaultsString || nodes_to_string(node.children, filepath, on_error),\n fallbackKey,\n }\n \n if (Object.prototype.hasOwnProperty.call(attr, \"count\"))\n options.count = Number(attr.count) || 0\n \n \n if (Object.prototype.hasOwnProperty.call(attr, \"ns\")) {\n if (typeof options.ns !== \"string\")\n this.log(`The ns attribute must be a string, saw ${attr.ns?.yellow}`)\n \n options.ns = attr.ns\n }\n \n if (custom_handler) {\n custom_handler(transKey, options)\n return\n }\n \n this.set(transKey, options)\n }\n \n try {\n const ast = parse(code, { ...babylon_options })\n traverse(ast, { JSXElement: parseJSXElement, })\n // traverse(ast, Checker({ filepath }))\n } catch (err) {\n on_error(() => {\n console.error('')\n const { line, column } = (err && err.loc) || { line: 1, column: 1 }\n console.error([filepath, line, column].join(\":\").yellow)\n console.error(`Unable to parse ${component?.blue} component.\\n`.red)\n if (!filepath)\n console.error(String(code).red)\n console.error((\" \" + err.message).red)\n })\n }\n \n return this\n }\n}\n\n\nfunction nodes_to_string (nodes, filepath, onError) {\n let memo = ''\n let node_index = 0\n nodes.forEach((node, i) => {\n if (t.isJSXText(node) || t.isStringLiteral(node)) {\n const value = node.value\n .replace(/^[\\r\\n]+\\s*/g, \"\") // remove leading spaces containing a leading newline character\n .replace(/[\\r\\n]+\\s*$/g, \"\") // remove trailing spaces containing a leading newline character\n .replace(/[\\r\\n]+\\s*/g, \" \") // replace spaces containing a leading newline character with a single space character\n \n if (!value) return\n \n memo += value\n } else if (t.isJSXExpressionContainer(node)) {\n const { expression = { } } = node\n \n if (t.isNumericLiteral(expression)) // Numeric literal is ignored in react-i18next\n memo += ''\n if (t.isStringLiteral(expression))\n memo += expression.value\n else if (\n t.isObjectExpression(expression) &&\n t.isObjectProperty(_get(expression, 'properties[0]'))\n )\n memo += '{{' + (expression.properties[0] as any).key.name + '}}'\n else\n onError(() => {\n const { line, column } = (node.expression && node.expression.loc.start) || { line: 1, column: 1 }\n console.error('')\n console.error([filepath, line, column].join(\":\").yellow)\n console.error('Unsupported JSX expression. Only static values or {{interpolation}} blocks are supported.'.red)\n })\n \n } else if (node.children)\n memo += `<${node_index}>${nodes_to_string(node.children, filepath, onError)}</${node_index}>`\n \n \n node_index++\n })\n \n return memo\n}\n\n"]}
|
package/i18n/stats.json
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
{
|
|
2
|
+
"zh": {
|
|
3
|
+
"translateds": [],
|
|
4
|
+
"untranslateds": []
|
|
5
|
+
},
|
|
6
|
+
"en": {
|
|
7
|
+
"translateds": [
|
|
8
|
+
"存在:",
|
|
9
|
+
"不存在:",
|
|
10
|
+
"打开文件:",
|
|
11
|
+
"fp 必须是绝对路径,或传入 dir 参数: ",
|
|
12
|
+
"读取:",
|
|
13
|
+
" 的编码可能是 ",
|
|
14
|
+
"写入:",
|
|
15
|
+
"追加:",
|
|
16
|
+
"data 不是 Buffer 或 string",
|
|
17
|
+
" 必须是绝对路径",
|
|
18
|
+
"参数 fpd: ",
|
|
19
|
+
" 必须以 / 结尾",
|
|
20
|
+
" 太短",
|
|
21
|
+
"fp 必须是绝对路径",
|
|
22
|
+
"删除了文件夹: ",
|
|
23
|
+
"删除了文件: ",
|
|
24
|
+
"文件夹已不存在: ",
|
|
25
|
+
"文件已不存在: ",
|
|
26
|
+
"fp_src 和 fp_dst 必须同为文件路径或文件夹路径",
|
|
27
|
+
"fp_src 和 fp_dst 必须为完整路径",
|
|
28
|
+
"复制:",
|
|
29
|
+
"src 和 dst 必须同为文件路径或文件夹路径",
|
|
30
|
+
"src 和 dst 必须为完整路径",
|
|
31
|
+
"移动:",
|
|
32
|
+
"fp 和 fp_ 必须是绝对路径",
|
|
33
|
+
"重命名:",
|
|
34
|
+
"文件已存在:",
|
|
35
|
+
"fpd 必须是绝对路径: ",
|
|
36
|
+
"fpd 必须以 / 结尾: ",
|
|
37
|
+
"文件夹已创建:",
|
|
38
|
+
"文件夹已存在:",
|
|
39
|
+
"fp_real 和 fp_link 必须同为文件路径或文件夹路径",
|
|
40
|
+
"存在同名",
|
|
41
|
+
"文件夹",
|
|
42
|
+
"文件",
|
|
43
|
+
",无法创建链接",
|
|
44
|
+
"已将源文件 ",
|
|
45
|
+
" 链接到 ",
|
|
46
|
+
"fp 必须是完整路径",
|
|
47
|
+
"文件修改 (",
|
|
48
|
+
"websocket 已连接: ",
|
|
49
|
+
"websocket 已关闭",
|
|
50
|
+
"websocket 出错了",
|
|
51
|
+
"remote.send(): websocket client 已断开",
|
|
52
|
+
"找不到 rpc handler",
|
|
53
|
+
"凌晨",
|
|
54
|
+
"清晨",
|
|
55
|
+
"早上",
|
|
56
|
+
"上午",
|
|
57
|
+
"中午",
|
|
58
|
+
"下午",
|
|
59
|
+
"晚上",
|
|
60
|
+
"深夜",
|
|
61
|
+
"xshell 正在启动",
|
|
62
|
+
"repl 已启动",
|
|
63
|
+
"server 正在启动",
|
|
64
|
+
"server 已启动",
|
|
65
|
+
"xshell 启动完成",
|
|
66
|
+
"xshell 正在监听: ",
|
|
67
|
+
"所有模块全部加载",
|
|
68
|
+
"已加载",
|
|
69
|
+
"断言失败"
|
|
70
|
+
],
|
|
71
|
+
"untranslateds": []
|
|
72
|
+
},
|
|
73
|
+
"ja": {
|
|
74
|
+
"translateds": [],
|
|
75
|
+
"untranslateds": [
|
|
76
|
+
"存在:",
|
|
77
|
+
"不存在:",
|
|
78
|
+
"打开文件:",
|
|
79
|
+
"fp 必须是绝对路径,或传入 dir 参数: ",
|
|
80
|
+
"读取:",
|
|
81
|
+
" 的编码可能是 ",
|
|
82
|
+
"写入:",
|
|
83
|
+
"追加:",
|
|
84
|
+
"data 不是 Buffer 或 string",
|
|
85
|
+
" 必须是绝对路径",
|
|
86
|
+
"参数 fpd: ",
|
|
87
|
+
" 必须以 / 结尾",
|
|
88
|
+
" 太短",
|
|
89
|
+
"fp 必须是绝对路径",
|
|
90
|
+
"删除了文件夹: ",
|
|
91
|
+
"删除了文件: ",
|
|
92
|
+
"文件夹已不存在: ",
|
|
93
|
+
"文件已不存在: ",
|
|
94
|
+
"fp_src 和 fp_dst 必须同为文件路径或文件夹路径",
|
|
95
|
+
"fp_src 和 fp_dst 必须为完整路径",
|
|
96
|
+
"复制:",
|
|
97
|
+
"src 和 dst 必须同为文件路径或文件夹路径",
|
|
98
|
+
"src 和 dst 必须为完整路径",
|
|
99
|
+
"移动:",
|
|
100
|
+
"fp 和 fp_ 必须是绝对路径",
|
|
101
|
+
"重命名:",
|
|
102
|
+
"文件已存在:",
|
|
103
|
+
"fpd 必须是绝对路径: ",
|
|
104
|
+
"fpd 必须以 / 结尾: ",
|
|
105
|
+
"文件夹已创建:",
|
|
106
|
+
"文件夹已存在:",
|
|
107
|
+
"fp_real 和 fp_link 必须同为文件路径或文件夹路径",
|
|
108
|
+
"存在同名",
|
|
109
|
+
"文件夹",
|
|
110
|
+
"文件",
|
|
111
|
+
",无法创建链接",
|
|
112
|
+
"已将源文件 ",
|
|
113
|
+
" 链接到 ",
|
|
114
|
+
"fp 必须是完整路径",
|
|
115
|
+
"文件修改 (",
|
|
116
|
+
"websocket 已连接: ",
|
|
117
|
+
"websocket 已关闭",
|
|
118
|
+
"websocket 出错了",
|
|
119
|
+
"remote.send(): websocket client 已断开",
|
|
120
|
+
"找不到 rpc handler",
|
|
121
|
+
"凌晨",
|
|
122
|
+
"清晨",
|
|
123
|
+
"早上",
|
|
124
|
+
"上午",
|
|
125
|
+
"中午",
|
|
126
|
+
"下午",
|
|
127
|
+
"晚上",
|
|
128
|
+
"深夜",
|
|
129
|
+
"xshell 正在启动",
|
|
130
|
+
"repl 已启动",
|
|
131
|
+
"server 正在启动",
|
|
132
|
+
"server 已启动",
|
|
133
|
+
"xshell 启动完成",
|
|
134
|
+
"xshell 正在监听: ",
|
|
135
|
+
"所有模块全部加载",
|
|
136
|
+
"已加载",
|
|
137
|
+
"断言失败"
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
"ko": {
|
|
141
|
+
"translateds": [],
|
|
142
|
+
"untranslateds": [
|
|
143
|
+
"存在:",
|
|
144
|
+
"不存在:",
|
|
145
|
+
"打开文件:",
|
|
146
|
+
"fp 必须是绝对路径,或传入 dir 参数: ",
|
|
147
|
+
"读取:",
|
|
148
|
+
" 的编码可能是 ",
|
|
149
|
+
"写入:",
|
|
150
|
+
"追加:",
|
|
151
|
+
"data 不是 Buffer 或 string",
|
|
152
|
+
" 必须是绝对路径",
|
|
153
|
+
"参数 fpd: ",
|
|
154
|
+
" 必须以 / 结尾",
|
|
155
|
+
" 太短",
|
|
156
|
+
"fp 必须是绝对路径",
|
|
157
|
+
"删除了文件夹: ",
|
|
158
|
+
"删除了文件: ",
|
|
159
|
+
"文件夹已不存在: ",
|
|
160
|
+
"文件已不存在: ",
|
|
161
|
+
"fp_src 和 fp_dst 必须同为文件路径或文件夹路径",
|
|
162
|
+
"fp_src 和 fp_dst 必须为完整路径",
|
|
163
|
+
"复制:",
|
|
164
|
+
"src 和 dst 必须同为文件路径或文件夹路径",
|
|
165
|
+
"src 和 dst 必须为完整路径",
|
|
166
|
+
"移动:",
|
|
167
|
+
"fp 和 fp_ 必须是绝对路径",
|
|
168
|
+
"重命名:",
|
|
169
|
+
"文件已存在:",
|
|
170
|
+
"fpd 必须是绝对路径: ",
|
|
171
|
+
"fpd 必须以 / 结尾: ",
|
|
172
|
+
"文件夹已创建:",
|
|
173
|
+
"文件夹已存在:",
|
|
174
|
+
"fp_real 和 fp_link 必须同为文件路径或文件夹路径",
|
|
175
|
+
"存在同名",
|
|
176
|
+
"文件夹",
|
|
177
|
+
"文件",
|
|
178
|
+
",无法创建链接",
|
|
179
|
+
"已将源文件 ",
|
|
180
|
+
" 链接到 ",
|
|
181
|
+
"fp 必须是完整路径",
|
|
182
|
+
"文件修改 (",
|
|
183
|
+
"websocket 已连接: ",
|
|
184
|
+
"websocket 已关闭",
|
|
185
|
+
"websocket 出错了",
|
|
186
|
+
"remote.send(): websocket client 已断开",
|
|
187
|
+
"找不到 rpc handler",
|
|
188
|
+
"凌晨",
|
|
189
|
+
"清晨",
|
|
190
|
+
"早上",
|
|
191
|
+
"上午",
|
|
192
|
+
"中午",
|
|
193
|
+
"下午",
|
|
194
|
+
"晚上",
|
|
195
|
+
"深夜",
|
|
196
|
+
"xshell 正在启动",
|
|
197
|
+
"repl 已启动",
|
|
198
|
+
"server 正在启动",
|
|
199
|
+
"server 已启动",
|
|
200
|
+
"xshell 启动完成",
|
|
201
|
+
"xshell 正在监听: ",
|
|
202
|
+
"所有模块全部加载",
|
|
203
|
+
"已加载",
|
|
204
|
+
"断言失败"
|
|
205
|
+
]
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
package/net.browser.d.ts
CHANGED
package/net.browser.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
/// <reference types='tampermonkey' />
|
|
2
|
+
import { t } from './i18n/instance.js';
|
|
3
|
+
import './prototype.browser.js'; // to_time_str()
|
|
2
4
|
import { assert, concat, genid } from './utils.browser.js';
|
|
3
5
|
export async function request(url, { method, queries, headers, body, type = 'application/json', cors, by = window.GM_xmlhttpRequest ? 'GM_xmlhttpRequest' : 'fetch', raw, } = {}) {
|
|
4
6
|
url = new URL(url, location.href);
|
|
@@ -78,8 +80,8 @@ export async function connect_websocket(url, { protocols, on_close, on_error, on
|
|
|
78
80
|
websocket.binaryType = 'arraybuffer';
|
|
79
81
|
return new Promise((resolve, reject) => {
|
|
80
82
|
websocket.addEventListener('open', async (event) => {
|
|
81
|
-
console.log(new Date().
|
|
82
|
-
'websocket
|
|
83
|
+
console.log(new Date().to_time_str() + ': ' +
|
|
84
|
+
t('websocket 已连接: ') +
|
|
83
85
|
(protocols ?
|
|
84
86
|
typeof protocols === 'string' ? `protocol: ${protocols}, url: ` : `protocol: [${protocols.join(', ')}], url: `
|
|
85
87
|
:
|
|
@@ -88,11 +90,11 @@ export async function connect_websocket(url, { protocols, on_close, on_error, on
|
|
|
88
90
|
resolve(websocket);
|
|
89
91
|
});
|
|
90
92
|
websocket.addEventListener('close', event => {
|
|
91
|
-
console.log(`${new Date().
|
|
93
|
+
console.log(`${new Date().to_time_str()}: ${t('websocket 已关闭')}: url: ${websocket.url}, code: ${event.code}, reason: ${event.reason}`);
|
|
92
94
|
on_close?.(event, websocket);
|
|
93
95
|
});
|
|
94
96
|
websocket.addEventListener('error', event => {
|
|
95
|
-
const message = `${new Date().
|
|
97
|
+
const message = `${new Date().to_time_str()}: ${t('websocket 出错了')}: ${websocket.url}`;
|
|
96
98
|
try {
|
|
97
99
|
on_error?.(event, websocket);
|
|
98
100
|
reject(Object.assign(new Error(message), { event }));
|
|
@@ -209,7 +211,7 @@ export class Remote {
|
|
|
209
211
|
else {
|
|
210
212
|
assert(websocket);
|
|
211
213
|
if (websocket.readyState !== WebSocket.OPEN)
|
|
212
|
-
throw new Error(
|
|
214
|
+
throw new Error(t('remote.send(): websocket client 已断开'));
|
|
213
215
|
}
|
|
214
216
|
if (!message.id)
|
|
215
217
|
message.id = genid();
|
|
@@ -246,7 +248,7 @@ export class Remote {
|
|
|
246
248
|
else if (message.error)
|
|
247
249
|
throw message.error;
|
|
248
250
|
else
|
|
249
|
-
throw new Error(
|
|
251
|
+
throw new Error(`${t('找不到 rpc handler')}: ${func ? `func: ${func.quote()}` : `id: ${id}`}`);
|
|
250
252
|
}
|
|
251
253
|
catch (error) {
|
|
252
254
|
// handle 出错并不意味着 rpc 一定会结束,可能 error 是运行中的正常数据,所以不能清理 handler
|