@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.
Files changed (46) hide show
  1. package/dist/{chunk-UGSBKD2I.js → chunk-DORNSRHQ.js} +2 -3
  2. package/dist/{chunk-555YTWSW.js → chunk-VS4LDXR3.js} +1 -4
  3. package/dist/chunk-VS4LDXR3.js.map +1 -0
  4. package/dist/{chunk-PRJ3NOXB.js → chunk-YZLVO3MA.js} +2 -2
  5. package/dist/cli.js +5 -45
  6. package/dist/cli.js.map +1 -1
  7. package/dist/{generateApi-6O2YBWTL.js → generateApi-S77LKSZT.js} +93 -33
  8. package/dist/generateApi-S77LKSZT.js.map +1 -0
  9. package/dist/index.d.ts +3 -35
  10. package/dist/index.js +30 -10
  11. package/dist/index.js.map +1 -1
  12. package/dist/{initConfig-5VN3U4OF.js → initConfig-NHHN2HCE.js} +4 -4
  13. package/dist/{interactive-HNOHT33A.js → interactive-BVOA3VKY.js} +2 -2
  14. package/dist/normalizeConfig.d.ts +1 -1
  15. package/dist/normalizeConfig.js +1 -1
  16. package/dist/prettier.cjs.map +1 -1
  17. package/dist/{types-D01zR42f.d.ts → types-CqBxoc6L.d.ts} +0 -12
  18. package/package.json +2 -9
  19. package/dist/auth-777GVVSS.js +0 -8
  20. package/dist/auth-777GVVSS.js.map +0 -1
  21. package/dist/chunk-2SEEW5WZ.js +0 -67
  22. package/dist/chunk-2SEEW5WZ.js.map +0 -1
  23. package/dist/chunk-555YTWSW.js.map +0 -1
  24. package/dist/chunk-6UFZ6KLX.js +0 -124
  25. package/dist/chunk-6UFZ6KLX.js.map +0 -1
  26. package/dist/chunk-ADQ6JLT6.js +0 -196
  27. package/dist/chunk-ADQ6JLT6.js.map +0 -1
  28. package/dist/chunk-IKJLPHF7.js +0 -117
  29. package/dist/chunk-IKJLPHF7.js.map +0 -1
  30. package/dist/chunk-KNC7XY4Z.js +0 -130
  31. package/dist/chunk-KNC7XY4Z.js.map +0 -1
  32. package/dist/chunk-Q7UJ456X.js +0 -24
  33. package/dist/chunk-Q7UJ456X.js.map +0 -1
  34. package/dist/download-KXSMWNXH.js +0 -49
  35. package/dist/download-KXSMWNXH.js.map +0 -1
  36. package/dist/extract-ARNNWYYN.js +0 -113
  37. package/dist/extract-ARNNWYYN.js.map +0 -1
  38. package/dist/generateApi-6O2YBWTL.js.map +0 -1
  39. package/dist/namespace-SAPL3UY6.js +0 -137
  40. package/dist/namespace-SAPL3UY6.js.map +0 -1
  41. package/dist/upload-S43DON7A.js +0 -92
  42. package/dist/upload-S43DON7A.js.map +0 -1
  43. /package/dist/{chunk-UGSBKD2I.js.map → chunk-DORNSRHQ.js.map} +0 -0
  44. /package/dist/{chunk-PRJ3NOXB.js.map → chunk-YZLVO3MA.js.map} +0 -0
  45. /package/dist/{initConfig-5VN3U4OF.js.map → initConfig-NHHN2HCE.js.map} +0 -0
  46. /package/dist/{interactive-HNOHT33A.js.map → interactive-BVOA3VKY.js.map} +0 -0
@@ -31,7 +31,6 @@ var homeConfigDir = (() => {
31
31
 
32
32
  export {
33
33
  cli,
34
- createLogger,
35
- homeConfigDir
34
+ createLogger
36
35
  };
37
- //# sourceMappingURL=chunk-UGSBKD2I.js.map
36
+ //# sourceMappingURL=chunk-DORNSRHQ.js.map
@@ -65,9 +65,6 @@ function normalizeConfig(config) {
65
65
  }
66
66
  function apiConfigNormalizer(item) {
67
67
  item.output ??= "./src/apis";
68
- if (!item.urlTransformer) {
69
- item.requestFnImportPath ??= `import requestFn from '@/utils/request';`;
70
- }
71
68
  item.RequestBuilderImportPath ??= `import { RequestBuilder } from '@dune2/tools/rq';`;
72
69
  item.enableTs ??= true;
73
70
  item.enabled ??= true;
@@ -85,4 +82,4 @@ export {
85
82
  normalizeConfig,
86
83
  apiConfigNormalizer
87
84
  };
88
- //# sourceMappingURL=chunk-555YTWSW.js.map
85
+ //# sourceMappingURL=chunk-VS4LDXR3.js.map
@@ -0,0 +1 @@
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 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;AAChB,OAAK,6BAA6B;AAClC,OAAK,aAAa;AAClB,OAAK,YAAY;AACjB,OAAK,WAAW;AAChB,OAAK,8BAA8B,CAAC,WAAQ;AAvD9C;AAwDI,yBAAO,eAAP,mBAAmB,SAAQ;AAAA;AAC7B,SAAO;AACT;","names":["_","_a","item","_"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  normalizeConfig
3
- } from "./chunk-555YTWSW.js";
3
+ } from "./chunk-VS4LDXR3.js";
4
4
 
5
5
  // src/shared/config/index.ts
6
6
  import { createJiti } from "jiti";
@@ -25,4 +25,4 @@ export {
25
25
  configName,
26
26
  getConfig
27
27
  };
28
- //# sourceMappingURL=chunk-PRJ3NOXB.js.map
28
+ //# sourceMappingURL=chunk-YZLVO3MA.js.map
package/dist/cli.js CHANGED
@@ -1,66 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  cli
4
- } from "./chunk-UGSBKD2I.js";
4
+ } from "./chunk-DORNSRHQ.js";
5
5
 
6
6
  // package.json
7
7
  var version = "0.6.0";
8
8
 
9
9
  // src/cli.ts
10
- cli.command("download", "\u751F\u6210\u7FFB\u8BD1\u6587\u4EF6").example("dune download").action(async () => {
11
- const { download } = await import("./download-KXSMWNXH.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-ARNNWYYN.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-SAPL3UY6.js");
20
- return namespace({ mode: "swc" });
21
- });
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-SAPL3UY6.js");
24
- return namespace({ mode: "reg" });
25
- });
26
- cli.command("upload", "\u4E0A\u4F20\u7FFB\u8BD1\u6587\u4EF6").example("dune upload").action(async (args) => {
27
- const { upload } = await import("./upload-S43DON7A.js");
28
- await upload();
29
- });
30
10
  cli.command("generateApi", "\u751F\u6210 api \u6587\u4EF6").example("dune generateApi").action(async () => {
31
- const { generateApi } = await import("./generateApi-6O2YBWTL.js");
11
+ const { generateApi } = await import("./generateApi-S77LKSZT.js");
32
12
  await generateApi();
33
13
  });
