Skip to content

Commit 2aad730

Browse files
feat(openapi): support openAPIConfig is array (#553)
1 parent 2aaedb3 commit 2aad730

1 file changed

Lines changed: 86 additions & 38 deletions

File tree

packages/plugin-openapi/src/index.ts

Lines changed: 86 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,22 @@ export default (api: IApi) => {
1010
key: 'openAPI',
1111
config: {
1212
schema(joi) {
13-
return joi.object({
14-
requestLibPath: joi.string(),
15-
schemaPath: joi.string(),
16-
mock: joi.boolean(),
17-
projectName: joi.string(),
18-
});
13+
return joi.alternatives(
14+
joi.array().items(
15+
joi.object({
16+
requestLibPath: joi.string(),
17+
schemaPath: joi.string(),
18+
mock: joi.boolean(),
19+
projectName: joi.string(),
20+
}),
21+
),
22+
joi.object({
23+
requestLibPath: joi.string(),
24+
schemaPath: joi.string(),
25+
mock: joi.boolean(),
26+
projectName: joi.string(),
27+
}),
28+
);
1929
},
2030
},
2131
enableBy: api.EnableBy.config,
@@ -38,21 +48,43 @@ export default (api: IApi) => {
3848
});
3949

4050
api.onGenerateFiles(() => {
51+
const openAPIConfig = api.config.openAPI;
4152
api.writeTmpFile({
4253
path: join('plugin-openapi', 'openapi.tsx'),
4354
content: `
55+
import { useState } from "react";
4456
import SwaggerUI from "swagger-ui-react";
4557
import "swagger-ui-react/swagger-ui.css";
4658
47-
const App = () => (
48-
<div
49-
style={{
50-
padding: 24,
51-
}}
52-
>
53-
<SwaggerUI url="/umi-plugins_openapi.json" />
54-
</div>
55-
);
59+
const App = () => {
60+
const [value, setValue] = useState("openapi");
61+
return (
62+
<div
63+
style={{
64+
padding: 24,
65+
}}
66+
>
67+
<select
68+
style={{
69+
position: "fixed",
70+
right: "16px",
71+
top: "8px",
72+
}}
73+
onChange={(e) => setValue(e.target.value)}
74+
>
75+
${[openAPIConfig]
76+
.flat(1)
77+
.map((item) => {
78+
return `<option value="${item.projectName || 'openapi'}">${
79+
item.projectName || 'openapi'
80+
}</option>`;
81+
})
82+
.join('\n')}
83+
</select>
84+
<SwaggerUI url={\`/umi-plugins_$\{value}.json\`} />
85+
</div>
86+
);
87+
};
5688
export default App;
5789
`,
5890
});
@@ -72,42 +104,58 @@ export default App;
72104
});
73105
}
74106

107+
const genOpenAPIFiles = async (openAPIConfig: any) => {
108+
const openAPIJson = await getSchema(openAPIConfig.schemaPath);
109+
writeFileSync(
110+
join(
111+
openAPIFilesPath,
112+
`umi-plugins_${openAPIConfig.projectName || 'openapi'}.json`,
113+
),
114+
JSON.stringify(openAPIJson, null, 2),
115+
);
116+
};
75117
api.onDevCompileDone(async () => {
76118
try {
77119
const openAPIConfig = api.config.openAPI;
78-
const openAPIJson = await getSchema(openAPIConfig.schemaPath);
79-
writeFileSync(
80-
join(openAPIFilesPath, 'umi-plugins_openapi.json'),
81-
JSON.stringify(openAPIJson, null, 2),
82-
);
120+
if (Array.isArray(openAPIConfig)) {
121+
openAPIConfig.map((item) => genOpenAPIFiles(item));
122+
return;
123+
}
124+
genOpenAPIFiles(openAPIConfig);
83125
} catch (error) {
84126
console.error(error);
85127
}
86128
});
129+
const genAllFiles = async (openAPIConfig: any) => {
130+
const pageConfig = require(join(api.cwd, 'package.json'));
131+
const mockFolder = openAPIConfig.mock ? join(api.cwd, 'mock') : undefined;
132+
const serversFolder = join(api.cwd, 'src', 'services');
133+
// 如果mock 文件不存在,创建一下
134+
if (mockFolder && !existsSync(mockFolder)) {
135+
mkdirSync(mockFolder);
136+
}
137+
// 如果mock 文件不存在,创建一下
138+
if (serversFolder && !existsSync(serversFolder)) {
139+
mkdirSync(serversFolder);
140+
}
87141

142+
await generateService({
143+
projectName: pageConfig.name.split('/').pop(),
144+
...openAPIConfig,
145+
serversPath: serversFolder,
146+
mockFolder,
147+
});
148+
api.logger.info('[openAPI]: execution complete');
149+
};
88150
api.registerCommand({
89151
name: 'openapi',
90152
fn: async () => {
91153
const openAPIConfig = api.config.openAPI;
92-
const pageConfig = require(join(api.cwd, 'package.json'));
93-
const mockFolder = openAPIConfig.mock ? join(api.cwd, 'mock') : undefined;
94-
const serversFolder = join(api.cwd, 'src', 'services');
95-
// 如果mock 文件不存在,创建一下
96-
if (mockFolder && !existsSync(mockFolder)) {
97-
mkdirSync(mockFolder);
154+
if (Array.isArray(openAPIConfig)) {
155+
openAPIConfig.map((item) => genAllFiles(item));
156+
return;
98157
}
99-
// 如果mock 文件不存在,创建一下
100-
if (serversFolder && !existsSync(serversFolder)) {
101-
mkdirSync(serversFolder);
102-
}
103-
104-
await generateService({
105-
projectName: pageConfig.name.split('/').pop(),
106-
...openAPIConfig,
107-
serversPath: serversFolder,
108-
mockFolder,
109-
});
110-
api.logger.info('[openAPI]: execution complete');
158+
genAllFiles(openAPIConfig);
111159
},
112160
});
113161
};

0 commit comments

Comments
 (0)