@dune2/cli 0.6.0 → 1.0.0
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/dist/{chunk-UGSBKD2I.js → chunk-DORNSRHQ.js} +2 -3
- package/dist/{chunk-555YTWSW.js → chunk-VS4LDXR3.js} +1 -4
- package/dist/chunk-VS4LDXR3.js.map +1 -0
- package/dist/{chunk-PRJ3NOXB.js → chunk-YZLVO3MA.js} +2 -2
- package/dist/cli.js +5 -45
- package/dist/cli.js.map +1 -1
- package/dist/{generateApi-6O2YBWTL.js → generateApi-S77LKSZT.js} +93 -33
- package/dist/generateApi-S77LKSZT.js.map +1 -0
- package/dist/index.d.ts +3 -35
- package/dist/index.js +30 -10
- package/dist/index.js.map +1 -1
- package/dist/{initConfig-5VN3U4OF.js → initConfig-NHHN2HCE.js} +4 -4
- package/dist/{interactive-HNOHT33A.js → interactive-BVOA3VKY.js} +2 -2
- package/dist/normalizeConfig.d.ts +1 -1
- package/dist/normalizeConfig.js +1 -1
- package/dist/prettier.cjs.map +1 -1
- package/dist/{types-D01zR42f.d.ts → types-CqBxoc6L.d.ts} +0 -12
- package/package.json +2 -9
- package/dist/auth-777GVVSS.js +0 -8
- package/dist/auth-777GVVSS.js.map +0 -1
- package/dist/chunk-2SEEW5WZ.js +0 -67
- package/dist/chunk-2SEEW5WZ.js.map +0 -1
- package/dist/chunk-555YTWSW.js.map +0 -1
- package/dist/chunk-6UFZ6KLX.js +0 -124
- package/dist/chunk-6UFZ6KLX.js.map +0 -1
- package/dist/chunk-ADQ6JLT6.js +0 -196
- package/dist/chunk-ADQ6JLT6.js.map +0 -1
- package/dist/chunk-IKJLPHF7.js +0 -117
- package/dist/chunk-IKJLPHF7.js.map +0 -1
- package/dist/chunk-KNC7XY4Z.js +0 -130
- package/dist/chunk-KNC7XY4Z.js.map +0 -1
- package/dist/chunk-Q7UJ456X.js +0 -24
- package/dist/chunk-Q7UJ456X.js.map +0 -1
- package/dist/download-KXSMWNXH.js +0 -49
- package/dist/download-KXSMWNXH.js.map +0 -1
- package/dist/extract-ARNNWYYN.js +0 -113
- package/dist/extract-ARNNWYYN.js.map +0 -1
- package/dist/generateApi-6O2YBWTL.js.map +0 -1
- package/dist/namespace-SAPL3UY6.js +0 -137
- package/dist/namespace-SAPL3UY6.js.map +0 -1
- package/dist/upload-S43DON7A.js +0 -92
- package/dist/upload-S43DON7A.js.map +0 -1
- /package/dist/{chunk-UGSBKD2I.js.map → chunk-DORNSRHQ.js.map} +0 -0
- /package/dist/{chunk-PRJ3NOXB.js.map → chunk-YZLVO3MA.js.map} +0 -0
- /package/dist/{initConfig-5VN3U4OF.js.map → initConfig-NHHN2HCE.js.map} +0 -0
- /package/dist/{interactive-HNOHT33A.js.map → interactive-BVOA3VKY.js.map} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dune2/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/liaoyinglong/next-tools.git",
|
|
@@ -33,27 +33,20 @@
|
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@apidevtools/swagger-parser": "^10.1.0",
|
|
35
35
|
"cac": "^6.7.14",
|
|
36
|
-
"cli-table3": "^0.6.3",
|
|
37
|
-
"connect": "^3.7.0",
|
|
38
36
|
"debug": "^4.3.4",
|
|
39
37
|
"enquirer": "^2.3.6",
|
|
40
38
|
"fs-extra": "^11.2.0",
|
|
41
|
-
"globby": "^14.0.1",
|
|
42
|
-
"googleapis": "108.0.0",
|
|
43
39
|
"jiti": "^2.4.2",
|
|
44
40
|
"json-schema-to-typescript": "15.0.0",
|
|
45
41
|
"lodash": "^4.17.21",
|
|
46
|
-
"open": "^10.1.0",
|
|
47
42
|
"p-map": "^7.0.2",
|
|
48
43
|
"path-to-regexp": "7.1.0",
|
|
49
|
-
"picocolors": "^1.0.0"
|
|
50
|
-
"@dune2/wasm": "0.4.0"
|
|
44
|
+
"picocolors": "^1.0.0"
|
|
51
45
|
},
|
|
52
46
|
"devDependencies": {
|
|
53
47
|
"@types/debug": "^4.1.7",
|
|
54
48
|
"@types/lodash": "^4.14.186",
|
|
55
49
|
"gaxios": "*",
|
|
56
|
-
"google-auth-library": "*",
|
|
57
50
|
"openapi-types": "^12.0.2",
|
|
58
51
|
"prettier": "^3",
|
|
59
52
|
"tsup": "8"
|
package/dist/auth-777GVVSS.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/chunk-2SEEW5WZ.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
// src/shared/promptConfigEnable.ts
|
|
2
|
-
import enquirer from "enquirer";
|
|
3
|
-
var { prompt } = enquirer;
|
|
4
|
-
async function promptConfigEnable(opt) {
|
|
5
|
-
const { configArr, getChoiceItem } = opt;
|
|
6
|
-
if (configArr.length <= 1) {
|
|
7
|
-
return configArr;
|
|
8
|
-
}
|
|
9
|
-
const choices = [
|
|
10
|
-
{
|
|
11
|
-
name: "\u5168\u90E8",
|
|
12
|
-
message: "\u5168\u90E8",
|
|
13
|
-
choices: configArr.map((item) => {
|
|
14
|
-
return getChoiceItem(item);
|
|
15
|
-
})
|
|
16
|
-
}
|
|
17
|
-
];
|
|
18
|
-
const res = await prompt({
|
|
19
|
-
type: "multiselect",
|
|
20
|
-
message: "\u9009\u62E9\u8981\u751F\u6548\u7684\u914D\u7F6E\u9879",
|
|
21
|
-
// @ts-ignore
|
|
22
|
-
hint: "(\u7A7A\u683C\u9009\u4E2D\uFF0C\u56DE\u8F66\u786E\u8BA4)",
|
|
23
|
-
name: "enabled",
|
|
24
|
-
validate(value) {
|
|
25
|
-
return value.length === 0 ? `\u81F3\u5C11\u9009\u62E9\u4E00\u9879` : true;
|
|
26
|
-
},
|
|
27
|
-
choices
|
|
28
|
-
});
|
|
29
|
-
configArr.forEach((item) => {
|
|
30
|
-
item.enabled = opt.checkIsEnabled(res.enabled, item);
|
|
31
|
-
});
|
|
32
|
-
return configArr.filter((c) => c.enabled);
|
|
33
|
-
}
|
|
34
|
-
function promptI18nConfigEnable(configArr) {
|
|
35
|
-
return promptConfigEnable({
|
|
36
|
-
configArr: configArr ?? [],
|
|
37
|
-
getChoiceItem: (item) => {
|
|
38
|
-
return {
|
|
39
|
-
name: item.i18nDir,
|
|
40
|
-
hint: `sheetRange: ${item.sheetRange}`
|
|
41
|
-
};
|
|
42
|
-
},
|
|
43
|
-
checkIsEnabled: (enabledArr, item) => {
|
|
44
|
-
return enabledArr.includes(item.i18nDir);
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
function promptApiConfigEnable(configArr) {
|
|
49
|
-
return promptConfigEnable({
|
|
50
|
-
configArr: configArr ?? [],
|
|
51
|
-
getChoiceItem: (item) => {
|
|
52
|
-
return {
|
|
53
|
-
name: item.output,
|
|
54
|
-
hint: `swaggerJSONPath: ${item.swaggerJSONPath}`
|
|
55
|
-
};
|
|
56
|
-
},
|
|
57
|
-
checkIsEnabled: (enabledArr, item) => {
|
|
58
|
-
return enabledArr.includes(item.output);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export {
|
|
64
|
-
promptI18nConfigEnable,
|
|
65
|
-
promptApiConfigEnable
|
|
66
|
-
};
|
|
67
|
-
//# sourceMappingURL=chunk-2SEEW5WZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/promptConfigEnable.ts"],"sourcesContent":["import enquirer from \"enquirer\";\nimport { ApiConfig, I18nConfig } from \"./config\";\nconst { prompt } = enquirer;\n\ninterface Opt<T> {\n configArr: (T & { enabled?: boolean })[];\n getChoiceItem: (item: T) => {\n name: string;\n message?: string;\n value?: string;\n hint?: string;\n };\n checkIsEnabled: (enabledArr: string[], item: T) => boolean;\n}\n\nexport async function promptConfigEnable<T>(opt: Opt<T>) {\n const { configArr, getChoiceItem } = opt;\n // 只有一条配置的时候不用选择\n if (configArr.length <= 1) {\n return configArr;\n }\n\n const choices = [\n {\n name: \"全部\",\n message: \"全部\",\n choices: configArr.map((item) => {\n return getChoiceItem(item);\n }),\n },\n ];\n const res = await prompt<{ enabled: string[] }>({\n type: \"multiselect\",\n message: \"选择要生效的配置项\",\n // @ts-ignore\n hint: \"(空格选中,回车确认)\",\n name: \"enabled\",\n validate(value) {\n return value.length === 0 ? `至少选择一项` : true;\n },\n choices,\n });\n\n configArr.forEach((item) => {\n item.enabled = opt.checkIsEnabled(res.enabled, item);\n });\n\n return configArr.filter((c) => c.enabled);\n}\n\nexport function promptI18nConfigEnable(configArr: I18nConfig[] | undefined) {\n return promptConfigEnable({\n configArr: configArr ?? [],\n getChoiceItem: (item) => {\n return {\n name: item.i18nDir!,\n hint: `sheetRange: ${item.sheetRange}`,\n };\n },\n checkIsEnabled: (enabledArr, item) => {\n return enabledArr.includes(item.i18nDir!);\n },\n });\n}\n\nexport function promptApiConfigEnable(configArr: ApiConfig[] | undefined) {\n return promptConfigEnable({\n configArr: configArr ?? [],\n getChoiceItem: (item) => {\n return {\n name: item.output!,\n hint: `swaggerJSONPath: ${item.swaggerJSONPath}`,\n };\n },\n checkIsEnabled: (enabledArr, item) => {\n return enabledArr.includes(item.output!);\n },\n });\n}\n"],"mappings":";AAAA,OAAO,cAAc;AAErB,IAAM,EAAE,OAAO,IAAI;AAanB,eAAsB,mBAAsB,KAAa;AACvD,QAAM,EAAE,WAAW,cAAc,IAAI;AAErC,MAAI,UAAU,UAAU,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU;AAAA,IACd;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,UAAU,IAAI,CAAC,SAAS;AAC/B,eAAO,cAAc,IAAI;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,MAAM,MAAM,OAA8B;AAAA,IAC9C,MAAM;AAAA,IACN,SAAS;AAAA;AAAA,IAET,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,OAAO;AACd,aAAO,MAAM,WAAW,IAAI,yCAAW;AAAA,IACzC;AAAA,IACA;AAAA,EACF,CAAC;AAED,YAAU,QAAQ,CAAC,SAAS;AAC1B,SAAK,UAAU,IAAI,eAAe,IAAI,SAAS,IAAI;AAAA,EACrD,CAAC;AAED,SAAO,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO;AAC1C;AAEO,SAAS,uBAAuB,WAAqC;AAC1E,SAAO,mBAAmB;AAAA,IACxB,WAAW,aAAa,CAAC;AAAA,IACzB,eAAe,CAAC,SAAS;AACvB,aAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,MAAM,eAAe,KAAK,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,YAAY,SAAS;AACpC,aAAO,WAAW,SAAS,KAAK,OAAQ;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;AAEO,SAAS,sBAAsB,WAAoC;AACxE,SAAO,mBAAmB;AAAA,IACxB,WAAW,aAAa,CAAC;AAAA,IACzB,eAAe,CAAC,SAAS;AACvB,aAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,MAAM,oBAAoB,KAAK,eAAe;AAAA,MAChD;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,YAAY,SAAS;AACpC,aAAO,WAAW,SAAS,KAAK,MAAO;AAAA,IACzC;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/config/normalizeConfig.ts","../src/shared/defaultJsonSorter.ts","../src/shared/resolveSheetId.ts"],"sourcesContent":["import _ from \"lodash\";\nimport path from \"path\";\nimport { defaultJsonSorter } from \"../defaultJsonSorter\";\nimport { resolveSheetId } from \"../resolveSheetId\";\nimport { ApiConfig, Config, I18nConfig } from \"./types\";\nexport function normalizeConfig(config: Config): Config {\n const defaultI18nConfig: I18nConfig = {\n i18nDir: \"./src/i18n\",\n i18nFileName: \"{locale}.i18n.json\",\n position: { key: \"B\", zh: \"C\", en: \"D\", in: \"E\" },\n parseStartIndex: 2,\n };\n config.cwd ??= process.cwd();\n config.cacheDir ??= path.join(config.cwd, \"node_modules/.cache/dune-cli\");\n\n //#region i18n 配置标准化\n if (!config.i18n || !config.i18n?.length) {\n config.i18n = [defaultI18nConfig];\n }\n\n // 格式化 i18n 配置\n config.i18n = config.i18n.map((item) => {\n item = Object.assign({}, defaultI18nConfig, item);\n item.cwd ??= config.cwd;\n item.locales = Object.keys(item.position!).filter((item) => item !== \"key\");\n item.sheetId = resolveSheetId(item.sheetId);\n item.jsonSorter = defaultJsonSorter;\n item.enabled ??= true;\n item.defaultLocale ??= \"zh\";\n\n //#region namespace\n item.namespaceSeparator ??= \".\";\n //#endregion\n\n const defaultTranslatePlatform: I18nConfig[\"translatePlatform\"] = {\n url: \"https://test-transfer.duneproject.xyz\",\n enable: !!item.translatePlatform?.project,\n };\n _.defaults(item.translatePlatform, defaultTranslatePlatform);\n return item;\n });\n //#endregion\n\n //#region api 配置标准化\n config.api ??= [];\n config.api = config.api.map(apiConfigNormalizer);\n //#endregion\n return config;\n}\nexport function apiConfigNormalizer(item: ApiConfig) {\n item.output ??= \"./src/apis\";\n // 没有配置 urlTransformer 时,给 requestFnImportPath 赋默认值\n // 优先使用 urlTransformer\n if (!item.urlTransformer) {\n item.requestFnImportPath ??= `import requestFn from '@/utils/request';`;\n }\n item.RequestBuilderImportPath ??= `import { RequestBuilder } from '@dune2/tools/rq';`;\n item.enableTs ??= true;\n item.enabled ??= true;\n item.format ??= true;\n item.responseSchemaTransformer ??= (schema) =>\n schema.properties?.data ?? schema;\n return item;\n}\n","import _ from \"lodash\";\n\n/**\n * 对 JSON 对象的键进行排序\n * @param obj 要排序的 JSON 对象\n * @returns 排序后的 JSON 对象\n */\nexport function defaultJsonSorter<T extends Record<string, any>>(obj: T) {\n const keys = Object.keys(obj);\n const sortedKeys = _.sortBy(keys); // 使用 lodash 库的 sortBy 方法对键进行排序\n const sortedObj = sortedKeys.reduce((acc, key) => {\n acc[key as keyof T] = obj[key];\n return acc;\n }, {} as T);\n\n return sortedObj as T;\n}\n","/**\n * input:\n * \"https://docs.google.com/spreadsheets/d/1C9-Dol3oO20W9_FhiVlxNsDhOaaejJIgAZYRkonGmfk/edit#gid=1740568548\"\n * output:\n * \"1C9-Dol3oO20W9_FhiVlxNsDhOaaejJIgAZYRkonGmfk\"\n * --\n * input: \"1C9-Dol3oO20W9_FhiVlxNsDhOaaejJIgAZYRkonGmfk\"\n * output: \"1C9-Dol3oO20W9_FhiVlxNsDhOaaejJIgAZYRkonGmfk\"\n */\nimport { match } from \"path-to-regexp\";\n\nexport function resolveSheetId(str?: string) {\n if (!str || !str?.startsWith(\"http\")) {\n return str;\n }\n const url = new URL(str);\n const matched = match<{ id: string[] }>(\"/spreadsheets/d{/:id}*\", {\n decode: decodeURIComponent,\n })(url.pathname);\n\n return matched ? matched.params.id?.[0] : str;\n}\n"],"mappings":";AAAA,OAAOA,QAAO;AACd,OAAO,UAAU;;;ACDjB,OAAO,OAAO;AAOP,SAAS,kBAAiD,KAAQ;AACvE,QAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,QAAM,aAAa,EAAE,OAAO,IAAI;AAChC,QAAM,YAAY,WAAW,OAAO,CAAC,KAAK,QAAQ;AAChD,QAAI,GAAc,IAAI,IAAI,GAAG;AAC7B,WAAO;AAAA,EACT,GAAG,CAAC,CAAM;AAEV,SAAO;AACT;;;ACPA,SAAS,aAAa;AAEf,SAAS,eAAe,KAAc;AAX7C;AAYE,MAAI,CAAC,OAAO,EAAC,2BAAK,WAAW,UAAS;AACpC,WAAO;AAAA,EACT;AACA,QAAM,MAAM,IAAI,IAAI,GAAG;AACvB,QAAM,UAAU,MAAwB,0BAA0B;AAAA,IAChE,QAAQ;AAAA,EACV,CAAC,EAAE,IAAI,QAAQ;AAEf,SAAO,WAAU,aAAQ,OAAO,OAAf,mBAAoB,KAAK;AAC5C;;;AFhBO,SAAS,gBAAgB,QAAwB;AALxD;AAME,QAAM,oBAAgC;AAAA,IACpC,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU,EAAE,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI;AAAA,IAChD,iBAAiB;AAAA,EACnB;AACA,SAAO,QAAQ,QAAQ,IAAI;AAC3B,SAAO,aAAa,KAAK,KAAK,OAAO,KAAK,8BAA8B;AAGxE,MAAI,CAAC,OAAO,QAAQ,GAAC,YAAO,SAAP,mBAAa,SAAQ;AACxC,WAAO,OAAO,CAAC,iBAAiB;AAAA,EAClC;AAGA,SAAO,OAAO,OAAO,KAAK,IAAI,CAAC,SAAS;AArB1C,QAAAC;AAsBI,WAAO,OAAO,OAAO,CAAC,GAAG,mBAAmB,IAAI;AAChD,SAAK,QAAQ,OAAO;AACpB,SAAK,UAAU,OAAO,KAAK,KAAK,QAAS,EAAE,OAAO,CAACC,UAASA,UAAS,KAAK;AAC1E,SAAK,UAAU,eAAe,KAAK,OAAO;AAC1C,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,SAAK,kBAAkB;AAGvB,SAAK,uBAAuB;AAG5B,UAAM,2BAA4D;AAAA,MAChE,KAAK;AAAA,MACL,QAAQ,CAAC,GAACD,MAAA,KAAK,sBAAL,gBAAAA,IAAwB;AAAA,IACpC;AACA,IAAAE,GAAE,SAAS,KAAK,mBAAmB,wBAAwB;AAC3D,WAAO;AAAA,EACT,CAAC;AAID,SAAO,QAAQ,CAAC;AAChB,SAAO,MAAM,OAAO,IAAI,IAAI,mBAAmB;AAE/C,SAAO;AACT;AACO,SAAS,oBAAoB,MAAiB;AACnD,OAAK,WAAW;AAGhB,MAAI,CAAC,KAAK,gBAAgB;AACxB,SAAK,wBAAwB;AAAA,EAC/B;AACA,OAAK,6BAA6B;AAClC,OAAK,aAAa;AAClB,OAAK,YAAY;AACjB,OAAK,WAAW;AAChB,OAAK,8BAA8B,CAAC,WAAQ;AA5D9C;AA6DI,yBAAO,eAAP,mBAAmB,SAAQ;AAAA;AAC7B,SAAO;AACT;","names":["_","_a","item","_"]}
|
package/dist/chunk-6UFZ6KLX.js
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
googleAuth
|
|
3
|
-
} from "./chunk-KNC7XY4Z.js";
|
|
4
|
-
import {
|
|
5
|
-
createLogger
|
|
6
|
-
} from "./chunk-UGSBKD2I.js";
|
|
7
|
-
|
|
8
|
-
// src/shared/letters.ts
|
|
9
|
-
function letterToNumber(letters) {
|
|
10
|
-
if (typeof letters === "number" || !Number.isNaN(+letters)) {
|
|
11
|
-
return +letters;
|
|
12
|
-
}
|
|
13
|
-
let n = 0;
|
|
14
|
-
letters = letters.toUpperCase();
|
|
15
|
-
for (let p = 0; p < letters.length; p++) {
|
|
16
|
-
n = letters[p].charCodeAt(0) - 64 + n * 26;
|
|
17
|
-
}
|
|
18
|
-
return Math.max(0, n - 1);
|
|
19
|
-
}
|
|
20
|
-
var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
21
|
-
var base = alphabet.length;
|
|
22
|
-
function numberToLetter(n) {
|
|
23
|
-
const digits = [];
|
|
24
|
-
do {
|
|
25
|
-
const v = n % base;
|
|
26
|
-
digits.push(v);
|
|
27
|
-
n = Math.floor(n / base);
|
|
28
|
-
} while (n-- > 0);
|
|
29
|
-
const chars = [];
|
|
30
|
-
while (digits.length) {
|
|
31
|
-
chars.push(alphabet[digits.pop()]);
|
|
32
|
-
}
|
|
33
|
-
return chars.join("");
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// src/shared/google/sheet.ts
|
|
37
|
-
import { google } from "googleapis";
|
|
38
|
-
var log = createLogger("google:sheets");
|
|
39
|
-
var GoogleSheet = class {
|
|
40
|
-
constructor() {
|
|
41
|
-
this.initPromise = null;
|
|
42
|
-
this.get = async (options) => {
|
|
43
|
-
await this.init();
|
|
44
|
-
return this.sheets.spreadsheets.values.get(options);
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
async initImpl() {
|
|
48
|
-
if (!this.sheets) {
|
|
49
|
-
await googleAuth.initCredentials();
|
|
50
|
-
this.sheets = google.sheets({
|
|
51
|
-
version: "v4",
|
|
52
|
-
auth: googleAuth.oauth2Client
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* 调用 sheets 其他方法的时候需要先初始化
|
|
58
|
-
*/
|
|
59
|
-
async init() {
|
|
60
|
-
if (!this.initPromise) {
|
|
61
|
-
this.initPromise = this.initImpl();
|
|
62
|
-
}
|
|
63
|
-
await this.initPromise;
|
|
64
|
-
}
|
|
65
|
-
async update(spreadsheetId, range, colIndex, rowIndex, values) {
|
|
66
|
-
await this.init();
|
|
67
|
-
const colLetter = numberToLetter(colIndex);
|
|
68
|
-
const sheetNeedRange = `${range}!${colLetter}${rowIndex}`;
|
|
69
|
-
const res = await this.sheets.spreadsheets.values.update({
|
|
70
|
-
spreadsheetId,
|
|
71
|
-
range: sheetNeedRange,
|
|
72
|
-
valueInputOption: "USER_ENTERED",
|
|
73
|
-
requestBody: { values }
|
|
74
|
-
});
|
|
75
|
-
if (res.status === 200) {
|
|
76
|
-
log.info(`\u66F4\u65B0 ${sheetNeedRange} \u7684\u503C\u6210\u529F`);
|
|
77
|
-
} else {
|
|
78
|
-
log.error("some thing wrong", res);
|
|
79
|
-
}
|
|
80
|
-
return res;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* 更新某一个单元格
|
|
84
|
-
*/
|
|
85
|
-
async updateCell(spreadsheetId, range, colIndex, rowIndex, values) {
|
|
86
|
-
return this.update(spreadsheetId, range, colIndex, rowIndex, [[values]]);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* 更新某一列
|
|
90
|
-
*/
|
|
91
|
-
async updateColumn(spreadsheetId, range, colIndex, rowIndex, values) {
|
|
92
|
-
return this.update(spreadsheetId, range, colIndex, rowIndex, [
|
|
93
|
-
...values.map((v) => [v])
|
|
94
|
-
]);
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* This method is used to get the titles of all the ranges in a Google Spreadsheet.
|
|
98
|
-
*
|
|
99
|
-
* @async
|
|
100
|
-
* @param {string} spreadsheetId - The ID of the Google Spreadsheet.
|
|
101
|
-
* @returns {Promise<string[]>} - A promise that resolves to an array of titles of all the ranges in the Google Spreadsheet.
|
|
102
|
-
* @throws {Error} - Throws an error if the initialization of the Google Sheets API client fails.
|
|
103
|
-
*/
|
|
104
|
-
async getRangeTitles(spreadsheetId) {
|
|
105
|
-
var _a;
|
|
106
|
-
await this.init();
|
|
107
|
-
const res = await this.sheets.spreadsheets.get({
|
|
108
|
-
spreadsheetId
|
|
109
|
-
});
|
|
110
|
-
const titles = (_a = res.data.sheets) == null ? void 0 : _a.map((v) => {
|
|
111
|
-
var _a2;
|
|
112
|
-
return (_a2 = v.properties) == null ? void 0 : _a2.title;
|
|
113
|
-
}).filter((v) => !!v);
|
|
114
|
-
return titles;
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
var googleSheet = new GoogleSheet();
|
|
118
|
-
|
|
119
|
-
export {
|
|
120
|
-
letterToNumber,
|
|
121
|
-
numberToLetter,
|
|
122
|
-
googleSheet
|
|
123
|
-
};
|
|
124
|
-
//# sourceMappingURL=chunk-6UFZ6KLX.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/letters.ts","../src/shared/google/sheet.ts"],"sourcesContent":["/**\n *\n * - input : A\n * output : 0\n * - input : Z\n * output : 25\n * - input : AA\n * output : 26\n * - input : a\n * output : 0\n */\nexport function letterToNumber(letters: string | number) {\n if (typeof letters === \"number\" || !Number.isNaN(+letters)) {\n return +letters;\n }\n\n let n = 0;\n letters = letters.toUpperCase();\n for (let p = 0; p < letters.length; p++) {\n n = letters[p].charCodeAt(0) - 64 + n * 26;\n }\n\n return Math.max(0, n - 1);\n}\n\n/**\n * fork from https://github.com/matthewmueller/number-to-letter\n */\nconst alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nconst base = alphabet.length;\n/**\n * numberToLetter(0) // A\n * numberToLetter(25) // Z\n * numberToLetter(26) // AA\n * numberToLetter(51) // AZ\n * numberToLetter(52) // BA\n * numberToLetter(676) // ZA\n * numberToLetter(701) // ZZ\n * numberToLetter(702) // AAA\n */\nexport function numberToLetter(n: number) {\n const digits: number[] = [];\n\n do {\n const v = n % base;\n digits.push(v);\n n = Math.floor(n / base);\n } while (n-- > 0);\n\n const chars: string[] = [];\n while (digits.length) {\n chars.push(alphabet[digits.pop()!]);\n }\n\n return chars.join(\"\");\n}\n","import { GaxiosResponse } from \"gaxios\";\nimport type { sheets_v4 } from \"googleapis\";\nimport { google } from \"googleapis\";\nimport { createLogger } from \"../index\";\nimport { numberToLetter } from \"../letters\";\nimport { googleAuth } from \"./auth\";\n\nconst log = createLogger(\"google:sheets\");\n\nclass GoogleSheet {\n private sheets: sheets_v4.Sheets;\n\n private initPromise: Promise<void> | null = null;\n private async initImpl() {\n if (!this.sheets) {\n await googleAuth.initCredentials();\n this.sheets = google.sheets({\n version: \"v4\",\n auth: googleAuth.oauth2Client,\n });\n }\n }\n /**\n * 调用 sheets 其他方法的时候需要先初始化\n */\n async init() {\n if (!this.initPromise) {\n this.initPromise = this.initImpl();\n }\n await this.initPromise;\n }\n\n get = async (options: sheets_v4.Params$Resource$Spreadsheets$Values$Get) => {\n await this.init();\n return this.sheets.spreadsheets.values.get(options);\n };\n\n private async update(\n spreadsheetId: string,\n range: string,\n colIndex: number,\n rowIndex: number,\n values: string[][],\n ): Promise<GaxiosResponse<sheets_v4.Schema$UpdateValuesResponse>> {\n await this.init();\n\n const colLetter = numberToLetter(colIndex);\n const sheetNeedRange = `${range}!${colLetter}${rowIndex}`;\n\n const res = await this.sheets.spreadsheets.values.update({\n spreadsheetId,\n range: sheetNeedRange,\n valueInputOption: \"USER_ENTERED\",\n requestBody: { values },\n });\n\n if (res.status === 200) {\n log.info(`更新 ${sheetNeedRange} 的值成功`);\n } else {\n log.error(\"some thing wrong\", res);\n }\n return res;\n }\n\n /**\n * 更新某一个单元格\n */\n async updateCell(\n spreadsheetId: string,\n range: string,\n colIndex: number,\n rowIndex: number,\n values: string,\n ) {\n return this.update(spreadsheetId, range, colIndex, rowIndex, [[values]]);\n }\n\n /**\n * 更新某一列\n */\n async updateColumn(\n spreadsheetId: string,\n range: string,\n colIndex: number,\n rowIndex: number,\n values: string[],\n ) {\n return this.update(spreadsheetId, range, colIndex, rowIndex, [\n ...values.map((v) => [v]),\n ]);\n }\n /**\n * This method is used to get the titles of all the ranges in a Google Spreadsheet.\n *\n * @async\n * @param {string} spreadsheetId - The ID of the Google Spreadsheet.\n * @returns {Promise<string[]>} - A promise that resolves to an array of titles of all the ranges in the Google Spreadsheet.\n * @throws {Error} - Throws an error if the initialization of the Google Sheets API client fails.\n */\n async getRangeTitles(spreadsheetId: string) {\n // Initialize the Google Sheets API client\n await this.init();\n // Get the details of the Google Spreadsheet\n const res = await this.sheets.spreadsheets.get({\n spreadsheetId,\n });\n // Extract the titles of all the ranges in the Google Spreadsheet\n const titles = res.data.sheets\n ?.map((v) => v.properties?.title)\n .filter((v): v is string => !!v);\n\n return titles;\n }\n}\n\nexport const googleSheet = new GoogleSheet();\n"],"mappings":"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","names":["_a"]}
|
package/dist/chunk-ADQ6JLT6.js
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createLogger
|
|
3
|
-
} from "./chunk-UGSBKD2I.js";
|
|
4
|
-
|
|
5
|
-
// src/shared/sleep.ts
|
|
6
|
-
function sleep(ms) {
|
|
7
|
-
return new Promise((resolve) => {
|
|
8
|
-
setTimeout(resolve, ms);
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// src/shared/i18nData.ts
|
|
13
|
-
import Table from "cli-table3";
|
|
14
|
-
import fs from "fs-extra";
|
|
15
|
-
import pMap from "p-map";
|
|
16
|
-
import path from "path";
|
|
17
|
-
import pc from "picocolors";
|
|
18
|
-
var log = createLogger("i18nData");
|
|
19
|
-
var I18nData = class {
|
|
20
|
-
constructor(locale, config, shouldDeleteUnused = false) {
|
|
21
|
-
this.locale = locale;
|
|
22
|
-
this.config = config;
|
|
23
|
-
this.shouldDeleteUnused = shouldDeleteUnused;
|
|
24
|
-
this.data = {};
|
|
25
|
-
// 没有被使用到的翻译key
|
|
26
|
-
this.unUsedKeys = /* @__PURE__ */ new Set();
|
|
27
|
-
this.isDefaultLocale = locale === config.defaultLocale;
|
|
28
|
-
this.filePath = path.join(
|
|
29
|
-
config.cwd,
|
|
30
|
-
config.i18nDir,
|
|
31
|
-
config.i18nFileName.replace("{locale}", locale)
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
async loadData() {
|
|
35
|
-
try {
|
|
36
|
-
if (await fs.pathExists(this.filePath)) {
|
|
37
|
-
this.data = await fs.readJSON(this.filePath);
|
|
38
|
-
} else {
|
|
39
|
-
log.info("File '%s' does not exist", pc.dim(this.filePath));
|
|
40
|
-
}
|
|
41
|
-
} catch (e) {
|
|
42
|
-
log.error(
|
|
43
|
-
"Error loading i18n data for locale '%s' from file '%s'",
|
|
44
|
-
pc.yellow(this.locale),
|
|
45
|
-
pc.yellow(this.filePath)
|
|
46
|
-
);
|
|
47
|
-
log.error("Error: %s", e.message);
|
|
48
|
-
}
|
|
49
|
-
return this.data;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* @param {ExtractedMap} extractedData 提取出来的内容
|
|
53
|
-
*/
|
|
54
|
-
async updateByExtractedData(extractedData) {
|
|
55
|
-
const oldData = await this.loadData();
|
|
56
|
-
let newData = {};
|
|
57
|
-
extractedData.forEach((value, key) => {
|
|
58
|
-
let newValue = oldData[key] || "";
|
|
59
|
-
if (this.isDefaultLocale) {
|
|
60
|
-
newValue = newValue || value.messages || key;
|
|
61
|
-
newValue = this.normalizeNamespacedDefaultLocaleData(newValue);
|
|
62
|
-
}
|
|
63
|
-
newData[key] = newValue;
|
|
64
|
-
});
|
|
65
|
-
if (!this.shouldDeleteUnused) {
|
|
66
|
-
newData = { ...oldData, ...newData };
|
|
67
|
-
}
|
|
68
|
-
this.data = newData;
|
|
69
|
-
Object.keys(oldData).forEach((key) => {
|
|
70
|
-
if (!extractedData.has(key)) {
|
|
71
|
-
this.unUsedKeys.add(key);
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* 如果是默认语言,开启了 namespace的话
|
|
77
|
-
* 提取出来的 文案 是 `模块名.文案` 的形式
|
|
78
|
-
* 在这里需要把 `模块名.` 去掉
|
|
79
|
-
*/
|
|
80
|
-
normalizeNamespacedDefaultLocaleData(v) {
|
|
81
|
-
if (!this.namespaceReg && this.config.namespace) {
|
|
82
|
-
const names = Object.keys(this.config.namespace).join("|");
|
|
83
|
-
const separator = this.config.namespaceSeparator;
|
|
84
|
-
this.namespaceReg = new RegExp(`^(${names})\\${separator}`);
|
|
85
|
-
}
|
|
86
|
-
if (this.namespaceReg) {
|
|
87
|
-
return v.replace(this.namespaceReg, "");
|
|
88
|
-
}
|
|
89
|
-
return v;
|
|
90
|
-
}
|
|
91
|
-
async updateFromSheetData(sheetData) {
|
|
92
|
-
await this.loadData();
|
|
93
|
-
this.data = { ...this.data, ...sheetData };
|
|
94
|
-
}
|
|
95
|
-
sortData() {
|
|
96
|
-
this.data = this.config.jsonSorter(this.data);
|
|
97
|
-
}
|
|
98
|
-
async saveToDisk() {
|
|
99
|
-
this.sortData();
|
|
100
|
-
log.info(
|
|
101
|
-
"Saving i18n data for locale '%s' to file '%s'",
|
|
102
|
-
pc.green(this.locale),
|
|
103
|
-
pc.dim(this.filePath)
|
|
104
|
-
);
|
|
105
|
-
try {
|
|
106
|
-
await fs.ensureFile(this.filePath);
|
|
107
|
-
await fs.writeJson(this.filePath, this.data, { spaces: 2 });
|
|
108
|
-
log.info(
|
|
109
|
-
"Saved i18n data for locale '%s' to file '%s'",
|
|
110
|
-
pc.green(this.locale),
|
|
111
|
-
pc.dim(this.filePath)
|
|
112
|
-
);
|
|
113
|
-
} catch (e) {
|
|
114
|
-
log.error(
|
|
115
|
-
"Error saving i18n data for locale '%s' to file '%s'",
|
|
116
|
-
pc.green(this.locale),
|
|
117
|
-
pc.dim(this.filePath)
|
|
118
|
-
);
|
|
119
|
-
log.error("Error: %s", pc.red(e.message));
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
async trySaveToGoogle(sheetData) {
|
|
123
|
-
await pMap(
|
|
124
|
-
Object.entries(this.data),
|
|
125
|
-
async ([key, value]) => {
|
|
126
|
-
var _a;
|
|
127
|
-
if (sheetData.hasI18nItem(this.locale, key)) {
|
|
128
|
-
await ((_a = sheetData.getI18nItem(this.locale, key)) == null ? void 0 : _a.tryUpdate(value));
|
|
129
|
-
await sleep(1e3);
|
|
130
|
-
} else {
|
|
131
|
-
log.error(
|
|
132
|
-
"%s range %s not found key %s",
|
|
133
|
-
pc.bold(this.config.sheetRange),
|
|
134
|
-
pc.bold(this.locale),
|
|
135
|
-
pc.bold(key)
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
},
|
|
139
|
-
{ concurrency: 50 }
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
statistic() {
|
|
143
|
-
const total = Object.keys(this.data).length;
|
|
144
|
-
const missing = Object.values(this.data).filter((v) => !v).length;
|
|
145
|
-
return {
|
|
146
|
-
locale: this.locale,
|
|
147
|
-
total,
|
|
148
|
-
missing
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
static printStatistic(label, i18nDataArr) {
|
|
152
|
-
const unUsedKeys = i18nDataArr.reduce((keys, item) => {
|
|
153
|
-
return new Set(item.unUsedKeys);
|
|
154
|
-
}, /* @__PURE__ */ new Set());
|
|
155
|
-
if (unUsedKeys.size) {
|
|
156
|
-
console.log(
|
|
157
|
-
pc.bold(
|
|
158
|
-
`\u5171\u6709 ${pc.green(
|
|
159
|
-
unUsedKeys.size
|
|
160
|
-
)} \u4E2A key \u672A\u5728\u4EE3\u7801\u4E2D\u4F7F\u7528\uFF0C\u4EE5\u4E0B\u662F\u5177\u4F53\u7684 key`
|
|
161
|
-
)
|
|
162
|
-
);
|
|
163
|
-
console.log(
|
|
164
|
-
pc.red(
|
|
165
|
-
"\u6CE8\u610F\uFF1A\u8FD9\u4E9Bkey\u53EF\u80FD\u662F\u5DF2\u7ECF\u5220\u9664\u7684\u4EE3\u7801\uFF0C\u4E5F\u53EF\u80FD\u662F\u901A\u8FC7 `t.ignoreExtract` \u8C03\u7528\u5FFD\u7565\u4E86\u63D0\u53D6 \u5E76\u4E0D\u4E00\u5B9A\u662F\u5197\u4F59\u7684 key"
|
|
166
|
-
)
|
|
167
|
-
);
|
|
168
|
-
console.table(unUsedKeys);
|
|
169
|
-
}
|
|
170
|
-
const table = new Table({
|
|
171
|
-
head: ["Language", "Total count", "Missing"],
|
|
172
|
-
colAligns: ["left", "center", "center"],
|
|
173
|
-
style: {
|
|
174
|
-
head: ["green"],
|
|
175
|
-
border: [],
|
|
176
|
-
compact: true
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
i18nDataArr.forEach((i18nData) => {
|
|
180
|
-
const statistic = i18nData.statistic();
|
|
181
|
-
table.push([
|
|
182
|
-
statistic.locale,
|
|
183
|
-
statistic.total,
|
|
184
|
-
statistic.missing > 0 ? pc.red(statistic.missing) : statistic.missing
|
|
185
|
-
]);
|
|
186
|
-
});
|
|
187
|
-
console.log(pc.bold(label));
|
|
188
|
-
console.log(table.toString());
|
|
189
|
-
}
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
export {
|
|
193
|
-
sleep,
|
|
194
|
-
I18nData
|
|
195
|
-
};
|
|
196
|
-
//# sourceMappingURL=chunk-ADQ6JLT6.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/sleep.ts","../src/shared/i18nData.ts"],"sourcesContent":["export function sleep(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","import Table from \"cli-table3\";\nimport fs from \"fs-extra\";\nimport pMap from \"p-map\";\nimport path from \"path\";\nimport pc from \"picocolors\";\nimport { I18nConfig } from \"./config\";\nimport { createLogger } from \"./index\";\nimport { SheetData } from \"./resolveSheetData\";\nimport { sleep } from \"./sleep\";\n\nconst log = createLogger(\"i18nData\");\nexport type ExtractedMap = Map<\n string,\n { id: string; messages: string; files: string[] }\n>;\n\nexport class I18nData {\n data: Record<string, string> = {};\n\n filePath: string;\n\n /**\n * 是否是默认语言,默认语言需要使用提出来的文案作为value\n */\n isDefaultLocale: boolean;\n // 没有被使用到的翻译key\n unUsedKeys: Set<string> = new Set();\n constructor(\n public locale: string,\n public config: I18nConfig,\n // 是否需要删除未使用的文案\n public shouldDeleteUnused = false\n ) {\n this.isDefaultLocale = locale === config.defaultLocale;\n this.filePath = path.join(\n config.cwd!,\n config.i18nDir!,\n config.i18nFileName!.replace(\"{locale}\", locale)\n );\n }\n\n async loadData() {\n try {\n if (await fs.pathExists(this.filePath)) {\n this.data = await fs.readJSON(this.filePath);\n } else {\n log.info(\"File '%s' does not exist\", pc.dim(this.filePath));\n }\n } catch (e) {\n log.error(\n \"Error loading i18n data for locale '%s' from file '%s'\",\n pc.yellow(this.locale),\n pc.yellow(this.filePath)\n );\n log.error(\"Error: %s\", e.message);\n }\n return this.data;\n }\n\n /**\n * @param {ExtractedMap} extractedData 提取出来的内容\n */\n async updateByExtractedData(extractedData: ExtractedMap) {\n const oldData = await this.loadData();\n let newData = {};\n extractedData.forEach((value, key) => {\n let newValue = oldData[key] || \"\";\n if (this.isDefaultLocale) {\n // 默认语言需要回退到key作为value\n newValue = newValue || value.messages || key;\n //#region 对namespace的支持\n newValue = this.normalizeNamespacedDefaultLocaleData(newValue);\n //#endregion\n }\n newData[key] = newValue;\n });\n if (!this.shouldDeleteUnused) {\n // 不删除未使用的文案,则需要合并旧数据\n newData = { ...oldData, ...newData };\n }\n this.data = newData;\n\n // 记录下来未被使用的key,后面需要打印出来提示用户\n Object.keys(oldData).forEach((key) => {\n if (!extractedData.has(key)) {\n this.unUsedKeys.add(key);\n }\n });\n }\n\n private namespaceReg: RegExp;\n /**\n * 如果是默认语言,开启了 namespace的话\n * 提取出来的 文案 是 `模块名.文案` 的形式\n * 在这里需要把 `模块名.` 去掉\n */\n private normalizeNamespacedDefaultLocaleData(v: string) {\n if (!this.namespaceReg && this.config.namespace) {\n const names = Object.keys(this.config.namespace).join(\"|\");\n const separator = this.config.namespaceSeparator;\n this.namespaceReg = new RegExp(`^(${names})\\\\${separator}`);\n }\n if (this.namespaceReg) {\n return v.replace(this.namespaceReg, \"\");\n }\n return v;\n }\n\n async updateFromSheetData(sheetData: Record<string, string>) {\n await this.loadData();\n this.data = { ...this.data, ...sheetData };\n }\n\n private sortData() {\n //region 语言key按一定规则排序\n this.data = this.config.jsonSorter!(this.data);\n //endregion\n }\n\n async saveToDisk() {\n this.sortData();\n log.info(\n \"Saving i18n data for locale '%s' to file '%s'\",\n pc.green(this.locale),\n pc.dim(this.filePath)\n );\n try {\n await fs.ensureFile(this.filePath);\n await fs.writeJson(this.filePath, this.data, { spaces: 2 });\n log.info(\n \"Saved i18n data for locale '%s' to file '%s'\",\n pc.green(this.locale),\n pc.dim(this.filePath)\n );\n } catch (e) {\n log.error(\n \"Error saving i18n data for locale '%s' to file '%s'\",\n pc.green(this.locale),\n pc.dim(this.filePath)\n );\n log.error(\"Error: %s\", pc.red(e.message));\n }\n }\n\n async trySaveToGoogle(sheetData: SheetData) {\n await pMap(\n Object.entries(this.data),\n async ([key, value]) => {\n if (sheetData.hasI18nItem(this.locale, key)) {\n // 更新已有的\n await sheetData.getI18nItem(this.locale, key)?.tryUpdate(value);\n // 避免频繁请求,Google sheet api 默认限制\n // • 每秒钟读操作数:100 请求/秒\n // • 每秒钟单元格写操作数:100 请求/秒\n await sleep(1000);\n } else {\n log.error(\n \"%s range %s not found key %s\",\n pc.bold(this.config.sheetRange),\n pc.bold(this.locale),\n pc.bold(key)\n );\n }\n },\n { concurrency: 50 }\n );\n }\n private statistic() {\n const total = Object.keys(this.data).length;\n const missing = Object.values(this.data).filter((v) => !v).length;\n\n return {\n locale: this.locale,\n total,\n missing,\n };\n }\n static printStatistic(label: string, i18nDataArr: I18nData[]) {\n // 首先打印 unUsedKeys\n const unUsedKeys = i18nDataArr.reduce((keys, item) => {\n return new Set(item.unUsedKeys);\n }, new Set<string>());\n if (unUsedKeys.size) {\n console.log(\n pc.bold(\n `共有 ${pc.green(\n unUsedKeys.size\n )} 个 key 未在代码中使用,以下是具体的 key`\n )\n );\n console.log(\n pc.red(\n \"注意:这些key可能是已经删除的代码,也可能是通过 `t.ignoreExtract` 调用忽略了提取 并不一定是冗余的 key\"\n )\n );\n console.table(unUsedKeys);\n }\n // 打印提取出来的翻译文案统计\n const table = new Table({\n head: [\"Language\", \"Total count\", \"Missing\"],\n colAligns: [\"left\", \"center\", \"center\"],\n style: {\n head: [\"green\"],\n border: [],\n compact: true,\n },\n });\n\n i18nDataArr.forEach((i18nData) => {\n const statistic = i18nData.statistic();\n table.push([\n statistic.locale,\n statistic.total,\n statistic.missing > 0 ? pc.red(statistic.missing) : statistic.missing,\n ]);\n });\n console.log(pc.bold(label));\n console.log(table.toString());\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-IKJLPHF7.js
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
googleSheet,
|
|
3
|
-
letterToNumber
|
|
4
|
-
} from "./chunk-6UFZ6KLX.js";
|
|
5
|
-
import {
|
|
6
|
-
createLogger
|
|
7
|
-
} from "./chunk-UGSBKD2I.js";
|
|
8
|
-
|
|
9
|
-
// src/shared/resolveSheetData.ts
|
|
10
|
-
var log = createLogger("shared:resolveSheetData");
|
|
11
|
-
var SheetI18nItem = class {
|
|
12
|
-
constructor(spreadsheetId, range, key, colIndex, row, rowIndex) {
|
|
13
|
-
this.spreadsheetId = spreadsheetId;
|
|
14
|
-
this.range = range;
|
|
15
|
-
this.key = key;
|
|
16
|
-
this.row = row;
|
|
17
|
-
this.rowIndex = rowIndex;
|
|
18
|
-
this.colIndex = letterToNumber(colIndex);
|
|
19
|
-
this.value = this.row[this.colIndex] || "";
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* 尝试更新 单元格的值
|
|
23
|
-
* 如果一样则不更新
|
|
24
|
-
*/
|
|
25
|
-
async tryUpdate(newValue) {
|
|
26
|
-
if (newValue === this.value) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
await googleSheet.updateCell(
|
|
30
|
-
this.spreadsheetId,
|
|
31
|
-
this.range,
|
|
32
|
-
this.colIndex,
|
|
33
|
-
this.rowIndex,
|
|
34
|
-
newValue
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
async function resolveSheetData(config) {
|
|
39
|
-
const { position } = config;
|
|
40
|
-
const parseStartIndex = config.parseStartIndex ?? 2;
|
|
41
|
-
log.info(`\u8BFB\u53D6 ${config.sheetRange} sheet\u6570\u636E`);
|
|
42
|
-
const res = await googleSheet.get({
|
|
43
|
-
spreadsheetId: config.sheetId,
|
|
44
|
-
range: config.sheetRange
|
|
45
|
-
});
|
|
46
|
-
if (!res.data.values) {
|
|
47
|
-
log.error(
|
|
48
|
-
`${config.sheetRange} sheet\u6570\u636E\u4E3A\u7A7A\uFF0C\u8BF7\u68C0\u67E5\uFF0C\u5E94\u8BE5\u6700\u5C11\u6709\u4E00\u884C\u5934\u90E8\u6570\u636E`
|
|
49
|
-
);
|
|
50
|
-
return new SheetData(config, 2);
|
|
51
|
-
}
|
|
52
|
-
const sheetData = new SheetData(config, res.data.values.length + 1);
|
|
53
|
-
res.data.values.forEach((row, rowIndex) => {
|
|
54
|
-
var _a;
|
|
55
|
-
const trulyRowIndex = rowIndex + 1;
|
|
56
|
-
if (parseStartIndex > trulyRowIndex) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
const i18nKey = row[letterToNumber(position.key)];
|
|
60
|
-
if (i18nKey) {
|
|
61
|
-
if (sheetData.keySet.has(i18nKey)) {
|
|
62
|
-
log.error(
|
|
63
|
-
`\u8868\u683C ${config.sheetRange} \u53D1\u73B0\u91CD\u590D\u7684i18nKey: ${i18nKey}, \u5C06\u8986\u76D6\u524D\u9762\u7684\u503C`
|
|
64
|
-
);
|
|
65
|
-
} else {
|
|
66
|
-
sheetData.keySet.add(i18nKey);
|
|
67
|
-
}
|
|
68
|
-
(_a = config.locales) == null ? void 0 : _a.forEach((lang) => {
|
|
69
|
-
sheetData.setI18nItem(
|
|
70
|
-
lang,
|
|
71
|
-
new SheetI18nItem(
|
|
72
|
-
config.sheetId,
|
|
73
|
-
config.sheetRange,
|
|
74
|
-
i18nKey,
|
|
75
|
-
position[lang],
|
|
76
|
-
row,
|
|
77
|
-
trulyRowIndex
|
|
78
|
-
)
|
|
79
|
-
);
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
return sheetData;
|
|
84
|
-
}
|
|
85
|
-
var SheetData = class {
|
|
86
|
-
constructor(config, nextAppendRowIndex) {
|
|
87
|
-
this.config = config;
|
|
88
|
-
this.nextAppendRowIndex = nextAppendRowIndex;
|
|
89
|
-
this.keySet = /* @__PURE__ */ new Set();
|
|
90
|
-
this.value = new Map(
|
|
91
|
-
this.config.locales.map((lang) => {
|
|
92
|
-
return [lang, /* @__PURE__ */ new Map()];
|
|
93
|
-
})
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
getI18nItem(lang, i18nKey) {
|
|
97
|
-
return this.value.get(lang).get(i18nKey);
|
|
98
|
-
}
|
|
99
|
-
setI18nItem(lang, i18nItem) {
|
|
100
|
-
this.value.get(lang).set(i18nItem.key, i18nItem);
|
|
101
|
-
}
|
|
102
|
-
hasI18nItem(lang, i18nKey) {
|
|
103
|
-
return this.value.get(lang).has(i18nKey);
|
|
104
|
-
}
|
|
105
|
-
getLangDataJSON(lang) {
|
|
106
|
-
const res = {};
|
|
107
|
-
this.value.get(lang).forEach((i18nItem) => {
|
|
108
|
-
res[i18nItem.key] = i18nItem.value;
|
|
109
|
-
});
|
|
110
|
-
return res;
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
export {
|
|
115
|
-
resolveSheetData
|
|
116
|
-
};
|
|
117
|
-
//# sourceMappingURL=chunk-IKJLPHF7.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/resolveSheetData.ts"],"sourcesContent":["import { I18nConfig } from \"./config\";\nimport { googleSheet } from \"./google/sheet\";\nimport { createLogger } from \"./index\";\nimport { letterToNumber } from \"./letters\";\n\nconst log = createLogger(\"shared:resolveSheetData\");\n\nclass SheetI18nItem {\n value: string;\n\n colIndex: number;\n\n constructor(\n private spreadsheetId: string,\n private range: string,\n public key: string,\n colIndex: number | string,\n public row: string[],\n private rowIndex: number\n ) {\n this.colIndex = letterToNumber(colIndex);\n // TODO: 待确定 无值的key是否要生成\n // value = undefined 即不会生成\n this.value = this.row[this.colIndex] || \"\";\n }\n\n /**\n * 尝试更新 单元格的值\n * 如果一样则不更新\n */\n async tryUpdate(newValue: string) {\n if (newValue === this.value) {\n // 云端的值跟本地一样 不需要同步\n return;\n }\n\n await googleSheet.updateCell(\n this.spreadsheetId,\n this.range,\n this.colIndex,\n this.rowIndex,\n newValue\n );\n }\n}\n\nexport async function resolveSheetData(config: I18nConfig): Promise<SheetData> {\n const { position } = config;\n const parseStartIndex = config.parseStartIndex ?? 2;\n\n log.info(`读取 ${config.sheetRange} sheet数据`);\n\n const res = await googleSheet.get({\n spreadsheetId: config.sheetId,\n range: config.sheetRange,\n });\n if (!res.data.values) {\n log.error(\n `${config.sheetRange} sheet数据为空,请检查,应该最少有一行头部数据`\n );\n return new SheetData(config, 2);\n }\n\n const sheetData = new SheetData(config, res.data.values.length + 1);\n\n res.data.values.forEach((row: string[], rowIndex) => {\n // excel 的开始索引是1,所以要 +1\n const trulyRowIndex = rowIndex + 1;\n if (parseStartIndex > trulyRowIndex) {\n // 还未到可以开始解析的行数\n return;\n }\n\n const i18nKey = row[letterToNumber(position!.key)];\n\n if (i18nKey) {\n if (sheetData.keySet.has(i18nKey)) {\n log.error(\n `表格 ${config.sheetRange} 发现重复的i18nKey: ${i18nKey}, 将覆盖前面的值`\n );\n } else {\n sheetData.keySet.add(i18nKey);\n }\n\n config.locales?.forEach((lang) => {\n sheetData.setI18nItem(\n lang,\n new SheetI18nItem(\n config.sheetId!,\n config.sheetRange!,\n i18nKey,\n position![lang],\n row,\n trulyRowIndex\n )\n );\n });\n }\n });\n\n return sheetData;\n}\n\nexport class SheetData {\n keySet = new Set<string>();\n\n constructor(\n private config: I18nConfig,\n // 当前有多少行 新增的时候往后面添加\n public nextAppendRowIndex: number\n ) {}\n\n private value = new Map(\n this.config.locales!.map((lang) => {\n return [lang, new Map<string, SheetI18nItem>()];\n })\n );\n\n getI18nItem(lang: string, i18nKey: string) {\n return this.value.get(lang)!.get(i18nKey);\n }\n\n setI18nItem(lang: string, i18nItem: SheetI18nItem) {\n this.value.get(lang)!.set(i18nItem.key, i18nItem);\n }\n\n hasI18nItem(lang: string, i18nKey: string) {\n return this.value.get(lang)!.has(i18nKey);\n }\n\n getLangDataJSON(lang: string) {\n const res = {} as Record<string, string>;\n this.value.get(lang)!.forEach((i18nItem) => {\n res[i18nItem.key] = i18nItem.value;\n });\n return res;\n }\n}\n"],"mappings":";;;;;;;;;AAKA,IAAM,MAAM,aAAa,yBAAyB;AAElD,IAAM,gBAAN,MAAoB;AAAA,EAKlB,YACU,eACA,OACD,KACP,UACO,KACC,UACR;AANQ;AACA;AACD;AAEA;AACC;AAER,SAAK,WAAW,eAAe,QAAQ;AAGvC,SAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,UAAkB;AAChC,QAAI,aAAa,KAAK,OAAO;AAE3B;AAAA,IACF;AAEA,UAAM,YAAY;AAAA,MAChB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,iBAAiB,QAAwC;AAC7E,QAAM,EAAE,SAAS,IAAI;AACrB,QAAM,kBAAkB,OAAO,mBAAmB;AAElD,MAAI,KAAK,gBAAM,OAAO,UAAU,oBAAU;AAE1C,QAAM,MAAM,MAAM,YAAY,IAAI;AAAA,IAChC,eAAe,OAAO;AAAA,IACtB,OAAO,OAAO;AAAA,EAChB,CAAC;AACD,MAAI,CAAC,IAAI,KAAK,QAAQ;AACpB,QAAI;AAAA,MACF,GAAG,OAAO,UAAU;AAAA,IACtB;AACA,WAAO,IAAI,UAAU,QAAQ,CAAC;AAAA,EAChC;AAEA,QAAM,YAAY,IAAI,UAAU,QAAQ,IAAI,KAAK,OAAO,SAAS,CAAC;AAElE,MAAI,KAAK,OAAO,QAAQ,CAAC,KAAe,aAAa;AAjEvD;AAmEI,UAAM,gBAAgB,WAAW;AACjC,QAAI,kBAAkB,eAAe;AAEnC;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,eAAe,SAAU,GAAG,CAAC;AAEjD,QAAI,SAAS;AACX,UAAI,UAAU,OAAO,IAAI,OAAO,GAAG;AACjC,YAAI;AAAA,UACF,gBAAM,OAAO,UAAU,2CAAkB,OAAO;AAAA,QAClD;AAAA,MACF,OAAO;AACL,kBAAU,OAAO,IAAI,OAAO;AAAA,MAC9B;AAEA,mBAAO,YAAP,mBAAgB,QAAQ,CAAC,SAAS;AAChC,kBAAU;AAAA,UACR;AAAA,UACA,IAAI;AAAA,YACF,OAAO;AAAA,YACP,OAAO;AAAA,YACP;AAAA,YACA,SAAU,IAAI;AAAA,YACd;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,IAAM,YAAN,MAAgB;AAAA,EAGrB,YACU,QAED,oBACP;AAHQ;AAED;AALT,kBAAS,oBAAI,IAAY;AAQzB,SAAQ,QAAQ,IAAI;AAAA,MAClB,KAAK,OAAO,QAAS,IAAI,CAAC,SAAS;AACjC,eAAO,CAAC,MAAM,oBAAI,IAA2B,CAAC;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EANG;AAAA,EAQH,YAAY,MAAc,SAAiB;AACzC,WAAO,KAAK,MAAM,IAAI,IAAI,EAAG,IAAI,OAAO;AAAA,EAC1C;AAAA,EAEA,YAAY,MAAc,UAAyB;AACjD,SAAK,MAAM,IAAI,IAAI,EAAG,IAAI,SAAS,KAAK,QAAQ;AAAA,EAClD;AAAA,EAEA,YAAY,MAAc,SAAiB;AACzC,WAAO,KAAK,MAAM,IAAI,IAAI,EAAG,IAAI,OAAO;AAAA,EAC1C;AAAA,EAEA,gBAAgB,MAAc;AAC5B,UAAM,MAAM,CAAC;AACb,SAAK,MAAM,IAAI,IAAI,EAAG,QAAQ,CAAC,aAAa;AAC1C,UAAI,SAAS,GAAG,IAAI,SAAS;AAAA,IAC/B,CAAC;AACD,WAAO;AAAA,EACT;AACF;","names":[]}
|