34
- cli.command("login", "\u767B\u5F55").action(async () => {
35
- const { googleAuth } = await import("./auth-777GVVSS.js");
36
- await googleAuth.initCredentials();
37
- });
38
- cli.command("logout", "\u9000\u51FA").action(async () => {
39
- const { googleAuth } = await import("./auth-777GVVSS.js");
40
- await googleAuth.removeCredentials();
41
- });
42
- cli.command("userInfo", "\u7528\u6237\u4FE1\u606F").action(async () => {
43
- const { googleAuth } = await import("./auth-777GVVSS.js");
44
- if (googleAuth.tokens) {
45
- console.log(`email: ${googleAuth.tokens.email}
46
- aud : ${googleAuth.tokens.aud}
47
- exp : ${new Date(googleAuth.tokens.expiry_date).toLocaleString()}
48
- `);
49
- } else {
50
- console.log("\u672A\u767B\u5F55");
51
- console.log(`\u8FD0\u884C dune login \u767B\u5F55`);
52
- }
53
- });
54
14
  cli.command("init", "\u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6").example("dune init").action(async () => {
55
- const { initConfig } = await import("./initConfig-5VN3U4OF.js");
15
+ const { initConfig } = await import("./initConfig-NHHN2HCE.js");
56
16
  await initConfig();
57
17
  });
58
18
  cli.command("interactive", "\u4EA4\u4E92\u5F0F\u64CD\u4F5C").example("dune interactive").alias("i").action(async (args) => {
59
- const { interactive } = await import("./interactive-HNOHT33A.js");
19
+ const { interactive } = await import("./interactive-BVOA3VKY.js");
60
20
  await interactive(args);
61
21
  });
62
22
  cli.command("").action(async (args) => {
63
- const { interactive } = await import("./interactive-HNOHT33A.js");
23
+ const { interactive } = await import("./interactive-BVOA3VKY.js");
64
24
  await interactive(args);
65
25
  });
66
26
  cli.version(version);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"@dune2/cli\",\n \"version\": \"0.6.0\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/liaoyinglong/next-tools.git\",\n \"directory\": \"packages/cli\"\n },\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\"\n },\n \"./cli\": {\n \"import\": \"./dist/cli.js\"\n },\n \"./normalizeConfig\": {\n \"import\": \"./dist/normalizeConfig.js\"\n },\n \"./prettier\": {\n \"import\": \"./dist/prettier.js\",\n \"require\": \"./dist/prettier.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"types\": \"dist/index.d.ts\",\n \"bin\": {\n \"dune\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"shx rm -rf ./dist && tsup --splitting\",\n \"dev\": \"pnpm run build --watch\",\n \"lint\": \"tsc --diagnostics --noEmit\",\n \"test\": \"vitest run\",\n \"test:u\": \"vitest -u\"\n },\n \"dependencies\": {\n \"@apidevtools/swagger-parser\": \"^10.1.0\",\n \"@dune2/wasm\": \"workspace:*\",\n \"cac\": \"^6.7.14\",\n \"cli-table3\": \"^0.6.3\",\n \"connect\": \"^3.7.0\",\n \"debug\": \"^4.3.4\",\n \"enquirer\": \"^2.3.6\",\n \"fs-extra\": \"^11.2.0\",\n \"globby\": \"^14.0.1\",\n \"googleapis\": \"108.0.0\",\n \"jiti\": \"^2.4.2\",\n \"json-schema-to-typescript\": \"15.0.0\",\n \"lodash\": \"^4.17.21\",\n \"open\": \"^10.1.0\",\n \"p-map\": \"^7.0.2\",\n \"path-to-regexp\": \"7.1.0\",\n \"picocolors\": \"^1.0.0\"\n },\n \"devDependencies\": {\n \"@types/debug\": \"^4.1.7\",\n \"@types/lodash\": \"^4.14.186\",\n \"gaxios\": \"*\",\n \"google-auth-library\": \"*\",\n \"openapi-types\": \"^12.0.2\",\n \"prettier\": \"^3\",\n \"tsup\": \"8\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","#!/usr/bin/env node\nimport { version } from \"../package.json\";\nimport { cli } from \"./shared\";\n//#region 翻译相关\n\ncli\n .command(\"download\", \"生成翻译文件\")\n .example(\"dune download\")\n .action(async () => {\n const { download } = await import(\"./commands/download\");\n await download();\n });\ncli\n .command(\"extract\", \"提取代码中的文案\")\n .option(\"--deleteUnused\", \"删除未使用的文案\")\n .example(\"dune extract\")\n .action(async (args) => {\n const { extract } = await import(\"./commands/extract\");\n await extract(args);\n });\n\ncli\n .command(\"namespaceSwc\", \"添加 namespace 前缀,由 swc 驱动\")\n .example(\"dune namespaceSwc\")\n .action(async () => {\n const { namespace } = await import(\"./commands/namespace\");\n return namespace({ mode: \"swc\" });\n });\n\ncli\n .command(\"namespaceReg\", \"添加 namespace 前缀,由正则驱动\")\n .example(\"dune namespaceReg\")\n .action(async () => {\n const { namespace } = await import(\"./commands/namespace\");\n return namespace({ mode: \"reg\" });\n });\n\ncli\n .command(\"upload\", \"上传翻译文件\")\n .example(\"dune upload\")\n .action(async (args) => {\n const { upload } = await import(\"./commands/upload\");\n await upload();\n });\n\n//#endregion\n\n//#region api 相关\ncli\n .command(\"generateApi\", \"生成 api 文件\")\n .example(\"dune generateApi\")\n .action(async () => {\n const { generateApi } = await import(\"./commands/generateApi\");\n await generateApi();\n });\n//#endregion\n\n//#region user 相关\ncli.command(\"login\", \"登录\").action(async () => {\n const { googleAuth } = await import(\"./shared/google/auth\");\n await googleAuth.initCredentials();\n});\ncli.command(\"logout\", \"退出\").action(async () => {\n const { googleAuth } = await import(\"./shared/google/auth\");\n await googleAuth.removeCredentials();\n});\ncli.command(\"userInfo\", \"用户信息\").action(async () => {\n const { googleAuth } = await import(\"./shared/google/auth\");\n if (googleAuth.tokens) {\n console.log(`\\\nemail: ${googleAuth.tokens.email}\naud : ${googleAuth.tokens.aud}\nexp : ${new Date(googleAuth.tokens.expiry_date).toLocaleString()}\n`);\n } else {\n console.log(\"未登录\");\n console.log(`运行 dune login 登录`);\n }\n});\n//#endregion\n\ncli\n .command(\"init\", \"初始化配置文件\")\n .example(\"dune init\")\n .action(async () => {\n const { initConfig } = await import(\"./commands/initConfig\");\n await initConfig();\n });\n\ncli\n .command(\"interactive\", \"交互式操作\")\n .example(\"dune interactive\")\n .alias(\"i\")\n .action(async (args) => {\n const { interactive } = await import(\"./commands/interactive\");\n await interactive(args);\n });\n\n// make default command run interactive\ncli.command(\"\").action(async (args) => {\n const { interactive } = await import(\"./commands/interactive\");\n await interactive(args);\n});\n\ncli.version(version);\ncli.help();\n\n(async () => {\n try {\n // Parse CLI args without running the command\n cli.parse(process.argv, { run: false });\n // Run the command yourself\n // You only need `await` when your command action returns a Promise\n await cli.runMatchedCommand();\n } catch (error) {\n // Handle error here..\n // e.g.\n // console.error(error.stack)\n // process.exit(1)\n }\n})();\n"],"mappings":";;;;;;AAEE,cAAW;;;ACGb,IACG,QAAQ,YAAY,sCAAQ,EAC5B,QAAQ,eAAe,EACvB,OAAO,YAAY;AAClB,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,wBAAqB;AACvD,QAAM,SAAS;AACjB,CAAC;AACH,IACG,QAAQ,WAAW,kDAAU,EAC7B,OAAO,kBAAkB,kDAAU,EACnC,QAAQ,cAAc,EACtB,OAAO,OAAO,SAAS;AACtB,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,uBAAoB;AACrD,QAAM,QAAQ,IAAI;AACpB,CAAC;AAEH,IACG,QAAQ,gBAAgB,kEAA0B,EAClD,QAAQ,mBAAmB,EAC3B,OAAO,YAAY;AAClB,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yBAAsB;AACzD,SAAO,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,CAAC;AAEH,IACG,QAAQ,gBAAgB,yEAAuB,EAC/C,QAAQ,mBAAmB,EAC3B,OAAO,YAAY;AAClB,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,yBAAsB;AACzD,SAAO,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,CAAC;AAEH,IACG,QAAQ,UAAU,sCAAQ,EAC1B,QAAQ,aAAa,EACrB,OAAO,OAAO,SAAS;AACtB,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,sBAAmB;AACnD,QAAM,OAAO;AACf,CAAC;AAKH,IACG,QAAQ,eAAe,+BAAW,EAClC,QAAQ,kBAAkB,EAC1B,OAAO,YAAY;AAClB,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,2BAAwB;AAC7D,QAAM,YAAY;AACpB,CAAC;AAIH,IAAI,QAAQ,SAAS,cAAI,EAAE,OAAO,YAAY;AAC5C,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,oBAAsB;AAC1D,QAAM,WAAW,gBAAgB;AACnC,CAAC;AACD,IAAI,QAAQ,UAAU,cAAI,EAAE,OAAO,YAAY;AAC7C,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,oBAAsB;AAC1D,QAAM,WAAW,kBAAkB;AACrC,CAAC;AACD,IAAI,QAAQ,YAAY,0BAAM,EAAE,OAAO,YAAY;AACjD,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,oBAAsB;AAC1D,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,UACP,WAAW,OAAO,KAAK;AAAA,SACvB,WAAW,OAAO,GAAG;AAAA,SACrB,IAAI,KAAK,WAAW,OAAO,WAAW,EAAE,eAAe,CAAC;AAAA,CAChE;AAAA,EACC,OAAO;AACL,YAAQ,IAAI,oBAAK;AACjB,YAAQ,IAAI,sCAAkB;AAAA,EAChC;AACF,CAAC;AAGD,IACG,QAAQ,QAAQ,4CAAS,EACzB,QAAQ,WAAW,EACnB,OAAO,YAAY;AAClB,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,0BAAuB;AAC3D,QAAM,WAAW;AACnB,CAAC;AAEH,IACG,QAAQ,eAAe,gCAAO,EAC9B,QAAQ,kBAAkB,EAC1B,MAAM,GAAG,EACT,OAAO,OAAO,SAAS;AACtB,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,2BAAwB;AAC7D,QAAM,YAAY,IAAI;AACxB,CAAC;AAGH,IAAI,QAAQ,EAAE,EAAE,OAAO,OAAO,SAAS;AACrC,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,2BAAwB;AAC7D,QAAM,YAAY,IAAI;AACxB,CAAC;AAED,IAAI,QAAQ,OAAO;AACnB,IAAI,KAAK;AAAA,CAER,YAAY;AACX,MAAI;AAEF,QAAI,MAAM,QAAQ,MAAM,EAAE,KAAK,MAAM,CAAC;AAGtC,UAAM,IAAI,kBAAkB;AAAA,EAC9B,SAAS,OAAO;AAAA,EAKhB;AACF,GAAG;","names":[]}
