@kubb/parser-ts 5.0.0-beta.5 → 5.0.0-beta.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,8 +1,11 @@
1
- import "./chunk--u3MIqq1.js";
2
- import { normalize, relative } from "node:path";
1
+ import "./chunk-C0LytTxp.js";
3
2
  import { defineParser } from "@kubb/core";
3
+ import { normalize, relative } from "node:path";
4
4
  import ts from "typescript";
5
- //#region src/constants.ts
5
+ /**
6
+ * Indentation unit prepended once per nesting level when pretty-printing.
7
+ */
8
+ const INDENT = " ".repeat(2);
6
9
  /**
7
10
  * Matches the trailing `.<ext>` segment of a path (keeps segments like `foo.bar.ts`
8
11
  * intact by only trimming the last run of non-`/`/`.` characters).
@@ -13,26 +16,29 @@ const FILE_EXTENSION_PATTERN = /\.[^/.]+$/;
13
16
  */
14
17
  const WINDOWS_PATH_SEPARATOR = /\\/g;
15
18
  /**
16
- * Matches `*\/` in free-form text so JSDoc bodies can neutralise premature
19
+ * Matches `*\/` in free-form text so JSDoc bodies can neutralize premature
17
20
  * comment terminators (`*\/` → `* /`).
18
21
  */
19
22
  const JSDOC_TERMINATOR_PATTERN = /\*\//g;
20
23
  /**
21
- * Matches carriage returns for normalising CRLF/CR line endings to LF.
24
+ * Matches carriage returns for normalizing CRLF/CR line endings to LF.
22
25
  */
23
26
  const CARRIAGE_RETURN_PATTERN = /\r/g;
24
27
  /**
25
- * Matches CRLF sequences used when normalising TypeScript printer output.
28
+ * Matches CRLF sequences used when normalizing TypeScript printer output.
26
29
  */
27
30
  const CRLF_PATTERN = /\r\n/g;
28
31
  /**
29
- * Matches an identifier that starts with a digit JavaScript disallows this
32
+ * Matches an identifier that starts with a digit. JavaScript disallows this,
30
33
  * so the printer prefixes such names with `_`.
31
34
  */
32
35
  const LEADING_DIGIT_PATTERN = /^\d/;
33
36
  //#endregion
34
- //#region src/parserTs.ts
37
+ //#region src/utils.ts
35
38
  const { factory } = ts;
39
+ /**
40
+ * Normalizes a file-system path to POSIX separators and strips any leading `../` segment.
41
+ */
36
42
  function slash(path) {
37
43
  return normalize(path).replaceAll(WINDOWS_PATH_SEPARATOR, "/").replace("../", "");
38
44
  }
@@ -62,57 +68,104 @@ function resolveOutputPath(path, options, rootAware) {
62
68
  return rootAware ? trimExtName(path) : path;
63
69
  }
64
70
  /**
65
- * Validates TypeScript AST nodes before printing.
66
- * Throws an error if any node has SyntaxKind.Unknown which would cause the
67
- * TypeScript printer to crash.
71
+ * Serializes a `nodes` array into source text. Each entry is rendered via {@link printCodeNode}
72
+ * and joined with a single newline; a `Break` node (`<br/>`) inserts one blank line between
73
+ * statements. Consecutive breaks, and breaks at the very start or end, are folded into the
74
+ * separator, so a double `<br/>` never emits more than one blank line.
68
75
  */
