@kubb/parser-ts 5.12.7 → 5.13.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/README.md +3 -19
- package/dist/index.cjs +104 -73
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -9
- package/dist/index.d.ts +16 -9
- package/dist/index.js +104 -73
- package/dist/index.js.map +1 -1
- package/docs/overview.md +1 -1
- package/kubb-extension.json +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
### TypeScript source file parser for Kubb
|
|
26
26
|
|
|
27
|
-
Prints Kubb AST nodes as TypeScript source strings
|
|
27
|
+
Prints Kubb AST nodes as TypeScript source strings. Handles both `.ts` and `.tsx` output.
|
|
28
28
|
|
|
29
29
|
## Installation
|
|
30
30
|
|
|
@@ -59,23 +59,7 @@ export default defineConfig({
|
|
|
59
59
|
})
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
```typescript
|
|
65
|
-
import { parserTs } from '@kubb/parser-ts'
|
|
66
|
-
import ts from '@typescript/typescript6'
|
|
67
|
-
|
|
68
|
-
const source = parserTs().print(
|
|
69
|
-
ts.factory.createVariableStatement(
|
|
70
|
-
[ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
|
|
71
|
-
ts.factory.createVariableDeclarationList(
|
|
72
|
-
[ts.factory.createVariableDeclaration('hello', undefined, undefined, ts.factory.createStringLiteral('world'))],
|
|
73
|
-
ts.NodeFlags.Const,
|
|
74
|
-
),
|
|
75
|
-
),
|
|
76
|
-
)
|
|
77
|
-
// → export const hello = 'world'
|
|
78
|
-
```
|
|
62
|
+
`print(...fragments)` joins printed code strings with a newline. It still accepts TypeScript compiler nodes, but that form is deprecated and needs `typescript` 5 or 6, or `@typescript/typescript6`, installed. It is removed in the next major.
|
|
79
63
|
|
|
80
64
|
## API
|
|
81
65
|
|
|
@@ -83,7 +67,7 @@ const source = parserTs().print(
|
|
|
83
67
|
|
|
84
68
|
Factory returning a parser instance for `.ts` and `.js` files. Pass to `defineConfig({ parsers: [...] })` to emit TypeScript source files. The optional `extension` map rewrites the extensions written in `import`/`export` statements and defaults to `{ '.ts': '' }`.
|
|
85
69
|
|
|
86
|
-
The returned instance exposes `parse(file)` to serialize a `FileNode` to TypeScript source and `print(...
|
|
70
|
+
The returned instance exposes `parse(file)` to serialize a `FileNode` to TypeScript source and `print(...fragments)` to join printed code strings.
|
|
87
71
|
|
|
88
72
|
### `parserTsx(options?)`
|
|
89
73
|
|
package/dist/index.cjs
CHANGED
|
@@ -4,36 +4,46 @@ let _kubb_ast = require("@kubb/ast");
|
|
|
4
4
|
let _kubb_core = require("@kubb/core");
|
|
5
5
|
let node_module = require("node:module");
|
|
6
6
|
let node_path = require("node:path");
|
|
7
|
+
let node_url = require("node:url");
|
|
8
|
+
let yuku_parser = require("yuku-parser");
|
|
7
9
|
//#region kubb-extension.json
|
|
8
10
|
var compatibility = {
|
|
9
11
|
"kubb": ">=5.8.3",
|
|
10
|
-
"node": ">=22.
|
|
12
|
+
"node": ">=22.22"
|
|
11
13
|
};
|
|
12
14
|
//#endregion
|
|
13
15
|
//#region package.json
|
|
14
|
-
var version = "5.
|
|
16
|
+
var version = "5.13.0";
|
|
15
17
|
//#endregion
|
|
16
18
|
//#region src/utils.ts
|
|
17
19
|
let compiler;
|
|
18
20
|
/**
|
|
19
|
-
* Loads TypeScript
|
|
21
|
+
* Loads TypeScript the first time `print` gets a compiler node. Strings never need it, so bundles for edge runtimes such as Cloudflare Workers leave it out.
|
|
20
22
|
*
|
|
21
23
|
* Loaded with `require`, not `import`: when ESM imports a CommonJS package, Node keeps a second copy of its source
|
|
22
24
|
* to detect named exports, and for TypeScript that copy is about 9 MB.
|
|
23
25
|
*/
|
|
24
26
|
function loadCompiler() {
|
|
25
27
|
if (compiler) return compiler;
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
const require$1 = (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href);
|
|
29
|
+
const paths = [process.cwd(), (0, node_path.dirname)((0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href))];
|
|
30
|
+
let typescript;
|
|
31
|
+
for (const name of ["typescript", "@typescript/typescript6"]) try {
|
|
32
|
+
const candidate = require$1(require$1.resolve(name, { paths }));
|
|
33
|
+
if (typeof candidate.createPrinter === "function") {
|
|
34
|
+
typescript = candidate;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
} catch {}
|
|
38
|
+
if (!typescript) throw new Error("`print` received a TypeScript compiler node, which needs `typescript` 5 or 6, or `@typescript/typescript6`, installed. Pass a printed string instead.");
|
|
39
|
+
const printer = typescript.createPrinter({
|
|
40
|
+
omitTrailingSemicolon: true,
|
|
41
|
+
newLine: typescript.NewLineKind.LineFeed,
|
|
42
|
+
removeComments: false,
|
|
43
|
+
noEmitHelpers: true
|
|
44
|
+
});
|
|
45
|
+
const sourceFile = typescript.createSourceFile("print.tsx", "", typescript.ScriptTarget.ES2022, true, typescript.ScriptKind.TSX);
|
|
46
|
+
compiler = { printNodes: (nodes) => printer.printList(typescript.ListFormat.MultiLine, typescript.factory.createNodeArray(nodes), sourceFile) };
|
|
37
47
|
return compiler;
|
|
38
48
|
}
|
|
39
49
|
/**
|
|
@@ -52,79 +62,95 @@ function resolveOutputPath(path, extname, rootAware) {
|
|
|
52
62
|
return current ? `${path.slice(0, -current.length)}${extname ?? ""}` : path;
|
|
53
63
|
}
|
|
54
64
|
/**
|
|
65
|
+
* Node types this module reads from the yuku AST.
|
|
66
|
+
*/
|
|
67
|
+
const nodeTypes = {
|
|
68
|
+
identifier: "Identifier",
|
|
69
|
+
literal: "Literal",
|
|
70
|
+
importDeclaration: "ImportDeclaration",
|
|
71
|
+
importSpecifier: "ImportSpecifier",
|
|
72
|
+
importDefaultSpecifier: "ImportDefaultSpecifier",
|
|
73
|
+
importNamespaceSpecifier: "ImportNamespaceSpecifier",
|
|
74
|
+
exportAllDeclaration: "ExportAllDeclaration",
|
|
75
|
+
exportNamedDeclaration: "ExportNamedDeclaration"
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* `importKind` and `exportKind` values this module reads from the yuku AST.
|
|
79
|
+
*/
|
|
80
|
+
const declarationKinds = { type: "type" };
|
|
81
|
+
function nameOf(node) {
|
|
82
|
+
return node.type === nodeTypes.literal ? node.value : node.name;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
55
85
|
* Converts an import specifier into an `ImportNode` name, keeping the quotes of a string-literal name (`{ 'a-b' as ab }`).
|
|
56
86
|
*/
|
|
57
|
-
function toImportName(
|
|
58
|
-
if (
|
|
59
|
-
const { typescript } = loadCompiler();
|
|
60
|
-
const { propertyName } = element;
|
|
87
|
+
function toImportName({ imported, local }) {
|
|
88
|
+
if (imported.type === nodeTypes.identifier && imported.name === local.name) return local.name;
|
|
61
89
|
return {
|
|
62
|
-
propertyName:
|
|
63
|
-
name:
|
|
90
|
+
propertyName: imported.type === nodeTypes.literal ? quoteModulePath(imported.value) : imported.name,
|
|
91
|
+
name: local.name
|
|
64
92
|
};
|
|
65
93
|
}
|
|
66
94
|
/**
|
|
67
|
-
* Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes stay as written.
|
|
95
|
+
* Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes or a phase stay as written.
|
|
68
96
|
*/
|
|
69
97
|
function toImportNodes(statement, filePath) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const { name, namedBindings, phaseModifier } = statement.importClause;
|
|
73
|
-
const specifier = statement.moduleSpecifier.text;
|
|
98
|
+
if (statement.type !== nodeTypes.importDeclaration || !statement.specifiers.length || statement.attributes.length || statement.phase) return [];
|
|
99
|
+
const specifier = statement.source.value;
|
|
74
100
|
const target = specifier.startsWith(".") ? {
|
|
75
101
|
path: (0, node_path.resolve)((0, node_path.dirname)(filePath), specifier),
|
|
76
102
|
root: filePath
|
|
77
103
|
} : { path: specifier };
|
|
78
|
-
const isTypeOnly =
|
|
104
|
+
const isTypeOnly = statement.importKind === declarationKinds.type;
|
|
79
105
|
const nodes = [];
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}));
|
|
85
|
-
if (namedBindings && typescript.isNamespaceImport(namedBindings)) nodes.push(_kubb_ast.ast.factory.createImport({
|
|
86
|
-
name: namedBindings.name.text,
|
|
87
|
-
...target,
|
|
88
|
-
isTypeOnly,
|
|
89
|
-
isNameSpace: true
|
|
90
|
-
}));
|
|
91
|
-
if (namedBindings && typescript.isNamedImports(namedBindings)) {
|
|
92
|
-
const values = namedBindings.elements.filter((element) => !element.isTypeOnly);
|
|
93
|
-
const types = namedBindings.elements.filter((element) => element.isTypeOnly);
|
|
94
|
-
if (values.length) nodes.push(_kubb_ast.ast.factory.createImport({
|
|
95
|
-
name: values.map(toImportName),
|
|
106
|
+
const named = statement.specifiers.filter((element) => element.type === nodeTypes.importSpecifier);
|
|
107
|
+
for (const element of statement.specifiers) {
|
|
108
|
+
if (element.type === nodeTypes.importDefaultSpecifier) nodes.push(_kubb_ast.ast.factory.createImport({
|
|
109
|
+
name: element.local.name,
|
|
96
110
|
...target,
|
|
97
111
|
isTypeOnly
|
|
98
112
|
}));
|
|
99
|
-
if (
|
|
100
|
-
name:
|
|
113
|
+
if (element.type === nodeTypes.importNamespaceSpecifier) nodes.push(_kubb_ast.ast.factory.createImport({
|
|
114
|
+
name: element.local.name,
|
|
101
115
|
...target,
|
|
102
|
-
isTypeOnly
|
|
116
|
+
isTypeOnly,
|
|
117
|
+
isNameSpace: true
|
|
103
118
|
}));
|
|
104
119
|
}
|
|
120
|
+
const values = named.filter((element) => element.importKind !== declarationKinds.type);
|
|
121
|
+
const types = named.filter((element) => element.importKind === declarationKinds.type);
|
|
122
|
+
if (values.length) nodes.push(_kubb_ast.ast.factory.createImport({
|
|
123
|
+
name: values.map(toImportName),
|
|
124
|
+
...target,
|
|
125
|
+
isTypeOnly
|
|
126
|
+
}));
|
|
127
|
+
if (types.length) nodes.push(_kubb_ast.ast.factory.createImport({
|
|
128
|
+
name: types.map(toImportName),
|
|
129
|
+
...target,
|
|
130
|
+
isTypeOnly: true
|
|
131
|
+
}));
|
|
105
132
|
return nodes;
|
|
106
133
|
}
|
|
107
134
|
/**
|
|
108
135
|
* Converts an `export … from` declaration into `ExportNode`s. Forms `printExport` cannot print stay as written.
|
|
109
136
|
*/
|
|
110
137
|
function toExportNodes(statement) {
|
|
111
|
-
|
|
112
|
-
if (!
|
|
113
|
-
const
|
|
114
|
-
const
|
|
115
|
-
if (
|
|
116
|
-
|
|
117
|
-
isTypeOnly
|
|
118
|
-
})];
|
|
119
|
-
if (typescript.isNamespaceExport(exportClause)) return [_kubb_ast.ast.factory.createExport({
|
|
120
|
-
name: exportClause.name.text,
|
|
138
|
+
if (statement.type !== nodeTypes.exportAllDeclaration && statement.type !== nodeTypes.exportNamedDeclaration) return [];
|
|
139
|
+
if (!statement.source || statement.attributes.length) return [];
|
|
140
|
+
const path = statement.source.value;
|
|
141
|
+
const isTypeOnly = statement.exportKind === declarationKinds.type;
|
|
142
|
+
if (statement.type === nodeTypes.exportAllDeclaration) return [statement.exported ? _kubb_ast.ast.factory.createExport({
|
|
143
|
+
name: nameOf(statement.exported),
|
|
121
144
|
path,
|
|
122
145
|
isTypeOnly,
|
|
123
146
|
asAlias: true
|
|
147
|
+
}) : _kubb_ast.ast.factory.createExport({
|
|
148
|
+
path,
|
|
149
|
+
isTypeOnly
|
|
124
150
|
})];
|
|
125
|
-
if (
|
|
151
|
+
if (statement.specifiers.some((element) => element.exportKind === declarationKinds.type || element.exported.type === nodeTypes.literal || nameOf(element.exported) !== nameOf(element.local))) return [];
|
|
126
152
|
return [_kubb_ast.ast.factory.createExport({
|
|
127
|
-
name:
|
|
153
|
+
name: statement.specifiers.map((element) => nameOf(element.local)),
|
|
128
154
|
path,
|
|
129
155
|
isTypeOnly
|
|
130
156
|
})];
|
|
@@ -133,26 +159,28 @@ function toExportNodes(statement) {
|
|
|
133
159
|
* Splits `source` into its lifted `import`/`export … from` nodes, the `header` above the first one (shebang, directives, comments) and the rest as `body`.
|
|
134
160
|
*/
|
|
135
161
|
function splitModuleDeclarations(source, filePath) {
|
|
136
|
-
const {
|
|
137
|
-
|
|
162
|
+
const { program } = (0, yuku_parser.parse)(source, {
|
|
163
|
+
lang: "ts",
|
|
164
|
+
sourceType: "module"
|
|
165
|
+
});
|
|
138
166
|
const imports = [];
|
|
139
167
|
const exports = [];
|
|
140
168
|
let header = "";
|
|
141
169
|
let body = "";
|
|
142
170
|
let cursor = 0;
|
|
143
|
-
for (const statement of
|
|
171
|
+
for (const statement of program.body) {
|
|
144
172
|
const importNodes = toImportNodes(statement, filePath);
|
|
145
173
|
const exportNodes = toExportNodes(statement);
|
|
146
174
|
if (!importNodes.length && !exportNodes.length) {
|
|
147
|
-
if (
|
|
175
|
+
if (statement.type === nodeTypes.importDeclaration || (statement.type === nodeTypes.exportNamedDeclaration || statement.type === nodeTypes.exportAllDeclaration) && statement.source) break;
|
|
148
176
|
continue;
|
|
149
177
|
}
|
|
150
|
-
const text = source.slice(cursor, statement.
|
|
178
|
+
const text = source.slice(cursor, statement.start);
|
|
151
179
|
if (imports.length || exports.length) body += text;
|
|
152
180
|
else header = text;
|
|
153
181
|
imports.push(...importNodes);
|
|
154
182
|
exports.push(...exportNodes);
|
|
155
|
-
cursor = statement.
|
|
183
|
+
cursor = statement.end;
|
|
156
184
|
}
|
|
157
185
|
return {
|
|
158
186
|
header: header.trim(),
|
|
@@ -194,14 +222,15 @@ function indentLines(text) {
|
|
|
194
222
|
*/
|
|
195
223
|
function dedent(text) {
|
|
196
224
|
if (!text) return "";
|
|
225
|
+
if (!text.includes("\n")) return text.trim() ? text.trimStart() : "";
|
|
197
226
|
const lines = text.split("\n");
|
|
198
227
|
const isBlank = (line) => line.trim() === "";
|
|
199
228
|
const start = lines.findIndex((line) => !isBlank(line));
|
|
200
229
|
if (start === -1) return "";
|
|
201
230
|
const end = lines.findLastIndex((line) => !isBlank(line));
|
|
202
231
|
const trimmed = lines.slice(start, end + 1);
|
|
203
|
-
|
|
204
|
-
const min =
|
|
232
|
+
let min = Infinity;
|
|
233
|
+
for (const line of trimmed) if (!isBlank(line)) min = Math.min(min, line.length - line.trimStart().length);
|
|
205
234
|
return trimmed.map((line) => isBlank(line) ? "" : line.slice(min)).join("\n");
|
|
206
235
|
}
|
|
207
236
|
/**
|
|
@@ -221,13 +250,17 @@ function withJSDoc({ jsDoc, declaration }) {
|
|
|
221
250
|
return jsDocStr ? `${jsDocStr}\n${declaration}` : declaration;
|
|
222
251
|
}
|
|
223
252
|
/**
|
|
224
|
-
*
|
|
253
|
+
* Joins printed code fragments with a newline.
|
|
254
|
+
*
|
|
255
|
+
* Passing TypeScript compiler nodes still works but is deprecated and needs `typescript` 5 or 6, or `@typescript/typescript6`, installed.
|
|
256
|
+
* Support for compiler nodes is removed in the next major.
|
|
225
257
|
*/
|
|
226
258
|
function print(...elements) {
|
|
227
259
|
const filtered = elements.filter(Boolean);
|
|
228
260
|
if (filtered.length === 0) return "";
|
|
229
|
-
|
|
230
|
-
|
|
261
|
+
if (filtered.every((element) => typeof element === "string")) return filtered.join("\n");
|
|
262
|
+
if (filtered.every((element) => typeof element !== "string")) return loadCompiler().printNodes(filtered);
|
|
263
|
+
return filtered.map((element) => typeof element === "string" ? element : loadCompiler().printNodes([element]).trimEnd()).join("\n");
|
|
231
264
|
}
|
|
232
265
|
/**
|
|
233
266
|
* Converts a {@link ast.JSDocNode} to a `/** … *\/` block, dropping blank comments.
|
|
@@ -369,8 +402,7 @@ const DEFAULT_EXTENSION = { ".ts": "" };
|
|
|
369
402
|
/**
|
|
370
403
|
* Default Kubb parser for `.ts` and `.js` files. Takes the universal AST
|
|
371
404
|
* produced by an adapter and prints it as TypeScript source. Imports and exports
|
|
372
|
-
* are rewritten based on each file's metadata and the `extension` option.
|
|
373
|
-
* `print` helper renders TypeScript compiler nodes with the TypeScript printer.
|
|
405
|
+
* are rewritten based on each file's metadata and the `extension` option.
|
|
374
406
|
*
|
|
375
407
|
* Used automatically when no `parsers` option is set on `defineConfig`. Use
|
|
376
408
|
* `parserTsx` instead for React projects that emit JSX.
|
|
@@ -437,9 +469,8 @@ const parserTs = (0, _kubb_core.defineExtension)({
|
|
|
437
469
|
//#endregion
|
|
438
470
|
//#region src/parserTsx.ts
|
|
439
471
|
/**
|
|
440
|
-
* Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs
|
|
441
|
-
*
|
|
442
|
-
* same `extension` option.
|
|
472
|
+
* Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs`, since JSX
|
|
473
|
+
* prints as text the same way, so it shares the same `extension` option.
|
|
443
474
|
*
|
|
444
475
|
* Add to the `parsers` array on `defineConfig` when generating components for
|
|
445
476
|
* React (or any framework that emits JSX).
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["createRequire","relative","dirname","getExtname","resolve","ast","defineExtension","ast","defineExtension"],"sources":["../kubb-extension.json","../package.json","../src/utils.ts","../src/parserTs.ts","../src/parserTsx.ts"],"sourcesContent":["","","import { createRequire } from 'node:module'\nimport { dirname, extname as getExtname, relative, resolve } from 'node:path'\nimport { ast } from '@kubb/ast'\nimport type * as ts from '@typescript/typescript6'\n\ntype Compiler = {\n typescript: typeof ts\n printer: ts.Printer\n sourceFile: ts.SourceFile\n}\n\nlet compiler: Compiler | undefined\n\n/**\n * Loads TypeScript on the first `print` or `copy`; `parse` is string templating and never needs it.\n *\n * Loaded with `require`, not `import`: when ESM imports a CommonJS package, Node keeps a second copy of its source\n * to detect named exports, and for TypeScript that copy is about 9 MB.\n */\nfunction loadCompiler(): Compiler {\n if (compiler) return compiler\n\n const typescript: typeof ts = createRequire(import.meta.url)('@typescript/typescript6')\n\n compiler = {\n typescript,\n // One printer serves every call; printing does not mutate the source file, which only lends its compiler options\n printer: typescript.createPrinter({\n omitTrailingSemicolon: true,\n newLine: typescript.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n }),\n sourceFile: typescript.createSourceFile('print.tsx', '', typescript.ScriptTarget.ES2022, true, typescript.ScriptKind.TSX),\n }\n\n return compiler\n}\n\n/**\n * Module specifier that imports `filePath` from the file at `root`: POSIX, relative to that file's directory, `./`-prefixed unless it climbs with `../`.\n */\nexport function getRelativePath(root: string, filePath: string): string {\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n return slashed.startsWith('../') ? slashed : `./${slashed}`\n}\n\n/**\n * Swaps the extension of a relative import/export path for `extname`. Package specifiers and extension-less paths stay as-is.\n */\nexport function resolveOutputPath(path: string, extname: string | undefined, rootAware: boolean): string {\n if (!rootAware) return path\n const current = getExtname(path)\n return current ? `${path.slice(0, -current.length)}${extname ?? ''}` : path\n}\n\n/**\n * Converts an import specifier into an `ImportNode` name, keeping the quotes of a string-literal name (`{ 'a-b' as ab }`).\n */\nfunction toImportName(element: ts.ImportSpecifier): string | { propertyName: string; name: string } {\n if (!element.propertyName) return element.name.text\n\n const { typescript } = loadCompiler()\n const { propertyName } = element\n return { propertyName: typescript.isStringLiteral(propertyName) ? quoteModulePath(propertyName.text) : propertyName.text, name: element.name.text }\n}\n\n/**\n * Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes stay as written.\n */\nfunction toImportNodes(statement: ts.Statement, filePath: string): Array<ast.ImportNode> {\n const { typescript } = loadCompiler()\n if (!typescript.isImportDeclaration(statement) || !statement.importClause || !typescript.isStringLiteral(statement.moduleSpecifier) || statement.attributes)\n return []\n\n const { name, namedBindings, phaseModifier } = statement.importClause\n const specifier = statement.moduleSpecifier.text\n const target = specifier.startsWith('.') ? { path: resolve(dirname(filePath), specifier), root: filePath } : { path: specifier }\n const isTypeOnly = phaseModifier === typescript.SyntaxKind.TypeKeyword\n const nodes: Array<ast.ImportNode> = []\n\n if (name) nodes.push(ast.factory.createImport({ name: name.text, ...target, isTypeOnly }))\n if (namedBindings && typescript.isNamespaceImport(namedBindings)) {\n nodes.push(ast.factory.createImport({ name: namedBindings.name.text, ...target, isTypeOnly, isNameSpace: true }))\n }\n if (namedBindings && typescript.isNamedImports(namedBindings)) {\n const values = namedBindings.elements.filter((element) => !element.isTypeOnly)\n const types = namedBindings.elements.filter((element) => element.isTypeOnly)\n if (values.length) nodes.push(ast.factory.createImport({ name: values.map(toImportName), ...target, isTypeOnly }))\n if (types.length) nodes.push(ast.factory.createImport({ name: types.map(toImportName), ...target, isTypeOnly: true }))\n }\n\n return nodes\n}\n\n/**\n * Converts an `export … from` declaration into `ExportNode`s. Forms `printExport` cannot print stay as written.\n */\nfunction toExportNodes(statement: ts.Statement): Array<ast.ExportNode> {\n const { typescript } = loadCompiler()\n if (\n !typescript.isExportDeclaration(statement) ||\n !statement.moduleSpecifier ||\n !typescript.isStringLiteral(statement.moduleSpecifier) ||\n statement.attributes\n )\n return []\n\n const { exportClause, isTypeOnly } = statement\n const path = statement.moduleSpecifier.text\n\n if (!exportClause) return [ast.factory.createExport({ path, isTypeOnly })]\n if (typescript.isNamespaceExport(exportClause)) return [ast.factory.createExport({ name: exportClause.name.text, path, isTypeOnly, asAlias: true })]\n if (exportClause.elements.some((element) => element.propertyName || element.isTypeOnly || typescript.isStringLiteral(element.name))) return []\n\n return [ast.factory.createExport({ name: exportClause.elements.map((element) => element.name.text), path, isTypeOnly })]\n}\n\n/**\n * Splits `source` into its lifted `import`/`export … from` nodes, the `header` above the first one (shebang, directives, comments) and the rest as `body`.\n */\nexport function splitModuleDeclarations(\n source: string,\n filePath: string,\n): { header: string; imports: Array<ast.ImportNode>; exports: Array<ast.ExportNode>; body: string } {\n const { typescript } = loadCompiler()\n const sourceFile = typescript.createSourceFile(filePath, source, typescript.ScriptTarget.Latest)\n const imports: Array<ast.ImportNode> = []\n const exports: Array<ast.ExportNode> = []\n let header = ''\n let body = ''\n let cursor = 0\n\n for (const statement of sourceFile.statements) {\n const importNodes = toImportNodes(statement, filePath)\n const exportNodes = toExportNodes(statement)\n if (!importNodes.length && !exportNodes.length) {\n // Lifted declarations print above the body, so stop at the first one that stays in place to keep the evaluation order.\n if (typescript.isImportDeclaration(statement) || (typescript.isExportDeclaration(statement) && statement.moduleSpecifier)) break\n continue\n }\n\n const text = source.slice(cursor, statement.getStart(sourceFile))\n if (imports.length || exports.length) body += text\n else header = text\n imports.push(...importNodes)\n exports.push(...exportNodes)\n cursor = statement.getEnd()\n }\n\n return { header: header.trim(), imports, exports, body: `${body}${source.slice(cursor)}`.trim() }\n}\n\n/**\n * Joins the printed `nodes` with `separator`; a `Break` widens the next separator to a blank line, and leading, trailing and repeated breaks fold into one.\n *\n * Imperative on purpose: this runs once per source fragment and `map().filter().join()` showed up in deopt traces.\n */\nfunction printNodes({ nodes, separator }: { nodes: Array<ast.CodeNode> | undefined; separator: '\\n' | '\\n\\n' }): string {\n let result = ''\n let pendingBreak = false\n\n for (const node of nodes ?? []) {\n if (node.kind === 'Break') {\n pendingBreak = result !== ''\n continue\n }\n\n const text = printCodeNode(node)\n if (!text) continue\n\n if (result) result += pendingBreak ? '\\n\\n' : separator\n result += text\n pendingBreak = false\n }\n\n return result\n}\n\n/**\n * Indents every non-empty line of `text` by two spaces.\n */\nfunction indentLines(text: string): string {\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => (line.trim() ? ` ${line}` : ''))\n .join('\\n')\n}\n\n/**\n * Strips the common leading whitespace and the surrounding blank lines, counting tabs and spaces alike, so indented template literals start at column zero.\n */\nfunction dedent(text: string): string {\n if (!text) return ''\n\n const lines = text.split('\\n')\n const isBlank = (line: string) => line.trim() === ''\n\n const start = lines.findIndex((line) => !isBlank(line))\n if (start === -1) return ''\n const end = lines.findLastIndex((line) => !isBlank(line))\n\n const trimmed = lines.slice(start, end + 1)\n const indents = trimmed.filter((line) => !isBlank(line)).map((line) => line.match(/^\\s*/)?.[0].length ?? 0)\n const min = indents.length ? Math.min(...indents) : 0\n\n return trimmed.map((line) => (isBlank(line) ? '' : line.slice(min))).join('\\n')\n}\n\n/**\n * Renders `<T>(params): ReturnType`; an async function wraps its return type in `Promise<>`.\n */\nfunction signature({ async: isAsync, generics, params, returnType }: Pick<ast.FunctionNode, 'async' | 'generics' | 'params' | 'returnType'>): string {\n const genericsStr = generics ? `<${Array.isArray(generics) ? generics.join(', ') : generics}>` : ''\n const wrapped = isAsync ? `Promise<${returnType}>` : returnType\n const returnTypeStr = returnType ? `: ${wrapped}` : ''\n\n return `${genericsStr}(${params ?? ''})${returnTypeStr}`\n}\n\n/**\n * Puts the JSDoc block, when it renders to something, above `declaration`.\n */\nfunction withJSDoc({ jsDoc, declaration }: { jsDoc?: ast.JSDocNode | null; declaration: string }): string {\n const jsDocStr = jsDoc ? printJSDoc(jsDoc) : ''\n\n return jsDocStr ? `${jsDocStr}\\n${declaration}` : declaration\n}\n\n/**\n * Converts TypeScript/TSX AST nodes to a string using the TypeScript printer.\n */\nexport function print(...elements: Array<ts.Node>): string {\n const filtered = elements.filter(Boolean)\n if (filtered.length === 0) return ''\n\n const { typescript, printer, sourceFile } = loadCompiler()\n return printer.printList(typescript.ListFormat.MultiLine, typescript.factory.createNodeArray(filtered), sourceFile)\n}\n\n/**\n * Converts a {@link ast.JSDocNode} to a `/** … *\\/` block, dropping blank comments.\n */\nfunction printJSDoc(jsDoc: ast.JSDocNode): string {\n const comments = (jsDoc.comments ?? []).filter((c) => c != null)\n if (comments.length === 0) return ''\n\n const lines = comments\n .flatMap((c) => c.split(/\\r?\\n/))\n .map((l) => l.replace(/\\*\\//g, '* /').replace(/\\r/g, ''))\n .filter((l) => l.trim().length > 0)\n\n if (lines.length === 0) return ''\n\n return ['/**', ...lines.map((l) => ` * ${l}`), ' */'].join('\\n')\n}\n\n/**\n * Converts a {@link ast.ConstNode} to a `const` declaration, mirroring the `Const` component from `@kubb/renderer-jsx`.\n */\nfunction printConst(node: ast.ConstNode): string {\n const { name, export: canExport, type, JSDoc, asConst, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}const ${name}${type ? `: ${type}` : ''} = ${printNodes({ nodes, separator: '\\n' })}${asConst ? ' as const' : ''}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.TypeNode} to a `type` alias, mirroring the `Type` component from `@kubb/renderer-jsx`.\n */\nfunction printType(node: ast.TypeNode): string {\n const { name, export: canExport, JSDoc, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}type ${name} = ${printNodes({ nodes, separator: '\\n' })}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.FunctionNode} to a `function` declaration, mirroring the `Function` component from `@kubb/renderer-jsx`.\n */\nfunction printFunction(node: ast.FunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes } = node\n\n const body = indentLines(printNodes({ nodes, separator: '\\n' }))\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}${isAsync ? 'async ' : ''}`\n const declaration = `${prefix}function ${name}${signature({ async: isAsync, generics, params, returnType })} {${body ? `\\n${body}\\n` : ''}}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts an {@link ast.ArrowFunctionNode} to a `const` arrow function, mirroring the `Function.Arrow` component from `@kubb/renderer-jsx`.\n */\nfunction printArrowFunction(node: ast.ArrowFunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes, singleLine } = node\n\n const body = printNodes({ nodes, separator: '\\n' })\n const arrowBody = singleLine ? ` => ${body}` : body ? ` => {\\n${indentLines(body)}\\n}` : ' => {}'\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}`\n const declaration = `${prefix}const ${name} = ${isAsync ? 'async ' : ''}${signature({ async: isAsync, generics, params, returnType })}${arrowBody}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Dispatches a {@link ast.CodeNode} to the printer for its `kind`.\n */\nfunction printCodeNode(node: ast.CodeNode): string {\n switch (node.kind) {\n case 'Break':\n return ''\n case 'Text':\n case 'Jsx':\n return dedent(node.value)\n case 'Const':\n return printConst(node)\n case 'Type':\n return printType(node)\n case 'Function':\n return printFunction(node)\n case 'ArrowFunction':\n return printArrowFunction(node)\n }\n}\n\n/**\n * Prints a {@link ast.SourceNode} with a blank line between its top-level nodes.\n */\nexport function printSource(node: ast.SourceNode): string {\n return printNodes({ nodes: node.nodes, separator: '\\n\\n' })\n}\n\n/**\n * Wraps a module specifier in single quotes, escaping embedded backslashes and quotes.\n */\nfunction quoteModulePath(path: string): string {\n return `'${path.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\n/**\n * Renders an `import` declaration (default, `* as`, or named with `{ a as b }`, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printImport({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: Pick<ast.ImportNode, 'name' | 'path' | 'isTypeOnly' | 'isNameSpace'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (!Array.isArray(name)) {\n if (isNameSpace) return `import ${typePrefix}* as ${name} from ${from}`\n return `import ${typePrefix}${name} from ${from}`\n }\n\n const specifiers = name.map((item) => {\n if (typeof item === 'object') {\n return item.name ? `${item.propertyName} as ${item.name}` : item.propertyName\n }\n return item\n })\n\n return `import ${typePrefix}{ ${specifiers.join(', ')} } from ${from}`\n}\n\n/**\n * Renders an `export … from` declaration (named, `* as name`, or wildcard, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printExport({ path, name, isTypeOnly = false, asAlias = false }: Pick<ast.ExportNode, 'name' | 'path' | 'isTypeOnly' | 'asAlias'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (Array.isArray(name)) {\n return `export ${typePrefix}{ ${name.join(', ')} } from ${from}`\n }\n\n if (asAlias && name) {\n // An identifier cannot start with a digit, so swap the digit for `_`\n const parsedName = /^\\d/.test(name) ? `_${name.slice(1)}` : name\n return `export ${typePrefix}* as ${parsedName} from ${from}`\n }\n\n if (name) {\n return `export ${typePrefix}{ ${name} } from ${from}`\n }\n\n return `export ${typePrefix}* from ${from}`\n}\n","import { ast } from '@kubb/ast'\nimport { defineExtension } from '@kubb/core'\nimport type * as ts from '@typescript/typescript6'\nimport { compatibility } from '../kubb-extension.json'\nimport { version } from '../package.json'\nimport { getRelativePath, print, printExport, printImport, printSource, resolveOutputPath, splitModuleDeclarations } from './utils.ts'\n\nconst DEFAULT_EXTENSION: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''> = { '.ts': '' }\n\n/**\n * Options accepted by `parserTs` and `parserTsx`.\n */\nexport type ParserTsOptions = {\n /**\n * Rewrite extensions on relative `import`/`export` statements. Each key is the extension of a\n * generated file, and its value is the extension written on the relative specifiers in that\n * file. `''` drops it, and so does a generated file whose extension has no key. Package\n * specifiers stay unchanged. Also applies to relative paths in `copy` templates.\n *\n * Use `{ '.ts': '.js' }` for ESM output compiled to JavaScript, or `{ '.ts': '.ts' }` to run the\n * `.ts` files directly in Node.js or compile them with `rewriteRelativeImportExtensions`.\n *\n * @default { '.ts': '' }\n * @example\n * ```ts\n * parserTs({ extension: { '.ts': '.js' } }) // import './api.js' instead of './api'\n * parserTs({ extension: { '.ts': '.ts' } }) // import './api.ts' instead of './api'\n * ```\n */\n extension?: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''>\n}\n\n/**\n * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST\n * produced by an adapter and prints it as TypeScript source. Imports and exports\n * are rewritten based on each file's metadata and the `extension` option. The\n * `print` helper renders TypeScript compiler nodes with the TypeScript printer.\n *\n * Used automatically when no `parsers` option is set on `defineConfig`. Use\n * `parserTsx` instead for React projects that emit JSX.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTs } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTs()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTs = defineExtension<ParserTsOptions, object, ts.Node>({\n kind: 'parser',\n meta: { name: 'typescript', version, compatibility, issues: 'https://github.com/kubb-labs/kubb/issues' },\n build({ extension = DEFAULT_EXTENSION }) {\n return {\n extNames: ['.ts', '.js'],\n print,\n parse(file) {\n const extname = extension[file.extname] || undefined\n\n const source = file.sources\n .map((item) => printSource(item))\n .filter(Boolean)\n .map((text) => text.trimEnd())\n .join('\\n\\n')\n\n const importLines = file.imports.map((item) =>\n printImport({\n ...item,\n path: resolveOutputPath(item.root ? getRelativePath(item.root, item.path) : item.path, extname, Boolean(item.root)),\n }),\n )\n\n const exportLines = file.exports.map((item) => printExport({ ...item, path: resolveOutputPath(item.path, extname, item.path.startsWith('.')) }))\n\n const importExportBlock = [...importLines, ...exportLines].join('\\n')\n\n const parts = [file.banner, importExportBlock, source, file.footer].filter((segment): segment is string => Boolean(segment)).map((s) => s.trimEnd())\n\n return parts.join('\\n\\n')\n },\n copy(file, source) {\n const { header, imports, exports, body } = splitModuleDeclarations(source, file.path)\n\n return {\n ...file,\n banner: [header, file.banner].filter(Boolean).join('\\n') || undefined,\n imports: [...file.imports, ...imports],\n exports: [...file.exports, ...exports],\n sources: [ast.factory.createSource({ nodes: [ast.factory.createText(body)] })],\n }\n },\n }\n },\n})\n","import { defineExtension } from '@kubb/core'\nimport type * as ts from '@typescript/typescript6'\nimport { parserTs, type ParserTsOptions } from './parserTs.ts'\n\n/**\n * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs` because the\n * TypeScript compiler handles JSX natively via `ScriptKind.TSX`, so it shares the\n * same `extension` option.\n *\n * Add to the `parsers` array on `defineConfig` when generating components for\n * React (or any framework that emits JSX).\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTsx } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTsx()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTsx = defineExtension<ParserTsOptions, object, ts.Node>({\n kind: 'parser',\n meta: { name: 'tsx', issues: 'https://github.com/kubb-labs/kubb/issues' },\n build: (options) => ({ ...parserTs(options), extNames: ['.tsx', '.jsx'] }),\n})\n"],"mappings":";;;;;;;;;;;;;;;;AEWA,IAAI;;;;;;;AAQJ,SAAS,eAAyB;CAChC,IAAI,UAAU,OAAO;CAErB,MAAM,cAAA,GAAwBA,YAAAA,cAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,IAA6B,CAAC,CAAC,yBAAyB;CAEtF,WAAW;EACT;EAEA,SAAS,WAAW,cAAc;GAChC,uBAAuB;GACvB,SAAS,WAAW,YAAY;GAChC,gBAAgB;GAChB,eAAe;EACjB,CAAC;EACD,YAAY,WAAW,iBAAiB,aAAa,IAAI,WAAW,aAAa,QAAQ,MAAM,WAAW,WAAW,GAAG;CAC1H;CAEA,OAAO;AACT;;;;AAKA,SAAgB,gBAAgB,MAAc,UAA0B;CACtE,MAAM,WAAA,GAAUC,UAAAA,SAAAA,EAAAA,GAASC,UAAAA,QAAAA,CAAQ,IAAI,GAAG,QAAQ,CAAC,CAAC,WAAW,MAAM,GAAG;CACtE,OAAO,QAAQ,WAAW,KAAK,IAAI,UAAU,KAAK;AACpD;;;;AAKA,SAAgB,kBAAkB,MAAc,SAA6B,WAA4B;CACvG,IAAI,CAAC,WAAW,OAAO;CACvB,MAAM,WAAA,GAAUC,UAAAA,QAAAA,CAAW,IAAI;CAC/B,OAAO,UAAU,GAAG,KAAK,MAAM,GAAG,CAAC,QAAQ,MAAM,IAAI,WAAW,OAAO;AACzE;;;;AAKA,SAAS,aAAa,SAA8E;CAClG,IAAI,CAAC,QAAQ,cAAc,OAAO,QAAQ,KAAK;CAE/C,MAAM,EAAE,eAAe,aAAa;CACpC,MAAM,EAAE,iBAAiB;CACzB,OAAO;EAAE,cAAc,WAAW,gBAAgB,YAAY,IAAI,gBAAgB,aAAa,IAAI,IAAI,aAAa;EAAM,MAAM,QAAQ,KAAK;CAAK;AACpJ;;;;AAKA,SAAS,cAAc,WAAyB,UAAyC;CACvF,MAAM,EAAE,eAAe,aAAa;CACpC,IAAI,CAAC,WAAW,oBAAoB,SAAS,KAAK,CAAC,UAAU,gBAAgB,CAAC,WAAW,gBAAgB,UAAU,eAAe,KAAK,UAAU,YAC/I,OAAO,CAAC;CAEV,MAAM,EAAE,MAAM,eAAe,kBAAkB,UAAU;CACzD,MAAM,YAAY,UAAU,gBAAgB;CAC5C,MAAM,SAAS,UAAU,WAAW,GAAG,IAAI;EAAE,OAAA,GAAMC,UAAAA,QAAAA,EAAAA,GAAQF,UAAAA,QAAAA,CAAQ,QAAQ,GAAG,SAAS;EAAG,MAAM;CAAS,IAAI,EAAE,MAAM,UAAU;CAC/H,MAAM,aAAa,kBAAkB,WAAW,WAAW;CAC3D,MAAM,QAA+B,CAAC;CAEtC,IAAI,MAAM,MAAM,KAAKG,UAAAA,IAAI,QAAQ,aAAa;EAAE,MAAM,KAAK;EAAM,GAAG;EAAQ;CAAW,CAAC,CAAC;CACzF,IAAI,iBAAiB,WAAW,kBAAkB,aAAa,GAC7D,MAAM,KAAKA,UAAAA,IAAI,QAAQ,aAAa;EAAE,MAAM,cAAc,KAAK;EAAM,GAAG;EAAQ;EAAY,aAAa;CAAK,CAAC,CAAC;CAElH,IAAI,iBAAiB,WAAW,eAAe,aAAa,GAAG;EAC7D,MAAM,SAAS,cAAc,SAAS,QAAQ,YAAY,CAAC,QAAQ,UAAU;EAC7E,MAAM,QAAQ,cAAc,SAAS,QAAQ,YAAY,QAAQ,UAAU;EAC3E,IAAI,OAAO,QAAQ,MAAM,KAAKA,UAAAA,IAAI,QAAQ,aAAa;GAAE,MAAM,OAAO,IAAI,YAAY;GAAG,GAAG;GAAQ;EAAW,CAAC,CAAC;EACjH,IAAI,MAAM,QAAQ,MAAM,KAAKA,UAAAA,IAAI,QAAQ,aAAa;GAAE,MAAM,MAAM,IAAI,YAAY;GAAG,GAAG;GAAQ,YAAY;EAAK,CAAC,CAAC;CACvH;CAEA,OAAO;AACT;;;;AAKA,SAAS,cAAc,WAAgD;CACrE,MAAM,EAAE,eAAe,aAAa;CACpC,IACE,CAAC,WAAW,oBAAoB,SAAS,KACzC,CAAC,UAAU,mBACX,CAAC,WAAW,gBAAgB,UAAU,eAAe,KACrD,UAAU,YAEV,OAAO,CAAC;CAEV,MAAM,EAAE,cAAc,eAAe;CACrC,MAAM,OAAO,UAAU,gBAAgB;CAEvC,IAAI,CAAC,cAAc,OAAO,CAACA,UAAAA,IAAI,QAAQ,aAAa;EAAE;EAAM;CAAW,CAAC,CAAC;CACzE,IAAI,WAAW,kBAAkB,YAAY,GAAG,OAAO,CAACA,UAAAA,IAAI,QAAQ,aAAa;EAAE,MAAM,aAAa,KAAK;EAAM;EAAM;EAAY,SAAS;CAAK,CAAC,CAAC;CACnJ,IAAI,aAAa,SAAS,MAAM,YAAY,QAAQ,gBAAgB,QAAQ,cAAc,WAAW,gBAAgB,QAAQ,IAAI,CAAC,GAAG,OAAO,CAAC;CAE7I,OAAO,CAACA,UAAAA,IAAI,QAAQ,aAAa;EAAE,MAAM,aAAa,SAAS,KAAK,YAAY,QAAQ,KAAK,IAAI;EAAG;EAAM;CAAW,CAAC,CAAC;AACzH;;;;AAKA,SAAgB,wBACd,QACA,UACkG;CAClG,MAAM,EAAE,eAAe,aAAa;CACpC,MAAM,aAAa,WAAW,iBAAiB,UAAU,QAAQ,WAAW,aAAa,MAAM;CAC/F,MAAM,UAAiC,CAAC;CACxC,MAAM,UAAiC,CAAC;CACxC,IAAI,SAAS;CACb,IAAI,OAAO;CACX,IAAI,SAAS;CAEb,KAAK,MAAM,aAAa,WAAW,YAAY;EAC7C,MAAM,cAAc,cAAc,WAAW,QAAQ;EACrD,MAAM,cAAc,cAAc,SAAS;EAC3C,IAAI,CAAC,YAAY,UAAU,CAAC,YAAY,QAAQ;GAE9C,IAAI,WAAW,oBAAoB,SAAS,KAAM,WAAW,oBAAoB,SAAS,KAAK,UAAU,iBAAkB;GAC3H;EACF;EAEA,MAAM,OAAO,OAAO,MAAM,QAAQ,UAAU,SAAS,UAAU,CAAC;EAChE,IAAI,QAAQ,UAAU,QAAQ,QAAQ,QAAQ;OACzC,SAAS;EACd,QAAQ,KAAK,GAAG,WAAW;EAC3B,QAAQ,KAAK,GAAG,WAAW;EAC3B,SAAS,UAAU,OAAO;CAC5B;CAEA,OAAO;EAAE,QAAQ,OAAO,KAAK;EAAG;EAAS;EAAS,MAAM,GAAG,OAAO,OAAO,MAAM,MAAM,IAAI,KAAK;CAAE;AAClG;;;;;;AAOA,SAAS,WAAW,EAAE,OAAO,aAA2F;CACtH,IAAI,SAAS;CACb,IAAI,eAAe;CAEnB,KAAK,MAAM,QAAQ,SAAS,CAAC,GAAG;EAC9B,IAAI,KAAK,SAAS,SAAS;GACzB,eAAe,WAAW;GAC1B;EACF;EAEA,MAAM,OAAO,cAAc,IAAI;EAC/B,IAAI,CAAC,MAAM;EAEX,IAAI,QAAQ,UAAU,eAAe,SAAS;EAC9C,UAAU;EACV,eAAe;CACjB;CAEA,OAAO;AACT;;;;AAKA,SAAS,YAAY,MAAsB;CACzC,IAAI,CAAC,MAAM,OAAO;CAClB,OAAO,KACJ,MAAM,IAAI,CAAC,CACX,KAAK,SAAU,KAAK,KAAK,IAAI,KAAK,SAAS,EAAG,CAAC,CAC/C,KAAK,IAAI;AACd;;;;AAKA,SAAS,OAAO,MAAsB;CACpC,IAAI,CAAC,MAAM,OAAO;CAElB,MAAM,QAAQ,KAAK,MAAM,IAAI;CAC7B,MAAM,WAAW,SAAiB,KAAK,KAAK,MAAM;CAElD,MAAM,QAAQ,MAAM,WAAW,SAAS,CAAC,QAAQ,IAAI,CAAC;CACtD,IAAI,UAAU,IAAI,OAAO;CACzB,MAAM,MAAM,MAAM,eAAe,SAAS,CAAC,QAAQ,IAAI,CAAC;CAExD,MAAM,UAAU,MAAM,MAAM,OAAO,MAAM,CAAC;CAC1C,MAAM,UAAU,QAAQ,QAAQ,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,KAAK,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC;CAC1G,MAAM,MAAM,QAAQ,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI;CAEpD,OAAO,QAAQ,KAAK,SAAU,QAAQ,IAAI,IAAI,KAAK,KAAK,MAAM,GAAG,CAAE,CAAC,CAAC,KAAK,IAAI;AAChF;;;;AAKA,SAAS,UAAU,EAAE,OAAO,SAAS,UAAU,QAAQ,cAA8F;CACnJ,MAAM,cAAc,WAAW,IAAI,MAAM,QAAQ,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK;CACjG,MAAM,UAAU,UAAU,WAAW,WAAW,KAAK;CACrD,MAAM,gBAAgB,aAAa,KAAK,YAAY;CAEpD,OAAO,GAAG,YAAY,GAAG,UAAU,GAAG,GAAG;AAC3C;;;;AAKA,SAAS,UAAU,EAAE,OAAO,eAA8E;CACxG,MAAM,WAAW,QAAQ,WAAW,KAAK,IAAI;CAE7C,OAAO,WAAW,GAAG,SAAS,IAAI,gBAAgB;AACpD;;;;AAKA,SAAgB,MAAM,GAAG,UAAkC;CACzD,MAAM,WAAW,SAAS,OAAO,OAAO;CACxC,IAAI,SAAS,WAAW,GAAG,OAAO;CAElC,MAAM,EAAE,YAAY,SAAS,eAAe,aAAa;CACzD,OAAO,QAAQ,UAAU,WAAW,WAAW,WAAW,WAAW,QAAQ,gBAAgB,QAAQ,GAAG,UAAU;AACpH;;;;AAKA,SAAS,WAAW,OAA8B;CAChD,MAAM,YAAY,MAAM,YAAY,CAAC,EAAA,CAAG,QAAQ,MAAM,KAAK,IAAI;CAC/D,IAAI,SAAS,WAAW,GAAG,OAAO;CAElC,MAAM,QAAQ,SACX,SAAS,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAChC,KAAK,MAAM,EAAE,QAAQ,SAAS,KAAK,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,CACxD,QAAQ,MAAM,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC;CAEpC,IAAI,MAAM,WAAW,GAAG,OAAO;CAE/B,OAAO;EAAC;EAAO,GAAG,MAAM,KAAK,MAAM,MAAM,GAAG;EAAG;CAAK,CAAC,CAAC,KAAK,IAAI;AACjE;;;;AAKA,SAAS,WAAW,MAA6B;CAC/C,MAAM,EAAE,MAAM,QAAQ,WAAW,MAAM,OAAO,SAAS,UAAU;CAIjE,OAAO,UAAU;EAAE,OAAO;EAAO,aAAA,GAFV,YAAY,YAAY,GAAG,QAAQ,OAAO,OAAO,KAAK,SAAS,GAAG,KAAK,WAAW;GAAE;GAAO,WAAW;EAAK,CAAC,IAAI,UAAU,cAAc;CAElH,CAAC;AAChD;;;;AAKA,SAAS,UAAU,MAA4B;CAC7C,MAAM,EAAE,MAAM,QAAQ,WAAW,OAAO,UAAU;CAIlD,OAAO,UAAU;EAAE,OAAO;EAAO,aAAA,GAFV,YAAY,YAAY,GAAG,OAAO,KAAK,KAAK,WAAW;GAAE;GAAO,WAAW;EAAK,CAAC;CAE3D,CAAC;AAChD;;;;AAKA,SAAS,cAAc,MAAgC;CACrD,MAAM,EAAE,MAAM,SAAS,WAAW,QAAQ,WAAW,OAAO,SAAS,UAAU,QAAQ,YAAY,OAAO,UAAU;CAEpH,MAAM,OAAO,YAAY,WAAW;EAAE;EAAO,WAAW;CAAK,CAAC,CAAC;CAI/D,OAAO,UAAU;EAAE,OAAO;EAAO,aAAA,GAFV,GADL,YAAY,YAAY,KAAK,YAAY,aAAa,KAAK,UAAU,WAAW,KACpE,WAAW,OAAO,UAAU;GAAE,OAAO;GAAS;GAAU;GAAQ;EAAW,CAAC,EAAE,IAAI,OAAO,KAAK,KAAK,MAAM,GAAG;CAE7F,CAAC;AAChD;;;;AAKA,SAAS,mBAAmB,MAAqC;CAC/D,MAAM,EAAE,MAAM,SAAS,WAAW,QAAQ,WAAW,OAAO,SAAS,UAAU,QAAQ,YAAY,OAAO,OAAO,eAAe;CAEhI,MAAM,OAAO,WAAW;EAAE;EAAO,WAAW;CAAK,CAAC;CAClD,MAAM,YAAY,aAAa,OAAO,SAAS,OAAO,UAAU,YAAY,IAAI,EAAE,OAAO;CAIzF,OAAO,UAAU;EAAE,OAAO;EAAO,aAAA,GAFV,GADL,YAAY,YAAY,KAAK,YAAY,aAAa,KAC1C,QAAQ,KAAK,KAAK,UAAU,WAAW,KAAK,UAAU;GAAE,OAAO;GAAS;GAAU;GAAQ;EAAW,CAAC,IAAI;CAE3F,CAAC;AAChD;;;;AAKA,SAAS,cAAc,MAA4B;CACjD,QAAQ,KAAK,MAAb;EACE,KAAK,SACH,OAAO;EACT,KAAK;EACL,KAAK,OACH,OAAO,OAAO,KAAK,KAAK;EAC1B,KAAK,SACH,OAAO,WAAW,IAAI;EACxB,KAAK,QACH,OAAO,UAAU,IAAI;EACvB,KAAK,YACH,OAAO,cAAc,IAAI;EAC3B,KAAK,iBACH,OAAO,mBAAmB,IAAI;CAClC;AACF;;;;AAKA,SAAgB,YAAY,MAA8B;CACxD,OAAO,WAAW;EAAE,OAAO,KAAK;EAAO,WAAW;CAAO,CAAC;AAC5D;;;;AAKA,SAAS,gBAAgB,MAAsB;CAC7C,OAAO,IAAI,KAAK,QAAQ,OAAO,MAAM,CAAC,CAAC,QAAQ,MAAM,KAAK,EAAE;AAC9D;;;;AAKA,SAAgB,YAAY,EAC1B,MACA,MACA,aAAa,OACb,cAAc,SACiE;CAC/E,MAAM,aAAa,aAAa,UAAU;CAC1C,MAAM,OAAO,gBAAgB,IAAI;CAEjC,IAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;EACxB,IAAI,aAAa,OAAO,UAAU,WAAW,OAAO,KAAK,QAAQ;EACjE,OAAO,UAAU,aAAa,KAAK,QAAQ;CAC7C;CASA,OAAO,UAAU,WAAW,IAPT,KAAK,KAAK,SAAS;EACpC,IAAI,OAAO,SAAS,UAClB,OAAO,KAAK,OAAO,GAAG,KAAK,aAAa,MAAM,KAAK,SAAS,KAAK;EAEnE,OAAO;CACT,CAEyC,CAAC,CAAC,KAAK,IAAI,EAAE,UAAU;AAClE;;;;AAKA,SAAgB,YAAY,EAAE,MAAM,MAAM,aAAa,OAAO,UAAU,SAAmF;CACzJ,MAAM,aAAa,aAAa,UAAU;CAC1C,MAAM,OAAO,gBAAgB,IAAI;CAEjC,IAAI,MAAM,QAAQ,IAAI,GACpB,OAAO,UAAU,WAAW,IAAI,KAAK,KAAK,IAAI,EAAE,UAAU;CAG5D,IAAI,WAAW,MAGb,OAAO,UAAU,WAAW,OADT,MAAM,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,CAAC,MAAM,KACd,QAAQ;CAGxD,IAAI,MACF,OAAO,UAAU,WAAW,IAAI,KAAK,UAAU;CAGjD,OAAO,UAAU,WAAW,SAAS;AACvC;;;AChYA,MAAM,oBAAmF,EAAE,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;AAiDrG,MAAa,YAAA,GAAWC,WAAAA,gBAAAA,CAAkD;CACxE,MAAM;CACN,MAAM;EAAE,MAAM;EAAc;EAAS;EAAe,QAAQ;CAA2C;CACvG,MAAM,EAAE,YAAY,qBAAqB;EACvC,OAAO;GACL,UAAU,CAAC,OAAO,KAAK;GACvB;GACA,MAAM,MAAM;IACV,MAAM,UAAU,UAAU,KAAK,YAAY,KAAA;IAE3C,MAAM,SAAS,KAAK,QACjB,KAAK,SAAS,YAAY,IAAI,CAAC,CAAC,CAChC,OAAO,OAAO,CAAC,CACf,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,CAC7B,KAAK,MAAM;IAEd,MAAM,cAAc,KAAK,QAAQ,KAAK,SACpC,YAAY;KACV,GAAG;KACH,MAAM,kBAAkB,KAAK,OAAO,gBAAgB,KAAK,MAAM,KAAK,IAAI,IAAI,KAAK,MAAM,SAAS,QAAQ,KAAK,IAAI,CAAC;IACpH,CAAC,CACH;IAEA,MAAM,cAAc,KAAK,QAAQ,KAAK,SAAS,YAAY;KAAE,GAAG;KAAM,MAAM,kBAAkB,KAAK,MAAM,SAAS,KAAK,KAAK,WAAW,GAAG,CAAC;IAAE,CAAC,CAAC;IAE/I,MAAM,oBAAoB,CAAC,GAAG,aAAa,GAAG,WAAW,CAAC,CAAC,KAAK,IAAI;IAIpE,OAFc;KAAC,KAAK;KAAQ;KAAmB;KAAQ,KAAK;IAAM,CAAC,CAAC,QAAQ,YAA+B,QAAQ,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,QAAQ,CAEvI,CAAC,CAAC,KAAK,MAAM;GAC1B;GACA,KAAK,MAAM,QAAQ;IACjB,MAAM,EAAE,QAAQ,SAAS,SAAS,SAAS,wBAAwB,QAAQ,KAAK,IAAI;IAEpF,OAAO;KACL,GAAG;KACH,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK,KAAA;KAC5D,SAAS,CAAC,GAAG,KAAK,SAAS,GAAG,OAAO;KACrC,SAAS,CAAC,GAAG,KAAK,SAAS,GAAG,OAAO;KACrC,SAAS,CAACC,UAAAA,IAAI,QAAQ,aAAa,EAAE,OAAO,CAACA,UAAAA,IAAI,QAAQ,WAAW,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/E;GACF;EACF;CACF;AACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;ACzED,MAAa,aAAA,GAAYC,WAAAA,gBAAAA,CAAkD;CACzE,MAAM;CACN,MAAM;EAAE,MAAM;EAAO,QAAQ;CAA2C;CACxE,QAAQ,aAAa;EAAE,GAAG,SAAS,OAAO;EAAG,UAAU,CAAC,QAAQ,MAAM;CAAE;AAC1E,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["require","createRequire","dirname","fileURLToPath","relative","getExtname","resolve","ast","parse","defineExtension","ast","defineExtension"],"sources":["../kubb-extension.json","../package.json","../src/utils.ts","../src/parserTs.ts","../src/parserTsx.ts"],"sourcesContent":["","","import { createRequire } from 'node:module'\nimport { dirname, extname as getExtname, relative, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { ast } from '@kubb/ast'\nimport { type ImportSpecifier, type ModuleExportName, parse, type ProgramStatement } from 'yuku-parser'\n\n/**\n * A TypeScript compiler node, typed structurally so `@kubb/parser-ts` does not depend on `@typescript/typescript6`.\n *\n * @deprecated Pass printed strings to `print` instead. Support for compiler nodes is removed in the next major.\n */\nexport type TsNode = { readonly kind: number }\n\ntype Compiler = {\n printNodes: (nodes: Array<TsNode>) => string\n}\n\nlet compiler: Compiler | undefined\n\n// The parts of the TypeScript 6 API that printing compiler nodes uses, typed here so no package depends on it\ntype TypeScript = {\n createPrinter(options: { omitTrailingSemicolon: boolean; newLine: number; removeComments: boolean; noEmitHelpers: boolean }): {\n printList(format: number, list: unknown, sourceFile: unknown): string\n }\n createSourceFile(fileName: string, text: string, target: number, setParentNodes: boolean, kind: number): unknown\n factory: { createNodeArray(nodes: Array<TsNode>): unknown }\n NewLineKind: { LineFeed: number }\n ScriptTarget: { ES2022: number }\n ScriptKind: { TSX: number }\n ListFormat: { MultiLine: number }\n}\n\n/**\n * Loads TypeScript the first time `print` gets a compiler node. Strings never need it, so bundles for edge runtimes such as Cloudflare Workers leave it out.\n *\n * Loaded with `require`, not `import`: when ESM imports a CommonJS package, Node keeps a second copy of its source\n * to detect named exports, and for TypeScript that copy is about 9 MB.\n */\nfunction loadCompiler(): Compiler {\n if (compiler) return compiler\n\n const require = createRequire(import.meta.url)\n // Look in the user's project first: a strict package manager such as pnpm does not link it next to this package\n const paths = [process.cwd(), dirname(fileURLToPath(import.meta.url))]\n let typescript: TypeScript | undefined\n // `typescript` 5 and 6 ship the compiler API; next to TypeScript 7 it comes from `@typescript/typescript6`\n for (const name of ['typescript', '@typescript/typescript6']) {\n try {\n const candidate = require(require.resolve(name, { paths }))\n if (typeof candidate.createPrinter === 'function') {\n typescript = candidate as TypeScript\n break\n }\n } catch {}\n }\n if (!typescript) {\n throw new Error(\n '`print` received a TypeScript compiler node, which needs `typescript` 5 or 6, or `@typescript/typescript6`, installed. Pass a printed string instead.',\n )\n }\n\n // One printer serves every call; printing does not mutate the source file, which only lends its compiler options\n const printer = typescript.createPrinter({\n omitTrailingSemicolon: true,\n newLine: typescript.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n })\n const sourceFile = typescript.createSourceFile('print.tsx', '', typescript.ScriptTarget.ES2022, true, typescript.ScriptKind.TSX)\n\n compiler = {\n printNodes: (nodes) => printer.printList(typescript.ListFormat.MultiLine, typescript.factory.createNodeArray(nodes), sourceFile),\n }\n\n return compiler\n}\n\n/**\n * Module specifier that imports `filePath` from the file at `root`: POSIX, relative to that file's directory, `./`-prefixed unless it climbs with `../`.\n */\nexport function getRelativePath(root: string, filePath: string): string {\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n return slashed.startsWith('../') ? slashed : `./${slashed}`\n}\n\n/**\n * Swaps the extension of a relative import/export path for `extname`. Package specifiers and extension-less paths stay as-is.\n */\nexport function resolveOutputPath(path: string, extname: string | undefined, rootAware: boolean): string {\n if (!rootAware) return path\n const current = getExtname(path)\n return current ? `${path.slice(0, -current.length)}${extname ?? ''}` : path\n}\n\n/**\n * Node types this module reads from the yuku AST.\n */\nconst nodeTypes = {\n identifier: 'Identifier',\n literal: 'Literal',\n importDeclaration: 'ImportDeclaration',\n importSpecifier: 'ImportSpecifier',\n importDefaultSpecifier: 'ImportDefaultSpecifier',\n importNamespaceSpecifier: 'ImportNamespaceSpecifier',\n exportAllDeclaration: 'ExportAllDeclaration',\n exportNamedDeclaration: 'ExportNamedDeclaration',\n} as const\n\n/**\n * `importKind` and `exportKind` values this module reads from the yuku AST.\n */\nconst declarationKinds = {\n type: 'type',\n} as const\n\nfunction nameOf(node: ModuleExportName): string {\n return node.type === nodeTypes.literal ? node.value : node.name\n}\n\n/**\n * Converts an import specifier into an `ImportNode` name, keeping the quotes of a string-literal name (`{ 'a-b' as ab }`).\n */\nfunction toImportName({ imported, local }: ImportSpecifier): string | { propertyName: string; name: string } {\n if (imported.type === nodeTypes.identifier && imported.name === local.name) return local.name\n\n return { propertyName: imported.type === nodeTypes.literal ? quoteModulePath(imported.value) : imported.name, name: local.name }\n}\n\n/**\n * Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes or a phase stay as written.\n */\nfunction toImportNodes(statement: ProgramStatement, filePath: string): Array<ast.ImportNode> {\n if (statement.type !== nodeTypes.importDeclaration || !statement.specifiers.length || statement.attributes.length || statement.phase) return []\n\n const specifier = statement.source.value\n const target = specifier.startsWith('.') ? { path: resolve(dirname(filePath), specifier), root: filePath } : { path: specifier }\n const isTypeOnly = statement.importKind === declarationKinds.type\n const nodes: Array<ast.ImportNode> = []\n const named = statement.specifiers.filter((element) => element.type === nodeTypes.importSpecifier)\n\n for (const element of statement.specifiers) {\n if (element.type === nodeTypes.importDefaultSpecifier) nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly }))\n if (element.type === nodeTypes.importNamespaceSpecifier)\n nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly, isNameSpace: true }))\n }\n const values = named.filter((element) => element.importKind !== declarationKinds.type)\n const types = named.filter((element) => element.importKind === declarationKinds.type)\n if (values.length) nodes.push(ast.factory.createImport({ name: values.map(toImportName), ...target, isTypeOnly }))\n if (types.length) nodes.push(ast.factory.createImport({ name: types.map(toImportName), ...target, isTypeOnly: true }))\n\n return nodes\n}\n\n/**\n * Converts an `export … from` declaration into `ExportNode`s. Forms `printExport` cannot print stay as written.\n */\nfunction toExportNodes(statement: ProgramStatement): Array<ast.ExportNode> {\n if (statement.type !== nodeTypes.exportAllDeclaration && statement.type !== nodeTypes.exportNamedDeclaration) return []\n if (!statement.source || statement.attributes.length) return []\n\n const path = statement.source.value\n const isTypeOnly = statement.exportKind === declarationKinds.type\n\n if (statement.type === nodeTypes.exportAllDeclaration) {\n return [\n statement.exported\n ? ast.factory.createExport({ name: nameOf(statement.exported), path, isTypeOnly, asAlias: true })\n : ast.factory.createExport({ path, isTypeOnly }),\n ]\n }\n if (\n statement.specifiers.some(\n (element) =>\n element.exportKind === declarationKinds.type || element.exported.type === nodeTypes.literal || nameOf(element.exported) !== nameOf(element.local),\n )\n )\n return []\n\n return [ast.factory.createExport({ name: statement.specifiers.map((element) => nameOf(element.local)), path, isTypeOnly })]\n}\n\n/**\n * Splits `source` into its lifted `import`/`export … from` nodes, the `header` above the first one (shebang, directives, comments) and the rest as `body`.\n */\nexport function splitModuleDeclarations(\n source: string,\n filePath: string,\n): { header: string; imports: Array<ast.ImportNode>; exports: Array<ast.ExportNode>; body: string } {\n const { program } = parse(source, { lang: 'ts', sourceType: 'module' })\n const imports: Array<ast.ImportNode> = []\n const exports: Array<ast.ExportNode> = []\n let header = ''\n let body = ''\n let cursor = 0\n\n for (const statement of program.body) {\n const importNodes = toImportNodes(statement, filePath)\n const exportNodes = toExportNodes(statement)\n if (!importNodes.length && !exportNodes.length) {\n // Lifted declarations print above the body, so stop at the first one that stays in place to keep the evaluation order.\n if (\n statement.type === nodeTypes.importDeclaration ||\n ((statement.type === nodeTypes.exportNamedDeclaration || statement.type === nodeTypes.exportAllDeclaration) && statement.source)\n )\n break\n continue\n }\n\n const text = source.slice(cursor, statement.start)\n if (imports.length || exports.length) body += text\n else header = text\n imports.push(...importNodes)\n exports.push(...exportNodes)\n cursor = statement.end\n }\n\n return { header: header.trim(), imports, exports, body: `${body}${source.slice(cursor)}`.trim() }\n}\n\n/**\n * Joins the printed `nodes` with `separator`; a `Break` widens the next separator to a blank line, and leading, trailing and repeated breaks fold into one.\n *\n * Imperative on purpose: this runs once per source fragment and `map().filter().join()` showed up in deopt traces.\n */\nfunction printNodes({ nodes, separator }: { nodes: Array<ast.CodeNode> | undefined; separator: '\\n' | '\\n\\n' }): string {\n let result = ''\n let pendingBreak = false\n\n for (const node of nodes ?? []) {\n if (node.kind === 'Break') {\n pendingBreak = result !== ''\n continue\n }\n\n const text = printCodeNode(node)\n if (!text) continue\n\n if (result) result += pendingBreak ? '\\n\\n' : separator\n result += text\n pendingBreak = false\n }\n\n return result\n}\n\n/**\n * Indents every non-empty line of `text` by two spaces.\n */\nfunction indentLines(text: string): string {\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => (line.trim() ? ` ${line}` : ''))\n .join('\\n')\n}\n\n/**\n * Strips the common leading whitespace and the surrounding blank lines, counting tabs and spaces alike, so indented template literals start at column zero.\n */\nfunction dedent(text: string): string {\n if (!text) return ''\n // Most text nodes are one line, so the common indent is its leading whitespace.\n if (!text.includes('\\n')) return text.trim() ? text.trimStart() : ''\n\n const lines = text.split('\\n')\n const isBlank = (line: string) => line.trim() === ''\n\n const start = lines.findIndex((line) => !isBlank(line))\n if (start === -1) return ''\n const end = lines.findLastIndex((line) => !isBlank(line))\n\n const trimmed = lines.slice(start, end + 1)\n // A loop, not `Math.min(...indents)`, which overflows the stack on very long text.\n let min = Infinity\n for (const line of trimmed) {\n if (!isBlank(line)) min = Math.min(min, line.length - line.trimStart().length)\n }\n\n return trimmed.map((line) => (isBlank(line) ? '' : line.slice(min))).join('\\n')\n}\n\n/**\n * Renders `<T>(params): ReturnType`; an async function wraps its return type in `Promise<>`.\n */\nfunction signature({ async: isAsync, generics, params, returnType }: Pick<ast.FunctionNode, 'async' | 'generics' | 'params' | 'returnType'>): string {\n const genericsStr = generics ? `<${Array.isArray(generics) ? generics.join(', ') : generics}>` : ''\n const wrapped = isAsync ? `Promise<${returnType}>` : returnType\n const returnTypeStr = returnType ? `: ${wrapped}` : ''\n\n return `${genericsStr}(${params ?? ''})${returnTypeStr}`\n}\n\n/**\n * Puts the JSDoc block, when it renders to something, above `declaration`.\n */\nfunction withJSDoc({ jsDoc, declaration }: { jsDoc?: ast.JSDocNode | null; declaration: string }): string {\n const jsDocStr = jsDoc ? printJSDoc(jsDoc) : ''\n\n return jsDocStr ? `${jsDocStr}\\n${declaration}` : declaration\n}\n\n/**\n * Joins printed code fragments with a newline.\n *\n * Passing TypeScript compiler nodes still works but is deprecated and needs `typescript` 5 or 6, or `@typescript/typescript6`, installed.\n * Support for compiler nodes is removed in the next major.\n */\nexport function print(...elements: Array<string | TsNode>): string {\n const filtered = elements.filter(Boolean)\n if (filtered.length === 0) return ''\n if (filtered.every((element) => typeof element === 'string')) return filtered.join('\\n')\n // Printing compiler nodes as one list keeps the output byte-for-byte the same as before strings were accepted\n if (filtered.every((element) => typeof element !== 'string')) return loadCompiler().printNodes(filtered)\n\n return filtered.map((element) => (typeof element === 'string' ? element : loadCompiler().printNodes([element]).trimEnd())).join('\\n')\n}\n\n/**\n * Converts a {@link ast.JSDocNode} to a `/** … *\\/` block, dropping blank comments.\n */\nfunction printJSDoc(jsDoc: ast.JSDocNode): string {\n const comments = (jsDoc.comments ?? []).filter((c) => c != null)\n if (comments.length === 0) return ''\n\n const lines = comments\n .flatMap((c) => c.split(/\\r?\\n/))\n .map((l) => l.replace(/\\*\\//g, '* /').replace(/\\r/g, ''))\n .filter((l) => l.trim().length > 0)\n\n if (lines.length === 0) return ''\n\n return ['/**', ...lines.map((l) => ` * ${l}`), ' */'].join('\\n')\n}\n\n/**\n * Converts a {@link ast.ConstNode} to a `const` declaration, mirroring the `Const` component from `@kubb/renderer-jsx`.\n */\nfunction printConst(node: ast.ConstNode): string {\n const { name, export: canExport, type, JSDoc, asConst, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}const ${name}${type ? `: ${type}` : ''} = ${printNodes({ nodes, separator: '\\n' })}${asConst ? ' as const' : ''}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.TypeNode} to a `type` alias, mirroring the `Type` component from `@kubb/renderer-jsx`.\n */\nfunction printType(node: ast.TypeNode): string {\n const { name, export: canExport, JSDoc, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}type ${name} = ${printNodes({ nodes, separator: '\\n' })}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.FunctionNode} to a `function` declaration, mirroring the `Function` component from `@kubb/renderer-jsx`.\n */\nfunction printFunction(node: ast.FunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes } = node\n\n const body = indentLines(printNodes({ nodes, separator: '\\n' }))\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}${isAsync ? 'async ' : ''}`\n const declaration = `${prefix}function ${name}${signature({ async: isAsync, generics, params, returnType })} {${body ? `\\n${body}\\n` : ''}}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts an {@link ast.ArrowFunctionNode} to a `const` arrow function, mirroring the `Function.Arrow` component from `@kubb/renderer-jsx`.\n */\nfunction printArrowFunction(node: ast.ArrowFunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes, singleLine } = node\n\n const body = printNodes({ nodes, separator: '\\n' })\n const arrowBody = singleLine ? ` => ${body}` : body ? ` => {\\n${indentLines(body)}\\n}` : ' => {}'\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}`\n const declaration = `${prefix}const ${name} = ${isAsync ? 'async ' : ''}${signature({ async: isAsync, generics, params, returnType })}${arrowBody}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Dispatches a {@link ast.CodeNode} to the printer for its `kind`.\n */\nfunction printCodeNode(node: ast.CodeNode): string {\n switch (node.kind) {\n case 'Break':\n return ''\n case 'Text':\n case 'Jsx':\n return dedent(node.value)\n case 'Const':\n return printConst(node)\n case 'Type':\n return printType(node)\n case 'Function':\n return printFunction(node)\n case 'ArrowFunction':\n return printArrowFunction(node)\n }\n}\n\n/**\n * Prints a {@link ast.SourceNode} with a blank line between its top-level nodes.\n */\nexport function printSource(node: ast.SourceNode): string {\n return printNodes({ nodes: node.nodes, separator: '\\n\\n' })\n}\n\n/**\n * Wraps a module specifier in single quotes, escaping embedded backslashes and quotes.\n */\nfunction quoteModulePath(path: string): string {\n return `'${path.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\n/**\n * Renders an `import` declaration (default, `* as`, or named with `{ a as b }`, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printImport({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: Pick<ast.ImportNode, 'name' | 'path' | 'isTypeOnly' | 'isNameSpace'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (!Array.isArray(name)) {\n if (isNameSpace) return `import ${typePrefix}* as ${name} from ${from}`\n return `import ${typePrefix}${name} from ${from}`\n }\n\n const specifiers = name.map((item) => {\n if (typeof item === 'object') {\n return item.name ? `${item.propertyName} as ${item.name}` : item.propertyName\n }\n return item\n })\n\n return `import ${typePrefix}{ ${specifiers.join(', ')} } from ${from}`\n}\n\n/**\n * Renders an `export … from` declaration (named, `* as name`, or wildcard, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printExport({ path, name, isTypeOnly = false, asAlias = false }: Pick<ast.ExportNode, 'name' | 'path' | 'isTypeOnly' | 'asAlias'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (Array.isArray(name)) {\n return `export ${typePrefix}{ ${name.join(', ')} } from ${from}`\n }\n\n if (asAlias && name) {\n // An identifier cannot start with a digit, so swap the digit for `_`\n const parsedName = /^\\d/.test(name) ? `_${name.slice(1)}` : name\n return `export ${typePrefix}* as ${parsedName} from ${from}`\n }\n\n if (name) {\n return `export ${typePrefix}{ ${name} } from ${from}`\n }\n\n return `export ${typePrefix}* from ${from}`\n}\n","import { ast } from '@kubb/ast'\nimport { defineExtension } from '@kubb/core'\nimport { compatibility } from '../kubb-extension.json'\nimport { version } from '../package.json'\nimport { getRelativePath, print, printExport, printImport, printSource, resolveOutputPath, splitModuleDeclarations, type TsNode } from './utils.ts'\n\nconst DEFAULT_EXTENSION: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''> = { '.ts': '' }\n\n/**\n * Options accepted by `parserTs` and `parserTsx`.\n */\nexport type ParserTsOptions = {\n /**\n * Rewrite extensions on relative `import`/`export` statements. Each key is the extension of a\n * generated file, and its value is the extension written on the relative specifiers in that\n * file. `''` drops it, and so does a generated file whose extension has no key. Package\n * specifiers stay unchanged. Also applies to relative paths in `copy` templates.\n *\n * Use `{ '.ts': '.js' }` for ESM output compiled to JavaScript, or `{ '.ts': '.ts' }` to run the\n * `.ts` files directly in Node.js or compile them with `rewriteRelativeImportExtensions`.\n *\n * @default { '.ts': '' }\n * @example\n * ```ts\n * parserTs({ extension: { '.ts': '.js' } }) // import './api.js' instead of './api'\n * parserTs({ extension: { '.ts': '.ts' } }) // import './api.ts' instead of './api'\n * ```\n */\n extension?: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''>\n}\n\n/**\n * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST\n * produced by an adapter and prints it as TypeScript source. Imports and exports\n * are rewritten based on each file's metadata and the `extension` option.\n *\n * Used automatically when no `parsers` option is set on `defineConfig`. Use\n * `parserTsx` instead for React projects that emit JSX.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTs } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTs()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTs = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'typescript', version, compatibility, issues: 'https://github.com/kubb-labs/kubb/issues' },\n build({ extension = DEFAULT_EXTENSION }) {\n return {\n extNames: ['.ts', '.js'],\n print,\n parse(file) {\n const extname = extension[file.extname] || undefined\n\n const source = file.sources\n .map((item) => printSource(item))\n .filter(Boolean)\n .map((text) => text.trimEnd())\n .join('\\n\\n')\n\n const importLines = file.imports.map((item) =>\n printImport({\n ...item,\n path: resolveOutputPath(item.root ? getRelativePath(item.root, item.path) : item.path, extname, Boolean(item.root)),\n }),\n )\n\n const exportLines = file.exports.map((item) => printExport({ ...item, path: resolveOutputPath(item.path, extname, item.path.startsWith('.')) }))\n\n const importExportBlock = [...importLines, ...exportLines].join('\\n')\n\n const parts = [file.banner, importExportBlock, source, file.footer].filter((segment): segment is string => Boolean(segment)).map((s) => s.trimEnd())\n\n return parts.join('\\n\\n')\n },\n copy(file, source) {\n const { header, imports, exports, body } = splitModuleDeclarations(source, file.path)\n\n return {\n ...file,\n banner: [header, file.banner].filter(Boolean).join('\\n') || undefined,\n imports: [...file.imports, ...imports],\n exports: [...file.exports, ...exports],\n sources: [ast.factory.createSource({ nodes: [ast.factory.createText(body)] })],\n }\n },\n }\n },\n})\n","import { defineExtension } from '@kubb/core'\nimport { parserTs, type ParserTsOptions } from './parserTs.ts'\nimport type { TsNode } from './utils.ts'\n\n/**\n * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs`, since JSX\n * prints as text the same way, so it shares the same `extension` option.\n *\n * Add to the `parsers` array on `defineConfig` when generating components for\n * React (or any framework that emits JSX).\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTsx } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTsx()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTsx = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'tsx', issues: 'https://github.com/kubb-labs/kubb/issues' },\n build: (options) => ({ ...parserTs(options), extNames: ['.tsx', '.jsx'] }),\n})\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { ast } from "@kubb/ast";
|
|
2
|
-
|
|
2
|
+
//#region src/utils.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* A TypeScript compiler node, typed structurally so `@kubb/parser-ts` does not depend on `@typescript/typescript6`.
|
|
5
|
+
*
|
|
6
|
+
* @deprecated Pass printed strings to `print` instead. Support for compiler nodes is removed in the next major.
|
|
7
|
+
*/
|
|
8
|
+
type TsNode = {
|
|
9
|
+
readonly kind: number;
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
3
12
|
//#region src/parserTs.d.ts
|
|
4
13
|
/**
|
|
5
14
|
* Options accepted by `parserTs` and `parserTsx`.
|
|
@@ -26,8 +35,7 @@ type ParserTsOptions = {
|
|
|
26
35
|
/**
|
|
27
36
|
* Default Kubb parser for `.ts` and `.js` files. Takes the universal AST
|
|
28
37
|
* produced by an adapter and prints it as TypeScript source. Imports and exports
|
|
29
|
-
* are rewritten based on each file's metadata and the `extension` option.
|
|
30
|
-
* `print` helper renders TypeScript compiler nodes with the TypeScript printer.
|
|
38
|
+
* are rewritten based on each file's metadata and the `extension` option.
|
|
31
39
|
*
|
|
32
40
|
* Used automatically when no `parsers` option is set on `defineConfig`. Use
|
|
33
41
|
* `parserTsx` instead for React projects that emit JSX.
|
|
@@ -47,13 +55,12 @@ type ParserTsOptions = {
|
|
|
47
55
|
* })
|
|
48
56
|
* ```
|
|
49
57
|
*/
|
|
50
|
-
export declare const parserTs: import("@kubb/core").ParserFactory<ParserTsOptions, object,
|
|
58
|
+
export declare const parserTs: import("@kubb/core").ParserFactory<ParserTsOptions, object, string | TsNode>;
|
|
51
59
|
//#endregion
|
|
52
60
|
//#region src/parserTsx.d.ts
|
|
53
61
|
/**
|
|
54
|
-
* Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs
|
|
55
|
-
*
|
|
56
|
-
* same `extension` option.
|
|
62
|
+
* Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs`, since JSX
|
|
63
|
+
* prints as text the same way, so it shares the same `extension` option.
|
|
57
64
|
*
|
|
58
65
|
* Add to the `parsers` array on `defineConfig` when generating components for
|
|
59
66
|
* React (or any framework that emits JSX).
|
|
@@ -73,7 +80,7 @@ export declare const parserTs: import("@kubb/core").ParserFactory<ParserTsOption
|
|
|
73
80
|
* })
|
|
74
81
|
* ```
|
|
75
82
|
*/
|
|
76
|
-
export declare const parserTsx: import("@kubb/core").ParserFactory<ParserTsOptions, object,
|
|
83
|
+
export declare const parserTsx: import("@kubb/core").ParserFactory<ParserTsOptions, object, string | TsNode>;
|
|
77
84
|
//#endregion
|
|
78
|
-
export type { ParserTsOptions };
|
|
85
|
+
export type { ParserTsOptions, TsNode };
|
|
79
86
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { ast } from "@kubb/ast";
|
|
2
|
-
|
|
2
|
+
//#region src/utils.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* A TypeScript compiler node, typed structurally so `@kubb/parser-ts` does not depend on `@typescript/typescript6`.
|
|
5
|
+
*
|
|
6
|
+
* @deprecated Pass printed strings to `print` instead. Support for compiler nodes is removed in the next major.
|
|
7
|
+
*/
|
|
8
|
+
type TsNode = {
|
|
9
|
+
readonly kind: number;
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
3
12
|
//#region src/parserTs.d.ts
|
|
4
13
|
/**
|
|
5
14
|
* Options accepted by `parserTs` and `parserTsx`.
|
|
@@ -26,8 +35,7 @@ type ParserTsOptions = {
|
|
|
26
35
|
/**
|
|
27
36
|
* Default Kubb parser for `.ts` and `.js` files. Takes the universal AST
|
|
28
37
|
* produced by an adapter and prints it as TypeScript source. Imports and exports
|
|
29
|
-
* are rewritten based on each file's metadata and the `extension` option.
|
|
30
|
-
* `print` helper renders TypeScript compiler nodes with the TypeScript printer.
|
|
38
|
+
* are rewritten based on each file's metadata and the `extension` option.
|
|
31
39
|
*
|
|
32
40
|
* Used automatically when no `parsers` option is set on `defineConfig`. Use
|
|
33
41
|
* `parserTsx` instead for React projects that emit JSX.
|
|
@@ -47,13 +55,12 @@ type ParserTsOptions = {
|
|
|
47
55
|
* })
|
|
48
56
|
* ```
|
|
49
57
|
*/
|
|
50
|
-
export declare const parserTs: import("@kubb/core").ParserFactory<ParserTsOptions, object,
|
|
58
|
+
export declare const parserTs: import("@kubb/core").ParserFactory<ParserTsOptions, object, string | TsNode>;
|
|
51
59
|
//#endregion
|
|
52
60
|
//#region src/parserTsx.d.ts
|
|
53
61
|
/**
|
|
54
|
-
* Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs
|
|
55
|
-
*
|
|
56
|
-
* same `extension` option.
|
|
62
|
+
* Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs`, since JSX
|
|
63
|
+
* prints as text the same way, so it shares the same `extension` option.
|
|
57
64
|
*
|
|
58
65
|
* Add to the `parsers` array on `defineConfig` when generating components for
|
|
59
66
|
* React (or any framework that emits JSX).
|
|
@@ -73,7 +80,7 @@ export declare const parserTs: import("@kubb/core").ParserFactory<ParserTsOption
|
|
|
73
80
|
* })
|
|
74
81
|
* ```
|
|
75
82
|
*/
|
|
76
|
-
export declare const parserTsx: import("@kubb/core").ParserFactory<ParserTsOptions, object,
|
|
83
|
+
export declare const parserTsx: import("@kubb/core").ParserFactory<ParserTsOptions, object, string | TsNode>;
|
|
77
84
|
//#endregion
|
|
78
|
-
export type { ParserTsOptions };
|
|
85
|
+
export type { ParserTsOptions, TsNode };
|
|
79
86
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -2,37 +2,47 @@ import { createRequire } from "node:module";
|
|
|
2
2
|
import { ast } from "@kubb/ast";
|
|
3
3
|
import { defineExtension } from "@kubb/core";
|
|
4
4
|
import { dirname, extname, relative, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { parse } from "yuku-parser";
|
|
5
7
|
//#endregion
|
|
6
8
|
//#region kubb-extension.json
|
|
7
9
|
var compatibility = {
|
|
8
10
|
"kubb": ">=5.8.3",
|
|
9
|
-
"node": ">=22.
|
|
11
|
+
"node": ">=22.22"
|
|
10
12
|
};
|
|
11
13
|
//#endregion
|
|
12
14
|
//#region package.json
|
|
13
|
-
var version = "5.
|
|
15
|
+
var version = "5.13.0";
|
|
14
16
|
//#endregion
|
|
15
17
|
//#region src/utils.ts
|
|
16
18
|
let compiler;
|
|
17
19
|
/**
|
|
18
|
-
* Loads TypeScript
|
|
20
|
+
* Loads TypeScript the first time `print` gets a compiler node. Strings never need it, so bundles for edge runtimes such as Cloudflare Workers leave it out.
|
|
19
21
|
*
|
|
20
22
|
* Loaded with `require`, not `import`: when ESM imports a CommonJS package, Node keeps a second copy of its source
|
|
21
23
|
* to detect named exports, and for TypeScript that copy is about 9 MB.
|
|
22
24
|
*/
|
|
23
25
|
function loadCompiler() {
|
|
24
26
|
if (compiler) return compiler;
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
27
|
+
const require = createRequire(import.meta.url);
|
|
28
|
+
const paths = [process.cwd(), dirname(fileURLToPath(import.meta.url))];
|
|
29
|
+
let typescript;
|
|
30
|
+
for (const name of ["typescript", "@typescript/typescript6"]) try {
|
|
31
|
+
const candidate = require(require.resolve(name, { paths }));
|
|
32
|
+
if (typeof candidate.createPrinter === "function") {
|
|
33
|
+
typescript = candidate;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
} catch {}
|
|
37
|
+
if (!typescript) throw new Error("`print` received a TypeScript compiler node, which needs `typescript` 5 or 6, or `@typescript/typescript6`, installed. Pass a printed string instead.");
|
|
38
|
+
const printer = typescript.createPrinter({
|
|
39
|
+
omitTrailingSemicolon: true,
|
|
40
|
+
newLine: typescript.NewLineKind.LineFeed,
|
|
41
|
+
removeComments: false,
|
|
42
|
+
noEmitHelpers: true
|
|
43
|
+
});
|
|
44
|
+
const sourceFile = typescript.createSourceFile("print.tsx", "", typescript.ScriptTarget.ES2022, true, typescript.ScriptKind.TSX);
|
|
45
|
+
compiler = { printNodes: (nodes) => printer.printList(typescript.ListFormat.MultiLine, typescript.factory.createNodeArray(nodes), sourceFile) };
|
|
36
46
|
return compiler;
|
|
37
47
|
}
|
|
38
48
|
/**
|
|
@@ -51,79 +61,95 @@ function resolveOutputPath(path, extname$1, rootAware) {
|
|
|
51
61
|
return current ? `${path.slice(0, -current.length)}${extname$1 ?? ""}` : path;
|
|
52
62
|
}
|
|
53
63
|
/**
|
|
64
|
+
* Node types this module reads from the yuku AST.
|
|
65
|
+
*/
|
|
66
|
+
const nodeTypes = {
|
|
67
|
+
identifier: "Identifier",
|
|
68
|
+
literal: "Literal",
|
|
69
|
+
importDeclaration: "ImportDeclaration",
|
|
70
|
+
importSpecifier: "ImportSpecifier",
|
|
71
|
+
importDefaultSpecifier: "ImportDefaultSpecifier",
|
|
72
|
+
importNamespaceSpecifier: "ImportNamespaceSpecifier",
|
|
73
|
+
exportAllDeclaration: "ExportAllDeclaration",
|
|
74
|
+
exportNamedDeclaration: "ExportNamedDeclaration"
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* `importKind` and `exportKind` values this module reads from the yuku AST.
|
|
78
|
+
*/
|
|
79
|
+
const declarationKinds = { type: "type" };
|
|
80
|
+
function nameOf(node) {
|
|
81
|
+
return node.type === nodeTypes.literal ? node.value : node.name;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
54
84
|
* Converts an import specifier into an `ImportNode` name, keeping the quotes of a string-literal name (`{ 'a-b' as ab }`).
|
|
55
85
|
*/
|
|
56
|
-
function toImportName(
|
|
57
|
-
if (
|
|
58
|
-
const { typescript } = loadCompiler();
|
|
59
|
-
const { propertyName } = element;
|
|
86
|
+
function toImportName({ imported, local }) {
|
|
87
|
+
if (imported.type === nodeTypes.identifier && imported.name === local.name) return local.name;
|
|
60
88
|
return {
|
|
61
|
-
propertyName:
|
|
62
|
-
name:
|
|
89
|
+
propertyName: imported.type === nodeTypes.literal ? quoteModulePath(imported.value) : imported.name,
|
|
90
|
+
name: local.name
|
|
63
91
|
};
|
|
64
92
|
}
|
|
65
93
|
/**
|
|
66
|
-
* Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes stay as written.
|
|
94
|
+
* Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes or a phase stay as written.
|
|
67
95
|
*/
|
|
68
96
|
function toImportNodes(statement, filePath) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const { name, namedBindings, phaseModifier } = statement.importClause;
|
|
72
|
-
const specifier = statement.moduleSpecifier.text;
|
|
97
|
+
if (statement.type !== nodeTypes.importDeclaration || !statement.specifiers.length || statement.attributes.length || statement.phase) return [];
|
|
98
|
+
const specifier = statement.source.value;
|
|
73
99
|
const target = specifier.startsWith(".") ? {
|
|
74
100
|
path: resolve(dirname(filePath), specifier),
|
|
75
101
|
root: filePath
|
|
76
102
|
} : { path: specifier };
|
|
77
|
-
const isTypeOnly =
|
|
103
|
+
const isTypeOnly = statement.importKind === declarationKinds.type;
|
|
78
104
|
const nodes = [];
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}));
|
|
84
|
-
if (namedBindings && typescript.isNamespaceImport(namedBindings)) nodes.push(ast.factory.createImport({
|
|
85
|
-
name: namedBindings.name.text,
|
|
86
|
-
...target,
|
|
87
|
-
isTypeOnly,
|
|
88
|
-
isNameSpace: true
|
|
89
|
-
}));
|
|
90
|
-
if (namedBindings && typescript.isNamedImports(namedBindings)) {
|
|
91
|
-
const values = namedBindings.elements.filter((element) => !element.isTypeOnly);
|
|
92
|
-
const types = namedBindings.elements.filter((element) => element.isTypeOnly);
|
|
93
|
-
if (values.length) nodes.push(ast.factory.createImport({
|
|
94
|
-
name: values.map(toImportName),
|
|
105
|
+
const named = statement.specifiers.filter((element) => element.type === nodeTypes.importSpecifier);
|
|
106
|
+
for (const element of statement.specifiers) {
|
|
107
|
+
if (element.type === nodeTypes.importDefaultSpecifier) nodes.push(ast.factory.createImport({
|
|
108
|
+
name: element.local.name,
|
|
95
109
|
...target,
|
|
96
110
|
isTypeOnly
|
|
97
111
|
}));
|
|
98
|
-
if (
|
|
99
|
-
name:
|
|
112
|
+
if (element.type === nodeTypes.importNamespaceSpecifier) nodes.push(ast.factory.createImport({
|
|
113
|
+
name: element.local.name,
|
|
100
114
|
...target,
|
|
101
|
-
isTypeOnly
|
|
115
|
+
isTypeOnly,
|
|
116
|
+
isNameSpace: true
|
|
102
117
|
}));
|
|
103
118
|
}
|
|
119
|
+
const values = named.filter((element) => element.importKind !== declarationKinds.type);
|
|
120
|
+
const types = named.filter((element) => element.importKind === declarationKinds.type);
|
|
121
|
+
if (values.length) nodes.push(ast.factory.createImport({
|
|
122
|
+
name: values.map(toImportName),
|
|
123
|
+
...target,
|
|
124
|
+
isTypeOnly
|
|
125
|
+
}));
|
|
126
|
+
if (types.length) nodes.push(ast.factory.createImport({
|
|
127
|
+
name: types.map(toImportName),
|
|
128
|
+
...target,
|
|
129
|
+
isTypeOnly: true
|
|
130
|
+
}));
|
|
104
131
|
return nodes;
|
|
105
132
|
}
|
|
106
133
|
/**
|
|
107
134
|
* Converts an `export … from` declaration into `ExportNode`s. Forms `printExport` cannot print stay as written.
|
|
108
135
|
*/
|
|
109
136
|
function toExportNodes(statement) {
|
|
110
|
-
|
|
111
|
-
if (!
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
if (
|
|
115
|
-
|
|
116
|
-
isTypeOnly
|
|
117
|
-
})];
|
|
118
|
-
if (typescript.isNamespaceExport(exportClause)) return [ast.factory.createExport({
|
|
119
|
-
name: exportClause.name.text,
|
|
137
|
+
if (statement.type !== nodeTypes.exportAllDeclaration && statement.type !== nodeTypes.exportNamedDeclaration) return [];
|
|
138
|
+
if (!statement.source || statement.attributes.length) return [];
|
|
139
|
+
const path = statement.source.value;
|
|
140
|
+
const isTypeOnly = statement.exportKind === declarationKinds.type;
|
|
141
|
+
if (statement.type === nodeTypes.exportAllDeclaration) return [statement.exported ? ast.factory.createExport({
|
|
142
|
+
name: nameOf(statement.exported),
|
|
120
143
|
path,
|
|
121
144
|
isTypeOnly,
|
|
122
145
|
asAlias: true
|
|
146
|
+
}) : ast.factory.createExport({
|
|
147
|
+
path,
|
|
148
|
+
isTypeOnly
|
|
123
149
|
})];
|
|
124
|
-
if (
|
|
150
|
+
if (statement.specifiers.some((element) => element.exportKind === declarationKinds.type || element.exported.type === nodeTypes.literal || nameOf(element.exported) !== nameOf(element.local))) return [];
|
|
125
151
|
return [ast.factory.createExport({
|
|
126
|
-
name:
|
|
152
|
+
name: statement.specifiers.map((element) => nameOf(element.local)),
|
|
127
153
|
path,
|
|
128
154
|
isTypeOnly
|
|
129
155
|
})];
|
|
@@ -132,26 +158,28 @@ function toExportNodes(statement) {
|
|
|
132
158
|
* Splits `source` into its lifted `import`/`export … from` nodes, the `header` above the first one (shebang, directives, comments) and the rest as `body`.
|
|
133
159
|
*/
|
|
134
160
|
function splitModuleDeclarations(source, filePath) {
|
|
135
|
-
const {
|
|
136
|
-
|
|
161
|
+
const { program } = parse(source, {
|
|
162
|
+
lang: "ts",
|
|
163
|
+
sourceType: "module"
|
|
164
|
+
});
|
|
137
165
|
const imports = [];
|
|
138
166
|
const exports = [];
|
|
139
167
|
let header = "";
|
|
140
168
|
let body = "";
|
|
141
169
|
let cursor = 0;
|
|
142
|
-
for (const statement of
|
|
170
|
+
for (const statement of program.body) {
|
|
143
171
|
const importNodes = toImportNodes(statement, filePath);
|
|
144
172
|
const exportNodes = toExportNodes(statement);
|
|
145
173
|
if (!importNodes.length && !exportNodes.length) {
|
|
146
|
-
if (
|
|
174
|
+
if (statement.type === nodeTypes.importDeclaration || (statement.type === nodeTypes.exportNamedDeclaration || statement.type === nodeTypes.exportAllDeclaration) && statement.source) break;
|
|
147
175
|
continue;
|
|
148
176
|
}
|
|
149
|
-
const text = source.slice(cursor, statement.
|
|
177
|
+
const text = source.slice(cursor, statement.start);
|
|
150
178
|
if (imports.length || exports.length) body += text;
|
|
151
179
|
else header = text;
|
|
152
180
|
imports.push(...importNodes);
|
|
153
181
|
exports.push(...exportNodes);
|
|
154
|
-
cursor = statement.
|
|
182
|
+
cursor = statement.end;
|
|
155
183
|
}
|
|
156
184
|
return {
|
|
157
185
|
header: header.trim(),
|
|
@@ -193,14 +221,15 @@ function indentLines(text) {
|
|
|
193
221
|
*/
|
|
194
222
|
function dedent(text) {
|
|
195
223
|
if (!text) return "";
|
|
224
|
+
if (!text.includes("\n")) return text.trim() ? text.trimStart() : "";
|
|
196
225
|
const lines = text.split("\n");
|
|
197
226
|
const isBlank = (line) => line.trim() === "";
|
|
198
227
|
const start = lines.findIndex((line) => !isBlank(line));
|
|
199
228
|
if (start === -1) return "";
|
|
200
229
|
const end = lines.findLastIndex((line) => !isBlank(line));
|
|
201
230
|
const trimmed = lines.slice(start, end + 1);
|
|
202
|
-
|
|
203
|
-
const min =
|
|
231
|
+
let min = Infinity;
|
|
232
|
+
for (const line of trimmed) if (!isBlank(line)) min = Math.min(min, line.length - line.trimStart().length);
|
|
204
233
|
return trimmed.map((line) => isBlank(line) ? "" : line.slice(min)).join("\n");
|
|
205
234
|
}
|
|
206
235
|
/**
|
|
@@ -220,13 +249,17 @@ function withJSDoc({ jsDoc, declaration }) {
|
|
|
220
249
|
return jsDocStr ? `${jsDocStr}\n${declaration}` : declaration;
|
|
221
250
|
}
|
|
222
251
|
/**
|
|
223
|
-
*
|
|
252
|
+
* Joins printed code fragments with a newline.
|
|
253
|
+
*
|
|
254
|
+
* Passing TypeScript compiler nodes still works but is deprecated and needs `typescript` 5 or 6, or `@typescript/typescript6`, installed.
|
|
255
|
+
* Support for compiler nodes is removed in the next major.
|
|
224
256
|
*/
|
|
225
257
|
function print(...elements) {
|
|
226
258
|
const filtered = elements.filter(Boolean);
|
|
227
259
|
if (filtered.length === 0) return "";
|
|
228
|
-
|
|
229
|
-
|
|
260
|
+
if (filtered.every((element) => typeof element === "string")) return filtered.join("\n");
|
|
261
|
+
if (filtered.every((element) => typeof element !== "string")) return loadCompiler().printNodes(filtered);
|
|
262
|
+
return filtered.map((element) => typeof element === "string" ? element : loadCompiler().printNodes([element]).trimEnd()).join("\n");
|
|
230
263
|
}
|
|
231
264
|
/**
|
|
232
265
|
* Converts a {@link ast.JSDocNode} to a `/** … *\/` block, dropping blank comments.
|
|
@@ -368,8 +401,7 @@ const DEFAULT_EXTENSION = { ".ts": "" };
|
|
|
368
401
|
/**
|
|
369
402
|
* Default Kubb parser for `.ts` and `.js` files. Takes the universal AST
|
|
370
403
|
* produced by an adapter and prints it as TypeScript source. Imports and exports
|
|
371
|
-
* are rewritten based on each file's metadata and the `extension` option.
|
|
372
|
-
* `print` helper renders TypeScript compiler nodes with the TypeScript printer.
|
|
404
|
+
* are rewritten based on each file's metadata and the `extension` option.
|
|
373
405
|
*
|
|
374
406
|
* Used automatically when no `parsers` option is set on `defineConfig`. Use
|
|
375
407
|
* `parserTsx` instead for React projects that emit JSX.
|
|
@@ -436,9 +468,8 @@ const parserTs = defineExtension({
|
|
|
436
468
|
//#endregion
|
|
437
469
|
//#region src/parserTsx.ts
|
|
438
470
|
/**
|
|
439
|
-
* Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs
|
|
440
|
-
*
|
|
441
|
-
* same `extension` option.
|
|
471
|
+
* Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs`, since JSX
|
|
472
|
+
* prints as text the same way, so it shares the same `extension` option.
|
|
442
473
|
*
|
|
443
474
|
* Add to the `parsers` array on `defineConfig` when generating components for
|
|
444
475
|
* React (or any framework that emits JSX).
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["getExtname","extname"],"sources":["../kubb-extension.json","../package.json","../src/utils.ts","../src/parserTs.ts","../src/parserTsx.ts"],"sourcesContent":["","","import { createRequire } from 'node:module'\nimport { dirname, extname as getExtname, relative, resolve } from 'node:path'\nimport { ast } from '@kubb/ast'\nimport type * as ts from '@typescript/typescript6'\n\ntype Compiler = {\n typescript: typeof ts\n printer: ts.Printer\n sourceFile: ts.SourceFile\n}\n\nlet compiler: Compiler | undefined\n\n/**\n * Loads TypeScript on the first `print` or `copy`; `parse` is string templating and never needs it.\n *\n * Loaded with `require`, not `import`: when ESM imports a CommonJS package, Node keeps a second copy of its source\n * to detect named exports, and for TypeScript that copy is about 9 MB.\n */\nfunction loadCompiler(): Compiler {\n if (compiler) return compiler\n\n const typescript: typeof ts = createRequire(import.meta.url)('@typescript/typescript6')\n\n compiler = {\n typescript,\n // One printer serves every call; printing does not mutate the source file, which only lends its compiler options\n printer: typescript.createPrinter({\n omitTrailingSemicolon: true,\n newLine: typescript.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n }),\n sourceFile: typescript.createSourceFile('print.tsx', '', typescript.ScriptTarget.ES2022, true, typescript.ScriptKind.TSX),\n }\n\n return compiler\n}\n\n/**\n * Module specifier that imports `filePath` from the file at `root`: POSIX, relative to that file's directory, `./`-prefixed unless it climbs with `../`.\n */\nexport function getRelativePath(root: string, filePath: string): string {\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n return slashed.startsWith('../') ? slashed : `./${slashed}`\n}\n\n/**\n * Swaps the extension of a relative import/export path for `extname`. Package specifiers and extension-less paths stay as-is.\n */\nexport function resolveOutputPath(path: string, extname: string | undefined, rootAware: boolean): string {\n if (!rootAware) return path\n const current = getExtname(path)\n return current ? `${path.slice(0, -current.length)}${extname ?? ''}` : path\n}\n\n/**\n * Converts an import specifier into an `ImportNode` name, keeping the quotes of a string-literal name (`{ 'a-b' as ab }`).\n */\nfunction toImportName(element: ts.ImportSpecifier): string | { propertyName: string; name: string } {\n if (!element.propertyName) return element.name.text\n\n const { typescript } = loadCompiler()\n const { propertyName } = element\n return { propertyName: typescript.isStringLiteral(propertyName) ? quoteModulePath(propertyName.text) : propertyName.text, name: element.name.text }\n}\n\n/**\n * Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes stay as written.\n */\nfunction toImportNodes(statement: ts.Statement, filePath: string): Array<ast.ImportNode> {\n const { typescript } = loadCompiler()\n if (!typescript.isImportDeclaration(statement) || !statement.importClause || !typescript.isStringLiteral(statement.moduleSpecifier) || statement.attributes)\n return []\n\n const { name, namedBindings, phaseModifier } = statement.importClause\n const specifier = statement.moduleSpecifier.text\n const target = specifier.startsWith('.') ? { path: resolve(dirname(filePath), specifier), root: filePath } : { path: specifier }\n const isTypeOnly = phaseModifier === typescript.SyntaxKind.TypeKeyword\n const nodes: Array<ast.ImportNode> = []\n\n if (name) nodes.push(ast.factory.createImport({ name: name.text, ...target, isTypeOnly }))\n if (namedBindings && typescript.isNamespaceImport(namedBindings)) {\n nodes.push(ast.factory.createImport({ name: namedBindings.name.text, ...target, isTypeOnly, isNameSpace: true }))\n }\n if (namedBindings && typescript.isNamedImports(namedBindings)) {\n const values = namedBindings.elements.filter((element) => !element.isTypeOnly)\n const types = namedBindings.elements.filter((element) => element.isTypeOnly)\n if (values.length) nodes.push(ast.factory.createImport({ name: values.map(toImportName), ...target, isTypeOnly }))\n if (types.length) nodes.push(ast.factory.createImport({ name: types.map(toImportName), ...target, isTypeOnly: true }))\n }\n\n return nodes\n}\n\n/**\n * Converts an `export … from` declaration into `ExportNode`s. Forms `printExport` cannot print stay as written.\n */\nfunction toExportNodes(statement: ts.Statement): Array<ast.ExportNode> {\n const { typescript } = loadCompiler()\n if (\n !typescript.isExportDeclaration(statement) ||\n !statement.moduleSpecifier ||\n !typescript.isStringLiteral(statement.moduleSpecifier) ||\n statement.attributes\n )\n return []\n\n const { exportClause, isTypeOnly } = statement\n const path = statement.moduleSpecifier.text\n\n if (!exportClause) return [ast.factory.createExport({ path, isTypeOnly })]\n if (typescript.isNamespaceExport(exportClause)) return [ast.factory.createExport({ name: exportClause.name.text, path, isTypeOnly, asAlias: true })]\n if (exportClause.elements.some((element) => element.propertyName || element.isTypeOnly || typescript.isStringLiteral(element.name))) return []\n\n return [ast.factory.createExport({ name: exportClause.elements.map((element) => element.name.text), path, isTypeOnly })]\n}\n\n/**\n * Splits `source` into its lifted `import`/`export … from` nodes, the `header` above the first one (shebang, directives, comments) and the rest as `body`.\n */\nexport function splitModuleDeclarations(\n source: string,\n filePath: string,\n): { header: string; imports: Array<ast.ImportNode>; exports: Array<ast.ExportNode>; body: string } {\n const { typescript } = loadCompiler()\n const sourceFile = typescript.createSourceFile(filePath, source, typescript.ScriptTarget.Latest)\n const imports: Array<ast.ImportNode> = []\n const exports: Array<ast.ExportNode> = []\n let header = ''\n let body = ''\n let cursor = 0\n\n for (const statement of sourceFile.statements) {\n const importNodes = toImportNodes(statement, filePath)\n const exportNodes = toExportNodes(statement)\n if (!importNodes.length && !exportNodes.length) {\n // Lifted declarations print above the body, so stop at the first one that stays in place to keep the evaluation order.\n if (typescript.isImportDeclaration(statement) || (typescript.isExportDeclaration(statement) && statement.moduleSpecifier)) break\n continue\n }\n\n const text = source.slice(cursor, statement.getStart(sourceFile))\n if (imports.length || exports.length) body += text\n else header = text\n imports.push(...importNodes)\n exports.push(...exportNodes)\n cursor = statement.getEnd()\n }\n\n return { header: header.trim(), imports, exports, body: `${body}${source.slice(cursor)}`.trim() }\n}\n\n/**\n * Joins the printed `nodes` with `separator`; a `Break` widens the next separator to a blank line, and leading, trailing and repeated breaks fold into one.\n *\n * Imperative on purpose: this runs once per source fragment and `map().filter().join()` showed up in deopt traces.\n */\nfunction printNodes({ nodes, separator }: { nodes: Array<ast.CodeNode> | undefined; separator: '\\n' | '\\n\\n' }): string {\n let result = ''\n let pendingBreak = false\n\n for (const node of nodes ?? []) {\n if (node.kind === 'Break') {\n pendingBreak = result !== ''\n continue\n }\n\n const text = printCodeNode(node)\n if (!text) continue\n\n if (result) result += pendingBreak ? '\\n\\n' : separator\n result += text\n pendingBreak = false\n }\n\n return result\n}\n\n/**\n * Indents every non-empty line of `text` by two spaces.\n */\nfunction indentLines(text: string): string {\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => (line.trim() ? ` ${line}` : ''))\n .join('\\n')\n}\n\n/**\n * Strips the common leading whitespace and the surrounding blank lines, counting tabs and spaces alike, so indented template literals start at column zero.\n */\nfunction dedent(text: string): string {\n if (!text) return ''\n\n const lines = text.split('\\n')\n const isBlank = (line: string) => line.trim() === ''\n\n const start = lines.findIndex((line) => !isBlank(line))\n if (start === -1) return ''\n const end = lines.findLastIndex((line) => !isBlank(line))\n\n const trimmed = lines.slice(start, end + 1)\n const indents = trimmed.filter((line) => !isBlank(line)).map((line) => line.match(/^\\s*/)?.[0].length ?? 0)\n const min = indents.length ? Math.min(...indents) : 0\n\n return trimmed.map((line) => (isBlank(line) ? '' : line.slice(min))).join('\\n')\n}\n\n/**\n * Renders `<T>(params): ReturnType`; an async function wraps its return type in `Promise<>`.\n */\nfunction signature({ async: isAsync, generics, params, returnType }: Pick<ast.FunctionNode, 'async' | 'generics' | 'params' | 'returnType'>): string {\n const genericsStr = generics ? `<${Array.isArray(generics) ? generics.join(', ') : generics}>` : ''\n const wrapped = isAsync ? `Promise<${returnType}>` : returnType\n const returnTypeStr = returnType ? `: ${wrapped}` : ''\n\n return `${genericsStr}(${params ?? ''})${returnTypeStr}`\n}\n\n/**\n * Puts the JSDoc block, when it renders to something, above `declaration`.\n */\nfunction withJSDoc({ jsDoc, declaration }: { jsDoc?: ast.JSDocNode | null; declaration: string }): string {\n const jsDocStr = jsDoc ? printJSDoc(jsDoc) : ''\n\n return jsDocStr ? `${jsDocStr}\\n${declaration}` : declaration\n}\n\n/**\n * Converts TypeScript/TSX AST nodes to a string using the TypeScript printer.\n */\nexport function print(...elements: Array<ts.Node>): string {\n const filtered = elements.filter(Boolean)\n if (filtered.length === 0) return ''\n\n const { typescript, printer, sourceFile } = loadCompiler()\n return printer.printList(typescript.ListFormat.MultiLine, typescript.factory.createNodeArray(filtered), sourceFile)\n}\n\n/**\n * Converts a {@link ast.JSDocNode} to a `/** … *\\/` block, dropping blank comments.\n */\nfunction printJSDoc(jsDoc: ast.JSDocNode): string {\n const comments = (jsDoc.comments ?? []).filter((c) => c != null)\n if (comments.length === 0) return ''\n\n const lines = comments\n .flatMap((c) => c.split(/\\r?\\n/))\n .map((l) => l.replace(/\\*\\//g, '* /').replace(/\\r/g, ''))\n .filter((l) => l.trim().length > 0)\n\n if (lines.length === 0) return ''\n\n return ['/**', ...lines.map((l) => ` * ${l}`), ' */'].join('\\n')\n}\n\n/**\n * Converts a {@link ast.ConstNode} to a `const` declaration, mirroring the `Const` component from `@kubb/renderer-jsx`.\n */\nfunction printConst(node: ast.ConstNode): string {\n const { name, export: canExport, type, JSDoc, asConst, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}const ${name}${type ? `: ${type}` : ''} = ${printNodes({ nodes, separator: '\\n' })}${asConst ? ' as const' : ''}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.TypeNode} to a `type` alias, mirroring the `Type` component from `@kubb/renderer-jsx`.\n */\nfunction printType(node: ast.TypeNode): string {\n const { name, export: canExport, JSDoc, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}type ${name} = ${printNodes({ nodes, separator: '\\n' })}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.FunctionNode} to a `function` declaration, mirroring the `Function` component from `@kubb/renderer-jsx`.\n */\nfunction printFunction(node: ast.FunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes } = node\n\n const body = indentLines(printNodes({ nodes, separator: '\\n' }))\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}${isAsync ? 'async ' : ''}`\n const declaration = `${prefix}function ${name}${signature({ async: isAsync, generics, params, returnType })} {${body ? `\\n${body}\\n` : ''}}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts an {@link ast.ArrowFunctionNode} to a `const` arrow function, mirroring the `Function.Arrow` component from `@kubb/renderer-jsx`.\n */\nfunction printArrowFunction(node: ast.ArrowFunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes, singleLine } = node\n\n const body = printNodes({ nodes, separator: '\\n' })\n const arrowBody = singleLine ? ` => ${body}` : body ? ` => {\\n${indentLines(body)}\\n}` : ' => {}'\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}`\n const declaration = `${prefix}const ${name} = ${isAsync ? 'async ' : ''}${signature({ async: isAsync, generics, params, returnType })}${arrowBody}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Dispatches a {@link ast.CodeNode} to the printer for its `kind`.\n */\nfunction printCodeNode(node: ast.CodeNode): string {\n switch (node.kind) {\n case 'Break':\n return ''\n case 'Text':\n case 'Jsx':\n return dedent(node.value)\n case 'Const':\n return printConst(node)\n case 'Type':\n return printType(node)\n case 'Function':\n return printFunction(node)\n case 'ArrowFunction':\n return printArrowFunction(node)\n }\n}\n\n/**\n * Prints a {@link ast.SourceNode} with a blank line between its top-level nodes.\n */\nexport function printSource(node: ast.SourceNode): string {\n return printNodes({ nodes: node.nodes, separator: '\\n\\n' })\n}\n\n/**\n * Wraps a module specifier in single quotes, escaping embedded backslashes and quotes.\n */\nfunction quoteModulePath(path: string): string {\n return `'${path.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\n/**\n * Renders an `import` declaration (default, `* as`, or named with `{ a as b }`, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printImport({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: Pick<ast.ImportNode, 'name' | 'path' | 'isTypeOnly' | 'isNameSpace'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (!Array.isArray(name)) {\n if (isNameSpace) return `import ${typePrefix}* as ${name} from ${from}`\n return `import ${typePrefix}${name} from ${from}`\n }\n\n const specifiers = name.map((item) => {\n if (typeof item === 'object') {\n return item.name ? `${item.propertyName} as ${item.name}` : item.propertyName\n }\n return item\n })\n\n return `import ${typePrefix}{ ${specifiers.join(', ')} } from ${from}`\n}\n\n/**\n * Renders an `export … from` declaration (named, `* as name`, or wildcard, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printExport({ path, name, isTypeOnly = false, asAlias = false }: Pick<ast.ExportNode, 'name' | 'path' | 'isTypeOnly' | 'asAlias'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (Array.isArray(name)) {\n return `export ${typePrefix}{ ${name.join(', ')} } from ${from}`\n }\n\n if (asAlias && name) {\n // An identifier cannot start with a digit, so swap the digit for `_`\n const parsedName = /^\\d/.test(name) ? `_${name.slice(1)}` : name\n return `export ${typePrefix}* as ${parsedName} from ${from}`\n }\n\n if (name) {\n return `export ${typePrefix}{ ${name} } from ${from}`\n }\n\n return `export ${typePrefix}* from ${from}`\n}\n","import { ast } from '@kubb/ast'\nimport { defineExtension } from '@kubb/core'\nimport type * as ts from '@typescript/typescript6'\nimport { compatibility } from '../kubb-extension.json'\nimport { version } from '../package.json'\nimport { getRelativePath, print, printExport, printImport, printSource, resolveOutputPath, splitModuleDeclarations } from './utils.ts'\n\nconst DEFAULT_EXTENSION: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''> = { '.ts': '' }\n\n/**\n * Options accepted by `parserTs` and `parserTsx`.\n */\nexport type ParserTsOptions = {\n /**\n * Rewrite extensions on relative `import`/`export` statements. Each key is the extension of a\n * generated file, and its value is the extension written on the relative specifiers in that\n * file. `''` drops it, and so does a generated file whose extension has no key. Package\n * specifiers stay unchanged. Also applies to relative paths in `copy` templates.\n *\n * Use `{ '.ts': '.js' }` for ESM output compiled to JavaScript, or `{ '.ts': '.ts' }` to run the\n * `.ts` files directly in Node.js or compile them with `rewriteRelativeImportExtensions`.\n *\n * @default { '.ts': '' }\n * @example\n * ```ts\n * parserTs({ extension: { '.ts': '.js' } }) // import './api.js' instead of './api'\n * parserTs({ extension: { '.ts': '.ts' } }) // import './api.ts' instead of './api'\n * ```\n */\n extension?: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''>\n}\n\n/**\n * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST\n * produced by an adapter and prints it as TypeScript source. Imports and exports\n * are rewritten based on each file's metadata and the `extension` option. The\n * `print` helper renders TypeScript compiler nodes with the TypeScript printer.\n *\n * Used automatically when no `parsers` option is set on `defineConfig`. Use\n * `parserTsx` instead for React projects that emit JSX.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTs } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTs()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTs = defineExtension<ParserTsOptions, object, ts.Node>({\n kind: 'parser',\n meta: { name: 'typescript', version, compatibility, issues: 'https://github.com/kubb-labs/kubb/issues' },\n build({ extension = DEFAULT_EXTENSION }) {\n return {\n extNames: ['.ts', '.js'],\n print,\n parse(file) {\n const extname = extension[file.extname] || undefined\n\n const source = file.sources\n .map((item) => printSource(item))\n .filter(Boolean)\n .map((text) => text.trimEnd())\n .join('\\n\\n')\n\n const importLines = file.imports.map((item) =>\n printImport({\n ...item,\n path: resolveOutputPath(item.root ? getRelativePath(item.root, item.path) : item.path, extname, Boolean(item.root)),\n }),\n )\n\n const exportLines = file.exports.map((item) => printExport({ ...item, path: resolveOutputPath(item.path, extname, item.path.startsWith('.')) }))\n\n const importExportBlock = [...importLines, ...exportLines].join('\\n')\n\n const parts = [file.banner, importExportBlock, source, file.footer].filter((segment): segment is string => Boolean(segment)).map((s) => s.trimEnd())\n\n return parts.join('\\n\\n')\n },\n copy(file, source) {\n const { header, imports, exports, body } = splitModuleDeclarations(source, file.path)\n\n return {\n ...file,\n banner: [header, file.banner].filter(Boolean).join('\\n') || undefined,\n imports: [...file.imports, ...imports],\n exports: [...file.exports, ...exports],\n sources: [ast.factory.createSource({ nodes: [ast.factory.createText(body)] })],\n }\n },\n }\n },\n})\n","import { defineExtension } from '@kubb/core'\nimport type * as ts from '@typescript/typescript6'\nimport { parserTs, type ParserTsOptions } from './parserTs.ts'\n\n/**\n * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs` because the\n * TypeScript compiler handles JSX natively via `ScriptKind.TSX`, so it shares the\n * same `extension` option.\n *\n * Add to the `parsers` array on `defineConfig` when generating components for\n * React (or any framework that emits JSX).\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTsx } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTsx()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTsx = defineExtension<ParserTsOptions, object, ts.Node>({\n kind: 'parser',\n meta: { name: 'tsx', issues: 'https://github.com/kubb-labs/kubb/issues' },\n build: (options) => ({ ...parserTs(options), extNames: ['.tsx', '.jsx'] }),\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["getExtname","extname"],"sources":["../kubb-extension.json","../package.json","../src/utils.ts","../src/parserTs.ts","../src/parserTsx.ts"],"sourcesContent":["","","import { createRequire } from 'node:module'\nimport { dirname, extname as getExtname, relative, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { ast } from '@kubb/ast'\nimport { type ImportSpecifier, type ModuleExportName, parse, type ProgramStatement } from 'yuku-parser'\n\n/**\n * A TypeScript compiler node, typed structurally so `@kubb/parser-ts` does not depend on `@typescript/typescript6`.\n *\n * @deprecated Pass printed strings to `print` instead. Support for compiler nodes is removed in the next major.\n */\nexport type TsNode = { readonly kind: number }\n\ntype Compiler = {\n printNodes: (nodes: Array<TsNode>) => string\n}\n\nlet compiler: Compiler | undefined\n\n// The parts of the TypeScript 6 API that printing compiler nodes uses, typed here so no package depends on it\ntype TypeScript = {\n createPrinter(options: { omitTrailingSemicolon: boolean; newLine: number; removeComments: boolean; noEmitHelpers: boolean }): {\n printList(format: number, list: unknown, sourceFile: unknown): string\n }\n createSourceFile(fileName: string, text: string, target: number, setParentNodes: boolean, kind: number): unknown\n factory: { createNodeArray(nodes: Array<TsNode>): unknown }\n NewLineKind: { LineFeed: number }\n ScriptTarget: { ES2022: number }\n ScriptKind: { TSX: number }\n ListFormat: { MultiLine: number }\n}\n\n/**\n * Loads TypeScript the first time `print` gets a compiler node. Strings never need it, so bundles for edge runtimes such as Cloudflare Workers leave it out.\n *\n * Loaded with `require`, not `import`: when ESM imports a CommonJS package, Node keeps a second copy of its source\n * to detect named exports, and for TypeScript that copy is about 9 MB.\n */\nfunction loadCompiler(): Compiler {\n if (compiler) return compiler\n\n const require = createRequire(import.meta.url)\n // Look in the user's project first: a strict package manager such as pnpm does not link it next to this package\n const paths = [process.cwd(), dirname(fileURLToPath(import.meta.url))]\n let typescript: TypeScript | undefined\n // `typescript` 5 and 6 ship the compiler API; next to TypeScript 7 it comes from `@typescript/typescript6`\n for (const name of ['typescript', '@typescript/typescript6']) {\n try {\n const candidate = require(require.resolve(name, { paths }))\n if (typeof candidate.createPrinter === 'function') {\n typescript = candidate as TypeScript\n break\n }\n } catch {}\n }\n if (!typescript) {\n throw new Error(\n '`print` received a TypeScript compiler node, which needs `typescript` 5 or 6, or `@typescript/typescript6`, installed. Pass a printed string instead.',\n )\n }\n\n // One printer serves every call; printing does not mutate the source file, which only lends its compiler options\n const printer = typescript.createPrinter({\n omitTrailingSemicolon: true,\n newLine: typescript.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n })\n const sourceFile = typescript.createSourceFile('print.tsx', '', typescript.ScriptTarget.ES2022, true, typescript.ScriptKind.TSX)\n\n compiler = {\n printNodes: (nodes) => printer.printList(typescript.ListFormat.MultiLine, typescript.factory.createNodeArray(nodes), sourceFile),\n }\n\n return compiler\n}\n\n/**\n * Module specifier that imports `filePath` from the file at `root`: POSIX, relative to that file's directory, `./`-prefixed unless it climbs with `../`.\n */\nexport function getRelativePath(root: string, filePath: string): string {\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n return slashed.startsWith('../') ? slashed : `./${slashed}`\n}\n\n/**\n * Swaps the extension of a relative import/export path for `extname`. Package specifiers and extension-less paths stay as-is.\n */\nexport function resolveOutputPath(path: string, extname: string | undefined, rootAware: boolean): string {\n if (!rootAware) return path\n const current = getExtname(path)\n return current ? `${path.slice(0, -current.length)}${extname ?? ''}` : path\n}\n\n/**\n * Node types this module reads from the yuku AST.\n */\nconst nodeTypes = {\n identifier: 'Identifier',\n literal: 'Literal',\n importDeclaration: 'ImportDeclaration',\n importSpecifier: 'ImportSpecifier',\n importDefaultSpecifier: 'ImportDefaultSpecifier',\n importNamespaceSpecifier: 'ImportNamespaceSpecifier',\n exportAllDeclaration: 'ExportAllDeclaration',\n exportNamedDeclaration: 'ExportNamedDeclaration',\n} as const\n\n/**\n * `importKind` and `exportKind` values this module reads from the yuku AST.\n */\nconst declarationKinds = {\n type: 'type',\n} as const\n\nfunction nameOf(node: ModuleExportName): string {\n return node.type === nodeTypes.literal ? node.value : node.name\n}\n\n/**\n * Converts an import specifier into an `ImportNode` name, keeping the quotes of a string-literal name (`{ 'a-b' as ab }`).\n */\nfunction toImportName({ imported, local }: ImportSpecifier): string | { propertyName: string; name: string } {\n if (imported.type === nodeTypes.identifier && imported.name === local.name) return local.name\n\n return { propertyName: imported.type === nodeTypes.literal ? quoteModulePath(imported.value) : imported.name, name: local.name }\n}\n\n/**\n * Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes or a phase stay as written.\n */\nfunction toImportNodes(statement: ProgramStatement, filePath: string): Array<ast.ImportNode> {\n if (statement.type !== nodeTypes.importDeclaration || !statement.specifiers.length || statement.attributes.length || statement.phase) return []\n\n const specifier = statement.source.value\n const target = specifier.startsWith('.') ? { path: resolve(dirname(filePath), specifier), root: filePath } : { path: specifier }\n const isTypeOnly = statement.importKind === declarationKinds.type\n const nodes: Array<ast.ImportNode> = []\n const named = statement.specifiers.filter((element) => element.type === nodeTypes.importSpecifier)\n\n for (const element of statement.specifiers) {\n if (element.type === nodeTypes.importDefaultSpecifier) nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly }))\n if (element.type === nodeTypes.importNamespaceSpecifier)\n nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly, isNameSpace: true }))\n }\n const values = named.filter((element) => element.importKind !== declarationKinds.type)\n const types = named.filter((element) => element.importKind === declarationKinds.type)\n if (values.length) nodes.push(ast.factory.createImport({ name: values.map(toImportName), ...target, isTypeOnly }))\n if (types.length) nodes.push(ast.factory.createImport({ name: types.map(toImportName), ...target, isTypeOnly: true }))\n\n return nodes\n}\n\n/**\n * Converts an `export … from` declaration into `ExportNode`s. Forms `printExport` cannot print stay as written.\n */\nfunction toExportNodes(statement: ProgramStatement): Array<ast.ExportNode> {\n if (statement.type !== nodeTypes.exportAllDeclaration && statement.type !== nodeTypes.exportNamedDeclaration) return []\n if (!statement.source || statement.attributes.length) return []\n\n const path = statement.source.value\n const isTypeOnly = statement.exportKind === declarationKinds.type\n\n if (statement.type === nodeTypes.exportAllDeclaration) {\n return [\n statement.exported\n ? ast.factory.createExport({ name: nameOf(statement.exported), path, isTypeOnly, asAlias: true })\n : ast.factory.createExport({ path, isTypeOnly }),\n ]\n }\n if (\n statement.specifiers.some(\n (element) =>\n element.exportKind === declarationKinds.type || element.exported.type === nodeTypes.literal || nameOf(element.exported) !== nameOf(element.local),\n )\n )\n return []\n\n return [ast.factory.createExport({ name: statement.specifiers.map((element) => nameOf(element.local)), path, isTypeOnly })]\n}\n\n/**\n * Splits `source` into its lifted `import`/`export … from` nodes, the `header` above the first one (shebang, directives, comments) and the rest as `body`.\n */\nexport function splitModuleDeclarations(\n source: string,\n filePath: string,\n): { header: string; imports: Array<ast.ImportNode>; exports: Array<ast.ExportNode>; body: string } {\n const { program } = parse(source, { lang: 'ts', sourceType: 'module' })\n const imports: Array<ast.ImportNode> = []\n const exports: Array<ast.ExportNode> = []\n let header = ''\n let body = ''\n let cursor = 0\n\n for (const statement of program.body) {\n const importNodes = toImportNodes(statement, filePath)\n const exportNodes = toExportNodes(statement)\n if (!importNodes.length && !exportNodes.length) {\n // Lifted declarations print above the body, so stop at the first one that stays in place to keep the evaluation order.\n if (\n statement.type === nodeTypes.importDeclaration ||\n ((statement.type === nodeTypes.exportNamedDeclaration || statement.type === nodeTypes.exportAllDeclaration) && statement.source)\n )\n break\n continue\n }\n\n const text = source.slice(cursor, statement.start)\n if (imports.length || exports.length) body += text\n else header = text\n imports.push(...importNodes)\n exports.push(...exportNodes)\n cursor = statement.end\n }\n\n return { header: header.trim(), imports, exports, body: `${body}${source.slice(cursor)}`.trim() }\n}\n\n/**\n * Joins the printed `nodes` with `separator`; a `Break` widens the next separator to a blank line, and leading, trailing and repeated breaks fold into one.\n *\n * Imperative on purpose: this runs once per source fragment and `map().filter().join()` showed up in deopt traces.\n */\nfunction printNodes({ nodes, separator }: { nodes: Array<ast.CodeNode> | undefined; separator: '\\n' | '\\n\\n' }): string {\n let result = ''\n let pendingBreak = false\n\n for (const node of nodes ?? []) {\n if (node.kind === 'Break') {\n pendingBreak = result !== ''\n continue\n }\n\n const text = printCodeNode(node)\n if (!text) continue\n\n if (result) result += pendingBreak ? '\\n\\n' : separator\n result += text\n pendingBreak = false\n }\n\n return result\n}\n\n/**\n * Indents every non-empty line of `text` by two spaces.\n */\nfunction indentLines(text: string): string {\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => (line.trim() ? ` ${line}` : ''))\n .join('\\n')\n}\n\n/**\n * Strips the common leading whitespace and the surrounding blank lines, counting tabs and spaces alike, so indented template literals start at column zero.\n */\nfunction dedent(text: string): string {\n if (!text) return ''\n // Most text nodes are one line, so the common indent is its leading whitespace.\n if (!text.includes('\\n')) return text.trim() ? text.trimStart() : ''\n\n const lines = text.split('\\n')\n const isBlank = (line: string) => line.trim() === ''\n\n const start = lines.findIndex((line) => !isBlank(line))\n if (start === -1) return ''\n const end = lines.findLastIndex((line) => !isBlank(line))\n\n const trimmed = lines.slice(start, end + 1)\n // A loop, not `Math.min(...indents)`, which overflows the stack on very long text.\n let min = Infinity\n for (const line of trimmed) {\n if (!isBlank(line)) min = Math.min(min, line.length - line.trimStart().length)\n }\n\n return trimmed.map((line) => (isBlank(line) ? '' : line.slice(min))).join('\\n')\n}\n\n/**\n * Renders `<T>(params): ReturnType`; an async function wraps its return type in `Promise<>`.\n */\nfunction signature({ async: isAsync, generics, params, returnType }: Pick<ast.FunctionNode, 'async' | 'generics' | 'params' | 'returnType'>): string {\n const genericsStr = generics ? `<${Array.isArray(generics) ? generics.join(', ') : generics}>` : ''\n const wrapped = isAsync ? `Promise<${returnType}>` : returnType\n const returnTypeStr = returnType ? `: ${wrapped}` : ''\n\n return `${genericsStr}(${params ?? ''})${returnTypeStr}`\n}\n\n/**\n * Puts the JSDoc block, when it renders to something, above `declaration`.\n */\nfunction withJSDoc({ jsDoc, declaration }: { jsDoc?: ast.JSDocNode | null; declaration: string }): string {\n const jsDocStr = jsDoc ? printJSDoc(jsDoc) : ''\n\n return jsDocStr ? `${jsDocStr}\\n${declaration}` : declaration\n}\n\n/**\n * Joins printed code fragments with a newline.\n *\n * Passing TypeScript compiler nodes still works but is deprecated and needs `typescript` 5 or 6, or `@typescript/typescript6`, installed.\n * Support for compiler nodes is removed in the next major.\n */\nexport function print(...elements: Array<string | TsNode>): string {\n const filtered = elements.filter(Boolean)\n if (filtered.length === 0) return ''\n if (filtered.every((element) => typeof element === 'string')) return filtered.join('\\n')\n // Printing compiler nodes as one list keeps the output byte-for-byte the same as before strings were accepted\n if (filtered.every((element) => typeof element !== 'string')) return loadCompiler().printNodes(filtered)\n\n return filtered.map((element) => (typeof element === 'string' ? element : loadCompiler().printNodes([element]).trimEnd())).join('\\n')\n}\n\n/**\n * Converts a {@link ast.JSDocNode} to a `/** … *\\/` block, dropping blank comments.\n */\nfunction printJSDoc(jsDoc: ast.JSDocNode): string {\n const comments = (jsDoc.comments ?? []).filter((c) => c != null)\n if (comments.length === 0) return ''\n\n const lines = comments\n .flatMap((c) => c.split(/\\r?\\n/))\n .map((l) => l.replace(/\\*\\//g, '* /').replace(/\\r/g, ''))\n .filter((l) => l.trim().length > 0)\n\n if (lines.length === 0) return ''\n\n return ['/**', ...lines.map((l) => ` * ${l}`), ' */'].join('\\n')\n}\n\n/**\n * Converts a {@link ast.ConstNode} to a `const` declaration, mirroring the `Const` component from `@kubb/renderer-jsx`.\n */\nfunction printConst(node: ast.ConstNode): string {\n const { name, export: canExport, type, JSDoc, asConst, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}const ${name}${type ? `: ${type}` : ''} = ${printNodes({ nodes, separator: '\\n' })}${asConst ? ' as const' : ''}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.TypeNode} to a `type` alias, mirroring the `Type` component from `@kubb/renderer-jsx`.\n */\nfunction printType(node: ast.TypeNode): string {\n const { name, export: canExport, JSDoc, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}type ${name} = ${printNodes({ nodes, separator: '\\n' })}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.FunctionNode} to a `function` declaration, mirroring the `Function` component from `@kubb/renderer-jsx`.\n */\nfunction printFunction(node: ast.FunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes } = node\n\n const body = indentLines(printNodes({ nodes, separator: '\\n' }))\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}${isAsync ? 'async ' : ''}`\n const declaration = `${prefix}function ${name}${signature({ async: isAsync, generics, params, returnType })} {${body ? `\\n${body}\\n` : ''}}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts an {@link ast.ArrowFunctionNode} to a `const` arrow function, mirroring the `Function.Arrow` component from `@kubb/renderer-jsx`.\n */\nfunction printArrowFunction(node: ast.ArrowFunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes, singleLine } = node\n\n const body = printNodes({ nodes, separator: '\\n' })\n const arrowBody = singleLine ? ` => ${body}` : body ? ` => {\\n${indentLines(body)}\\n}` : ' => {}'\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}`\n const declaration = `${prefix}const ${name} = ${isAsync ? 'async ' : ''}${signature({ async: isAsync, generics, params, returnType })}${arrowBody}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Dispatches a {@link ast.CodeNode} to the printer for its `kind`.\n */\nfunction printCodeNode(node: ast.CodeNode): string {\n switch (node.kind) {\n case 'Break':\n return ''\n case 'Text':\n case 'Jsx':\n return dedent(node.value)\n case 'Const':\n return printConst(node)\n case 'Type':\n return printType(node)\n case 'Function':\n return printFunction(node)\n case 'ArrowFunction':\n return printArrowFunction(node)\n }\n}\n\n/**\n * Prints a {@link ast.SourceNode} with a blank line between its top-level nodes.\n */\nexport function printSource(node: ast.SourceNode): string {\n return printNodes({ nodes: node.nodes, separator: '\\n\\n' })\n}\n\n/**\n * Wraps a module specifier in single quotes, escaping embedded backslashes and quotes.\n */\nfunction quoteModulePath(path: string): string {\n return `'${path.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\n/**\n * Renders an `import` declaration (default, `* as`, or named with `{ a as b }`, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printImport({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: Pick<ast.ImportNode, 'name' | 'path' | 'isTypeOnly' | 'isNameSpace'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (!Array.isArray(name)) {\n if (isNameSpace) return `import ${typePrefix}* as ${name} from ${from}`\n return `import ${typePrefix}${name} from ${from}`\n }\n\n const specifiers = name.map((item) => {\n if (typeof item === 'object') {\n return item.name ? `${item.propertyName} as ${item.name}` : item.propertyName\n }\n return item\n })\n\n return `import ${typePrefix}{ ${specifiers.join(', ')} } from ${from}`\n}\n\n/**\n * Renders an `export … from` declaration (named, `* as name`, or wildcard, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printExport({ path, name, isTypeOnly = false, asAlias = false }: Pick<ast.ExportNode, 'name' | 'path' | 'isTypeOnly' | 'asAlias'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (Array.isArray(name)) {\n return `export ${typePrefix}{ ${name.join(', ')} } from ${from}`\n }\n\n if (asAlias && name) {\n // An identifier cannot start with a digit, so swap the digit for `_`\n const parsedName = /^\\d/.test(name) ? `_${name.slice(1)}` : name\n return `export ${typePrefix}* as ${parsedName} from ${from}`\n }\n\n if (name) {\n return `export ${typePrefix}{ ${name} } from ${from}`\n }\n\n return `export ${typePrefix}* from ${from}`\n}\n","import { ast } from '@kubb/ast'\nimport { defineExtension } from '@kubb/core'\nimport { compatibility } from '../kubb-extension.json'\nimport { version } from '../package.json'\nimport { getRelativePath, print, printExport, printImport, printSource, resolveOutputPath, splitModuleDeclarations, type TsNode } from './utils.ts'\n\nconst DEFAULT_EXTENSION: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''> = { '.ts': '' }\n\n/**\n * Options accepted by `parserTs` and `parserTsx`.\n */\nexport type ParserTsOptions = {\n /**\n * Rewrite extensions on relative `import`/`export` statements. Each key is the extension of a\n * generated file, and its value is the extension written on the relative specifiers in that\n * file. `''` drops it, and so does a generated file whose extension has no key. Package\n * specifiers stay unchanged. Also applies to relative paths in `copy` templates.\n *\n * Use `{ '.ts': '.js' }` for ESM output compiled to JavaScript, or `{ '.ts': '.ts' }` to run the\n * `.ts` files directly in Node.js or compile them with `rewriteRelativeImportExtensions`.\n *\n * @default { '.ts': '' }\n * @example\n * ```ts\n * parserTs({ extension: { '.ts': '.js' } }) // import './api.js' instead of './api'\n * parserTs({ extension: { '.ts': '.ts' } }) // import './api.ts' instead of './api'\n * ```\n */\n extension?: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''>\n}\n\n/**\n * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST\n * produced by an adapter and prints it as TypeScript source. Imports and exports\n * are rewritten based on each file's metadata and the `extension` option.\n *\n * Used automatically when no `parsers` option is set on `defineConfig`. Use\n * `parserTsx` instead for React projects that emit JSX.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTs } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTs()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTs = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'typescript', version, compatibility, issues: 'https://github.com/kubb-labs/kubb/issues' },\n build({ extension = DEFAULT_EXTENSION }) {\n return {\n extNames: ['.ts', '.js'],\n print,\n parse(file) {\n const extname = extension[file.extname] || undefined\n\n const source = file.sources\n .map((item) => printSource(item))\n .filter(Boolean)\n .map((text) => text.trimEnd())\n .join('\\n\\n')\n\n const importLines = file.imports.map((item) =>\n printImport({\n ...item,\n path: resolveOutputPath(item.root ? getRelativePath(item.root, item.path) : item.path, extname, Boolean(item.root)),\n }),\n )\n\n const exportLines = file.exports.map((item) => printExport({ ...item, path: resolveOutputPath(item.path, extname, item.path.startsWith('.')) }))\n\n const importExportBlock = [...importLines, ...exportLines].join('\\n')\n\n const parts = [file.banner, importExportBlock, source, file.footer].filter((segment): segment is string => Boolean(segment)).map((s) => s.trimEnd())\n\n return parts.join('\\n\\n')\n },\n copy(file, source) {\n const { header, imports, exports, body } = splitModuleDeclarations(source, file.path)\n\n return {\n ...file,\n banner: [header, file.banner].filter(Boolean).join('\\n') || undefined,\n imports: [...file.imports, ...imports],\n exports: [...file.exports, ...exports],\n sources: [ast.factory.createSource({ nodes: [ast.factory.createText(body)] })],\n }\n },\n }\n },\n})\n","import { defineExtension } from '@kubb/core'\nimport { parserTs, type ParserTsOptions } from './parserTs.ts'\nimport type { TsNode } from './utils.ts'\n\n/**\n * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs`, since JSX\n * prints as text the same way, so it shares the same `extension` option.\n *\n * Add to the `parsers` array on `defineConfig` when generating components for\n * React (or any framework that emits JSX).\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTsx } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTsx()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTsx = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'tsx', issues: 'https://github.com/kubb-labs/kubb/issues' },\n build: (options) => ({ ...parserTs(options), extNames: ['.tsx', '.jsx'] }),\n})\n"],"mappings":"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"}
|
package/docs/overview.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# TypeScript
|
|
2
2
|
|
|
3
|
-
The TypeScript parser writes `.ts` and `.js` files. It turns each file's AST into source text with imports, exports, declarations, and JSDoc, and resolves relative import paths.
|
|
3
|
+
The TypeScript parser writes `.ts` and `.js` files. It turns each file's AST into source text with imports, exports, declarations, and JSDoc, and resolves relative import paths.
|
|
4
4
|
|
|
5
5
|
The package also exports `parserTsx`, which writes `.tsx` and `.jsx` files with the same options.
|
|
6
6
|
|
package/kubb-extension.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/parser-ts",
|
|
3
|
-
"version": "5.
|
|
4
|
-
"description": "TypeScript and TSX
|
|
3
|
+
"version": "5.13.0",
|
|
4
|
+
"description": "TypeScript and TSX parser for Kubb. Prints AST nodes as TypeScript and TSX source, with imports, exports and JSDoc.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"codegen",
|
|
7
7
|
"kubb",
|
|
@@ -64,12 +64,12 @@
|
|
|
64
64
|
"registry": "https://registry.npmjs.org/"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@kubb/ast": "5.
|
|
68
|
-
"@kubb/core": "5.
|
|
69
|
-
"
|
|
67
|
+
"@kubb/ast": "5.13.0",
|
|
68
|
+
"@kubb/core": "5.13.0",
|
|
69
|
+
"yuku-parser": "^0.19.0"
|
|
70
70
|
},
|
|
71
71
|
"engines": {
|
|
72
|
-
"node": ">=22.
|
|
72
|
+
"node": ">=22.22"
|
|
73
73
|
},
|
|
74
74
|
"scripts": {
|
|
75
75
|
"build": "tsdown",
|