@kubb/parser-ts 3.17.1 → 3.18.1

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.
@@ -27,8 +27,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
27
  }) : target, mod));
28
28
 
29
29
  //#endregion
30
- const typescript = __toESM(require("typescript"));
31
30
  const remeda = __toESM(require("remeda"));
31
+ const typescript = __toESM(require("typescript"));
32
32
 
33
33
  //#region src/factory.ts
34
34
  var factory_exports = {};
@@ -494,4 +494,4 @@ Object.defineProperty(exports, 'syntaxKind', {
494
494
  return syntaxKind;
495
495
  }
496
496
  });
497
- //# sourceMappingURL=factory-DeJMlphM.cjs.map
497
+ //# sourceMappingURL=factory-BSd2OjFQ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory-DeJMlphM.cjs","names":["ts","modifiers","questionToken","node","importPropertyName: ts.Identifier | undefined","importName: ts.NamedImportBindings | undefined","propertyName","initializer: ts.Expression"],"sources":["../src/factory.ts"],"sourcesContent":["import { isNumber } from 'remeda'\nimport ts from 'typescript'\n\nconst { SyntaxKind, factory } = ts\n\n// https://ts-ast-viewer.com/\n\nexport const modifiers = {\n async: factory.createModifier(ts.SyntaxKind.AsyncKeyword),\n export: factory.createModifier(ts.SyntaxKind.ExportKeyword),\n const: factory.createModifier(ts.SyntaxKind.ConstKeyword),\n static: factory.createModifier(ts.SyntaxKind.StaticKeyword),\n} as const\n\nexport const syntaxKind = {\n union: SyntaxKind.UnionType as 192,\n} as const\n\nfunction isValidIdentifier(str: string): boolean {\n if (!str.length || str.trim() !== str) {\n return false\n }\n const node = ts.parseIsolatedEntityName(str, ts.ScriptTarget.Latest)\n\n return !!node && node.kind === ts.SyntaxKind.Identifier && ts.identifierToKeywordKind(node.kind as unknown as ts.Identifier) === undefined\n}\n\nfunction propertyName(name: string | ts.PropertyName): ts.PropertyName {\n if (typeof name === 'string') {\n return isValidIdentifier(name) ? factory.createIdentifier(name) : factory.createStringLiteral(name)\n }\n return name\n}\n\nconst questionToken = factory.createToken(ts.SyntaxKind.QuestionToken)\n\nexport function createQuestionToken(token?: boolean | ts.QuestionToken) {\n if (!token) {\n return undefined\n }\n if (token === true) {\n return questionToken\n }\n return token\n}\n\nexport function createIntersectionDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode | null {\n if (!nodes.length) {\n return null\n }\n\n if (nodes.length === 1) {\n return nodes[0] || null\n }\n\n const node = factory.createIntersectionTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\n/**\n * Minimum nodes length of 2\n * @example `string & number`\n */\nexport function createTupleDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode | null {\n if (!nodes.length) {\n return null\n }\n\n if (nodes.length === 1) {\n return nodes[0] || null\n }\n\n const node = factory.createTupleTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\nexport function createArrayDeclaration({ nodes }: { nodes: Array<ts.TypeNode> }): ts.TypeNode | null {\n if (!nodes.length) {\n return factory.createTupleTypeNode([])\n }\n\n if (nodes.length === 1) {\n return factory.createArrayTypeNode(nodes.at(0)!)\n }\n\n return factory.createExpressionWithTypeArguments(factory.createIdentifier('Array'), [factory.createUnionTypeNode(nodes)])\n}\n\n/**\n * Minimum nodes length of 2\n * @example `string | number`\n */\nexport function createUnionDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode {\n if (!nodes.length) {\n return keywordTypeNodes.any\n }\n\n if (nodes.length === 1) {\n return nodes[0] as ts.TypeNode\n }\n\n const node = factory.createUnionTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\nexport function createPropertySignature({\n readOnly,\n modifiers = [],\n name,\n questionToken,\n type,\n}: {\n readOnly?: boolean\n modifiers?: Array<ts.Modifier>\n name: ts.PropertyName | string\n questionToken?: ts.QuestionToken | boolean\n type?: ts.TypeNode\n}) {\n return factory.createPropertySignature(\n [...modifiers, readOnly ? factory.createToken(ts.SyntaxKind.ReadonlyKeyword) : undefined].filter(Boolean),\n propertyName(name),\n createQuestionToken(questionToken),\n type,\n )\n}\n\nexport function createParameterSignature(\n name: string | ts.BindingName,\n {\n modifiers,\n dotDotDotToken,\n questionToken,\n type,\n initializer,\n }: {\n decorators?: Array<ts.Decorator>\n modifiers?: Array<ts.Modifier>\n dotDotDotToken?: ts.DotDotDotToken\n questionToken?: ts.QuestionToken | boolean\n type?: ts.TypeNode\n initializer?: ts.Expression\n },\n): ts.ParameterDeclaration {\n return factory.createParameterDeclaration(modifiers, dotDotDotToken, name, createQuestionToken(questionToken), type, initializer)\n}\n\nexport function createJSDoc({ comments }: { comments: string[] }) {\n if (!comments.length) {\n return null\n }\n return factory.createJSDocComment(\n factory.createNodeArray(\n comments.map((comment, i) => {\n if (i === comments.length - 1) {\n return factory.createJSDocText(comment)\n }\n\n return factory.createJSDocText(`${comment}\\n`)\n }),\n ),\n )\n}\n\n/**\n * @link https://github.com/microsoft/TypeScript/issues/44151\n */\nexport function appendJSDocToNode<TNode extends ts.Node>({ node, comments }: { node: TNode; comments: Array<string | undefined> }) {\n const filteredComments = comments.filter(Boolean)\n\n if (!filteredComments.length) {\n return node\n }\n\n const text = filteredComments.reduce((acc = '', comment = '') => {\n return `${acc}\\n * ${comment.replaceAll('*/', '*\\\\/')}`\n }, '*')\n\n // node: {...node}, with that ts.addSyntheticLeadingComment is appending\n return ts.addSyntheticLeadingComment({ ...node }, ts.SyntaxKind.MultiLineCommentTrivia, `${text || '*'}\\n`, true)\n}\n\nexport function createIndexSignature(\n type: ts.TypeNode,\n {\n modifiers,\n indexName = 'key',\n indexType = factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n }: {\n indexName?: string\n indexType?: ts.TypeNode\n decorators?: Array<ts.Decorator>\n modifiers?: Array<ts.Modifier>\n } = {},\n) {\n return factory.createIndexSignature(modifiers, [createParameterSignature(indexName, { type: indexType })], type)\n}\n\nexport function createTypeAliasDeclaration({\n modifiers,\n name,\n typeParameters,\n type,\n}: {\n modifiers?: Array<ts.Modifier>\n name: string | ts.Identifier\n typeParameters?: Array<ts.TypeParameterDeclaration>\n type: ts.TypeNode\n}) {\n return factory.createTypeAliasDeclaration(modifiers, name, typeParameters, type)\n}\n\nexport function createInterfaceDeclaration({\n modifiers,\n name,\n typeParameters,\n members,\n}: {\n modifiers?: Array<ts.Modifier>\n name: string | ts.Identifier\n typeParameters?: Array<ts.TypeParameterDeclaration>\n members: Array<ts.TypeElement>\n}) {\n return factory.createInterfaceDeclaration(modifiers, name, typeParameters, undefined, members)\n}\n\nexport function createTypeDeclaration({\n syntax,\n isExportable,\n comments,\n name,\n type,\n}: {\n syntax: 'type' | 'interface'\n comments: Array<string | undefined>\n isExportable?: boolean\n name: string | ts.Identifier\n type: ts.TypeNode\n}) {\n if (syntax === 'interface' && 'members' in type) {\n const node = createInterfaceDeclaration({\n members: type.members as Array<ts.TypeElement>,\n modifiers: isExportable ? [modifiers.export] : [],\n name,\n typeParameters: undefined,\n })\n\n return appendJSDocToNode({\n node,\n comments,\n })\n }\n\n const node = createTypeAliasDeclaration({\n type,\n modifiers: isExportable ? [modifiers.export] : [],\n name,\n typeParameters: undefined,\n })\n\n return appendJSDocToNode({\n node,\n comments,\n })\n}\n\nexport function createNamespaceDeclaration({ statements, name }: { name: string; statements: ts.Statement[] }) {\n return factory.createModuleDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(name),\n factory.createModuleBlock(statements),\n ts.NodeFlags.Namespace,\n )\n}\n\n/**\n * In { propertyName: string; name?: string } is `name` being used to make the type more unique when multiple same names are used.\n * @example `import { Pet as Cat } from './Pet'`\n */\nexport function createImportDeclaration({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: {\n name: string | Array<string | { propertyName: string; name?: string }>\n path: string\n isTypeOnly?: boolean\n isNameSpace?: boolean\n}) {\n if (!Array.isArray(name)) {\n let importPropertyName: ts.Identifier | undefined = factory.createIdentifier(name)\n let importName: ts.NamedImportBindings | undefined\n\n if (isNameSpace) {\n importPropertyName = undefined\n importName = factory.createNamespaceImport(factory.createIdentifier(name))\n }\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(isTypeOnly, importPropertyName, importName),\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(\n isTypeOnly,\n undefined,\n factory.createNamedImports(\n name.map((item) => {\n if (typeof item === 'object') {\n const obj = item as { propertyName: string; name?: string }\n if (obj.name) {\n return factory.createImportSpecifier(false, factory.createIdentifier(obj.propertyName), factory.createIdentifier(obj.name))\n }\n\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(obj.propertyName))\n }\n\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(item))\n }),\n ),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\nexport function createExportDeclaration({\n path,\n asAlias,\n isTypeOnly = false,\n name,\n}: {\n path: string\n asAlias?: boolean\n isTypeOnly?: boolean\n name?: string | Array<ts.Identifier | string>\n}) {\n if (name && !Array.isArray(name) && !asAlias) {\n console.warn(`When using name as string, asAlias should be true ${name}`)\n }\n\n if (!Array.isArray(name)) {\n const parsedName = name?.match(/^\\d/) ? `_${name?.slice(1)}` : name\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n asAlias && parsedName ? factory.createNamespaceExport(factory.createIdentifier(parsedName)) : undefined,\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n factory.createNamedExports(\n name.map((propertyName) => {\n return factory.createExportSpecifier(false, undefined, typeof propertyName === 'string' ? factory.createIdentifier(propertyName) : propertyName)\n }),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\nexport function createEnumDeclaration({\n type = 'enum',\n name,\n typeName,\n enums,\n}: {\n /**\n * @default `'enum'`\n */\n type?: 'enum' | 'asConst' | 'asPascalConst' | 'constEnum' | 'literal'\n /**\n * Enum name in camelCase.\n */\n name: string\n /**\n * Enum name in PascalCase.\n */\n typeName: string\n enums: [key: string | number, value: string | number | boolean][]\n}): [name: ts.Node | undefined, type: ts.Node] {\n if (type === 'literal') {\n return [\n undefined,\n factory.createTypeAliasDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n factory.createUnionTypeNode(\n enums\n .map(([_key, value]) => {\n if (isNumber(value)) {\n return factory.createLiteralTypeNode(factory.createNumericLiteral(value?.toString()))\n }\n\n if (typeof value === 'boolean') {\n return factory.createLiteralTypeNode(value ? factory.createTrue() : factory.createFalse())\n }\n if (value) {\n return factory.createLiteralTypeNode(factory.createStringLiteral(value.toString()))\n }\n\n return undefined\n })\n .filter(Boolean),\n ),\n ),\n ]\n }\n\n if (type === 'enum' || type === 'constEnum') {\n return [\n undefined,\n factory.createEnumDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword), type === 'constEnum' ? factory.createToken(ts.SyntaxKind.ConstKeyword) : undefined].filter(Boolean),\n factory.createIdentifier(typeName),\n enums\n .map(([key, value]) => {\n let initializer: ts.Expression = factory.createStringLiteral(value?.toString())\n const isExactNumber = Number.parseInt(value.toString(), 10) === value\n\n if (isExactNumber && isNumber(Number.parseInt(value.toString(), 10))) {\n initializer = factory.createNumericLiteral(value as number)\n }\n\n if (typeof value === 'boolean') {\n initializer = value ? factory.createTrue() : factory.createFalse()\n }\n\n if (isNumber(Number.parseInt(key.toString(), 10))) {\n return factory.createEnumMember(factory.createStringLiteral(`${typeName}_${key}`), initializer)\n }\n\n if (key) {\n return factory.createEnumMember(factory.createStringLiteral(`${key}`), initializer)\n }\n\n return undefined\n })\n .filter(Boolean),\n ),\n ]\n }\n\n // used when using `as const` instead of an TypeScript enum.\n const identifierName = type === 'asPascalConst' ? typeName : name\n\n return [\n factory.createVariableStatement(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(identifierName),\n undefined,\n undefined,\n factory.createAsExpression(\n factory.createObjectLiteralExpression(\n enums\n .map(([key, value]) => {\n let initializer: ts.Expression = factory.createStringLiteral(value?.toString())\n\n if (isNumber(value)) {\n // Error: Negative numbers should be created in combination with createPrefixUnaryExpression factory.\n // The method createNumericLiteral only accepts positive numbers\n // or those combined with createPrefixUnaryExpression.\n // Therefore, we need to ensure that the number is not negative.\n if (value < 0) {\n initializer = factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, factory.createNumericLiteral(Math.abs(value)))\n } else {\n initializer = factory.createNumericLiteral(value)\n }\n }\n\n if (typeof value === 'boolean') {\n initializer = value ? factory.createTrue() : factory.createFalse()\n }\n\n if (key) {\n return factory.createPropertyAssignment(factory.createStringLiteral(`${key}`), initializer)\n }\n\n return undefined\n })\n .filter(Boolean),\n true,\n ),\n factory.createTypeReferenceNode(factory.createIdentifier('const'), undefined),\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n factory.createTypeAliasDeclaration(\n type === 'asPascalConst' ? [] : [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n factory.createIndexedAccessTypeNode(\n factory.createParenthesizedType(factory.createTypeQueryNode(factory.createIdentifier(identifierName), undefined)),\n factory.createTypeOperatorNode(ts.SyntaxKind.KeyOfKeyword, factory.createTypeQueryNode(factory.createIdentifier(identifierName), undefined)),\n ),\n ),\n ]\n}\n\nexport function createOmitDeclaration({ keys, type, nonNullable }: { keys: Array<string> | string; type: ts.TypeNode; nonNullable?: boolean }) {\n const node = nonNullable ? factory.createTypeReferenceNode(factory.createIdentifier('NonNullable'), [type]) : type\n\n if (Array.isArray(keys)) {\n return factory.createTypeReferenceNode(factory.createIdentifier('Omit'), [\n node,\n factory.createUnionTypeNode(\n keys.map((key) => {\n return factory.createLiteralTypeNode(factory.createStringLiteral(key))\n }),\n ),\n ])\n }\n\n return factory.createTypeReferenceNode(factory.createIdentifier('Omit'), [node, factory.createLiteralTypeNode(factory.createStringLiteral(keys))])\n}\n\nexport const keywordTypeNodes = {\n any: factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\n unknown: factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword),\n void: factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword),\n number: factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),\n integer: factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),\n object: factory.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword),\n string: factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n boolean: factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword),\n undefined: factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword),\n null: factory.createLiteralTypeNode(factory.createToken(ts.SyntaxKind.NullKeyword)),\n} as const\n\nexport const createTypeLiteralNode = factory.createTypeLiteralNode\n\nexport const createTypeReferenceNode = factory.createTypeReferenceNode\nexport const createNumericLiteral = factory.createNumericLiteral\nexport const createStringLiteral = factory.createStringLiteral\n\nexport const createArrayTypeNode = factory.createArrayTypeNode\n\nexport const createLiteralTypeNode = factory.createLiteralTypeNode\nexport const createNull = factory.createNull\nexport const createIdentifier = factory.createIdentifier\n\nexport const createOptionalTypeNode = factory.createOptionalTypeNode\nexport const createTupleTypeNode = factory.createTupleTypeNode\nexport const createRestTypeNode = factory.createRestTypeNode\nexport const createTrue = factory.createTrue\nexport const createFalse = factory.createFalse\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,MAAM,EAAE,YAAY,SAAS,GAAGA;AAIhC,MAAa,YAAY;CACvB,OAAO,QAAQ,eAAeA,mBAAG,WAAW;CAC5C,QAAQ,QAAQ,eAAeA,mBAAG,WAAW;CAC7C,OAAO,QAAQ,eAAeA,mBAAG,WAAW;CAC5C,QAAQ,QAAQ,eAAeA,mBAAG,WAAW;CAC9C;AAED,MAAa,aAAa,EACxB,OAAO,WAAW,WACnB;AAED,SAAS,kBAAkB,KAAsB;AAC/C,KAAI,CAAC,IAAI,UAAU,IAAI,WAAW,IAChC,QAAO;CAET,MAAM,OAAOA,mBAAG,wBAAwB,KAAKA,mBAAG,aAAa;AAE7D,QAAO,CAAC,CAAC,QAAQ,KAAK,SAASA,mBAAG,WAAW,cAAcA,mBAAG,wBAAwB,KAAK,UAAsC;AAClI;AAED,SAAS,aAAa,MAAiD;AACrE,KAAI,OAAO,SAAS,SAClB,QAAO,kBAAkB,QAAQ,QAAQ,iBAAiB,QAAQ,QAAQ,oBAAoB;AAEhG,QAAO;AACR;AAED,MAAM,gBAAgB,QAAQ,YAAYA,mBAAG,WAAW;AAExD,SAAgB,oBAAoB,OAAoC;AACtE,KAAI,CAAC,MACH,QAAO;AAET,KAAI,UAAU,KACZ,QAAO;AAET,QAAO;AACR;AAED,SAAgB,8BAA8B,EAAE,OAAO,iBAA2E,EAAsB;AACtJ,KAAI,CAAC,MAAM,OACT,QAAO;AAGT,KAAI,MAAM,WAAW,EACnB,QAAO,MAAM,MAAM;CAGrB,MAAM,OAAO,QAAQ,2BAA2B;AAEhD,KAAI,gBACF,QAAO,QAAQ,wBAAwB;AAGzC,QAAO;AACR;;;;;AAMD,SAAgB,uBAAuB,EAAE,OAAO,iBAA2E,EAAsB;AAC/I,KAAI,CAAC,MAAM,OACT,QAAO;AAGT,KAAI,MAAM,WAAW,EACnB,QAAO,MAAM,MAAM;CAGrB,MAAM,OAAO,QAAQ,oBAAoB;AAEzC,KAAI,gBACF,QAAO,QAAQ,wBAAwB;AAGzC,QAAO;AACR;AAED,SAAgB,uBAAuB,EAAE,OAAsC,EAAsB;AACnG,KAAI,CAAC,MAAM,OACT,QAAO,QAAQ,oBAAoB,EAAE;AAGvC,KAAI,MAAM,WAAW,EACnB,QAAO,QAAQ,oBAAoB,MAAM,GAAG;AAG9C,QAAO,QAAQ,kCAAkC,QAAQ,iBAAiB,UAAU,CAAC,QAAQ,oBAAoB,OAAO;AACzH;;;;;AAMD,SAAgB,uBAAuB,EAAE,OAAO,iBAA2E,EAAe;AACxI,KAAI,CAAC,MAAM,OACT,QAAO,iBAAiB;AAG1B,KAAI,MAAM,WAAW,EACnB,QAAO,MAAM;CAGf,MAAM,OAAO,QAAQ,oBAAoB;AAEzC,KAAI,gBACF,QAAO,QAAQ,wBAAwB;AAGzC,QAAO;AACR;AAED,SAAgB,wBAAwB,EACtC,UACA,yBAAY,EAAE,EACd,MACA,gCACA,MAOD,EAAE;AACD,QAAO,QAAQ,wBACb,CAAC,GAAGC,aAAW,WAAW,QAAQ,YAAYD,mBAAG,WAAW,mBAAmB,OAAU,CAAC,OAAO,UACjG,aAAa,OACb,oBAAoBE,kBACpB;AAEH;AAED,SAAgB,yBACd,MACA,EACE,wBACA,gBACA,gCACA,MACA,aAQD,EACwB;AACzB,QAAO,QAAQ,2BAA2BD,aAAW,gBAAgB,MAAM,oBAAoBC,kBAAgB,MAAM;AACtH;AAED,SAAgB,YAAY,EAAE,UAAkC,EAAE;AAChE,KAAI,CAAC,SAAS,OACZ,QAAO;AAET,QAAO,QAAQ,mBACb,QAAQ,gBACN,SAAS,KAAK,SAAS,MAAM;AAC3B,MAAI,MAAM,SAAS,SAAS,EAC1B,QAAO,QAAQ,gBAAgB;AAGjC,SAAO,QAAQ,gBAAgB,GAAG,QAAQ;CAC3C;AAGN;;;;AAKD,SAAgB,kBAAyC,EAAE,MAAM,UAAgE,EAAE;CACjI,MAAM,mBAAmB,SAAS,OAAO;AAEzC,KAAI,CAAC,iBAAiB,OACpB,QAAO;CAGT,MAAM,OAAO,iBAAiB,QAAQ,MAAM,IAAI,UAAU,OAAO;AAC/D,SAAO,GAAG,IAAI,OAAO,QAAQ,WAAW,MAAM;CAC/C,GAAE;AAGH,QAAOF,mBAAG,2BAA2B,EAAE,GAAG,MAAM,EAAEA,mBAAG,WAAW,wBAAwB,GAAG,QAAQ,IAAI,KAAK;AAC7G;AAED,SAAgB,qBACd,MACA,EACE,wBACA,YAAY,OACZ,YAAY,QAAQ,sBAAsBA,mBAAG,WAAW,gBAMzD,GAAG,EAAE,EACN;AACA,QAAO,QAAQ,qBAAqBC,aAAW,CAAC,yBAAyB,WAAW,EAAE,MAAM,WAAW,EAAE,EAAE;AAC5G;AAED,SAAgB,2BAA2B,EACzC,wBACA,MACA,gBACA,MAMD,EAAE;AACD,QAAO,QAAQ,2BAA2BA,aAAW,MAAM,gBAAgB;AAC5E;AAED,SAAgB,2BAA2B,EACzC,wBACA,MACA,gBACA,SAMD,EAAE;AACD,QAAO,QAAQ,2BAA2BA,aAAW,MAAM,gBAAgB,QAAW;AACvF;AAED,SAAgB,sBAAsB,EACpC,QACA,cACA,UACA,MACA,MAOD,EAAE;AACD,KAAI,WAAW,eAAe,aAAa,MAAM;EAC/C,MAAME,SAAO,2BAA2B;GACtC,SAAS,KAAK;GACd,WAAW,eAAe,CAAC,UAAU,OAAO,GAAG,EAAE;GACjD;GACA,gBAAgB;GACjB;AAED,SAAO,kBAAkB;GACvB;GACA;GACD;CACF;CAED,MAAM,OAAO,2BAA2B;EACtC;EACA,WAAW,eAAe,CAAC,UAAU,OAAO,GAAG,EAAE;EACjD;EACA,gBAAgB;EACjB;AAED,QAAO,kBAAkB;EACvB;EACA;EACD;AACF;AAED,SAAgB,2BAA2B,EAAE,YAAY,MAAoD,EAAE;AAC7G,QAAO,QAAQ,wBACb,CAAC,QAAQ,YAAYH,mBAAG,WAAW,eAAe,EAClD,QAAQ,iBAAiB,OACzB,QAAQ,kBAAkB,aAC1BA,mBAAG,UAAU;AAEhB;;;;;AAMD,SAAgB,wBAAwB,EACtC,MACA,MACA,aAAa,OACb,cAAc,OAMf,EAAE;AACD,KAAI,CAAC,MAAM,QAAQ,OAAO;EACxB,IAAII,qBAAgD,QAAQ,iBAAiB;EAC7E,IAAIC;AAEJ,MAAI,aAAa;AACf,wBAAqB;AACrB,gBAAa,QAAQ,sBAAsB,QAAQ,iBAAiB;EACrE;AAED,SAAO,QAAQ,wBACb,QACA,QAAQ,mBAAmB,YAAY,oBAAoB,aAC3D,QAAQ,oBAAoB,OAC5B;CAEH;AAED,QAAO,QAAQ,wBACb,QACA,QAAQ,mBACN,YACA,QACA,QAAQ,mBACN,KAAK,KAAK,SAAS;AACjB,MAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,MAAM;AACZ,OAAI,IAAI,KACN,QAAO,QAAQ,sBAAsB,OAAO,QAAQ,iBAAiB,IAAI,eAAe,QAAQ,iBAAiB,IAAI;AAGvH,UAAO,QAAQ,sBAAsB,OAAO,QAAW,QAAQ,iBAAiB,IAAI;EACrF;AAED,SAAO,QAAQ,sBAAsB,OAAO,QAAW,QAAQ,iBAAiB;CACjF,MAGL,QAAQ,oBAAoB,OAC5B;AAEH;AAED,SAAgB,wBAAwB,EACtC,MACA,SACA,aAAa,OACb,MAMD,EAAE;AACD,KAAI,QAAQ,CAAC,MAAM,QAAQ,SAAS,CAAC,QACnC,SAAQ,KAAK,qDAAqD;AAGpE,KAAI,CAAC,MAAM,QAAQ,OAAO;EACxB,MAAM,aAAa,MAAM,MAAM,SAAS,IAAI,MAAM,MAAM,OAAO;AAE/D,SAAO,QAAQ,wBACb,QACA,YACA,WAAW,aAAa,QAAQ,sBAAsB,QAAQ,iBAAiB,eAAe,QAC9F,QAAQ,oBAAoB,OAC5B;CAEH;AAED,QAAO,QAAQ,wBACb,QACA,YACA,QAAQ,mBACN,KAAK,KAAK,mBAAiB;AACzB,SAAO,QAAQ,sBAAsB,OAAO,QAAW,OAAOC,mBAAiB,WAAW,QAAQ,iBAAiBA,kBAAgBA;CACpI,KAEH,QAAQ,oBAAoB,OAC5B;AAEH;AAED,SAAgB,sBAAsB,EACpC,OAAO,QACP,MACA,UACA,OAeD,EAA8C;AAC7C,KAAI,SAAS,UACX,QAAO,CACL,QACA,QAAQ,2BACN,CAAC,QAAQ,YAAYN,mBAAG,WAAW,eAAe,EAClD,QAAQ,iBAAiB,WACzB,QACA,QAAQ,oBACN,MACG,KAAK,CAAC,MAAM,MAAM,KAAK;AACtB,2BAAa,OACX,QAAO,QAAQ,sBAAsB,QAAQ,qBAAqB,OAAO;AAG3E,MAAI,OAAO,UAAU,UACnB,QAAO,QAAQ,sBAAsB,QAAQ,QAAQ,eAAe,QAAQ;AAE9E,MAAI,MACF,QAAO,QAAQ,sBAAsB,QAAQ,oBAAoB,MAAM;AAGzE,SAAO;CACR,GACA,OAAO,WAGf;AAGH,KAAI,SAAS,UAAU,SAAS,YAC9B,QAAO,CACL,QACA,QAAQ,sBACN,CAAC,QAAQ,YAAYA,mBAAG,WAAW,gBAAgB,SAAS,cAAc,QAAQ,YAAYA,mBAAG,WAAW,gBAAgB,OAAU,CAAC,OAAO,UAC9I,QAAQ,iBAAiB,WACzB,MACG,KAAK,CAAC,KAAK,MAAM,KAAK;EACrB,IAAIO,cAA6B,QAAQ,oBAAoB,OAAO;EACpE,MAAM,gBAAgB,OAAO,SAAS,MAAM,YAAY,QAAQ;AAEhE,MAAI,sCAA0B,OAAO,SAAS,MAAM,YAAY,KAC9D,eAAc,QAAQ,qBAAqB;AAG7C,MAAI,OAAO,UAAU,UACnB,eAAc,QAAQ,QAAQ,eAAe,QAAQ;AAGvD,2BAAa,OAAO,SAAS,IAAI,YAAY,KAC3C,QAAO,QAAQ,iBAAiB,QAAQ,oBAAoB,GAAG,SAAS,GAAG,QAAQ;AAGrF,MAAI,IACF,QAAO,QAAQ,iBAAiB,QAAQ,oBAAoB,GAAG,QAAQ;AAGzE,SAAO;CACR,GACA,OAAO,UAEb;CAIH,MAAM,iBAAiB,SAAS,kBAAkB,WAAW;AAE7D,QAAO,CACL,QAAQ,wBACN,CAAC,QAAQ,YAAYP,mBAAG,WAAW,eAAe,EAClD,QAAQ,8BACN,CACE,QAAQ,0BACN,QAAQ,iBAAiB,iBACzB,QACA,QACA,QAAQ,mBACN,QAAQ,8BACN,MACG,KAAK,CAAC,KAAK,MAAM,KAAK;EACrB,IAAIO,cAA6B,QAAQ,oBAAoB,OAAO;AAEpE,2BAAa,OAKX,KAAI,QAAQ,EACV,eAAc,QAAQ,4BAA4BP,mBAAG,WAAW,YAAY,QAAQ,qBAAqB,KAAK,IAAI;MAElH,eAAc,QAAQ,qBAAqB;AAI/C,MAAI,OAAO,UAAU,UACnB,eAAc,QAAQ,QAAQ,eAAe,QAAQ;AAGvD,MAAI,IACF,QAAO,QAAQ,yBAAyB,QAAQ,oBAAoB,GAAG,QAAQ;AAGjF,SAAO;CACR,GACA,OAAO,UACV,OAEF,QAAQ,wBAAwB,QAAQ,iBAAiB,UAAU,UAGxE,EACDA,mBAAG,UAAU,SAGjB,QAAQ,2BACN,SAAS,kBAAkB,EAAE,GAAG,CAAC,QAAQ,YAAYA,mBAAG,WAAW,eAAe,EAClF,QAAQ,iBAAiB,WACzB,QACA,QAAQ,4BACN,QAAQ,wBAAwB,QAAQ,oBAAoB,QAAQ,iBAAiB,iBAAiB,UACtG,QAAQ,uBAAuBA,mBAAG,WAAW,cAAc,QAAQ,oBAAoB,QAAQ,iBAAiB,iBAAiB,WAGtI;AACF;AAED,SAAgB,sBAAsB,EAAE,MAAM,MAAM,aAAyF,EAAE;CAC7I,MAAM,OAAO,cAAc,QAAQ,wBAAwB,QAAQ,iBAAiB,gBAAgB,CAAC,KAAK,IAAI;AAE9G,KAAI,MAAM,QAAQ,MAChB,QAAO,QAAQ,wBAAwB,QAAQ,iBAAiB,SAAS,CACvE,MACA,QAAQ,oBACN,KAAK,KAAK,QAAQ;AAChB,SAAO,QAAQ,sBAAsB,QAAQ,oBAAoB;CAClE,IAEJ;AAGH,QAAO,QAAQ,wBAAwB,QAAQ,iBAAiB,SAAS,CAAC,MAAM,QAAQ,sBAAsB,QAAQ,oBAAoB,OAAO;AAClJ;AAED,MAAa,mBAAmB;CAC9B,KAAK,QAAQ,sBAAsBA,mBAAG,WAAW;CACjD,SAAS,QAAQ,sBAAsBA,mBAAG,WAAW;CACrD,MAAM,QAAQ,sBAAsBA,mBAAG,WAAW;CAClD,QAAQ,QAAQ,sBAAsBA,mBAAG,WAAW;CACpD,SAAS,QAAQ,sBAAsBA,mBAAG,WAAW;CACrD,QAAQ,QAAQ,sBAAsBA,mBAAG,WAAW;CACpD,QAAQ,QAAQ,sBAAsBA,mBAAG,WAAW;CACpD,SAAS,QAAQ,sBAAsBA,mBAAG,WAAW;CACrD,WAAW,QAAQ,sBAAsBA,mBAAG,WAAW;CACvD,MAAM,QAAQ,sBAAsB,QAAQ,YAAYA,mBAAG,WAAW;CACvE;AAED,MAAa,wBAAwB,QAAQ;AAE7C,MAAa,0BAA0B,QAAQ;AAC/C,MAAa,uBAAuB,QAAQ;AAC5C,MAAa,sBAAsB,QAAQ;AAE3C,MAAa,sBAAsB,QAAQ;AAE3C,MAAa,wBAAwB,QAAQ;AAC7C,MAAa,aAAa,QAAQ;AAClC,MAAa,mBAAmB,QAAQ;AAExC,MAAa,yBAAyB,QAAQ;AAC9C,MAAa,sBAAsB,QAAQ;AAC3C,MAAa,qBAAqB,QAAQ;AAC1C,MAAa,aAAa,QAAQ;AAClC,MAAa,cAAc,QAAQ"}
1
+ {"version":3,"file":"factory-BSd2OjFQ.cjs","names":["ts","modifiers","questionToken","node","importPropertyName: ts.Identifier | undefined","importName: ts.NamedImportBindings | undefined","propertyName","initializer: ts.Expression"],"sources":["../src/factory.ts"],"sourcesContent":["import { isNumber } from 'remeda'\nimport ts from 'typescript'\n\nconst { SyntaxKind, factory } = ts\n\n// https://ts-ast-viewer.com/\n\nexport const modifiers = {\n async: factory.createModifier(ts.SyntaxKind.AsyncKeyword),\n export: factory.createModifier(ts.SyntaxKind.ExportKeyword),\n const: factory.createModifier(ts.SyntaxKind.ConstKeyword),\n static: factory.createModifier(ts.SyntaxKind.StaticKeyword),\n} as const\n\nexport const syntaxKind = {\n union: SyntaxKind.UnionType as 192,\n} as const\n\nfunction isValidIdentifier(str: string): boolean {\n if (!str.length || str.trim() !== str) {\n return false\n }\n const node = ts.parseIsolatedEntityName(str, ts.ScriptTarget.Latest)\n\n return !!node && node.kind === ts.SyntaxKind.Identifier && ts.identifierToKeywordKind(node.kind as unknown as ts.Identifier) === undefined\n}\n\nfunction propertyName(name: string | ts.PropertyName): ts.PropertyName {\n if (typeof name === 'string') {\n return isValidIdentifier(name) ? factory.createIdentifier(name) : factory.createStringLiteral(name)\n }\n return name\n}\n\nconst questionToken = factory.createToken(ts.SyntaxKind.QuestionToken)\n\nexport function createQuestionToken(token?: boolean | ts.QuestionToken) {\n if (!token) {\n return undefined\n }\n if (token === true) {\n return questionToken\n }\n return token\n}\n\nexport function createIntersectionDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode | null {\n if (!nodes.length) {\n return null\n }\n\n if (nodes.length === 1) {\n return nodes[0] || null\n }\n\n const node = factory.createIntersectionTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\n/**\n * Minimum nodes length of 2\n * @example `string & number`\n */\nexport function createTupleDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode | null {\n if (!nodes.length) {\n return null\n }\n\n if (nodes.length === 1) {\n return nodes[0] || null\n }\n\n const node = factory.createTupleTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\nexport function createArrayDeclaration({ nodes }: { nodes: Array<ts.TypeNode> }): ts.TypeNode | null {\n if (!nodes.length) {\n return factory.createTupleTypeNode([])\n }\n\n if (nodes.length === 1) {\n return factory.createArrayTypeNode(nodes.at(0)!)\n }\n\n return factory.createExpressionWithTypeArguments(factory.createIdentifier('Array'), [factory.createUnionTypeNode(nodes)])\n}\n\n/**\n * Minimum nodes length of 2\n * @example `string | number`\n */\nexport function createUnionDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode {\n if (!nodes.length) {\n return keywordTypeNodes.any\n }\n\n if (nodes.length === 1) {\n return nodes[0] as ts.TypeNode\n }\n\n const node = factory.createUnionTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\nexport function createPropertySignature({\n readOnly,\n modifiers = [],\n name,\n questionToken,\n type,\n}: {\n readOnly?: boolean\n modifiers?: Array<ts.Modifier>\n name: ts.PropertyName | string\n questionToken?: ts.QuestionToken | boolean\n type?: ts.TypeNode\n}) {\n return factory.createPropertySignature(\n [...modifiers, readOnly ? factory.createToken(ts.SyntaxKind.ReadonlyKeyword) : undefined].filter(Boolean),\n propertyName(name),\n createQuestionToken(questionToken),\n type,\n )\n}\n\nexport function createParameterSignature(\n name: string | ts.BindingName,\n {\n modifiers,\n dotDotDotToken,\n questionToken,\n type,\n initializer,\n }: {\n decorators?: Array<ts.Decorator>\n modifiers?: Array<ts.Modifier>\n dotDotDotToken?: ts.DotDotDotToken\n questionToken?: ts.QuestionToken | boolean\n type?: ts.TypeNode\n initializer?: ts.Expression\n },\n): ts.ParameterDeclaration {\n return factory.createParameterDeclaration(modifiers, dotDotDotToken, name, createQuestionToken(questionToken), type, initializer)\n}\n\nexport function createJSDoc({ comments }: { comments: string[] }) {\n if (!comments.length) {\n return null\n }\n return factory.createJSDocComment(\n factory.createNodeArray(\n comments.map((comment, i) => {\n if (i === comments.length - 1) {\n return factory.createJSDocText(comment)\n }\n\n return factory.createJSDocText(`${comment}\\n`)\n }),\n ),\n )\n}\n\n/**\n * @link https://github.com/microsoft/TypeScript/issues/44151\n */\nexport function appendJSDocToNode<TNode extends ts.Node>({ node, comments }: { node: TNode; comments: Array<string | undefined> }) {\n const filteredComments = comments.filter(Boolean)\n\n if (!filteredComments.length) {\n return node\n }\n\n const text = filteredComments.reduce((acc = '', comment = '') => {\n return `${acc}\\n * ${comment.replaceAll('*/', '*\\\\/')}`\n }, '*')\n\n // node: {...node}, with that ts.addSyntheticLeadingComment is appending\n return ts.addSyntheticLeadingComment({ ...node }, ts.SyntaxKind.MultiLineCommentTrivia, `${text || '*'}\\n`, true)\n}\n\nexport function createIndexSignature(\n type: ts.TypeNode,\n {\n modifiers,\n indexName = 'key',\n indexType = factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n }: {\n indexName?: string\n indexType?: ts.TypeNode\n decorators?: Array<ts.Decorator>\n modifiers?: Array<ts.Modifier>\n } = {},\n) {\n return factory.createIndexSignature(modifiers, [createParameterSignature(indexName, { type: indexType })], type)\n}\n\nexport function createTypeAliasDeclaration({\n modifiers,\n name,\n typeParameters,\n type,\n}: {\n modifiers?: Array<ts.Modifier>\n name: string | ts.Identifier\n typeParameters?: Array<ts.TypeParameterDeclaration>\n type: ts.TypeNode\n}) {\n return factory.createTypeAliasDeclaration(modifiers, name, typeParameters, type)\n}\n\nexport function createInterfaceDeclaration({\n modifiers,\n name,\n typeParameters,\n members,\n}: {\n modifiers?: Array<ts.Modifier>\n name: string | ts.Identifier\n typeParameters?: Array<ts.TypeParameterDeclaration>\n members: Array<ts.TypeElement>\n}) {\n return factory.createInterfaceDeclaration(modifiers, name, typeParameters, undefined, members)\n}\n\nexport function createTypeDeclaration({\n syntax,\n isExportable,\n comments,\n name,\n type,\n}: {\n syntax: 'type' | 'interface'\n comments: Array<string | undefined>\n isExportable?: boolean\n name: string | ts.Identifier\n type: ts.TypeNode\n}) {\n if (syntax === 'interface' && 'members' in type) {\n const node = createInterfaceDeclaration({\n members: type.members as Array<ts.TypeElement>,\n modifiers: isExportable ? [modifiers.export] : [],\n name,\n typeParameters: undefined,\n })\n\n return appendJSDocToNode({\n node,\n comments,\n })\n }\n\n const node = createTypeAliasDeclaration({\n type,\n modifiers: isExportable ? [modifiers.export] : [],\n name,\n typeParameters: undefined,\n })\n\n return appendJSDocToNode({\n node,\n comments,\n })\n}\n\nexport function createNamespaceDeclaration({ statements, name }: { name: string; statements: ts.Statement[] }) {\n return factory.createModuleDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(name),\n factory.createModuleBlock(statements),\n ts.NodeFlags.Namespace,\n )\n}\n\n/**\n * In { propertyName: string; name?: string } is `name` being used to make the type more unique when multiple same names are used.\n * @example `import { Pet as Cat } from './Pet'`\n */\nexport function createImportDeclaration({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: {\n name: string | Array<string | { propertyName: string; name?: string }>\n path: string\n isTypeOnly?: boolean\n isNameSpace?: boolean\n}) {\n if (!Array.isArray(name)) {\n let importPropertyName: ts.Identifier | undefined = factory.createIdentifier(name)\n let importName: ts.NamedImportBindings | undefined\n\n if (isNameSpace) {\n importPropertyName = undefined\n importName = factory.createNamespaceImport(factory.createIdentifier(name))\n }\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(isTypeOnly, importPropertyName, importName),\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(\n isTypeOnly,\n undefined,\n factory.createNamedImports(\n name.map((item) => {\n if (typeof item === 'object') {\n const obj = item as { propertyName: string; name?: string }\n if (obj.name) {\n return factory.createImportSpecifier(false, factory.createIdentifier(obj.propertyName), factory.createIdentifier(obj.name))\n }\n\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(obj.propertyName))\n }\n\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(item))\n }),\n ),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\nexport function createExportDeclaration({\n path,\n asAlias,\n isTypeOnly = false,\n name,\n}: {\n path: string\n asAlias?: boolean\n isTypeOnly?: boolean\n name?: string | Array<ts.Identifier | string>\n}) {\n if (name && !Array.isArray(name) && !asAlias) {\n console.warn(`When using name as string, asAlias should be true ${name}`)\n }\n\n if (!Array.isArray(name)) {\n const parsedName = name?.match(/^\\d/) ? `_${name?.slice(1)}` : name\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n asAlias && parsedName ? factory.createNamespaceExport(factory.createIdentifier(parsedName)) : undefined,\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n factory.createNamedExports(\n name.map((propertyName) => {\n return factory.createExportSpecifier(false, undefined, typeof propertyName === 'string' ? factory.createIdentifier(propertyName) : propertyName)\n }),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\nexport function createEnumDeclaration({\n type = 'enum',\n name,\n typeName,\n enums,\n}: {\n /**\n * @default `'enum'`\n */\n type?: 'enum' | 'asConst' | 'asPascalConst' | 'constEnum' | 'literal'\n /**\n * Enum name in camelCase.\n */\n name: string\n /**\n * Enum name in PascalCase.\n */\n typeName: string\n enums: [key: string | number, value: string | number | boolean][]\n}): [name: ts.Node | undefined, type: ts.Node] {\n if (type === 'literal') {\n return [\n undefined,\n factory.createTypeAliasDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n factory.createUnionTypeNode(\n enums\n .map(([_key, value]) => {\n if (isNumber(value)) {\n return factory.createLiteralTypeNode(factory.createNumericLiteral(value?.toString()))\n }\n\n if (typeof value === 'boolean') {\n return factory.createLiteralTypeNode(value ? factory.createTrue() : factory.createFalse())\n }\n if (value) {\n return factory.createLiteralTypeNode(factory.createStringLiteral(value.toString()))\n }\n\n return undefined\n })\n .filter(Boolean),\n ),\n ),\n ]\n }\n\n if (type === 'enum' || type === 'constEnum') {\n return [\n undefined,\n factory.createEnumDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword), type === 'constEnum' ? factory.createToken(ts.SyntaxKind.ConstKeyword) : undefined].filter(Boolean),\n factory.createIdentifier(typeName),\n enums\n .map(([key, value]) => {\n let initializer: ts.Expression = factory.createStringLiteral(value?.toString())\n const isExactNumber = Number.parseInt(value.toString(), 10) === value\n\n if (isExactNumber && isNumber(Number.parseInt(value.toString(), 10))) {\n initializer = factory.createNumericLiteral(value as number)\n }\n\n if (typeof value === 'boolean') {\n initializer = value ? factory.createTrue() : factory.createFalse()\n }\n\n if (isNumber(Number.parseInt(key.toString(), 10))) {\n return factory.createEnumMember(factory.createStringLiteral(`${typeName}_${key}`), initializer)\n }\n\n if (key) {\n return factory.createEnumMember(factory.createStringLiteral(`${key}`), initializer)\n }\n\n return undefined\n })\n .filter(Boolean),\n ),\n ]\n }\n\n // used when using `as const` instead of an TypeScript enum.\n const identifierName = type === 'asPascalConst' ? typeName : name\n\n return [\n factory.createVariableStatement(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(identifierName),\n undefined,\n undefined,\n factory.createAsExpression(\n factory.createObjectLiteralExpression(\n enums\n .map(([key, value]) => {\n let initializer: ts.Expression = factory.createStringLiteral(value?.toString())\n\n if (isNumber(value)) {\n // Error: Negative numbers should be created in combination with createPrefixUnaryExpression factory.\n // The method createNumericLiteral only accepts positive numbers\n // or those combined with createPrefixUnaryExpression.\n // Therefore, we need to ensure that the number is not negative.\n if (value < 0) {\n initializer = factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, factory.createNumericLiteral(Math.abs(value)))\n } else {\n initializer = factory.createNumericLiteral(value)\n }\n }\n\n if (typeof value === 'boolean') {\n initializer = value ? factory.createTrue() : factory.createFalse()\n }\n\n if (key) {\n return factory.createPropertyAssignment(factory.createStringLiteral(`${key}`), initializer)\n }\n\n return undefined\n })\n .filter(Boolean),\n true,\n ),\n factory.createTypeReferenceNode(factory.createIdentifier('const'), undefined),\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n factory.createTypeAliasDeclaration(\n type === 'asPascalConst' ? [] : [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n factory.createIndexedAccessTypeNode(\n factory.createParenthesizedType(factory.createTypeQueryNode(factory.createIdentifier(identifierName), undefined)),\n factory.createTypeOperatorNode(ts.SyntaxKind.KeyOfKeyword, factory.createTypeQueryNode(factory.createIdentifier(identifierName), undefined)),\n ),\n ),\n ]\n}\n\nexport function createOmitDeclaration({ keys, type, nonNullable }: { keys: Array<string> | string; type: ts.TypeNode; nonNullable?: boolean }) {\n const node = nonNullable ? factory.createTypeReferenceNode(factory.createIdentifier('NonNullable'), [type]) : type\n\n if (Array.isArray(keys)) {\n return factory.createTypeReferenceNode(factory.createIdentifier('Omit'), [\n node,\n factory.createUnionTypeNode(\n keys.map((key) => {\n return factory.createLiteralTypeNode(factory.createStringLiteral(key))\n }),\n ),\n ])\n }\n\n return factory.createTypeReferenceNode(factory.createIdentifier('Omit'), [node, factory.createLiteralTypeNode(factory.createStringLiteral(keys))])\n}\n\nexport const keywordTypeNodes = {\n any: factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\n unknown: factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword),\n void: factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword),\n number: factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),\n integer: factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),\n object: factory.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword),\n string: factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n boolean: factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword),\n undefined: factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword),\n null: factory.createLiteralTypeNode(factory.createToken(ts.SyntaxKind.NullKeyword)),\n} as const\n\nexport const createTypeLiteralNode = factory.createTypeLiteralNode\n\nexport const createTypeReferenceNode = factory.createTypeReferenceNode\nexport const createNumericLiteral = factory.createNumericLiteral\nexport const createStringLiteral = factory.createStringLiteral\n\nexport const createArrayTypeNode = factory.createArrayTypeNode\n\nexport const createLiteralTypeNode = factory.createLiteralTypeNode\nexport const createNull = factory.createNull\nexport const createIdentifier = factory.createIdentifier\n\nexport const createOptionalTypeNode = factory.createOptionalTypeNode\nexport const createTupleTypeNode = factory.createTupleTypeNode\nexport const createRestTypeNode = factory.createRestTypeNode\nexport const createTrue = factory.createTrue\nexport const createFalse = factory.createFalse\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { __export } from "./chunk-Cl8Af3a2.js";
2
- import ts from "typescript";
3
2
  import { isNumber } from "remeda";
3
+ import ts from "typescript";
4
4
 
5
5
  //#region src/factory.ts
6
6
  var factory_exports = {};
@@ -251,4 +251,4 @@ const createFalse = factory.createFalse;
251
251
 
252
252
  //#endregion
253
253
  export { appendJSDocToNode, createArrayDeclaration, createArrayTypeNode, createEnumDeclaration, createExportDeclaration, createFalse, createIdentifier, createImportDeclaration, createIndexSignature, createInterfaceDeclaration, createIntersectionDeclaration, createJSDoc, createLiteralTypeNode, createNamespaceDeclaration, createNull, createNumericLiteral, createOmitDeclaration, createOptionalTypeNode, createParameterSignature, createPropertySignature, createQuestionToken, createRestTypeNode, createStringLiteral, createTrue, createTupleDeclaration, createTupleTypeNode, createTypeAliasDeclaration, createTypeDeclaration, createTypeLiteralNode, createTypeReferenceNode, createUnionDeclaration, factory_exports, keywordTypeNodes, modifiers, syntaxKind };
254
- //# sourceMappingURL=factory-CTKjALU5.js.map
254
+ //# sourceMappingURL=factory-CDjjCkNo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory-CTKjALU5.js","names":["modifiers","questionToken","node","importPropertyName: ts.Identifier | undefined","importName: ts.NamedImportBindings | undefined","propertyName","initializer: ts.Expression"],"sources":["../src/factory.ts"],"sourcesContent":["import { isNumber } from 'remeda'\nimport ts from 'typescript'\n\nconst { SyntaxKind, factory } = ts\n\n// https://ts-ast-viewer.com/\n\nexport const modifiers = {\n async: factory.createModifier(ts.SyntaxKind.AsyncKeyword),\n export: factory.createModifier(ts.SyntaxKind.ExportKeyword),\n const: factory.createModifier(ts.SyntaxKind.ConstKeyword),\n static: factory.createModifier(ts.SyntaxKind.StaticKeyword),\n} as const\n\nexport const syntaxKind = {\n union: SyntaxKind.UnionType as 192,\n} as const\n\nfunction isValidIdentifier(str: string): boolean {\n if (!str.length || str.trim() !== str) {\n return false\n }\n const node = ts.parseIsolatedEntityName(str, ts.ScriptTarget.Latest)\n\n return !!node && node.kind === ts.SyntaxKind.Identifier && ts.identifierToKeywordKind(node.kind as unknown as ts.Identifier) === undefined\n}\n\nfunction propertyName(name: string | ts.PropertyName): ts.PropertyName {\n if (typeof name === 'string') {\n return isValidIdentifier(name) ? factory.createIdentifier(name) : factory.createStringLiteral(name)\n }\n return name\n}\n\nconst questionToken = factory.createToken(ts.SyntaxKind.QuestionToken)\n\nexport function createQuestionToken(token?: boolean | ts.QuestionToken) {\n if (!token) {\n return undefined\n }\n if (token === true) {\n return questionToken\n }\n return token\n}\n\nexport function createIntersectionDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode | null {\n if (!nodes.length) {\n return null\n }\n\n if (nodes.length === 1) {\n return nodes[0] || null\n }\n\n const node = factory.createIntersectionTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\n/**\n * Minimum nodes length of 2\n * @example `string & number`\n */\nexport function createTupleDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode | null {\n if (!nodes.length) {\n return null\n }\n\n if (nodes.length === 1) {\n return nodes[0] || null\n }\n\n const node = factory.createTupleTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\nexport function createArrayDeclaration({ nodes }: { nodes: Array<ts.TypeNode> }): ts.TypeNode | null {\n if (!nodes.length) {\n return factory.createTupleTypeNode([])\n }\n\n if (nodes.length === 1) {\n return factory.createArrayTypeNode(nodes.at(0)!)\n }\n\n return factory.createExpressionWithTypeArguments(factory.createIdentifier('Array'), [factory.createUnionTypeNode(nodes)])\n}\n\n/**\n * Minimum nodes length of 2\n * @example `string | number`\n */\nexport function createUnionDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode {\n if (!nodes.length) {\n return keywordTypeNodes.any\n }\n\n if (nodes.length === 1) {\n return nodes[0] as ts.TypeNode\n }\n\n const node = factory.createUnionTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\nexport function createPropertySignature({\n readOnly,\n modifiers = [],\n name,\n questionToken,\n type,\n}: {\n readOnly?: boolean\n modifiers?: Array<ts.Modifier>\n name: ts.PropertyName | string\n questionToken?: ts.QuestionToken | boolean\n type?: ts.TypeNode\n}) {\n return factory.createPropertySignature(\n [...modifiers, readOnly ? factory.createToken(ts.SyntaxKind.ReadonlyKeyword) : undefined].filter(Boolean),\n propertyName(name),\n createQuestionToken(questionToken),\n type,\n )\n}\n\nexport function createParameterSignature(\n name: string | ts.BindingName,\n {\n modifiers,\n dotDotDotToken,\n questionToken,\n type,\n initializer,\n }: {\n decorators?: Array<ts.Decorator>\n modifiers?: Array<ts.Modifier>\n dotDotDotToken?: ts.DotDotDotToken\n questionToken?: ts.QuestionToken | boolean\n type?: ts.TypeNode\n initializer?: ts.Expression\n },\n): ts.ParameterDeclaration {\n return factory.createParameterDeclaration(modifiers, dotDotDotToken, name, createQuestionToken(questionToken), type, initializer)\n}\n\nexport function createJSDoc({ comments }: { comments: string[] }) {\n if (!comments.length) {\n return null\n }\n return factory.createJSDocComment(\n factory.createNodeArray(\n comments.map((comment, i) => {\n if (i === comments.length - 1) {\n return factory.createJSDocText(comment)\n }\n\n return factory.createJSDocText(`${comment}\\n`)\n }),\n ),\n )\n}\n\n/**\n * @link https://github.com/microsoft/TypeScript/issues/44151\n */\nexport function appendJSDocToNode<TNode extends ts.Node>({ node, comments }: { node: TNode; comments: Array<string | undefined> }) {\n const filteredComments = comments.filter(Boolean)\n\n if (!filteredComments.length) {\n return node\n }\n\n const text = filteredComments.reduce((acc = '', comment = '') => {\n return `${acc}\\n * ${comment.replaceAll('*/', '*\\\\/')}`\n }, '*')\n\n // node: {...node}, with that ts.addSyntheticLeadingComment is appending\n return ts.addSyntheticLeadingComment({ ...node }, ts.SyntaxKind.MultiLineCommentTrivia, `${text || '*'}\\n`, true)\n}\n\nexport function createIndexSignature(\n type: ts.TypeNode,\n {\n modifiers,\n indexName = 'key',\n indexType = factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n }: {\n indexName?: string\n indexType?: ts.TypeNode\n decorators?: Array<ts.Decorator>\n modifiers?: Array<ts.Modifier>\n } = {},\n) {\n return factory.createIndexSignature(modifiers, [createParameterSignature(indexName, { type: indexType })], type)\n}\n\nexport function createTypeAliasDeclaration({\n modifiers,\n name,\n typeParameters,\n type,\n}: {\n modifiers?: Array<ts.Modifier>\n name: string | ts.Identifier\n typeParameters?: Array<ts.TypeParameterDeclaration>\n type: ts.TypeNode\n}) {\n return factory.createTypeAliasDeclaration(modifiers, name, typeParameters, type)\n}\n\nexport function createInterfaceDeclaration({\n modifiers,\n name,\n typeParameters,\n members,\n}: {\n modifiers?: Array<ts.Modifier>\n name: string | ts.Identifier\n typeParameters?: Array<ts.TypeParameterDeclaration>\n members: Array<ts.TypeElement>\n}) {\n return factory.createInterfaceDeclaration(modifiers, name, typeParameters, undefined, members)\n}\n\nexport function createTypeDeclaration({\n syntax,\n isExportable,\n comments,\n name,\n type,\n}: {\n syntax: 'type' | 'interface'\n comments: Array<string | undefined>\n isExportable?: boolean\n name: string | ts.Identifier\n type: ts.TypeNode\n}) {\n if (syntax === 'interface' && 'members' in type) {\n const node = createInterfaceDeclaration({\n members: type.members as Array<ts.TypeElement>,\n modifiers: isExportable ? [modifiers.export] : [],\n name,\n typeParameters: undefined,\n })\n\n return appendJSDocToNode({\n node,\n comments,\n })\n }\n\n const node = createTypeAliasDeclaration({\n type,\n modifiers: isExportable ? [modifiers.export] : [],\n name,\n typeParameters: undefined,\n })\n\n return appendJSDocToNode({\n node,\n comments,\n })\n}\n\nexport function createNamespaceDeclaration({ statements, name }: { name: string; statements: ts.Statement[] }) {\n return factory.createModuleDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(name),\n factory.createModuleBlock(statements),\n ts.NodeFlags.Namespace,\n )\n}\n\n/**\n * In { propertyName: string; name?: string } is `name` being used to make the type more unique when multiple same names are used.\n * @example `import { Pet as Cat } from './Pet'`\n */\nexport function createImportDeclaration({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: {\n name: string | Array<string | { propertyName: string; name?: string }>\n path: string\n isTypeOnly?: boolean\n isNameSpace?: boolean\n}) {\n if (!Array.isArray(name)) {\n let importPropertyName: ts.Identifier | undefined = factory.createIdentifier(name)\n let importName: ts.NamedImportBindings | undefined\n\n if (isNameSpace) {\n importPropertyName = undefined\n importName = factory.createNamespaceImport(factory.createIdentifier(name))\n }\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(isTypeOnly, importPropertyName, importName),\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(\n isTypeOnly,\n undefined,\n factory.createNamedImports(\n name.map((item) => {\n if (typeof item === 'object') {\n const obj = item as { propertyName: string; name?: string }\n if (obj.name) {\n return factory.createImportSpecifier(false, factory.createIdentifier(obj.propertyName), factory.createIdentifier(obj.name))\n }\n\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(obj.propertyName))\n }\n\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(item))\n }),\n ),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\nexport function createExportDeclaration({\n path,\n asAlias,\n isTypeOnly = false,\n name,\n}: {\n path: string\n asAlias?: boolean\n isTypeOnly?: boolean\n name?: string | Array<ts.Identifier | string>\n}) {\n if (name && !Array.isArray(name) && !asAlias) {\n console.warn(`When using name as string, asAlias should be true ${name}`)\n }\n\n if (!Array.isArray(name)) {\n const parsedName = name?.match(/^\\d/) ? `_${name?.slice(1)}` : name\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n asAlias && parsedName ? factory.createNamespaceExport(factory.createIdentifier(parsedName)) : undefined,\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n factory.createNamedExports(\n name.map((propertyName) => {\n return factory.createExportSpecifier(false, undefined, typeof propertyName === 'string' ? factory.createIdentifier(propertyName) : propertyName)\n }),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\nexport function createEnumDeclaration({\n type = 'enum',\n name,\n typeName,\n enums,\n}: {\n /**\n * @default `'enum'`\n */\n type?: 'enum' | 'asConst' | 'asPascalConst' | 'constEnum' | 'literal'\n /**\n * Enum name in camelCase.\n */\n name: string\n /**\n * Enum name in PascalCase.\n */\n typeName: string\n enums: [key: string | number, value: string | number | boolean][]\n}): [name: ts.Node | undefined, type: ts.Node] {\n if (type === 'literal') {\n return [\n undefined,\n factory.createTypeAliasDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n factory.createUnionTypeNode(\n enums\n .map(([_key, value]) => {\n if (isNumber(value)) {\n return factory.createLiteralTypeNode(factory.createNumericLiteral(value?.toString()))\n }\n\n if (typeof value === 'boolean') {\n return factory.createLiteralTypeNode(value ? factory.createTrue() : factory.createFalse())\n }\n if (value) {\n return factory.createLiteralTypeNode(factory.createStringLiteral(value.toString()))\n }\n\n return undefined\n })\n .filter(Boolean),\n ),\n ),\n ]\n }\n\n if (type === 'enum' || type === 'constEnum') {\n return [\n undefined,\n factory.createEnumDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword), type === 'constEnum' ? factory.createToken(ts.SyntaxKind.ConstKeyword) : undefined].filter(Boolean),\n factory.createIdentifier(typeName),\n enums\n .map(([key, value]) => {\n let initializer: ts.Expression = factory.createStringLiteral(value?.toString())\n const isExactNumber = Number.parseInt(value.toString(), 10) === value\n\n if (isExactNumber && isNumber(Number.parseInt(value.toString(), 10))) {\n initializer = factory.createNumericLiteral(value as number)\n }\n\n if (typeof value === 'boolean') {\n initializer = value ? factory.createTrue() : factory.createFalse()\n }\n\n if (isNumber(Number.parseInt(key.toString(), 10))) {\n return factory.createEnumMember(factory.createStringLiteral(`${typeName}_${key}`), initializer)\n }\n\n if (key) {\n return factory.createEnumMember(factory.createStringLiteral(`${key}`), initializer)\n }\n\n return undefined\n })\n .filter(Boolean),\n ),\n ]\n }\n\n // used when using `as const` instead of an TypeScript enum.\n const identifierName = type === 'asPascalConst' ? typeName : name\n\n return [\n factory.createVariableStatement(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(identifierName),\n undefined,\n undefined,\n factory.createAsExpression(\n factory.createObjectLiteralExpression(\n enums\n .map(([key, value]) => {\n let initializer: ts.Expression = factory.createStringLiteral(value?.toString())\n\n if (isNumber(value)) {\n // Error: Negative numbers should be created in combination with createPrefixUnaryExpression factory.\n // The method createNumericLiteral only accepts positive numbers\n // or those combined with createPrefixUnaryExpression.\n // Therefore, we need to ensure that the number is not negative.\n if (value < 0) {\n initializer = factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, factory.createNumericLiteral(Math.abs(value)))\n } else {\n initializer = factory.createNumericLiteral(value)\n }\n }\n\n if (typeof value === 'boolean') {\n initializer = value ? factory.createTrue() : factory.createFalse()\n }\n\n if (key) {\n return factory.createPropertyAssignment(factory.createStringLiteral(`${key}`), initializer)\n }\n\n return undefined\n })\n .filter(Boolean),\n true,\n ),\n factory.createTypeReferenceNode(factory.createIdentifier('const'), undefined),\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n factory.createTypeAliasDeclaration(\n type === 'asPascalConst' ? [] : [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n factory.createIndexedAccessTypeNode(\n factory.createParenthesizedType(factory.createTypeQueryNode(factory.createIdentifier(identifierName), undefined)),\n factory.createTypeOperatorNode(ts.SyntaxKind.KeyOfKeyword, factory.createTypeQueryNode(factory.createIdentifier(identifierName), undefined)),\n ),\n ),\n ]\n}\n\nexport function createOmitDeclaration({ keys, type, nonNullable }: { keys: Array<string> | string; type: ts.TypeNode; nonNullable?: boolean }) {\n const node = nonNullable ? factory.createTypeReferenceNode(factory.createIdentifier('NonNullable'), [type]) : type\n\n if (Array.isArray(keys)) {\n return factory.createTypeReferenceNode(factory.createIdentifier('Omit'), [\n node,\n factory.createUnionTypeNode(\n keys.map((key) => {\n return factory.createLiteralTypeNode(factory.createStringLiteral(key))\n }),\n ),\n ])\n }\n\n return factory.createTypeReferenceNode(factory.createIdentifier('Omit'), [node, factory.createLiteralTypeNode(factory.createStringLiteral(keys))])\n}\n\nexport const keywordTypeNodes = {\n any: factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\n unknown: factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword),\n void: factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword),\n number: factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),\n integer: factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),\n object: factory.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword),\n string: factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n boolean: factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword),\n undefined: factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword),\n null: factory.createLiteralTypeNode(factory.createToken(ts.SyntaxKind.NullKeyword)),\n} as const\n\nexport const createTypeLiteralNode = factory.createTypeLiteralNode\n\nexport const createTypeReferenceNode = factory.createTypeReferenceNode\nexport const createNumericLiteral = factory.createNumericLiteral\nexport const createStringLiteral = factory.createStringLiteral\n\nexport const createArrayTypeNode = factory.createArrayTypeNode\n\nexport const createLiteralTypeNode = factory.createLiteralTypeNode\nexport const createNull = factory.createNull\nexport const createIdentifier = factory.createIdentifier\n\nexport const createOptionalTypeNode = factory.createOptionalTypeNode\nexport const createTupleTypeNode = factory.createTupleTypeNode\nexport const createRestTypeNode = factory.createRestTypeNode\nexport const createTrue = factory.createTrue\nexport const createFalse = factory.createFalse\n"],"mappings":"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"}
1
+ {"version":3,"file":"factory-CDjjCkNo.js","names":["modifiers","questionToken","node","importPropertyName: ts.Identifier | undefined","importName: ts.NamedImportBindings | undefined","propertyName","initializer: ts.Expression"],"sources":["../src/factory.ts"],"sourcesContent":["import { isNumber } from 'remeda'\nimport ts from 'typescript'\n\nconst { SyntaxKind, factory } = ts\n\n// https://ts-ast-viewer.com/\n\nexport const modifiers = {\n async: factory.createModifier(ts.SyntaxKind.AsyncKeyword),\n export: factory.createModifier(ts.SyntaxKind.ExportKeyword),\n const: factory.createModifier(ts.SyntaxKind.ConstKeyword),\n static: factory.createModifier(ts.SyntaxKind.StaticKeyword),\n} as const\n\nexport const syntaxKind = {\n union: SyntaxKind.UnionType as 192,\n} as const\n\nfunction isValidIdentifier(str: string): boolean {\n if (!str.length || str.trim() !== str) {\n return false\n }\n const node = ts.parseIsolatedEntityName(str, ts.ScriptTarget.Latest)\n\n return !!node && node.kind === ts.SyntaxKind.Identifier && ts.identifierToKeywordKind(node.kind as unknown as ts.Identifier) === undefined\n}\n\nfunction propertyName(name: string | ts.PropertyName): ts.PropertyName {\n if (typeof name === 'string') {\n return isValidIdentifier(name) ? factory.createIdentifier(name) : factory.createStringLiteral(name)\n }\n return name\n}\n\nconst questionToken = factory.createToken(ts.SyntaxKind.QuestionToken)\n\nexport function createQuestionToken(token?: boolean | ts.QuestionToken) {\n if (!token) {\n return undefined\n }\n if (token === true) {\n return questionToken\n }\n return token\n}\n\nexport function createIntersectionDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode | null {\n if (!nodes.length) {\n return null\n }\n\n if (nodes.length === 1) {\n return nodes[0] || null\n }\n\n const node = factory.createIntersectionTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\n/**\n * Minimum nodes length of 2\n * @example `string & number`\n */\nexport function createTupleDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode | null {\n if (!nodes.length) {\n return null\n }\n\n if (nodes.length === 1) {\n return nodes[0] || null\n }\n\n const node = factory.createTupleTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\nexport function createArrayDeclaration({ nodes }: { nodes: Array<ts.TypeNode> }): ts.TypeNode | null {\n if (!nodes.length) {\n return factory.createTupleTypeNode([])\n }\n\n if (nodes.length === 1) {\n return factory.createArrayTypeNode(nodes.at(0)!)\n }\n\n return factory.createExpressionWithTypeArguments(factory.createIdentifier('Array'), [factory.createUnionTypeNode(nodes)])\n}\n\n/**\n * Minimum nodes length of 2\n * @example `string | number`\n */\nexport function createUnionDeclaration({ nodes, withParentheses }: { nodes: Array<ts.TypeNode>; withParentheses?: boolean }): ts.TypeNode {\n if (!nodes.length) {\n return keywordTypeNodes.any\n }\n\n if (nodes.length === 1) {\n return nodes[0] as ts.TypeNode\n }\n\n const node = factory.createUnionTypeNode(nodes)\n\n if (withParentheses) {\n return factory.createParenthesizedType(node)\n }\n\n return node\n}\n\nexport function createPropertySignature({\n readOnly,\n modifiers = [],\n name,\n questionToken,\n type,\n}: {\n readOnly?: boolean\n modifiers?: Array<ts.Modifier>\n name: ts.PropertyName | string\n questionToken?: ts.QuestionToken | boolean\n type?: ts.TypeNode\n}) {\n return factory.createPropertySignature(\n [...modifiers, readOnly ? factory.createToken(ts.SyntaxKind.ReadonlyKeyword) : undefined].filter(Boolean),\n propertyName(name),\n createQuestionToken(questionToken),\n type,\n )\n}\n\nexport function createParameterSignature(\n name: string | ts.BindingName,\n {\n modifiers,\n dotDotDotToken,\n questionToken,\n type,\n initializer,\n }: {\n decorators?: Array<ts.Decorator>\n modifiers?: Array<ts.Modifier>\n dotDotDotToken?: ts.DotDotDotToken\n questionToken?: ts.QuestionToken | boolean\n type?: ts.TypeNode\n initializer?: ts.Expression\n },\n): ts.ParameterDeclaration {\n return factory.createParameterDeclaration(modifiers, dotDotDotToken, name, createQuestionToken(questionToken), type, initializer)\n}\n\nexport function createJSDoc({ comments }: { comments: string[] }) {\n if (!comments.length) {\n return null\n }\n return factory.createJSDocComment(\n factory.createNodeArray(\n comments.map((comment, i) => {\n if (i === comments.length - 1) {\n return factory.createJSDocText(comment)\n }\n\n return factory.createJSDocText(`${comment}\\n`)\n }),\n ),\n )\n}\n\n/**\n * @link https://github.com/microsoft/TypeScript/issues/44151\n */\nexport function appendJSDocToNode<TNode extends ts.Node>({ node, comments }: { node: TNode; comments: Array<string | undefined> }) {\n const filteredComments = comments.filter(Boolean)\n\n if (!filteredComments.length) {\n return node\n }\n\n const text = filteredComments.reduce((acc = '', comment = '') => {\n return `${acc}\\n * ${comment.replaceAll('*/', '*\\\\/')}`\n }, '*')\n\n // node: {...node}, with that ts.addSyntheticLeadingComment is appending\n return ts.addSyntheticLeadingComment({ ...node }, ts.SyntaxKind.MultiLineCommentTrivia, `${text || '*'}\\n`, true)\n}\n\nexport function createIndexSignature(\n type: ts.TypeNode,\n {\n modifiers,\n indexName = 'key',\n indexType = factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n }: {\n indexName?: string\n indexType?: ts.TypeNode\n decorators?: Array<ts.Decorator>\n modifiers?: Array<ts.Modifier>\n } = {},\n) {\n return factory.createIndexSignature(modifiers, [createParameterSignature(indexName, { type: indexType })], type)\n}\n\nexport function createTypeAliasDeclaration({\n modifiers,\n name,\n typeParameters,\n type,\n}: {\n modifiers?: Array<ts.Modifier>\n name: string | ts.Identifier\n typeParameters?: Array<ts.TypeParameterDeclaration>\n type: ts.TypeNode\n}) {\n return factory.createTypeAliasDeclaration(modifiers, name, typeParameters, type)\n}\n\nexport function createInterfaceDeclaration({\n modifiers,\n name,\n typeParameters,\n members,\n}: {\n modifiers?: Array<ts.Modifier>\n name: string | ts.Identifier\n typeParameters?: Array<ts.TypeParameterDeclaration>\n members: Array<ts.TypeElement>\n}) {\n return factory.createInterfaceDeclaration(modifiers, name, typeParameters, undefined, members)\n}\n\nexport function createTypeDeclaration({\n syntax,\n isExportable,\n comments,\n name,\n type,\n}: {\n syntax: 'type' | 'interface'\n comments: Array<string | undefined>\n isExportable?: boolean\n name: string | ts.Identifier\n type: ts.TypeNode\n}) {\n if (syntax === 'interface' && 'members' in type) {\n const node = createInterfaceDeclaration({\n members: type.members as Array<ts.TypeElement>,\n modifiers: isExportable ? [modifiers.export] : [],\n name,\n typeParameters: undefined,\n })\n\n return appendJSDocToNode({\n node,\n comments,\n })\n }\n\n const node = createTypeAliasDeclaration({\n type,\n modifiers: isExportable ? [modifiers.export] : [],\n name,\n typeParameters: undefined,\n })\n\n return appendJSDocToNode({\n node,\n comments,\n })\n}\n\nexport function createNamespaceDeclaration({ statements, name }: { name: string; statements: ts.Statement[] }) {\n return factory.createModuleDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(name),\n factory.createModuleBlock(statements),\n ts.NodeFlags.Namespace,\n )\n}\n\n/**\n * In { propertyName: string; name?: string } is `name` being used to make the type more unique when multiple same names are used.\n * @example `import { Pet as Cat } from './Pet'`\n */\nexport function createImportDeclaration({\n name,\n path,\n isTypeOnly = false,\n isNameSpace = false,\n}: {\n name: string | Array<string | { propertyName: string; name?: string }>\n path: string\n isTypeOnly?: boolean\n isNameSpace?: boolean\n}) {\n if (!Array.isArray(name)) {\n let importPropertyName: ts.Identifier | undefined = factory.createIdentifier(name)\n let importName: ts.NamedImportBindings | undefined\n\n if (isNameSpace) {\n importPropertyName = undefined\n importName = factory.createNamespaceImport(factory.createIdentifier(name))\n }\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(isTypeOnly, importPropertyName, importName),\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(\n isTypeOnly,\n undefined,\n factory.createNamedImports(\n name.map((item) => {\n if (typeof item === 'object') {\n const obj = item as { propertyName: string; name?: string }\n if (obj.name) {\n return factory.createImportSpecifier(false, factory.createIdentifier(obj.propertyName), factory.createIdentifier(obj.name))\n }\n\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(obj.propertyName))\n }\n\n return factory.createImportSpecifier(false, undefined, factory.createIdentifier(item))\n }),\n ),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\nexport function createExportDeclaration({\n path,\n asAlias,\n isTypeOnly = false,\n name,\n}: {\n path: string\n asAlias?: boolean\n isTypeOnly?: boolean\n name?: string | Array<ts.Identifier | string>\n}) {\n if (name && !Array.isArray(name) && !asAlias) {\n console.warn(`When using name as string, asAlias should be true ${name}`)\n }\n\n if (!Array.isArray(name)) {\n const parsedName = name?.match(/^\\d/) ? `_${name?.slice(1)}` : name\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n asAlias && parsedName ? factory.createNamespaceExport(factory.createIdentifier(parsedName)) : undefined,\n factory.createStringLiteral(path),\n undefined,\n )\n }\n\n return factory.createExportDeclaration(\n undefined,\n isTypeOnly,\n factory.createNamedExports(\n name.map((propertyName) => {\n return factory.createExportSpecifier(false, undefined, typeof propertyName === 'string' ? factory.createIdentifier(propertyName) : propertyName)\n }),\n ),\n factory.createStringLiteral(path),\n undefined,\n )\n}\n\nexport function createEnumDeclaration({\n type = 'enum',\n name,\n typeName,\n enums,\n}: {\n /**\n * @default `'enum'`\n */\n type?: 'enum' | 'asConst' | 'asPascalConst' | 'constEnum' | 'literal'\n /**\n * Enum name in camelCase.\n */\n name: string\n /**\n * Enum name in PascalCase.\n */\n typeName: string\n enums: [key: string | number, value: string | number | boolean][]\n}): [name: ts.Node | undefined, type: ts.Node] {\n if (type === 'literal') {\n return [\n undefined,\n factory.createTypeAliasDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n factory.createUnionTypeNode(\n enums\n .map(([_key, value]) => {\n if (isNumber(value)) {\n return factory.createLiteralTypeNode(factory.createNumericLiteral(value?.toString()))\n }\n\n if (typeof value === 'boolean') {\n return factory.createLiteralTypeNode(value ? factory.createTrue() : factory.createFalse())\n }\n if (value) {\n return factory.createLiteralTypeNode(factory.createStringLiteral(value.toString()))\n }\n\n return undefined\n })\n .filter(Boolean),\n ),\n ),\n ]\n }\n\n if (type === 'enum' || type === 'constEnum') {\n return [\n undefined,\n factory.createEnumDeclaration(\n [factory.createToken(ts.SyntaxKind.ExportKeyword), type === 'constEnum' ? factory.createToken(ts.SyntaxKind.ConstKeyword) : undefined].filter(Boolean),\n factory.createIdentifier(typeName),\n enums\n .map(([key, value]) => {\n let initializer: ts.Expression = factory.createStringLiteral(value?.toString())\n const isExactNumber = Number.parseInt(value.toString(), 10) === value\n\n if (isExactNumber && isNumber(Number.parseInt(value.toString(), 10))) {\n initializer = factory.createNumericLiteral(value as number)\n }\n\n if (typeof value === 'boolean') {\n initializer = value ? factory.createTrue() : factory.createFalse()\n }\n\n if (isNumber(Number.parseInt(key.toString(), 10))) {\n return factory.createEnumMember(factory.createStringLiteral(`${typeName}_${key}`), initializer)\n }\n\n if (key) {\n return factory.createEnumMember(factory.createStringLiteral(`${key}`), initializer)\n }\n\n return undefined\n })\n .filter(Boolean),\n ),\n ]\n }\n\n // used when using `as const` instead of an TypeScript enum.\n const identifierName = type === 'asPascalConst' ? typeName : name\n\n return [\n factory.createVariableStatement(\n [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier(identifierName),\n undefined,\n undefined,\n factory.createAsExpression(\n factory.createObjectLiteralExpression(\n enums\n .map(([key, value]) => {\n let initializer: ts.Expression = factory.createStringLiteral(value?.toString())\n\n if (isNumber(value)) {\n // Error: Negative numbers should be created in combination with createPrefixUnaryExpression factory.\n // The method createNumericLiteral only accepts positive numbers\n // or those combined with createPrefixUnaryExpression.\n // Therefore, we need to ensure that the number is not negative.\n if (value < 0) {\n initializer = factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, factory.createNumericLiteral(Math.abs(value)))\n } else {\n initializer = factory.createNumericLiteral(value)\n }\n }\n\n if (typeof value === 'boolean') {\n initializer = value ? factory.createTrue() : factory.createFalse()\n }\n\n if (key) {\n return factory.createPropertyAssignment(factory.createStringLiteral(`${key}`), initializer)\n }\n\n return undefined\n })\n .filter(Boolean),\n true,\n ),\n factory.createTypeReferenceNode(factory.createIdentifier('const'), undefined),\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n factory.createTypeAliasDeclaration(\n type === 'asPascalConst' ? [] : [factory.createToken(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n factory.createIndexedAccessTypeNode(\n factory.createParenthesizedType(factory.createTypeQueryNode(factory.createIdentifier(identifierName), undefined)),\n factory.createTypeOperatorNode(ts.SyntaxKind.KeyOfKeyword, factory.createTypeQueryNode(factory.createIdentifier(identifierName), undefined)),\n ),\n ),\n ]\n}\n\nexport function createOmitDeclaration({ keys, type, nonNullable }: { keys: Array<string> | string; type: ts.TypeNode; nonNullable?: boolean }) {\n const node = nonNullable ? factory.createTypeReferenceNode(factory.createIdentifier('NonNullable'), [type]) : type\n\n if (Array.isArray(keys)) {\n return factory.createTypeReferenceNode(factory.createIdentifier('Omit'), [\n node,\n factory.createUnionTypeNode(\n keys.map((key) => {\n return factory.createLiteralTypeNode(factory.createStringLiteral(key))\n }),\n ),\n ])\n }\n\n return factory.createTypeReferenceNode(factory.createIdentifier('Omit'), [node, factory.createLiteralTypeNode(factory.createStringLiteral(keys))])\n}\n\nexport const keywordTypeNodes = {\n any: factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword),\n unknown: factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword),\n void: factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword),\n number: factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),\n integer: factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword),\n object: factory.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword),\n string: factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n boolean: factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword),\n undefined: factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword),\n null: factory.createLiteralTypeNode(factory.createToken(ts.SyntaxKind.NullKeyword)),\n} as const\n\nexport const createTypeLiteralNode = factory.createTypeLiteralNode\n\nexport const createTypeReferenceNode = factory.createTypeReferenceNode\nexport const createNumericLiteral = factory.createNumericLiteral\nexport const createStringLiteral = factory.createStringLiteral\n\nexport const createArrayTypeNode = factory.createArrayTypeNode\n\nexport const createLiteralTypeNode = factory.createLiteralTypeNode\nexport const createNull = factory.createNull\nexport const createIdentifier = factory.createIdentifier\n\nexport const createOptionalTypeNode = factory.createOptionalTypeNode\nexport const createTupleTypeNode = factory.createTupleTypeNode\nexport const createRestTypeNode = factory.createRestTypeNode\nexport const createTrue = factory.createTrue\nexport const createFalse = factory.createFalse\n"],"mappings":"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"}
package/dist/factory.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_factory = require('./factory-DeJMlphM.cjs');
1
+ const require_factory = require('./factory-BSd2OjFQ.cjs');
2
2
 
3
3
  exports.appendJSDocToNode = require_factory.appendJSDocToNode;
4
4
  exports.createArrayDeclaration = require_factory.createArrayDeclaration;
package/dist/factory.js CHANGED
@@ -1,3 +1,3 @@
1
- import { appendJSDocToNode, createArrayDeclaration, createArrayTypeNode, createEnumDeclaration, createExportDeclaration, createFalse, createIdentifier, createImportDeclaration, createIndexSignature, createInterfaceDeclaration, createIntersectionDeclaration, createJSDoc, createLiteralTypeNode, createNamespaceDeclaration, createNull, createNumericLiteral, createOmitDeclaration, createOptionalTypeNode, createParameterSignature, createPropertySignature, createQuestionToken, createRestTypeNode, createStringLiteral, createTrue, createTupleDeclaration, createTupleTypeNode, createTypeAliasDeclaration, createTypeDeclaration, createTypeLiteralNode, createTypeReferenceNode, createUnionDeclaration, keywordTypeNodes, modifiers, syntaxKind } from "./factory-CTKjALU5.js";
1
+ import { appendJSDocToNode, createArrayDeclaration, createArrayTypeNode, createEnumDeclaration, createExportDeclaration, createFalse, createIdentifier, createImportDeclaration, createIndexSignature, createInterfaceDeclaration, createIntersectionDeclaration, createJSDoc, createLiteralTypeNode, createNamespaceDeclaration, createNull, createNumericLiteral, createOmitDeclaration, createOptionalTypeNode, createParameterSignature, createPropertySignature, createQuestionToken, createRestTypeNode, createStringLiteral, createTrue, createTupleDeclaration, createTupleTypeNode, createTypeAliasDeclaration, createTypeDeclaration, createTypeLiteralNode, createTypeReferenceNode, createUnionDeclaration, keywordTypeNodes, modifiers, syntaxKind } from "./factory-CDjjCkNo.js";
2
2
 
3
3
  export { appendJSDocToNode, createArrayDeclaration, createArrayTypeNode, createEnumDeclaration, createExportDeclaration, createFalse, createIdentifier, createImportDeclaration, createIndexSignature, createInterfaceDeclaration, createIntersectionDeclaration, createJSDoc, createLiteralTypeNode, createNamespaceDeclaration, createNull, createNumericLiteral, createOmitDeclaration, createOptionalTypeNode, createParameterSignature, createPropertySignature, createQuestionToken, createRestTypeNode, createStringLiteral, createTrue, createTupleDeclaration, createTupleTypeNode, createTypeAliasDeclaration, createTypeDeclaration, createTypeLiteralNode, createTypeReferenceNode, createUnionDeclaration, keywordTypeNodes, modifiers, syntaxKind };
package/dist/index.cjs CHANGED
@@ -1,59 +1,60 @@
1
- const require_factory = require('./factory-DeJMlphM.cjs');
1
+ const require_factory = require('./factory-BSd2OjFQ.cjs');
2
2
  const typescript = require_factory.__toESM(require("typescript"));
3
3
  const prettier = require_factory.__toESM(require("prettier"));
4
4
  const prettier_plugins_typescript = require_factory.__toESM(require("prettier/plugins/typescript"));
5
5
 
6
+ //#region src/format.ts
7
+ const formatOptions = {
8
+ tabWidth: 2,
9
+ printWidth: 160,
10
+ parser: "typescript",
11
+ singleQuote: true,
12
+ semi: false,
13
+ bracketSameLine: false,
14
+ endOfLine: "auto",
15
+ plugins: [prettier_plugins_typescript.default]
16
+ };
17
+ function format(source) {
18
+ if (!source) return Promise.resolve("");
19
+ try {
20
+ return (0, prettier.format)(source, formatOptions);
21
+ } catch (_e) {
22
+ return Promise.resolve(source);
23
+ }
24
+ }
25
+
26
+ //#endregion
6
27
  //#region src/print.ts
7
28
  const { factory } = typescript.default;
8
29
  /**
9
30
  * Escaped new lines in code with block comments so they can be restored by {@link restoreNewLines}
10
- * @param code The code to escape new lines in
11
- * @returns The same code but with new lines escaped using block comments
12
31
  */
13
32
  const escapeNewLines = (code) => code.replace(/\n\n/g, "\n/* :newline: */");
14
33
  /**
15
34
  * Reverses {@link escapeNewLines} and restores new lines
16
- * @param code The code with escaped new lines
17
- * @returns The same code with new lines restored
18
35
  */
19
36
  const restoreNewLines = (code) => code.replace(/\/\* :newline: \*\//g, "\n");
20
37
  /**
21
- * Convert AST TypeScript nodes to a string based on the TypeScript printer.
38
+ * Convert AST TypeScript/TSX nodes to a string based on the TypeScript printer.
22
39
  * Ensures consistent output across environments.
40
+ * Also works as a formatter when `source` is provided without `elements`.
23
41
  */
24
- function print(elements, { source = "", baseName = "print.ts", removeComments, noEmitHelpers, newLine = typescript.default.NewLineKind.LineFeed, scriptKind = typescript.default.ScriptKind.TS } = {}) {
25
- const sourceFile = typescript.default.createSourceFile(baseName, escapeNewLines(source), typescript.default.ScriptTarget.ES2022, false, scriptKind);
42
+ function print(elements = [], { source = "", baseName = "print.tsx", scriptKind = typescript.default.ScriptKind.TSX } = {}) {
43
+ const sourceFile = typescript.default.createSourceFile(baseName, escapeNewLines(source), typescript.default.ScriptTarget.ES2022, true, scriptKind);
26
44
  const printer = typescript.default.createPrinter({
27
45
  omitTrailingSemicolon: true,
28
- newLine,
29
- removeComments,
30
- noEmitHelpers
46
+ newLine: typescript.default.NewLineKind.LineFeed,
47
+ removeComments: false,
48
+ noEmitHelpers: true
31
49
  });
32
- const nodes = (Array.isArray(elements) ? elements : [elements]).filter(Boolean).sort((a, b) => (a.pos ?? 0) - (b.pos ?? 0));
33
- const output = printer.printList(typescript.default.ListFormat.MultiLine, factory.createNodeArray(nodes), sourceFile);
50
+ let output;
51
+ if (elements.length > 0) {
52
+ const nodes = elements.filter(Boolean).sort((a, b) => (a.pos ?? 0) - (b.pos ?? 0));
53
+ output = printer.printList(typescript.default.ListFormat.MultiLine, factory.createNodeArray(nodes), sourceFile);
54
+ } else output = printer.printFile(sourceFile);
34
55
  return restoreNewLines(output).replace(/\r\n/g, "\n");
35
56
  }
36
57
 
37
- //#endregion
38
- //#region src/format.ts
39
- const formatOptions = {
40
- tabWidth: 2,
41
- printWidth: 160,
42
- parser: "typescript",
43
- singleQuote: true,
44
- semi: false,
45
- bracketSameLine: false,
46
- endOfLine: "auto",
47
- plugins: [prettier_plugins_typescript.default]
48
- };
49
- /**
50
- * Format the generated code based on Prettier
51
- */
52
- async function format(source) {
53
- if (!source) return "";
54
- return (0, prettier.format)(source, formatOptions);
55
- }
56
-
57
58
  //#endregion
58
59
  Object.defineProperty(exports, 'factory', {
59
60
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["ts","formatOptions: Options","pluginTypescript"],"sources":["../src/print.ts","../src/format.ts"],"sourcesContent":["import ts from 'typescript'\n\nimport type { PrinterOptions } from 'typescript'\n\nconst { factory } = ts\n\nexport type PrintOptions = {\n source?: string\n baseName?: string\n scriptKind?: ts.ScriptKind\n} & PrinterOptions\n\n/**\n * Escaped new lines in code with block comments so they can be restored by {@link restoreNewLines}\n * @param code The code to escape new lines in\n * @returns The same code but with new lines escaped using block comments\n */\nconst escapeNewLines = (code: string) => code.replace(/\\n\\n/g, '\\n/* :newline: */')\n\n/**\n * Reverses {@link escapeNewLines} and restores new lines\n * @param code The code with escaped new lines\n * @returns The same code with new lines restored\n */\nconst restoreNewLines = (code: string) => code.replace(/\\/\\* :newline: \\*\\//g, '\\n')\n\n/**\n * Convert AST TypeScript nodes to a string based on the TypeScript printer.\n * Ensures consistent output across environments.\n */\nexport function print(\n elements: Array<ts.Node>,\n { source = '', baseName = 'print.ts', removeComments, noEmitHelpers, newLine = ts.NewLineKind.LineFeed, scriptKind = ts.ScriptKind.TS }: PrintOptions = {},\n): string {\n const sourceFile = ts.createSourceFile(baseName, escapeNewLines(source), ts.ScriptTarget.ES2022, false, scriptKind)\n\n const printer = ts.createPrinter({\n omitTrailingSemicolon: true,\n newLine,\n removeComments,\n noEmitHelpers,\n })\n // make sure that the nodes have the same order on every machine\n const nodes = (Array.isArray(elements) ? elements : [elements]).filter(Boolean).sort((a, b) => (a.pos ?? 0) - (b.pos ?? 0))\n\n const output = printer.printList(ts.ListFormat.MultiLine, factory.createNodeArray(nodes), sourceFile)\n\n return restoreNewLines(output).replace(/\\r\\n/g, '\\n')\n}\n","import { format as prettierFormat } from 'prettier'\nimport pluginTypescript from 'prettier/plugins/typescript'\n\nimport type { Options } from 'prettier'\n\nconst formatOptions: Options = {\n tabWidth: 2,\n printWidth: 160,\n parser: 'typescript',\n singleQuote: true,\n semi: false,\n bracketSameLine: false,\n endOfLine: 'auto',\n plugins: [pluginTypescript],\n}\n\n/**\n * Format the generated code based on Prettier\n */\nexport async function format(source: string) {\n // do some basic linting with the ts compiler\n if (!source) {\n return ''\n }\n\n return prettierFormat(source, formatOptions)\n}\n"],"mappings":";;;;;;AAIA,MAAM,EAAE,SAAS,GAAGA;;;;;;AAapB,MAAM,kBAAkB,SAAiB,KAAK,QAAQ,SAAS;;;;;;AAO/D,MAAM,mBAAmB,SAAiB,KAAK,QAAQ,wBAAwB;;;;;AAM/E,SAAgB,MACd,UACA,EAAE,SAAS,IAAI,WAAW,YAAY,gBAAgB,eAAe,UAAUA,mBAAG,YAAY,UAAU,aAAaA,mBAAG,WAAW,IAAkB,GAAG,EAAE,EAClJ;CACR,MAAM,aAAaA,mBAAG,iBAAiB,UAAU,eAAe,SAASA,mBAAG,aAAa,QAAQ,OAAO;CAExG,MAAM,UAAUA,mBAAG,cAAc;EAC/B,uBAAuB;EACvB;EACA;EACA;EACD;CAED,MAAM,SAAS,MAAM,QAAQ,YAAY,WAAW,CAAC,SAAS,EAAE,OAAO,SAAS,MAAM,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE,OAAO;CAExH,MAAM,SAAS,QAAQ,UAAUA,mBAAG,WAAW,WAAW,QAAQ,gBAAgB,QAAQ;AAE1F,QAAO,gBAAgB,QAAQ,QAAQ,SAAS;AACjD;;;;AC3CD,MAAMC,gBAAyB;CAC7B,UAAU;CACV,YAAY;CACZ,QAAQ;CACR,aAAa;CACb,MAAM;CACN,iBAAiB;CACjB,WAAW;CACX,SAAS,CAACC,oCAAiB;CAC5B;;;;AAKD,eAAsB,OAAO,QAAgB;AAE3C,KAAI,CAAC,OACH,QAAO;AAGT,6BAAsB,QAAQ;AAC/B"}
1
+ {"version":3,"file":"index.cjs","names":["formatOptions: Options","pluginTypescript","ts","output: string"],"sources":["../src/format.ts","../src/print.ts"],"sourcesContent":["import type { Options } from 'prettier'\nimport { format as prettierFormat } from 'prettier'\nimport pluginTypescript from 'prettier/plugins/typescript'\n\nconst formatOptions: Options = {\n tabWidth: 2,\n printWidth: 160,\n parser: 'typescript',\n singleQuote: true,\n semi: false,\n bracketSameLine: false,\n endOfLine: 'auto',\n plugins: [pluginTypescript],\n}\nexport function format(source?: string): Promise<string> {\n if (!source) {\n return Promise.resolve('')\n }\n\n try {\n return prettierFormat(source, formatOptions)\n } catch (_e) {\n return Promise.resolve(source)\n }\n}\n","import ts from 'typescript'\n\nconst { factory } = ts\n\nexport type PrintOptions = {\n source?: string\n baseName?: string\n scriptKind?: ts.ScriptKind\n}\n\n/**\n * Escaped new lines in code with block comments so they can be restored by {@link restoreNewLines}\n */\nconst escapeNewLines = (code: string) => code.replace(/\\n\\n/g, '\\n/* :newline: */')\n\n/**\n * Reverses {@link escapeNewLines} and restores new lines\n */\nconst restoreNewLines = (code: string) => code.replace(/\\/\\* :newline: \\*\\//g, '\\n')\n\n/**\n * Convert AST TypeScript/TSX nodes to a string based on the TypeScript printer.\n * Ensures consistent output across environments.\n * Also works as a formatter when `source` is provided without `elements`.\n */\nexport function print(elements: Array<ts.Node> = [], { source = '', baseName = 'print.tsx', scriptKind = ts.ScriptKind.TSX }: PrintOptions = {}): string {\n const sourceFile = ts.createSourceFile(baseName, escapeNewLines(source), ts.ScriptTarget.ES2022, true, scriptKind)\n\n const printer = ts.createPrinter({\n omitTrailingSemicolon: true,\n newLine: ts.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n })\n\n let output: string\n\n if (elements.length > 0) {\n // Print only provided nodes\n const nodes = elements.filter(Boolean).sort((a, b) => (a.pos ?? 0) - (b.pos ?? 0))\n output = printer.printList(ts.ListFormat.MultiLine, factory.createNodeArray(nodes), sourceFile)\n } else {\n // Format the whole file\n output = printer.printFile(sourceFile)\n }\n\n return restoreNewLines(output).replace(/\\r\\n/g, '\\n')\n}\n"],"mappings":";;;;;;AAIA,MAAMA,gBAAyB;CAC7B,UAAU;CACV,YAAY;CACZ,QAAQ;CACR,aAAa;CACb,MAAM;CACN,iBAAiB;CACjB,WAAW;CACX,SAAS,CAACC,oCAAiB;CAC5B;AACD,SAAgB,OAAO,QAAkC;AACvD,KAAI,CAAC,OACH,QAAO,QAAQ,QAAQ;AAGzB,KAAI;AACF,8BAAsB,QAAQ;CAC/B,SAAQ,IAAI;AACX,SAAO,QAAQ,QAAQ;CACxB;AACF;;;;ACtBD,MAAM,EAAE,SAAS,GAAGC;;;;AAWpB,MAAM,kBAAkB,SAAiB,KAAK,QAAQ,SAAS;;;;AAK/D,MAAM,mBAAmB,SAAiB,KAAK,QAAQ,wBAAwB;;;;;;AAO/E,SAAgB,MAAM,WAA2B,EAAE,EAAE,EAAE,SAAS,IAAI,WAAW,aAAa,aAAaA,mBAAG,WAAW,KAAmB,GAAG,EAAE,EAAU;CACvJ,MAAM,aAAaA,mBAAG,iBAAiB,UAAU,eAAe,SAASA,mBAAG,aAAa,QAAQ,MAAM;CAEvG,MAAM,UAAUA,mBAAG,cAAc;EAC/B,uBAAuB;EACvB,SAASA,mBAAG,YAAY;EACxB,gBAAgB;EAChB,eAAe;EAChB;CAED,IAAIC;AAEJ,KAAI,SAAS,SAAS,GAAG;EAEvB,MAAM,QAAQ,SAAS,OAAO,SAAS,MAAM,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE,OAAO;AAC/E,WAAS,QAAQ,UAAUD,mBAAG,WAAW,WAAW,QAAQ,gBAAgB,QAAQ;CACrF,MAEC,UAAS,QAAQ,UAAU;AAG7B,QAAO,gBAAgB,QAAQ,QAAQ,SAAS;AACjD"}
package/dist/index.d.cts CHANGED
@@ -1,30 +1,25 @@
1
1
  import { factory_d_exports } from "./factory-_F-JTqnG.cjs";
2
- import ts, { PrinterOptions } from "typescript";
2
+ import ts from "typescript";
3
3
 
4
+ //#region src/format.d.ts
5
+ declare function format(source?: string): Promise<string>;
6
+ //#endregion
4
7
  //#region src/print.d.ts
5
8
  type PrintOptions = {
6
9
  source?: string;
7
10
  baseName?: string;
8
11
  scriptKind?: ts.ScriptKind;
9
- } & PrinterOptions;
12
+ };
10
13
  /**
11
- * Convert AST TypeScript nodes to a string based on the TypeScript printer.
14
+ * Convert AST TypeScript/TSX nodes to a string based on the TypeScript printer.
12
15
  * Ensures consistent output across environments.
16
+ * Also works as a formatter when `source` is provided without `elements`.
13
17
  */
14
- declare function print(elements: Array<ts.Node>, {
18
+ declare function print(elements?: Array<ts.Node>, {
15
19
  source,
16
20
  baseName,
17
- removeComments,
18
- noEmitHelpers,
19
- newLine,
20
21
  scriptKind
21
22
  }?: PrintOptions): string;
22
23
  //#endregion
23
- //#region src/format.d.ts
24
- /**
25
- * Format the generated code based on Prettier
26
- */
27
- declare function format(source: string): Promise<string>;
28
- //#endregion
29
24
  export { factory_d_exports as factory, format, print };
30
25
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -1,30 +1,25 @@
1
1
  import { factory_d_exports } from "./factory-CUjjpSgy.js";
2
- import ts, { PrinterOptions } from "typescript";
2
+ import ts from "typescript";
3
3
 
4
+ //#region src/format.d.ts
5
+ declare function format(source?: string): Promise<string>;
6
+ //#endregion
4
7
  //#region src/print.d.ts
5
8
  type PrintOptions = {
6
9
  source?: string;
7
10
  baseName?: string;
8
11
  scriptKind?: ts.ScriptKind;
9
- } & PrinterOptions;
12
+ };
10
13
  /**
11
- * Convert AST TypeScript nodes to a string based on the TypeScript printer.
14
+ * Convert AST TypeScript/TSX nodes to a string based on the TypeScript printer.
12
15
  * Ensures consistent output across environments.
16
+ * Also works as a formatter when `source` is provided without `elements`.
13
17
  */
14
- declare function print(elements: Array<ts.Node>, {
18
+ declare function print(elements?: Array<ts.Node>, {
15
19
  source,
16
20
  baseName,
17
- removeComments,
18
- noEmitHelpers,
19
- newLine,
20
21
  scriptKind
21
22
  }?: PrintOptions): string;
22
23
  //#endregion
23
- //#region src/format.d.ts
24
- /**
25
- * Format the generated code based on Prettier
26
- */
27
- declare function format(source: string): Promise<string>;
28
- //#endregion
29
24
  export { factory_d_exports as factory, format, print };
30
25
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,59 +1,60 @@
1
- import { factory_exports } from "./factory-CTKjALU5.js";
1
+ import { factory_exports } from "./factory-CDjjCkNo.js";
2
2
  import ts from "typescript";
3
3
  import { format as format$1 } from "prettier";
4
4
  import pluginTypescript from "prettier/plugins/typescript";
5
5
 
6
+ //#region src/format.ts
7
+ const formatOptions = {
8
+ tabWidth: 2,
9
+ printWidth: 160,
10
+ parser: "typescript",
11
+ singleQuote: true,
12
+ semi: false,
13
+ bracketSameLine: false,
14
+ endOfLine: "auto",
15
+ plugins: [pluginTypescript]
16
+ };
17
+ function format(source) {
18
+ if (!source) return Promise.resolve("");
19
+ try {
20
+ return format$1(source, formatOptions);
21
+ } catch (_e) {
22
+ return Promise.resolve(source);
23
+ }
24
+ }
25
+
26
+ //#endregion
6
27
  //#region src/print.ts
7
28
  const { factory } = ts;
8
29
  /**
9
30
  * Escaped new lines in code with block comments so they can be restored by {@link restoreNewLines}
10
- * @param code The code to escape new lines in
11
- * @returns The same code but with new lines escaped using block comments
12
31
  */
13
32
  const escapeNewLines = (code) => code.replace(/\n\n/g, "\n/* :newline: */");
14
33
  /**
15
34
  * Reverses {@link escapeNewLines} and restores new lines
16
- * @param code The code with escaped new lines
17
- * @returns The same code with new lines restored
18
35
  */
19
36
  const restoreNewLines = (code) => code.replace(/\/\* :newline: \*\//g, "\n");
20
37
  /**
21
- * Convert AST TypeScript nodes to a string based on the TypeScript printer.
38
+ * Convert AST TypeScript/TSX nodes to a string based on the TypeScript printer.
22
39
  * Ensures consistent output across environments.
40
+ * Also works as a formatter when `source` is provided without `elements`.
23
41
  */
24
- function print(elements, { source = "", baseName = "print.ts", removeComments, noEmitHelpers, newLine = ts.NewLineKind.LineFeed, scriptKind = ts.ScriptKind.TS } = {}) {
25
- const sourceFile = ts.createSourceFile(baseName, escapeNewLines(source), ts.ScriptTarget.ES2022, false, scriptKind);
42
+ function print(elements = [], { source = "", baseName = "print.tsx", scriptKind = ts.ScriptKind.TSX } = {}) {
43
+ const sourceFile = ts.createSourceFile(baseName, escapeNewLines(source), ts.ScriptTarget.ES2022, true, scriptKind);
26
44
  const printer = ts.createPrinter({
27
45
  omitTrailingSemicolon: true,
28
- newLine,
29
- removeComments,
30
- noEmitHelpers
46
+ newLine: ts.NewLineKind.LineFeed,
47
+ removeComments: false,
48
+ noEmitHelpers: true
31
49
  });
32
- const nodes = (Array.isArray(elements) ? elements : [elements]).filter(Boolean).sort((a, b) => (a.pos ?? 0) - (b.pos ?? 0));
33
- const output = printer.printList(ts.ListFormat.MultiLine, factory.createNodeArray(nodes), sourceFile);
50
+ let output;
51
+ if (elements.length > 0) {
52
+ const nodes = elements.filter(Boolean).sort((a, b) => (a.pos ?? 0) - (b.pos ?? 0));
53
+ output = printer.printList(ts.ListFormat.MultiLine, factory.createNodeArray(nodes), sourceFile);
54
+ } else output = printer.printFile(sourceFile);
34
55
  return restoreNewLines(output).replace(/\r\n/g, "\n");
35
56
  }
36
57
 
37
- //#endregion
38
- //#region src/format.ts
39
- const formatOptions = {
40
- tabWidth: 2,
41
- printWidth: 160,
42
- parser: "typescript",
43
- singleQuote: true,
44
- semi: false,
45
- bracketSameLine: false,
46
- endOfLine: "auto",
47
- plugins: [pluginTypescript]
48
- };
49
- /**
50
- * Format the generated code based on Prettier
51
- */
52
- async function format(source) {
53
- if (!source) return "";
54
- return format$1(source, formatOptions);
55
- }
56
-
57
58
  //#endregion
58
59
  export { factory_exports as factory, format, print };
59
60
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["formatOptions: Options","prettierFormat"],"sources":["../src/print.ts","../src/format.ts"],"sourcesContent":["import ts from 'typescript'\n\nimport type { PrinterOptions } from 'typescript'\n\nconst { factory } = ts\n\nexport type PrintOptions = {\n source?: string\n baseName?: string\n scriptKind?: ts.ScriptKind\n} & PrinterOptions\n\n/**\n * Escaped new lines in code with block comments so they can be restored by {@link restoreNewLines}\n * @param code The code to escape new lines in\n * @returns The same code but with new lines escaped using block comments\n */\nconst escapeNewLines = (code: string) => code.replace(/\\n\\n/g, '\\n/* :newline: */')\n\n/**\n * Reverses {@link escapeNewLines} and restores new lines\n * @param code The code with escaped new lines\n * @returns The same code with new lines restored\n */\nconst restoreNewLines = (code: string) => code.replace(/\\/\\* :newline: \\*\\//g, '\\n')\n\n/**\n * Convert AST TypeScript nodes to a string based on the TypeScript printer.\n * Ensures consistent output across environments.\n */\nexport function print(\n elements: Array<ts.Node>,\n { source = '', baseName = 'print.ts', removeComments, noEmitHelpers, newLine = ts.NewLineKind.LineFeed, scriptKind = ts.ScriptKind.TS }: PrintOptions = {},\n): string {\n const sourceFile = ts.createSourceFile(baseName, escapeNewLines(source), ts.ScriptTarget.ES2022, false, scriptKind)\n\n const printer = ts.createPrinter({\n omitTrailingSemicolon: true,\n newLine,\n removeComments,\n noEmitHelpers,\n })\n // make sure that the nodes have the same order on every machine\n const nodes = (Array.isArray(elements) ? elements : [elements]).filter(Boolean).sort((a, b) => (a.pos ?? 0) - (b.pos ?? 0))\n\n const output = printer.printList(ts.ListFormat.MultiLine, factory.createNodeArray(nodes), sourceFile)\n\n return restoreNewLines(output).replace(/\\r\\n/g, '\\n')\n}\n","import { format as prettierFormat } from 'prettier'\nimport pluginTypescript from 'prettier/plugins/typescript'\n\nimport type { Options } from 'prettier'\n\nconst formatOptions: Options = {\n tabWidth: 2,\n printWidth: 160,\n parser: 'typescript',\n singleQuote: true,\n semi: false,\n bracketSameLine: false,\n endOfLine: 'auto',\n plugins: [pluginTypescript],\n}\n\n/**\n * Format the generated code based on Prettier\n */\nexport async function format(source: string) {\n // do some basic linting with the ts compiler\n if (!source) {\n return ''\n }\n\n return prettierFormat(source, formatOptions)\n}\n"],"mappings":";;;;;;AAIA,MAAM,EAAE,SAAS,GAAG;;;;;;AAapB,MAAM,kBAAkB,SAAiB,KAAK,QAAQ,SAAS;;;;;;AAO/D,MAAM,mBAAmB,SAAiB,KAAK,QAAQ,wBAAwB;;;;;AAM/E,SAAgB,MACd,UACA,EAAE,SAAS,IAAI,WAAW,YAAY,gBAAgB,eAAe,UAAU,GAAG,YAAY,UAAU,aAAa,GAAG,WAAW,IAAkB,GAAG,EAAE,EAClJ;CACR,MAAM,aAAa,GAAG,iBAAiB,UAAU,eAAe,SAAS,GAAG,aAAa,QAAQ,OAAO;CAExG,MAAM,UAAU,GAAG,cAAc;EAC/B,uBAAuB;EACvB;EACA;EACA;EACD;CAED,MAAM,SAAS,MAAM,QAAQ,YAAY,WAAW,CAAC,SAAS,EAAE,OAAO,SAAS,MAAM,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE,OAAO;CAExH,MAAM,SAAS,QAAQ,UAAU,GAAG,WAAW,WAAW,QAAQ,gBAAgB,QAAQ;AAE1F,QAAO,gBAAgB,QAAQ,QAAQ,SAAS;AACjD;;;;AC3CD,MAAMA,gBAAyB;CAC7B,UAAU;CACV,YAAY;CACZ,QAAQ;CACR,aAAa;CACb,MAAM;CACN,iBAAiB;CACjB,WAAW;CACX,SAAS,CAAC,iBAAiB;CAC5B;;;;AAKD,eAAsB,OAAO,QAAgB;AAE3C,KAAI,CAAC,OACH,QAAO;AAGT,QAAOC,SAAe,QAAQ;AAC/B"}
1
+ {"version":3,"file":"index.js","names":["formatOptions: Options","prettierFormat","output: string"],"sources":["../src/format.ts","../src/print.ts"],"sourcesContent":["import type { Options } from 'prettier'\nimport { format as prettierFormat } from 'prettier'\nimport pluginTypescript from 'prettier/plugins/typescript'\n\nconst formatOptions: Options = {\n tabWidth: 2,\n printWidth: 160,\n parser: 'typescript',\n singleQuote: true,\n semi: false,\n bracketSameLine: false,\n endOfLine: 'auto',\n plugins: [pluginTypescript],\n}\nexport function format(source?: string): Promise<string> {\n if (!source) {\n return Promise.resolve('')\n }\n\n try {\n return prettierFormat(source, formatOptions)\n } catch (_e) {\n return Promise.resolve(source)\n }\n}\n","import ts from 'typescript'\n\nconst { factory } = ts\n\nexport type PrintOptions = {\n source?: string\n baseName?: string\n scriptKind?: ts.ScriptKind\n}\n\n/**\n * Escaped new lines in code with block comments so they can be restored by {@link restoreNewLines}\n */\nconst escapeNewLines = (code: string) => code.replace(/\\n\\n/g, '\\n/* :newline: */')\n\n/**\n * Reverses {@link escapeNewLines} and restores new lines\n */\nconst restoreNewLines = (code: string) => code.replace(/\\/\\* :newline: \\*\\//g, '\\n')\n\n/**\n * Convert AST TypeScript/TSX nodes to a string based on the TypeScript printer.\n * Ensures consistent output across environments.\n * Also works as a formatter when `source` is provided without `elements`.\n */\nexport function print(elements: Array<ts.Node> = [], { source = '', baseName = 'print.tsx', scriptKind = ts.ScriptKind.TSX }: PrintOptions = {}): string {\n const sourceFile = ts.createSourceFile(baseName, escapeNewLines(source), ts.ScriptTarget.ES2022, true, scriptKind)\n\n const printer = ts.createPrinter({\n omitTrailingSemicolon: true,\n newLine: ts.NewLineKind.LineFeed,\n removeComments: false,\n noEmitHelpers: true,\n })\n\n let output: string\n\n if (elements.length > 0) {\n // Print only provided nodes\n const nodes = elements.filter(Boolean).sort((a, b) => (a.pos ?? 0) - (b.pos ?? 0))\n output = printer.printList(ts.ListFormat.MultiLine, factory.createNodeArray(nodes), sourceFile)\n } else {\n // Format the whole file\n output = printer.printFile(sourceFile)\n }\n\n return restoreNewLines(output).replace(/\\r\\n/g, '\\n')\n}\n"],"mappings":";;;;;;AAIA,MAAMA,gBAAyB;CAC7B,UAAU;CACV,YAAY;CACZ,QAAQ;CACR,aAAa;CACb,MAAM;CACN,iBAAiB;CACjB,WAAW;CACX,SAAS,CAAC,iBAAiB;CAC5B;AACD,SAAgB,OAAO,QAAkC;AACvD,KAAI,CAAC,OACH,QAAO,QAAQ,QAAQ;AAGzB,KAAI;AACF,SAAOC,SAAe,QAAQ;CAC/B,SAAQ,IAAI;AACX,SAAO,QAAQ,QAAQ;CACxB;AACF;;;;ACtBD,MAAM,EAAE,SAAS,GAAG;;;;AAWpB,MAAM,kBAAkB,SAAiB,KAAK,QAAQ,SAAS;;;;AAK/D,MAAM,mBAAmB,SAAiB,KAAK,QAAQ,wBAAwB;;;;;;AAO/E,SAAgB,MAAM,WAA2B,EAAE,EAAE,EAAE,SAAS,IAAI,WAAW,aAAa,aAAa,GAAG,WAAW,KAAmB,GAAG,EAAE,EAAU;CACvJ,MAAM,aAAa,GAAG,iBAAiB,UAAU,eAAe,SAAS,GAAG,aAAa,QAAQ,MAAM;CAEvG,MAAM,UAAU,GAAG,cAAc;EAC/B,uBAAuB;EACvB,SAAS,GAAG,YAAY;EACxB,gBAAgB;EAChB,eAAe;EAChB;CAED,IAAIC;AAEJ,KAAI,SAAS,SAAS,GAAG;EAEvB,MAAM,QAAQ,SAAS,OAAO,SAAS,MAAM,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE,OAAO;AAC/E,WAAS,QAAQ,UAAU,GAAG,WAAW,WAAW,QAAQ,gBAAgB,QAAQ;CACrF,MAEC,UAAS,QAAQ,UAAU;AAG7B,QAAO,gBAAgB,QAAQ,QAAQ,SAAS;AACjD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/parser-ts",
3
- "version": "3.17.1",
3
+ "version": "3.18.1",
4
4
  "description": "TypeScript parsing and manipulation utilities for Kubb, enabling code generation with proper TypeScript syntax and formatting.",
5
5
  "keywords": [
6
6
  "typescript",
@@ -55,7 +55,7 @@
55
55
  },
56
56
  "devDependencies": {
57
57
  "tsdown": "^0.14.1",
58
- "@kubb/config-ts": "3.17.1"
58
+ "@kubb/config-ts": "3.18.1"
59
59
  },
60
60
  "engines": {
61
61
  "node": ">=20"
package/src/format.ts CHANGED
@@ -1,8 +1,7 @@
1
+ import type { Options } from 'prettier'
1
2
  import { format as prettierFormat } from 'prettier'
2
3
  import pluginTypescript from 'prettier/plugins/typescript'
3
4
 
4
- import type { Options } from 'prettier'
5
-
6
5
  const formatOptions: Options = {
7
6
  tabWidth: 2,
8
7
  printWidth: 160,
@@ -13,15 +12,14 @@ const formatOptions: Options = {
13
12
  endOfLine: 'auto',
14
13
  plugins: [pluginTypescript],
15
14
  }
16
-
17
- /**
18
- * Format the generated code based on Prettier
19
- */
20
- export async function format(source: string) {
21
- // do some basic linting with the ts compiler
15
+ export function format(source?: string): Promise<string> {
22
16
  if (!source) {
23
- return ''
17
+ return Promise.resolve('')
24
18
  }
25
19
 
26
- return prettierFormat(source, formatOptions)
20
+ try {
21
+ return prettierFormat(source, formatOptions)
22
+ } catch (_e) {
23
+ return Promise.resolve(source)
24
+ }
27
25
  }
package/src/index.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { print } from './print.ts'
2
- export { format } from './format.ts'
3
1
  export * as factory from './factory.ts'
2
+ export { format } from './format.ts'
3
+ export { print } from './print.ts'
package/src/print.ts CHANGED
@@ -1,49 +1,48 @@
1
1
  import ts from 'typescript'
2
2
 
3
- import type { PrinterOptions } from 'typescript'
4
-
5
3
  const { factory } = ts
6
4
 
7
5
  export type PrintOptions = {
8
6
  source?: string
9
7
  baseName?: string
10
8
  scriptKind?: ts.ScriptKind
11
- } & PrinterOptions
9
+ }
12
10
 
13
11
  /**
14
12
  * Escaped new lines in code with block comments so they can be restored by {@link restoreNewLines}
15
- * @param code The code to escape new lines in
16
- * @returns The same code but with new lines escaped using block comments
17
13
  */
18
14
  const escapeNewLines = (code: string) => code.replace(/\n\n/g, '\n/* :newline: */')
19
15
 
20
16
  /**
21
17
  * Reverses {@link escapeNewLines} and restores new lines
22
- * @param code The code with escaped new lines
23
- * @returns The same code with new lines restored
24
18
  */
25
19
  const restoreNewLines = (code: string) => code.replace(/\/\* :newline: \*\//g, '\n')
26
20
 
27
21
  /**
28
- * Convert AST TypeScript nodes to a string based on the TypeScript printer.
22
+ * Convert AST TypeScript/TSX nodes to a string based on the TypeScript printer.
29
23
  * Ensures consistent output across environments.
24
+ * Also works as a formatter when `source` is provided without `elements`.
30
25
  */
31
- export function print(
32
- elements: Array<ts.Node>,
33
- { source = '', baseName = 'print.ts', removeComments, noEmitHelpers, newLine = ts.NewLineKind.LineFeed, scriptKind = ts.ScriptKind.TS }: PrintOptions = {},
34
- ): string {
35
- const sourceFile = ts.createSourceFile(baseName, escapeNewLines(source), ts.ScriptTarget.ES2022, false, scriptKind)
26
+ export function print(elements: Array<ts.Node> = [], { source = '', baseName = 'print.tsx', scriptKind = ts.ScriptKind.TSX }: PrintOptions = {}): string {
27
+ const sourceFile = ts.createSourceFile(baseName, escapeNewLines(source), ts.ScriptTarget.ES2022, true, scriptKind)
36
28
 
37
29
  const printer = ts.createPrinter({
38
30
  omitTrailingSemicolon: true,
39
- newLine,
40
- removeComments,
41
- noEmitHelpers,
31
+ newLine: ts.NewLineKind.LineFeed,
32
+ removeComments: false,
33
+ noEmitHelpers: true,
42
34
  })
43
- // make sure that the nodes have the same order on every machine
44
- const nodes = (Array.isArray(elements) ? elements : [elements]).filter(Boolean).sort((a, b) => (a.pos ?? 0) - (b.pos ?? 0))
45
35
 
46
- const output = printer.printList(ts.ListFormat.MultiLine, factory.createNodeArray(nodes), sourceFile)
36
+ let output: string
37
+
38
+ if (elements.length > 0) {
39
+ // Print only provided nodes
40
+ const nodes = elements.filter(Boolean).sort((a, b) => (a.pos ?? 0) - (b.pos ?? 0))
41
+ output = printer.printList(ts.ListFormat.MultiLine, factory.createNodeArray(nodes), sourceFile)
42
+ } else {
43
+ // Format the whole file
44
+ output = printer.printFile(sourceFile)
45
+ }
47
46
 
48
47
  return restoreNewLines(output).replace(/\r\n/g, '\n')
49
48
  }