@dune2/cli 1.0.2 → 1.1.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-OZFFB6QC.js → chunk-LED5RL6G.js} +2 -1
- package/dist/chunk-LED5RL6G.js.map +1 -0
- package/dist/{chunk-XGRSH7MZ.js → chunk-QTJOKLCQ.js} +3 -2
- package/dist/{chunk-XGRSH7MZ.js.map → chunk-QTJOKLCQ.js.map} +1 -1
- package/dist/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- package/dist/{generateApi-6GDO7LS5.js → generateApi-IM4NSUPI.js} +19 -28
- package/dist/generateApi-IM4NSUPI.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/{initConfig-JLWK42R5.js → initConfig-IYF6IWJQ.js} +7 -9
- package/dist/initConfig-IYF6IWJQ.js.map +1 -0
- package/dist/normalizeConfig.d.ts +1 -1
- package/dist/normalizeConfig.js +1 -1
- package/dist/prettier.cjs +2 -2
- package/dist/prettier.cjs.map +1 -1
- package/dist/prettier.js +2 -2
- package/dist/prettier.js.map +1 -1
- package/dist/{types-BzjIgVkF.d.ts → types-BH4uOlKu.d.ts} +6 -1
- package/package.json +2 -3
- package/dist/chunk-OZFFB6QC.js.map +0 -1
- package/dist/generateApi-6GDO7LS5.js.map +0 -1
- package/dist/initConfig-JLWK42R5.js.map +0 -1
- package/dist/prettier.d.cts +0 -12
- package/dist/prettier.d.ts +0 -12
|
@@ -10,6 +10,7 @@ function normalizeConfig(config) {
|
|
|
10
10
|
function apiConfigNormalizer(item) {
|
|
11
11
|
item.output ??= "./src/apis";
|
|
12
12
|
item.RequestBuilderImportPath ??= `import { RequestBuilder } from '@dune2/tools/rq';`;
|
|
13
|
+
item.FieldsMapImportPath ??= `import { type FieldsMap, fieldsMap } from '@dune2/tools/factory/fieldsMap';`;
|
|
13
14
|
item.enableTs ??= true;
|
|
14
15
|
item.enabled ??= true;
|
|
15
16
|
item.format ??= true;
|
|
@@ -24,4 +25,4 @@ export {
|
|
|
24
25
|
normalizeConfig,
|
|
25
26
|
apiConfigNormalizer
|
|
26
27
|
};
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
28
|
+
//# sourceMappingURL=chunk-LED5RL6G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/config/normalizeConfig.ts"],"sourcesContent":["import path from \"path\";\nimport { ApiConfig, Config } from \"./types\";\nexport function normalizeConfig(config: Config): Config {\n config.cwd ??= process.cwd();\n config.cacheDir ??= path.join(config.cwd, \"node_modules/.cache/dune-cli\");\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.FieldsMapImportPath ??= `import { type FieldsMap, fieldsMap } from '@dune2/tools/factory/fieldsMap';`;\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"],"mappings":";AAAA,OAAO,UAAU;AAEV,SAAS,gBAAgB,QAAwB;AACtD,SAAO,QAAQ,QAAQ,IAAI;AAC3B,SAAO,aAAa,KAAK,KAAK,OAAO,KAAK,8BAA8B;AAGxE,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,wBAAwB;AAC7B,OAAK,aAAa;AAClB,OAAK,YAAY;AACjB,OAAK,WAAW;AAChB,OAAK,8BAA8B,CAAC,WAAQ;AAnB9C;AAoBI,yBAAO,eAAP,mBAAmB,SAAQ;AAAA;AAC7B,SAAO;AACT;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
normalizeConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-LED5RL6G.js";
|
|
4
4
|
|
|
5
5
|
// src/shared/config/index.ts
|
|
6
6
|
import { createJiti } from "jiti";
|
|
@@ -15,6 +15,7 @@ async function getConfig() {
|
|
|
15
15
|
default: true
|
|
16
16
|
}).catch((err) => {
|
|
17
17
|
console.warn(`can not find config file: ${configName} in ${cwd}`);
|
|
18
|
+
console.warn(`please run "dune init" to create config file`);
|
|
18
19
|
return {};
|
|
19
20
|
});
|
|
20
21
|
return normalizeConfig(res);
|
|
@@ -25,4 +26,4 @@ export {
|
|
|
25
26
|
configName,
|
|
26
27
|
getConfig
|
|
27
28
|
};
|
|
28
|
-
//# sourceMappingURL=chunk-
|
|
29
|
+
//# sourceMappingURL=chunk-QTJOKLCQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/config/index.ts"],"sourcesContent":["import { createJiti } from \"jiti\";\nimport { normalizeConfig } from \"./normalizeConfig\";\nimport { Config } from \"./types\";\n\nexport * from \"./types\";\n\nexport function defineConfig<T extends Config = Config>(c: T) {\n return c;\n}\n\nexport const configName = \"dune.config.ts\";\n\nexport async function getConfig(): Promise<Config> {\n const cwd = process.cwd();\n const jiti = createJiti(cwd);\n\n const res = await jiti\n .import<Config>(`./${configName}`, {\n default: true,\n })\n .catch((err) => {\n console.warn(`can not find config file: ${configName} in ${cwd}`);\n return {};\n });\n\n return normalizeConfig(res);\n}\n"],"mappings":";;;;;AAAA,SAAS,kBAAkB;AAMpB,SAAS,aAAwC,GAAM;AAC5D,SAAO;AACT;AAEO,IAAM,aAAa;AAE1B,eAAsB,YAA6B;AACjD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,OAAO,WAAW,GAAG;AAE3B,QAAM,MAAM,MAAM,KACf,OAAe,KAAK,UAAU,IAAI;AAAA,IACjC,SAAS;AAAA,EACX,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,YAAQ,KAAK,6BAA6B,UAAU,OAAO,GAAG,EAAE;AAChE,WAAO,CAAC;AAAA,EACV,CAAC;AAEH,SAAO,gBAAgB,GAAG;AAC5B;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/config/index.ts"],"sourcesContent":["import { createJiti } from \"jiti\";\nimport { normalizeConfig } from \"./normalizeConfig\";\nimport { Config } from \"./types\";\n\nexport * from \"./types\";\n\nexport function defineConfig<T extends Config = Config>(c: T) {\n return c;\n}\n\nexport const configName = \"dune.config.ts\";\n\nexport async function getConfig(): Promise<Config> {\n const cwd = process.cwd();\n const jiti = createJiti(cwd);\n\n const res = await jiti\n .import<Config>(`./${configName}`, {\n default: true,\n })\n .catch((err) => {\n console.warn(`can not find config file: ${configName} in ${cwd}`);\n console.warn(`please run \"dune init\" to create config file`);\n return {};\n });\n\n return normalizeConfig(res);\n}\n"],"mappings":";;;;;AAAA,SAAS,kBAAkB;AAMpB,SAAS,aAAwC,GAAM;AAC5D,SAAO;AACT;AAEO,IAAM,aAAa;AAE1B,eAAsB,YAA6B;AACjD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,OAAO,WAAW,GAAG;AAE3B,QAAM,MAAM,MAAM,KACf,OAAe,KAAK,UAAU,IAAI;AAAA,IACjC,SAAS;AAAA,EACX,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,YAAQ,KAAK,6BAA6B,UAAU,OAAO,GAAG,EAAE;AAChE,YAAQ,KAAK,8CAA8C;AAC3D,WAAO,CAAC;AAAA,EACV,CAAC;AAEH,SAAO,gBAAgB,GAAG;AAC5B;","names":[]}
|
package/dist/cli.js
CHANGED
|
@@ -4,15 +4,15 @@ import {
|
|
|
4
4
|
} from "./chunk-ENF3KHSQ.js";
|
|
5
5
|
|
|
6
6
|
// package.json
|
|
7
|
-
var version = "1.0.
|
|
7
|
+
var version = "1.0.2";
|
|
8
8
|
|
|
9
9
|
// src/cli.ts
|
|
10
10
|
cli.command("generateApi", "\u751F\u6210 api \u6587\u4EF6").example("dune generateApi").action(async () => {
|
|
11
|
-
const { generateApi } = await import("./generateApi-
|
|
11
|
+
const { generateApi } = await import("./generateApi-IM4NSUPI.js");
|
|
12
12
|
await generateApi();
|
|
13
13
|
});
|
|
14
14
|
cli.command("init", "\u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6").example("dune init").action(async () => {
|
|
15
|
-
const { initConfig } = await import("./initConfig-
|
|
15
|
+
const { initConfig } = await import("./initConfig-IYF6IWJQ.js");
|
|
16
16
|
await initConfig();
|
|
17
17
|
});
|
|
18
18
|
cli.command("interactive", "\u4EA4\u4E92\u5F0F\u64CD\u4F5C").example("dune interactive").alias("i").action(async (args) => {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"@dune2/cli\",\n \"version\": \"1.0.
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"@dune2/cli\",\n \"version\": \"1.0.2\",\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\": \"tsup --splitting --clean\",\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\": \"^12\",\n \"cac\": \"^6.7.14\",\n \"debug\": \"^4.3.4\",\n \"enquirer\": \"^2.3.6\",\n \"es-toolkit\": \"^1\",\n \"jiti\": \"^2.4.2\",\n \"json-schema-to-typescript\": \"15.0.0\",\n \"p-map\": \"^7.0.2\"\n },\n \"devDependencies\": {\n \"@types/debug\": \"^4.1.7\",\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,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getConfig
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-QTJOKLCQ.js";
|
|
4
|
+
import "./chunk-LED5RL6G.js";
|
|
5
5
|
import {
|
|
6
6
|
createLogger
|
|
7
7
|
} from "./chunk-ENF3KHSQ.js";
|
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
// src/commands/generateApi/index.ts
|
|
10
10
|
import SwaggerParser from "@apidevtools/swagger-parser";
|
|
11
11
|
import { camelCase, cloneDeep, merge } from "es-toolkit";
|
|
12
|
-
import fs from "fs-extra";
|
|
13
12
|
import { compile } from "json-schema-to-typescript";
|
|
13
|
+
import fs from "fs/promises";
|
|
14
14
|
import * as os from "os";
|
|
15
15
|
import pMap from "p-map";
|
|
16
16
|
import path from "path";
|
|
@@ -86,7 +86,8 @@ async function generateApi() {
|
|
|
86
86
|
const apiConfigs = await promptApiConfigEnable(config.api);
|
|
87
87
|
for (const apiConfig of apiConfigs) {
|
|
88
88
|
log2.info(`\u6E05\u9664\u65E7\u7684 api \u6587\u4EF6\uFF1A${apiConfig.output}`);
|
|
89
|
-
await fs.
|
|
89
|
+
await fs.rm(apiConfig.output, { recursive: true, force: true });
|
|
90
|
+
await fs.mkdir(apiConfig.output, { recursive: true });
|
|
90
91
|
}
|
|
91
92
|
for (const apiConfig of apiConfigs) {
|
|
92
93
|
log2.info("\u5F00\u59CB\u89E3\u6790 %s", apiConfig.swaggerJSONPath);
|
|
@@ -123,7 +124,7 @@ async function generateApi() {
|
|
|
123
124
|
url,
|
|
124
125
|
apiConfig.enableTs ? `${method}.ts` : `${method}.js`
|
|
125
126
|
).replace(/:/g, "_");
|
|
126
|
-
await fs.
|
|
127
|
+
await fs.mkdir(path.dirname(outputPath), { recursive: true });
|
|
127
128
|
await fs.writeFile(outputPath, code);
|
|
128
129
|
}
|
|
129
130
|
}
|
|
@@ -148,7 +149,9 @@ async function generateApiRequestCode(options) {
|
|
|
148
149
|
}
|
|
149
150
|
return options.url;
|
|
150
151
|
})();
|
|
151
|
-
const seeUrl = apiConfig.swaggerUiUrl ? `${apiConfig.swaggerUiUrl}#/${(
|
|
152
|
+
const seeUrl = apiConfig.swaggerUiUrl ? `${apiConfig.swaggerUiUrl}#/${encodeURIComponent(
|
|
153
|
+
`${((_a = operationObject.tags) == null ? void 0 : _a.join("/")) ?? ""}/${operationObject.operationId}`
|
|
154
|
+
)}` : "";
|
|
152
155
|
let requestBuilderName = camelCase(`${options.url}_${method}_api`);
|
|
153
156
|
if (!/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(requestBuilderName)) {
|
|
154
157
|
requestBuilderName = `_${requestBuilderName}`;
|
|
@@ -157,10 +160,12 @@ async function generateApiRequestCode(options) {
|
|
|
157
160
|
operationObject.parameters ?? []
|
|
158
161
|
);
|
|
159
162
|
const urlPathParamsCode = urlPathParams.length ? `urlPathParams: ${JSON.stringify(urlPathParams)},` : "";
|
|
163
|
+
const shouldGenerateFieldsMap = apiConfig.enableTs && ["post", "put"].includes(method.toLowerCase());
|
|
160
164
|
let code = [
|
|
161
165
|
"// do not edit this file manually, it will be overwritten by @dune2/cli",
|
|
162
166
|
apiConfig.RequestBuilderImportPath,
|
|
163
167
|
apiConfig.queryClientImportPath,
|
|
168
|
+
shouldGenerateFieldsMap ? apiConfig.FieldsMapImportPath : "",
|
|
164
169
|
"/**",
|
|
165
170
|
` * ${operationObject.summary}`,
|
|
166
171
|
` * @tags ${(_b = operationObject.tags) == null ? void 0 : _b.join(",")}`,
|
|
@@ -181,9 +186,10 @@ async function generateApiRequestCode(options) {
|
|
|
181
186
|
}
|
|
182
187
|
code.push(builderCode);
|
|
183
188
|
if (apiConfig.enableTs) {
|
|
184
|
-
const isGenerateFieldsMap = ["post", "put"].includes(method);
|
|
185
189
|
const [requestParamsTypeCode, responseParamsTypeCode] = await Promise.all([
|
|
186
|
-
|
|
190
|
+
// 请求参数类型
|
|
191
|
+
compileRequestParams(operationObject),
|
|
192
|
+
// 响应参数类型
|
|
187
193
|
compileResponseParams(operationObject, apiConfig)
|
|
188
194
|
]);
|
|
189
195
|
code.push(`
|
|
@@ -192,11 +198,9 @@ export namespace ${requestBuilderName} {
|
|
|
192
198
|
|
|
193
199
|
${responseParamsTypeCode}
|
|
194
200
|
};`);
|
|
195
|
-
if (
|
|
201
|
+
if (shouldGenerateFieldsMap) {
|
|
196
202
|
code.push(`
|
|
197
|
-
export const ${requestBuilderName}FieldsMap =
|
|
198
|
-
requestParamsTypeCode.fieldsMap
|
|
199
|
-
)} as const
|
|
203
|
+
export const ${requestBuilderName}FieldsMap = fieldsMap as FieldsMap<${requestBuilderName}.Req>
|
|
200
204
|
`);
|
|
201
205
|
}
|
|
202
206
|
}
|
|
@@ -205,8 +209,7 @@ export const ${requestBuilderName}FieldsMap = ${JSON.stringify(
|
|
|
205
209
|
function getUrlPathParams(parameters) {
|
|
206
210
|
return parameters.filter((item) => item.in === "path").map((item) => item.name);
|
|
207
211
|
}
|
|
208
|
-
async function compileRequestParams(operationObject
|
|
209
|
-
var _a, _b;
|
|
212
|
+
async function compileRequestParams(operationObject) {
|
|
210
213
|
let schema;
|
|
211
214
|
if (operationObject.requestBody) {
|
|
212
215
|
schema = operationObject.requestBody.content["application/json"].schema;
|
|
@@ -251,7 +254,6 @@ async function compileRequestParams(operationObject, generateFieldsMap = false)
|
|
|
251
254
|
};
|
|
252
255
|
}
|
|
253
256
|
let code = "";
|
|
254
|
-
const fieldsMap = {};
|
|
255
257
|
if (schema) {
|
|
256
258
|
try {
|
|
257
259
|
code = await compile(schema, "Req", {
|
|
@@ -260,16 +262,6 @@ async function compileRequestParams(operationObject, generateFieldsMap = false)
|
|
|
260
262
|
additionalProperties: false
|
|
261
263
|
// format: false,
|
|
262
264
|
});
|
|
263
|
-
const isPageSearchRequest = (data) => {
|
|
264
|
-
const keys = ["pageNum", "pageSize", "count"];
|
|
265
|
-
return data.type === "object" && (data.required || []).filter((item) => keys.includes(item)).length === keys.length;
|
|
266
|
-
};
|
|
267
|
-
if (generateFieldsMap) {
|
|
268
|
-
const params = isPageSearchRequest(schema) ? ((_b = (_a = schema.properties) == null ? void 0 : _a.params) == null ? void 0 : _b.properties) || {} : schema.properties;
|
|
269
|
-
Object.keys(params || {}).forEach((field) => {
|
|
270
|
-
fieldsMap[field] = field;
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
265
|
} catch (e) {
|
|
274
266
|
log2.error("\u751F\u6210\u8BF7\u6C42\u53C2\u6570\u7C7B\u578B\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 %o", {
|
|
275
267
|
summary: operationObject.summary,
|
|
@@ -278,8 +270,7 @@ async function compileRequestParams(operationObject, generateFieldsMap = false)
|
|
|
278
270
|
}
|
|
279
271
|
}
|
|
280
272
|
return {
|
|
281
|
-
code: code || "export type Req = any;"
|
|
282
|
-
fieldsMap
|
|
273
|
+
code: code || "export type Req = any;"
|
|
283
274
|
};
|
|
284
275
|
}
|
|
285
276
|
async function compileResponseParams(operationObject, apiConfig) {
|
|
@@ -341,4 +332,4 @@ export {
|
|
|
341
332
|
generateApiRequestCode,
|
|
342
333
|
markCircularToRef
|
|
343
334
|
};
|
|
344
|
-
//# sourceMappingURL=generateApi-
|
|
335
|
+
//# sourceMappingURL=generateApi-IM4NSUPI.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 { camelCase, cloneDeep, merge } from \"es-toolkit\";\nimport { compile } from \"json-schema-to-typescript\";\nimport fs from \"node:fs/promises\";\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.rm(apiConfig.output!, { recursive: true, force: true });\n await fs.mkdir(apiConfig.output!, { recursive: true });\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.mkdir(path.dirname(outputPath), { recursive: true });\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}#/${encodeURIComponent(\n `${operationObject.tags?.join(\"/\") ?? \"\"}/${\n operationObject.operationId\n }`,\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 const shouldGenerateFieldsMap =\n apiConfig.enableTs && [\"post\", \"put\"].includes(method.toLowerCase());\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 shouldGenerateFieldsMap ? apiConfig.FieldsMapImportPath! : \"\",\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 const [requestParamsTypeCode, responseParamsTypeCode] = await Promise.all([\n // 请求参数类型\n compileRequestParams(operationObject),\n // 响应参数类型\n compileResponseParams(operationObject, apiConfig),\n ]);\n\n code.push(`\nexport namespace ${requestBuilderName} {\n ${requestParamsTypeCode.code}\n \n ${responseParamsTypeCode}\n};`);\n\n if (shouldGenerateFieldsMap) {\n // 生成表单 fieldsMap\n code.push(`\nexport const ${requestBuilderName}FieldsMap = fieldsMap as FieldsMap<${requestBuilderName}.Req>\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) {\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 (\n item.schema &&\n \"type\" in item.schema &&\n item.schema.type === \"object\"\n ) {\n // swagger get 请求上 有些参数是 object 类型 应该拍平\n Object.assign(\n extraProperties,\n (item.schema as OpenAPIV3.SchemaObject).properties || {},\n );\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 if (schema) {\n try {\n code = await compile(schema, \"Req\", {\n bannerComment: \"\",\n ignoreMinAndMaxItems: !!1,\n additionalProperties: false,\n // format: false,\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 };\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 data.type === \"object\" && 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 } 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 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,5 +1,5 @@
|
|
|
1
|
-
import { C as Config } from './types-
|
|
2
|
-
export { A as ApiConfig } from './types-
|
|
1
|
+
import { C as Config } from './types-BH4uOlKu.js';
|
|
2
|
+
export { A as ApiConfig } from './types-BH4uOlKu.js';
|
|
3
3
|
import '@apidevtools/swagger-parser';
|
|
4
4
|
import 'openapi-types';
|
|
5
5
|
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
|
-
configName
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import "./chunk-OZFFB6QC.js";
|
|
2
|
+
configName
|
|
3
|
+
} from "./chunk-QTJOKLCQ.js";
|
|
4
|
+
import "./chunk-LED5RL6G.js";
|
|
6
5
|
import {
|
|
7
6
|
createLogger
|
|
8
7
|
} from "./chunk-ENF3KHSQ.js";
|
|
9
8
|
|
|
10
9
|
// src/commands/initConfig.ts
|
|
11
|
-
import fs from "fs
|
|
10
|
+
import fs from "fs/promises";
|
|
12
11
|
import path from "path";
|
|
13
12
|
var log = createLogger("initConfig");
|
|
14
13
|
var tpl = `import { defineConfig } from "@dune2/cli";
|
|
@@ -18,10 +17,9 @@ export default defineConfig({
|
|
|
18
17
|
api: [],
|
|
19
18
|
});`;
|
|
20
19
|
var initConfig = async () => {
|
|
21
|
-
const
|
|
22
|
-
const configPath = path.join(config.cwd, configName);
|
|
20
|
+
const configPath = path.join(process.cwd(), configName);
|
|
23
21
|
log.info(`config file path: ${configPath}`);
|
|
24
|
-
if (await fs.
|
|
22
|
+
if (await fs.access(configPath).then(() => true).catch(() => false)) {
|
|
25
23
|
log.info(`config file already exists, skip`);
|
|
26
24
|
return;
|
|
27
25
|
}
|
|
@@ -31,4 +29,4 @@ var initConfig = async () => {
|
|
|
31
29
|
export {
|
|
32
30
|
initConfig
|
|
33
31
|
};
|
|
34
|
-
//# sourceMappingURL=initConfig-
|
|
32
|
+
//# sourceMappingURL=initConfig-IYF6IWJQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/initConfig.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"path\";\nimport { createLogger } from \"../shared\";\nimport { configName } from \"../shared/config\";\n\nconst log = createLogger(\"initConfig\");\n\nconst tpl = `\\\nimport { defineConfig } from \"@dune2/cli\";\n\nexport default defineConfig({\n i18n: [],\n api: [],\n});`;\n\nexport const initConfig = async () => {\n const configPath = path.join(process.cwd(), configName);\n log.info(`config file path: ${configPath}`);\n if (\n await fs\n .access(configPath)\n .then(() => true)\n .catch(() => false)\n ) {\n log.info(`config file already exists, skip`);\n return;\n }\n await fs.writeFile(configPath, tpl);\n log.info(`config file created`);\n};\n"],"mappings":";;;;;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAIjB,IAAM,MAAM,aAAa,YAAY;AAErC,IAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAQL,IAAM,aAAa,YAAY;AACpC,QAAM,aAAa,KAAK,KAAK,QAAQ,IAAI,GAAG,UAAU;AACtD,MAAI,KAAK,qBAAqB,UAAU,EAAE;AAC1C,MACE,MAAM,GACH,OAAO,UAAU,EACjB,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK,GACpB;AACA,QAAI,KAAK,kCAAkC;AAC3C;AAAA,EACF;AACA,QAAM,GAAG,UAAU,YAAY,GAAG;AAClC,MAAI,KAAK,qBAAqB;AAChC;","names":[]}
|
package/dist/normalizeConfig.js
CHANGED
package/dist/prettier.cjs
CHANGED
|
@@ -25,9 +25,9 @@ var languages = [
|
|
|
25
25
|
var parsers = {
|
|
26
26
|
json: {
|
|
27
27
|
...jsonParser,
|
|
28
|
-
preprocess(text, options) {
|
|
28
|
+
async preprocess(text, options) {
|
|
29
29
|
if (jsonParser.preprocess) {
|
|
30
|
-
text = jsonParser.preprocess(text, options);
|
|
30
|
+
text = await jsonParser.preprocess(text, options);
|
|
31
31
|
}
|
|
32
32
|
const isI18nJson = options.filepath.endsWith(i18nJsonExt);
|
|
33
33
|
if (isI18nJson) {
|
package/dist/prettier.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;AEEO,SAAS,iBAAA,CAAiD,GAAA,EAAQ;AACvE,EAAA,MAAM,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,MAAM,WAAA,EAAa,IAAA,CAAK,IAAA,CAAK,CAAA;AAC7B,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;AFDA;AACA;ACVA,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;
|
|
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;AEEO,SAAS,iBAAA,CAAiD,GAAA,EAAQ;AACvE,EAAA,MAAM,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC5B,EAAA,MAAM,WAAA,EAAa,IAAA,CAAK,IAAA,CAAK,CAAA;AAC7B,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;AFDA;AACA;ACVA,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,MAAM,UAAA,CAAW,IAAA,EAAM,OAAA,EAAS;AAC9B,MAAA,GAAA,CAAI,UAAA,CAAW,UAAA,EAAY;AACzB,QAAA,KAAA,EAAO,MAAM,UAAA,CAAW,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AAAA,MAClD;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;ADEkE;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 async preprocess(text, options) {\n if (jsonParser.preprocess) {\n text = await 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","/**\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 = keys.sort(); // 使用原生 sort 方法对键进行排序\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"]}
|
package/dist/prettier.js
CHANGED
|
@@ -25,9 +25,9 @@ var languages = [
|
|
|
25
25
|
var parsers = {
|
|
26
26
|
json: {
|
|
27
27
|
...jsonParser,
|
|
28
|
-
preprocess(text, options) {
|
|
28
|
+
async preprocess(text, options) {
|
|
29
29
|
if (jsonParser.preprocess) {
|
|
30
|
-
text = jsonParser.preprocess(text, options);
|
|
30
|
+
text = await jsonParser.preprocess(text, options);
|
|
31
31
|
}
|
|
32
32
|
const isI18nJson = options.filepath.endsWith(i18nJsonExt);
|
|
33
33
|
if (isI18nJson) {
|
package/dist/prettier.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/prettier.ts","../src/shared/defaultJsonSorter.ts"],"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","/**\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 = keys.sort(); // 使用原生 sort 方法对键进行排序\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"],"mappings":";AACA,SAAS,WAAW,uBAAuB;;;ACIpC,SAAS,kBAAiD,KAAQ;AACvE,QAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,QAAM,aAAa,KAAK,KAAK;AAC7B,QAAM,YAAY,WAAW,OAAO,CAAC,KAAK,QAAQ;AAChD,QAAI,GAAc,IAAI,IAAI,GAAG;AAC7B,WAAO;AAAA,EACT,GAAG,CAAC,CAAM;AAEV,SAAO;AACT;;;ADVA,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;
|
|
1
|
+
{"version":3,"sources":["../src/prettier.ts","../src/shared/defaultJsonSorter.ts"],"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 async preprocess(text, options) {\n if (jsonParser.preprocess) {\n text = await 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","/**\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 = keys.sort(); // 使用原生 sort 方法对键进行排序\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"],"mappings":";AACA,SAAS,WAAW,uBAAuB;;;ACIpC,SAAS,kBAAiD,KAAQ;AACvE,QAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,QAAM,aAAa,KAAK,KAAK;AAC7B,QAAM,YAAY,WAAW,OAAO,CAAC,KAAK,QAAQ;AAChD,QAAI,GAAc,IAAI,IAAI,GAAG;AAC7B,WAAO;AAAA,EACT,GAAG,CAAC,CAAM;AAEV,SAAO;AACT;;;ADVA,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,MAAM,WAAW,MAAM,SAAS;AAC9B,UAAI,WAAW,YAAY;AACzB,eAAO,MAAM,WAAW,WAAW,MAAM,OAAO;AAAA,MAClD;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;","names":[]}
|
|
@@ -27,9 +27,14 @@ interface ApiConfig {
|
|
|
27
27
|
/**
|
|
28
28
|
* 配置`RequestBuilder` 路径,导入的变量必须是命名为`RequestBuilder`
|
|
29
29
|
* @example `import RequestBuilder from '@/utils/RequestBuilder'`
|
|
30
|
-
* @default `import { RequestBuilder } from '@dune2/tools'`
|
|
30
|
+
* @default `import { RequestBuilder } from '@dune2/tools/rq'`
|
|
31
31
|
*/
|
|
32
32
|
RequestBuilderImportPath?: string;
|
|
33
|
+
/**
|
|
34
|
+
* 配置`FieldsMap` 路径,导入的变量必须是命名为`FieldsMap`
|
|
35
|
+
* @example `import { type FieldsMap, fieldsMap } from '@dune2/tools/factory/fieldsMap'`
|
|
36
|
+
*/
|
|
37
|
+
FieldsMapImportPath?: string;
|
|
33
38
|
/**
|
|
34
39
|
* 是否启用ts,`true`会生成`.ts`文件,`false`会生成`.js`文件
|
|
35
40
|
* @default true
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dune2/cli",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/liaoyinglong/next-tools.git",
|
|
@@ -36,7 +36,6 @@
|
|
|
36
36
|
"debug": "^4.3.4",
|
|
37
37
|
"enquirer": "^2.3.6",
|
|
38
38
|
"es-toolkit": "^1",
|
|
39
|
-
"fs-extra": "^11.2.0",
|
|
40
39
|
"jiti": "^2.4.2",
|
|
41
40
|
"json-schema-to-typescript": "15.0.0",
|
|
42
41
|
"p-map": "^7.0.2"
|
|
@@ -51,7 +50,7 @@
|
|
|
51
50
|
"access": "public"
|
|
52
51
|
},
|
|
53
52
|
"scripts": {
|
|
54
|
-
"build": "
|
|
53
|
+
"build": "tsup --splitting --clean",
|
|
55
54
|
"dev": "pnpm run build --watch",
|
|
56
55
|
"lint": "tsc --diagnostics --noEmit",
|
|
57
56
|
"test": "vitest run",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/config/normalizeConfig.ts"],"sourcesContent":["import path from \"path\";\nimport { ApiConfig, Config } from \"./types\";\nexport function normalizeConfig(config: Config): Config {\n config.cwd ??= process.cwd();\n config.cacheDir ??= path.join(config.cwd, \"node_modules/.cache/dune-cli\");\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"],"mappings":";AAAA,OAAO,UAAU;AAEV,SAAS,gBAAgB,QAAwB;AACtD,SAAO,QAAQ,QAAQ,IAAI;AAC3B,SAAO,aAAa,KAAK,KAAK,OAAO,KAAK,8BAA8B;AAGxE,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;AAlB9C;AAmBI,yBAAO,eAAP,mBAAmB,SAAQ;AAAA;AAC7B,SAAO;AACT;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
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 { camelCase, cloneDeep, merge } from \"es-toolkit\";\nimport fs from \"fs-extra\";\nimport { compile } from \"json-schema-to-typescript\";\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 (\n isGenerateFieldsMap &&\n Object.keys(requestParamsTypeCode.fieldsMap).length > 0\n ) {\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 (\n item.schema &&\n \"type\" in item.schema &&\n item.schema.type === \"object\"\n ) {\n // swagger get 请求上 有些参数是 object 类型 应该拍平\n Object.assign(\n extraProperties,\n (item.schema as OpenAPIV3.SchemaObject).properties || {},\n );\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 data.type === \"object\" &&\n (data.required || []).filter((item) => keys.includes(item)).length ===\n keys.length\n );\n };\n\n if (generateFieldsMap) {\n // 分页查询接口取 params 字段\n const params = isPageSearchRequest(schema)\n ? schema.properties?.params?.properties || {}\n : schema.properties;\n Object.keys(params || {}).forEach((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 data.type === \"object\" && 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 } 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 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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/initConfig.ts"],"sourcesContent":["import fs from \"fs-extra\";\nimport path from \"path\";\nimport { createLogger } from \"../shared\";\nimport { configName, getConfig } from \"../shared/config\";\n\nconst log = createLogger(\"initConfig\");\n\nconst tpl = `\\\nimport { defineConfig } from \"@dune2/cli\";\n\nexport default defineConfig({\n i18n: [],\n api: [],\n});`;\n\nexport const initConfig = async () => {\n const config = await getConfig();\n const configPath = path.join(config.cwd!, configName);\n log.info(`config file path: ${configPath}`);\n if (await fs.pathExists(configPath)) {\n log.info(`config file already exists, skip`);\n return;\n }\n await fs.writeFile(configPath, tpl);\n log.info(`config file created`);\n};\n"],"mappings":";;;;;;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAIjB,IAAM,MAAM,aAAa,YAAY;AAErC,IAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAQL,IAAM,aAAa,YAAY;AACpC,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,aAAa,KAAK,KAAK,OAAO,KAAM,UAAU;AACpD,MAAI,KAAK,qBAAqB,UAAU,EAAE;AAC1C,MAAI,MAAM,GAAG,WAAW,UAAU,GAAG;AACnC,QAAI,KAAK,kCAAkC;AAC3C;AAAA,EACF;AACA,QAAM,GAAG,UAAU,YAAY,GAAG;AAClC,MAAI,KAAK,qBAAqB;AAChC;","names":[]}
|
package/dist/prettier.d.cts
DELETED
package/dist/prettier.d.ts
DELETED