@dune2/cli 0.4.13 → 0.5.1

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.
Files changed (41) hide show
  1. package/dist/auth-777GVVSS.js +8 -0
  2. package/dist/auth-777GVVSS.js.map +1 -0
  3. package/dist/chunk-2SEEW5WZ.js +67 -0
  4. package/dist/chunk-2SEEW5WZ.js.map +1 -0
  5. package/dist/chunk-6UFZ6KLX.js +124 -0
  6. package/dist/chunk-6UFZ6KLX.js.map +1 -0
  7. package/dist/chunk-ADQ6JLT6.js +196 -0
  8. package/dist/chunk-ADQ6JLT6.js.map +1 -0
  9. package/dist/chunk-BSWWGPSV.js +60 -0
  10. package/dist/chunk-BSWWGPSV.js.map +1 -0
  11. package/dist/chunk-IKJLPHF7.js +117 -0
  12. package/dist/chunk-IKJLPHF7.js.map +1 -0
  13. package/dist/chunk-KNC7XY4Z.js +130 -0
  14. package/dist/chunk-KNC7XY4Z.js.map +1 -0
  15. package/dist/chunk-Q7UJ456X.js +24 -0
  16. package/dist/chunk-Q7UJ456X.js.map +1 -0
  17. package/dist/chunk-SVCF6X5K.js +22 -0
  18. package/dist/chunk-SVCF6X5K.js.map +1 -0
  19. package/dist/cli.js +58 -837
  20. package/dist/cli.js.map +1 -1
  21. package/dist/download-NS56QNEI.js +49 -0
  22. package/dist/download-NS56QNEI.js.map +1 -0
  23. package/dist/downloadFromPlatform-6ZUZTZAX.js +11 -0
  24. package/dist/downloadFromPlatform-6ZUZTZAX.js.map +1 -0
  25. package/dist/extract-7YVZJT6N.js +116 -0
  26. package/dist/extract-7YVZJT6N.js.map +1 -0
  27. package/dist/generateApi-TMEDGY2V.js +272 -0
  28. package/dist/generateApi-TMEDGY2V.js.map +1 -0
  29. package/dist/index.d.ts +1 -1
  30. package/dist/index.js +11 -5
  31. package/dist/initConfig-DHDY6MWT.js +36 -0
  32. package/dist/initConfig-DHDY6MWT.js.map +1 -0
  33. package/dist/interactive-HNOHT33A.js +43 -0
  34. package/dist/interactive-HNOHT33A.js.map +1 -0
  35. package/dist/namespace-IDUS7AMO.js +137 -0
  36. package/dist/namespace-IDUS7AMO.js.map +1 -0
  37. package/dist/upload-WCPUDBKZ.js +92 -0
  38. package/dist/upload-WCPUDBKZ.js.map +1 -0
  39. package/package.json +1 -1
  40. package/dist/chunk-B2TLAH5N.js +0 -491
  41. package/dist/chunk-B2TLAH5N.js.map +0 -1
package/dist/cli.js CHANGED
@@ -1,851 +1,72 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- I18nData,
4
- configName,
5
- downloadFromPlatform,
6
- getConfig,
7
- googleSheet,
8
- letterToNumber,
9
- sleep
10
- } from "./chunk-B2TLAH5N.js";
11
- import "./chunk-4BXCANQI.js";
12
- import {
13
- cli,
14
- createLogger
3
+ cli
15
4
  } from "./chunk-UGSBKD2I.js";
16
5
 
17
6
  // package.json
