@trpc/openapi 0.0.0-alpha.0 → 11.13.1-alpha
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/LICENSE +21 -0
- package/README.md +14 -0
- package/dist/cli.js +937 -0
- package/dist/heyapi/index.cjs +141 -0
- package/dist/heyapi/index.d.cts +67 -0
- package/dist/heyapi/index.d.cts.map +1 -0
- package/dist/heyapi/index.d.mts +67 -0
- package/dist/heyapi/index.d.mts.map +1 -0
- package/dist/heyapi/index.mjs +139 -0
- package/dist/heyapi/index.mjs.map +1 -0
- package/dist/index.cjs +834 -0
- package/dist/index.d.cts +63 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +63 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +835 -0
- package/dist/index.mjs.map +1 -0
- package/dist/objectSpread2-Cw30I7tb.cjs +131 -0
- package/dist/objectSpread2-UxrN8MPM.mjs +114 -0
- package/dist/objectSpread2-UxrN8MPM.mjs.map +1 -0
- package/package.json +102 -1
- package/src/cli.ts +133 -0
- package/src/generate.ts +1265 -0
- package/src/heyapi/index.ts +174 -0
- package/src/index.ts +2 -0
- package/src/schemaExtraction.ts +383 -0
package/src/cli.ts
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* eslint-disable no-console */
|
|
3
|
+
/**
|
|
4
|
+
* trpc-openapi – CLI that generates an OpenAPI 3.1 document from a tRPC
|
|
5
|
+
* AppRouter type.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* trpc-openapi <router-file> [options]
|
|
9
|
+
*
|
|
10
|
+
* Options:
|
|
11
|
+
* --export, -e Name of the exported router symbol (default: AppRouter)
|
|
12
|
+
* --output, -o Output file path (default: openapi.json)
|
|
13
|
+
* --title OpenAPI info.title (default: tRPC API)
|
|
14
|
+
* --version OpenAPI info.version (default: 0.0.0)
|
|
15
|
+
* --help, -h Show this help message
|
|
16
|
+
*/
|
|
17
|
+
import * as fs from 'node:fs';
|
|
18
|
+
import * as path from 'node:path';
|
|
19
|
+
import { parseArgs as nodeParseArgs } from 'node:util';
|
|
20
|
+
import { generateOpenAPIDocument } from './generate';
|
|
21
|
+
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Arg parsing via node:util parseArgs
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
interface ParsedArgs {
|
|
27
|
+
file: string | undefined;
|
|
28
|
+
exportName: string;
|
|
29
|
+
output: string;
|
|
30
|
+
title: string;
|
|
31
|
+
version: string;
|
|
32
|
+
help: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function parseArgs(argv: string[]): ParsedArgs {
|
|
36
|
+
let parsed;
|
|
37
|
+
try {
|
|
38
|
+
parsed = nodeParseArgs({
|
|
39
|
+
args: argv.slice(2),
|
|
40
|
+
options: {
|
|
41
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
42
|
+
export: { type: 'string', short: 'e', default: 'AppRouter' },
|
|
43
|
+
output: { type: 'string', short: 'o', default: 'openapi.json' },
|
|
44
|
+
title: { type: 'string', default: 'tRPC API' },
|
|
45
|
+
version: { type: 'string', default: '0.0.0' },
|
|
46
|
+
},
|
|
47
|
+
strict: true,
|
|
48
|
+
allowPositionals: true,
|
|
49
|
+
});
|
|
50
|
+
} catch (err: unknown) {
|
|
51
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
52
|
+
console.error(`Unknown option: ${message}`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
file: parsed.positionals[0],
|
|
58
|
+
exportName: parsed.values.export,
|
|
59
|
+
output: parsed.values.output,
|
|
60
|
+
title: parsed.values.title,
|
|
61
|
+
version: parsed.values.version,
|
|
62
|
+
help: parsed.values.help,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Main
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
|
|
70
|
+
const HELP = `
|
|
71
|
+
trpc-openapi – Generate an OpenAPI 3.1 document from a tRPC AppRouter type.
|
|
72
|
+
|
|
73
|
+
Usage:
|
|
74
|
+
trpc-openapi <router-file> [options]
|
|
75
|
+
|
|
76
|
+
Arguments:
|
|
77
|
+
router-file Path to the TypeScript file that exports the router.
|
|
78
|
+
|
|
79
|
+
Options:
|
|
80
|
+
-e, --export <name> Name of the exported router symbol [default: AppRouter]
|
|
81
|
+
-o, --output <file> Output file path [default: openapi.json]
|
|
82
|
+
--title <text> OpenAPI info.title [default: tRPC API]
|
|
83
|
+
--version <ver> OpenAPI info.version [default: 0.0.0]
|
|
84
|
+
-h, --help Show this help message
|
|
85
|
+
|
|
86
|
+
Examples:
|
|
87
|
+
trpc-openapi ./src/server/router.ts
|
|
88
|
+
trpc-openapi ./src/server/router.ts --output api.json --title "My API" --version 1.0.0
|
|
89
|
+
trpc-openapi ./src/server/router.ts --export appRouter
|
|
90
|
+
`.trim();
|
|
91
|
+
|
|
92
|
+
async function main(): Promise<void> {
|
|
93
|
+
const args = parseArgs(process.argv);
|
|
94
|
+
|
|
95
|
+
if (args.help) {
|
|
96
|
+
console.log(HELP);
|
|
97
|
+
process.exit(0);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (!args.file) {
|
|
101
|
+
console.error('Error: router-file argument is required.\n');
|
|
102
|
+
console.error(HELP);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const routerFile = path.resolve(args.file);
|
|
107
|
+
|
|
108
|
+
if (!fs.existsSync(routerFile)) {
|
|
109
|
+
console.error(`Error: File not found: ${routerFile}`);
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
console.log(`Generating OpenAPI document from: ${routerFile}`);
|
|
114
|
+
|
|
115
|
+
let doc: Awaited<ReturnType<typeof generateOpenAPIDocument>>;
|
|
116
|
+
try {
|
|
117
|
+
doc = await generateOpenAPIDocument(routerFile, {
|
|
118
|
+
exportName: args.exportName,
|
|
119
|
+
title: args.title,
|
|
120
|
+
version: args.version,
|
|
121
|
+
});
|
|
122
|
+
} catch (err: unknown) {
|
|
123
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
124
|
+
console.error(`Error: ${message}`);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const outputPath = path.resolve(args.output);
|
|
129
|
+
fs.writeFileSync(outputPath, JSON.stringify(doc, null, 2) + '\n', 'utf8');
|
|
130
|
+
console.log(`OpenAPI document written to: ${outputPath}`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
void main();
|