@kubb/parser-ts 5.0.0-beta.22 → 5.0.0-beta.24

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 CHANGED
@@ -34,11 +34,23 @@ npm install @kubb/parser-ts
34
34
  ## Usage
35
35
 
36
36
  ```typescript
37
- import { print, createImport, createExport } from '@kubb/parser-ts'
37
+ import { defineConfig } from 'kubb'
38
+ import { parserTs, parserTsx } from '@kubb/parser-ts'
39
+
40
+ export default defineConfig({
41
+ input: { path: './petstore.yaml' },
42
+ output: { path: './src/gen' },
43
+ parsers: [parserTs, parserTsx],
44
+ })
45
+ ```
46
+
47
+ To render compiler AST nodes to source text from inside a plugin, call `print` on the parser instance:
48
+
49
+ ```typescript
50
+ import { parserTs } from '@kubb/parser-ts'
38
51
  import ts from 'typescript'
39
52
 
40
- // Print a TypeScript source file from compiler AST nodes
41
- const source = print([
53
+ const source = parserTs.print(
42
54
  ts.factory.createVariableStatement(
43
55
  [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
44
56
  ts.factory.createVariableDeclarationList(
@@ -46,45 +58,22 @@ const source = print([
46
58
  ts.NodeFlags.Const,
47
59
  ),
48
60
  ),
49
- ])
61
+ )
50
62
  // → export const hello = 'world'
51
-
52
- // Create an import declaration
53
- const importNode = createImport({ name: 'axios', path: 'axios' })
54
-
55
- // Create an export declaration
56
- const exportNode = createExport({ name: 'MyType', path: './types' })
57
63
  ```
58
64
 
59
65
  ## API
60
66
 
61
- ### `print(nodes, options?)`
62
-
63
- Converts an array of TypeScript compiler `Node` instances into a formatted source string. Returns the printed source code.
64
-
65
- ### `safePrint(nodes, options?)`
66
-
67
- Same as `print` but catches formatting errors and returns the unformatted output as a fallback.
68
-
69
67
  ### `parserTs`
70
68
 
71
- Parser instance for `.ts` files. Use with Kubb's file system to emit TypeScript source files.
72
-
73
- ### `parserTsx`
74
-
75
- Parser instance for `.tsx` files. Use with Kubb's file system to emit TSX source files.
69
+ Parser instance for `.ts` and `.js` files. Pass to `defineConfig({ parsers: [...] })` to emit TypeScript source files.
76
70
 
77
- ### `createImport(options)`
71
+ - `parserTs.parse(file, options?)` — serialise a `FileNode` to TypeScript source.
72
+ - `parserTs.print(...nodes)` — convert TypeScript compiler `Node` instances to a formatted source string.
78
73
 
79
- Factory helper that creates a TypeScript `ImportDeclaration` node.
80
-
81
- ### `createExport(options)`
82
-
83
- Factory helper that creates a TypeScript `ExportDeclaration` node.
84
-
85
- ### `validateNodes(nodes)`
74
+ ### `parserTsx`
86
75
 
87
- Validates an array of TypeScript AST nodes for correctness before printing.
76
+ Parser instance for `.tsx` and `.jsx` files. Same API as `parserTs` with JSX support.
88
77
 
89
78
  ## Supporting Kubb
90
79
 
package/dist/index.cjs CHANGED
@@ -125,17 +125,6 @@ function formatReturnType(returnType, isAsync) {
125
125
  return isAsync ? `: Promise<${returnType}>` : `: ${returnType}`;
126
126
  }