18
- var version = "0.4.12";
19
-
20
- // src/commands/download.ts
21
- import pMap from "p-map";
22
-
23
- // src/shared/resolveSheetData.ts
24
- var log = createLogger("shared:resolveSheetData");
25
- var SheetI18nItem = class {
26
- constructor(spreadsheetId, range, key, colIndex, row, rowIndex) {
27
- this.spreadsheetId = spreadsheetId;
28
- this.range = range;
29
- this.key = key;
30
- this.row = row;
31
- this.rowIndex = rowIndex;
32
- this.colIndex = letterToNumber(colIndex);
33
- this.value = this.row[this.colIndex] || "";
34
- }
35
- /**
36
- * 尝试更新 单元格的值
37
- * 如果一样则不更新
38
- */
39
- async tryUpdate(newValue) {
40
- if (newValue === this.value) {
41
- return;
42
- }
43
- await googleSheet.updateCell(
44
- this.spreadsheetId,
45
- this.range,
46
- this.colIndex,
47
- this.rowIndex,
48
- newValue
49
- );
50
- }
51
- };
52
- async function resolveSheetData(config) {
53
- const { position } = config;
54
- const parseStartIndex = config.parseStartIndex ?? 2;
55
- log.info(`\u8BFB\u53D6 ${config.sheetRange} sheet\u6570\u636E`);
56
- const res = await googleSheet.get({
57
- spreadsheetId: config.sheetId,
58
- range: config.sheetRange
59
- });
60
- if (!res.data.values) {
61
- log.error(
62
- `${config.sheetRange} sheet\u6570\u636E\u4E3A\u7A7A\uFF0C\u8BF7\u68C0\u67E5\uFF0C\u5E94\u8BE5\u6700\u5C11\u6709\u4E00\u884C\u5934\u90E8\u6570\u636E`
63
- );
64
- return new SheetData(config, 2);
65
- }
66
- const sheetData = new SheetData(config, res.data.values.length + 1);
67
- res.data.values.forEach((row, rowIndex) => {
68
- var _a;
69
- const trulyRowIndex = rowIndex + 1;
70
- if (parseStartIndex > trulyRowIndex) {
71
- return;
72
- }
73
- const i18nKey = row[letterToNumber(position.key)];
74
- if (i18nKey) {
75
- if (sheetData.keySet.has(i18nKey)) {
76
- log.error(
77
- `\u8868\u683C ${config.sheetRange} \u53D1\u73B0\u91CD\u590D\u7684i18nKey: ${i18nKey}, \u5C06\u8986\u76D6\u524D\u9762\u7684\u503C`
78
- );
79
- } else {
80
- sheetData.keySet.add(i18nKey);
81
- }
82
- (_a = config.locales) == null ? void 0 : _a.forEach((lang) => {
83
- sheetData.setI18nItem(
84
- lang,
85
- new SheetI18nItem(
86
- config.sheetId,
87
- config.sheetRange,
88
- i18nKey,
89
- position[lang],
90
- row,
91
- trulyRowIndex
92
- )
93
- );
94
- });
95
- }
96
- });
97
- return sheetData;
98
- }
99
- var SheetData = class {
100
- constructor(config, nextAppendRowIndex) {
101
- this.config = config;
102
- this.nextAppendRowIndex = nextAppendRowIndex;
103
- this.keySet = /* @__PURE__ */ new Set();
104
- this.value = new Map(
105
- this.config.locales.map((lang) => {
106
- return [lang, /* @__PURE__ */ new Map()];
107
- })
108
- );
109
- }
110
- getI18nItem(lang, i18nKey) {
111
- return this.value.get(lang).get(i18nKey);
112
- }
113
- setI18nItem(lang, i18nItem) {
114
- this.value.get(lang).set(i18nItem.key, i18nItem);
115
- }
116
- hasI18nItem(lang, i18nKey) {
117
- return this.value.get(lang).has(i18nKey);
118
- }
119
- getLangDataJSON(lang) {
120
- const res = {};
121
- this.value.get(lang).forEach((i18nItem) => {
122
- res[i18nItem.key] = i18nItem.value;
123
- });
124
- return res;
125
- }
126
- };
127
-
128
- // src/shared/promptConfigEnable.ts
129
- import enquirer from "enquirer";
130
- var { prompt } = enquirer;
131
- async function promptConfigEnable(opt) {
132
- const { configArr, getChoiceItem } = opt;
133
- if (configArr.length <= 1) {
134
- return configArr;
135
- }
136
- const choices = [
137
- {
138
- name: "\u5168\u90E8",
139
- message: "\u5168\u90E8",
140
- choices: configArr.map((item) => {
141
- return getChoiceItem(item);
142
- })
143
- }
144
- ];
145
- const res = await prompt({
146
- type: "multiselect",
147
- message: "\u9009\u62E9\u8981\u751F\u6548\u7684\u914D\u7F6E\u9879",
148
- // @ts-ignore
149
- hint: "(\u7A7A\u683C\u9009\u4E2D\uFF0C\u56DE\u8F66\u786E\u8BA4)",
150
- name: "enabled",
151
- validate(value) {
152
- return value.length === 0 ? `\u81F3\u5C11\u9009\u62E9\u4E00\u9879` : true;
153
- },
154
- choices
155
- });
156
- configArr.forEach((item) => {
157
- item.enabled = opt.checkIsEnabled(res.enabled, item);
158
- });
159
- return configArr.filter((c) => c.enabled);
160
- }
161
- function promptI18nConfigEnable(configArr) {
162
- return promptConfigEnable({
163
- configArr: configArr ?? [],
164
- getChoiceItem: (item) => {
165
- return {
166
- name: item.i18nDir,
167
- hint: `sheetRange: ${item.sheetRange}`
168
- };
169
- },
170
- checkIsEnabled: (enabledArr, item) => {
171
- return enabledArr.includes(item.i18nDir);
172
- }
173
- });
174
- }
175
- function promptApiConfigEnable(configArr) {
176
- return promptConfigEnable({
177
- configArr: configArr ?? [],
178
- getChoiceItem: (item) => {
179
- return {
180
- name: item.output,
181
- hint: `swaggerJSONPath: ${item.swaggerJSONPath}`
182
- };
183
- },
184
- checkIsEnabled: (enabledArr, item) => {
185
- return enabledArr.includes(item.output);
186
- }
187
- });
188
- }
189
-
190
- // src/commands/download.ts
191
- var log2 = createLogger("generate");
192
- async function download() {
193
- const config = await getConfig();
194
- let i18nConfigs = await promptI18nConfigEnable(config.i18n);
195
- let i = 0;
196
- for (const configItem of i18nConfigs) {
197
- i++;
198
- if (!configItem.sheetId || !configItem.sheetRange) {
199
- log2.error(`config.${i} sheetId \u6216 sheetRange \u4E3A\u7A7A\uFF0C\u8BF7\u68C0\u67E5`);
200
- continue;
201
- }
202
- const sheetData = await resolveSheetData(configItem);
203
- const statistics = await pMap(
204
- configItem.locales ?? [],
205
- async (locale, index) => {
206
- const i18nData = new I18nData(locale, configItem);
207
- await i18nData.updateFromSheetData(sheetData.getLangDataJSON(locale));
208
- await i18nData.saveToDisk();
209
- return i18nData;
210
- }
211
- );
212
- I18nData.printStatistic(`${configItem.sheetRange} \u751F\u6210\u7ED3\u679C: `, statistics);
213
- }
214
- }
215
-
216
- // src/commands/extract/index.ts
217
- import fs from "fs-extra";
218
- import { globby } from "globby";
219
- import os from "os";
220
- import pMap2 from "p-map";
221
- import path from "path";
222
- import pc from "picocolors";
223
- var log3 = createLogger("extract");
224
- async function extract(opts) {
225
- var _a;
226
- const config = await getConfig();
227
- const { extract: extract2 } = await import("@dune2/wasm");
228
- let i18nConfigs = await promptI18nConfigEnable(
229
- (_a = config.i18n) == null ? void 0 : _a.filter((item) => !item.disableExtract)
230
- );
231
- for (const configItem of i18nConfigs) {
232
- const files = await globby(
233
- [
234
- `./src/**/**.{js,jsx,ts,tsx}`,
235
- "!**/node_modules/**",
236
- "!**.d.ts",
237
- "!**/.next/**",
238
- "!**/out/**"
239
- ].concat(configItem.include ?? []),
240
- { cwd: configItem.cwd }
241
- );
242
- log3.info("\u9884\u8BA1\u5171\u89E3\u6790 %s \u4E2A\u6587\u4EF6", pc.green(files.length));
243
- let errMsgs = [];
244
- const extractedI18nDataMap = /* @__PURE__ */ new Map();
245
- await pMap2(
246
- files,
247
- async (file) => {
248
- const content = await fs.readFile(file, "utf-8");
249
- const res = await extract2(content, file);
250
- if (res.data.size) {
251
- log3.info(
252
- "\u4ECE %s \u4E2D\u63D0\u53D6\u5230 %s \u6761\u6587\u6848",
253
- pc.dim(file),
254
- pc.green(res.data.size)
255
- );
256
- res.data.forEach((value, key) => {
257
- let cur = extractedI18nDataMap.get(key);
258
- const hasCache = !!cur;
259
- if (!hasCache) {
260
- cur = { ...value, files: [] };
261
- }
262
- cur.files.push(
263
- path.resolve(file) + ":" + value.line + ":" + value.column
264
- );
265
- cur.messages = value.messages || cur.messages;
266
- if (!hasCache) {
267
- extractedI18nDataMap.set(key, cur);
268
- }
269
- });
270
- }
271
- if (res.errMsg) {
272
- errMsgs.push(res.errMsg);
273
- }
274
- },
275
- { concurrency: 20 }
276
- );
277
- await saveExtractedMetaData(configItem, extractedI18nDataMap);
278
- const i18nDataArr = await pMap2(configItem.locales ?? [], async (locale) => {
279
- const i18nData = new I18nData(locale, configItem, opts == null ? void 0 : opts.deleteUnused);
280
- await i18nData.updateByExtractedData(extractedI18nDataMap);
281
- await i18nData.saveToDisk();
282
- return i18nData;
283
- });
284
- if (errMsgs.length) {
285
- console.log(pc.bold("\u4EE5\u4E0B\u672A\u80FD\u6210\u529F\u63D0\u53D6\u7684\u6587\u6848\uFF0C\u8BF7\u624B\u52A8\u5904\u7406\uFF1A"));
286
- console.log(errMsgs.join(os.EOL));
287
- }
288
- I18nData.printStatistic("\u63D0\u53D6\u7ED3\u679C: ", i18nDataArr);
289
- await import("./uploadToTranslatePlatform-GK4VUXIU.js").then(
290
- (mod) => mod.uploadToTranslatePlatform(configItem, i18nDataArr)
291
- );
292
- }
293
- }
294
- async function saveExtractedMetaData(config, extractedI18nDataMap) {
295
- const { i18nDir } = config;
296
- const prefix = i18nDir.replace("./", "").replace(/\//g, "_");
297
- const filename = `${prefix}.extractedLog.json`;
298
- const metaDataJsonPath = path.join(i18nDir, filename);
299
- await fs.ensureFile(metaDataJsonPath);
300
- let data = Array.from(extractedI18nDataMap.entries()).map(
301
- ([key, value]) => value
302
- );
303
- data = data.sort((a, b) => {
304
- return a.id.localeCompare(b.id);
305
- });
306
- await fs.writeJSON(
307
- metaDataJsonPath,
308
- data,
309
- {
310
- spaces: 2
311
- }
312
- );
313
- }
314
-
315
- // src/commands/generateApi/index.ts
316
- import SwaggerParser from "@apidevtools/swagger-parser";
317
- import fs2 from "fs-extra";
318
- import { compile } from "json-schema-to-typescript";
319
- import _ from "lodash";
320
- import * as os2 from "os";
321
- import pMap3 from "p-map";
322
- import path2 from "path";
323
-
324
- // src/shared/formatFile.ts
325
- import * as child_process from "child_process";
326
- var log4 = createLogger("formatFile");
327
- function formatFile(filename) {
328
- log4.info(`\u5C1D\u8BD5\u683C\u5F0F\u5316\u4EE3\u7801: %s`, filename);
329
- child_process.exec(`prettier --write '${filename}'`, (error) => {
330
- if (error) {
331
- log4.error(`\u683C\u5F0F\u5316\u4EE3\u7801\u5931\u8D25: ${error}`);
332
- log4.error(`\u8BF7\u624B\u52A8\u6267\u884C: prettier --write ${filename}`);
333
- log4.error(`\u6216\u8005\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u5173\u95ED\u683C\u5F0F\u5316\u529F\u80FD`);
334
- } else {
335
- log4.info(`\u683C\u5F0F\u5316\u4EE3\u7801\u6210\u529F: %s`, filename);
336
- }
337
- });
338
- }
339
-
340
- // src/commands/generateApi/index.ts
341
- var log5 = createLogger("generateApi");
342
- async function generateApi() {
343
- const config = await getConfig();
344
- const apiConfigs = await promptApiConfigEnable(config.api);
345
- for (const apiConfig of apiConfigs) {
346
- log5.info(`\u6E05\u9664\u65E7\u7684api\u6587\u4EF6: ${apiConfig.output}`);
347
- await fs2.emptydir(apiConfig.output);
348
- }
349
- for (const apiConfig of apiConfigs) {
350
- log5.info("\u5F00\u59CB\u89E3\u6790 %s", apiConfig.swaggerJSONPath);
351
- const parsed = await SwaggerParser.dereference(apiConfig.swaggerJSONPath, {
352
- resolve: {
353
- http: {
354
- timeout: 30 * 1e3
355
- }
356
- }
357
- });
358
- await pMap3(Object.entries(parsed.paths), async ([url, pathItemObject]) => {
359
- log5.info("\u5F00\u59CB\u751F\u6210 %s", url);
360
- if (pathItemObject) {
361
- await pMap3(
362
- ["get", "put", "post", "delete", "patch"],
363
- async (method) => {
364
- const operationObject = pathItemObject[method];
365
- if (operationObject) {
366
- const code = await generateApiRequestCode({
367
- url,
368
- method,
369
- operationObject,
370
- apiConfig
371
- });
372
- const outputPath = path2.join(
373
- apiConfig.output,
374
- url,
375
- apiConfig.enableTs ? `${method}.ts` : `${method}.js`
376
- ).replace(/:/g, "_");
377
- await fs2.ensureFile(outputPath);
378
- await fs2.writeFile(outputPath, code);
379
- }
380
- }
381
- );
382
- }
383
- });
384
- if (apiConfig.format) {
385
- await formatFile(apiConfig.output);
386
- }
387
- }
388
- log5.info("generateApi Done");
389
- }
390
- async function generateApiRequestCode(options) {
391
- var _a, _b;
392
- const { method, operationObject, apiConfig } = options;
393
- const url = (() => {
394
- if (typeof apiConfig.urlTransformer === "string") {
395
- return `${apiConfig.urlTransformer}${options.url}`;
396
- }
397
- if (typeof apiConfig.urlTransformer === "function") {
398
- return apiConfig.urlTransformer(options.url);
399
- }
400
- return options.url;
401
- })();
402
- const seeUrl = apiConfig.swaggerUiUrl ? `${apiConfig.swaggerUiUrl}#/${((_a = operationObject.tags) == null ? void 0 : _a.join("/")) ?? ""}/${operationObject.operationId}` : "";
403
- let requestBuilderName = _.camelCase(`${options.url}_${method}_api`);
404
- if (!/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(requestBuilderName)) {
405
- requestBuilderName = `_${requestBuilderName}`;
406
- }
407
- const urlPathParams = getUrlPathParams(
408
- operationObject.parameters ?? []
409
- );
410
- const urlPathParamsCode = urlPathParams.length ? `urlPathParams: ${JSON.stringify(urlPathParams)},` : "";
411
- let code = [
412
- "// \u8FD9\u4E2A\u6587\u4EF6\u7531 @dune2/cli \u81EA\u52A8\u751F\u6210\uFF0C\u4E0D\u8981\u624B\u52A8\u4FEE\u6539\uFF0C\u5426\u5219\u4F1A\u88AB\u8986\u76D6",
413
- apiConfig.RequestBuilderImportPath,
414
- apiConfig.requestFnImportPath,
415
- apiConfig.queryClientImportPath,
416
- "/**",
417
- ` * ${operationObject.summary}`,
418
- ` * @tags ${(_b = operationObject.tags) == null ? void 0 : _b.join(",")}`,
419
- seeUrl && ` * @see ${seeUrl}`,
420
- ` */`
421
- ].filter(Boolean);
422
- let builderCode = `export const ${requestBuilderName} = new RequestBuilder({
423
- url: '${url}',
424
- method: '${method}',
425
- ${apiConfig.requestFnImportPath ? "requestFn," : ""}
426
- ${urlPathParamsCode}
427
- ${apiConfig.queryClientImportPath ? "queryClient," : ""}
428
- });`.replace(/,\n\s*}/, "," + os2.EOL + "}");
429
- if (apiConfig.enableTs) {
430
- builderCode = builderCode.replace(
431
- "new RequestBuilder(",
432
- `new RequestBuilder<${requestBuilderName}.Req, ${requestBuilderName}.Res>(`
433
- );
434
- }
435
- code.push(builderCode);
436
- if (apiConfig.enableTs) {
437
- const isGenrateFieldsMap = ["post", "put"].includes(method);
438
- const [requestParamsTypeCode, responseParamsTypeCode] = await Promise.all([
439
- compileRequestParams(operationObject, isGenrateFieldsMap),
440
- compileResponseParams(operationObject, apiConfig)
441
- ]);
442
- code.push(`
443
- export namespace ${requestBuilderName} {
444
- ${requestParamsTypeCode.code}
445
-
446
- ${responseParamsTypeCode}
447
- };`);
448
- if (isGenrateFieldsMap && !_.isEmpty(requestParamsTypeCode.fieldsMap)) {
449
- code.push(`
450
- export const ${requestBuilderName}FieldsMap = ${JSON.stringify(
451
- requestParamsTypeCode.fieldsMap
452
- )}
453
- `);
454
- }
455
- }
456
- return code.join(os2.EOL);
457
- }
458
- function getUrlPathParams(parameters) {
459
- return parameters.filter((item) => item.in === "path").map((item) => item.name);
460
- }
461
- async function compileRequestParams(operationObject, generateFieldsMap = false) {
462
- let schema;
463
- if (operationObject.requestBody) {
464
- schema = operationObject.requestBody.content["application/json"].schema;
465
- } else if (operationObject.parameters) {
466
- const extraProperties = {};
467
- const parameters = [];
468
- operationObject.parameters.forEach(
469
- (item) => {
470
- if (!["query", "path"].includes(item.in)) {
471
- return;
472
- }
473
- if (_.get(item.schema, "type") === "object") {
474
- _.assign(extraProperties, _.get(item.schema, "properties", {}));
475
- } else {
476
- parameters.push(item);
477
- }
478
- }
479
- );
480
- const required = parameters.filter(
481
- (p) => p.required && !["pageNum", "pageSize", "count"].includes(p.name)
482
- ).map((p) => p.name);
483
- const properties = Object.fromEntries(
484
- parameters.filter((p) => !!p.schema).map((p) => {
485
- const schema2 = p.schema;
486
- return [
487
- p.name,
488
- {
489
- ...schema2,
490
- description: p.description
491
- // enum: schema.enum ?? [],
492
- }
493
- ];
494
- })
495
- );
496
- schema = {
497
- required,
498
- type: "object",
499
- properties: { ...properties, ...extraProperties }
500
- };
501
- }
502
- let code = "";
503
- const fieldsMap = {};
504
- if (schema) {
505
- try {
506
- code = await compile(schema, "Req", {
507
- bannerComment: "",
508
- ignoreMinAndMaxItems: true,
509
- additionalProperties: false
510
- // format: false,
511
- });
512
- const isPageSearchRequest = (data) => {
513
- const keys = ["pageNum", "pageSize", "count"];
514
- return _.get(data, "type") === "object" && _.get(data, "required", []).filter((item) => keys.includes(item)).length === keys.length;
515
- };
516
- if (generateFieldsMap) {
517
- const params = isPageSearchRequest(schema) ? _.get(schema, "properties.params.properties", {}) : schema.properties;
518
- _.forEach(params, (_4, field) => {
519
- fieldsMap[field] = field;
520
- });
521
- }
522
- } catch (e) {
523
- log5.error("\u751F\u6210\u8BF7\u6C42\u53C2\u6570\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 %o", {
524
- summary: operationObject.summary,
525
- message: e.message
526
- });
527
- }
528
- }
529
- return {
530
- code: code || "export type Req = any;",
531
- fieldsMap
532
- };
533
- }
534
- async function compileResponseParams(operationObject, apiConfig) {
535
- const temp = operationObject.responses["200"];
536
- let code = "";
537
- if (temp == null ? void 0 : temp.content) {
538
- const temp2 = temp.content["application/json"] || temp.content["*/*"];
539
- const schema = temp2.schema;
540
- let data = apiConfig.responseSchemaTransformer(schema);
541
- if (data) {
542
- data = _.cloneDeep(data);
543
- markCircularToRef(data);
544
- try {
545
- code = await compile(data, "Res", {
546
- bannerComment: "",
547
- ignoreMinAndMaxItems: true,
548
- additionalProperties: false
549
- // format: false,
550
- });
551
- const isPageSearchResponse = (data2) => {
552
- return _.get(data2, "type") === "object" && _.get(data2, "properties.result.type") === "array";
553
- };
554
- if (isPageSearchResponse(data)) {
555
- code += `${os2.EOL}export type ResultItem = Res['result'][0]`;
556
- }
557
- } catch (e) {
558
- log5.error("\u8F6C\u6362\u54CD\u5E94\u53C2\u6570\u7C7B\u578B\u5931\u8D25, \u8BF7\u68C0\u67E5 %o", {
559
- summary: operationObject.summary,
560
- error: e.message
561
- });
562
- }
563
- } else {
564
- log5.error("responseSchemaTransformer \u8FD4\u56DE\u503C\u4E3A\u7A7A, \u8BF7\u68C0\u67E5");
565
- }
566
- }
567
- return code ? code : "export type Res = any;";
568
- }
569
- function markCircularToRef(obj, parentMark = "#", map = /* @__PURE__ */ new Map([[obj, parentMark]]), set = /* @__PURE__ */ new Set([obj])) {
570
- Object.keys(obj).forEach((key) => {
571
- const value = obj[key];
572
- if (typeof value === "object" && !Array.isArray(value)) {
573
- if (set.has(value)) {
574
- obj[key] = { $ref: map.get(value) };
575
- return;
576
- }
577
- const tempMark = parentMark + "/" + key;
578
- set.add(value);
579
- map.set(value, tempMark);
580
- markCircularToRef(value, tempMark, map, set);
581
- }
582
- });
583
- return map;
584
- }
585
-
586
- // src/commands/initConfig.ts
587
- import fs3 from "fs-extra";
588
- import path3 from "path";
589
- var log6 = createLogger("initConfig");
590
- var tpl = `/**
591
- * @param {import('@dune2/cli').Config} config
592
- */
593
- function defineConfig(config) {
594
- return config;
595
- }
596
- module.exports = defineConfig({ i18n: [], api:[] });
597
- `;
598
- var initConfig = async () => {
599
- const config = await getConfig();
600
- const configPath = path3.join(config.cwd, configName);
601
- log6.info(`config file path: ${configPath}`);
602
- if (await fs3.pathExists(configPath)) {
603
- log6.info(`config file already exists, skip`);
604
- return;
605
- }
606
- await fs3.writeFile(configPath, tpl);
607
- log6.info(`config file created`);
608
- };
609
-
610
- // src/commands/interactive.ts
611
- import enquirer2 from "enquirer";
612
- var { prompt: prompt2 } = enquirer2;
613
- var log7 = createLogger("interactive");
614
- var interactive = async (args) => {
615
- var _a;
616
- const commands = cli.commands.filter((command2) => {
617
- if (command2.name) {
618
- return !command2.name.startsWith("@@") && command2.name !== "interactive";
619
- }
620
- return false;
621
- });
622
- const commandMap = /* @__PURE__ */ new Map();
623
- const res = await prompt2({
624
- type: "autocomplete",
625
- name: "command",
626
- message: "\u9009\u62E9\u8981\u6267\u884C\u7684\u547D\u4EE4\uFF1A",
627
- choices: commands.map((command2) => {
628
- commandMap.set(command2.name, command2);
629
- return {
630
- name: command2.name,
631
- value: command2.name,
632
- message: command2.description,
633
- hint: `\u7B49\u540C\u547D\u4EE4 ${cli.name} ${command2.name}`
634
- };
635
- })
636
- });
637
- const command = commandMap.get(res.command);
638
- if (!command) {
639
- log7.error("\u672A\u627E\u5230\u547D\u4EE4 %s", res.command);
640
- return;
641
- }
642
- (_a = command.commandAction) == null ? void 0 : _a.apply(cli, args);
643
- };
644
-
645
- // src/commands/namespace.ts
646
- import enquirer3 from "enquirer";
647
- import fs4 from "fs-extra";
648
- import { globby as globby2 } from "globby";
649
- import _2 from "lodash";
650
- import pMap4 from "p-map";
651
- import pc2 from "picocolors";
652
-
653
- // src/shared/autoNamespaceByReg.ts
654
- function autoNamespaceByReg(code, namespace2) {
655
- let hasChanged = false;
656
- code = code.replace(/\Wt`(.+?)`/gm, (match, p1) => {
657
- if (/\S\.\S/.test(p1)) {
658
- return match;
659
- }
660
- hasChanged = true;
661
- return match.replace(p1, `${namespace2}.${p1}`);
662
- });
663
- code = code.replace(/\Wt\(['"](.+?)['"][),]/gm, (match, p1) => {
664
- if (/\S\.\S/.test(p1)) {
665
- return match;
666
- }
667
- hasChanged = true;
668
- return match.replace(p1, `${namespace2}.${p1}`);
669
- });
670
- if (hasChanged) {
671
- return code;
672
- }
673
- return "";
674
- }
675
-
676
- // src/commands/namespace.ts
677
- var { prompt: prompt3 } = enquirer3;
678
- var log8 = createLogger("namespace");
679
- async function namespace(params) {
680
- var _a, _b;
681
- const { mode = "swc" } = params;
682
- const config = await getConfig();
683
- let i18nConfigs = (_a = config.i18n) == null ? void 0 : _a.filter((item) => !item.disableExtract);
684
- if (!i18nConfigs) {
685
- log8.info("\u6CA1\u6709\u914D\u7F6E i18n");
686
- return;
687
- }
688
- const { i18nDir } = await prompt3({
689
- type: "select",
690
- name: "i18nDir",
691
- message: "\u9009\u62E9\u8981\u751F\u6548\u7684\u914D\u7F6E\u9879",
692
- choices: i18nConfigs.map((item) => {
693
- return {
694
- name: item.i18nDir,
695
- hint: `sheetRange: ${item.sheetRange}`
696
- };
697
- })
698
- });
699
- let i18nConfig = i18nConfigs.find((item) => item.i18nDir === i18nDir);
700
- if (!i18nConfig) {
701
- log8.info("\u6CA1\u6709\u627E\u5230\u5BF9\u5E94\u7684\u914D\u7F6E");
702
- return;
703
- }
704
- const { namespaces } = await prompt3({
705
- type: "multiselect",
706
- message: "\u9009\u62E9\u8981\u751F\u6548\u7684\u914D\u7F6E\u9879",
707
- //@ts-ignore
708
- hint: "(\u7A7A\u683C\u9009\u4E2D\uFF0C\u56DE\u8F66\u786E\u8BA4)",
709
- name: "namespaces",
710
- validate(value) {
711
- return value.length === 0 ? `\u81F3\u5C11\u9009\u62E9\u4E00\u9879` : true;
712
- },
713
- choices: _2.map(i18nConfig.namespace, (v, k) => {
714
- return {
715
- name: k
716
- };
717
- })
718
- });
719
- const autoNamespace = await (() => {
720
- if (mode === "swc") {
721
- log8.info("\u4F7F\u7528 swc \u6765\u5904\u7406");
722
- return import("@dune2/wasm").then((m) => m.autoNamespace);
723
- }
724
- log8.info("\u4F7F\u7528 reg \u6765\u5904\u7406");
725
- return autoNamespaceByReg;
726
- })();
727
- for (const namespace2 of namespaces) {
728
- const namespaceConfig = (_b = i18nConfig.namespace) == null ? void 0 : _b[namespace2];
729
- const suffix = `**/**.{js,jsx,ts,tsx}`;
730
- const combined = _2.map(_2.castArray(namespaceConfig), (v) => {
731
- v = v.endsWith("/") ? v : v + "/";
732
- return v + suffix;
733
- });
734
- log8.info("\u6B63\u5728\u5904\u7406 namespace: %s", pc2.green(namespace2));
735
- log8.info("\u9884\u8BA1\u5904\u7406\u7684\u6587\u4EF6\u8DEF\u5F84: %s", pc2.green(combined.join("\n")));
736
- const files = await globby2(
737
- [
738
- "!**/node_modules/**",
739
- "!**.d.ts",
740
- "!**/.next/**",
741
- "!**/out/**"
742
- //
743
- ].concat(combined),
744
- { cwd: i18nConfig.cwd }
745
- );
746
- log8.info("\u9884\u8BA1\u5171\u5904\u7406 %s \u4E2A\u6587\u4EF6", pc2.green(files.length));
747
- let transformedFileSet = /* @__PURE__ */ new Set();
748
- await pMap4(files, async (file) => {
749
- const content = await fs4.readFile(file, "utf-8");
750
- const newContent = await autoNamespace(
751
- content,
752
- namespace2,
753
- i18nConfig.namespaceSeparator
754
- );
755
- if (newContent) {
756
- await fs4.writeFile(file, newContent);
757
- await formatFile(file);
758
- transformedFileSet.add(file);
759
- }
760
- });
761
- log8.info(
762
- "\u5DF2\u4E3A %s \u4E2A\u6587\u4EF6 \u81EA\u52A8\u6DFB\u52A0 namespace",
763
- pc2.green(transformedFileSet.size)
764
- );
765
- }
766
- }
767
-
768
- // src/commands/upload.ts
769
- import _3 from "lodash";
770
- import pMap5 from "p-map";
771
- var log9 = createLogger("upload");
772
- async function batchUpdateKeys(config) {
773
- let sheetData = await resolveSheetData(config);
774
- const allKeys = [];
775
- const i18nDataMap = /* @__PURE__ */ new Map();
776
- await pMap5(config.locales ?? [], async (locale) => {
777
- const i18nData = new I18nData(locale, config);
778
- i18nDataMap.set(locale, i18nData);
779
- const data = await i18nData.loadData();
780
- allKeys.push(...Object.keys(data));
781
- });
782
- let needSyncKeys = Array.from(new Set(allKeys)).filter((key) => {
783
- return !sheetData.keySet.has(key);
784
- });
785
- needSyncKeys = _3.sortBy(needSyncKeys);
786
- if (needSyncKeys.length) {
787
- log9.info(`\u5373\u5C06\u540C\u6B65\u672C\u5730\u65B0\u589E\u52A0 ${needSyncKeys.length} \u4E2A i18nKey \u5230\u4E91\u7AEF`);
788
- await googleSheet.updateColumn(
789
- config.sheetId,
790
- config.sheetRange,
791
- letterToNumber(config.position.key),
792
- sheetData.nextAppendRowIndex,
793
- needSyncKeys
794
- );
795
- log9.info("\u540C\u6B65\u65B0\u589E\u52A0i18nKey\u6210\u529F");
796
- for (const lang of config.locales) {
797
- const langFile = i18nDataMap.get(lang);
798
- const needSyncValues = [];
799
- needSyncKeys.forEach((k) => {
800
- if (langFile) {
801
- needSyncValues.push(langFile.data[k]);
802
- }
803
- });
804
- log9.info(
805
- `\u5373\u5C06\u540C\u6B65\u672C\u5730 ${lang} \u65B0\u589E\u52A0 ${needSyncValues.length} \u4E2A\u503C\u5230\u4E91\u7AEF`
806
- );
807
- await googleSheet.updateColumn(
808
- config.sheetId,
809
- config.sheetRange,
810
- letterToNumber(config.position[lang]),
811
- sheetData.nextAppendRowIndex,
812
- needSyncValues
813
- );
814
- }
815
- await sleep(1e3);
816
- sheetData = await resolveSheetData(config);
817
- log9.info(`\u5DF2\u91CD\u65B0\u83B7\u53D6 ${config.sheetRange} \u7684\u6570\u636E`);
818
- }
819
- return { sheetData, i18nDataMap };
820
- }
821
- async function upload() {
822
- const config = await getConfig();
823
- let i18nConfigs = await promptI18nConfigEnable(config.i18n);
824
- for (const configItem of i18nConfigs) {
825
- const { sheetData, i18nDataMap } = await batchUpdateKeys(configItem);
826
- await pMap5(configItem.locales ?? [], async (locale) => {
827
- const i18nData = i18nDataMap.get(locale);
828
- await i18nData.trySaveToGoogle(sheetData);
829
- });
830
- }
831
- log9.info("\u4E0A\u4F20\u6210\u529F");
832
- }
7
+ var version = "0.5.1";
833
8
 
834
9
  // src/cli.ts
835
- cli.command("download", "\u751F\u6210\u7FFB\u8BD1\u6587\u4EF6").example("dune download").action(download);
836
- cli.command("extract", "\u63D0\u53D6\u4EE3\u7801\u4E2D\u7684\u6587\u6848").option("--deleteUnused", "\u5220\u9664\u672A\u4F7F\u7528\u7684\u6587\u6848").example("dune extract").action(extract);
837
- cli.command("namespaceSwc", "\u6DFB\u52A0namespace\u524D\u7F00\uFF0C\u7531swc\u9A71\u52A8").example("dune namespaceSwc").action(() => {
10
+ cli.command("download", "\u751F\u6210\u7FFB\u8BD1\u6587\u4EF6").example("dune download").action(async () => {
11
+ const { download } = await import("./download-NS56QNEI.js");
12
+ await download();
13
+ });
14
+ cli.command("extract", "\u63D0\u53D6\u4EE3\u7801\u4E2D\u7684\u6587\u6848").option("--deleteUnused", "\u5220\u9664\u672A\u4F7F\u7528\u7684\u6587\u6848").example("dune extract").action(async (args) => {
15
+ const { extract } = await import("./extract-7YVZJT6N.js");
16
+ await extract(args);
17
+ });
18
+ cli.command("namespaceSwc", "\u6DFB\u52A0 namespace \u524D\u7F00\uFF0C\u7531 swc \u9A71\u52A8").example("dune namespaceSwc").action(async () => {
19
+ const { namespace } = await import("./namespace-IDUS7AMO.js");
838
20
  return namespace({ mode: "swc" });
839
21
  });
840
- cli.command("namespaceReg", "\u6DFB\u52A0namespace\u524D\u7F00\uFF0C\u7531\u6B63\u5219\u9A71\u52A8").example("dune namespaceReg").action(() => {
22
+ cli.command("namespaceReg", "\u6DFB\u52A0 namespace \u524D\u7F00\uFF0C\u7531\u6B63\u5219\u9A71\u52A8").example("dune namespaceReg").action(async () => {
23
+ const { namespace } = await import("./namespace-IDUS7AMO.js");
841
24
  return namespace({ mode: "reg" });
842
25
  });
843
- cli.command("upload", "\u4E0A\u4F20\u7FFB\u8BD1\u6587\u4EF6").example("dune upload").action(upload);
844
- cli.command("downloadFromPlatform", "\u4ECE\u7FFB\u8BD1\u5E73\u53F0\u4E0B\u8F7D\u6587\u4EF6").example("dune downloadFromPlatform").action(downloadFromPlatform);
845
- cli.command("generateApi", "\u751F\u6210api\u6587\u4EF6").example("dune generateApi").action(generateApi);
846
- cli.command("init", "\u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6").example("dune init").action(initConfig);
847
- cli.command("interactive", "\u4EA4\u4E92\u5F0F\u64CD\u4F5C").example("dune interactive").alias("i").action(interactive);
848
- cli.command("").action(interactive);
26
+ cli.command("upload", "\u4E0A\u4F20\u7FFB\u8BD1\u6587\u4EF6").example("dune upload").action(async (args) => {
27
+ const { upload } = await import("./upload-WCPUDBKZ.js");
28
+ await upload();
29
+ });
30
+ cli.command("downloadFromPlatform", "\u4ECE\u7FFB\u8BD1\u5E73\u53F0\u4E0B\u8F7D\u6587\u4EF6").example("dune downloadFromPlatform").action(async () => {
31
+ const { downloadFromPlatform } = await import("./downloadFromPlatform-6ZUZTZAX.js");
32
+ await downloadFromPlatform();
33
+ });
34
+ cli.command("generateApi", "\u751F\u6210 api \u6587\u4EF6").example("dune generateApi").action(async () => {
35
+ const { generateApi } = await import("./generateApi-TMEDGY2V.js");
36
+ await generateApi();
37
+ });
38
+ cli.command("login", "\u767B\u5F55").action(async () => {
39
+ const { googleAuth } = await import("./auth-777GVVSS.js");
40
+ await googleAuth.initCredentials();
41
+ });
42
+ cli.command("logout", "\u9000\u51FA").action(async () => {
43
+ const { googleAuth } = await import("./auth-777GVVSS.js");
44
+ await googleAuth.removeCredentials();
45
+ });
46
+ cli.command("userInfo", "\u7528\u6237\u4FE1\u606F").action(async () => {
47
+ const { googleAuth } = await import("./auth-777GVVSS.js");
48
+ if (googleAuth.tokens) {
49
+ console.log(`email: ${googleAuth.tokens.email}
50
+ aud : ${googleAuth.tokens.aud}
51
+ exp : ${new Date(googleAuth.tokens.expiry_date).toLocaleString()}
52
+ `);
53
+ } else {
54
+ console.log("\u672A\u767B\u5F55");
55
+ console.log(`\u8FD0\u884C dune login \u767B\u5F55`);
56
+ }
57
+ });
58
+ cli.command("init", "\u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6").example("dune init").action(async () => {
59
+ const { initConfig } = await import("./initConfig-DHDY6MWT.js");
60
+ await initConfig();
61
+ });
62
+ cli.command("interactive", "\u4EA4\u4E92\u5F0F\u64CD\u4F5C").example("dune interactive").alias("i").action(async (args) => {
63
+ const { interactive } = await import("./interactive-HNOHT33A.js");
64
+ await interactive(args);
65
+ });
66
+ cli.command("").action(async (args) => {
67
+ const { interactive } = await import("./interactive-HNOHT33A.js");
68
+ await interactive(args);
69
+ });
849
70
  cli.version(version);
850
71
  cli.help();
851
72
  (async () => {