1
+ {"version":3,"sources":["../package.json","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"@dune2/cli\",\n \"version\": \"0.6.0\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/liaoyinglong/next-tools.git\",\n \"directory\": \"packages/cli\"\n },\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\"\n },\n \"./cli\": {\n \"import\": \"./dist/cli.js\"\n },\n \"./normalizeConfig\": {\n \"import\": \"./dist/normalizeConfig.js\"\n },\n \"./prettier\": {\n \"import\": \"./dist/prettier.js\",\n \"require\": \"./dist/prettier.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"types\": \"dist/index.d.ts\",\n \"bin\": {\n \"dune\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"shx rm -rf ./dist && tsup --splitting\",\n \"dev\": \"pnpm run build --watch\",\n \"lint\": \"tsc --diagnostics --noEmit\",\n \"test\": \"vitest run\",\n \"test:u\": \"vitest -u\"\n },\n \"dependencies\": {\n \"@apidevtools/swagger-parser\": \"^10.1.0\",\n \"cac\": \"^6.7.14\",\n \"debug\": \"^4.3.4\",\n \"enquirer\": \"^2.3.6\",\n \"fs-extra\": \"^11.2.0\",\n \"jiti\": \"^2.4.2\",\n \"json-schema-to-typescript\": \"15.0.0\",\n \"lodash\": \"^4.17.21\",\n \"p-map\": \"^7.0.2\",\n \"path-to-regexp\": \"7.1.0\",\n \"picocolors\": \"^1.0.0\"\n },\n \"devDependencies\": {\n \"@types/debug\": \"^4.1.7\",\n \"@types/lodash\": \"^4.14.186\",\n \"gaxios\": \"*\",\n \"openapi-types\": \"^12.0.2\",\n \"prettier\": \"^3\",\n \"tsup\": \"8\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","#!/usr/bin/env node\nimport { version } from \"../package.json\";\nimport { cli } from \"./shared\";\n\n//#region api 相关\ncli\n .command(\"generateApi\", \"生成 api 文件\")\n .example(\"dune generateApi\")\n .action(async () => {\n const { generateApi } = await import(\"./commands/generateApi\");\n await generateApi();\n });\n//#endregion\n\ncli\n .command(\"init\", \"初始化配置文件\")\n .example(\"dune init\")\n .action(async () => {\n const { initConfig } = await import(\"./commands/initConfig\");\n await initConfig();\n });\n\ncli\n .command(\"interactive\", \"交互式操作\")\n .example(\"dune interactive\")\n .alias(\"i\")\n .action(async (args) => {\n const { interactive } = await import(\"./commands/interactive\");\n await interactive(args);\n });\n\n// make default command run interactive\ncli.command(\"\").action(async (args) => {\n const { interactive } = await import(\"./commands/interactive\");\n await interactive(args);\n});\n\ncli.version(version);\ncli.help();\n\n(async () => {\n try {\n // Parse CLI args without running the command\n cli.parse(process.argv, { run: false });\n // Run the command yourself\n // You only need `await` when your command action returns a Promise\n await cli.runMatchedCommand();\n } catch (error) {\n // Handle error here..\n // e.g.\n // console.error(error.stack)\n // process.exit(1)\n }\n})();\n"],"mappings":";;;;;;AAEE,cAAW;;;ACGb,IACG,QAAQ,eAAe,+BAAW,EAClC,QAAQ,kBAAkB,EAC1B,OAAO,YAAY;AAClB,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,2BAAwB;AAC7D,QAAM,YAAY;AACpB,CAAC;AAGH,IACG,QAAQ,QAAQ,4CAAS,EACzB,QAAQ,WAAW,EACnB,OAAO,YAAY;AAClB,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,0BAAuB;AAC3D,QAAM,WAAW;AACnB,CAAC;AAEH,IACG,QAAQ,eAAe,gCAAO,EAC9B,QAAQ,kBAAkB,EAC1B,MAAM,GAAG,EACT,OAAO,OAAO,SAAS;AACtB,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,2BAAwB;AAC7D,QAAM,YAAY,IAAI;AACxB,CAAC;AAGH,IAAI,QAAQ,EAAE,EAAE,OAAO,OAAO,SAAS;AACrC,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,2BAAwB;AAC7D,QAAM,YAAY,IAAI;AACxB,CAAC;AAED,IAAI,QAAQ,OAAO;AACnB,IAAI,KAAK;AAAA,CAER,YAAY;AACX,MAAI;AAEF,QAAI,MAAM,QAAQ,MAAM,EAAE,KAAK,MAAM,CAAC;AAGtC,UAAM,IAAI,kBAAkB;AAAA,EAC9B,SAAS,OAAO;AAAA,EAKhB;AACF,GAAG;","names":[]}
@@ -1,16 +1,10 @@
1
- import {
2
- formatFile
3
- } from "./chunk-Q7UJ456X.js";
4
- import {
5
- promptApiConfigEnable
6
- } from "./chunk-2SEEW5WZ.js";
7
1
  import {
8
2
  getConfig
9
- } from "./chunk-PRJ3NOXB.js";
10
- import "./chunk-555YTWSW.js";
3
+ } from "./chunk-YZLVO3MA.js";
4
+ import "./chunk-VS4LDXR3.js";
11
5
  import {
12
6
  createLogger
13
- } from "./chunk-UGSBKD2I.js";
7
+ } from "./chunk-DORNSRHQ.js";
14
8
 