127
127
  /**
128
- * Validates TypeScript AST nodes before printing.
129
- * Throws an error if any node has SyntaxKind.Unknown which would cause the
130
- * TypeScript printer to crash.
131
- */
132
- function validateNodes(...nodes) {
133
- for (const node of nodes) {
134
- if (!node) throw new Error("Attempted to print undefined or null TypeScript node");
135
- if (node.kind === typescript.default.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)}`);
136
- }
137
- }
138
- /**
139
128
  * Module-scoped TypeScript printer instance. `ts.createPrinter()` is stateless across calls
140
129
  * (it does not mutate the source file) so a single instance can be safely reused for every
141
130
  * `print()` call. Hoisting it out of `print()` avoids re-running the printer initialization
@@ -162,13 +151,6 @@ function print(...elements) {
162
151
  return TS_PRINTER.printList(typescript.default.ListFormat.MultiLine, factory.createNodeArray(filtered), PRINT_SOURCE_FILE).replace(CRLF_PATTERN, "\n");
163
152
  }
164
153
  /**
165
- * Like `print` but validates nodes first to surface issues early.
166
- */
167
- function safePrint(...elements) {
168
- validateNodes(...elements);
169
- return print(...elements);
170
- }
171
- /**
172
154
  * Converts a {@link JSDocNode} to a JSDoc comment block string.
173
155
  *
174
156
  * @example
@@ -356,7 +338,9 @@ function printSource(node) {
356
338
  for (const child of nodes) parts.push(printCodeNode(child));
357
339
  return parts.join("\n");
358
340
  }
359
- function createImport({ name, path, root, isTypeOnly = false, isNameSpace = false }) {
341
+ function createImport({ name, path, root, isTypeOnly: isTypeOnlyRaw = false, isNameSpace: isNameSpaceRaw = false }) {
342
+ const isTypeOnly = isTypeOnlyRaw ?? false;
343
+ const isNameSpace = isNameSpaceRaw ?? false;
360
344
  const resolvePath = root ? getRelativePath(root, path) : path;
361
345
  if (!Array.isArray(name)) {
362
346
  if (isNameSpace) return factory.createImportDeclaration(void 0, factory.createImportClause(isTypeOnly, void 0, factory.createNamespaceImport(factory.createIdentifier(name))), factory.createStringLiteral(resolvePath), void 0);
@@ -371,7 +355,9 @@ function createImport({ name, path, root, isTypeOnly = false, isNameSpace = fals
371
355
  });
372
356
  return factory.createImportDeclaration(void 0, factory.createImportClause(isTypeOnly, void 0, factory.createNamedImports(specifiers)), factory.createStringLiteral(resolvePath), void 0);
373
357
  }
374
- function createExport({ path, asAlias, isTypeOnly = false, name }) {
358
+ function createExport({ path, asAlias: asAliasRaw, isTypeOnly: isTypeOnlyRaw = false, name }) {
359
+ const asAlias = asAliasRaw ?? false;
360
+ const isTypeOnly = isTypeOnlyRaw ?? false;
375
361
  if (name && !Array.isArray(name) && !asAlias) console.warn(`When using name as string, asAlias should be true: ${name}`);
376
362
  if (!Array.isArray(name)) {
377
363
  const parsedName = name && LEADING_DIGIT_PATTERN.test(name) ? `_${name.slice(1)}` : name;
@@ -382,14 +368,35 @@ function createExport({ path, asAlias, isTypeOnly = false, name }) {
382
368
  //#endregion
383
369
  //#region src/parserTs.ts
384
370
  /**
385
- * Parser that converts `.ts` and `.js` files to strings using the TypeScript
386
- * compiler. Handles import/export statement generation from file metadata.
371
+ * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST
372
+ * produced by an adapter and prints it as TypeScript source using the official
373
+ * TypeScript compiler. Imports and exports are rewritten based on each file's
374
+ * metadata.
375
+ *
376
+ * Used automatically when no `parsers` option is set on `defineConfig`. Use
377
+ * `parserTsx` instead for React projects that emit JSX.
387
378
  *
388
- * @default Used automatically when no `parsers` option is set in `defineConfig`.
379
+ * @example
380
+ * ```ts
381
+ * import { defineConfig } from 'kubb'
382
+ * import { adapterOas } from '@kubb/adapter-oas'
383
+ * import { parserTs } from '@kubb/parser-ts'
384
+ *
385
+ * export default defineConfig({
386
+ * input: { path: './petStore.yaml' },
387
+ * output: { path: './src/gen' },
388
+ * adapter: adapterOas(),
389
+ * parsers: [parserTs],
390
+ * plugins: [],
391
+ * })
392
+ * ```
389
393
  */
390
394
  const parserTs = (0, _kubb_core.defineParser)({
391
395
  name: "typescript",
392
396
  extNames: [".ts", ".js"],
397
+ print(...nodes) {
398
+ return print(...nodes);
399
+ },
393
400
  parse(file, options = { extname: ".ts" }) {
394
401
  const sourceParts = [];
395
402
  for (const item of file.sources) {
@@ -425,28 +432,39 @@ const parserTs = (0, _kubb_core.defineParser)({
425
432
  //#endregion
426
433
  //#region src/parserTsx.ts
427
434
  /**
428
- * Parser that converts `.tsx` and `.jsx` files to strings.
429
- * Delegates to `typescriptParser` since the TypeScript compiler natively
430
- * supports JSX/TSX syntax via `ScriptKind.TSX`.
435
+ * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs` because the
436
+ * TypeScript compiler handles JSX natively via `ScriptKind.TSX`.
431
437
  *
432
- * Add this parser to the `parsers` option in `defineConfig` when generating `.tsx`/`.jsx` files.
438
+ * Add to the `parsers` array on `defineConfig` when generating components for
439
+ * React (or any framework that emits JSX).
433
440
  *
434
- * @default extname '.tsx'
441
+ * @example
442
+ * ```ts
443
+ * import { defineConfig } from 'kubb'
444
+ * import { adapterOas } from '@kubb/adapter-oas'
445
+ * import { parserTsx } from '@kubb/parser-ts'
446
+ *
447
+ * export default defineConfig({
448
+ * input: { path: './petStore.yaml' },
449
+ * output: { path: './src/gen' },
450
+ * adapter: adapterOas(),
451
+ * parsers: [parserTsx],
452
+ * plugins: [],
453
+ * })
454
+ * ```
435
455
  */
436
456
  const parserTsx = (0, _kubb_core.defineParser)({
437
457
  name: "tsx",
438
458
  extNames: [".tsx", ".jsx"],
459
+ print(...nodes) {
460
+ return print(...nodes);
461
+ },
439
462
  parse(file, options = { extname: ".tsx" }) {
440
463
  return parserTs.parse(file, options);
441
464
  }
442
465
  });
443
466
  //#endregion
444
- exports.createExport = createExport;
445
- exports.createImport = createImport;
446
467
  exports.parserTs = parserTs;
447
468
  exports.parserTsx = parserTsx;
448
- exports.print = print;
449
- exports.safePrint = safePrint;
450
- exports.validateNodes = validateNodes;
451
469
 
452
470
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["ts"],"sources":["../src/constants.ts","../src/utils.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 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_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\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 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 */\nexport function printNodes(nodes: Array<CodeNode> | undefined): string {\n if (!nodes || nodes.length === 0) return ''\n\n const parts: string[] = []\n\n for (const node of nodes) {\n parts.push(printCodeNode(node))\n }\n\n return parts.join('\\n')\n}\n\n/**\n * Indents every non-empty line of `text` by `spaces` spaces.\n */\nexport function 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 */\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 | undefined, isAsync: boolean | undefined): string {\n if (!returnType) return ''\n return isAsync ? `: Promise<${returnType}>` : `: ${returnType}`\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 * 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 * 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\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: 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 if (node.kind === 'Break') return ''\n if (node.kind === 'Text') return (node as TextNode).value\n if (node.kind === 'Jsx') return (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 * @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 const nodes = node.nodes\n\n if (!nodes || nodes.length === 0) return ''\n const parts: string[] = []\n\n for (const child of nodes) {\n parts.push(printCodeNode(child as CodeNode))\n }\n\n return parts.join('\\n')\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","import type { FileNode, SourceNode } from '@kubb/ast'\nimport type { Parser } from '@kubb/core'\nimport { defineParser } from '@kubb/core'\nimport type * as ts from 'typescript'\nimport { createExport, createImport, getRelativePath, print, printSource, resolveOutputPath } from './utils.ts'\n\nexport { createExport, createImport, print, safePrint, validateNodes } from './utils.ts'\n\nexport { printArrowFunction, printCodeNode, printConst, printFunction, printJSDoc, printSource, printType } from './utils.ts'\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 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 parse(file, options = { extname: '.tsx' }) {\n return parserTs.parse(file, options)\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAa,yBAAyB;;;;AAKtC,MAAa,yBAAyB;;;;;AAMtC,MAAa,2BAA2B;;;;AAKxC,MAAa,0BAA0B;;;;AAKvC,MAAa,eAAe;;;;;AAM5B,MAAa,wBAAwB;;;ACrBrC,MAAM,EAAE,YAAYA,WAAAA;;;;AAKpB,SAAgB,MAAM,MAAsB;CAC1C,QAAA,GAAA,UAAA,WAAiB,KAAK,CAAC,WAAW,wBAAwB,IAAI,CAAC,QAAA,OAAiC,GAAG;;;;;;AAOrG,SAAgB,gBAAgB,SAAiB,UAA0B;CAEzE,MAAM,UAAU,OAAA,GAAA,UAAA,UADK,SAAS,SACL,CAAC;CAC1B,OAAO,QAAQ,WAAA,MAAmC,GAAG,UAAU,KAA8B;;;;;;AAO/F,SAAgB,YAAY,MAAsB;CAChD,OAAO,KAAK,QAAQ,wBAAwB,GAAG;;;;;;;AAQjD,SAAgB,kBAAkB,MAAc,SAA2C,WAA4B;CACrH,MAAM,aAAa,uBAAuB,KAAK,KAAK;CACpD,IAAI,SAAS,WAAW,YACtB,OAAO,GAAG,YAAY,KAAK,GAAG,QAAQ;CAExC,OAAO,YAAY,YAAY,KAAK,GAAG;;;;;;;;;AAUzC,SAAgB,WAAW,OAA4C;CACrE,IAAI,CAAC,SAAS,MAAM,WAAW,GAAG,OAAO;CAEzC,MAAM,QAAkB,EAAE;CAE1B,KAAK,MAAM,QAAQ,OACjB,MAAM,KAAK,cAAc,KAAK,CAAC;CAGjC,OAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAgB,YAAY,MAAc,SAAA,GAAsC;CAC9E,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,MAAM,IAAI,OAAO,OAAO;CAC9B,OAAO,KACJ,MAAM,KAAK,CACX,KAAK,SAAU,KAAK,MAAM,GAAG,GAAG,MAAM,SAAS,GAAI,CACnD,KAAK,KAAK;;;;;;AAOf,SAAgB,eAAe,UAA4E;CACzG,IAAI,CAAC,UAAU,OAAO;CACtB,OAAO,IAAI,MAAM,QAAQ,SAAS,GAAG,SAAS,KAAK,KAAK,GAAG,SAAS;;;;;;AAOtE,SAAgB,iBAAiB,YAAgC,SAAsC;CACrG,IAAI,CAAC,YAAY,OAAO;CACxB,OAAO,UAAU,aAAa,WAAW,KAAK,KAAK;;;;;;;AAQrD,SAAgB,cAAc,GAAG,OAAwB;CACvD,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,uDAAuD;EAEzE,IAAI,KAAK,SAASA,WAAAA,QAAG,WAAW,SAC9B,MAAM,IAAI,MACR,qKAEW,KAAK,UAAU,MAAM,MAAM,EAAE,GACzC;;;;;;;;;AAWP,MAAM,aAAaA,WAAAA,QAAG,cAAc;CAClC,uBAAuB;CACvB,SAASA,WAAAA,QAAG,YAAY;CACxB,gBAAgB;CAChB,eAAe;CAChB,CAAC;;;;;AAMF,MAAM,oBAAoBA,WAAAA,QAAG,iBAAiB,aAAa,IAAIA,WAAAA,QAAG,aAAa,QAAQ,MAAMA,WAAAA,QAAG,WAAW,IAAI;AAK/G,WAAW,UAAUA,WAAAA,QAAG,WAAW,WAAW,QAAQ,gBAAgB,EAAE,CAAC,EAAE,kBAAkB;;;;AAK7F,SAAgB,MAAM,GAAG,UAAkC;CACzD,MAAM,WAAW,SAAS,OAAO,QAAQ;CACzC,IAAI,SAAS,WAAW,GAAG,OAAO;CAIlC,OAFe,WAAW,UAAUA,WAAAA,QAAG,WAAW,WAAW,QAAQ,gBAAgB,SAAS,EAAE,kBAEnF,CAAC,QAAQ,cAAc,KAAK;;;;;AAM3C,SAAgB,UAAU,GAAG,UAAkC;CAC7D,cAAc,GAAG,SAAS;CAC1B,OAAO,MAAM,GAAG,SAAS;;;;;;;;;;;;;;AAe3B,SAAgB,WAAW,OAA0B;CACnD,MAAM,YAAY,MAAM,YAAY,EAAE,EAAE,QAAQ,MAAM,KAAK,KAAK;CAChE,IAAI,SAAS,WAAW,GAAG,OAAO;CAElC,MAAM,QAAQ,SACX,SAAS,MAAM,EAAE,MAAM,QAAQ,CAAC,CAChC,KAAK,MAAM,EAAE,QAAQ,0BAA0B,MAAM,CAAC,QAAQ,yBAAyB,GAAG,CAAC,CAC3F,QAAQ,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;CAErC,IAAI,MAAM,WAAW,GAAG,OAAO;CAE/B,OAAO;EAAC;EAAO,GAAG,MAAM,KAAK,MAAM,MAAM,IAAI;EAAE;EAAM,CAAC,KAAK,KAAK;;;;;;;;;;;;;;;;;;;AAoBlE,SAAgB,WAAW,MAAyB;CAClD,MAAM,EAAE,MAAM,QAAQ,WAAW,MAAM,OAAO,SAAS,UAAU;CAEjE,MAAM,WAAW,QAAQ,WAAW,MAAM,GAAG;CAC7C,MAAM,OAAO,WAAW,MAAM;CAE9B,MAAM,QAAkB,EAAE;CAC1B,IAAI,WAAW,MAAM,KAAK,UAAU;CACpC,MAAM,KAAK,SAAS;CACpB,MAAM,KAAK,KAAK;CAChB,IAAI,MACF,MAAM,KAAK,KAAK,OAAO;CAEzB,MAAM,KAAK,MAAM;CACjB,MAAM,KAAK,KAAK;CAChB,IAAI,SAAS,MAAM,KAAK,YAAY;CAGpC,OAAO,CAAC,UADY,MAAM,KAAK,GACF,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK;;;;;;;;;;;;;AAc3D,SAAgB,UAAU,MAAwB;CAChD,MAAM,EAAE,MAAM,QAAQ,WAAW,OAAO,UAAU;CAElD,MAAM,WAAW,QAAQ,WAAW,MAAM,GAAG;CAC7C,MAAM,OAAO,WAAW,MAAM;CAE9B,MAAM,QAAkB,EAAE;CAC1B,IAAI,WAAW,MAAM,KAAK,UAAU;CACpC,MAAM,KAAK,QAAQ;CACnB,MAAM,KAAK,KAAK;CAChB,MAAM,KAAK,MAAM;CACjB,MAAM,KAAK,KAAK;CAGhB,OAAO,CAAC,UADY,MAAM,KAAK,GACF,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK;;;;;;;;;;;;;;;;;;;AAoB3D,SAAgB,cAAc,MAA4B;CACxD,MAAM,EAAE,MAAM,SAAS,WAAW,QAAQ,WAAW,OAAO,SAAS,UAAU,QAAQ,YAAY,OAAO,UAAU;CAEpH,MAAM,WAAW,QAAQ,WAAW,MAAM,GAAG;CAC7C,MAAM,OAAO,WAAW,MAAM;CAC9B,MAAM,WAAW,OAAO,YAAY,KAAK,GAAG;CAE5C,MAAM,QAAkB,EAAE;CAC1B,IAAI,WAAW,MAAM,KAAK,UAAU;CACpC,IAAI,WAAW,MAAM,KAAK,WAAW;CACrC,IAAI,SAAS,MAAM,KAAK,SAAS;CACjC,MAAM,KAAK,YAAY;CACvB,MAAM,KAAK,KAAK;CAChB,MAAM,KAAK,eAAe,SAAS,CAAC;CACpC,MAAM,KAAK,IAAI,UAAU,GAAG,GAAG;CAC/B,MAAM,KAAK,iBAAiB,YAAY,QAAQ,CAAC;CACjD,MAAM,KAAK,KAAK;CAChB,IAAI,UACF,MAAM,KAAK,KAAK,SAAS,IAAI;CAE/B,MAAM,KAAK,IAAI;CAGf,OAAO,CAAC,UADY,MAAM,KAAK,GACF,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK;;;;;;;;;;;;;;;;;;;AAoB3D,SAAgB,mBAAmB,MAAiC;CAClE,MAAM,EAAE,MAAM,SAAS,WAAW,QAAQ,WAAW,OAAO,SAAS,UAAU,QAAQ,YAAY,OAAO,OAAO,eAAe;CAEhI,MAAM,WAAW,QAAQ,WAAW,MAAM,GAAG;CAC7C,MAAM,OAAO,WAAW,MAAM;CAC9B,MAAM,YAAY,aAAa,OAAO,SAAS,OAAO,UAAU,YAAY,KAAK,CAAC,OAAO;CAEzF,MAAM,QAAkB,EAAE;CAC1B,IAAI,WAAW,MAAM,KAAK,UAAU;CACpC,IAAI,WAAW,MAAM,KAAK,WAAW;CACrC,MAAM,KAAK,SAAS;CACpB,MAAM,KAAK,KAAK;CAChB,MAAM,KAAK,MAAM;CACjB,IAAI,SAAS,MAAM,KAAK,SAAS;CACjC,MAAM,KAAK,eAAe,SAAS,CAAC;CACpC,MAAM,KAAK,IAAI,UAAU,GAAG,GAAG;CAC/B,MAAM,KAAK,iBAAiB,YAAY,QAAQ,CAAC;CACjD,MAAM,KAAK,UAAU;CAGrB,OAAO,CAAC,UADY,MAAM,KAAK,GACF,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK;;;;;;;;;;;;;AAc3D,SAAgB,cAAc,MAAwB;CACpD,IAAI,KAAK,SAAS,SAAS,OAAO;CAClC,IAAI,KAAK,SAAS,QAAQ,OAAQ,KAAkB;CACpD,IAAI,KAAK,SAAS,OAAO,OAAQ,KAAiB;CAClD,IAAI,KAAK,SAAS,SAAS,OAAO,WAAW,KAAK;CAClD,IAAI,KAAK,SAAS,QAAQ,OAAO,UAAU,KAAK;CAChD,IAAI,KAAK,SAAS,YAAY,OAAO,cAAc,KAAK;CACxD,IAAI,KAAK,SAAS,iBAAiB,OAAO,mBAAmB,KAAK;CAClE,OAAO;;;;;;;;;;;;;;AAeT,SAAgB,YAAY,MAA0B;CACpD,MAAM,QAAQ,KAAK;CAEnB,IAAI,CAAC,SAAS,MAAM,WAAW,GAAG,OAAO;CACzC,MAAM,QAAkB,EAAE;CAE1B,KAAK,MAAM,SAAS,OAClB,MAAM,KAAK,cAAc,MAAkB,CAAC;CAG9C,OAAO,MAAM,KAAK,KAAK;;AAGzB,SAAgB,aAAa,EAC3B,MACA,MACA,MACA,aAAa,OACb,cAAc,SASS;CACvB,MAAM,cAAc,OAAO,gBAAgB,MAAM,KAAK,GAAG;CAEzD,IAAI,CAAC,MAAM,QAAQ,KAAK,EAAE;EACxB,IAAI,aACF,OAAO,QAAQ,wBACb,KAAA,GACA,QAAQ,mBAAmB,YAAY,KAAA,GAAW,QAAQ,sBAAsB,QAAQ,iBAAiB,KAAK,CAAC,CAAC,EAChH,QAAQ,oBAAoB,YAAY,EACxC,KAAA,EACD;EAGH,OAAO,QAAQ,wBACb,KAAA,GACA,QAAQ,mBAAmB,YAAY,QAAQ,iBAAiB,KAAK,EAAE,KAAA,EAAU,EACjF,QAAQ,oBAAoB,YAAY,EACxC,KAAA,EACD;;CAGH,MAAM,aAAa,KAAK,KAAK,SAAS;EACpC,IAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,EAAE,cAAc,MAAM,UAAU;GACtC,OAAO,QAAQ,sBAAsB,OAAO,QAAQ,QAAQ,iBAAiB,aAAa,GAAG,KAAA,GAAW,QAAQ,iBAAiB,SAAS,aAAa,CAAC;;EAE1J,OAAO,QAAQ,sBAAsB,OAAO,KAAA,GAAW,QAAQ,iBAAiB,KAAK,CAAC;GACtF;CAEF,OAAO,QAAQ,wBACb,KAAA,GACA,QAAQ,mBAAmB,YAAY,KAAA,GAAW,QAAQ,mBAAmB,WAAW,CAAC,EACzF,QAAQ,oBAAoB,YAAY,EACxC,KAAA,EACD;;AAGH,SAAgB,aAAa,EAC3B,MACA,SACA,aAAa,OACb,QAQuB;CACvB,IAAI,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAAI,CAAC,SACnC,QAAQ,KAAK,sDAAsD,OAAO;CAG5E,IAAI,CAAC,MAAM,QAAQ,KAAK,EAAE;EACxB,MAAM,aAAa,QAAQ,sBAAsB,KAAK,KAAK,GAAG,IAAI,KAAK,MAAM,EAAE,KAAK;EAEpF,OAAO,QAAQ,wBACb,KAAA,GACA,YACA,WAAW,aAAa,QAAQ,sBAAsB,QAAQ,iBAAiB,WAAW,CAAC,GAAG,KAAA,GAC9F,QAAQ,oBAAoB,KAAK,EACjC,KAAA,EACD;;CAGH,OAAO,QAAQ,wBACb,KAAA,GACA,YACA,QAAQ,mBACN,KAAK,KAAK,iBACR,QAAQ,sBAAsB,OAAO,KAAA,GAAW,OAAO,iBAAiB,WAAW,QAAQ,iBAAiB,aAAa,GAAG,aAAa,CAC1I,CACF,EACD,QAAQ,oBAAoB,KAAK,EACjC,KAAA,EACD;;;;;;;;;;AChdH,MAAa,YAAA,GAAA,WAAA,cAAgC;CAC3C,MAAM;CACN,UAAU,CAAC,OAAO,MAAM;CACxB,MAAM,MAAM,UAAU,EAAE,SAAS,OAAO,EAAE;EACxC,MAAM,cAA6B,EAAE;EACrC,KAAK,MAAM,QAAQ,KAAK,SAAS;GAC/B,MAAM,YAAY,YAAY,KAAmB;GACjD,IAAI,WACF,YAAY,KAAK,UAAU,SAAS,CAAC;;EAGzC,MAAM,SAAS,YAAY,KAAK,OAAO;EAEvC,MAAM,cAA2C,EAAE;EACnD,KAAK,MAAM,QAAS,KAAkB,SAAS;GAC7C,MAAM,aAAa,KAAK,OAAO,gBAAgB,KAAK,MAAM,KAAK,KAAK,GAAG,KAAK;GAC5E,YAAY,KACV,aAAa;IACX,MAAM,KAAK;IACX,MAAM,kBAAkB,YAAY,SAAS,QAAQ,KAAK,KAAK,CAAC;IAChE,YAAY,KAAK;IACjB,aAAa,KAAK;IACnB,CAAC,CACH;;EAGH,MAAM,cAA2C,EAAE;EACnD,KAAK,MAAM,QAAS,KAAkB,SACpC,YAAY,KACV,aAAa;GACX,MAAM,KAAK;GACX,MAAM,kBAAkB,KAAK,MAAM,SAAS,KAAK;GACjD,YAAY,KAAK;GACjB,SAAS,KAAK;GACf,CAAC,CACH;EAMH,OAHc;GAAC,KAAK;GAAQ,MAAM,GAAG,aAAa,GAAG,YAAY;GAAE;GAAQ,KAAK;GAAO,CACpF,QAAQ,YAA+B,QAAQ,QAAQ,CAAC,CACxD,KAAK,MAAM,EAAE,SAAS,CACb,CAAC,KAAK,OAAO;;CAE5B,CAAC;;;;;;;;;;;;AC9CF,MAAa,aAAA,GAAA,WAAA,cAAiC;CAC5C,MAAM;CACN,UAAU,CAAC,QAAQ,OAAO;CAC1B,MAAM,MAAM,UAAU,EAAE,SAAS,QAAQ,EAAE;EACzC,OAAO,SAAS,MAAM,MAAM,QAAQ;;CAEvC,CAAC"}
1
+ {"version":3,"file":"index.cjs","names":["ts"],"sources":["../src/constants.ts","../src/utils.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 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_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\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 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 */\nexport function printNodes(nodes: Array<CodeNode> | undefined): string {\n if (!nodes || nodes.length === 0) return ''\n\n const parts: string[] = []\n\n for (const node of nodes) {\n parts.push(printCodeNode(node))\n }\n\n return parts.join('\\n')\n}\n\n/**\n * Indents every non-empty line of `text` by `spaces` spaces.\n */\nexport function 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 */\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: 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 if (node.kind === 'Break') return ''\n if (node.kind === 'Text') return (node as TextNode).value\n if (node.kind === 'Jsx') return (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 * @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 const nodes = node.nodes\n\n if (!nodes || nodes.length === 0) return ''\n const parts: string[] = []\n\n for (const child of nodes) {\n parts.push(printCodeNode(child as CodeNode))\n }\n\n return parts.join('\\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","import type { FileNode, SourceNode } from '@kubb/ast'\nimport { defineParser } from '@kubb/core'\nimport type * as ts from 'typescript'\nimport { createExport, createImport, getRelativePath, print, 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: 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 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> | null | 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 { 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: 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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"}
package/dist/index.d.ts CHANGED
@@ -1,69 +1,73 @@
1
1
  import { t as __name } from "./chunk--u3MIqq1.js";
2
- import { Parser } from "@kubb/core";
3
- import ts from "typescript";
4
- //#region src/utils.d.ts
5
- /**
6
- * Validates TypeScript AST nodes before printing.
7
- * Throws an error if any node has SyntaxKind.Unknown which would cause the
8
- * TypeScript printer to crash.
9
- */
10
- declare function validateNodes(...nodes: ts.Node[]): void;
11
- /**
12
- * Converts TypeScript/TSX AST nodes to a string using the TypeScript printer.
13
- */
14
- declare function print(...elements: Array<ts.Node>): string;
15
- /**
16
- * Like `print` but validates nodes first to surface issues early.
17
- */
18
- declare function safePrint(...elements: Array<ts.Node>): string;
19
- declare function createImport({
20
- name,
21
- path,
22
- root,
23
- isTypeOnly,
24
- isNameSpace
25
- }: {
26
- name: string | Array<string | {
27
- propertyName: string;
28
- name?: string;
29
- }>;
30
- path: string;
31
- root?: string; /** @default false */
32
- isTypeOnly?: boolean; /** @default false */
33
- isNameSpace?: boolean;
34
- }): ts.ImportDeclaration;
35
- declare function createExport({
36
- path,
37
- asAlias,
38
- isTypeOnly,
39
- name
40
- }: {
41
- path: string; /** @default false */
42
- asAlias?: boolean; /** @default false */
43
- isTypeOnly?: boolean;
44
- name?: string | Array<ts.Identifier | string>;
45
- }): ts.ExportDeclaration;
46
- //#endregion
2
+ import * as ts$1 from "typescript";
3
+ import * as _$_kubb_ast0 from "@kubb/ast";
4
+ import { FileNode } from "@kubb/ast";
5
+
47
6
  //#region src/parserTs.d.ts
48
7
  /**
49
- * Parser that converts `.ts` and `.js` files to strings using the TypeScript
50
- * compiler. Handles import/export statement generation from file metadata.
8
+ * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST
9
+ * produced by an adapter and prints it as TypeScript source using the official
10
+ * TypeScript compiler. Imports and exports are rewritten based on each file's
11
+ * metadata.
12
+ *
13
+ * Used automatically when no `parsers` option is set on `defineConfig`. Use
14
+ * `parserTsx` instead for React projects that emit JSX.
51
15
  *
52
- * @default Used automatically when no `parsers` option is set in `defineConfig`.
16
+ * @example
17
+ * ```ts
18
+ * import { defineConfig } from 'kubb'
19
+ * import { adapterOas } from '@kubb/adapter-oas'
20
+ * import { parserTs } from '@kubb/parser-ts'
21
+ *
22
+ * export default defineConfig({
23
+ * input: { path: './petStore.yaml' },
24
+ * output: { path: './src/gen' },
25
+ * adapter: adapterOas(),
26
+ * parsers: [parserTs],
27
+ * plugins: [],
28
+ * })
29
+ * ```
53
30
  */
54
- declare const parserTs: Parser;
31
+ declare const parserTs: {
32
+ name: string;
33
+ extNames: (".ts" | ".js")[];
34
+ print(...nodes: ts$1.Node[]): string;
35
+ parse(file: FileNode<any>, options?: {
36
+ extname?: FileNode["extname"];
37
+ } | undefined): string;
38
+ };
55
39
  //#endregion
56
40
  //#region src/parserTsx.d.ts
57
41
  /**
58
- * Parser that converts `.tsx` and `.jsx` files to strings.
59
- * Delegates to `typescriptParser` since the TypeScript compiler natively
60
- * supports JSX/TSX syntax via `ScriptKind.TSX`.
42
+ * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs` because the
43
+ * TypeScript compiler handles JSX natively via `ScriptKind.TSX`.
44
+ *
45
+ * Add to the `parsers` array on `defineConfig` when generating components for
46
+ * React (or any framework that emits JSX).
61
47
  *
62
- * Add this parser to the `parsers` option in `defineConfig` when generating `.tsx`/`.jsx` files.
48
+ * @example
49
+ * ```ts
50
+ * import { defineConfig } from 'kubb'
51
+ * import { adapterOas } from '@kubb/adapter-oas'
52
+ * import { parserTsx } from '@kubb/parser-ts'
63
53
  *
64
- * @default extname '.tsx'
54
+ * export default defineConfig({
55
+ * input: { path: './petStore.yaml' },
56
+ * output: { path: './src/gen' },
57
+ * adapter: adapterOas(),
58
+ * parsers: [parserTsx],
59
+ * plugins: [],
60
+ * })
61
+ * ```
65
62
  */
66
- declare const parserTsx: Parser;
63
+ declare const parserTsx: {
64
+ name: string;
65
+ extNames: (".tsx" | ".jsx")[];
66
+ print(...nodes: ts$1.Node[]): string;
67
+ parse(file: _$_kubb_ast0.FileNode<any>, options?: {
68
+ extname?: _$_kubb_ast0.FileNode["extname"];
69
+ } | undefined): string;
70
+ };
67
71
  //#endregion
68
- export { createExport, createImport, parserTs, parserTsx, print, safePrint, validateNodes };
72
+ export { parserTs, parserTsx };
69
73
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -102,17 +102,6 @@ function formatReturnType(returnType, isAsync) {
102
102
  return isAsync ? `: Promise<${returnType}>` : `: ${returnType}`;
103
103
  }
104
104
  /**
105
- * Validates TypeScript AST nodes before printing.
106
- * Throws an error if any node has SyntaxKind.Unknown which would cause the
107
- * TypeScript printer to crash.
108
- */
109
- function validateNodes(...nodes) {
110
- for (const node of nodes) {
111
- if (!node) throw new Error("Attempted to print undefined or null TypeScript node");
112
- 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)}`);
113
- }
114
- }
115
- /**
116
105
  * Module-scoped TypeScript printer instance. `ts.createPrinter()` is stateless across calls
117
106
  * (it does not mutate the source file) so a single instance can be safely reused for every
118
107
  * `print()` call. Hoisting it out of `print()` avoids re-running the printer initialization
@@ -139,13 +128,6 @@ function print(...elements) {
139
128
  return TS_PRINTER.printList(ts.ListFormat.MultiLine, factory.createNodeArray(filtered), PRINT_SOURCE_FILE).replace(CRLF_PATTERN, "\n");
140
129
  }
141
130
  /**
142
- * Like `print` but validates nodes first to surface issues early.
143
- */
144
- function safePrint(...elements) {
145
- validateNodes(...elements);
146
- return print(...elements);
147
- }
148
- /**
149
131
  * Converts a {@link JSDocNode} to a JSDoc comment block string.
150
132
  *
151
133
  * @example
@@ -333,7 +315,9 @@ function printSource(node) {
333
315
  for (const child of nodes) parts.push(printCodeNode(child));
334
316
  return parts.join("\n");
335
317
  }
336
- function createImport({ name, path, root, isTypeOnly = false, isNameSpace = false }) {
318
+ function createImport({ name, path, root, isTypeOnly: isTypeOnlyRaw = false, isNameSpace: isNameSpaceRaw = false }) {
319
+ const isTypeOnly = isTypeOnlyRaw ?? false;
320
+ const isNameSpace = isNameSpaceRaw ?? false;
337
321
  const resolvePath = root ? getRelativePath(root, path) : path;
338
322
  if (!Array.isArray(name)) {
339
323
  if (isNameSpace) return factory.createImportDeclaration(void 0, factory.createImportClause(isTypeOnly, void 0, factory.createNamespaceImport(factory.createIdentifier(name))), factory.createStringLiteral(resolvePath), void 0);
@@ -348,7 +332,9 @@ function createImport({ name, path, root, isTypeOnly = false, isNameSpace = fals
348
332
  });
349
333
  return factory.createImportDeclaration(void 0, factory.createImportClause(isTypeOnly, void 0, factory.createNamedImports(specifiers)), factory.createStringLiteral(resolvePath), void 0);
350
334
  }
351
- function createExport({ path, asAlias, isTypeOnly = false, name }) {
335
+ function createExport({ path, asAlias: asAliasRaw, isTypeOnly: isTypeOnlyRaw = false, name }) {
336
+ const asAlias = asAliasRaw ?? false;
337
+ const isTypeOnly = isTypeOnlyRaw ?? false;
352
338
  if (name && !Array.isArray(name) && !asAlias) console.warn(`When using name as string, asAlias should be true: ${name}`);
353
339
  if (!Array.isArray(name)) {
354
340
  const parsedName = name && LEADING_DIGIT_PATTERN.test(name) ? `_${name.slice(1)}` : name;
@@ -359,14 +345,35 @@ function createExport({ path, asAlias, isTypeOnly = false, name }) {
359
345
  //#endregion
360
346
  //#region src/parserTs.ts
361
347
  /**
362
- * Parser that converts `.ts` and `.js` files to strings using the TypeScript
363
- * compiler. Handles import/export statement generation from file metadata.
348
+ * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST
349
+ * produced by an adapter and prints it as TypeScript source using the official
350
+ * TypeScript compiler. Imports and exports are rewritten based on each file's
351
+ * metadata.
352
+ *
353
+ * Used automatically when no `parsers` option is set on `defineConfig`. Use
354
+ * `parserTsx` instead for React projects that emit JSX.
364
355
  *
365
- * @default Used automatically when no `parsers` option is set in `defineConfig`.
356
+ * @example
357
+ * ```ts
358
+ * import { defineConfig } from 'kubb'
359
+ * import { adapterOas } from '@kubb/adapter-oas'
360
+ * import { parserTs } from '@kubb/parser-ts'
361
+ *
362
+ * export default defineConfig({
363
+ * input: { path: './petStore.yaml' },
364
+ * output: { path: './src/gen' },
365
+ * adapter: adapterOas(),
366
+ * parsers: [parserTs],
367
+ * plugins: [],
368
+ * })
369
+ * ```
366
370
  */
367
371
  const parserTs = defineParser({
368
372
  name: "typescript",
369
373
  extNames: [".ts", ".js"],
374
+ print(...nodes) {
375
+ return print(...nodes);
376
+ },
370
377
  parse(file, options = { extname: ".ts" }) {
371
378
  const sourceParts = [];
372
379
  for (const item of file.sources) {
@@ -402,22 +409,38 @@ const parserTs = defineParser({
402
409
  //#endregion
403
410
  //#region src/parserTsx.ts
404
411
  /**
405
- * Parser that converts `.tsx` and `.jsx` files to strings.
406
- * Delegates to `typescriptParser` since the TypeScript compiler natively
407
- * supports JSX/TSX syntax via `ScriptKind.TSX`.
412
+ * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs` because the
413
+ * TypeScript compiler handles JSX natively via `ScriptKind.TSX`.
408
414
  *
409
- * Add this parser to the `parsers` option in `defineConfig` when generating `.tsx`/`.jsx` files.
415
+ * Add to the `parsers` array on `defineConfig` when generating components for
416
+ * React (or any framework that emits JSX).
410
417
  *
411
- * @default extname '.tsx'
418
+ * @example
419
+ * ```ts
420
+ * import { defineConfig } from 'kubb'
421
+ * import { adapterOas } from '@kubb/adapter-oas'
422
+ * import { parserTsx } from '@kubb/parser-ts'
423
+ *
424
+ * export default defineConfig({
425
+ * input: { path: './petStore.yaml' },
426
+ * output: { path: './src/gen' },
427
+ * adapter: adapterOas(),
428
+ * parsers: [parserTsx],
429
+ * plugins: [],
430
+ * })
431
+ * ```
412
432
  */
413
433
  const parserTsx = defineParser({
414
434
  name: "tsx",
415
435
  extNames: [".tsx", ".jsx"],
436
+ print(...nodes) {
437
+ return print(...nodes);
438
+ },
416
439
  parse(file, options = { extname: ".tsx" }) {
417
440
  return parserTs.parse(file, options);
418
441
  }
419
442
  });
420
443
  //#endregion
421
- export { createExport, createImport, parserTs, parserTsx, print, safePrint, validateNodes };
444
+ export { parserTs, parserTsx };
422
445
 
423
446
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/constants.ts","../src/utils.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 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_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\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 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 */\nexport function printNodes(nodes: Array<CodeNode> | undefined): string {\n if (!nodes || nodes.length === 0) return ''\n\n const parts: string[] = []\n\n for (const node of nodes) {\n parts.push(printCodeNode(node))\n }\n\n return parts.join('\\n')\n}\n\n/**\n * Indents every non-empty line of `text` by `spaces` spaces.\n */\nexport function 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 */\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 | undefined, isAsync: boolean | undefined): string {\n if (!returnType) return ''\n return isAsync ? `: Promise<${returnType}>` : `: ${returnType}`\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 * 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 * 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\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: 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 if (node.kind === 'Break') return ''\n if (node.kind === 'Text') return (node as TextNode).value\n if (node.kind === 'Jsx') return (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 * @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 const nodes = node.nodes\n\n if (!nodes || nodes.length === 0) return ''\n const parts: string[] = []\n\n for (const child of nodes) {\n parts.push(printCodeNode(child as CodeNode))\n }\n\n return parts.join('\\n')\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","import type { FileNode, SourceNode } from '@kubb/ast'\nimport type { Parser } from '@kubb/core'\nimport { defineParser } from '@kubb/core'\nimport type * as ts from 'typescript'\nimport { createExport, createImport, getRelativePath, print, printSource, resolveOutputPath } from './utils.ts'\n\nexport { createExport, createImport, print, safePrint, validateNodes } from './utils.ts'\n\nexport { printArrowFunction, printCodeNode, printConst, printFunction, printJSDoc, printSource, printType } from './utils.ts'\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 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 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 * 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 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_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\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 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 */\nexport function printNodes(nodes: Array<CodeNode> | undefined): string {\n if (!nodes || nodes.length === 0) return ''\n\n const parts: string[] = []\n\n for (const node of nodes) {\n parts.push(printCodeNode(node))\n }\n\n return parts.join('\\n')\n}\n\n/**\n * Indents every non-empty line of `text` by `spaces` spaces.\n */\nexport function 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 */\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: 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 if (node.kind === 'Break') return ''\n if (node.kind === 'Text') return (node as TextNode).value\n if (node.kind === 'Jsx') return (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 * @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 const nodes = node.nodes\n\n if (!nodes || nodes.length === 0) return ''\n const parts: string[] = []\n\n for (const child of nodes) {\n parts.push(printCodeNode(child as CodeNode))\n }\n\n return parts.join('\\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","import type { FileNode, SourceNode } from '@kubb/ast'\nimport { defineParser } from '@kubb/core'\nimport type * as ts from 'typescript'\nimport { createExport, createImport, getRelativePath, print, 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: 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 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> | null | 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 { 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: 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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"}
package/extension.yaml CHANGED
@@ -2,7 +2,7 @@ $schema: https://kubb.dev/schemas/extension.json
2
2
  kind: parser
3
3
  id: parser-ts
4
4
  name: TypeScript
5
- description: TypeScript and TSX file parser for Kubb. Converts the universal AST to `.ts`/`.tsx` source code using the official TypeScript compiler.
5
+ description: Default file parser for Kubb. Converts the universal AST to `.ts`/`.tsx` source using the official TypeScript compiler.
6
6
  category: typescript
7
7
  type: official
8
8
  npmPackage: '@kubb/parser-ts'
@@ -29,23 +29,23 @@ featured: true
29
29
  icon:
30
30
  light: https://kubb.dev/feature/typescript.svg
31
31
  intro: |-
32
- The TypeScript parser is the default file parser used by Kubb when no `parsers` option is set in `defineConfig`. It converts Kubb's universal AST into `.ts` and `.tsx` source code using the official [TypeScript compiler](https://www.typescriptlang.org/).
32
+ `@kubb/parser-ts` is the default file parser used by Kubb when no `parsers` option is provided in `defineConfig`. It takes the universal AST produced by your adapter and prints `.ts`/`.tsx` source code using the official [TypeScript compiler](https://www.typescriptlang.org/).
33
33
 
34
34
  Two parser instances are exported:
35
35
 
36
- - `parserTs` — handles `.ts` and `.js` files
37
- - `parserTsx` — handles `.tsx` and `.jsx` files
36
+ - `parserTs` — handles `.ts` and `.js` files.
37
+ - `parserTsx` — handles `.tsx` and `.jsx` files. Use this for React projects so JSX in generated components is preserved.
38
38
 
39
- Both are configured globally in `defineConfig` and apply to every file produced by every plugin.
39
+ Configure once on `defineConfig`. The choice applies to every file every plugin produces.
40
40
  options:
41
41
  - name: extname
42
42
  type: "'.ts' | '.js' | '.tsx' | '.jsx' | string"
43
43
  required: false
44
44
  default: "'.ts'"
45
45
  description: |-
46
- File extension used when rewriting relative import paths. Set to `.js` for ESM-friendly emit, `.tsx` for React projects, or leave unset to keep TypeScript's default behaviour.
46
+ File extension the parser writes when emitting code. Pick `.js` for an ESM-friendly emit you can publish to npm, `.tsx` for React projects, or leave unset for the standard TypeScript default.
47
47
 
48
- Extension rewriting is configured via `output.extension` in `defineConfig`, not as a parser argument.
48
+ For rewriting relative import specifiers (`./foo` → `./foo.js`), set `output.extension` on `defineConfig` not on the parser itself.
49
49
  codeBlock:
50
50
  lang: typescript
51
51
  title: kubb.config.ts
@@ -56,10 +56,11 @@ options:
56
56
  import { parserTs } from '@kubb/parser-ts'
57
57
 
58
58
  export default defineConfig({
59
- input: { path: './petstore.yaml' },
59
+ input: { path: './petStore.yaml' },
60
60
  output: { path: './src/gen', extension: { '.ts': '.js' } },
61
61
  adapter: adapterOas(),
62
62
  parsers: [parserTs],
63
+ plugins: [],
63
64
  })
64
65
  examples:
65
66
  - name: TypeScript (default)
@@ -73,10 +74,11 @@ examples:
73
74
  import { parserTs } from '@kubb/parser-ts'
74
75
 
75
76
  export default defineConfig({
76
- input: { path: './petstore.yaml' },
77
+ input: { path: './petStore.yaml' },
77
78
  output: { path: './src/gen' },
78
79
  adapter: adapterOas(),
79
80
  parsers: [parserTs],
81
+ plugins: [],
80
82
  })
81
83
  - name: TSX (React)
82
84
  files:
@@ -89,12 +91,13 @@ examples:
89
91
  import { parserTsx } from '@kubb/parser-ts'
90
92
 
91
93
  export default defineConfig({
92
- input: { path: './petstore.yaml' },
94
+ input: { path: './petStore.yaml' },
93
95
  output: { path: './src/gen' },
94
96
  adapter: adapterOas(),
95
97
  parsers: [parserTsx],
98
+ plugins: [],
96
99
  })
97
100
  notes:
98
101
  - type: tip
99
102
  body: |-
100
- `parser-ts` is bundled with Kubb and used automatically when no `parsers` option is provided. You only need to install it explicitly when combining it with other parsers or providing a fully custom parsers list.
103
+ `parser-ts` is bundled with Kubb and used automatically when no `parsers` option is set. Install it explicitly only when you need to combine it with other parsers or provide a fully custom parser list.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/parser-ts",
3
- "version": "5.0.0-beta.22",
3
+ "version": "5.0.0-beta.24",
4
4
  "description": "TypeScript and TSX source file parser for Kubb. Converts AST nodes and raw TypeScript code into formatted source strings using the TypeScript compiler API.",
5
5
  "keywords": [
6
6
  "codegen",
@@ -42,11 +42,11 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "typescript": "^6.0.3",
45
- "@kubb/core": "5.0.0-beta.22"
45
+ "@kubb/core": "5.0.0-beta.24"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@internals/utils": "0.0.0",
49
- "@kubb/ast": "5.0.0-beta.22"
49
+ "@kubb/ast": "5.0.0-beta.24"
50
50
  },
51
51
  "engines": {
52
52
  "node": ">=22"
package/src/index.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { createExport, createImport, parserTs, print, safePrint, validateNodes } from './parserTs.ts'
1
+ export { parserTs } from './parserTs.ts'
2
2
  export { parserTsx } from './parserTsx.ts'
package/src/parserTs.ts CHANGED
@@ -1,22 +1,38 @@
1
1
  import type { FileNode, SourceNode } from '@kubb/ast'
2
- import type { Parser } from '@kubb/core'
3
2
  import { defineParser } from '@kubb/core'
4
3
  import type * as ts from 'typescript'
5
4
  import { createExport, createImport, getRelativePath, print, printSource, resolveOutputPath } from './utils.ts'
6
5
 
7
- export { createExport, createImport, print, safePrint, validateNodes } from './utils.ts'
8
-
9
- export { printArrowFunction, printCodeNode, printConst, printFunction, printJSDoc, printSource, printType } from './utils.ts'
10
-
11
6
  /**
12
- * Parser that converts `.ts` and `.js` files to strings using the TypeScript
13
- * compiler. Handles import/export statement generation from file metadata.
7
+ * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST
8
+ * produced by an adapter and prints it as TypeScript source using the official
9
+ * TypeScript compiler. Imports and exports are rewritten based on each file's
10
+ * metadata.
11
+ *
12
+ * Used automatically when no `parsers` option is set on `defineConfig`. Use
13
+ * `parserTsx` instead for React projects that emit JSX.
14
14
  *
15
- * @default Used automatically when no `parsers` option is set in `defineConfig`.
15
+ * @example
16
+ * ```ts
17
+ * import { defineConfig } from 'kubb'
18
+ * import { adapterOas } from '@kubb/adapter-oas'
19
+ * import { parserTs } from '@kubb/parser-ts'
20
+ *
21
+ * export default defineConfig({
22
+ * input: { path: './petStore.yaml' },
23
+ * output: { path: './src/gen' },
24
+ * adapter: adapterOas(),
25
+ * parsers: [parserTs],
26
+ * plugins: [],
27
+ * })
28
+ * ```
16
29
  */
17
- export const parserTs: Parser = defineParser({
30
+ export const parserTs = defineParser({
18
31
  name: 'typescript',
19
32
  extNames: ['.ts', '.js'],
33
+ print(...nodes: ts.Node[]) {
34
+ return print(...nodes)
35
+ },
20
36
  parse(file, options = { extname: '.ts' }) {
21
37
  const sourceParts: Array<string> = []
22
38
  for (const item of file.sources) {
@@ -44,7 +60,7 @@ export const parserTs: Parser = defineParser({
44
60
  for (const item of (file as FileNode).exports) {
45
61
  exportNodes.push(
46
62
  createExport({
47
- name: item.name as string | Array<ts.Identifier | string> | undefined,
63
+ name: item.name as string | Array<ts.Identifier | string> | null | undefined,
48
64
  path: resolveOutputPath(item.path, options, true),
49
65
  isTypeOnly: item.isTypeOnly,
50
66
  asAlias: item.asAlias,
package/src/parserTsx.ts CHANGED
@@ -1,19 +1,36 @@
1
- import type { Parser } from '@kubb/core'
2
1
  import { defineParser } from '@kubb/core'
2
+ import type * as ts from 'typescript'
3
3
  import { parserTs } from './parserTs.ts'
4
+ import { print } from './utils.ts'
4
5
 
5
6
  /**
6
- * Parser that converts `.tsx` and `.jsx` files to strings.
7
- * Delegates to `typescriptParser` since the TypeScript compiler natively
8
- * supports JSX/TSX syntax via `ScriptKind.TSX`.
7
+ * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs` because the
8
+ * TypeScript compiler handles JSX natively via `ScriptKind.TSX`.
9
9
  *
10
- * Add this parser to the `parsers` option in `defineConfig` when generating `.tsx`/`.jsx` files.
10
+ * Add to the `parsers` array on `defineConfig` when generating components for
11
+ * React (or any framework that emits JSX).
11
12
  *
12
- * @default extname '.tsx'
13
+ * @example
14
+ * ```ts
15
+ * import { defineConfig } from 'kubb'
16
+ * import { adapterOas } from '@kubb/adapter-oas'
17
+ * import { parserTsx } from '@kubb/parser-ts'
18
+ *
19
+ * export default defineConfig({
20
+ * input: { path: './petStore.yaml' },
21
+ * output: { path: './src/gen' },
22
+ * adapter: adapterOas(),
23
+ * parsers: [parserTsx],
24
+ * plugins: [],
25
+ * })
26
+ * ```
13
27
  */
14
- export const parserTsx: Parser = defineParser({
28
+ export const parserTsx = defineParser({
15
29
  name: 'tsx',
16
30
  extNames: ['.tsx', '.jsx'],
31
+ print(...nodes: ts.Node[]) {
32
+ return print(...nodes)
33
+ },
17
34
  parse(file, options = { extname: '.tsx' }) {
18
35
  return parserTs.parse(file, options)
19
36
  },
package/src/utils.ts CHANGED
@@ -97,31 +97,11 @@ export function formatGenerics(generics: FunctionNode['generics'] | ArrowFunctio
97
97
  * Renders the return-type suffix (`: T` or `: Promise<T>` when `isAsync` is true).
98
98
  * Returns an empty string when no return type is provided.
99
99
  */
100
- export function formatReturnType(returnType: string | undefined, isAsync: boolean | undefined): string {
100
+ export function formatReturnType(returnType: string | null | undefined, isAsync: boolean | null | undefined): string {
101
101
  if (!returnType) return ''
102
102
  return isAsync ? `: Promise<${returnType}>` : `: ${returnType}`
103
103
  }
104
104
 
105
- /**
106
- * Validates TypeScript AST nodes before printing.
107
- * Throws an error if any node has SyntaxKind.Unknown which would cause the
108
- * TypeScript printer to crash.
109
- */
110
- export function validateNodes(...nodes: ts.Node[]): void {
111
- for (const node of nodes) {
112
- if (!node) {
113
- throw new Error('Attempted to print undefined or null TypeScript node')
114
- }
115
- if (node.kind === ts.SyntaxKind.Unknown) {
116
- throw new Error(
117
- 'Invalid TypeScript AST node detected with SyntaxKind.Unknown. ' +
118
- 'This typically indicates a schema pattern that could not be properly converted to TypeScript. ' +
119
- `Node: ${JSON.stringify(node, null, 2)}`,
120
- )
121
- }
122
- }
123
- }
124
-
125
105
  /**
126
106
  * Module-scoped TypeScript printer instance. `ts.createPrinter()` is stateless across calls
127
107
  * (it does not mutate the source file) so a single instance can be safely reused for every
@@ -158,14 +138,6 @@ export function print(...elements: Array<ts.Node>): string {
158
138
  return output.replace(CRLF_PATTERN, '\n')
159
139
  }
160
140
 
161
- /**
162
- * Like `print` but validates nodes first to surface issues early.
163
- */
164
- export function safePrint(...elements: Array<ts.Node>): string {
165
- validateNodes(...elements)
166
- return print(...elements)
167
- }
168
-
169
141
  /**
170
142
  * Converts a {@link JSDocNode} to a JSDoc comment block string.
171
143
  *
@@ -392,17 +364,19 @@ export function createImport({
392
364
  name,
393
365
  path,
394
366
  root,
395
- isTypeOnly = false,
396
- isNameSpace = false,
367
+ isTypeOnly: isTypeOnlyRaw = false,
368
+ isNameSpace: isNameSpaceRaw = false,
397
369
  }: {
398
370
  name: string | Array<string | { propertyName: string; name?: string }>
399
371
  path: string
400
- root?: string
372
+ root?: string | null
401
373
  /** @default false */
402
- isTypeOnly?: boolean
374
+ isTypeOnly?: boolean | null
403
375
  /** @default false */
404
- isNameSpace?: boolean
376
+ isNameSpace?: boolean | null
405
377
  }): ts.ImportDeclaration {
378
+ const isTypeOnly = isTypeOnlyRaw ?? false
379
+ const isNameSpace = isNameSpaceRaw ?? false
406
380
  const resolvePath = root ? getRelativePath(root, path) : path
407
381
 
408
382
  if (!Array.isArray(name)) {
@@ -441,17 +415,19 @@ export function createImport({
441
415
 
442
416
  export function createExport({
443
417
  path,
444
- asAlias,
445
- isTypeOnly = false,
418
+ asAlias: asAliasRaw,
419
+ isTypeOnly: isTypeOnlyRaw = false,
446
420
  name,
447
421
  }: {
448
422
  path: string
449
423
  /** @default false */
450
- asAlias?: boolean
424
+ asAlias?: boolean | null
451
425
  /** @default false */
452
- isTypeOnly?: boolean
453
- name?: string | Array<ts.Identifier | string>
426
+ isTypeOnly?: boolean | null
427
+ name?: string | Array<ts.Identifier | string> | null
454
428
  }): ts.ExportDeclaration {
429
+ const asAlias = asAliasRaw ?? false
430
+ const isTypeOnly = isTypeOnlyRaw ?? false
455
431
  if (name && !Array.isArray(name) && !asAlias) {
456
432
  console.warn(`When using name as string, asAlias should be true: ${name}`)
457
433
  }