Skip to content

Commit 49ee7a9

Browse files
committed
fix: 重新打包时无法生成.d.ts
1 parent 7ed188c commit 49ee7a9

File tree

14 files changed

+353
-398
lines changed

14 files changed

+353
-398
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ node_modules/
22
.idea/
33
TODO
44
dist/
5+
backup/
56
.npmrc
67
coverage/
78
.DS_Store

package.json

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"generate": "aomex openapi-yaml && aomex openapi-json",
88
"build": "tsup",
99
"prepare": "husky",
10-
"prepublishOnly": "tsup",
10+
"prepublishOnly": "pnpm build",
1111
"deploy:main": "sh scripts/develop-deploy-main.sh",
1212
"sync:main": "sh scripts/develop-sync-main.sh"
1313
},
@@ -37,7 +37,7 @@
3737
"access": "public"
3838
},
3939
"files": [
40-
"src",
40+
"backup",
4141
"adapters",
4242
"dist",
4343
"LICENSE",
@@ -62,9 +62,9 @@
6262
"lodash-es": "^4.17.21",
6363
"object-to-formdata": "^4.5.1",
6464
"openapi-types": "^12.1.3",
65+
"prettier": "^3.2.5",
6566
"qs": "^6.12.3",
66-
"tsup": "^8.1.0",
67-
"tsx": "^4.15.6",
67+
"tsx": "^4.16.2",
6868
"yaml": "^2.4.5"
6969
},
7070
"devDependencies": {
@@ -83,9 +83,8 @@
8383
"axios": "^1.7.2",
8484
"husky": "^9.0.11",
8585
"only-allow": "^1.2.1",
86-
"prettier": "^3.2.5",
8786
"release-it": "^17.6.0",
88-
"tsx": "^4.16.2",
87+
"tsup": "^8.1.0",
8988
"typescript": "^5.5.3",
9089
"vitest": "^2.0.3"
9190
}

pnpm-lock.yaml

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/bin.ts

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const sleep = () => new Promise((resolve) => setTimeout(resolve, 300));
1717
const spinner = new Listr<{
1818
configs: OpenapiClientConfig[];
1919
docs: OpenAPIV3.Document[];
20-
projects: Record<string, string>;
20+
projects: Record<string, { dts: string; js: string }>;
2121
}>([]);
2222