15
9
  // src/commands/generateApi/index.ts
16
10
  import SwaggerParser from "@apidevtools/swagger-parser";
@@ -20,16 +14,82 @@ import _ from "lodash";
20
14
  import * as os from "os";
21
15
  import pMap from "p-map";
22
16
  import path from "path";
23
- var log = createLogger("generateApi");
17
+
18
+ // src/shared/formatFile.ts
19
+ import * as child_process from "child_process";
20
+ var log = createLogger("formatFile");
21
+ function formatFile(filename) {
22
+ log.info(`\u5C1D\u8BD5\u683C\u5F0F\u5316\u4EE3\u7801: %s`, filename);
23
+ child_process.exec(`prettier --write '${filename}'`, (error) => {
24
+ if (error) {
25
+ log.error(`\u683C\u5F0F\u5316\u4EE3\u7801\u5931\u8D25: ${error}`);
26
+ log.error(`\u8BF7\u624B\u52A8\u6267\u884C: prettier --write ${filename}`);
27
+ log.error(`\u6216\u8005\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u5173\u95ED\u683C\u5F0F\u5316\u529F\u80FD`);
28
+ } else {
29
+ log.info(`\u683C\u5F0F\u5316\u4EE3\u7801\u6210\u529F: %s`, filename);
30
+ }
31
+ });
32
+ }
33
+
34
+ // src/shared/promptConfigEnable.ts
35
+ import enquirer from "enquirer";
36
+ var { prompt } = enquirer;
37
+ async function promptConfigEnable(opt) {
38
+ const { configArr, getChoiceItem } = opt;
39
+ if (configArr.length <= 1) {
40
+ return configArr;
41
+ }
42
+ const choices = [
43
+ {
44
+ name: "\u5168\u90E8",
45
+ message: "\u5168\u90E8",
46
+ choices: configArr.map((item) => {
47
+ return getChoiceItem(item);
48
+ })
49
+ }
50
+ ];
51
+ const res = await prompt({
52
+ type: "multiselect",
53
+ message: "\u9009\u62E9\u8981\u751F\u6548\u7684\u914D\u7F6E\u9879",
54
+ // @ts-ignore
55
+ hint: "(\u7A7A\u683C\u9009\u4E2D\uFF0C\u56DE\u8F66\u786E\u8BA4)",
56
+ name: "enabled",
57
+ validate(value) {
58
+ return value.length === 0 ? `\u81F3\u5C11\u9009\u62E9\u4E00\u9879` : true;
59
+ },
60
+ choices
61
+ });
62
+ configArr.forEach((item) => {
63
+ item.enabled = opt.checkIsEnabled(res.enabled, item);
64
+ });
65
+ return configArr.filter((c) => c.enabled);
66
+ }
67
+ function promptApiConfigEnable(configArr) {
68
+ return promptConfigEnable({
69
+ configArr: configArr ?? [],
70
+ getChoiceItem: (item) => {
71
+ return {
72
+ name: item.output,
73
+ hint: `swaggerJSONPath: ${item.swaggerJSONPath}`
74
+ };
75
+ },
76
+ checkIsEnabled: (enabledArr, item) => {
77
+ return enabledArr.includes(item.output);
78
+ }
79
+ });
80
+ }
81
+
82
+ // src/commands/generateApi/index.ts
83
+ var log2 = createLogger("generateApi");
24
84
  async function generateApi() {
25
85
  const config = await getConfig();
26
86
  const apiConfigs = await promptApiConfigEnable(config.api);
27
87
  for (const apiConfig of apiConfigs) {
28
- log.info(`\u6E05\u9664\u65E7\u7684 api \u6587\u4EF6\uFF1A${apiConfig.output}`);
88
+ log2.info(`\u6E05\u9664\u65E7\u7684 api \u6587\u4EF6\uFF1A${apiConfig.output}`);
29
89
  await fs.emptydir(apiConfig.output);
30
90
  }
31
91
  for (const apiConfig of apiConfigs) {
32
- log.info("\u5F00\u59CB\u89E3\u6790 %s", apiConfig.swaggerJSONPath);
92
+ log2.info("\u5F00\u59CB\u89E3\u6790 %s", apiConfig.swaggerJSONPath);
33
93
  const dereferenceConfig = _.merge(
34
94
  {
35
95
  resolve: {
@@ -45,7 +105,7 @@ async function generateApi() {
45
105
  dereferenceConfig
46
106
  );
47
107
  await pMap(Object.entries(parsed.paths), async ([url, pathItemObject]) => {
48
- log.info("\u5F00\u59CB\u751F\u6210 %s", url);
108
+ log2.info("\u5F00\u59CB\u751F\u6210 %s", url);
49
109
  if (pathItemObject) {
50
110
  await pMap(
51
111
  ["get", "put", "post", "delete", "patch"],
@@ -74,7 +134,7 @@ async function generateApi() {
74
134
  await formatFile(apiConfig.output);
75
135
  }
76
136
  }
77
- log.info("generateApi Done");
137
+ log2.info("generateApi Done");
78
138
  }
79
139
  async function generateApiRequestCode(options) {
80
140
  var _a, _b;
@@ -98,9 +158,8 @@ async function generateApiRequestCode(options) {
98
158
  );
99
159
  const urlPathParamsCode = urlPathParams.length ? `urlPathParams: ${JSON.stringify(urlPathParams)},` : "";
100
160
  let code = [
101
- "// \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",
161
+ "// do not edit this file manually, it will be overwritten by @dune2/cli",
102
162
  apiConfig.RequestBuilderImportPath,
103
- apiConfig.requestFnImportPath,
104
163
  apiConfig.queryClientImportPath,
105
164
  "/**",
106
165
  ` * ${operationObject.summary}`,
@@ -111,7 +170,6 @@ async function generateApiRequestCode(options) {
111
170
  let builderCode = `export const ${requestBuilderName} = new RequestBuilder({
112
171
  url: '${url}',
113
172
  method: '${method}',
114
- ${apiConfig.requestFnImportPath ? "requestFn," : ""}
115
173
  ${urlPathParamsCode}
116
174
  ${apiConfig.queryClientImportPath ? "queryClient," : ""}
117
175
  });`.replace(/,\n\s*}/, "," + os.EOL + "}");
@@ -209,7 +267,7 @@ async function compileRequestParams(operationObject, generateFieldsMap = false)
209
267
  });
210
268
  }
211
269
  } catch (e) {
212
- log.error("\u751F\u6210\u8BF7\u6C42\u53C2\u6570\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 %o", {
270
+ log2.error("\u751F\u6210\u8BF7\u6C42\u53C2\u6570\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 %o", {
213
271
  summary: operationObject.summary,
214
272
  message: e.message
215
273
  });
@@ -244,31 +302,33 @@ async function compileResponseParams(operationObject, apiConfig) {
244
302
  code += `${os.EOL}export type ResultItem = Res['result'][0]`;
245
303
  }
246
304
  } catch (e) {
247
- log.error("\u8F6C\u6362\u54CD\u5E94\u53C2\u6570\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 %o", {
305
+ log2.error("\u8F6C\u6362\u54CD\u5E94\u53C2\u6570\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 %o", {
248
306
  summary: operationObject.summary,
249
307
  error: e.message
250
308
  });
251
309
  }
252
310
  } else {
253
- log.error("responseSchemaTransformer \u8FD4\u56DE\u503C\u4E3A\u7A7A\uFF0C\u8BF7\u68C0\u67E5");
311
+ log2.error("responseSchemaTransformer \u8FD4\u56DE\u503C\u4E3A\u7A7A\uFF0C\u8BF7\u68C0\u67E5");
254
312
  }
255
313
  }
256
314
  return code ? code : "export type Res = any;";
257
315
  }
258
316
  function markCircularToRef(obj, parentMark = "#", map = /* @__PURE__ */ new Map([[obj, parentMark]]), set = /* @__PURE__ */ new Set([obj])) {
259
- Object.keys(obj).forEach((key) => {
260
- const value = obj[key];
261
- if (typeof value === "object" && !Array.isArray(value)) {
262
- if (set.has(value)) {
263
- obj[key] = { $ref: map.get(value) };
264
- return;
317
+ if (obj && typeof obj === "object") {
318
+ Object.keys(obj).forEach((key) => {
319
+ const value = obj[key];
320
+ if (typeof value === "object" && !Array.isArray(value)) {
321
+ if (set.has(value)) {
322
+ obj[key] = { $ref: map.get(value) };
323
+ return;
324
+ }
325
+ const tempMark = parentMark + "/" + key;
326
+ set.add(value);
327
+ map.set(value, tempMark);
328
+ markCircularToRef(value, tempMark, map, set);
265
329
  }
266
- const tempMark = parentMark + "/" + key;
267
- set.add(value);
268
- map.set(value, tempMark);
269
- markCircularToRef(value, tempMark, map, set);
270
- }
271
- });
330
+ });
331
+ }
272
332
  return map;
273
333
  }
274
334
  export {
@@ -276,4 +336,4 @@ export {
276
336
  generateApiRequestCode,
277
337
  markCircularToRef
278
338
  };
279
- //# sourceMappingURL=generateApi-6O2YBWTL.js.map
339
+ //# sourceMappingURL=generateApi-S77LKSZT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/generateApi/index.ts","../src/shared/formatFile.ts","../src/shared/promptConfigEnable.ts"],"sourcesContent":["import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport fs from \"fs-extra\";\nimport { compile } from \"json-schema-to-typescript\";\nimport _ from \"lodash\";\nimport { OpenAPIV3 } from \"openapi-types\";\nimport * as os from \"os\";\nimport pMap from \"p-map\";\nimport path from \"path\";\nimport { createLogger } from \"../../shared\";\nimport { ApiConfig, getConfig } from \"../../shared/config\";\nimport { formatFile } from \"../../shared/formatFile\";\nimport { promptApiConfigEnable } from \"../../shared/promptConfigEnable\";\n\nconst log = createLogger(\"generateApi\");\n\nexport async function generateApi() {\n const config = await getConfig();\n const apiConfigs = await promptApiConfigEnable(config.api);\n\n for (const apiConfig of apiConfigs) {\n log.info(`清除旧的 api 文件:${apiConfig.output}`);\n await fs.emptydir(apiConfig.output!);\n }\n\n for (const apiConfig of apiConfigs) {\n log.info(\"开始解析 %s\", apiConfig.swaggerJSONPath);\n const dereferenceConfig = _.merge(\n {\n resolve: {\n http: {\n timeout: 30 * 1000,\n },\n },\n },\n apiConfig.dereferenceSwaggerConfig,\n );\n const parsed = (await SwaggerParser.dereference(\n apiConfig.swaggerJSONPath,\n dereferenceConfig,\n )) as OpenAPIV3.Document;\n\n await pMap(Object.entries(parsed.paths), async ([url, pathItemObject]) => {\n log.info(\"开始生成 %s\", url);\n if (pathItemObject) {\n await pMap(\n [\"get\", \"put\", \"post\", \"delete\", \"patch\"],\n async (method) => {\n const operationObject = pathItemObject[method];\n if (operationObject) {\n const code = await generateApiRequestCode({\n url: url,\n method: method,\n operationObject: operationObject,\n apiConfig,\n });\n const outputPath = path\n .join(\n apiConfig.output!,\n url,\n apiConfig.enableTs ? `${method}.ts` : `${method}.js`,\n )\n .replace(/:/g, \"_\");\n await fs.ensureFile(outputPath);\n await fs.writeFile(outputPath, code);\n }\n },\n );\n }\n });\n\n if (apiConfig.format) {\n await formatFile(apiConfig.output!);\n }\n }\n\n log.info(\"generateApi Done\");\n}\n\n/**\n * 根据请求方法,生成请求代码\n */\nexport async function generateApiRequestCode(options: {\n url: string;\n method: string;\n operationObject: OpenAPIV3.OperationObject;\n apiConfig: ApiConfig;\n}): Promise<string> {\n const { method, operationObject, apiConfig } = options;\n\n const url = (() => {\n if (typeof apiConfig.urlTransformer === \"string\") {\n return `${apiConfig.urlTransformer}${options.url}`;\n }\n if (typeof apiConfig.urlTransformer === \"function\") {\n return apiConfig.urlTransformer(options.url);\n }\n return options.url;\n })();\n\n const seeUrl = apiConfig.swaggerUiUrl\n ? `${apiConfig.swaggerUiUrl}#/${operationObject.tags?.join(\"/\") ?? \"\"}/${\n operationObject.operationId\n }`\n : \"\";\n\n // 生成的请求构造器的名称,需要使用原始 url\n let requestBuilderName = _.camelCase(`${options.url}_${method}_api`);\n\n // 判断是否有效的 js 变量\n if (!/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(requestBuilderName)) {\n // 不是有效的 js 变量,使用 _ + 数字\n requestBuilderName = `_${requestBuilderName}`;\n }\n\n //#region url 上参数 例如 /api/v1/users/{userId}\n const urlPathParams = getUrlPathParams(\n (operationObject.parameters as never) ?? [],\n );\n const urlPathParamsCode = urlPathParams.length\n ? `urlPathParams: ${JSON.stringify(urlPathParams)},`\n : \"\";\n //#endregion\n\n let code: string[] = [\n \"// do not edit this file manually, it will be overwritten by @dune2/cli\",\n apiConfig.RequestBuilderImportPath!,\n apiConfig.queryClientImportPath!,\n\n \"/**\",\n ` * ${operationObject.summary}`,\n ` * @tags ${operationObject.tags?.join(\",\")}`,\n seeUrl && ` * @see ${seeUrl}`,\n ` */`,\n ].filter(Boolean);\n\n // builder 代码\n let builderCode = `\\\nexport const ${requestBuilderName} = new RequestBuilder({\n url: '${url}',\n method: '${method}',\n ${urlPathParamsCode}\n ${apiConfig.queryClientImportPath ? \"queryClient,\" : \"\"}\n});`\n // 移除空行\n .replace(/,\\n\\s*}/, \",\" + os.EOL + \"}\");\n if (apiConfig.enableTs) {\n builderCode = builderCode.replace(\n \"new RequestBuilder(\",\n `new RequestBuilder<${requestBuilderName}.Req, ${requestBuilderName}.Res>(`,\n );\n }\n code.push(builderCode);\n\n if (apiConfig.enableTs) {\n // post 和 put 请求需要生成表单 fieldsMap\n const isGenerateFieldsMap = [\"post\", \"put\"].includes(method);\n // 请求参数类型\n // 响应参数类型\n const [requestParamsTypeCode, responseParamsTypeCode] = await Promise.all([\n compileRequestParams(operationObject, isGenerateFieldsMap),\n compileResponseParams(operationObject, apiConfig),\n ]);\n\n code.push(`\nexport namespace ${requestBuilderName} {\n ${requestParamsTypeCode.code}\n \n ${responseParamsTypeCode}\n};`);\n\n if (isGenerateFieldsMap && !_.isEmpty(requestParamsTypeCode.fieldsMap)) {\n // 生成表单 fieldsMap\n code.push(`\nexport const ${requestBuilderName}FieldsMap = ${JSON.stringify(\n requestParamsTypeCode.fieldsMap,\n )} as const\n`);\n }\n }\n\n return code.join(os.EOL);\n}\n\nfunction getUrlPathParams(parameters: OpenAPIV3.ParameterObject[]) {\n return parameters\n .filter((item) => item.in === \"path\")\n .map((item) => item.name);\n}\n\n/**\n * 这个方法还不完善,只能处理简单的请求参数\n */\nasync function compileRequestParams(\n operationObject: OpenAPIV3.OperationObject,\n generateFieldsMap = false,\n) {\n let schema;\n if (operationObject.requestBody) {\n //TODO: 这里也需要处理其他类型\n schema = (operationObject.requestBody as OpenAPIV3.RequestBodyObject)\n .content[\"application/json\"].schema;\n } else if (operationObject.parameters) {\n const extraProperties = {};\n const parameters: OpenAPIV3.ParameterObject[] = [];\n (operationObject.parameters as OpenAPIV3.ParameterObject[]).forEach(\n (item) => {\n if (![\"query\", \"path\"].includes(item.in)) {\n return;\n }\n if (_.get(item.schema, \"type\") === \"object\") {\n // swagger get 请求上 有些参数是 object 类型 应该拍平\n _.assign(extraProperties, _.get(item.schema, \"properties\", {}));\n } else {\n parameters.push(item);\n }\n },\n );\n\n // 必填参数中忽略 分页相关的参数\n const required = parameters\n .filter(\n (p) => p.required && ![\"pageNum\", \"pageSize\", \"count\"].includes(p.name),\n )\n .map((p) => p.name);\n const properties = Object.fromEntries(\n parameters\n // 后端 swagger 可能出现没有 schema 的情况,这里过滤掉\n .filter((p) => !!p.schema)\n .map((p) => {\n //TODO: 这里也要处理 ref 类型\n const schema = p.schema as OpenAPIV3.SchemaObject;\n return [\n p.name,\n {\n ...schema,\n description: p.description,\n // enum: schema.enum ?? [],\n },\n ];\n }),\n );\n schema = {\n required,\n type: \"object\",\n properties: { ...properties, ...extraProperties },\n };\n }\n\n let code = \"\";\n const fieldsMap: Record<string, string> = {};\n if (schema) {\n try {\n code = await compile(schema, \"Req\", {\n bannerComment: \"\",\n ignoreMinAndMaxItems: !!1,\n additionalProperties: false,\n // format: false,\n });\n\n // 判断接口是否是分页请求\n const isPageSearchRequest = (data: any) => {\n // 入参有这些字段就认为是分页查询接口\n const keys = [\"pageNum\", \"pageSize\", \"count\"];\n return (\n _.get(data, \"type\") === \"object\" &&\n _.get(data, \"required\", []).filter((item) => keys.includes(item))\n .length === keys.length\n );\n };\n\n if (generateFieldsMap) {\n // 分页查询接口取 params 字段\n const params = isPageSearchRequest(schema)\n ? _.get(schema, \"properties.params.properties\", {})\n : schema.properties;\n _.forEach(params, (_, field) => {\n fieldsMap[field] = field;\n });\n }\n } catch (e) {\n log.error(\"生成请求参数类型失败,请检查 %o\", {\n summary: operationObject.summary,\n message: e.message,\n });\n }\n }\n\n return {\n code: code || \"export type Req = any;\",\n fieldsMap,\n };\n}\n\nasync function compileResponseParams(\n operationObject: OpenAPIV3.OperationObject,\n apiConfig: ApiConfig,\n) {\n const temp = operationObject.responses[\"200\"] as OpenAPIV3.ResponseObject;\n let code = \"\";\n if (temp?.content) {\n // FIXME: 可能需要处理其他的 content 类型\n const temp2 = temp.content[\"application/json\"] || temp.content[\"*/*\"];\n const schema = temp2.schema as OpenAPIV3.SchemaObject;\n let data = apiConfig.responseSchemaTransformer!(schema);\n if (data) {\n // 这里需要深度 clone 的原因是:\n // 解析出来的 scheme 会尽可能的被复用,导致影响到下次解析\n data = _.cloneDeep(data);\n markCircularToRef(data);\n try {\n code = await compile(data, \"Res\", {\n bannerComment: \"\",\n ignoreMinAndMaxItems: !!1,\n additionalProperties: false,\n // format: false,\n });\n\n // 通过响应数据判断是否是分页查询接口\n const isPageSearchResponse = (data: any) => {\n // 有 result 字段且为数组,就认为是分页查询接口\n return (\n _.get(data, \"type\") === \"object\" &&\n _.get(data, \"properties.result.type\") === \"array\"\n );\n };\n\n // 新增后端分页查询返回的数据类型\n if (isPageSearchResponse(data)) {\n code += `${os.EOL}export type ResultItem = Res['result'][0]`;\n }\n } catch (e) {\n log.error(\"转换响应参数类型失败,请检查 %o\", {\n summary: operationObject.summary,\n error: e.message,\n });\n }\n } else {\n log.error(\"responseSchemaTransformer 返回值为空,请检查\");\n }\n }\n\n return code ? code : \"export type Res = any;\";\n}\n\nexport function markCircularToRef(\n obj,\n parentMark = \"#\",\n map = new Map([[obj, parentMark]]),\n set = new Set([obj]),\n) {\n if (obj && typeof obj === \"object\") {\n Object.keys(obj).forEach((key) => {\n const value = obj[key];\n if (typeof value === \"object\" && !Array.isArray(value)) {\n if (set.has(value)) {\n obj[key] = { $ref: map.get(value) };\n return;\n }\n const tempMark = parentMark + \"/\" + key;\n set.add(value);\n map.set(value, tempMark);\n markCircularToRef(value, tempMark, map, set);\n }\n });\n }\n return map;\n}\n","import { createLogger } from \".\";\nimport * as child_process from \"child_process\";\n\nconst log = createLogger(\"formatFile\");\n\nexport function formatFile(filename: string) {\n // 格式化代码\n log.info(`尝试格式化代码: %s`, filename);\n child_process.exec(`prettier --write '${filename}'`, (error) => {\n if (error) {\n log.error(`格式化代码失败: ${error}`);\n log.error(`请手动执行: prettier --write ${filename}`);\n log.error(`或者在配置文件中关闭格式化功能`);\n } else {\n log.info(`格式化代码成功: %s`, filename);\n }\n });\n}\n","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":"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","names":["log","schema","_","data"]}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,5 @@
1
- import { C as Config } from './types-D01zR42f.js';
2
- export { A as ApiConfig, I as I18nConfig } from './types-D01zR42f.js';
3
- import { GaxiosResponse } from 'gaxios';
4
- import { sheets_v4 } from 'googleapis';
1
+ import { C as Config } from './types-CqBxoc6L.js';
2
+ export { A as ApiConfig, I as I18nConfig } from './types-CqBxoc6L.js';
5
3
  import '@apidevtools/swagger-parser';
6
4
  import 'openapi-types';
7
5
 
@@ -16,36 +14,6 @@ declare function getConfig(): Promise<Config>;
16
14
  */
17
15
  declare function defaultJsonSorter<T extends Record<string, any>>(obj: T): T;
18
16
 
19
- declare class GoogleSheet {
20
- private sheets;
21
- private initPromise;
22
- private initImpl;
23
- /**
24
- * 调用 sheets 其他方法的时候需要先初始化
25
- */
26
- init(): Promise<void>;
27
- get: (options: sheets_v4.Params$Resource$Spreadsheets$Values$Get) => Promise<GaxiosResponse<sheets_v4.Schema$ValueRange>>;
28
- private update;
29
- /**
30
- * 更新某一个单元格
31
- */
32
- updateCell(spreadsheetId: string, range: string, colIndex: number, rowIndex: number, values: string): Promise<GaxiosResponse<sheets_v4.Schema$UpdateValuesResponse>>;
33
- /**
34
- * 更新某一列
35
- */
36
- updateColumn(spreadsheetId: string, range: string, colIndex: number, rowIndex: number, values: string[]): Promise<GaxiosResponse<sheets_v4.Schema$UpdateValuesResponse>>;
37
- /**
38
- * This method is used to get the titles of all the ranges in a Google Spreadsheet.
39
- *
40
- * @async
41
- * @param {string} spreadsheetId - The ID of the Google Spreadsheet.
42
- * @returns {Promise<string[]>} - A promise that resolves to an array of titles of all the ranges in the Google Spreadsheet.
43
- * @throws {Error} - Throws an error if the initialization of the Google Sheets API client fails.
44
- */
45
- getRangeTitles(spreadsheetId: string): Promise<string[] | undefined>;
46
- }
47
- declare const googleSheet: GoogleSheet;
48
-
49
17
  /**
50
18
  *
51
19
  * - input : A
@@ -72,4 +40,4 @@ declare function numberToLetter(n: number): string;
72
40
 
73
41
  declare function resolveSheetId(str?: string): string | undefined;
74
42
 
75
- export { Config, configName, defaultJsonSorter, defineConfig, getConfig, googleSheet, letterToNumber, numberToLetter, resolveSheetId };
43
+ export { Config, configName, defaultJsonSorter, defineConfig, getConfig, letterToNumber, numberToLetter, resolveSheetId };
package/dist/index.js CHANGED
@@ -1,25 +1,45 @@
1
- import {
2
- googleSheet,
3
- letterToNumber,
4
- numberToLetter
5
- } from "./chunk-6UFZ6KLX.js";
6
- import "./chunk-KNC7XY4Z.js";
7
1
  import {
8
2
  configName,
9
3
  defineConfig,
10
4
  getConfig
11
- } from "./chunk-PRJ3NOXB.js";
5
+ } from "./chunk-YZLVO3MA.js";
12
6
  import {
13
7
  defaultJsonSorter,
14
8
  resolveSheetId
15
- } from "./chunk-555YTWSW.js";
16
- import "./chunk-UGSBKD2I.js";
9
+ } from "./chunk-VS4LDXR3.js";
10
+
11
+ // src/shared/letters.ts
12
+ function letterToNumber(letters) {
13
+ if (typeof letters === "number" || !Number.isNaN(+letters)) {
14
+ return +letters;
15
+ }
16
+ let n = 0;
17
+ letters = letters.toUpperCase();
18
+ for (let p = 0; p < letters.length; p++) {
19
+ n = letters[p].charCodeAt(0) - 64 + n * 26;
20
+ }
21
+ return Math.max(0, n - 1);
22
+ }
23
+ var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
24
+ var base = alphabet.length;
25
+ function numberToLetter(n) {
26
+ const digits = [];
27
+ do {
28
+ const v = n % base;
29
+ digits.push(v);
30
+ n = Math.floor(n / base);
31
+ } while (n-- > 0);
32
+ const chars = [];
33
+ while (digits.length) {
34
+ chars.push(alphabet[digits.pop()]);
35
+ }
36
+ return chars.join("");
37
+ }
17
38
  export {
18
39
  configName,
19
40
  defaultJsonSorter,
20
41
  defineConfig,
21
42
  getConfig,
22
- googleSheet,
23
43
  letterToNumber,
24
44
  numberToLetter,
25
45
  resolveSheetId
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../src/shared/letters.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"],"mappings":";;;;;;;;;;;AAWO,SAAS,eAAe,SAA0B;AACvD,MAAI,OAAO,YAAY,YAAY,CAAC,OAAO,MAAM,CAAC,OAAO,GAAG;AAC1D,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,IAAI;AACR,YAAU,QAAQ,YAAY;AAC9B,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,QAAI,QAAQ,CAAC,EAAE,WAAW,CAAC,IAAI,KAAK,IAAI;AAAA,EAC1C;AAEA,SAAO,KAAK,IAAI,GAAG,IAAI,CAAC;AAC1B;AAKA,IAAM,WAAW;AACjB,IAAM,OAAO,SAAS;AAWf,SAAS,eAAe,GAAW;AACxC,QAAM,SAAmB,CAAC;AAE1B,KAAG;AACD,UAAM,IAAI,IAAI;AACd,WAAO,KAAK,CAAC;AACb,QAAI,KAAK,MAAM,IAAI,IAAI;AAAA,EACzB,SAAS,MAAM;AAEf,QAAM,QAAkB,CAAC;AACzB,SAAO,OAAO,QAAQ;AACpB,UAAM,KAAK,SAAS,OAAO,IAAI,CAAE,CAAC;AAAA,EACpC;AAEA,SAAO,MAAM,KAAK,EAAE;AACtB;","names":[]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  configName,
3
3
  getConfig
4
- } from "./chunk-PRJ3NOXB.js";
5
- import "./chunk-555YTWSW.js";
4
+ } from "./chunk-YZLVO3MA.js";
5
+ import "./chunk-VS4LDXR3.js";
6
6
  import {
7
7
  createLogger
8
- } from "./chunk-UGSBKD2I.js";
8
+ } from "./chunk-DORNSRHQ.js";
9
9
 
10
10
  // src/commands/initConfig.ts
11
11
  import fs from "fs-extra";
@@ -31,4 +31,4 @@ var initConfig = async () => {
31
31
  export {
32
32
  initConfig
33
33
  };
34
- //# sourceMappingURL=initConfig-5VN3U4OF.js.map
34
+ //# sourceMappingURL=initConfig-NHHN2HCE.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cli,
3
3
  createLogger
4
- } from "./chunk-UGSBKD2I.js";
4
+ } from "./chunk-DORNSRHQ.js";
5
5
 
6
6
  // src/commands/interactive.ts
7
7
  import enquirer from "enquirer";
@@ -40,4 +40,4 @@ var interactive = async (args) => {
40
40
  export {
41
41
  interactive
42
42
  };
43
- //# sourceMappingURL=interactive-HNOHT33A.js.map
43
+ //# sourceMappingURL=interactive-BVOA3VKY.js.map
@@ -1,4 +1,4 @@
1
- import { C as Config, A as ApiConfig } from './types-D01zR42f.js';
1
+ import { C as Config, A as ApiConfig } from './types-CqBxoc6L.js';
2
2
  import '@apidevtools/swagger-parser';
3
3
  import 'openapi-types';
4
4
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  apiConfigNormalizer,
3
3
  normalizeConfig
4
- } from "./chunk-555YTWSW.js";
4
+ } from "./chunk-VS4LDXR3.js";
5
5
  export {
6
6
  apiConfigNormalizer,
7
7
  normalizeConfig
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/prettier.ts","../src/shared/defaultJsonSorter.ts"],"names":[],"mappings":";AACA,SAAS,WAAW,uBAAuB;;;ACD3C,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;;;ADZA,IAAM,cAAc;AAEpB,IAAM,aAAa,gBAAgB;AAG5B,IAAM,YAAiC;AAAA,EAC5C;AAAA,IACE,MAAM;AAAA,IACN,SAAS,CAAC,MAAM;AAAA,IAChB,YAAY,CAAC,WAAW;AAAA,EAC1B;AACF;AAQO,IAAM,UAA6B;AAAA,EACxC,MAAM;AAAA,IACJ,GAAG;AAAA,IACH,WAAW,MAAM,SAAS;AACxB,UAAI,WAAW,YAAY;AACzB,eAAO,WAAW,WAAW,MAAM,OAAO;AAAA,MAC5C;AACA,YAAM,aAAa,QAAQ,SAAS,SAAS,WAAW;AACxD,UAAI,YAAY;AACd,YAAI;AACF,cAAI,MAAM,KAAK,MAAM,IAAI;AACzB,cAAI,SAAS,kBAAkB,GAAG;AAClC,iBAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,QACvC,SAAS,OAAO;AACd,kBAAQ,IAAI,sCAAa,KAAK,EAAE;AAAA,QAClC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF","sourcesContent":["import { Plugin } from \"prettier\";\nimport { parsers as prettierParsers } from \"prettier/plugins/babel\";\nimport { defaultJsonSorter } from \"./shared/defaultJsonSorter\";\n\nconst i18nJsonExt = \".i18n.json\";\n\nconst jsonParser = prettierParsers.json;\n\n// 配置 i18n.json\nexport const languages: Plugin[\"languages\"] = [\n {\n name: \"dune-i18n-json\",\n parsers: [\"json\"],\n extensions: [i18nJsonExt],\n },\n];\n\n/**\n * 格式化 *.i18n.json 文件\n * 按照 key 排序\n * 对齐 cli 生成的 i18n.json 文件顺序\n * 方便查看和比较\n */\nexport const parsers: Plugin[\"parsers\"] = {\n json: {\n ...jsonParser,\n preprocess(text, options) {\n if (jsonParser.preprocess) {\n text = jsonParser.preprocess(text, options);\n }\n const isI18nJson = options.filepath.endsWith(i18nJsonExt);\n if (isI18nJson) {\n try {\n let obj = JSON.parse(text);\n let newObj = defaultJsonSorter(obj);\n text = JSON.stringify(newObj, null, 2);\n } catch (error) {\n console.log(`JSON 格式错误:${error}`);\n }\n }\n return text;\n },\n },\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"]}
1
+ {"version":3,"sources":["/Users/Leon.Liao-zd/work/github/next-tools/packages/cli/dist/prettier.cjs","../src/prettier.ts","../src/shared/defaultJsonSorter.ts"],"names":[],"mappings":"AAAA;ACCA,+CAA2C;ADC3C;AACA;AEHA,gFAAc;AAOP,SAAS,iBAAA,CAAiD,GAAA,EAAQ;AACvE,EAAA,MAAM,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,MAAM,WAAA,EAAa,gBAAA,CAAE,MAAA,CAAO,IAAI,CAAA;AAChC,EAAA,MAAM,UAAA,EAAY,UAAA,CAAW,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,EAAA,GAAQ;AAChD,IAAA,GAAA,CAAI,GAAc,EAAA,EAAI,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,CAAM,CAAA;AAEV,EAAA,OAAO,SAAA;AACT;AFFA;AACA;ACXA,IAAM,YAAA,EAAc,YAAA;AAEpB,IAAM,WAAA,EAAa,cAAA,CAAgB,IAAA;AAG5B,IAAM,UAAA,EAAiC;AAAA,EAC5C;AAAA,IACE,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,IAChB,UAAA,EAAY,CAAC,WAAW;AAAA,EAC1B;AACF,CAAA;AAQO,IAAM,QAAA,EAA6B;AAAA,EACxC,IAAA,EAAM;AAAA,IACJ,GAAG,UAAA;AAAA,IACH,UAAA,CAAW,IAAA,EAAM,OAAA,EAAS;AACxB,MAAA,GAAA,CAAI,UAAA,CAAW,UAAA,EAAY;AACzB,QAAA,KAAA,EAAO,UAAA,CAAW,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AAAA,MAC5C;AACA,MAAA,MAAM,WAAA,EAAa,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,WAAW,CAAA;AACxD,MAAA,GAAA,CAAI,UAAA,EAAY;AACd,QAAA,IAAI;AACF,UAAA,IAAI,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACzB,UAAA,IAAI,OAAA,EAAS,iBAAA,CAAkB,GAAG,CAAA;AAClC,UAAA,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,QACvC,EAAA,MAAA,CAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mCAAA,EAAa,KAAK,CAAA,CAAA;AAChC,QAAA;AACF,MAAA;AACO,MAAA;AACT,IAAA;AACF,EAAA;AACF;ADGkE;AACA;AACA;AACA","file":"/Users/Leon.Liao-zd/work/github/next-tools/packages/cli/dist/prettier.cjs","sourcesContent":[null,"import { Plugin } from \"prettier\";\nimport { parsers as prettierParsers } from \"prettier/plugins/babel\";\nimport { defaultJsonSorter } from \"./shared/defaultJsonSorter\";\n\nconst i18nJsonExt = \".i18n.json\";\n\nconst jsonParser = prettierParsers.json;\n\n// 配置 i18n.json\nexport const languages: Plugin[\"languages\"] = [\n {\n name: \"dune-i18n-json\",\n parsers: [\"json\"],\n extensions: [i18nJsonExt],\n },\n];\n\n/**\n * 格式化 *.i18n.json 文件\n * 按照 key 排序\n * 对齐 cli 生成的 i18n.json 文件顺序\n * 方便查看和比较\n */\nexport const parsers: Plugin[\"parsers\"] = {\n json: {\n ...jsonParser,\n preprocess(text, options) {\n if (jsonParser.preprocess) {\n text = jsonParser.preprocess(text, options);\n }\n const isI18nJson = options.filepath.endsWith(i18nJsonExt);\n if (isI18nJson) {\n try {\n let obj = JSON.parse(text);\n let newObj = defaultJsonSorter(obj);\n text = JSON.stringify(newObj, null, 2);\n } catch (error) {\n console.log(`JSON 格式错误:${error}`);\n }\n }\n return text;\n },\n },\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"]}
@@ -81,18 +81,6 @@ interface ApiConfig {
81
81
  * @default "./src/apis"
82
82
  */
83
83
  output?: string;
84
- /**
85
- * 配置`requestFn` 方法引入的路径,生成的代码里会用到,生成代码如下
86
- * 导入的变量必须是命名为`requestFn`
87
- * ```ts
88
- * // 需要命名为 requestFn
89
- * import requestFn from '@/utils/request'
90
- * import { foo as requestFn } from '@/utils/request'
91
- * ```
92
- * @default `import requestFn from '@/utils/request'`
93
- * @deprecated 优先使用 `urlTransformer`
94
- */
95
- requestFnImportPath?: string;
96
84
  /**
97
85
  * 配置`queryClient` 路径,导入的变量必须是命名为`queryClient`
98
86
  * @example `import queryClient from '@/utils/request'`