69
- function validateNodes(...nodes) {
76
+ function printNodes(nodes) {
77
+ if (!nodes || nodes.length === 0) return "";
78
+ let result = "";
79
+ let hasContent = false;
80
+ let pendingBreak = false;
70
81
  for (const node of nodes) {
71
- if (!node) throw new Error("Attempted to print undefined or null TypeScript node");
72
- if (node.kind === ts.SyntaxKind.Unknown) throw new Error(`Invalid TypeScript AST node detected with SyntaxKind.Unknown. This typically indicates a schema pattern that could not be properly converted to TypeScript. Node: ${JSON.stringify(node, null, 2)}`);
82
+ if (node.kind === "Break") {
83
+ if (hasContent) pendingBreak = true;
84
+ continue;
85
+ }
86
+ const text = printCodeNode(node);
87
+ if (!text) continue;
88
+ if (hasContent) result += pendingBreak ? "\n\n" : "\n";
89
+ result += text;
90
+ hasContent = true;
91
+ pendingBreak = false;
73
92
  }
93
+ return result;
74
94
  }
75
95
  /**
76
- * Converts TypeScript/TSX AST nodes to a string using the TypeScript printer.
96
+ * Indents every non-empty line of `text` by one indent unit. Pass a number to repeat
97
+ * {@link INDENT_CHAR} that many times, or a string to use as the indent verbatim.
77
98
  */
78
- function print(...elements) {
79
- const sourceFile = ts.createSourceFile("print.tsx", "", ts.ScriptTarget.ES2022, true, ts.ScriptKind.TSX);
80
- return ts.createPrinter({
81
- omitTrailingSemicolon: true,
82
- newLine: ts.NewLineKind.LineFeed,
83
- removeComments: false,
84
- noEmitHelpers: true
85
- }).printList(ts.ListFormat.MultiLine, factory.createNodeArray(elements.filter(Boolean)), sourceFile).replace(CRLF_PATTERN, "\n");
99
+ function indentLines(text, indent = INDENT) {
100
+ if (!text) return "";
101
+ const pad = typeof indent === "string" ? indent : " ".repeat(indent);
102
+ return text.split("\n").map((line) => line.trim() ? `${pad}${line}` : "").join("\n");
86
103
  }
87
104
  /**
88
- * Like `print` but validates nodes first to surface issues early.
105
+ * Removes the common leading whitespace shared by every non-blank line and trims
106
+ * surrounding blank lines, normalizing multi-line content authored inside an
107
+ * indented template literal back to a column-zero baseline. Leading whitespace is
108
+ * counted by character, so N tabs and N spaces are treated as the same depth.
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * dedent('\n foo\n bar\n ')
113
+ * // 'foo\n bar'
114
+ * ```
89
115
  */
90
- function safePrint(...elements) {
91
- validateNodes(...elements);
92
- return print(...elements);
116
+ function dedent(text) {
117
+ if (!text) return "";
118
+ const lines = text.split("\n");
119
+ const isBlank = (line) => line.trim() === "";
120
+ const start = lines.findIndex((line) => !isBlank(line));
121
+ if (start === -1) return "";
122
+ const end = lines.findLastIndex((line) => !isBlank(line));
123
+ const trimmed = lines.slice(start, end + 1);
124
+ const indents = trimmed.filter((line) => !isBlank(line)).map((line) => line.match(/^\s*/)?.[0].length ?? 0);
125
+ const min = indents.length ? Math.min(...indents) : 0;
126
+ return trimmed.map((line) => isBlank(line) ? "" : line.slice(min)).join("\n");
93
127
  }
94
- function createImport({ name, path, root, isTypeOnly = false, isNameSpace = false }) {
95
- const resolvePath = root ? getRelativePath(root, path) : path;
96
- if (!Array.isArray(name)) {
97
- if (isNameSpace) return factory.createImportDeclaration(void 0, factory.createImportClause(isTypeOnly, void 0, factory.createNamespaceImport(factory.createIdentifier(name))), factory.createStringLiteral(resolvePath), void 0);
98
- return factory.createImportDeclaration(void 0, factory.createImportClause(isTypeOnly, factory.createIdentifier(name), void 0), factory.createStringLiteral(resolvePath), void 0);
99
- }
100
- const specifiers = name.map((item) => {
101
- if (typeof item === "object") {
102
- const { propertyName, name: alias } = item;
103
- return factory.createImportSpecifier(false, alias ? factory.createIdentifier(propertyName) : void 0, factory.createIdentifier(alias ?? propertyName));
104
- }
105
- return factory.createImportSpecifier(false, void 0, factory.createIdentifier(item));
106
- });
107
- return factory.createImportDeclaration(void 0, factory.createImportClause(isTypeOnly, void 0, factory.createNamedImports(specifiers)), factory.createStringLiteral(resolvePath), void 0);
128
+ /**
129
+ * Renders the generic clause (`<T, U>`) shared by function and arrow-function nodes.
130
+ * Accepts either a raw string (rendered verbatim) or an array of type-parameter names.
131
+ */
132
+ function formatGenerics(generics) {
133
+ if (!generics) return "";
134
+ return `<${Array.isArray(generics) ? generics.join(", ") : generics}>`;
108
135
  }
109
- function createExport({ path, asAlias, isTypeOnly = false, name }) {
110
- if (name && !Array.isArray(name) && !asAlias) console.warn(`When using name as string, asAlias should be true: ${name}`);
111
- if (!Array.isArray(name)) {
112
- const parsedName = name && LEADING_DIGIT_PATTERN.test(name) ? `_${name.slice(1)}` : name;
113
- return factory.createExportDeclaration(void 0, isTypeOnly, asAlias && parsedName ? factory.createNamespaceExport(factory.createIdentifier(parsedName)) : void 0, factory.createStringLiteral(path), void 0);
114
- }
115
- return factory.createExportDeclaration(void 0, isTypeOnly, factory.createNamedExports(name.map((propertyName) => factory.createExportSpecifier(false, void 0, typeof propertyName === "string" ? factory.createIdentifier(propertyName) : propertyName))), factory.createStringLiteral(path), void 0);
136
+ /**
137
+ * Renders the return-type suffix (`: T` or `: Promise<T>` when `isAsync` is true).
138
+ * Returns an empty string when no return type is provided.
139
+ */
140
+ function formatReturnType(returnType, isAsync) {
141
+ if (!returnType) return "";
142
+ return isAsync ? `: Promise<${returnType}>` : `: ${returnType}`;
143
+ }
144
+ /**
145
+ * Module-scoped TypeScript printer instance. `ts.createPrinter()` is stateless across calls
146
+ * (it does not mutate the source file) so a single instance can be safely reused for every
147
+ * `print()` call. Hoisting it out of `print()` avoids re-running the printer initialization
148
+ * for each file's import/export section.
149
+ */
150
+ const TS_PRINTER = ts.createPrinter({
151
+ omitTrailingSemicolon: true,
152
+ newLine: ts.NewLineKind.LineFeed,
153
+ removeComments: false,
154
+ noEmitHelpers: true
155
+ });
156
+ /**
157
+ * Module-scoped source file used as the print target. `printList` only reads the source
158
+ * file's compiler options / language version. It never mutates it.
159
+ */
160
+ const PRINT_SOURCE_FILE = ts.createSourceFile("print.tsx", "", ts.ScriptTarget.ES2022, true, ts.ScriptKind.TSX);
161
+ TS_PRINTER.printList(ts.ListFormat.MultiLine, factory.createNodeArray([]), PRINT_SOURCE_FILE);
162
+ /**
163
+ * Converts TypeScript/TSX AST nodes to a string using the TypeScript printer.
164
+ */
165
+ function print(...elements) {
166
+ const filtered = elements.filter(Boolean);
167
+ if (filtered.length === 0) return "";
168
+ return TS_PRINTER.printList(ts.ListFormat.MultiLine, factory.createNodeArray(filtered), PRINT_SOURCE_FILE).replace(CRLF_PATTERN, "\n");
116
169
  }
117
170
  /**
118
171
  * Converts a {@link JSDocNode} to a JSDoc comment block string.
@@ -138,41 +191,6 @@ function printJSDoc(jsDoc) {
138
191
  ].join("\n");
139
192
  }
140
193
  /**
141
- * Serializes the body / value content from a `nodes` array.
142
- *
143
- * Each element is either a raw string or a structured {@link CodeNode}
144
- * (recursively converted via {@link printCodeNode}).
145
- * Elements are joined with `\n`.
146
- */
147
- function printNodes(nodes) {
148
- if (!nodes || nodes.length === 0) return "";
149
- return nodes.map(printCodeNode).join("\n");
150
- }
151
- /**
152
- * Indents every non-empty line of `text` by `spaces` spaces.
153
- */
154
- function indentLines(text, spaces = 2) {
155
- if (!text) return "";
156
- const pad = " ".repeat(spaces);
157
- return text.split("\n").map((line) => line.trim() ? `${pad}${line}` : "").join("\n");
158
- }
159
- /**
160
- * Renders the generic clause (`<T, U>`) shared by function and arrow-function nodes.
161
- * Accepts either a raw string (rendered verbatim) or an array of type-parameter names.
162
- */
163
- function formatGenerics(generics) {
164
- if (!generics) return "";
165
- return `<${Array.isArray(generics) ? generics.join(", ") : generics}>`;
166
- }
167
- /**
168
- * Renders the return-type suffix (`: T` or `: Promise<T>` when `isAsync` is true).
169
- * Returns an empty string when no return type is provided.
170
- */
171
- function formatReturnType(returnType, isAsync) {
172
- if (!returnType) return "";
173
- return isAsync ? `: Promise<${returnType}>` : `: ${returnType}`;
174
- }
175
- /**
176
194
  * Converts a {@link ConstNode} to a TypeScript `const` declaration string.
177
195
  *
178
196
  * Mirrors the `Const` component from `@kubb/renderer-jsx`.
@@ -309,15 +327,14 @@ function printArrowFunction(node) {
309
327
  * ```
310
328
  */
311
329
  function printCodeNode(node) {
312
- switch (node.kind) {
313
- case "Break": return "";
314
- case "Text": return node.value;
315
- case "Jsx": return node.value;
316
- case "Const": return printConst(node);
317
- case "Type": return printType(node);
318
- case "Function": return printFunction(node);
319
- case "ArrowFunction": return printArrowFunction(node);
320
- }
330
+ if (node.kind === "Break") return "";
331
+ if (node.kind === "Text") return dedent(node.value);
332
+ if (node.kind === "Jsx") return dedent(node.value);
333
+ if (node.kind === "Const") return printConst(node);
334
+ if (node.kind === "Type") return printType(node);
335
+ if (node.kind === "Function") return printFunction(node);
336
+ if (node.kind === "ArrowFunction") return printArrowFunction(node);
337
+ return "";
321
338
  }
322
339
  /**
323
340
  * Converts a {@link SourceNode} to its TypeScript string representation.
@@ -325,52 +342,129 @@ function printCodeNode(node) {
325
342
  * Iterates `nodes` in DOM order, rendering each {@link CodeNode} via
326
343
  * {@link printCodeNode}.
327
344
  *
345
+ * Top-level declarations are separated by a blank line so the source reads
346
+ * cleanly without an external formatter.
347
+ *
328
348
  * @example From nodes
329
349
  * ```ts
330
350
  * printSource({ kind: 'Source', nodes: [createConst({ name: 'x', nodes: [createText('1')] }), createText('x.toString()')] })
331
- * // 'const x = 1\nx.toString()'
351
+ * // 'const x = 1\n\nx.toString()'
332
352
  * ```
333
353
  */
334
354
  function printSource(node) {
335
- if (node.nodes && node.nodes.length > 0) return node.nodes.map(printCodeNode).join("\n");
336
- return "";
355
+ const nodes = node.nodes;
356
+ if (!nodes || nodes.length === 0) return "";
357
+ return nodes.map((child) => printCodeNode(child)).filter(Boolean).join("\n\n");
358
+ }
359
+ /**
360
+ * Wraps a module specifier in single quotes, escaping any embedded backslash or quote so the emitted
361
+ * statement stays valid even for unusual paths.
362
+ */
363
+ function quoteModulePath(path) {
364
+ return `'${path.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
337
365
  }
338
366
  /**
339
- * Parser that converts `.ts` and `.js` files to strings using the TypeScript
340
- * compiler. Handles import/export statement generation from file metadata.
367
+ * Renders an import declaration string in the repo style (single quotes, no semicolons), mirroring
368
+ * the shapes that {@link createImport} builds: default, namespace (`* as`), and named imports with
369
+ * `{ a as b }` aliases, each optionally `type`-only. `path` is used verbatim, so resolve it first.
341
370
  *
342
- * @default Used automatically when no `parsers` option is set in `defineConfig`.
371
+ * @example
372
+ * ```ts
373
+ * printImport({ name: ['z'], path: './zod.ts' })
374
+ * // "import { z } from './zod.ts'"
375
+ * ```
376
+ */
377
+ function printImport({ name, path, isTypeOnly = false, isNameSpace = false }) {
378
+ const typePrefix = isTypeOnly ? "type " : "";
379
+ const from = quoteModulePath(path);
380
+ if (!Array.isArray(name)) {
381
+ if (isNameSpace) return `import ${typePrefix}* as ${name} from ${from}`;
382
+ return `import ${typePrefix}${name} from ${from}`;
383
+ }
384
+ return `import ${typePrefix}{ ${name.map((item) => {
385
+ if (typeof item === "object") return item.name ? `${item.propertyName} as ${item.name}` : item.propertyName;
386
+ return item;
387
+ }).join(", ")} } from ${from}`;
388
+ }
389
+ /**
390
+ * Renders an export declaration string in the repo style (single quotes, no semicolons), mirroring
391
+ * the shapes that {@link createExport} builds: named re-exports, namespace alias (`* as name`), and
392
+ * wildcard, each optionally `type`-only. `path` is used verbatim, so resolve it first.
393
+ *
394
+ * @example
395
+ * ```ts
396
+ * printExport({ name: ['Pet', 'Order'], path: './models.ts' })
397
+ * // "export { Pet, Order } from './models.ts'"
398
+ * ```
399
+ */
400
+ function printExport({ path, name, isTypeOnly = false, asAlias = false }) {
401
+ const typePrefix = isTypeOnly ? "type " : "";
402
+ const from = quoteModulePath(path);
403
+ if (Array.isArray(name)) return `export ${typePrefix}{ ${name.map((item) => typeof item === "string" ? item : item.text).join(", ")} } from ${from}`;
404
+ if (asAlias && name) return `export ${typePrefix}* as ${LEADING_DIGIT_PATTERN.test(name) ? `_${name.slice(1)}` : name} from ${from}`;
405
+ if (name) console.warn(`When using name as string, asAlias should be true: ${name}`);
406
+ return `export ${typePrefix}* from ${from}`;
407
+ }
408
+ //#endregion
409
+ //#region src/parserTs.ts
410
+ /**
411
+ * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST
412
+ * produced by an adapter and prints it as TypeScript source using the official
413
+ * TypeScript compiler. Imports and exports are rewritten based on each file's
414
+ * metadata.
415
+ *
416
+ * Used automatically when no `parsers` option is set on `defineConfig`. Use
417
+ * `parserTsx` instead for React projects that emit JSX.
418
+ *
419
+ * @example
420
+ * ```ts
421
+ * import { defineConfig } from 'kubb'
422
+ * import { adapterOas } from '@kubb/adapter-oas'
423
+ * import { parserTs } from '@kubb/parser-ts'
424
+ *
425
+ * export default defineConfig({
426
+ * input: { path: './petStore.yaml' },
427
+ * output: { path: './src/gen' },
428
+ * adapter: adapterOas(),
429
+ * parsers: [parserTs],
430
+ * plugins: [],
431
+ * })
432
+ * ```
343
433
  */
344
434
  const parserTs = defineParser({
345
435
  name: "typescript",
346
436
  extNames: [".ts", ".js"],
347
- async parse(file, options = { extname: ".ts" }) {
437
+ print(...nodes) {
438
+ return print(...nodes);
439
+ },
440
+ parse(file, options = { extname: ".ts" }) {
348
441
  const sourceParts = [];
349
442
  for (const item of file.sources) {
350
443
  const sourceStr = printSource(item);
351
444
  if (sourceStr) sourceParts.push(sourceStr.trimEnd());
352
445
  }
353
446
  const source = sourceParts.join("\n\n");
354
- const importNodes = [];
447
+ const importLines = [];
355
448
  for (const item of file.imports) {
356
449
  const importPath = item.root ? getRelativePath(item.root, item.path) : item.path;
357
- importNodes.push(createImport({
450
+ importLines.push(printImport({
358
451
  name: item.name,
359
452
  path: resolveOutputPath(importPath, options, Boolean(item.root)),
360
453
  isTypeOnly: item.isTypeOnly,
361
454
  isNameSpace: item.isNameSpace
362
455
  }));
363
456
  }
364
- const exportNodes = [];
365
- for (const item of file.exports) exportNodes.push(createExport({
457
+ const exportLines = [];
458
+ for (const item of file.exports) exportLines.push(printExport({
366
459
  name: item.name,
367
460
  path: resolveOutputPath(item.path, options, true),
368
461
  isTypeOnly: item.isTypeOnly,
369
462
  asAlias: item.asAlias
370
463
  }));
464
+ const importExportBlock = [...importLines, ...exportLines].join("\n");
371
465
  return [
372
466
  file.banner,
373
- print(...importNodes, ...exportNodes),
467
+ importExportBlock,
374
468
  source,
375
469
  file.footer
376
470
  ].filter((segment) => Boolean(segment)).map((s) => s.trimEnd()).join("\n\n");
@@ -379,22 +473,38 @@ const parserTs = defineParser({
379
473
  //#endregion
380
474
  //#region src/parserTsx.ts
381
475
  /**
382
- * Parser that converts `.tsx` and `.jsx` files to strings.
383
- * Delegates to `typescriptParser` since the TypeScript compiler natively
384
- * supports JSX/TSX syntax via `ScriptKind.TSX`.
476
+ * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs` because the
477
+ * TypeScript compiler handles JSX natively via `ScriptKind.TSX`.
478
+ *
479
+ * Add to the `parsers` array on `defineConfig` when generating components for
480
+ * React (or any framework that emits JSX).
385
481
  *
386
- * Add this parser to the `parsers` option in `defineConfig` when generating `.tsx`/`.jsx` files.
482
+ * @example
483
+ * ```ts
484
+ * import { defineConfig } from 'kubb'
485
+ * import { adapterOas } from '@kubb/adapter-oas'
486
+ * import { parserTsx } from '@kubb/parser-ts'
387
487
  *
388
- * @default extname '.tsx'
488
+ * export default defineConfig({
489
+ * input: { path: './petStore.yaml' },
490
+ * output: { path: './src/gen' },
491
+ * adapter: adapterOas(),
492
+ * parsers: [parserTsx],
493
+ * plugins: [],
494
+ * })
495
+ * ```
389
496
  */
390
497
  const parserTsx = defineParser({
391
498
  name: "tsx",
392
499
  extNames: [".tsx", ".jsx"],
393
- async parse(file, options = { extname: ".tsx" }) {
500
+ print(...nodes) {
501
+ return print(...nodes);
502
+ },
503
+ parse(file, options = { extname: ".tsx" }) {
394
504
  return parserTs.parse(file, options);
395
505
  }
396
506
  });
397
507
  //#endregion
398
- export { createExport, createImport, parserTs, parserTsx, print, safePrint, validateNodes };
508
+ export { parserTs, parserTsx };
399
509
 
400
510
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/constants.ts","../src/parserTs.ts","../src/parserTsx.ts"],"sourcesContent":["/**\n * Number of spaces used to indent a nested block when pretty-printing.\n */\nexport const INDENT_SIZE = 2 as const\n\n/**\n * Matches the trailing `.<ext>` segment of a path (keeps segments like `foo.bar.ts`\n * intact by only trimming the last run of non-`/`/`.` characters).\n */\nexport const FILE_EXTENSION_PATTERN = /\\.[^/.]+$/\n\n/**\n * Matches Windows-style backslash path separators.\n */\nexport const WINDOWS_PATH_SEPARATOR = /\\\\/g\n\n/**\n * Matches `*\\/` in free-form text so JSDoc bodies can neutralise premature\n * comment terminators (`*\\/` → `* /`).\n */\nexport const JSDOC_TERMINATOR_PATTERN = /\\*\\//g\n\n/**\n * Matches carriage returns for normalising CRLF/CR line endings to LF.\n */\nexport const CARRIAGE_RETURN_PATTERN = /\\r/g\n\n/**\n * Matches CRLF sequences used when normalising TypeScript printer output.\n */\nexport const CRLF_PATTERN = /\\r\\n/g\n\n/**\n * Matches an identifier that starts with a digit — JavaScript disallows this\n * so the printer prefixes such names with `_`.\n */\nexport const LEADING_DIGIT_PATTERN = /^\\d/\n\n/**\n * Relative path prefix used to detect traversal segments (`../`).\n */\nexport const PARENT_DIRECTORY_PREFIX = '../' as const\n\n/**\n * Relative path prefix used when resolving imports within the output root.\n */\nexport const CURRENT_DIRECTORY_PREFIX = './' as const\n","import { normalize, relative } from 'node:path'\nimport type { ArrowFunctionNode, CodeNode, ConstNode, FileNode, FunctionNode, JSDocNode, JsxNode, SourceNode, TextNode, TypeNode } from '@kubb/ast'\nimport type { Parser } from '@kubb/core'\nimport { defineParser } from '@kubb/core'\nimport ts from 'typescript'\nimport {\n CARRIAGE_RETURN_PATTERN,\n CRLF_PATTERN,\n CURRENT_DIRECTORY_PREFIX,\n FILE_EXTENSION_PATTERN,\n INDENT_SIZE,\n JSDOC_TERMINATOR_PATTERN,\n LEADING_DIGIT_PATTERN,\n PARENT_DIRECTORY_PREFIX,\n WINDOWS_PATH_SEPARATOR,\n} from './constants.ts'\n\nconst { factory } = ts\n\nfunction slash(path: string): string {\n return normalize(path).replaceAll(WINDOWS_PATH_SEPARATOR, '/').replace(PARENT_DIRECTORY_PREFIX, '')\n}\n\n/**\n * Resolves `filePath` relative to `rootDir` and returns a POSIX-style path\n * prefixed with `./` when the target sits inside the root, or `../` when it escapes it.\n */\nfunction getRelativePath(rootDir: string, filePath: string): string {\n const rel = relative(rootDir, filePath)\n const slashed = slash(rel)\n return slashed.startsWith(PARENT_DIRECTORY_PREFIX) ? slashed : `${CURRENT_DIRECTORY_PREFIX}${slashed}`\n}\n\n/**\n * Strips the trailing file extension (for example `.ts`) from a path.\n * Preserves intermediate dots like `foo.bar.ts` → `foo.bar`.\n */\nfunction trimExtName(text: string): string {\n return text.replace(FILE_EXTENSION_PATTERN, '')\n}\n\n/**\n * Rewrites an import/export path so its extension matches the caller-supplied\n * `options.extname`. When the source path has no extension the original is kept,\n * so virtual/module-only paths flow through unchanged.\n */\nfunction resolveOutputPath(path: string, options: { extname?: string } | undefined, rootAware: boolean): string {\n const hasExtname = FILE_EXTENSION_PATTERN.test(path)\n if (options?.extname && hasExtname) {\n return `${trimExtName(path)}${options.extname}`\n }\n return rootAware ? trimExtName(path) : path\n}\n\n/**\n * Validates TypeScript AST nodes before printing.\n * Throws an error if any node has SyntaxKind.Unknown which would cause the\n * TypeScript printer to crash.\n */\nexport function validateNodes(...nodes: ts.Node[]): void {\n for (const node of nodes) {\n if (!node) {\n throw new Error('Attempted to print undefined or null TypeScript node')\n }\n if (node.kind === ts.SyntaxKind.Unknown) {\n throw new Error(\n 'Invalid TypeScript AST node detected with SyntaxKind.Unknown. ' +\n 'This typically indicates a schema pattern that could not be properly converted to TypeScript. ' +\n `Node: ${JSON.stringify(node, null, 2)}`,\n )\n }\n }\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 sourceFile = ts.createSourceFile('print.tsx', '', ts.ScriptTarget.ES2022, true, ts.ScriptKind.TSX)\n\n const printer = ts.createPrinter({\n omitTrailingSemicolon: true,\n newLine: ts.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n })\n\n const output = printer.printList(ts.ListFormat.MultiLine, factory.createNodeArray(elements.filter(Boolean)), sourceFile)\n\n return output.replace(CRLF_PATTERN, '\\n')\n}\n\n/**\n * Like `print` but validates nodes first to surface issues early.\n */\nexport function safePrint(...elements: Array<ts.Node>): string {\n validateNodes(...elements)\n return print(...elements)\n}\n\nexport function createImport({\n name,\n path,\n root,\n isTypeOnly = false,\n isNameSpace = false,\n}: {\n name: string | Array<string | { propertyName: string; name?: string }>\n path: string\n root?: string\n /** @default false */\n isTypeOnly?: boolean\n /** @default false */\n isNameSpace?: boolean\n}): ts.ImportDeclaration {\n const resolvePath = root ? getRelativePath(root, path) : path\n\n if (!Array.isArray(name)) {\n if (isNameSpace) {\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(isTypeOnly, undefined, factory.createNamespaceImport(factory.createIdentifier(name))),\n factory.createStringLiteral(resolvePath),\n undefined,\n )\n }\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(isTypeOnly, factory.createIdentifier(name), undefined),\n factory.createStringLiteral(resolvePath),\n undefined,\n )\n }\n\n const specifiers = name.map((item) => {\n if (typeof item === 'object') {\n const { propertyName, name: alias } = item\n return factory.createImportSpecifier(false, alias ? factory.createIdentifier(propertyName) : undefined, factory.createIdentifier(alias ?? propertyName))\n }\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(item))\n })\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(isTypeOnly, undefined, factory.createNamedImports(specifiers)),\n factory.createStringLiteral(resolvePath),\n undefined,\n )\n}\n\nexport function createExport({\n path,\n asAlias,\n isTypeOnly = false,\n name,\n}: {\n path: string\n /** @default false */\n asAlias?: boolean\n /** @default false */\n isTypeOnly?: boolean\n name?: string | Array<ts.Identifier | string>\n}): ts.ExportDeclaration {\n if (name && !Array.isArray(name) && !asAlias) {\n console.warn(`When using name as string, asAlias should be true: ${name}`)\n }\n\n if (!Array.isArray(name)) {\n const parsedName = name && LEADING_DIGIT_PATTERN.test(name) ? `_${name.slice(1)}` : name\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n asAlias && parsedName ? factory.createNamespaceExport(factory.createIdentifier(parsedName)) : undefined,\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n factory.createNamedExports(\n name.map((propertyName) =>\n factory.createExportSpecifier(false, undefined, typeof propertyName === 'string' ? factory.createIdentifier(propertyName) : propertyName),\n ),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\n/**\n * Converts a {@link JSDocNode} to a JSDoc comment block string.\n *\n * @example\n * ```ts\n * printJSDoc({ comments: ['@description A pet', '@deprecated'] })\n * // /**\n * // * @description A pet\n * // * @deprecated\n * // *\\/\n * ```\n */\nexport function printJSDoc(jsDoc: 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(JSDOC_TERMINATOR_PATTERN, '* /').replace(CARRIAGE_RETURN_PATTERN, ''))\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 * Serializes the body / value content from a `nodes` array.\n *\n * Each element is either a raw string or a structured {@link CodeNode}\n * (recursively converted via {@link printCodeNode}).\n * Elements are joined with `\\n`.\n */\nfunction printNodes(nodes: Array<CodeNode> | undefined): string {\n if (!nodes || nodes.length === 0) return ''\n return nodes.map(printCodeNode).join('\\n')\n}\n\n/**\n * Indents every non-empty line of `text` by `spaces` spaces.\n */\nfunction indentLines(text: string, spaces: number = INDENT_SIZE): string {\n if (!text) return ''\n const pad = ' '.repeat(spaces)\n return text\n .split('\\n')\n .map((line) => (line.trim() ? `${pad}${line}` : ''))\n .join('\\n')\n}\n\n/**\n * Renders the generic clause (`<T, U>`) shared by function and arrow-function nodes.\n * Accepts either a raw string (rendered verbatim) or an array of type-parameter names.\n */\nfunction formatGenerics(generics: FunctionNode['generics'] | ArrowFunctionNode['generics']): string {\n if (!generics) return ''\n return `<${Array.isArray(generics) ? generics.join(', ') : generics}>`\n}\n\n/**\n * Renders the return-type suffix (`: T` or `: Promise<T>` when `isAsync` is true).\n * Returns an empty string when no return type is provided.\n */\nfunction formatReturnType(returnType: string | undefined, isAsync: boolean | undefined): string {\n if (!returnType) return ''\n return isAsync ? `: Promise<${returnType}>` : `: ${returnType}`\n}\n\n/**\n * Converts a {@link ConstNode} to a TypeScript `const` declaration string.\n *\n * Mirrors the `Const` component from `@kubb/renderer-jsx`.\n *\n * @example\n * ```ts\n * printConst(createConst({ name: 'pet', export: true, nodes: ['{}'] }))\n * // 'export const pet = {}'\n * ```\n *\n * @example With type and `as const`\n * ```ts\n * printConst(createConst({ name: 'pets', export: true, type: 'Pet[]', asConst: true, nodes: ['[]'] }))\n * // 'export const pets: Pet[] = [] as const'\n * ```\n */\nexport function printConst(node: ConstNode): string {\n const { name, export: canExport, type, JSDoc, asConst, nodes } = node\n\n const jsDocStr = JSDoc ? printJSDoc(JSDoc) : ''\n const body = printNodes(nodes)\n\n const parts: string[] = []\n if (canExport) parts.push('export ')\n parts.push('const ')\n parts.push(name)\n if (type) {\n parts.push(`: ${type}`)\n }\n parts.push(' = ')\n parts.push(body)\n if (asConst) parts.push(' as const')\n\n const declaration = parts.join('')\n return [jsDocStr, declaration].filter(Boolean).join('\\n')\n}\n\n/**\n * Converts a {@link TypeNode} to a TypeScript `type` alias declaration string.\n *\n * Mirrors the `Type` component from `@kubb/renderer-jsx`.\n *\n * @example\n * ```ts\n * printType(createType({ name: 'Pet', export: true, nodes: ['{ id: number }'] }))\n * // 'export type Pet = { id: number }'\n * ```\n */\nexport function printType(node: TypeNode): string {\n const { name, export: canExport, JSDoc, nodes } = node\n\n const jsDocStr = JSDoc ? printJSDoc(JSDoc) : ''\n const body = printNodes(nodes)\n\n const parts: string[] = []\n if (canExport) parts.push('export ')\n parts.push('type ')\n parts.push(name)\n parts.push(' = ')\n parts.push(body)\n\n const declaration = parts.join('')\n return [jsDocStr, declaration].filter(Boolean).join('\\n')\n}\n\n/**\n * Converts a {@link FunctionNode} to a TypeScript `function` declaration string.\n *\n * Mirrors the `Function` component from `@kubb/renderer-jsx`.\n *\n * @example\n * ```ts\n * printFunction(createFunction({ name: 'getPet', export: true, params: 'id: string', returnType: 'Pet', nodes: ['return fetch(id)'] }))\n * // 'export function getPet(id: string): Pet {\\n return fetch(id)\\n}'\n * ```\n *\n * @example Async with generics\n * ```ts\n * printFunction(createFunction({ name: 'fetchPet', export: true, async: true, generics: ['T'], params: 'id: string', returnType: 'T' }))\n * // 'export async function fetchPet<T>(id: string): Promise<T> {\\n}'\n * ```\n */\nexport function printFunction(node: FunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes } = node\n\n const jsDocStr = JSDoc ? printJSDoc(JSDoc) : ''\n const body = printNodes(nodes)\n const indented = body ? indentLines(body) : ''\n\n const parts: string[] = []\n if (canExport) parts.push('export ')\n if (isDefault) parts.push('default ')\n if (isAsync) parts.push('async ')\n parts.push('function ')\n parts.push(name)\n parts.push(formatGenerics(generics))\n parts.push(`(${params ?? ''})`)\n parts.push(formatReturnType(returnType, isAsync))\n parts.push(' {')\n if (indented) {\n parts.push(`\\n${indented}\\n`)\n }\n parts.push('}')\n\n const declaration = parts.join('')\n return [jsDocStr, declaration].filter(Boolean).join('\\n')\n}\n\n/**\n * Converts an {@link ArrowFunctionNode} to a TypeScript arrow function declaration string.\n *\n * Mirrors the `Function.Arrow` component from `@kubb/renderer-jsx`.\n *\n * @example Multi-line arrow function\n * ```ts\n * printArrowFunction(createArrowFunction({ name: 'getPet', export: true, params: 'id: string', nodes: ['return fetch(id)'] }))\n * // 'export const getPet = (id: string) => {\\n return fetch(id)\\n}'\n * ```\n *\n * @example Single-line arrow function\n * ```ts\n * printArrowFunction(createArrowFunction({ name: 'double', params: 'n: number', singleLine: true, nodes: ['n * 2'] }))\n * // 'const double = (n: number) => n * 2'\n * ```\n */\nexport function printArrowFunction(node: ArrowFunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes, singleLine } = node\n\n const jsDocStr = JSDoc ? printJSDoc(JSDoc) : ''\n const body = printNodes(nodes)\n const arrowBody = singleLine ? ` => ${body}` : body ? ` => {\\n${indentLines(body)}\\n}` : ' => {}'\n\n const parts: string[] = []\n if (canExport) parts.push('export ')\n if (isDefault) parts.push('default ')\n parts.push('const ')\n parts.push(name)\n parts.push(' = ')\n if (isAsync) parts.push('async ')\n parts.push(formatGenerics(generics))\n parts.push(`(${params ?? ''})`)\n parts.push(formatReturnType(returnType, isAsync))\n parts.push(arrowBody)\n\n const declaration = parts.join('')\n return [jsDocStr, declaration].filter(Boolean).join('\\n')\n}\n\n/**\n * Converts a {@link CodeNode} to its TypeScript string representation.\n *\n * Dispatches to the appropriate printer based on the node's `kind`.\n *\n * @example\n * ```ts\n * printCodeNode(createConst({ name: 'x', nodes: ['1'] }))\n * // 'const x = 1'\n * ```\n */\nexport function printCodeNode(node: CodeNode): string {\n switch (node.kind) {\n case 'Break':\n return ''\n case 'Text':\n return (node as TextNode).value\n case 'Jsx':\n return (node as JsxNode).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 * Converts a {@link SourceNode} to its TypeScript string representation.\n *\n * Iterates `nodes` in DOM order, rendering each {@link CodeNode} via\n * {@link printCodeNode}.\n *\n * @example From nodes\n * ```ts\n * printSource({ kind: 'Source', nodes: [createConst({ name: 'x', nodes: [createText('1')] }), createText('x.toString()')] })\n * // 'const x = 1\\nx.toString()'\n * ```\n */\nexport function printSource(node: SourceNode): string {\n if (node.nodes && node.nodes.length > 0) {\n return node.nodes.map(printCodeNode).join('\\n')\n }\n return ''\n}\n\n/**\n * Parser that converts `.ts` and `.js` files to strings using the TypeScript\n * compiler. Handles import/export statement generation from file metadata.\n *\n * @default Used automatically when no `parsers` option is set in `defineConfig`.\n */\nexport const parserTs: Parser = defineParser({\n name: 'typescript',\n extNames: ['.ts', '.js'],\n async parse(file, options = { extname: '.ts' }) {\n const sourceParts: Array<string> = []\n for (const item of file.sources) {\n const sourceStr = printSource(item as SourceNode)\n if (sourceStr) {\n sourceParts.push(sourceStr.trimEnd())\n }\n }\n const source = sourceParts.join('\\n\\n')\n\n const importNodes: Array<ts.ImportDeclaration> = []\n for (const item of (file as FileNode).imports) {\n const importPath = item.root ? getRelativePath(item.root, item.path) : item.path\n importNodes.push(\n createImport({\n name: item.name as string | Array<string | { propertyName: string; name?: string }>,\n path: resolveOutputPath(importPath, options, Boolean(item.root)),\n isTypeOnly: item.isTypeOnly,\n isNameSpace: item.isNameSpace,\n }),\n )\n }\n\n const exportNodes: Array<ts.ExportDeclaration> = []\n for (const item of (file as FileNode).exports) {\n exportNodes.push(\n createExport({\n name: item.name as string | Array<ts.Identifier | string> | undefined,\n path: resolveOutputPath(item.path, options, true),\n isTypeOnly: item.isTypeOnly,\n asAlias: item.asAlias,\n }),\n )\n }\n\n const parts = [file.banner, print(...importNodes, ...exportNodes), source, file.footer]\n .filter((segment): segment is string => Boolean(segment))\n .map((s) => s.trimEnd())\n return parts.join('\\n\\n')\n },\n})\n","import type { Parser } from '@kubb/core'\nimport { defineParser } from '@kubb/core'\nimport { parserTs } from './parserTs.ts'\n\n/**\n * Parser that converts `.tsx` and `.jsx` files to strings.\n * Delegates to `typescriptParser` since the TypeScript compiler natively\n * supports JSX/TSX syntax via `ScriptKind.TSX`.\n *\n * Add this parser to the `parsers` option in `defineConfig` when generating `.tsx`/`.jsx` files.\n *\n * @default extname '.tsx'\n */\nexport const parserTsx: Parser = defineParser({\n name: 'tsx',\n extNames: ['.tsx', '.jsx'],\n async parse(file, options = { extname: '.tsx' }) {\n return parserTs.parse(file, options)\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/constants.ts","../src/utils.ts","../src/parserTs.ts","../src/parserTsx.ts"],"sourcesContent":["/**\n * Character used for a single indent step. Set to `'\\t'` to emit tab-indented output.\n */\nexport const INDENT_CHAR = ' '\n\n/**\n * Number of {@link INDENT_CHAR} repeats that make up one nesting level.\n */\nexport const INDENT_SIZE = 2 as const\n\n/**\n * Indentation unit prepended once per nesting level when pretty-printing.\n */\nexport const INDENT = INDENT_CHAR.repeat(INDENT_SIZE)\n\n/**\n * Matches the trailing `.<ext>` segment of a path (keeps segments like `foo.bar.ts`\n * intact by only trimming the last run of non-`/`/`.` characters).\n */\nexport const FILE_EXTENSION_PATTERN = /\\.[^/.]+$/\n\n/**\n * Matches Windows-style backslash path separators.\n */\nexport const WINDOWS_PATH_SEPARATOR = /\\\\/g\n\n/**\n * Matches `*\\/` in free-form text so JSDoc bodies can neutralize premature\n * comment terminators (`*\\/` → `* /`).\n */\nexport const JSDOC_TERMINATOR_PATTERN = /\\*\\//g\n\n/**\n * Matches carriage returns for normalizing CRLF/CR line endings to LF.\n */\nexport const CARRIAGE_RETURN_PATTERN = /\\r/g\n\n/**\n * Matches CRLF sequences used when normalizing TypeScript printer output.\n */\nexport const CRLF_PATTERN = /\\r\\n/g\n\n/**\n * Matches an identifier that starts with a digit. JavaScript disallows this,\n * so the printer prefixes such names with `_`.\n */\nexport const LEADING_DIGIT_PATTERN = /^\\d/\n\n/**\n * Relative path prefix used to detect traversal segments (`../`).\n */\nexport const PARENT_DIRECTORY_PREFIX = '../' as const\n\n/**\n * Relative path prefix used when resolving imports within the output root.\n */\nexport const CURRENT_DIRECTORY_PREFIX = './' as const\n","import { normalize, relative } from 'node:path'\nimport type { ArrowFunctionNode, CodeNode, ConstNode, FunctionNode, JSDocNode, JsxNode, SourceNode, TextNode, TypeNode } from '@kubb/ast'\nimport ts from 'typescript'\nimport {\n CARRIAGE_RETURN_PATTERN,\n CRLF_PATTERN,\n CURRENT_DIRECTORY_PREFIX,\n FILE_EXTENSION_PATTERN,\n INDENT,\n INDENT_CHAR,\n JSDOC_TERMINATOR_PATTERN,\n LEADING_DIGIT_PATTERN,\n PARENT_DIRECTORY_PREFIX,\n WINDOWS_PATH_SEPARATOR,\n} from './constants.ts'\n\nconst { factory } = ts\n\n/**\n * Normalizes a file-system path to POSIX separators and strips any leading `../` segment.\n */\nexport function slash(path: string): string {\n return normalize(path).replaceAll(WINDOWS_PATH_SEPARATOR, '/').replace(PARENT_DIRECTORY_PREFIX, '')\n}\n\n/**\n * Resolves `filePath` relative to `rootDir` and returns a POSIX-style path\n * prefixed with `./` when the target sits inside the root, or `../` when it escapes it.\n */\nexport function getRelativePath(rootDir: string, filePath: string): string {\n const rel = relative(rootDir, filePath)\n const slashed = slash(rel)\n return slashed.startsWith(PARENT_DIRECTORY_PREFIX) ? slashed : `${CURRENT_DIRECTORY_PREFIX}${slashed}`\n}\n\n/**\n * Strips the trailing file extension (for example `.ts`) from a path.\n * Preserves intermediate dots like `foo.bar.ts` → `foo.bar`.\n */\nexport function trimExtName(text: string): string {\n return text.replace(FILE_EXTENSION_PATTERN, '')\n}\n\n/**\n * Rewrites an import/export path so its extension matches the caller-supplied\n * `options.extname`. When the source path has no extension the original is kept,\n * so virtual/module-only paths flow through unchanged.\n */\nexport function resolveOutputPath(path: string, options: { extname?: string } | undefined, rootAware: boolean): string {\n const hasExtname = FILE_EXTENSION_PATTERN.test(path)\n if (options?.extname && hasExtname) {\n return `${trimExtName(path)}${options.extname}`\n }\n return rootAware ? trimExtName(path) : path\n}\n\n/**\n * Serializes a `nodes` array into source text. Each entry is rendered via {@link printCodeNode}\n * and joined with a single newline; a `Break` node (`<br/>`) inserts one blank line between\n * statements. Consecutive breaks, and breaks at the very start or end, are folded into the\n * separator, so a double `<br/>` never emits more than one blank line.\n */\nexport function printNodes(nodes: Array<CodeNode> | undefined): string {\n if (!nodes || nodes.length === 0) return ''\n\n let result = ''\n let hasContent = false\n let pendingBreak = false\n\n for (const node of nodes) {\n if (node.kind === 'Break') {\n if (hasContent) pendingBreak = true\n continue\n }\n\n const text = printCodeNode(node)\n if (!text) continue\n\n if (hasContent) result += pendingBreak ? '\\n\\n' : '\\n'\n result += text\n hasContent = true\n pendingBreak = false\n }\n\n return result\n}\n\n/**\n * Indents every non-empty line of `text` by one indent unit. Pass a number to repeat\n * {@link INDENT_CHAR} that many times, or a string to use as the indent verbatim.\n */\nexport function indentLines(text: string, indent: number | string = INDENT): string {\n if (!text) return ''\n const pad = typeof indent === 'string' ? indent : INDENT_CHAR.repeat(indent)\n return text\n .split('\\n')\n .map((line) => (line.trim() ? `${pad}${line}` : ''))\n .join('\\n')\n}\n\n/**\n * Removes the common leading whitespace shared by every non-blank line and trims\n * surrounding blank lines, normalizing multi-line content authored inside an\n * indented template literal back to a column-zero baseline. Leading whitespace is\n * counted by character, so N tabs and N spaces are treated as the same depth.\n *\n * @example\n * ```ts\n * dedent('\\n foo\\n bar\\n ')\n * // 'foo\\n bar'\n * ```\n */\nexport function 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 the generic clause (`<T, U>`) shared by function and arrow-function nodes.\n * Accepts either a raw string (rendered verbatim) or an array of type-parameter names.\n */\nexport function formatGenerics(generics: FunctionNode['generics'] | ArrowFunctionNode['generics']): string {\n if (!generics) return ''\n return `<${Array.isArray(generics) ? generics.join(', ') : generics}>`\n}\n\n/**\n * Renders the return-type suffix (`: T` or `: Promise<T>` when `isAsync` is true).\n * Returns an empty string when no return type is provided.\n */\nexport function formatReturnType(returnType: string | null | undefined, isAsync: boolean | null | undefined): string {\n if (!returnType) return ''\n return isAsync ? `: Promise<${returnType}>` : `: ${returnType}`\n}\n\n/**\n * Module-scoped TypeScript printer instance. `ts.createPrinter()` is stateless across calls\n * (it does not mutate the source file) so a single instance can be safely reused for every\n * `print()` call. Hoisting it out of `print()` avoids re-running the printer initialization\n * for each file's import/export section.\n */\nconst TS_PRINTER = ts.createPrinter({\n omitTrailingSemicolon: true,\n newLine: ts.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n})\n\n/**\n * Module-scoped source file used as the print target. `printList` only reads the source\n * file's compiler options / language version. It never mutates it.\n */\nconst PRINT_SOURCE_FILE = ts.createSourceFile('print.tsx', '', ts.ScriptTarget.ES2022, true, ts.ScriptKind.TSX)\n\n// Pre-warm the printer at module load. The first `printList` call lazily initializes\n// the printer's internal string-builder and identifier tables. Doing it once at import\n// time keeps that cost off the critical path for short-lived CLI builds.\nTS_PRINTER.printList(ts.ListFormat.MultiLine, factory.createNodeArray([]), PRINT_SOURCE_FILE)\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 output = TS_PRINTER.printList(ts.ListFormat.MultiLine, factory.createNodeArray(filtered), PRINT_SOURCE_FILE)\n\n return output.replace(CRLF_PATTERN, '\\n')\n}\n\n/**\n * Converts a {@link JSDocNode} to a JSDoc comment block string.\n *\n * @example\n * ```ts\n * printJSDoc({ comments: ['@description A pet', '@deprecated'] })\n * // /**\n * // * @description A pet\n * // * @deprecated\n * // *\\/\n * ```\n */\nexport function printJSDoc(jsDoc: 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(JSDOC_TERMINATOR_PATTERN, '* /').replace(CARRIAGE_RETURN_PATTERN, ''))\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 ConstNode} to a TypeScript `const` declaration string.\n *\n * Mirrors the `Const` component from `@kubb/renderer-jsx`.\n *\n * @example\n * ```ts\n * printConst(createConst({ name: 'pet', export: true, nodes: ['{}'] }))\n * // 'export const pet = {}'\n * ```\n *\n * @example With type and `as const`\n * ```ts\n * printConst(createConst({ name: 'pets', export: true, type: 'Pet[]', asConst: true, nodes: ['[]'] }))\n * // 'export const pets: Pet[] = [] as const'\n * ```\n */\nexport function printConst(node: ConstNode): string {\n const { name, export: canExport, type, JSDoc, asConst, nodes } = node\n\n const jsDocStr = JSDoc ? printJSDoc(JSDoc) : ''\n const body = printNodes(nodes)\n\n const parts: Array<string> = []\n if (canExport) parts.push('export ')\n parts.push('const ')\n parts.push(name)\n if (type) {\n parts.push(`: ${type}`)\n }\n parts.push(' = ')\n parts.push(body)\n if (asConst) parts.push(' as const')\n\n const declaration = parts.join('')\n return [jsDocStr, declaration].filter(Boolean).join('\\n')\n}\n\n/**\n * Converts a {@link TypeNode} to a TypeScript `type` alias declaration string.\n *\n * Mirrors the `Type` component from `@kubb/renderer-jsx`.\n *\n * @example\n * ```ts\n * printType(createType({ name: 'Pet', export: true, nodes: ['{ id: number }'] }))\n * // 'export type Pet = { id: number }'\n * ```\n */\nexport function printType(node: TypeNode): string {\n const { name, export: canExport, JSDoc, nodes } = node\n\n const jsDocStr = JSDoc ? printJSDoc(JSDoc) : ''\n const body = printNodes(nodes)\n\n const parts: Array<string> = []\n if (canExport) parts.push('export ')\n parts.push('type ')\n parts.push(name)\n parts.push(' = ')\n parts.push(body)\n\n const declaration = parts.join('')\n return [jsDocStr, declaration].filter(Boolean).join('\\n')\n}\n\n/**\n * Converts a {@link FunctionNode} to a TypeScript `function` declaration string.\n *\n * Mirrors the `Function` component from `@kubb/renderer-jsx`.\n *\n * @example\n * ```ts\n * printFunction(createFunction({ name: 'getPet', export: true, params: 'id: string', returnType: 'Pet', nodes: ['return fetch(id)'] }))\n * // 'export function getPet(id: string): Pet {\\n return fetch(id)\\n}'\n * ```\n *\n * @example Async with generics\n * ```ts\n * printFunction(createFunction({ name: 'fetchPet', export: true, async: true, generics: ['T'], params: 'id: string', returnType: 'T' }))\n * // 'export async function fetchPet<T>(id: string): Promise<T> {\\n}'\n * ```\n */\nexport function printFunction(node: FunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes } = node\n\n const jsDocStr = JSDoc ? printJSDoc(JSDoc) : ''\n const body = printNodes(nodes)\n const indented = body ? indentLines(body) : ''\n\n const parts: Array<string> = []\n if (canExport) parts.push('export ')\n if (isDefault) parts.push('default ')\n if (isAsync) parts.push('async ')\n parts.push('function ')\n parts.push(name)\n parts.push(formatGenerics(generics))\n parts.push(`(${params ?? ''})`)\n parts.push(formatReturnType(returnType, isAsync))\n parts.push(' {')\n if (indented) {\n parts.push(`\\n${indented}\\n`)\n }\n parts.push('}')\n\n const declaration = parts.join('')\n return [jsDocStr, declaration].filter(Boolean).join('\\n')\n}\n\n/**\n * Converts an {@link ArrowFunctionNode} to a TypeScript arrow function declaration string.\n *\n * Mirrors the `Function.Arrow` component from `@kubb/renderer-jsx`.\n *\n * @example Multi-line arrow function\n * ```ts\n * printArrowFunction(createArrowFunction({ name: 'getPet', export: true, params: 'id: string', nodes: ['return fetch(id)'] }))\n * // 'export const getPet = (id: string) => {\\n return fetch(id)\\n}'\n * ```\n *\n * @example Single-line arrow function\n * ```ts\n * printArrowFunction(createArrowFunction({ name: 'double', params: 'n: number', singleLine: true, nodes: ['n * 2'] }))\n * // 'const double = (n: number) => n * 2'\n * ```\n */\nexport function printArrowFunction(node: ArrowFunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes, singleLine } = node\n\n const jsDocStr = JSDoc ? printJSDoc(JSDoc) : ''\n const body = printNodes(nodes)\n const arrowBody = singleLine ? ` => ${body}` : body ? ` => {\\n${indentLines(body)}\\n}` : ' => {}'\n\n const parts: Array<string> = []\n if (canExport) parts.push('export ')\n if (isDefault) parts.push('default ')\n parts.push('const ')\n parts.push(name)\n parts.push(' = ')\n if (isAsync) parts.push('async ')\n parts.push(formatGenerics(generics))\n parts.push(`(${params ?? ''})`)\n parts.push(formatReturnType(returnType, isAsync))\n parts.push(arrowBody)\n\n const declaration = parts.join('')\n return [jsDocStr, declaration].filter(Boolean).join('\\n')\n}\n\n/**\n * Converts a {@link CodeNode} to its TypeScript string representation.\n *\n * Dispatches to the appropriate printer based on the node's `kind`.\n *\n * @example\n * ```ts\n * printCodeNode(createConst({ name: 'x', nodes: ['1'] }))\n * // 'const x = 1'\n * ```\n */\nexport function printCodeNode(node: CodeNode): string {\n if (node.kind === 'Break') return ''\n if (node.kind === 'Text') return dedent((node as TextNode).value)\n if (node.kind === 'Jsx') return dedent((node as JsxNode).value)\n if (node.kind === 'Const') return printConst(node)\n if (node.kind === 'Type') return printType(node)\n if (node.kind === 'Function') return printFunction(node)\n if (node.kind === 'ArrowFunction') return printArrowFunction(node)\n return ''\n}\n\n/**\n * Converts a {@link SourceNode} to its TypeScript string representation.\n *\n * Iterates `nodes` in DOM order, rendering each {@link CodeNode} via\n * {@link printCodeNode}.\n *\n * Top-level declarations are separated by a blank line so the source reads\n * cleanly without an external formatter.\n *\n * @example From nodes\n * ```ts\n * printSource({ kind: 'Source', nodes: [createConst({ name: 'x', nodes: [createText('1')] }), createText('x.toString()')] })\n * // 'const x = 1\\n\\nx.toString()'\n * ```\n */\nexport function printSource(node: SourceNode): string {\n const nodes = node.nodes\n\n if (!nodes || nodes.length === 0) return ''\n\n return nodes\n .map((child) => printCodeNode(child as CodeNode))\n .filter(Boolean)\n .join('\\n\\n')\n}\n\nexport function createImport({\n name,\n path,\n root,\n isTypeOnly: isTypeOnlyRaw = false,\n isNameSpace: isNameSpaceRaw = false,\n}: {\n name: string | Array<string | { propertyName: string; name?: string }>\n path: string\n root?: string | null\n /** @default false */\n isTypeOnly?: boolean | null\n /** @default false */\n isNameSpace?: boolean | null\n}): ts.ImportDeclaration {\n const isTypeOnly = isTypeOnlyRaw ?? false\n const isNameSpace = isNameSpaceRaw ?? false\n const resolvePath = root ? getRelativePath(root, path) : path\n\n if (!Array.isArray(name)) {\n if (isNameSpace) {\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(isTypeOnly, undefined, factory.createNamespaceImport(factory.createIdentifier(name))),\n factory.createStringLiteral(resolvePath),\n undefined,\n )\n }\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(isTypeOnly, factory.createIdentifier(name), undefined),\n factory.createStringLiteral(resolvePath),\n undefined,\n )\n }\n\n const specifiers = name.map((item) => {\n if (typeof item === 'object') {\n const { propertyName, name: alias } = item\n return factory.createImportSpecifier(false, alias ? factory.createIdentifier(propertyName) : undefined, factory.createIdentifier(alias ?? propertyName))\n }\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(item))\n })\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(isTypeOnly, undefined, factory.createNamedImports(specifiers)),\n factory.createStringLiteral(resolvePath),\n undefined,\n )\n}\n\nexport function createExport({\n path,\n asAlias: asAliasRaw,\n isTypeOnly: isTypeOnlyRaw = false,\n name,\n}: {\n path: string\n /** @default false */\n asAlias?: boolean | null\n /** @default false */\n isTypeOnly?: boolean | null\n name?: string | Array<ts.Identifier | string> | null\n}): ts.ExportDeclaration {\n const asAlias = asAliasRaw ?? false\n const isTypeOnly = isTypeOnlyRaw ?? false\n if (name && !Array.isArray(name) && !asAlias) {\n console.warn(`When using name as string, asAlias should be true: ${name}`)\n }\n\n if (!Array.isArray(name)) {\n const parsedName = name && LEADING_DIGIT_PATTERN.test(name) ? `_${name.slice(1)}` : name\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n asAlias && parsedName ? factory.createNamespaceExport(factory.createIdentifier(parsedName)) : undefined,\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n factory.createNamedExports(\n name.map((propertyName) =>\n factory.createExportSpecifier(false, undefined, typeof propertyName === 'string' ? factory.createIdentifier(propertyName) : propertyName),\n ),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\n/**\n * Wraps a module specifier in single quotes, escaping any embedded backslash or quote so the emitted\n * statement stays valid even for unusual paths.\n */\nfunction quoteModulePath(path: string): string {\n return `'${path.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\n/**\n * Renders an import declaration string in the repo style (single quotes, no semicolons), mirroring\n * the shapes that {@link createImport} builds: default, namespace (`* as`), and named imports with\n * `{ a as b }` aliases, each optionally `type`-only. `path` is used verbatim, so resolve it first.\n *\n * @example\n * ```ts\n * printImport({ name: ['z'], path: './zod.ts' })\n * // \"import { z } from './zod.ts'\"\n * ```\n */\nexport function printImport({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: {\n name: string | Array<string | { propertyName: string; name?: string }>\n path: string\n isTypeOnly?: boolean | null\n isNameSpace?: boolean | null\n}): 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 declaration string in the repo style (single quotes, no semicolons), mirroring\n * the shapes that {@link createExport} builds: named re-exports, namespace alias (`* as name`), and\n * wildcard, each optionally `type`-only. `path` is used verbatim, so resolve it first.\n *\n * @example\n * ```ts\n * printExport({ name: ['Pet', 'Order'], path: './models.ts' })\n * // \"export { Pet, Order } from './models.ts'\"\n * ```\n */\nexport function printExport({\n path,\n name,\n isTypeOnly = false,\n asAlias = false,\n}: {\n path: string\n name?: string | Array<ts.Identifier | string> | null\n isTypeOnly?: boolean | null\n asAlias?: boolean | null\n}): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (Array.isArray(name)) {\n const specifiers = name.map((item) => (typeof item === 'string' ? item : item.text))\n return `export ${typePrefix}{ ${specifiers.join(', ')} } from ${from}`\n }\n\n if (asAlias && name) {\n const parsedName = LEADING_DIGIT_PATTERN.test(name) ? `_${name.slice(1)}` : name\n return `export ${typePrefix}* as ${parsedName} from ${from}`\n }\n\n if (name) {\n console.warn(`When using name as string, asAlias should be true: ${name}`)\n }\n\n return `export ${typePrefix}* from ${from}`\n}\n","import type { FileNode, SourceNode } from '@kubb/ast'\nimport { defineParser } from '@kubb/core'\nimport type * as ts from 'typescript'\nimport { getRelativePath, print, printExport, printImport, printSource, resolveOutputPath } from './utils.ts'\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 using the official\n * TypeScript compiler. Imports and exports are rewritten based on each file's\n * metadata.\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: { path: './petStore.yaml' },\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTs],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTs = defineParser({\n name: 'typescript',\n extNames: ['.ts', '.js'],\n print(...nodes: Array<ts.Node>) {\n return print(...nodes)\n },\n parse(file, options = { extname: '.ts' }) {\n const sourceParts: Array<string> = []\n for (const item of file.sources) {\n const sourceStr = printSource(item as SourceNode)\n if (sourceStr) {\n sourceParts.push(sourceStr.trimEnd())\n }\n }\n const source = sourceParts.join('\\n\\n')\n\n const importLines: Array<string> = []\n for (const item of (file as FileNode).imports) {\n const importPath = item.root ? getRelativePath(item.root, item.path) : item.path\n importLines.push(\n printImport({\n name: item.name as string | Array<string | { propertyName: string; name?: string }>,\n path: resolveOutputPath(importPath, options, Boolean(item.root)),\n isTypeOnly: item.isTypeOnly,\n isNameSpace: item.isNameSpace,\n }),\n )\n }\n\n const exportLines: Array<string> = []\n for (const item of (file as FileNode).exports) {\n exportLines.push(\n printExport({\n name: item.name as string | Array<ts.Identifier | string> | null | undefined,\n path: resolveOutputPath(item.path, options, true),\n isTypeOnly: item.isTypeOnly,\n asAlias: item.asAlias,\n }),\n )\n }\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 return parts.join('\\n\\n')\n },\n})\n","import { defineParser } from '@kubb/core'\nimport type * as ts from 'typescript'\nimport { parserTs } from './parserTs.ts'\nimport { print } from './utils.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`.\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: { path: './petStore.yaml' },\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTsx],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTsx = defineParser({\n name: 'tsx',\n extNames: ['.tsx', '.jsx'],\n print(...nodes: Array<ts.Node>) {\n return print(...nodes)\n },\n parse(file, options = { extname: '.tsx' }) {\n return parserTs.parse(file, options)\n },\n})\n"],"mappings":"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"}