@kubb/parser-ts 5.15.1 → 5.15.3
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 +7 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -11,7 +11,7 @@ var compatibility = {
|
|
|
11
11
|
"node": ">=22.22"
|
|
12
12
|
};
|
|
13
13
|
// package.json
|
|
14
|
-
var version = "5.15.
|
|
14
|
+
var version = "5.15.3";
|
|
15
15
|
// src/inline.ts
|
|
16
16
|
const keyStarts = /* @__PURE__ */ new Set([
|
|
17
17
|
yuku_parser.TokenKind.LeftBrace,
|
|
@@ -67,11 +67,15 @@ let compiler;
|
|
|
67
67
|
*/
|
|
68
68
|
function loadCompiler() {
|
|
69
69
|
if (compiler) return compiler;
|
|
70
|
-
|
|
70
|
+
process.emitWarning("Printing TypeScript compiler nodes with `print` from `@kubb/parser-ts` is deprecated and is removed in the next major. Return printed strings from printer handlers instead.", {
|
|
71
|
+
type: "DeprecationWarning",
|
|
72
|
+
code: "KUBB_PRINT_TS_NODE"
|
|
73
|
+
});
|
|
74
|
+
const requireModule = (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href);
|
|
71
75
|
const paths = [process.cwd(), (0, node_path.dirname)((0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href))];
|
|
72
76
|
let typescript;
|
|
73
77
|
for (const name of ["typescript", "@typescript/typescript6"]) try {
|
|
74
|
-
const candidate =
|
|
78
|
+
const candidate = requireModule(requireModule.resolve(name, { paths }));
|
|
75
79
|
if (typeof candidate.createPrinter === "function") {
|
|
76
80
|
typescript = candidate;
|
|
77
81
|
break;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["TokenKind","parse","require","createRequire","dirname","fileURLToPath","isAbsolute","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, isAbsolute, 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 // A relative input resolves against the working directory, so that directory is part of its key.\n const key = isAbsolute(root) && isAbsolute(filePath) ? `${root}\\u0000${filePath}` : `${process.cwd()}\\u0000${root}\\u0000${filePath}`\n const cached = relativePaths.get(key)\n if (cached !== undefined) return cached\n\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n const result = slashed.startsWith('../') ? slashed : `./${slashed}`\n if (relativePaths.size >= memoLimit) relativePaths.clear()\n relativePaths.set(key, result)\n return result\n}\n\n// The limit bounds what a long-running host keeps across builds into fresh roots; one build stays well under it.\nconst relativePaths = new Map<string, string>()\nconst memoLimit = 100_000\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 indents = lines.map((line) => {\n const indent = line.length - line.trimStart().length\n return indent === line.length ? -1 : indent\n })\n const start = indents.findIndex((indent) => indent !== -1)\n if (start === -1) return ''\n const end = indents.findLastIndex((indent) => indent !== -1)\n // `-1` marks a blank line. `reduce`, not `Math.min(...indents)`, which overflows the stack on very long text.\n const min = indents.reduce((lowest, indent) => (indent !== -1 && indent < lowest ? indent : lowest), Infinity)\n\n return lines\n .slice(start, end + 1)\n .map((line, i) => (indents[start + i] === -1 ? '' : line.slice(min)))\n .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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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["TokenKind","parse","createRequire","dirname","fileURLToPath","isAbsolute","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, isAbsolute, 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 process.emitWarning(\n 'Printing TypeScript compiler nodes with `print` from `@kubb/parser-ts` is deprecated and is removed in the next major. Return printed strings from printer handlers instead.',\n { type: 'DeprecationWarning', code: 'KUBB_PRINT_TS_NODE' },\n )\n\n const requireModule = 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 = requireModule(requireModule.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 // A relative input resolves against the working directory, so that directory is part of its key.\n const key = isAbsolute(root) && isAbsolute(filePath) ? `${root}\\u0000${filePath}` : `${process.cwd()}\\u0000${root}\\u0000${filePath}`\n const cached = relativePaths.get(key)\n if (cached !== undefined) return cached\n\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n const result = slashed.startsWith('../') ? slashed : `./${slashed}`\n if (relativePaths.size >= memoLimit) relativePaths.clear()\n relativePaths.set(key, result)\n return result\n}\n\n// The limit bounds what a long-running host keeps across builds into fresh roots; one build stays well under it.\nconst relativePaths = new Map<string, string>()\nconst memoLimit = 100_000\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 indents = lines.map((line) => {\n const indent = line.length - line.trimStart().length\n return indent === line.length ? -1 : indent\n })\n const start = indents.findIndex((indent) => indent !== -1)\n if (start === -1) return ''\n const end = indents.findLastIndex((indent) => indent !== -1)\n // `-1` marks a blank line. `reduce`, not `Math.min(...indents)`, which overflows the stack on very long text.\n const min = indents.reduce((lowest, indent) => (indent !== -1 && indent < lowest ? indent : lowest), Infinity)\n\n return lines\n .slice(start, end + 1)\n .map((line, i) => (indents[start + i] === -1 ? '' : line.slice(min)))\n .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
|
@@ -10,7 +10,7 @@ var compatibility = {
|
|
|
10
10
|
"node": ">=22.22"
|
|
11
11
|
};
|
|
12
12
|
// package.json
|
|
13
|
-
var version = "5.15.
|
|
13
|
+
var version = "5.15.3";
|
|
14
14
|
// src/inline.ts
|
|
15
15
|
const keyStarts = /* @__PURE__ */ new Set([
|
|
16
16
|
TokenKind.LeftBrace,
|
|
@@ -66,11 +66,15 @@ let compiler;
|
|
|
66
66
|
*/
|
|
67
67
|
function loadCompiler() {
|
|
68
68
|
if (compiler) return compiler;
|
|
69
|
-
|
|
69
|
+
process.emitWarning("Printing TypeScript compiler nodes with `print` from `@kubb/parser-ts` is deprecated and is removed in the next major. Return printed strings from printer handlers instead.", {
|
|
70
|
+
type: "DeprecationWarning",
|
|
71
|
+
code: "KUBB_PRINT_TS_NODE"
|
|
72
|
+
});
|
|
73
|
+
const requireModule = createRequire(import.meta.url);
|
|
70
74
|
const paths = [process.cwd(), dirname(fileURLToPath(import.meta.url))];
|
|
71
75
|
let typescript;
|
|
72
76
|
for (const name of ["typescript", "@typescript/typescript6"]) try {
|
|
73
|
-
const candidate =
|
|
77
|
+
const candidate = requireModule(requireModule.resolve(name, { paths }));
|
|
74
78
|
if (typeof candidate.createPrinter === "function") {
|
|
75
79
|
typescript = candidate;
|
|
76
80
|
break;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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, isAbsolute, 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 // A relative input resolves against the working directory, so that directory is part of its key.\n const key = isAbsolute(root) && isAbsolute(filePath) ? `${root}\\u0000${filePath}` : `${process.cwd()}\\u0000${root}\\u0000${filePath}`\n const cached = relativePaths.get(key)\n if (cached !== undefined) return cached\n\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n const result = slashed.startsWith('../') ? slashed : `./${slashed}`\n if (relativePaths.size >= memoLimit) relativePaths.clear()\n relativePaths.set(key, result)\n return result\n}\n\n// The limit bounds what a long-running host keeps across builds into fresh roots; one build stays well under it.\nconst relativePaths = new Map<string, string>()\nconst memoLimit = 100_000\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 indents = lines.map((line) => {\n const indent = line.length - line.trimStart().length\n return indent === line.length ? -1 : indent\n })\n const start = indents.findIndex((indent) => indent !== -1)\n if (start === -1) return ''\n const end = indents.findLastIndex((indent) => indent !== -1)\n // `-1` marks a blank line. `reduce`, not `Math.min(...indents)`, which overflows the stack on very long text.\n const min = indents.reduce((lowest, indent) => (indent !== -1 && indent < lowest ? indent : lowest), Infinity)\n\n return lines\n .slice(start, end + 1)\n .map((line, i) => (indents[start + i] === -1 ? '' : line.slice(min)))\n .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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"}
|
|
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, isAbsolute, 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 process.emitWarning(\n 'Printing TypeScript compiler nodes with `print` from `@kubb/parser-ts` is deprecated and is removed in the next major. Return printed strings from printer handlers instead.',\n { type: 'DeprecationWarning', code: 'KUBB_PRINT_TS_NODE' },\n )\n\n const requireModule = 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 = requireModule(requireModule.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 // A relative input resolves against the working directory, so that directory is part of its key.\n const key = isAbsolute(root) && isAbsolute(filePath) ? `${root}\\u0000${filePath}` : `${process.cwd()}\\u0000${root}\\u0000${filePath}`\n const cached = relativePaths.get(key)\n if (cached !== undefined) return cached\n\n const slashed = relative(dirname(root), filePath).replaceAll('\\\\', '/')\n const result = slashed.startsWith('../') ? slashed : `./${slashed}`\n if (relativePaths.size >= memoLimit) relativePaths.clear()\n relativePaths.set(key, result)\n return result\n}\n\n// The limit bounds what a long-running host keeps across builds into fresh roots; one build stays well under it.\nconst relativePaths = new Map<string, string>()\nconst memoLimit = 100_000\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 indents = lines.map((line) => {\n const indent = line.length - line.trimStart().length\n return indent === line.length ? -1 : indent\n })\n const start = indents.findIndex((indent) => indent !== -1)\n if (start === -1) return ''\n const end = indents.findLastIndex((indent) => indent !== -1)\n // `-1` marks a blank line. `reduce`, not `Math.min(...indents)`, which overflows the stack on very long text.\n const min = indents.reduce((lowest, indent) => (indent !== -1 && indent < lowest ? indent : lowest), Infinity)\n\n return lines\n .slice(start, end + 1)\n .map((line, i) => (indents[start + i] === -1 ? '' : line.slice(min)))\n .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.15.
|
|
3
|
+
"version": "5.15.3",
|
|
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.15.
|
|
68
|
-
"@kubb/core": "5.15.
|
|
67
|
+
"@kubb/ast": "^5.15.3",
|
|
68
|
+
"@kubb/core": "^5.15.3",
|
|
69
69
|
"yuku-parser": "^0.19.0"
|
|
70
70
|
},
|
|
71
71
|
"engines": {
|