@kubb/parser-ts 5.13.0 → 5.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2,10 +2,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#endregion
3
3
  let _kubb_ast = require("@kubb/ast");
4
4
  let _kubb_core = require("@kubb/core");
5
+ let yuku_parser = require("yuku-parser");
5
6
  let node_module = require("node:module");
6
7
  let node_path = require("node:path");
7
8
  let node_url = require("node:url");
8
- let yuku_parser = require("yuku-parser");
9
9
  //#region kubb-extension.json
10
10
  var compatibility = {
11
11
  "kubb": ">=5.8.3",
@@ -13,7 +13,53 @@ var compatibility = {
13
13
  };
14
14
  //#endregion
15
15
  //#region package.json
16
- var version = "5.13.0";
16
+ var version = "5.14.0";
17
+ //#endregion
18
+ //#region src/inline.ts
19
+ const keyStarts = /* @__PURE__ */ new Set([
20
+ yuku_parser.TokenKind.LeftBrace,
21
+ yuku_parser.TokenKind.Comma,
22
+ yuku_parser.TokenKind.Semicolon,
23
+ yuku_parser.TokenKind.LeftParen
24
+ ]);
25
+ /**
26
+ * Calls `replace` for every identifier that references something, and swaps in what it returns.
27
+ * yuku's tokens leave out strings, comments and template text; member access (`x.Name`) and keys are skipped here.
28
+ */
29
+ function replaceIdentifiers(text, replace, lang = "ts") {
30
+ const tokens = (0, yuku_parser.parse)(text, {
31
+ lang,
32
+ sourceType: "module",
33
+ tokens: true
34
+ }).tokens;
35
+ const kinds = Array.from({ length: tokens.length }, (_, i) => tokens.kind(i));
36
+ let out = "";
37
+ let last = 0;
38
+ for (const [i, kind] of kinds.entries()) {
39
+ if (kind !== yuku_parser.TokenKind.Identifier || kinds[i - 1] === yuku_parser.TokenKind.Dot || kinds[i - 1] === yuku_parser.TokenKind.OptionalChaining) continue;
40
+ if ((kinds[i + 1] === yuku_parser.TokenKind.Colon || kinds[i + 1] === yuku_parser.TokenKind.Question && kinds[i + 2] === yuku_parser.TokenKind.Colon) && (i === 0 || tokens.newlineBefore(i) || keyStarts.has(kinds[i - 1]))) continue;
41
+ const replacement = replace(tokens.text(i));
42
+ if (replacement === void 0) continue;
43
+ out += text.slice(last, tokens.start(i)) + replacement;
44
+ last = tokens.end(i);
45
+ }
46
+ return out + text.slice(last);
47
+ }
48
+ function createInline(lang) {
49
+ return {
50
+ replaceIdentifiers: (text, replace) => replaceIdentifiers(text, replace, lang),
51
+ wrap: (expression) => /^[\w$.]+$/.test(expression) ? expression : `(${expression})`
52
+ };
53
+ }
54
+ /**
55
+ * Inline support for TypeScript and JavaScript files: identifiers are found with {@link replaceIdentifiers},
56
+ * and a definition that is more than a name or a dotted path goes in parentheses.
57
+ */
58
+ const inlineTs = createInline("ts");
59
+ /**
60
+ * {@link inlineTs} for `.tsx` and `.jsx` files, where JSX text and attribute names are not identifiers.
61
+ */
62
+ const inlineTsx = createInline("tsx");
17
63
  //#endregion
18
64
  //#region src/utils.ts
19
65
  let compiler;
@@ -198,7 +244,7 @@ function printNodes({ nodes, separator }) {
198
244
  let result = "";
199
245
  let pendingBreak = false;
200
246
  for (const node of nodes ?? []) {
201
- if (node.kind === "Break") {
247
+ if (node.kind === _kubb_ast.ast.nodeKinds.break) {
202
248
  pendingBreak = result !== "";
203
249
  continue;
204
250
  }
@@ -346,13 +392,13 @@ function printArrowFunction(node) {
346
392
  */
347
393
  function printCodeNode(node) {
348
394
  switch (node.kind) {
349
- case "Break": return "";
350
- case "Text":
351
- case "Jsx": return dedent(node.value);
352
- case "Const": return printConst(node);
353
- case "Type": return printType(node);
354
- case "Function": return printFunction(node);
355
- case "ArrowFunction": return printArrowFunction(node);
395
+ case _kubb_ast.ast.nodeKinds.break: return "";
396
+ case _kubb_ast.ast.nodeKinds.text:
397
+ case _kubb_ast.ast.nodeKinds.jsx: return dedent(node.value);
398
+ case _kubb_ast.ast.nodeKinds.const: return printConst(node);
399
+ case _kubb_ast.ast.nodeKinds.type: return printType(node);
400
+ case _kubb_ast.ast.nodeKinds.function: return printFunction(node);
401
+ case _kubb_ast.ast.nodeKinds.arrowFunction: return printArrowFunction(node);
356
402
  }
357
403
  }
358
404
  /**
@@ -434,6 +480,7 @@ const parserTs = (0, _kubb_core.defineExtension)({
434
480
  return {
435
481
  extNames: [".ts", ".js"],
436
482
  print,
483
+ inline: inlineTs,
437
484
  parse(file) {
438
485
  const extname = extension[file.extname] || void 0;
439
486
  const source = file.sources.map((item) => printSource(item)).filter(Boolean).map((text) => text.trimEnd()).join("\n\n");
@@ -498,7 +545,8 @@ const parserTsx = (0, _kubb_core.defineExtension)({
498
545
  },
499
546
  build: (options) => ({
500
547
  ...parserTs(options),
501
- extNames: [".tsx", ".jsx"]
548
+ extNames: [".tsx", ".jsx"],
549
+ inline: inlineTsx
502
550
  })
503
551
  });
504
552
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["require","createRequire","dirname","fileURLToPath","relative","getExtname","resolve","ast","parse","defineExtension","ast","defineExtension"],"sources":["../kubb-extension.json","../package.json","../src/utils.ts","../src/parserTs.ts","../src/parserTsx.ts"],"sourcesContent":["","","import { createRequire } from 'node:module'\nimport { dirname, extname as getExtname, relative, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { ast } from '@kubb/ast'\nimport { type ImportSpecifier, type ModuleExportName, parse, type ProgramStatement } from 'yuku-parser'\n\n/**\n * A TypeScript compiler node, typed structurally so `@kubb/parser-ts` does not depend on `@typescript/typescript6`.\n *\n * @deprecated Pass printed strings to `print` instead. Support for compiler nodes is removed in the next major.\n */\nexport type TsNode = { readonly kind: number }\n\ntype Compiler = {\n printNodes: (nodes: Array<TsNode>) => string\n}\n\nlet compiler: Compiler | undefined\n\n// The parts of the TypeScript 6 API that printing compiler nodes uses, typed here so no package depends on it\ntype TypeScript = {\n createPrinter(options: { omitTrailingSemicolon: boolean; newLine: number; removeComments: boolean; noEmitHelpers: boolean }): {\n printList(format: number, list: unknown, sourceFile: unknown): string\n }\n createSourceFile(fileName: string, text: string, target: number, setParentNodes: boolean, kind: number): unknown\n factory: { createNodeArray(nodes: Array<TsNode>): unknown }\n NewLineKind: { LineFeed: number }\n ScriptTarget: { ES2022: number }\n ScriptKind: { TSX: number }\n ListFormat: { MultiLine: number }\n}\n\n/**\n * Loads TypeScript the first time `print` gets a compiler node. Strings never need it, so bundles for edge runtimes such as Cloudflare Workers leave it out.\n *\n * Loaded with `require`, not `import`: when ESM imports a CommonJS package, Node keeps a second copy of its source\n * to detect named exports, and for TypeScript that copy is about 9 MB.\n */\nfunction loadCompiler(): Compiler {\n if (compiler) return compiler\n\n const require = createRequire(import.meta.url)\n // Look in the user's project first: a strict package manager such as pnpm does not link it next to this package\n const paths = [process.cwd(), dirname(fileURLToPath(import.meta.url))]\n let typescript: TypeScript | undefined\n // `typescript` 5 and 6 ship the compiler API; next to TypeScript 7 it comes from `@typescript/typescript6`\n for (const name of ['typescript', '@typescript/typescript6']) {\n try {\n const candidate = require(require.resolve(name, { paths }))\n if (typeof candidate.createPrinter === 'function') {\n typescript = candidate as TypeScript\n break\n }\n } catch {}\n }\n if (!typescript) {\n throw new Error(\n '`print` received a TypeScript compiler node, which needs `typescript` 5 or 6, or `@typescript/typescript6`, installed. Pass a printed string instead.',\n )\n }\n\n // One printer serves every call; printing does not mutate the source file, which only lends its compiler options\n const printer = typescript.createPrinter({\n omitTrailingSemicolon: true,\n newLine: typescript.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n })\n const sourceFile = typescript.createSourceFile('print.tsx', '', typescript.ScriptTarget.ES2022, true, typescript.ScriptKind.TSX)\n\n compiler = {\n printNodes: (nodes) => printer.printList(typescript.ListFormat.MultiLine, typescript.factory.createNodeArray(nodes), sourceFile),\n }\n\n return compiler\n}\n\n/**\n * Module specifier that imports `filePath` from the file at `root`: POSIX, relative to that file's directory, `./`-prefixed unless it climbs with `../`.\n */\nexport function getRelativePath(root: string, filePath: string): string {\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n return slashed.startsWith('../') ? slashed : `./${slashed}`\n}\n\n/**\n * Swaps the extension of a relative import/export path for `extname`. Package specifiers and extension-less paths stay as-is.\n */\nexport function resolveOutputPath(path: string, extname: string | undefined, rootAware: boolean): string {\n if (!rootAware) return path\n const current = getExtname(path)\n return current ? `${path.slice(0, -current.length)}${extname ?? ''}` : path\n}\n\n/**\n * Node types this module reads from the yuku AST.\n */\nconst nodeTypes = {\n identifier: 'Identifier',\n literal: 'Literal',\n importDeclaration: 'ImportDeclaration',\n importSpecifier: 'ImportSpecifier',\n importDefaultSpecifier: 'ImportDefaultSpecifier',\n importNamespaceSpecifier: 'ImportNamespaceSpecifier',\n exportAllDeclaration: 'ExportAllDeclaration',\n exportNamedDeclaration: 'ExportNamedDeclaration',\n} as const\n\n/**\n * `importKind` and `exportKind` values this module reads from the yuku AST.\n */\nconst declarationKinds = {\n type: 'type',\n} as const\n\nfunction nameOf(node: ModuleExportName): string {\n return node.type === nodeTypes.literal ? node.value : node.name\n}\n\n/**\n * Converts an import specifier into an `ImportNode` name, keeping the quotes of a string-literal name (`{ 'a-b' as ab }`).\n */\nfunction toImportName({ imported, local }: ImportSpecifier): string | { propertyName: string; name: string } {\n if (imported.type === nodeTypes.identifier && imported.name === local.name) return local.name\n\n return { propertyName: imported.type === nodeTypes.literal ? quoteModulePath(imported.value) : imported.name, name: local.name }\n}\n\n/**\n * Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes or a phase stay as written.\n */\nfunction toImportNodes(statement: ProgramStatement, filePath: string): Array<ast.ImportNode> {\n if (statement.type !== nodeTypes.importDeclaration || !statement.specifiers.length || statement.attributes.length || statement.phase) return []\n\n const specifier = statement.source.value\n const target = specifier.startsWith('.') ? { path: resolve(dirname(filePath), specifier), root: filePath } : { path: specifier }\n const isTypeOnly = statement.importKind === declarationKinds.type\n const nodes: Array<ast.ImportNode> = []\n const named = statement.specifiers.filter((element) => element.type === nodeTypes.importSpecifier)\n\n for (const element of statement.specifiers) {\n if (element.type === nodeTypes.importDefaultSpecifier) nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly }))\n if (element.type === nodeTypes.importNamespaceSpecifier)\n nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly, isNameSpace: true }))\n }\n const values = named.filter((element) => element.importKind !== declarationKinds.type)\n const types = named.filter((element) => element.importKind === declarationKinds.type)\n if (values.length) nodes.push(ast.factory.createImport({ name: values.map(toImportName), ...target, isTypeOnly }))\n if (types.length) nodes.push(ast.factory.createImport({ name: types.map(toImportName), ...target, isTypeOnly: true }))\n\n return nodes\n}\n\n/**\n * Converts an `export … from` declaration into `ExportNode`s. Forms `printExport` cannot print stay as written.\n */\nfunction toExportNodes(statement: ProgramStatement): Array<ast.ExportNode> {\n if (statement.type !== nodeTypes.exportAllDeclaration && statement.type !== nodeTypes.exportNamedDeclaration) return []\n if (!statement.source || statement.attributes.length) return []\n\n const path = statement.source.value\n const isTypeOnly = statement.exportKind === declarationKinds.type\n\n if (statement.type === nodeTypes.exportAllDeclaration) {\n return [\n statement.exported\n ? ast.factory.createExport({ name: nameOf(statement.exported), path, isTypeOnly, asAlias: true })\n : ast.factory.createExport({ path, isTypeOnly }),\n ]\n }\n if (\n statement.specifiers.some(\n (element) =>\n element.exportKind === declarationKinds.type || element.exported.type === nodeTypes.literal || nameOf(element.exported) !== nameOf(element.local),\n )\n )\n return []\n\n return [ast.factory.createExport({ name: statement.specifiers.map((element) => nameOf(element.local)), path, isTypeOnly })]\n}\n\n/**\n * Splits `source` into its lifted `import`/`export … from` nodes, the `header` above the first one (shebang, directives, comments) and the rest as `body`.\n */\nexport function splitModuleDeclarations(\n source: string,\n filePath: string,\n): { header: string; imports: Array<ast.ImportNode>; exports: Array<ast.ExportNode>; body: string } {\n const { program } = parse(source, { lang: 'ts', sourceType: 'module' })\n const imports: Array<ast.ImportNode> = []\n const exports: Array<ast.ExportNode> = []\n let header = ''\n let body = ''\n let cursor = 0\n\n for (const statement of program.body) {\n const importNodes = toImportNodes(statement, filePath)\n const exportNodes = toExportNodes(statement)\n if (!importNodes.length && !exportNodes.length) {\n // Lifted declarations print above the body, so stop at the first one that stays in place to keep the evaluation order.\n if (\n statement.type === nodeTypes.importDeclaration ||\n ((statement.type === nodeTypes.exportNamedDeclaration || statement.type === nodeTypes.exportAllDeclaration) && statement.source)\n )\n break\n continue\n }\n\n const text = source.slice(cursor, statement.start)\n if (imports.length || exports.length) body += text\n else header = text\n imports.push(...importNodes)\n exports.push(...exportNodes)\n cursor = statement.end\n }\n\n return { header: header.trim(), imports, exports, body: `${body}${source.slice(cursor)}`.trim() }\n}\n\n/**\n * Joins the printed `nodes` with `separator`; a `Break` widens the next separator to a blank line, and leading, trailing and repeated breaks fold into one.\n *\n * Imperative on purpose: this runs once per source fragment and `map().filter().join()` showed up in deopt traces.\n */\nfunction printNodes({ nodes, separator }: { nodes: Array<ast.CodeNode> | undefined; separator: '\\n' | '\\n\\n' }): string {\n let result = ''\n let pendingBreak = false\n\n for (const node of nodes ?? []) {\n if (node.kind === 'Break') {\n pendingBreak = result !== ''\n continue\n }\n\n const text = printCodeNode(node)\n if (!text) continue\n\n if (result) result += pendingBreak ? '\\n\\n' : separator\n result += text\n pendingBreak = false\n }\n\n return result\n}\n\n/**\n * Indents every non-empty line of `text` by two spaces.\n */\nfunction indentLines(text: string): string {\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => (line.trim() ? ` ${line}` : ''))\n .join('\\n')\n}\n\n/**\n * Strips the common leading whitespace and the surrounding blank lines, counting tabs and spaces alike, so indented template literals start at column zero.\n */\nfunction dedent(text: string): string {\n if (!text) return ''\n // Most text nodes are one line, so the common indent is its leading whitespace.\n if (!text.includes('\\n')) return text.trim() ? text.trimStart() : ''\n\n const lines = text.split('\\n')\n const isBlank = (line: string) => line.trim() === ''\n\n const start = lines.findIndex((line) => !isBlank(line))\n if (start === -1) return ''\n const end = lines.findLastIndex((line) => !isBlank(line))\n\n const trimmed = lines.slice(start, end + 1)\n // A loop, not `Math.min(...indents)`, which overflows the stack on very long text.\n let min = Infinity\n for (const line of trimmed) {\n if (!isBlank(line)) min = Math.min(min, line.length - line.trimStart().length)\n }\n\n return trimmed.map((line) => (isBlank(line) ? '' : line.slice(min))).join('\\n')\n}\n\n/**\n * Renders `<T>(params): ReturnType`; an async function wraps its return type in `Promise<>`.\n */\nfunction signature({ async: isAsync, generics, params, returnType }: Pick<ast.FunctionNode, 'async' | 'generics' | 'params' | 'returnType'>): string {\n const genericsStr = generics ? `<${Array.isArray(generics) ? generics.join(', ') : generics}>` : ''\n const wrapped = isAsync ? `Promise<${returnType}>` : returnType\n const returnTypeStr = returnType ? `: ${wrapped}` : ''\n\n return `${genericsStr}(${params ?? ''})${returnTypeStr}`\n}\n\n/**\n * Puts the JSDoc block, when it renders to something, above `declaration`.\n */\nfunction withJSDoc({ jsDoc, declaration }: { jsDoc?: ast.JSDocNode | null; declaration: string }): string {\n const jsDocStr = jsDoc ? printJSDoc(jsDoc) : ''\n\n return jsDocStr ? `${jsDocStr}\\n${declaration}` : declaration\n}\n\n/**\n * Joins printed code fragments with a newline.\n *\n * Passing TypeScript compiler nodes still works but is deprecated and needs `typescript` 5 or 6, or `@typescript/typescript6`, installed.\n * Support for compiler nodes is removed in the next major.\n */\nexport function print(...elements: Array<string | TsNode>): string {\n const filtered = elements.filter(Boolean)\n if (filtered.length === 0) return ''\n if (filtered.every((element) => typeof element === 'string')) return filtered.join('\\n')\n // Printing compiler nodes as one list keeps the output byte-for-byte the same as before strings were accepted\n if (filtered.every((element) => typeof element !== 'string')) return loadCompiler().printNodes(filtered)\n\n return filtered.map((element) => (typeof element === 'string' ? element : loadCompiler().printNodes([element]).trimEnd())).join('\\n')\n}\n\n/**\n * Converts a {@link ast.JSDocNode} to a `/** … *\\/` block, dropping blank comments.\n */\nfunction printJSDoc(jsDoc: ast.JSDocNode): string {\n const comments = (jsDoc.comments ?? []).filter((c) => c != null)\n if (comments.length === 0) return ''\n\n const lines = comments\n .flatMap((c) => c.split(/\\r?\\n/))\n .map((l) => l.replace(/\\*\\//g, '* /').replace(/\\r/g, ''))\n .filter((l) => l.trim().length > 0)\n\n if (lines.length === 0) return ''\n\n return ['/**', ...lines.map((l) => ` * ${l}`), ' */'].join('\\n')\n}\n\n/**\n * Converts a {@link ast.ConstNode} to a `const` declaration, mirroring the `Const` component from `@kubb/renderer-jsx`.\n */\nfunction printConst(node: ast.ConstNode): string {\n const { name, export: canExport, type, JSDoc, asConst, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}const ${name}${type ? `: ${type}` : ''} = ${printNodes({ nodes, separator: '\\n' })}${asConst ? ' as const' : ''}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.TypeNode} to a `type` alias, mirroring the `Type` component from `@kubb/renderer-jsx`.\n */\nfunction printType(node: ast.TypeNode): string {\n const { name, export: canExport, JSDoc, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}type ${name} = ${printNodes({ nodes, separator: '\\n' })}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.FunctionNode} to a `function` declaration, mirroring the `Function` component from `@kubb/renderer-jsx`.\n */\nfunction printFunction(node: ast.FunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes } = node\n\n const body = indentLines(printNodes({ nodes, separator: '\\n' }))\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}${isAsync ? 'async ' : ''}`\n const declaration = `${prefix}function ${name}${signature({ async: isAsync, generics, params, returnType })} {${body ? `\\n${body}\\n` : ''}}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts an {@link ast.ArrowFunctionNode} to a `const` arrow function, mirroring the `Function.Arrow` component from `@kubb/renderer-jsx`.\n */\nfunction printArrowFunction(node: ast.ArrowFunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes, singleLine } = node\n\n const body = printNodes({ nodes, separator: '\\n' })\n const arrowBody = singleLine ? ` => ${body}` : body ? ` => {\\n${indentLines(body)}\\n}` : ' => {}'\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}`\n const declaration = `${prefix}const ${name} = ${isAsync ? 'async ' : ''}${signature({ async: isAsync, generics, params, returnType })}${arrowBody}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Dispatches a {@link ast.CodeNode} to the printer for its `kind`.\n */\nfunction printCodeNode(node: ast.CodeNode): string {\n switch (node.kind) {\n case 'Break':\n return ''\n case 'Text':\n case 'Jsx':\n return dedent(node.value)\n case 'Const':\n return printConst(node)\n case 'Type':\n return printType(node)\n case 'Function':\n return printFunction(node)\n case 'ArrowFunction':\n return printArrowFunction(node)\n }\n}\n\n/**\n * Prints a {@link ast.SourceNode} with a blank line between its top-level nodes.\n */\nexport function printSource(node: ast.SourceNode): string {\n return printNodes({ nodes: node.nodes, separator: '\\n\\n' })\n}\n\n/**\n * Wraps a module specifier in single quotes, escaping embedded backslashes and quotes.\n */\nfunction quoteModulePath(path: string): string {\n return `'${path.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\n/**\n * Renders an `import` declaration (default, `* as`, or named with `{ a as b }`, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printImport({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: Pick<ast.ImportNode, 'name' | 'path' | 'isTypeOnly' | 'isNameSpace'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (!Array.isArray(name)) {\n if (isNameSpace) return `import ${typePrefix}* as ${name} from ${from}`\n return `import ${typePrefix}${name} from ${from}`\n }\n\n const specifiers = name.map((item) => {\n if (typeof item === 'object') {\n return item.name ? `${item.propertyName} as ${item.name}` : item.propertyName\n }\n return item\n })\n\n return `import ${typePrefix}{ ${specifiers.join(', ')} } from ${from}`\n}\n\n/**\n * Renders an `export … from` declaration (named, `* as name`, or wildcard, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printExport({ path, name, isTypeOnly = false, asAlias = false }: Pick<ast.ExportNode, 'name' | 'path' | 'isTypeOnly' | 'asAlias'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (Array.isArray(name)) {\n return `export ${typePrefix}{ ${name.join(', ')} } from ${from}`\n }\n\n if (asAlias && name) {\n // An identifier cannot start with a digit, so swap the digit for `_`\n const parsedName = /^\\d/.test(name) ? `_${name.slice(1)}` : name\n return `export ${typePrefix}* as ${parsedName} from ${from}`\n }\n\n if (name) {\n return `export ${typePrefix}{ ${name} } from ${from}`\n }\n\n return `export ${typePrefix}* from ${from}`\n}\n","import { ast } from '@kubb/ast'\nimport { defineExtension } from '@kubb/core'\nimport { compatibility } from '../kubb-extension.json'\nimport { version } from '../package.json'\nimport { getRelativePath, print, printExport, printImport, printSource, resolveOutputPath, splitModuleDeclarations, type TsNode } from './utils.ts'\n\nconst DEFAULT_EXTENSION: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''> = { '.ts': '' }\n\n/**\n * Options accepted by `parserTs` and `parserTsx`.\n */\nexport type ParserTsOptions = {\n /**\n * Rewrite extensions on relative `import`/`export` statements. Each key is the extension of a\n * generated file, and its value is the extension written on the relative specifiers in that\n * file. `''` drops it, and so does a generated file whose extension has no key. Package\n * specifiers stay unchanged. Also applies to relative paths in `copy` templates.\n *\n * Use `{ '.ts': '.js' }` for ESM output compiled to JavaScript, or `{ '.ts': '.ts' }` to run the\n * `.ts` files directly in Node.js or compile them with `rewriteRelativeImportExtensions`.\n *\n * @default { '.ts': '' }\n * @example\n * ```ts\n * parserTs({ extension: { '.ts': '.js' } }) // import './api.js' instead of './api'\n * parserTs({ extension: { '.ts': '.ts' } }) // import './api.ts' instead of './api'\n * ```\n */\n extension?: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''>\n}\n\n/**\n * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST\n * produced by an adapter and prints it as TypeScript source. Imports and exports\n * are rewritten based on each file's metadata and the `extension` option.\n *\n * Used automatically when no `parsers` option is set on `defineConfig`. Use\n * `parserTsx` instead for React projects that emit JSX.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTs } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTs()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTs = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'typescript', version, compatibility, issues: 'https://github.com/kubb-labs/kubb/issues' },\n build({ extension = DEFAULT_EXTENSION }) {\n return {\n extNames: ['.ts', '.js'],\n print,\n parse(file) {\n const extname = extension[file.extname] || undefined\n\n const source = file.sources\n .map((item) => printSource(item))\n .filter(Boolean)\n .map((text) => text.trimEnd())\n .join('\\n\\n')\n\n const importLines = file.imports.map((item) =>\n printImport({\n ...item,\n path: resolveOutputPath(item.root ? getRelativePath(item.root, item.path) : item.path, extname, Boolean(item.root)),\n }),\n )\n\n const exportLines = file.exports.map((item) => printExport({ ...item, path: resolveOutputPath(item.path, extname, item.path.startsWith('.')) }))\n\n const importExportBlock = [...importLines, ...exportLines].join('\\n')\n\n const parts = [file.banner, importExportBlock, source, file.footer].filter((segment): segment is string => Boolean(segment)).map((s) => s.trimEnd())\n\n return parts.join('\\n\\n')\n },\n copy(file, source) {\n const { header, imports, exports, body } = splitModuleDeclarations(source, file.path)\n\n return {\n ...file,\n banner: [header, file.banner].filter(Boolean).join('\\n') || undefined,\n imports: [...file.imports, ...imports],\n exports: [...file.exports, ...exports],\n sources: [ast.factory.createSource({ nodes: [ast.factory.createText(body)] })],\n }\n },\n }\n },\n})\n","import { defineExtension } from '@kubb/core'\nimport { parserTs, type ParserTsOptions } from './parserTs.ts'\nimport type { TsNode } from './utils.ts'\n\n/**\n * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs`, since JSX\n * prints as text the same way, so it shares the same `extension` option.\n *\n * Add to the `parsers` array on `defineConfig` when generating components for\n * React (or any framework that emits JSX).\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTsx } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTsx()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTsx = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'tsx', issues: 'https://github.com/kubb-labs/kubb/issues' },\n build: (options) => ({ ...parserTs(options), extNames: ['.tsx', '.jsx'] }),\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["TokenKind","parse","require","createRequire","dirname","fileURLToPath","relative","getExtname","resolve","ast","parse","defineExtension","ast","defineExtension"],"sources":["../kubb-extension.json","../package.json","../src/inline.ts","../src/utils.ts","../src/parserTs.ts","../src/parserTsx.ts"],"sourcesContent":["","","import type { ast } from '@kubb/ast'\nimport { parse, TokenKind } from 'yuku-parser'\n\n// A name followed by `:` or `?:` right after one of these is a key or parameter name (`{ Name: x }`, `(Name: x)`).\nconst keyStarts = new Set<number>([TokenKind.LeftBrace, TokenKind.Comma, TokenKind.Semicolon, TokenKind.LeftParen])\n\n/**\n * Calls `replace` for every identifier that references something, and swaps in what it returns.\n * yuku's tokens leave out strings, comments and template text; member access (`x.Name`) and keys are skipped here.\n */\nexport function replaceIdentifiers(text: string, replace: (name: string) => string | undefined, lang: 'ts' | 'tsx' = 'ts'): string {\n // Generated fragments such as `options: Options<Pet>` are not whole programs; yuku still tokenizes them.\n const tokens = parse(text, { lang, sourceType: 'module', tokens: true }).tokens!\n\n // `TokenList` is indexed, not iterable; a plain array also makes the neighbours of a token `undefined` at the ends.\n const kinds = Array.from({ length: tokens.length }, (_, i) => tokens.kind(i))\n\n let out = ''\n let last = 0\n\n for (const [i, kind] of kinds.entries()) {\n if (kind !== TokenKind.Identifier || kinds[i - 1] === TokenKind.Dot || kinds[i - 1] === TokenKind.OptionalChaining) continue\n const isKey = kinds[i + 1] === TokenKind.Colon || (kinds[i + 1] === TokenKind.Question && kinds[i + 2] === TokenKind.Colon)\n // `? Name :` in a conditional type is a reference.\n if (isKey && (i === 0 || tokens.newlineBefore(i) || keyStarts.has(kinds[i - 1]!))) continue\n\n const replacement = replace(tokens.text(i))\n if (replacement === undefined) continue\n out += text.slice(last, tokens.start(i)) + replacement\n last = tokens.end(i)\n }\n\n return out + text.slice(last)\n}\n\nfunction createInline(lang: 'ts' | 'tsx'): ast.InlineLanguage {\n return {\n replaceIdentifiers: (text, replace) => replaceIdentifiers(text, replace, lang),\n wrap: (expression) => (/^[\\w$.]+$/.test(expression) ? expression : `(${expression})`),\n }\n}\n\n/**\n * Inline support for TypeScript and JavaScript files: identifiers are found with {@link replaceIdentifiers},\n * and a definition that is more than a name or a dotted path goes in parentheses.\n */\nexport const inlineTs = createInline('ts')\n\n/**\n * {@link inlineTs} for `.tsx` and `.jsx` files, where JSX text and attribute names are not identifiers.\n */\nexport const inlineTsx = createInline('tsx')\n","import { createRequire } from 'node:module'\nimport { dirname, extname as getExtname, relative, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { ast } from '@kubb/ast'\nimport { type ImportSpecifier, type ModuleExportName, parse, type ProgramStatement } from 'yuku-parser'\n\n/**\n * A TypeScript compiler node, typed structurally so `@kubb/parser-ts` does not depend on `@typescript/typescript6`.\n *\n * @deprecated Pass printed strings to `print` instead. Support for compiler nodes is removed in the next major.\n */\nexport type TsNode = { readonly kind: number }\n\ntype Compiler = {\n printNodes: (nodes: Array<TsNode>) => string\n}\n\nlet compiler: Compiler | undefined\n\n// The parts of the TypeScript 6 API that printing compiler nodes uses, typed here so no package depends on it\ntype TypeScript = {\n createPrinter(options: { omitTrailingSemicolon: boolean; newLine: number; removeComments: boolean; noEmitHelpers: boolean }): {\n printList(format: number, list: unknown, sourceFile: unknown): string\n }\n createSourceFile(fileName: string, text: string, target: number, setParentNodes: boolean, kind: number): unknown\n factory: { createNodeArray(nodes: Array<TsNode>): unknown }\n NewLineKind: { LineFeed: number }\n ScriptTarget: { ES2022: number }\n ScriptKind: { TSX: number }\n ListFormat: { MultiLine: number }\n}\n\n/**\n * Loads TypeScript the first time `print` gets a compiler node. Strings never need it, so bundles for edge runtimes such as Cloudflare Workers leave it out.\n *\n * Loaded with `require`, not `import`: when ESM imports a CommonJS package, Node keeps a second copy of its source\n * to detect named exports, and for TypeScript that copy is about 9 MB.\n */\nfunction loadCompiler(): Compiler {\n if (compiler) return compiler\n\n const require = createRequire(import.meta.url)\n // Look in the user's project first: a strict package manager such as pnpm does not link it next to this package\n const paths = [process.cwd(), dirname(fileURLToPath(import.meta.url))]\n let typescript: TypeScript | undefined\n // `typescript` 5 and 6 ship the compiler API; next to TypeScript 7 it comes from `@typescript/typescript6`\n for (const name of ['typescript', '@typescript/typescript6']) {\n try {\n const candidate = require(require.resolve(name, { paths }))\n if (typeof candidate.createPrinter === 'function') {\n typescript = candidate as TypeScript\n break\n }\n } catch {}\n }\n if (!typescript) {\n throw new Error(\n '`print` received a TypeScript compiler node, which needs `typescript` 5 or 6, or `@typescript/typescript6`, installed. Pass a printed string instead.',\n )\n }\n\n // One printer serves every call; printing does not mutate the source file, which only lends its compiler options\n const printer = typescript.createPrinter({\n omitTrailingSemicolon: true,\n newLine: typescript.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n })\n const sourceFile = typescript.createSourceFile('print.tsx', '', typescript.ScriptTarget.ES2022, true, typescript.ScriptKind.TSX)\n\n compiler = {\n printNodes: (nodes) => printer.printList(typescript.ListFormat.MultiLine, typescript.factory.createNodeArray(nodes), sourceFile),\n }\n\n return compiler\n}\n\n/**\n * Module specifier that imports `filePath` from the file at `root`: POSIX, relative to that file's directory, `./`-prefixed unless it climbs with `../`.\n */\nexport function getRelativePath(root: string, filePath: string): string {\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n return slashed.startsWith('../') ? slashed : `./${slashed}`\n}\n\n/**\n * Swaps the extension of a relative import/export path for `extname`. Package specifiers and extension-less paths stay as-is.\n */\nexport function resolveOutputPath(path: string, extname: string | undefined, rootAware: boolean): string {\n if (!rootAware) return path\n const current = getExtname(path)\n return current ? `${path.slice(0, -current.length)}${extname ?? ''}` : path\n}\n\n/**\n * Node types this module reads from the yuku AST.\n */\nconst nodeTypes = {\n identifier: 'Identifier',\n literal: 'Literal',\n importDeclaration: 'ImportDeclaration',\n importSpecifier: 'ImportSpecifier',\n importDefaultSpecifier: 'ImportDefaultSpecifier',\n importNamespaceSpecifier: 'ImportNamespaceSpecifier',\n exportAllDeclaration: 'ExportAllDeclaration',\n exportNamedDeclaration: 'ExportNamedDeclaration',\n} as const\n\n/**\n * `importKind` and `exportKind` values this module reads from the yuku AST.\n */\nconst declarationKinds = {\n type: 'type',\n} as const\n\nfunction nameOf(node: ModuleExportName): string {\n return node.type === nodeTypes.literal ? node.value : node.name\n}\n\n/**\n * Converts an import specifier into an `ImportNode` name, keeping the quotes of a string-literal name (`{ 'a-b' as ab }`).\n */\nfunction toImportName({ imported, local }: ImportSpecifier): string | { propertyName: string; name: string } {\n if (imported.type === nodeTypes.identifier && imported.name === local.name) return local.name\n\n return { propertyName: imported.type === nodeTypes.literal ? quoteModulePath(imported.value) : imported.name, name: local.name }\n}\n\n/**\n * Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes or a phase stay as written.\n */\nfunction toImportNodes(statement: ProgramStatement, filePath: string): Array<ast.ImportNode> {\n if (statement.type !== nodeTypes.importDeclaration || !statement.specifiers.length || statement.attributes.length || statement.phase) return []\n\n const specifier = statement.source.value\n const target = specifier.startsWith('.') ? { path: resolve(dirname(filePath), specifier), root: filePath } : { path: specifier }\n const isTypeOnly = statement.importKind === declarationKinds.type\n const nodes: Array<ast.ImportNode> = []\n const named = statement.specifiers.filter((element) => element.type === nodeTypes.importSpecifier)\n\n for (const element of statement.specifiers) {\n if (element.type === nodeTypes.importDefaultSpecifier) nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly }))\n if (element.type === nodeTypes.importNamespaceSpecifier)\n nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly, isNameSpace: true }))\n }\n const values = named.filter((element) => element.importKind !== declarationKinds.type)\n const types = named.filter((element) => element.importKind === declarationKinds.type)\n if (values.length) nodes.push(ast.factory.createImport({ name: values.map(toImportName), ...target, isTypeOnly }))\n if (types.length) nodes.push(ast.factory.createImport({ name: types.map(toImportName), ...target, isTypeOnly: true }))\n\n return nodes\n}\n\n/**\n * Converts an `export … from` declaration into `ExportNode`s. Forms `printExport` cannot print stay as written.\n */\nfunction toExportNodes(statement: ProgramStatement): Array<ast.ExportNode> {\n if (statement.type !== nodeTypes.exportAllDeclaration && statement.type !== nodeTypes.exportNamedDeclaration) return []\n if (!statement.source || statement.attributes.length) return []\n\n const path = statement.source.value\n const isTypeOnly = statement.exportKind === declarationKinds.type\n\n if (statement.type === nodeTypes.exportAllDeclaration) {\n return [\n statement.exported\n ? ast.factory.createExport({ name: nameOf(statement.exported), path, isTypeOnly, asAlias: true })\n : ast.factory.createExport({ path, isTypeOnly }),\n ]\n }\n if (\n statement.specifiers.some(\n (element) =>\n element.exportKind === declarationKinds.type || element.exported.type === nodeTypes.literal || nameOf(element.exported) !== nameOf(element.local),\n )\n )\n return []\n\n return [ast.factory.createExport({ name: statement.specifiers.map((element) => nameOf(element.local)), path, isTypeOnly })]\n}\n\n/**\n * Splits `source` into its lifted `import`/`export … from` nodes, the `header` above the first one (shebang, directives, comments) and the rest as `body`.\n */\nexport function splitModuleDeclarations(\n source: string,\n filePath: string,\n): { header: string; imports: Array<ast.ImportNode>; exports: Array<ast.ExportNode>; body: string } {\n const { program } = parse(source, { lang: 'ts', sourceType: 'module' })\n const imports: Array<ast.ImportNode> = []\n const exports: Array<ast.ExportNode> = []\n let header = ''\n let body = ''\n let cursor = 0\n\n for (const statement of program.body) {\n const importNodes = toImportNodes(statement, filePath)\n const exportNodes = toExportNodes(statement)\n if (!importNodes.length && !exportNodes.length) {\n // Lifted declarations print above the body, so stop at the first one that stays in place to keep the evaluation order.\n if (\n statement.type === nodeTypes.importDeclaration ||\n ((statement.type === nodeTypes.exportNamedDeclaration || statement.type === nodeTypes.exportAllDeclaration) && statement.source)\n )\n break\n continue\n }\n\n const text = source.slice(cursor, statement.start)\n if (imports.length || exports.length) body += text\n else header = text\n imports.push(...importNodes)\n exports.push(...exportNodes)\n cursor = statement.end\n }\n\n return { header: header.trim(), imports, exports, body: `${body}${source.slice(cursor)}`.trim() }\n}\n\n/**\n * Joins the printed `nodes` with `separator`; a `Break` widens the next separator to a blank line, and leading, trailing and repeated breaks fold into one.\n *\n * Imperative on purpose: this runs once per source fragment and `map().filter().join()` showed up in deopt traces.\n */\nfunction printNodes({ nodes, separator }: { nodes: Array<ast.CodeNode> | undefined; separator: '\\n' | '\\n\\n' }): string {\n let result = ''\n let pendingBreak = false\n\n for (const node of nodes ?? []) {\n if (node.kind === ast.nodeKinds.break) {\n pendingBreak = result !== ''\n continue\n }\n\n const text = printCodeNode(node)\n if (!text) continue\n\n if (result) result += pendingBreak ? '\\n\\n' : separator\n result += text\n pendingBreak = false\n }\n\n return result\n}\n\n/**\n * Indents every non-empty line of `text` by two spaces.\n */\nfunction indentLines(text: string): string {\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => (line.trim() ? ` ${line}` : ''))\n .join('\\n')\n}\n\n/**\n * Strips the common leading whitespace and the surrounding blank lines, counting tabs and spaces alike, so indented template literals start at column zero.\n */\nfunction dedent(text: string): string {\n if (!text) return ''\n // Most text nodes are one line, so the common indent is its leading whitespace.\n if (!text.includes('\\n')) return text.trim() ? text.trimStart() : ''\n\n const lines = text.split('\\n')\n const isBlank = (line: string) => line.trim() === ''\n\n const start = lines.findIndex((line) => !isBlank(line))\n if (start === -1) return ''\n const end = lines.findLastIndex((line) => !isBlank(line))\n\n const trimmed = lines.slice(start, end + 1)\n // A loop, not `Math.min(...indents)`, which overflows the stack on very long text.\n let min = Infinity\n for (const line of trimmed) {\n if (!isBlank(line)) min = Math.min(min, line.length - line.trimStart().length)\n }\n\n return trimmed.map((line) => (isBlank(line) ? '' : line.slice(min))).join('\\n')\n}\n\n/**\n * Renders `<T>(params): ReturnType`; an async function wraps its return type in `Promise<>`.\n */\nfunction signature({ async: isAsync, generics, params, returnType }: Pick<ast.FunctionNode, 'async' | 'generics' | 'params' | 'returnType'>): string {\n const genericsStr = generics ? `<${Array.isArray(generics) ? generics.join(', ') : generics}>` : ''\n const wrapped = isAsync ? `Promise<${returnType}>` : returnType\n const returnTypeStr = returnType ? `: ${wrapped}` : ''\n\n return `${genericsStr}(${params ?? ''})${returnTypeStr}`\n}\n\n/**\n * Puts the JSDoc block, when it renders to something, above `declaration`.\n */\nfunction withJSDoc({ jsDoc, declaration }: { jsDoc?: ast.JSDocNode | null; declaration: string }): string {\n const jsDocStr = jsDoc ? printJSDoc(jsDoc) : ''\n\n return jsDocStr ? `${jsDocStr}\\n${declaration}` : declaration\n}\n\n/**\n * Joins printed code fragments with a newline.\n *\n * Passing TypeScript compiler nodes still works but is deprecated and needs `typescript` 5 or 6, or `@typescript/typescript6`, installed.\n * Support for compiler nodes is removed in the next major.\n */\nexport function print(...elements: Array<string | TsNode>): string {\n const filtered = elements.filter(Boolean)\n if (filtered.length === 0) return ''\n if (filtered.every((element) => typeof element === 'string')) return filtered.join('\\n')\n // Printing compiler nodes as one list keeps the output byte-for-byte the same as before strings were accepted\n if (filtered.every((element) => typeof element !== 'string')) return loadCompiler().printNodes(filtered)\n\n return filtered.map((element) => (typeof element === 'string' ? element : loadCompiler().printNodes([element]).trimEnd())).join('\\n')\n}\n\n/**\n * Converts a {@link ast.JSDocNode} to a `/** … *\\/` block, dropping blank comments.\n */\nfunction printJSDoc(jsDoc: ast.JSDocNode): string {\n const comments = (jsDoc.comments ?? []).filter((c) => c != null)\n if (comments.length === 0) return ''\n\n const lines = comments\n .flatMap((c) => c.split(/\\r?\\n/))\n .map((l) => l.replace(/\\*\\//g, '* /').replace(/\\r/g, ''))\n .filter((l) => l.trim().length > 0)\n\n if (lines.length === 0) return ''\n\n return ['/**', ...lines.map((l) => ` * ${l}`), ' */'].join('\\n')\n}\n\n/**\n * Converts a {@link ast.ConstNode} to a `const` declaration, mirroring the `Const` component from `@kubb/renderer-jsx`.\n */\nfunction printConst(node: ast.ConstNode): string {\n const { name, export: canExport, type, JSDoc, asConst, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}const ${name}${type ? `: ${type}` : ''} = ${printNodes({ nodes, separator: '\\n' })}${asConst ? ' as const' : ''}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.TypeNode} to a `type` alias, mirroring the `Type` component from `@kubb/renderer-jsx`.\n */\nfunction printType(node: ast.TypeNode): string {\n const { name, export: canExport, JSDoc, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}type ${name} = ${printNodes({ nodes, separator: '\\n' })}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.FunctionNode} to a `function` declaration, mirroring the `Function` component from `@kubb/renderer-jsx`.\n */\nfunction printFunction(node: ast.FunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes } = node\n\n const body = indentLines(printNodes({ nodes, separator: '\\n' }))\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}${isAsync ? 'async ' : ''}`\n const declaration = `${prefix}function ${name}${signature({ async: isAsync, generics, params, returnType })} {${body ? `\\n${body}\\n` : ''}}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts an {@link ast.ArrowFunctionNode} to a `const` arrow function, mirroring the `Function.Arrow` component from `@kubb/renderer-jsx`.\n */\nfunction printArrowFunction(node: ast.ArrowFunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes, singleLine } = node\n\n const body = printNodes({ nodes, separator: '\\n' })\n const arrowBody = singleLine ? ` => ${body}` : body ? ` => {\\n${indentLines(body)}\\n}` : ' => {}'\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}`\n const declaration = `${prefix}const ${name} = ${isAsync ? 'async ' : ''}${signature({ async: isAsync, generics, params, returnType })}${arrowBody}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Dispatches a {@link ast.CodeNode} to the printer for its `kind`.\n */\nfunction printCodeNode(node: ast.CodeNode): string {\n switch (node.kind) {\n case ast.nodeKinds.break:\n return ''\n case ast.nodeKinds.text:\n case ast.nodeKinds.jsx:\n return dedent(node.value)\n case ast.nodeKinds.const:\n return printConst(node)\n case ast.nodeKinds.type:\n return printType(node)\n case ast.nodeKinds.function:\n return printFunction(node)\n case ast.nodeKinds.arrowFunction:\n return printArrowFunction(node)\n }\n}\n\n/**\n * Prints a {@link ast.SourceNode} with a blank line between its top-level nodes.\n */\nexport function printSource(node: ast.SourceNode): string {\n return printNodes({ nodes: node.nodes, separator: '\\n\\n' })\n}\n\n/**\n * Wraps a module specifier in single quotes, escaping embedded backslashes and quotes.\n */\nfunction quoteModulePath(path: string): string {\n return `'${path.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\n/**\n * Renders an `import` declaration (default, `* as`, or named with `{ a as b }`, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printImport({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: Pick<ast.ImportNode, 'name' | 'path' | 'isTypeOnly' | 'isNameSpace'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (!Array.isArray(name)) {\n if (isNameSpace) return `import ${typePrefix}* as ${name} from ${from}`\n return `import ${typePrefix}${name} from ${from}`\n }\n\n const specifiers = name.map((item) => {\n if (typeof item === 'object') {\n return item.name ? `${item.propertyName} as ${item.name}` : item.propertyName\n }\n return item\n })\n\n return `import ${typePrefix}{ ${specifiers.join(', ')} } from ${from}`\n}\n\n/**\n * Renders an `export … from` declaration (named, `* as name`, or wildcard, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printExport({ path, name, isTypeOnly = false, asAlias = false }: Pick<ast.ExportNode, 'name' | 'path' | 'isTypeOnly' | 'asAlias'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (Array.isArray(name)) {\n return `export ${typePrefix}{ ${name.join(', ')} } from ${from}`\n }\n\n if (asAlias && name) {\n // An identifier cannot start with a digit, so swap the digit for `_`\n const parsedName = /^\\d/.test(name) ? `_${name.slice(1)}` : name\n return `export ${typePrefix}* as ${parsedName} from ${from}`\n }\n\n if (name) {\n return `export ${typePrefix}{ ${name} } from ${from}`\n }\n\n return `export ${typePrefix}* from ${from}`\n}\n","import { ast } from '@kubb/ast'\nimport { defineExtension } from '@kubb/core'\nimport { compatibility } from '../kubb-extension.json'\nimport { version } from '../package.json'\nimport { inlineTs } from './inline.ts'\nimport { getRelativePath, print, printExport, printImport, printSource, resolveOutputPath, splitModuleDeclarations, type TsNode } from './utils.ts'\n\nconst DEFAULT_EXTENSION: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''> = { '.ts': '' }\n\n/**\n * Options accepted by `parserTs` and `parserTsx`.\n */\nexport type ParserTsOptions = {\n /**\n * Rewrite extensions on relative `import`/`export` statements. Each key is the extension of a\n * generated file, and its value is the extension written on the relative specifiers in that\n * file. `''` drops it, and so does a generated file whose extension has no key. Package\n * specifiers stay unchanged. Also applies to relative paths in `copy` templates.\n *\n * Use `{ '.ts': '.js' }` for ESM output compiled to JavaScript, or `{ '.ts': '.ts' }` to run the\n * `.ts` files directly in Node.js or compile them with `rewriteRelativeImportExtensions`.\n *\n * @default { '.ts': '' }\n * @example\n * ```ts\n * parserTs({ extension: { '.ts': '.js' } }) // import './api.js' instead of './api'\n * parserTs({ extension: { '.ts': '.ts' } }) // import './api.ts' instead of './api'\n * ```\n */\n extension?: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''>\n}\n\n/**\n * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST\n * produced by an adapter and prints it as TypeScript source. Imports and exports\n * are rewritten based on each file's metadata and the `extension` option.\n *\n * Used automatically when no `parsers` option is set on `defineConfig`. Use\n * `parserTsx` instead for React projects that emit JSX.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTs } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTs()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTs = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'typescript', version, compatibility, issues: 'https://github.com/kubb-labs/kubb/issues' },\n build({ extension = DEFAULT_EXTENSION }) {\n return {\n extNames: ['.ts', '.js'],\n print,\n inline: inlineTs,\n parse(file) {\n const extname = extension[file.extname] || undefined\n\n const source = file.sources\n .map((item) => printSource(item))\n .filter(Boolean)\n .map((text) => text.trimEnd())\n .join('\\n\\n')\n\n const importLines = file.imports.map((item) =>\n printImport({\n ...item,\n path: resolveOutputPath(item.root ? getRelativePath(item.root, item.path) : item.path, extname, Boolean(item.root)),\n }),\n )\n\n const exportLines = file.exports.map((item) => printExport({ ...item, path: resolveOutputPath(item.path, extname, item.path.startsWith('.')) }))\n\n const importExportBlock = [...importLines, ...exportLines].join('\\n')\n\n const parts = [file.banner, importExportBlock, source, file.footer].filter((segment): segment is string => Boolean(segment)).map((s) => s.trimEnd())\n\n return parts.join('\\n\\n')\n },\n copy(file, source) {\n const { header, imports, exports, body } = splitModuleDeclarations(source, file.path)\n\n return {\n ...file,\n banner: [header, file.banner].filter(Boolean).join('\\n') || undefined,\n imports: [...file.imports, ...imports],\n exports: [...file.exports, ...exports],\n sources: [ast.factory.createSource({ nodes: [ast.factory.createText(body)] })],\n }\n },\n }\n },\n})\n","import { defineExtension } from '@kubb/core'\nimport { inlineTsx } from './inline.ts'\nimport { parserTs, type ParserTsOptions } from './parserTs.ts'\nimport type { TsNode } from './utils.ts'\n\n/**\n * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs`, since JSX\n * prints as text the same way, so it shares the same `extension` option.\n *\n * Add to the `parsers` array on `defineConfig` when generating components for\n * React (or any framework that emits JSX).\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTsx } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTsx()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTsx = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'tsx', issues: 'https://github.com/kubb-labs/kubb/issues' },\n build: (options) => ({ ...parserTs(options), extNames: ['.tsx', '.jsx'], inline: inlineTsx }),\n})\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { createRequire } from "node:module";
2
2
  import { ast } from "@kubb/ast";
3
3
  import { defineExtension } from "@kubb/core";
4
+ import { TokenKind, parse } from "yuku-parser";
4
5
  import { dirname, extname, relative, resolve } from "node:path";
5
6
  import { fileURLToPath } from "node:url";
6
- import { parse } from "yuku-parser";
7
7
  //#endregion
8
8
  //#region kubb-extension.json
9
9
  var compatibility = {
@@ -12,7 +12,53 @@ var compatibility = {
12
12
  };
13
13
  //#endregion
14
14
  //#region package.json
15
- var version = "5.13.0";
15
+ var version = "5.14.0";
16
+ //#endregion
17
+ //#region src/inline.ts
18
+ const keyStarts = /* @__PURE__ */ new Set([
19
+ TokenKind.LeftBrace,
20
+ TokenKind.Comma,
21
+ TokenKind.Semicolon,
22
+ TokenKind.LeftParen
23
+ ]);
24
+ /**
25
+ * Calls `replace` for every identifier that references something, and swaps in what it returns.
26
+ * yuku's tokens leave out strings, comments and template text; member access (`x.Name`) and keys are skipped here.
27
+ */
28
+ function replaceIdentifiers(text, replace, lang = "ts") {
29
+ const tokens = parse(text, {
30
+ lang,
31
+ sourceType: "module",
32
+ tokens: true
33
+ }).tokens;
34
+ const kinds = Array.from({ length: tokens.length }, (_, i) => tokens.kind(i));
35
+ let out = "";
36
+ let last = 0;
37
+ for (const [i, kind] of kinds.entries()) {
38
+ if (kind !== TokenKind.Identifier || kinds[i - 1] === TokenKind.Dot || kinds[i - 1] === TokenKind.OptionalChaining) continue;
39
+ if ((kinds[i + 1] === TokenKind.Colon || kinds[i + 1] === TokenKind.Question && kinds[i + 2] === TokenKind.Colon) && (i === 0 || tokens.newlineBefore(i) || keyStarts.has(kinds[i - 1]))) continue;
40
+ const replacement = replace(tokens.text(i));
41
+ if (replacement === void 0) continue;
42
+ out += text.slice(last, tokens.start(i)) + replacement;
43
+ last = tokens.end(i);
44
+ }
45
+ return out + text.slice(last);
46
+ }
47
+ function createInline(lang) {
48
+ return {
49
+ replaceIdentifiers: (text, replace) => replaceIdentifiers(text, replace, lang),
50
+ wrap: (expression) => /^[\w$.]+$/.test(expression) ? expression : `(${expression})`
51
+ };
52
+ }
53
+ /**
54
+ * Inline support for TypeScript and JavaScript files: identifiers are found with {@link replaceIdentifiers},
55
+ * and a definition that is more than a name or a dotted path goes in parentheses.
56
+ */
57
+ const inlineTs = createInline("ts");
58
+ /**
59
+ * {@link inlineTs} for `.tsx` and `.jsx` files, where JSX text and attribute names are not identifiers.
60
+ */
61
+ const inlineTsx = createInline("tsx");
16
62
  //#endregion
17
63
  //#region src/utils.ts
18
64
  let compiler;
@@ -197,7 +243,7 @@ function printNodes({ nodes, separator }) {
197
243
  let result = "";
198
244
  let pendingBreak = false;
199
245
  for (const node of nodes ?? []) {
200
- if (node.kind === "Break") {
246
+ if (node.kind === ast.nodeKinds.break) {
201
247
  pendingBreak = result !== "";
202
248
  continue;
203
249
  }
@@ -345,13 +391,13 @@ function printArrowFunction(node) {
345
391
  */
346
392
  function printCodeNode(node) {
347
393
  switch (node.kind) {
348
- case "Break": return "";
349
- case "Text":
350
- case "Jsx": return dedent(node.value);
351
- case "Const": return printConst(node);
352
- case "Type": return printType(node);
353
- case "Function": return printFunction(node);
354
- case "ArrowFunction": return printArrowFunction(node);
394
+ case ast.nodeKinds.break: return "";
395
+ case ast.nodeKinds.text:
396
+ case ast.nodeKinds.jsx: return dedent(node.value);
397
+ case ast.nodeKinds.const: return printConst(node);
398
+ case ast.nodeKinds.type: return printType(node);
399
+ case ast.nodeKinds.function: return printFunction(node);
400
+ case ast.nodeKinds.arrowFunction: return printArrowFunction(node);
355
401
  }
356
402
  }
357
403
  /**
@@ -433,6 +479,7 @@ const parserTs = defineExtension({
433
479
  return {
434
480
  extNames: [".ts", ".js"],
435
481
  print,
482
+ inline: inlineTs,
436
483
  parse(file) {
437
484
  const extname = extension[file.extname] || void 0;
438
485
  const source = file.sources.map((item) => printSource(item)).filter(Boolean).map((text) => text.trimEnd()).join("\n\n");
@@ -497,7 +544,8 @@ const parserTsx = defineExtension({
497
544
  },
498
545
  build: (options) => ({
499
546
  ...parserTs(options),
500
- extNames: [".tsx", ".jsx"]
547
+ extNames: [".tsx", ".jsx"],
548
+ inline: inlineTsx
501
549
  })
502
550
  });
503
551
  //#endregion
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["getExtname","extname"],"sources":["../kubb-extension.json","../package.json","../src/utils.ts","../src/parserTs.ts","../src/parserTsx.ts"],"sourcesContent":["","","import { createRequire } from 'node:module'\nimport { dirname, extname as getExtname, relative, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { ast } from '@kubb/ast'\nimport { type ImportSpecifier, type ModuleExportName, parse, type ProgramStatement } from 'yuku-parser'\n\n/**\n * A TypeScript compiler node, typed structurally so `@kubb/parser-ts` does not depend on `@typescript/typescript6`.\n *\n * @deprecated Pass printed strings to `print` instead. Support for compiler nodes is removed in the next major.\n */\nexport type TsNode = { readonly kind: number }\n\ntype Compiler = {\n printNodes: (nodes: Array<TsNode>) => string\n}\n\nlet compiler: Compiler | undefined\n\n// The parts of the TypeScript 6 API that printing compiler nodes uses, typed here so no package depends on it\ntype TypeScript = {\n createPrinter(options: { omitTrailingSemicolon: boolean; newLine: number; removeComments: boolean; noEmitHelpers: boolean }): {\n printList(format: number, list: unknown, sourceFile: unknown): string\n }\n createSourceFile(fileName: string, text: string, target: number, setParentNodes: boolean, kind: number): unknown\n factory: { createNodeArray(nodes: Array<TsNode>): unknown }\n NewLineKind: { LineFeed: number }\n ScriptTarget: { ES2022: number }\n ScriptKind: { TSX: number }\n ListFormat: { MultiLine: number }\n}\n\n/**\n * Loads TypeScript the first time `print` gets a compiler node. Strings never need it, so bundles for edge runtimes such as Cloudflare Workers leave it out.\n *\n * Loaded with `require`, not `import`: when ESM imports a CommonJS package, Node keeps a second copy of its source\n * to detect named exports, and for TypeScript that copy is about 9 MB.\n */\nfunction loadCompiler(): Compiler {\n if (compiler) return compiler\n\n const require = createRequire(import.meta.url)\n // Look in the user's project first: a strict package manager such as pnpm does not link it next to this package\n const paths = [process.cwd(), dirname(fileURLToPath(import.meta.url))]\n let typescript: TypeScript | undefined\n // `typescript` 5 and 6 ship the compiler API; next to TypeScript 7 it comes from `@typescript/typescript6`\n for (const name of ['typescript', '@typescript/typescript6']) {\n try {\n const candidate = require(require.resolve(name, { paths }))\n if (typeof candidate.createPrinter === 'function') {\n typescript = candidate as TypeScript\n break\n }\n } catch {}\n }\n if (!typescript) {\n throw new Error(\n '`print` received a TypeScript compiler node, which needs `typescript` 5 or 6, or `@typescript/typescript6`, installed. Pass a printed string instead.',\n )\n }\n\n // One printer serves every call; printing does not mutate the source file, which only lends its compiler options\n const printer = typescript.createPrinter({\n omitTrailingSemicolon: true,\n newLine: typescript.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n })\n const sourceFile = typescript.createSourceFile('print.tsx', '', typescript.ScriptTarget.ES2022, true, typescript.ScriptKind.TSX)\n\n compiler = {\n printNodes: (nodes) => printer.printList(typescript.ListFormat.MultiLine, typescript.factory.createNodeArray(nodes), sourceFile),\n }\n\n return compiler\n}\n\n/**\n * Module specifier that imports `filePath` from the file at `root`: POSIX, relative to that file's directory, `./`-prefixed unless it climbs with `../`.\n */\nexport function getRelativePath(root: string, filePath: string): string {\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n return slashed.startsWith('../') ? slashed : `./${slashed}`\n}\n\n/**\n * Swaps the extension of a relative import/export path for `extname`. Package specifiers and extension-less paths stay as-is.\n */\nexport function resolveOutputPath(path: string, extname: string | undefined, rootAware: boolean): string {\n if (!rootAware) return path\n const current = getExtname(path)\n return current ? `${path.slice(0, -current.length)}${extname ?? ''}` : path\n}\n\n/**\n * Node types this module reads from the yuku AST.\n */\nconst nodeTypes = {\n identifier: 'Identifier',\n literal: 'Literal',\n importDeclaration: 'ImportDeclaration',\n importSpecifier: 'ImportSpecifier',\n importDefaultSpecifier: 'ImportDefaultSpecifier',\n importNamespaceSpecifier: 'ImportNamespaceSpecifier',\n exportAllDeclaration: 'ExportAllDeclaration',\n exportNamedDeclaration: 'ExportNamedDeclaration',\n} as const\n\n/**\n * `importKind` and `exportKind` values this module reads from the yuku AST.\n */\nconst declarationKinds = {\n type: 'type',\n} as const\n\nfunction nameOf(node: ModuleExportName): string {\n return node.type === nodeTypes.literal ? node.value : node.name\n}\n\n/**\n * Converts an import specifier into an `ImportNode` name, keeping the quotes of a string-literal name (`{ 'a-b' as ab }`).\n */\nfunction toImportName({ imported, local }: ImportSpecifier): string | { propertyName: string; name: string } {\n if (imported.type === nodeTypes.identifier && imported.name === local.name) return local.name\n\n return { propertyName: imported.type === nodeTypes.literal ? quoteModulePath(imported.value) : imported.name, name: local.name }\n}\n\n/**\n * Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes or a phase stay as written.\n */\nfunction toImportNodes(statement: ProgramStatement, filePath: string): Array<ast.ImportNode> {\n if (statement.type !== nodeTypes.importDeclaration || !statement.specifiers.length || statement.attributes.length || statement.phase) return []\n\n const specifier = statement.source.value\n const target = specifier.startsWith('.') ? { path: resolve(dirname(filePath), specifier), root: filePath } : { path: specifier }\n const isTypeOnly = statement.importKind === declarationKinds.type\n const nodes: Array<ast.ImportNode> = []\n const named = statement.specifiers.filter((element) => element.type === nodeTypes.importSpecifier)\n\n for (const element of statement.specifiers) {\n if (element.type === nodeTypes.importDefaultSpecifier) nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly }))\n if (element.type === nodeTypes.importNamespaceSpecifier)\n nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly, isNameSpace: true }))\n }\n const values = named.filter((element) => element.importKind !== declarationKinds.type)\n const types = named.filter((element) => element.importKind === declarationKinds.type)\n if (values.length) nodes.push(ast.factory.createImport({ name: values.map(toImportName), ...target, isTypeOnly }))\n if (types.length) nodes.push(ast.factory.createImport({ name: types.map(toImportName), ...target, isTypeOnly: true }))\n\n return nodes\n}\n\n/**\n * Converts an `export … from` declaration into `ExportNode`s. Forms `printExport` cannot print stay as written.\n */\nfunction toExportNodes(statement: ProgramStatement): Array<ast.ExportNode> {\n if (statement.type !== nodeTypes.exportAllDeclaration && statement.type !== nodeTypes.exportNamedDeclaration) return []\n if (!statement.source || statement.attributes.length) return []\n\n const path = statement.source.value\n const isTypeOnly = statement.exportKind === declarationKinds.type\n\n if (statement.type === nodeTypes.exportAllDeclaration) {\n return [\n statement.exported\n ? ast.factory.createExport({ name: nameOf(statement.exported), path, isTypeOnly, asAlias: true })\n : ast.factory.createExport({ path, isTypeOnly }),\n ]\n }\n if (\n statement.specifiers.some(\n (element) =>\n element.exportKind === declarationKinds.type || element.exported.type === nodeTypes.literal || nameOf(element.exported) !== nameOf(element.local),\n )\n )\n return []\n\n return [ast.factory.createExport({ name: statement.specifiers.map((element) => nameOf(element.local)), path, isTypeOnly })]\n}\n\n/**\n * Splits `source` into its lifted `import`/`export … from` nodes, the `header` above the first one (shebang, directives, comments) and the rest as `body`.\n */\nexport function splitModuleDeclarations(\n source: string,\n filePath: string,\n): { header: string; imports: Array<ast.ImportNode>; exports: Array<ast.ExportNode>; body: string } {\n const { program } = parse(source, { lang: 'ts', sourceType: 'module' })\n const imports: Array<ast.ImportNode> = []\n const exports: Array<ast.ExportNode> = []\n let header = ''\n let body = ''\n let cursor = 0\n\n for (const statement of program.body) {\n const importNodes = toImportNodes(statement, filePath)\n const exportNodes = toExportNodes(statement)\n if (!importNodes.length && !exportNodes.length) {\n // Lifted declarations print above the body, so stop at the first one that stays in place to keep the evaluation order.\n if (\n statement.type === nodeTypes.importDeclaration ||\n ((statement.type === nodeTypes.exportNamedDeclaration || statement.type === nodeTypes.exportAllDeclaration) && statement.source)\n )\n break\n continue\n }\n\n const text = source.slice(cursor, statement.start)\n if (imports.length || exports.length) body += text\n else header = text\n imports.push(...importNodes)\n exports.push(...exportNodes)\n cursor = statement.end\n }\n\n return { header: header.trim(), imports, exports, body: `${body}${source.slice(cursor)}`.trim() }\n}\n\n/**\n * Joins the printed `nodes` with `separator`; a `Break` widens the next separator to a blank line, and leading, trailing and repeated breaks fold into one.\n *\n * Imperative on purpose: this runs once per source fragment and `map().filter().join()` showed up in deopt traces.\n */\nfunction printNodes({ nodes, separator }: { nodes: Array<ast.CodeNode> | undefined; separator: '\\n' | '\\n\\n' }): string {\n let result = ''\n let pendingBreak = false\n\n for (const node of nodes ?? []) {\n if (node.kind === 'Break') {\n pendingBreak = result !== ''\n continue\n }\n\n const text = printCodeNode(node)\n if (!text) continue\n\n if (result) result += pendingBreak ? '\\n\\n' : separator\n result += text\n pendingBreak = false\n }\n\n return result\n}\n\n/**\n * Indents every non-empty line of `text` by two spaces.\n */\nfunction indentLines(text: string): string {\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => (line.trim() ? ` ${line}` : ''))\n .join('\\n')\n}\n\n/**\n * Strips the common leading whitespace and the surrounding blank lines, counting tabs and spaces alike, so indented template literals start at column zero.\n */\nfunction dedent(text: string): string {\n if (!text) return ''\n // Most text nodes are one line, so the common indent is its leading whitespace.\n if (!text.includes('\\n')) return text.trim() ? text.trimStart() : ''\n\n const lines = text.split('\\n')\n const isBlank = (line: string) => line.trim() === ''\n\n const start = lines.findIndex((line) => !isBlank(line))\n if (start === -1) return ''\n const end = lines.findLastIndex((line) => !isBlank(line))\n\n const trimmed = lines.slice(start, end + 1)\n // A loop, not `Math.min(...indents)`, which overflows the stack on very long text.\n let min = Infinity\n for (const line of trimmed) {\n if (!isBlank(line)) min = Math.min(min, line.length - line.trimStart().length)\n }\n\n return trimmed.map((line) => (isBlank(line) ? '' : line.slice(min))).join('\\n')\n}\n\n/**\n * Renders `<T>(params): ReturnType`; an async function wraps its return type in `Promise<>`.\n */\nfunction signature({ async: isAsync, generics, params, returnType }: Pick<ast.FunctionNode, 'async' | 'generics' | 'params' | 'returnType'>): string {\n const genericsStr = generics ? `<${Array.isArray(generics) ? generics.join(', ') : generics}>` : ''\n const wrapped = isAsync ? `Promise<${returnType}>` : returnType\n const returnTypeStr = returnType ? `: ${wrapped}` : ''\n\n return `${genericsStr}(${params ?? ''})${returnTypeStr}`\n}\n\n/**\n * Puts the JSDoc block, when it renders to something, above `declaration`.\n */\nfunction withJSDoc({ jsDoc, declaration }: { jsDoc?: ast.JSDocNode | null; declaration: string }): string {\n const jsDocStr = jsDoc ? printJSDoc(jsDoc) : ''\n\n return jsDocStr ? `${jsDocStr}\\n${declaration}` : declaration\n}\n\n/**\n * Joins printed code fragments with a newline.\n *\n * Passing TypeScript compiler nodes still works but is deprecated and needs `typescript` 5 or 6, or `@typescript/typescript6`, installed.\n * Support for compiler nodes is removed in the next major.\n */\nexport function print(...elements: Array<string | TsNode>): string {\n const filtered = elements.filter(Boolean)\n if (filtered.length === 0) return ''\n if (filtered.every((element) => typeof element === 'string')) return filtered.join('\\n')\n // Printing compiler nodes as one list keeps the output byte-for-byte the same as before strings were accepted\n if (filtered.every((element) => typeof element !== 'string')) return loadCompiler().printNodes(filtered)\n\n return filtered.map((element) => (typeof element === 'string' ? element : loadCompiler().printNodes([element]).trimEnd())).join('\\n')\n}\n\n/**\n * Converts a {@link ast.JSDocNode} to a `/** … *\\/` block, dropping blank comments.\n */\nfunction printJSDoc(jsDoc: ast.JSDocNode): string {\n const comments = (jsDoc.comments ?? []).filter((c) => c != null)\n if (comments.length === 0) return ''\n\n const lines = comments\n .flatMap((c) => c.split(/\\r?\\n/))\n .map((l) => l.replace(/\\*\\//g, '* /').replace(/\\r/g, ''))\n .filter((l) => l.trim().length > 0)\n\n if (lines.length === 0) return ''\n\n return ['/**', ...lines.map((l) => ` * ${l}`), ' */'].join('\\n')\n}\n\n/**\n * Converts a {@link ast.ConstNode} to a `const` declaration, mirroring the `Const` component from `@kubb/renderer-jsx`.\n */\nfunction printConst(node: ast.ConstNode): string {\n const { name, export: canExport, type, JSDoc, asConst, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}const ${name}${type ? `: ${type}` : ''} = ${printNodes({ nodes, separator: '\\n' })}${asConst ? ' as const' : ''}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.TypeNode} to a `type` alias, mirroring the `Type` component from `@kubb/renderer-jsx`.\n */\nfunction printType(node: ast.TypeNode): string {\n const { name, export: canExport, JSDoc, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}type ${name} = ${printNodes({ nodes, separator: '\\n' })}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.FunctionNode} to a `function` declaration, mirroring the `Function` component from `@kubb/renderer-jsx`.\n */\nfunction printFunction(node: ast.FunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes } = node\n\n const body = indentLines(printNodes({ nodes, separator: '\\n' }))\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}${isAsync ? 'async ' : ''}`\n const declaration = `${prefix}function ${name}${signature({ async: isAsync, generics, params, returnType })} {${body ? `\\n${body}\\n` : ''}}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts an {@link ast.ArrowFunctionNode} to a `const` arrow function, mirroring the `Function.Arrow` component from `@kubb/renderer-jsx`.\n */\nfunction printArrowFunction(node: ast.ArrowFunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes, singleLine } = node\n\n const body = printNodes({ nodes, separator: '\\n' })\n const arrowBody = singleLine ? ` => ${body}` : body ? ` => {\\n${indentLines(body)}\\n}` : ' => {}'\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}`\n const declaration = `${prefix}const ${name} = ${isAsync ? 'async ' : ''}${signature({ async: isAsync, generics, params, returnType })}${arrowBody}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Dispatches a {@link ast.CodeNode} to the printer for its `kind`.\n */\nfunction printCodeNode(node: ast.CodeNode): string {\n switch (node.kind) {\n case 'Break':\n return ''\n case 'Text':\n case 'Jsx':\n return dedent(node.value)\n case 'Const':\n return printConst(node)\n case 'Type':\n return printType(node)\n case 'Function':\n return printFunction(node)\n case 'ArrowFunction':\n return printArrowFunction(node)\n }\n}\n\n/**\n * Prints a {@link ast.SourceNode} with a blank line between its top-level nodes.\n */\nexport function printSource(node: ast.SourceNode): string {\n return printNodes({ nodes: node.nodes, separator: '\\n\\n' })\n}\n\n/**\n * Wraps a module specifier in single quotes, escaping embedded backslashes and quotes.\n */\nfunction quoteModulePath(path: string): string {\n return `'${path.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\n/**\n * Renders an `import` declaration (default, `* as`, or named with `{ a as b }`, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printImport({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: Pick<ast.ImportNode, 'name' | 'path' | 'isTypeOnly' | 'isNameSpace'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (!Array.isArray(name)) {\n if (isNameSpace) return `import ${typePrefix}* as ${name} from ${from}`\n return `import ${typePrefix}${name} from ${from}`\n }\n\n const specifiers = name.map((item) => {\n if (typeof item === 'object') {\n return item.name ? `${item.propertyName} as ${item.name}` : item.propertyName\n }\n return item\n })\n\n return `import ${typePrefix}{ ${specifiers.join(', ')} } from ${from}`\n}\n\n/**\n * Renders an `export … from` declaration (named, `* as name`, or wildcard, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printExport({ path, name, isTypeOnly = false, asAlias = false }: Pick<ast.ExportNode, 'name' | 'path' | 'isTypeOnly' | 'asAlias'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (Array.isArray(name)) {\n return `export ${typePrefix}{ ${name.join(', ')} } from ${from}`\n }\n\n if (asAlias && name) {\n // An identifier cannot start with a digit, so swap the digit for `_`\n const parsedName = /^\\d/.test(name) ? `_${name.slice(1)}` : name\n return `export ${typePrefix}* as ${parsedName} from ${from}`\n }\n\n if (name) {\n return `export ${typePrefix}{ ${name} } from ${from}`\n }\n\n return `export ${typePrefix}* from ${from}`\n}\n","import { ast } from '@kubb/ast'\nimport { defineExtension } from '@kubb/core'\nimport { compatibility } from '../kubb-extension.json'\nimport { version } from '../package.json'\nimport { getRelativePath, print, printExport, printImport, printSource, resolveOutputPath, splitModuleDeclarations, type TsNode } from './utils.ts'\n\nconst DEFAULT_EXTENSION: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''> = { '.ts': '' }\n\n/**\n * Options accepted by `parserTs` and `parserTsx`.\n */\nexport type ParserTsOptions = {\n /**\n * Rewrite extensions on relative `import`/`export` statements. Each key is the extension of a\n * generated file, and its value is the extension written on the relative specifiers in that\n * file. `''` drops it, and so does a generated file whose extension has no key. Package\n * specifiers stay unchanged. Also applies to relative paths in `copy` templates.\n *\n * Use `{ '.ts': '.js' }` for ESM output compiled to JavaScript, or `{ '.ts': '.ts' }` to run the\n * `.ts` files directly in Node.js or compile them with `rewriteRelativeImportExtensions`.\n *\n * @default { '.ts': '' }\n * @example\n * ```ts\n * parserTs({ extension: { '.ts': '.js' } }) // import './api.js' instead of './api'\n * parserTs({ extension: { '.ts': '.ts' } }) // import './api.ts' instead of './api'\n * ```\n */\n extension?: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''>\n}\n\n/**\n * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST\n * produced by an adapter and prints it as TypeScript source. Imports and exports\n * are rewritten based on each file's metadata and the `extension` option.\n *\n * Used automatically when no `parsers` option is set on `defineConfig`. Use\n * `parserTsx` instead for React projects that emit JSX.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTs } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTs()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTs = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'typescript', version, compatibility, issues: 'https://github.com/kubb-labs/kubb/issues' },\n build({ extension = DEFAULT_EXTENSION }) {\n return {\n extNames: ['.ts', '.js'],\n print,\n parse(file) {\n const extname = extension[file.extname] || undefined\n\n const source = file.sources\n .map((item) => printSource(item))\n .filter(Boolean)\n .map((text) => text.trimEnd())\n .join('\\n\\n')\n\n const importLines = file.imports.map((item) =>\n printImport({\n ...item,\n path: resolveOutputPath(item.root ? getRelativePath(item.root, item.path) : item.path, extname, Boolean(item.root)),\n }),\n )\n\n const exportLines = file.exports.map((item) => printExport({ ...item, path: resolveOutputPath(item.path, extname, item.path.startsWith('.')) }))\n\n const importExportBlock = [...importLines, ...exportLines].join('\\n')\n\n const parts = [file.banner, importExportBlock, source, file.footer].filter((segment): segment is string => Boolean(segment)).map((s) => s.trimEnd())\n\n return parts.join('\\n\\n')\n },\n copy(file, source) {\n const { header, imports, exports, body } = splitModuleDeclarations(source, file.path)\n\n return {\n ...file,\n banner: [header, file.banner].filter(Boolean).join('\\n') || undefined,\n imports: [...file.imports, ...imports],\n exports: [...file.exports, ...exports],\n sources: [ast.factory.createSource({ nodes: [ast.factory.createText(body)] })],\n }\n },\n }\n },\n})\n","import { defineExtension } from '@kubb/core'\nimport { parserTs, type ParserTsOptions } from './parserTs.ts'\nimport type { TsNode } from './utils.ts'\n\n/**\n * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs`, since JSX\n * prints as text the same way, so it shares the same `extension` option.\n *\n * Add to the `parsers` array on `defineConfig` when generating components for\n * React (or any framework that emits JSX).\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTsx } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTsx()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTsx = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'tsx', issues: 'https://github.com/kubb-labs/kubb/issues' },\n build: (options) => ({ ...parserTs(options), extNames: ['.tsx', '.jsx'] }),\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["getExtname","extname"],"sources":["../kubb-extension.json","../package.json","../src/inline.ts","../src/utils.ts","../src/parserTs.ts","../src/parserTsx.ts"],"sourcesContent":["","","import type { ast } from '@kubb/ast'\nimport { parse, TokenKind } from 'yuku-parser'\n\n// A name followed by `:` or `?:` right after one of these is a key or parameter name (`{ Name: x }`, `(Name: x)`).\nconst keyStarts = new Set<number>([TokenKind.LeftBrace, TokenKind.Comma, TokenKind.Semicolon, TokenKind.LeftParen])\n\n/**\n * Calls `replace` for every identifier that references something, and swaps in what it returns.\n * yuku's tokens leave out strings, comments and template text; member access (`x.Name`) and keys are skipped here.\n */\nexport function replaceIdentifiers(text: string, replace: (name: string) => string | undefined, lang: 'ts' | 'tsx' = 'ts'): string {\n // Generated fragments such as `options: Options<Pet>` are not whole programs; yuku still tokenizes them.\n const tokens = parse(text, { lang, sourceType: 'module', tokens: true }).tokens!\n\n // `TokenList` is indexed, not iterable; a plain array also makes the neighbours of a token `undefined` at the ends.\n const kinds = Array.from({ length: tokens.length }, (_, i) => tokens.kind(i))\n\n let out = ''\n let last = 0\n\n for (const [i, kind] of kinds.entries()) {\n if (kind !== TokenKind.Identifier || kinds[i - 1] === TokenKind.Dot || kinds[i - 1] === TokenKind.OptionalChaining) continue\n const isKey = kinds[i + 1] === TokenKind.Colon || (kinds[i + 1] === TokenKind.Question && kinds[i + 2] === TokenKind.Colon)\n // `? Name :` in a conditional type is a reference.\n if (isKey && (i === 0 || tokens.newlineBefore(i) || keyStarts.has(kinds[i - 1]!))) continue\n\n const replacement = replace(tokens.text(i))\n if (replacement === undefined) continue\n out += text.slice(last, tokens.start(i)) + replacement\n last = tokens.end(i)\n }\n\n return out + text.slice(last)\n}\n\nfunction createInline(lang: 'ts' | 'tsx'): ast.InlineLanguage {\n return {\n replaceIdentifiers: (text, replace) => replaceIdentifiers(text, replace, lang),\n wrap: (expression) => (/^[\\w$.]+$/.test(expression) ? expression : `(${expression})`),\n }\n}\n\n/**\n * Inline support for TypeScript and JavaScript files: identifiers are found with {@link replaceIdentifiers},\n * and a definition that is more than a name or a dotted path goes in parentheses.\n */\nexport const inlineTs = createInline('ts')\n\n/**\n * {@link inlineTs} for `.tsx` and `.jsx` files, where JSX text and attribute names are not identifiers.\n */\nexport const inlineTsx = createInline('tsx')\n","import { createRequire } from 'node:module'\nimport { dirname, extname as getExtname, relative, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { ast } from '@kubb/ast'\nimport { type ImportSpecifier, type ModuleExportName, parse, type ProgramStatement } from 'yuku-parser'\n\n/**\n * A TypeScript compiler node, typed structurally so `@kubb/parser-ts` does not depend on `@typescript/typescript6`.\n *\n * @deprecated Pass printed strings to `print` instead. Support for compiler nodes is removed in the next major.\n */\nexport type TsNode = { readonly kind: number }\n\ntype Compiler = {\n printNodes: (nodes: Array<TsNode>) => string\n}\n\nlet compiler: Compiler | undefined\n\n// The parts of the TypeScript 6 API that printing compiler nodes uses, typed here so no package depends on it\ntype TypeScript = {\n createPrinter(options: { omitTrailingSemicolon: boolean; newLine: number; removeComments: boolean; noEmitHelpers: boolean }): {\n printList(format: number, list: unknown, sourceFile: unknown): string\n }\n createSourceFile(fileName: string, text: string, target: number, setParentNodes: boolean, kind: number): unknown\n factory: { createNodeArray(nodes: Array<TsNode>): unknown }\n NewLineKind: { LineFeed: number }\n ScriptTarget: { ES2022: number }\n ScriptKind: { TSX: number }\n ListFormat: { MultiLine: number }\n}\n\n/**\n * Loads TypeScript the first time `print` gets a compiler node. Strings never need it, so bundles for edge runtimes such as Cloudflare Workers leave it out.\n *\n * Loaded with `require`, not `import`: when ESM imports a CommonJS package, Node keeps a second copy of its source\n * to detect named exports, and for TypeScript that copy is about 9 MB.\n */\nfunction loadCompiler(): Compiler {\n if (compiler) return compiler\n\n const require = createRequire(import.meta.url)\n // Look in the user's project first: a strict package manager such as pnpm does not link it next to this package\n const paths = [process.cwd(), dirname(fileURLToPath(import.meta.url))]\n let typescript: TypeScript | undefined\n // `typescript` 5 and 6 ship the compiler API; next to TypeScript 7 it comes from `@typescript/typescript6`\n for (const name of ['typescript', '@typescript/typescript6']) {\n try {\n const candidate = require(require.resolve(name, { paths }))\n if (typeof candidate.createPrinter === 'function') {\n typescript = candidate as TypeScript\n break\n }\n } catch {}\n }\n if (!typescript) {\n throw new Error(\n '`print` received a TypeScript compiler node, which needs `typescript` 5 or 6, or `@typescript/typescript6`, installed. Pass a printed string instead.',\n )\n }\n\n // One printer serves every call; printing does not mutate the source file, which only lends its compiler options\n const printer = typescript.createPrinter({\n omitTrailingSemicolon: true,\n newLine: typescript.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n })\n const sourceFile = typescript.createSourceFile('print.tsx', '', typescript.ScriptTarget.ES2022, true, typescript.ScriptKind.TSX)\n\n compiler = {\n printNodes: (nodes) => printer.printList(typescript.ListFormat.MultiLine, typescript.factory.createNodeArray(nodes), sourceFile),\n }\n\n return compiler\n}\n\n/**\n * Module specifier that imports `filePath` from the file at `root`: POSIX, relative to that file's directory, `./`-prefixed unless it climbs with `../`.\n */\nexport function getRelativePath(root: string, filePath: string): string {\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n return slashed.startsWith('../') ? slashed : `./${slashed}`\n}\n\n/**\n * Swaps the extension of a relative import/export path for `extname`. Package specifiers and extension-less paths stay as-is.\n */\nexport function resolveOutputPath(path: string, extname: string | undefined, rootAware: boolean): string {\n if (!rootAware) return path\n const current = getExtname(path)\n return current ? `${path.slice(0, -current.length)}${extname ?? ''}` : path\n}\n\n/**\n * Node types this module reads from the yuku AST.\n */\nconst nodeTypes = {\n identifier: 'Identifier',\n literal: 'Literal',\n importDeclaration: 'ImportDeclaration',\n importSpecifier: 'ImportSpecifier',\n importDefaultSpecifier: 'ImportDefaultSpecifier',\n importNamespaceSpecifier: 'ImportNamespaceSpecifier',\n exportAllDeclaration: 'ExportAllDeclaration',\n exportNamedDeclaration: 'ExportNamedDeclaration',\n} as const\n\n/**\n * `importKind` and `exportKind` values this module reads from the yuku AST.\n */\nconst declarationKinds = {\n type: 'type',\n} as const\n\nfunction nameOf(node: ModuleExportName): string {\n return node.type === nodeTypes.literal ? node.value : node.name\n}\n\n/**\n * Converts an import specifier into an `ImportNode` name, keeping the quotes of a string-literal name (`{ 'a-b' as ab }`).\n */\nfunction toImportName({ imported, local }: ImportSpecifier): string | { propertyName: string; name: string } {\n if (imported.type === nodeTypes.identifier && imported.name === local.name) return local.name\n\n return { propertyName: imported.type === nodeTypes.literal ? quoteModulePath(imported.value) : imported.name, name: local.name }\n}\n\n/**\n * Converts an `import` declaration into `ImportNode`s. Side-effect imports and imports with attributes or a phase stay as written.\n */\nfunction toImportNodes(statement: ProgramStatement, filePath: string): Array<ast.ImportNode> {\n if (statement.type !== nodeTypes.importDeclaration || !statement.specifiers.length || statement.attributes.length || statement.phase) return []\n\n const specifier = statement.source.value\n const target = specifier.startsWith('.') ? { path: resolve(dirname(filePath), specifier), root: filePath } : { path: specifier }\n const isTypeOnly = statement.importKind === declarationKinds.type\n const nodes: Array<ast.ImportNode> = []\n const named = statement.specifiers.filter((element) => element.type === nodeTypes.importSpecifier)\n\n for (const element of statement.specifiers) {\n if (element.type === nodeTypes.importDefaultSpecifier) nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly }))\n if (element.type === nodeTypes.importNamespaceSpecifier)\n nodes.push(ast.factory.createImport({ name: element.local.name, ...target, isTypeOnly, isNameSpace: true }))\n }\n const values = named.filter((element) => element.importKind !== declarationKinds.type)\n const types = named.filter((element) => element.importKind === declarationKinds.type)\n if (values.length) nodes.push(ast.factory.createImport({ name: values.map(toImportName), ...target, isTypeOnly }))\n if (types.length) nodes.push(ast.factory.createImport({ name: types.map(toImportName), ...target, isTypeOnly: true }))\n\n return nodes\n}\n\n/**\n * Converts an `export … from` declaration into `ExportNode`s. Forms `printExport` cannot print stay as written.\n */\nfunction toExportNodes(statement: ProgramStatement): Array<ast.ExportNode> {\n if (statement.type !== nodeTypes.exportAllDeclaration && statement.type !== nodeTypes.exportNamedDeclaration) return []\n if (!statement.source || statement.attributes.length) return []\n\n const path = statement.source.value\n const isTypeOnly = statement.exportKind === declarationKinds.type\n\n if (statement.type === nodeTypes.exportAllDeclaration) {\n return [\n statement.exported\n ? ast.factory.createExport({ name: nameOf(statement.exported), path, isTypeOnly, asAlias: true })\n : ast.factory.createExport({ path, isTypeOnly }),\n ]\n }\n if (\n statement.specifiers.some(\n (element) =>\n element.exportKind === declarationKinds.type || element.exported.type === nodeTypes.literal || nameOf(element.exported) !== nameOf(element.local),\n )\n )\n return []\n\n return [ast.factory.createExport({ name: statement.specifiers.map((element) => nameOf(element.local)), path, isTypeOnly })]\n}\n\n/**\n * Splits `source` into its lifted `import`/`export … from` nodes, the `header` above the first one (shebang, directives, comments) and the rest as `body`.\n */\nexport function splitModuleDeclarations(\n source: string,\n filePath: string,\n): { header: string; imports: Array<ast.ImportNode>; exports: Array<ast.ExportNode>; body: string } {\n const { program } = parse(source, { lang: 'ts', sourceType: 'module' })\n const imports: Array<ast.ImportNode> = []\n const exports: Array<ast.ExportNode> = []\n let header = ''\n let body = ''\n let cursor = 0\n\n for (const statement of program.body) {\n const importNodes = toImportNodes(statement, filePath)\n const exportNodes = toExportNodes(statement)\n if (!importNodes.length && !exportNodes.length) {\n // Lifted declarations print above the body, so stop at the first one that stays in place to keep the evaluation order.\n if (\n statement.type === nodeTypes.importDeclaration ||\n ((statement.type === nodeTypes.exportNamedDeclaration || statement.type === nodeTypes.exportAllDeclaration) && statement.source)\n )\n break\n continue\n }\n\n const text = source.slice(cursor, statement.start)\n if (imports.length || exports.length) body += text\n else header = text\n imports.push(...importNodes)\n exports.push(...exportNodes)\n cursor = statement.end\n }\n\n return { header: header.trim(), imports, exports, body: `${body}${source.slice(cursor)}`.trim() }\n}\n\n/**\n * Joins the printed `nodes` with `separator`; a `Break` widens the next separator to a blank line, and leading, trailing and repeated breaks fold into one.\n *\n * Imperative on purpose: this runs once per source fragment and `map().filter().join()` showed up in deopt traces.\n */\nfunction printNodes({ nodes, separator }: { nodes: Array<ast.CodeNode> | undefined; separator: '\\n' | '\\n\\n' }): string {\n let result = ''\n let pendingBreak = false\n\n for (const node of nodes ?? []) {\n if (node.kind === ast.nodeKinds.break) {\n pendingBreak = result !== ''\n continue\n }\n\n const text = printCodeNode(node)\n if (!text) continue\n\n if (result) result += pendingBreak ? '\\n\\n' : separator\n result += text\n pendingBreak = false\n }\n\n return result\n}\n\n/**\n * Indents every non-empty line of `text` by two spaces.\n */\nfunction indentLines(text: string): string {\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => (line.trim() ? ` ${line}` : ''))\n .join('\\n')\n}\n\n/**\n * Strips the common leading whitespace and the surrounding blank lines, counting tabs and spaces alike, so indented template literals start at column zero.\n */\nfunction dedent(text: string): string {\n if (!text) return ''\n // Most text nodes are one line, so the common indent is its leading whitespace.\n if (!text.includes('\\n')) return text.trim() ? text.trimStart() : ''\n\n const lines = text.split('\\n')\n const isBlank = (line: string) => line.trim() === ''\n\n const start = lines.findIndex((line) => !isBlank(line))\n if (start === -1) return ''\n const end = lines.findLastIndex((line) => !isBlank(line))\n\n const trimmed = lines.slice(start, end + 1)\n // A loop, not `Math.min(...indents)`, which overflows the stack on very long text.\n let min = Infinity\n for (const line of trimmed) {\n if (!isBlank(line)) min = Math.min(min, line.length - line.trimStart().length)\n }\n\n return trimmed.map((line) => (isBlank(line) ? '' : line.slice(min))).join('\\n')\n}\n\n/**\n * Renders `<T>(params): ReturnType`; an async function wraps its return type in `Promise<>`.\n */\nfunction signature({ async: isAsync, generics, params, returnType }: Pick<ast.FunctionNode, 'async' | 'generics' | 'params' | 'returnType'>): string {\n const genericsStr = generics ? `<${Array.isArray(generics) ? generics.join(', ') : generics}>` : ''\n const wrapped = isAsync ? `Promise<${returnType}>` : returnType\n const returnTypeStr = returnType ? `: ${wrapped}` : ''\n\n return `${genericsStr}(${params ?? ''})${returnTypeStr}`\n}\n\n/**\n * Puts the JSDoc block, when it renders to something, above `declaration`.\n */\nfunction withJSDoc({ jsDoc, declaration }: { jsDoc?: ast.JSDocNode | null; declaration: string }): string {\n const jsDocStr = jsDoc ? printJSDoc(jsDoc) : ''\n\n return jsDocStr ? `${jsDocStr}\\n${declaration}` : declaration\n}\n\n/**\n * Joins printed code fragments with a newline.\n *\n * Passing TypeScript compiler nodes still works but is deprecated and needs `typescript` 5 or 6, or `@typescript/typescript6`, installed.\n * Support for compiler nodes is removed in the next major.\n */\nexport function print(...elements: Array<string | TsNode>): string {\n const filtered = elements.filter(Boolean)\n if (filtered.length === 0) return ''\n if (filtered.every((element) => typeof element === 'string')) return filtered.join('\\n')\n // Printing compiler nodes as one list keeps the output byte-for-byte the same as before strings were accepted\n if (filtered.every((element) => typeof element !== 'string')) return loadCompiler().printNodes(filtered)\n\n return filtered.map((element) => (typeof element === 'string' ? element : loadCompiler().printNodes([element]).trimEnd())).join('\\n')\n}\n\n/**\n * Converts a {@link ast.JSDocNode} to a `/** … *\\/` block, dropping blank comments.\n */\nfunction printJSDoc(jsDoc: ast.JSDocNode): string {\n const comments = (jsDoc.comments ?? []).filter((c) => c != null)\n if (comments.length === 0) return ''\n\n const lines = comments\n .flatMap((c) => c.split(/\\r?\\n/))\n .map((l) => l.replace(/\\*\\//g, '* /').replace(/\\r/g, ''))\n .filter((l) => l.trim().length > 0)\n\n if (lines.length === 0) return ''\n\n return ['/**', ...lines.map((l) => ` * ${l}`), ' */'].join('\\n')\n}\n\n/**\n * Converts a {@link ast.ConstNode} to a `const` declaration, mirroring the `Const` component from `@kubb/renderer-jsx`.\n */\nfunction printConst(node: ast.ConstNode): string {\n const { name, export: canExport, type, JSDoc, asConst, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}const ${name}${type ? `: ${type}` : ''} = ${printNodes({ nodes, separator: '\\n' })}${asConst ? ' as const' : ''}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.TypeNode} to a `type` alias, mirroring the `Type` component from `@kubb/renderer-jsx`.\n */\nfunction printType(node: ast.TypeNode): string {\n const { name, export: canExport, JSDoc, nodes } = node\n\n const declaration = `${canExport ? 'export ' : ''}type ${name} = ${printNodes({ nodes, separator: '\\n' })}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts a {@link ast.FunctionNode} to a `function` declaration, mirroring the `Function` component from `@kubb/renderer-jsx`.\n */\nfunction printFunction(node: ast.FunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes } = node\n\n const body = indentLines(printNodes({ nodes, separator: '\\n' }))\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}${isAsync ? 'async ' : ''}`\n const declaration = `${prefix}function ${name}${signature({ async: isAsync, generics, params, returnType })} {${body ? `\\n${body}\\n` : ''}}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Converts an {@link ast.ArrowFunctionNode} to a `const` arrow function, mirroring the `Function.Arrow` component from `@kubb/renderer-jsx`.\n */\nfunction printArrowFunction(node: ast.ArrowFunctionNode): string {\n const { name, default: isDefault, export: canExport, async: isAsync, generics, params, returnType, JSDoc, nodes, singleLine } = node\n\n const body = printNodes({ nodes, separator: '\\n' })\n const arrowBody = singleLine ? ` => ${body}` : body ? ` => {\\n${indentLines(body)}\\n}` : ' => {}'\n const prefix = `${canExport ? 'export ' : ''}${isDefault ? 'default ' : ''}`\n const declaration = `${prefix}const ${name} = ${isAsync ? 'async ' : ''}${signature({ async: isAsync, generics, params, returnType })}${arrowBody}`\n\n return withJSDoc({ jsDoc: JSDoc, declaration })\n}\n\n/**\n * Dispatches a {@link ast.CodeNode} to the printer for its `kind`.\n */\nfunction printCodeNode(node: ast.CodeNode): string {\n switch (node.kind) {\n case ast.nodeKinds.break:\n return ''\n case ast.nodeKinds.text:\n case ast.nodeKinds.jsx:\n return dedent(node.value)\n case ast.nodeKinds.const:\n return printConst(node)\n case ast.nodeKinds.type:\n return printType(node)\n case ast.nodeKinds.function:\n return printFunction(node)\n case ast.nodeKinds.arrowFunction:\n return printArrowFunction(node)\n }\n}\n\n/**\n * Prints a {@link ast.SourceNode} with a blank line between its top-level nodes.\n */\nexport function printSource(node: ast.SourceNode): string {\n return printNodes({ nodes: node.nodes, separator: '\\n\\n' })\n}\n\n/**\n * Wraps a module specifier in single quotes, escaping embedded backslashes and quotes.\n */\nfunction quoteModulePath(path: string): string {\n return `'${path.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\n/**\n * Renders an `import` declaration (default, `* as`, or named with `{ a as b }`, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printImport({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: Pick<ast.ImportNode, 'name' | 'path' | 'isTypeOnly' | 'isNameSpace'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (!Array.isArray(name)) {\n if (isNameSpace) return `import ${typePrefix}* as ${name} from ${from}`\n return `import ${typePrefix}${name} from ${from}`\n }\n\n const specifiers = name.map((item) => {\n if (typeof item === 'object') {\n return item.name ? `${item.propertyName} as ${item.name}` : item.propertyName\n }\n return item\n })\n\n return `import ${typePrefix}{ ${specifiers.join(', ')} } from ${from}`\n}\n\n/**\n * Renders an `export … from` declaration (named, `* as name`, or wildcard, each optionally `type`-only). `path` is used verbatim, so resolve it first.\n */\nexport function printExport({ path, name, isTypeOnly = false, asAlias = false }: Pick<ast.ExportNode, 'name' | 'path' | 'isTypeOnly' | 'asAlias'>): string {\n const typePrefix = isTypeOnly ? 'type ' : ''\n const from = quoteModulePath(path)\n\n if (Array.isArray(name)) {\n return `export ${typePrefix}{ ${name.join(', ')} } from ${from}`\n }\n\n if (asAlias && name) {\n // An identifier cannot start with a digit, so swap the digit for `_`\n const parsedName = /^\\d/.test(name) ? `_${name.slice(1)}` : name\n return `export ${typePrefix}* as ${parsedName} from ${from}`\n }\n\n if (name) {\n return `export ${typePrefix}{ ${name} } from ${from}`\n }\n\n return `export ${typePrefix}* from ${from}`\n}\n","import { ast } from '@kubb/ast'\nimport { defineExtension } from '@kubb/core'\nimport { compatibility } from '../kubb-extension.json'\nimport { version } from '../package.json'\nimport { inlineTs } from './inline.ts'\nimport { getRelativePath, print, printExport, printImport, printSource, resolveOutputPath, splitModuleDeclarations, type TsNode } from './utils.ts'\n\nconst DEFAULT_EXTENSION: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''> = { '.ts': '' }\n\n/**\n * Options accepted by `parserTs` and `parserTsx`.\n */\nexport type ParserTsOptions = {\n /**\n * Rewrite extensions on relative `import`/`export` statements. Each key is the extension of a\n * generated file, and its value is the extension written on the relative specifiers in that\n * file. `''` drops it, and so does a generated file whose extension has no key. Package\n * specifiers stay unchanged. Also applies to relative paths in `copy` templates.\n *\n * Use `{ '.ts': '.js' }` for ESM output compiled to JavaScript, or `{ '.ts': '.ts' }` to run the\n * `.ts` files directly in Node.js or compile them with `rewriteRelativeImportExtensions`.\n *\n * @default { '.ts': '' }\n * @example\n * ```ts\n * parserTs({ extension: { '.ts': '.js' } }) // import './api.js' instead of './api'\n * parserTs({ extension: { '.ts': '.ts' } }) // import './api.ts' instead of './api'\n * ```\n */\n extension?: Record<ast.FileNode['extname'], ast.FileNode['extname'] | ''>\n}\n\n/**\n * Default Kubb parser for `.ts` and `.js` files. Takes the universal AST\n * produced by an adapter and prints it as TypeScript source. Imports and exports\n * are rewritten based on each file's metadata and the `extension` option.\n *\n * Used automatically when no `parsers` option is set on `defineConfig`. Use\n * `parserTsx` instead for React projects that emit JSX.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTs } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTs()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTs = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'typescript', version, compatibility, issues: 'https://github.com/kubb-labs/kubb/issues' },\n build({ extension = DEFAULT_EXTENSION }) {\n return {\n extNames: ['.ts', '.js'],\n print,\n inline: inlineTs,\n parse(file) {\n const extname = extension[file.extname] || undefined\n\n const source = file.sources\n .map((item) => printSource(item))\n .filter(Boolean)\n .map((text) => text.trimEnd())\n .join('\\n\\n')\n\n const importLines = file.imports.map((item) =>\n printImport({\n ...item,\n path: resolveOutputPath(item.root ? getRelativePath(item.root, item.path) : item.path, extname, Boolean(item.root)),\n }),\n )\n\n const exportLines = file.exports.map((item) => printExport({ ...item, path: resolveOutputPath(item.path, extname, item.path.startsWith('.')) }))\n\n const importExportBlock = [...importLines, ...exportLines].join('\\n')\n\n const parts = [file.banner, importExportBlock, source, file.footer].filter((segment): segment is string => Boolean(segment)).map((s) => s.trimEnd())\n\n return parts.join('\\n\\n')\n },\n copy(file, source) {\n const { header, imports, exports, body } = splitModuleDeclarations(source, file.path)\n\n return {\n ...file,\n banner: [header, file.banner].filter(Boolean).join('\\n') || undefined,\n imports: [...file.imports, ...imports],\n exports: [...file.exports, ...exports],\n sources: [ast.factory.createSource({ nodes: [ast.factory.createText(body)] })],\n }\n },\n }\n },\n})\n","import { defineExtension } from '@kubb/core'\nimport { inlineTsx } from './inline.ts'\nimport { parserTs, type ParserTsOptions } from './parserTs.ts'\nimport type { TsNode } from './utils.ts'\n\n/**\n * Kubb parser for `.tsx` and `.jsx` files. Delegates to `parserTs`, since JSX\n * prints as text the same way, so it shares the same `extension` option.\n *\n * Add to the `parsers` array on `defineConfig` when generating components for\n * React (or any framework that emits JSX).\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { adapterOas } from '@kubb/adapter-oas'\n * import { parserTsx } from '@kubb/parser-ts'\n *\n * export default defineConfig({\n * input: './petStore.yaml',\n * output: { path: './src/gen' },\n * adapter: adapterOas(),\n * parsers: [parserTsx()],\n * plugins: [],\n * })\n * ```\n */\nexport const parserTsx = defineExtension<ParserTsOptions, object, string | TsNode>({\n kind: 'parser',\n meta: { name: 'tsx', issues: 'https://github.com/kubb-labs/kubb/issues' },\n build: (options) => ({ ...parserTs(options), extNames: ['.tsx', '.jsx'], inline: inlineTsx }),\n})\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/parser-ts",
3
- "version": "5.13.0",
3
+ "version": "5.14.0",
4
4
  "description": "TypeScript and TSX parser for Kubb. Prints AST nodes as TypeScript and TSX source, with imports, exports and JSDoc.",
5
5
  "keywords": [
6
6
  "codegen",
@@ -64,8 +64,8 @@
64
64
  "registry": "https://registry.npmjs.org/"
65
65
  },
66
66
  "dependencies": {
67
- "@kubb/ast": "5.13.0",
68
- "@kubb/core": "5.13.0",
67
+ "@kubb/ast": "5.14.0",
68
+ "@kubb/core": "5.14.0",
69
69
  "yuku-parser": "^0.19.0"
70
70
  },
71
71
  "engines": {