2323
spinner.add({
@@ -71,12 +71,15 @@ spinner.add({
7171
task: async (ctx) => {
7272
ctx.projects = {};
7373

74-
ctx.configs.forEach((config, i) => {
75-
ctx.projects = {
76-
...ctx.projects,
77-
...generateTemplate(ctx.docs[i]!, config.projectName),
78-
};
79-
});
74+
await Promise.all(
75+
ctx.configs.map(async (config, i) => {
76+
const result = await generateTemplate(ctx.docs[i]!, config.projectName);
77+
ctx.projects = {
78+
...ctx.projects,
79+
...result,
80+
};
81+
}),
82+
);
8083

8184
await sleep();
8285
},
@@ -85,9 +88,14 @@ spinner.add({
8588
spinner.add({
8689
title: '写入@aomex/openapi-client',
8790
task: async (ctx) => {
88-
const dist = path.dirname(fileURLToPath(import.meta.url));
89-
const content = Object.values(ctx.projects).join('\n');
90-
await rebuildDist(dist, content);
91+
const root = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
92+
const jsContent = Object.values(ctx.projects)
93+
.map(({ js }) => js)
94+
.join('\n');
95+
const dtsContent = Object.values(ctx.projects)
96+
.map(({ dts }) => dts)
97+
.join('\n');
98+
await rebuildDist(root, jsContent, dtsContent, Object.keys(ctx.projects));
9199
},
92100
});
93101

src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
export * from './lib/adapter';
22
export * from './base-openapi-client';
3-
export * from './openapi-runtime';
43
export * from './define-config';

src/lib/generate-template.ts

Lines changed: 54 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,36 @@ import type { OpenAPIV3 } from 'openapi-types';
22
import { upperFirst, camelCase } from 'lodash-es';
33
import { documentToMeta, type Metas } from './document-to-meta';
44
import { methods } from './adapter';
5+
import prettier from 'prettier';
56

6-
export const generateTemplate = (docs: OpenAPIV3.Document, projectName: string = '') => {
7-
projectName = upperFirst(camelCase(projectName));
8-
const className = `OpenapiClient${projectName}`;
7+
export const generateTemplate = async (
8+
docs: OpenAPIV3.Document,
9+
projectName: string = '',
10+
) => {
11+
const className = `OpenapiClient${upperFirst(camelCase(projectName))}`;
912
const metas = documentToMeta(docs);
10-
const tpl = `
11-
import { BaseOpenapiClient } from './base-openapi-client';
12-
13+
const dts = `
1314
${generateNamespaceTpl(className, metas)}
14-
${generateClassTpl(className, metas)}
15-
${generateContentTypeTpl(metas)}
15+
${generateClassForDTS(className, metas)}
1616
${generatePathRelationTpl(className, metas)}
1717
`;
1818

19-
return { [projectName]: tpl };
19+
const js = `
20+
${generateClassForJS(className)}
21+
${generateContentTypeTpl(className, metas)}
22+
`;
23+
24+
return {
25+
[className]: {
26+
dts: await prettier.format(dts, { parser: 'typescript' }),
27+
js: await prettier.format(js, { parser: 'typescript' }),
28+
},
29+
};
2030
};
2131

2232
export const generateNamespaceTpl = (className: string, metas: Metas) => {
2333
return `
24-
export namespace ${className} {
34+
declare namespace ${className} {
2535
${methods
2636
.flatMap((method) => {
2737
let content = metas[method].flatMap((meta) => {
@@ -30,7 +40,7 @@ export namespace ${className} {
3040
(<const>['query', 'params']).forEach((key) => {
3141
const interfaceName = upperFirst(camelCase(meta.key + '_' + key));
3242
if (meta[key].types.length) {
33-
opts.push(`export interface ${interfaceName} ${meta[key].types[0]}\n`);
43+
opts.push(`interface ${interfaceName} ${meta[key].types[0]}\n`);
3444
}
3545
});
3646
@@ -39,8 +49,8 @@ export namespace ${className} {
3949
if (meta[key].types.length) {
4050
opts.push(
4151
meta[key].types.length === 1
42-
? `export interface ${interfaceName} ${meta[key].types}\n`
43-
: `export type ${interfaceName} = ${meta[key].types.join(' | ')}\n`,
52+
? `interface ${interfaceName} ${meta[key].types}\n`
53+
: `type ${interfaceName} = ${meta[key].types.join(' | ')}\n`,
4454
);
4555
}
4656
});
@@ -53,9 +63,9 @@ export namespace ${className} {
5363
}`;
5464
};
5565

56-
export const generateClassTpl = (className: string, metas: Metas) => {
66+
export const generateClassForDTS = (className: string, metas: Metas) => {
5767
return `
58-
export class ${className} extends BaseOpenapiClient {
68+
declare class ${className} extends BaseOpenapiClient {
5969
${methods
6070
.map((method) => {
6171
if (!metas[method].length) return '';
@@ -78,22 +88,43 @@ export class ${className} extends BaseOpenapiClient {
7888
7989
return `${method}<K extends keyof ${className}_${method}_paths>(
8090
uri: K, ...rest: ${opts}
81-
): Promise<${className}_${method}_paths[K]['response']> {
82-
return this.request(uri, '${method}', rest[0] || {});
83-
}`;
91+
): Promise<${className}_${method}_paths[K]['response']>`;
8492
})
8593
.join('\n')}
8694
87-
protected override getContentTypes(uri: string, method: string) {
88-
return defaultContentTypes[uri + ' ' + method] || [void 0, void 0];
89-
}
95+
protected getContentTypes(uri: string, method: string) : [
96+
BaseOpenapiClient.UserInputOpts['requestBodyType'],
97+
BaseOpenapiClient.UserInputOpts['responseType'],
98+
];
9099
}
91100
`;
92101
};
93102

94-
export const generateContentTypeTpl = (metas: Metas) => {
103+
export const generateClassForJS = (className: string) => {
104+
return `
105+
var ${className} = class extends BaseOpenapiClient {
106+
get(uri, ...rest) {
107+
return this.request(uri, "get", rest[0] || {});
108+
}
109+
post(uri, ...rest) {
110+
return this.request(uri, "post", rest[0] || {});
111+
}
112+
put(uri, ...rest) {
113+
return this.request(uri, "put", rest[0] || {});
114+
}
115+
delete(uri, ...rest) {
116+
return this.request(uri, "delete", rest[0] || {});
117+
}
118+
getContentTypes(uri, method) {
119+
return contentTypes${className}[uri + " " + method] || [void 0, void 0];
120+
}
121+
};
122+
`;
123+
};
124+
125+
export const generateContentTypeTpl = (className: string, metas: Metas) => {
95126
return `
96-
const defaultContentTypes: Record<string, [BaseOpenapiClient.UserInputOpts['requestBodyType'], BaseOpenapiClient.UserInputOpts['responseType']]> = {
127+
const contentTypes${className} = {
97128
${methods
98129
.map((method) => {
99130
if (!metas[method].length) return '';

src/lib/rebuild-dist.ts

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,43 @@
1-
import fs from 'node:fs/promises';
1+
import { readFile, writeFile } from 'node:fs/promises';
22
import path from 'node:path';
3-
import * as tsup from 'tsup';
43

5-
export const rebuildDist = async (distDir: string, content: string) => {
6-
const src = path.normalize(path.join(distDir, '..', 'src'));
7-
const packageJson = await fs.readFile(path.join(distDir, '..', 'package.json'), 'utf8');
8-
const deps = Object.keys(JSON.parse(packageJson).dependencies);
4+
export const rebuildDist = async (
5+
root: string,
6+
jsContent: string,
7+
dtsContent: string,
8+
classNames: string[],
9+
) => {
10+
const distDir = path.join(root, 'dist');
11+
const backupDir = path.join(root, 'backup');
912

10-
await fs.writeFile(path.join(src, 'openapi-runtime.ts'), content);
11-
await tsup.build({
12-
entry: [path.join(src, 'index.ts')],
13-
outDir: distDir,
14-
splitting: true,
15-
sourcemap: true,
16-
clean: false,
17-
format: ['cjs', 'esm'],
18-
platform: 'node',
19-
target: 'es2020',
20-
shims: false,
21-
dts: true,
22-
legacyOutput: true,
23-
silent: true,
24-
external: deps,
25-
});
13+
{
14+
let backupDTS = await readFile(path.join(backupDir, 'index.d.ts'), 'utf8');
15+
backupDTS = backupDTS.replace(
16+
`export {`,
17+
`${dtsContent}\nexport {${classNames.join(',')},`,
18+
);
19+
await writeFile(path.join(distDir, 'index.d.ts'), backupDTS);
20+
}
21+
22+
{
23+
let backupCJS = await readFile(path.join(backupDir, 'index.js'), 'utf8');
24+
backupCJS = backupCJS.replace(
25+
'0 && (module.exports = {',
26+
`${jsContent}\n0 && (module.exports = {\n${classNames.join(',')},`,
27+
);
28+
backupCJS = backupCJS.replace(
29+
/(__export\(.+?_exports, {)/,
30+
`$1\n${classNames.map((className) => `${className}: () => ${className},`)}`,
31+
);
32+
await writeFile(path.join(distDir, 'index.js'), backupCJS);
33+
}
34+
35+
{
36+
let backupESM = await readFile(path.join(backupDir, 'esm', 'index.js'), 'utf8');
37+
backupESM = backupESM.replace(
38+
'export {',
39+
`${jsContent}\nexport {\n${classNames.join(',')},`,
40+
);
41+
await writeFile(path.join(distDir, 'esm', 'index.js'), backupESM);
42+
}
2643
};

src/openapi-runtime.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)