@player-tools/xlr-utils 0.5.2-next.1 → 0.5.2

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.
@@ -404,7 +404,10 @@ function tsStripOptionalType(node) {
404
404
  }
405
405
  function isExportedDeclaration(node) {
406
406
  const modifiers = import_typescript3.default.canHaveModifiers(node) ? import_typescript3.default.getModifiers(node) : void 0;
407
- return modifiers && modifiers.some((modifier) => modifier.kind === import_typescript3.default.SyntaxKind.ExportKeyword);
407
+ if (modifiers) {
408
+ return modifiers.some((m) => m.kind === import_typescript3.default.SyntaxKind.ExportKeyword);
409
+ }
410
+ return false;
408
411
  }
409
412
  function isNodeExported(node) {
410
413
  return (import_typescript3.default.getCombinedModifierFlags(node) & import_typescript3.default.ModifierFlags.Export) !== 0 || !!node.parent && node.parent.kind === import_typescript3.default.SyntaxKind.SourceFile;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/index.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/annotations.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/ts-helpers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/type-checks.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/validation-helpers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/test-helpers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/documentation.ts"],"sourcesContent":["export * from \"./annotations\";\nexport * from \"./ts-helpers\";\nexport * from \"./type-checks\";\nexport * from \"./validation-helpers\";\nexport * from \"./test-helpers\";\nexport * from \"./documentation\";\n","import ts from \"typescript\";\nimport type { Annotations } from \"@player-tools/xlr\";\n\ninterface JSDocContainer {\n /** */\n jsDoc: Array<ts.JSDoc>;\n}\n\n/**\n *\n */\nfunction extractDescription(text: string | undefined): Annotations {\n if (!text) {\n return {};\n }\n\n return { description: text };\n}\n\n/**\n * Checks if the parent node is a non-object type\n */\nfunction parentIsNonObjectPath(node: ts.Node) {\n return (\n node.parent &&\n (ts.isArrayTypeNode(node.parent) ||\n ts.isTupleTypeNode(node.parent) ||\n ts.isOptionalTypeNode(node.parent) ||\n ts.isRestTypeNode(node.parent) ||\n ts.isUnionTypeNode(node.parent))\n );\n}\n\n/**\n * Traverses up the node tree to build the title path down to the initial node\n */\nfunction recurseTypeChain(\n node: ts.Node,\n child: ts.Node | undefined\n): Array<string> {\n if (!node) {\n return [];\n }\n\n if (\n ts.isArrayTypeNode(node) &&\n node.parent &&\n ts.isRestTypeNode(node.parent)\n ) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isRestTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isOptionalTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isUnionTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isParenthesizedTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isTypeLiteralNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isArrayTypeNode(node)) {\n return [\"[]\", ...recurseTypeChain(node.parent, node)];\n }\n\n if (ts.isTupleTypeNode(node)) {\n const pos = node.elements.indexOf(child as any);\n return [\n ...(pos === -1 ? [] : [`${pos}`]),\n ...recurseTypeChain(node.parent, node),\n ];\n }\n\n if (\n ts.isTypeAliasDeclaration(node) ||\n ts.isInterfaceDeclaration(node) ||\n ts.isPropertySignature(node)\n ) {\n return [node.name.getText(), ...recurseTypeChain(node.parent, node)];\n }\n\n if (parentIsNonObjectPath(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n return [];\n}\n\n/**\n * Builds the `Title` property by traversing up and noting the named types in the tree\n */\nfunction extractTitle(node: ts.Node): Annotations {\n const typeNames = recurseTypeChain(node, undefined).reverse().join(\".\");\n\n if (!typeNames.length) {\n return {};\n }\n\n return { title: typeNames };\n}\n\n/**\n *\n */\nfunction stringifyDoc(\n docString: undefined | string | ts.NodeArray<ts.JSDocComment>\n): string | undefined {\n if (typeof docString === \"undefined\" || typeof docString === \"string\") {\n return docString;\n }\n\n return docString.map(({ text }) => text).join(\" \");\n}\n\n/**\n * Extracts JSDoc tags to strings\n */\nfunction extractTags(tags: ReadonlyArray<ts.JSDocTag>): Annotations {\n const descriptions: Array<string> = [];\n const examples: Array<string> = [];\n const _default: Array<string> = [];\n const see: Array<string> = [];\n const meta: Record<string, string> = {};\n\n /**\n *\n */\n const extractSee = (tag: ts.JSDocSeeTag) => {\n return `${tag.tagName ? `${tag.tagName?.getText()} ` : \"\"}${\n stringifyDoc(tag.comment)?.trim() ?? \"\"\n }`;\n };\n\n tags.forEach((tag) => {\n if (!tag.comment) {\n return;\n }\n\n if (tag.tagName.text === \"example\") {\n examples.push(stringifyDoc(tag.comment)?.trim() ?? \"\");\n } else if (tag.tagName.text === \"default\") {\n _default.push(stringifyDoc(tag.comment)?.trim() ?? \"\");\n } else if (tag.tagName.text === \"see\") {\n see.push(extractSee(tag as ts.JSDocSeeTag));\n } else if (tag.tagName.text === \"meta\") {\n const [key, value] = tag.comment.toString().split(/:(.*)/);\n meta[key] = value?.trim() ?? \"\";\n } else {\n const text = stringifyDoc(tag.comment)?.trim() ?? \"\";\n descriptions.push(`@${tag.tagName.text} ${text}`);\n }\n });\n\n return {\n ...(descriptions.length === 0\n ? {}\n : { description: descriptions.join(\"\\n\") }),\n ...(examples.length === 0 ? {} : { examples }),\n ...(_default.length === 0 ? {} : { default: _default.join(\"\\n\") }),\n ...(see.length === 0 ? {} : { see }),\n ...(meta && Object.keys(meta).length === 0 ? {} : { meta }),\n };\n}\n\n/**\n * Joins Arrays of maybe strings with a given separator\n */\nfunction join(t: Array<string | undefined>, separator = \"\\n\") {\n const unique = new Set(t).values();\n return Array.from(unique)\n .filter((s) => s !== undefined)\n .join(separator)\n .trim();\n}\n\n/**\n * Merges Annotation nodes for various nodes\n */\nfunction mergeAnnotations(nodes: Array<Annotations>): Annotations {\n const name = nodes.find((n) => n.name)?.name;\n const title = join(\n nodes.map((n) => n.title),\n \", \"\n );\n const description = join(nodes.map((n) => n.description));\n const _default = join(nodes.map((n) => n.default));\n const comment = join(nodes.map((n) => n.comment));\n const examples = join(\n nodes.map((n) =>\n Array.isArray(n.examples) ? join(n.examples) : n.examples\n )\n );\n const see = join(\n nodes.map((n) => (Array.isArray(n.see) ? join(n.see) : n.see))\n );\n const meta = nodes.find((n) => n.meta)?.meta;\n return {\n ...(name ? { name } : {}),\n ...(title ? { title } : {}),\n ...(description ? { description } : {}),\n ...(examples ? { examples } : {}),\n ...(_default ? { default: _default } : {}),\n ...(see ? { see } : {}),\n ...(comment ? { comment } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n\n/**\n * Converts JSDoc comments to strings\n */\nexport function decorateNode(node: ts.Node): Annotations {\n const { jsDoc } = node as unknown as JSDocContainer;\n const titleAnnotation = extractTitle(node);\n\n if (jsDoc && jsDoc.length) {\n const first = jsDoc[0];\n return mergeAnnotations([\n extractDescription(stringifyDoc(first.comment)),\n titleAnnotation,\n extractTags(first.tags ?? []),\n ]);\n }\n\n return titleAnnotation;\n}\n","/* eslint-disable no-bitwise */\nimport ts from \"typescript\";\nimport type {\n NamedType,\n NodeType,\n ObjectProperty,\n ObjectType,\n OrType,\n} from \"@player-tools/xlr\";\nimport { computeExtends, resolveConditional } from \"./validation-helpers\";\nimport { isGenericNodeType } from \"./type-checks\";\n\n/**\n * Returns the required type or the optionally required type\n */\nexport function tsStripOptionalType(node: ts.TypeNode): ts.TypeNode {\n return ts.isOptionalTypeNode(node) ? node.type : node;\n}\n\n/**\n * Returns if the top level declaration is exported\n */\nexport function isExportedDeclaration(node: ts.Statement) {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n return (\n modifiers &&\n modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)\n );\n}\n\n/**\n * Returns if the node is exported from the source file\n */\nexport function isNodeExported(node: ts.Node): boolean {\n return (\n (ts.getCombinedModifierFlags(node as ts.Declaration) &\n ts.ModifierFlags.Export) !==\n 0 ||\n (!!node.parent && node.parent.kind === ts.SyntaxKind.SourceFile)\n );\n}\n\n/**\n * Returns the actual type and will following import chains if needed\n */\nexport function getReferencedType(\n node: ts.TypeReferenceNode,\n typeChecker: ts.TypeChecker\n) {\n let symbol = typeChecker.getSymbolAtLocation(node.typeName);\n\n if (\n symbol &&\n (symbol.flags & ts.SymbolFlags.Alias) === ts.SymbolFlags.Alias\n ) {\n // follow alias if it is a symbol\n symbol = typeChecker.getAliasedSymbol(symbol);\n }\n\n const varDecl = symbol?.declarations?.[0];\n if (\n varDecl &&\n (ts.isInterfaceDeclaration(varDecl) || ts.isTypeAliasDeclaration(varDecl))\n ) {\n return { declaration: varDecl, exported: isNodeExported(varDecl) };\n }\n}\n\n/**\n * Returns list of string literals from potential union of strings\n */\nexport function getStringLiteralsFromUnion(node: ts.Node): Set<string> {\n if (ts.isUnionTypeNode(node)) {\n return new Set(\n node.types.map((type) => {\n if (ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n }\n\n return \"\";\n })\n );\n }\n\n if (ts.isLiteralTypeNode(node) && ts.isStringLiteral(node.literal)) {\n return new Set([node.literal.text]);\n }\n\n return new Set();\n}\n\n/**\n * Converts a format string into a regex that can be used to validate a given string matches the template\n */\nexport function buildTemplateRegex(\n node: ts.TemplateLiteralTypeNode,\n typeChecker: ts.TypeChecker\n): string {\n let regex = node.head.text;\n node.templateSpans.forEach((span) => {\n // process template tag\n let type = span.type.kind;\n if (ts.isTypeReferenceNode(span.type)) {\n let symbol = typeChecker.getSymbolAtLocation(\n span.type.typeName\n ) as ts.Symbol;\n\n if (\n symbol &&\n (symbol.flags & ts.SymbolFlags.Alias) === ts.SymbolFlags.Alias\n ) {\n // follow alias if it is a symbol\n symbol = typeChecker.getAliasedSymbol(symbol);\n }\n\n type = (symbol?.declarations?.[0] as ts.TypeAliasDeclaration).type.kind;\n }\n\n if (type === ts.SyntaxKind.StringKeyword) {\n regex += \".*\";\n } else if (type === ts.SyntaxKind.NumberKeyword) {\n regex += \"[0-9]*\";\n } else if (type === ts.SyntaxKind.BooleanKeyword) {\n regex += \"true|false\";\n }\n\n // add non-tag element\n regex += span.literal.text;\n });\n return regex;\n}\n\n/**\n * Walks generics to fill in values from a combination of the default, constraint, and passed in map values\n * TODO convert this to use simpleTransformGenerator\n */\nexport function fillInGenerics(\n xlrNode: NodeType,\n generics?: Map<string, NodeType>\n): NodeType {\n // Need to make sure not to set generics in passed in map to avoid using generics outside of tree\n let localGenerics: Map<string, NodeType>;\n\n if (generics) {\n localGenerics = new Map(generics);\n } else {\n localGenerics = new Map();\n if (isGenericNodeType(xlrNode)) {\n xlrNode.genericTokens?.forEach((token) => {\n localGenerics.set(\n token.symbol,\n (token.default ?? token.constraints) as NodeType\n );\n });\n }\n }\n\n if (xlrNode.type === \"ref\") {\n if (localGenerics.has(xlrNode.ref)) {\n return {\n ...(localGenerics.get(xlrNode.ref) as NodeType),\n ...(xlrNode.genericArguments\n ? {\n genericArguments: xlrNode.genericArguments.map((ga) =>\n fillInGenerics(ga, localGenerics)\n ),\n }\n : {}),\n ...(xlrNode.title ? { title: xlrNode.title } : {}),\n ...(xlrNode.name ? { name: xlrNode.name } : {}),\n ...(xlrNode.description ? { description: xlrNode.description } : {}),\n ...(xlrNode.comment ? { comment: xlrNode.comment } : {}),\n };\n }\n\n return {\n ...xlrNode,\n ...(xlrNode.genericArguments\n ? {\n genericArguments: xlrNode.genericArguments.map((ga) =>\n fillInGenerics(ga, localGenerics)\n ),\n }\n : {}),\n };\n }\n\n if (xlrNode.type === \"object\") {\n const newProperties: { [name: string]: ObjectProperty } = {};\n Object.getOwnPropertyNames(xlrNode.properties).forEach((propName) => {\n const prop = xlrNode.properties[propName];\n newProperties[propName] = {\n required: prop.required,\n node: fillInGenerics(prop.node, localGenerics),\n };\n });\n\n return {\n ...xlrNode,\n properties: newProperties,\n };\n }\n\n if (xlrNode.type === \"array\") {\n // eslint-disable-next-line no-param-reassign\n xlrNode.elementType = fillInGenerics(xlrNode.elementType, localGenerics);\n } else if (xlrNode.type === \"or\" || xlrNode.type === \"and\") {\n let pointer;\n if (xlrNode.type === \"or\") {\n pointer = xlrNode.or;\n } else {\n pointer = xlrNode.and;\n }\n\n return {\n ...xlrNode,\n [xlrNode.type]: pointer.map((prop) => {\n return fillInGenerics(prop, localGenerics);\n }),\n };\n } else if (xlrNode.type === \"record\") {\n return {\n ...xlrNode,\n keyType: fillInGenerics(xlrNode.keyType, localGenerics),\n valueType: fillInGenerics(xlrNode.valueType, localGenerics),\n };\n } else if (xlrNode.type === \"conditional\") {\n const filledInConditional = {\n ...xlrNode,\n check: {\n left: fillInGenerics(xlrNode.check.left, localGenerics),\n right: fillInGenerics(xlrNode.check.right, localGenerics),\n },\n value: {\n true: fillInGenerics(xlrNode.value.true, localGenerics),\n false: fillInGenerics(xlrNode.value.false, localGenerics),\n },\n };\n\n // Check to see if we have enough information to resolve this conditional\n if (\n filledInConditional.check.left.type !== \"ref\" &&\n filledInConditional.check.right.type !== \"ref\"\n ) {\n return {\n name: xlrNode.name,\n title: xlrNode.title,\n ...resolveConditional(filledInConditional),\n } as NamedType;\n }\n\n return filledInConditional;\n }\n\n return xlrNode;\n}\n\n/** Applies the TS `Pick` type to an interface/union/intersection */\nexport function applyPickOrOmitToNodeType(\n baseObject: NodeType,\n operation: \"Pick\" | \"Omit\",\n properties: Set<string>\n): NodeType | undefined {\n if (baseObject.type === \"object\") {\n const newObject = { ...baseObject };\n Object.keys(baseObject.properties).forEach((key) => {\n if (\n (operation === \"Omit\" && properties.has(key)) ||\n (operation === \"Pick\" && !properties.has(key))\n ) {\n delete newObject.properties[key];\n }\n });\n\n /**\n * Filter out objects in cases:\n * - A Pick operation and there are no properties left\n * - An Omit operation and there are no properties left and no additional properties allowed\n */\n if (\n Object.keys(newObject.properties).length === 0 &&\n (operation !== \"Omit\" || newObject.additionalProperties === false)\n ) {\n return undefined;\n }\n\n return newObject;\n }\n\n let pointer;\n if (baseObject.type === \"and\") {\n pointer = baseObject.and;\n } else if (baseObject.type === \"or\") {\n pointer = baseObject.or;\n } else {\n throw new Error(\n `Error: Can not apply ${operation} to type ${baseObject.type}`\n );\n }\n\n const pickedTypes = pointer\n .map((type) => {\n const node = applyPickOrOmitToNodeType(type, operation, properties);\n if (node === undefined) {\n return undefined;\n }\n\n return { ...node, additionalProperties: false } as ObjectType;\n })\n .filter((type) => type !== undefined) as NodeType[];\n\n if (pickedTypes.length === 0) {\n return undefined;\n }\n\n if (pickedTypes.length === 1) {\n return pickedTypes[0];\n }\n\n if (baseObject.type === \"and\") {\n return { ...baseObject, and: pickedTypes };\n }\n\n return { ...baseObject, or: pickedTypes };\n}\n\n/** Applies the TS `Omit` type to an interface/union/intersection */\nexport function applyPartialOrRequiredToNodeType(\n baseObject: NodeType,\n modifier: boolean\n): NodeType {\n if (baseObject.type === \"object\") {\n const newObject = { ...baseObject };\n Object.keys(baseObject.properties).forEach((key) => {\n newObject.properties[key].required = modifier;\n });\n\n return newObject;\n }\n\n if (baseObject.type === \"and\") {\n const pickedTypes = baseObject.and.map((type) =>\n applyPartialOrRequiredToNodeType(type, modifier)\n );\n return { ...baseObject, and: pickedTypes };\n }\n\n if (baseObject.type === \"or\") {\n const pickedTypes = baseObject.or.map((type) =>\n applyPartialOrRequiredToNodeType(type, modifier)\n );\n return { ...baseObject, or: pickedTypes };\n }\n\n throw new Error(\n `Error: Can not apply ${modifier ? \"Required\" : \"Partial\"} to type ${\n baseObject.type\n }`\n );\n}\n\n/** Applies the TS `Exclude` type to a union */\nexport function applyExcludeToNodeType(\n baseObject: OrType,\n filters: NodeType | OrType\n): NodeType {\n const remainingMembers = baseObject.or.filter((type) => {\n if (filters.type === \"or\") {\n return !filters.or.some((filter) => computeExtends(type, filter));\n }\n\n return !computeExtends(type, filters);\n });\n\n if (remainingMembers.length === 1) {\n return remainingMembers[0];\n }\n\n return {\n ...baseObject,\n or: remainingMembers,\n };\n}\n","import ts from \"typescript\";\nimport type {\n NamedType,\n NamedTypeWithGenerics,\n NodeType,\n NodeTypeWithGenerics,\n PrimitiveTypes,\n} from \"@player-tools/xlr\";\n\n/**\n * Returns if the Object Property is optional\n */\nexport function isOptionalProperty(node: ts.PropertySignature): boolean {\n return node.questionToken?.kind === ts.SyntaxKind.QuestionToken;\n}\n\n/**\n * Returns if the node is an Interface or Type with Generics\n */\nexport function isGenericInterfaceDeclaration(\n node: ts.InterfaceDeclaration\n): boolean {\n const length = node.typeParameters?.length;\n return length ? length > 0 : false;\n}\n\n/**\n * Returns if the node is an Type Declaration with Generics\n */\nexport function isGenericTypeDeclaration(\n node: ts.TypeAliasDeclaration\n): boolean {\n const length = node.typeParameters?.length;\n return length ? length > 0 : false;\n}\n\n/**\n * Returns if the referenced type is a generic\n */\nexport function isTypeReferenceGeneric(\n node: ts.TypeReferenceNode,\n typeChecker: ts.TypeChecker\n): boolean {\n const symbol = typeChecker.getSymbolAtLocation(node.typeName);\n if (symbol && symbol.declarations) {\n return symbol.declarations[0].kind === ts.SyntaxKind.TypeParameter;\n }\n\n return false;\n}\n\nexport type TopLevelDeclaration =\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration;\n\n/**\n * Returns if the node is an interface or a type declaration\n */\nexport function isTopLevelDeclaration(\n node: ts.Node\n): node is TopLevelDeclaration {\n return (\n node.kind === ts.SyntaxKind.InterfaceDeclaration ||\n node.kind === ts.SyntaxKind.TypeAliasDeclaration\n );\n}\n\nexport type TopLevelNode = TopLevelDeclaration | ts.VariableStatement;\n\n/**\n * Returns if the node is an interface or a type declaration\n */\nexport function isTopLevelNode(node: ts.Node): node is TopLevelNode {\n return (\n node.kind === ts.SyntaxKind.InterfaceDeclaration ||\n node.kind === ts.SyntaxKind.TypeAliasDeclaration ||\n node.kind === ts.SyntaxKind.VariableStatement\n );\n}\n\n/**\n * Returns if the NodeType has generic tokens\n */\nexport function isGenericNodeType<T extends NodeType = NodeType>(\n nt: NodeType\n): nt is NodeTypeWithGenerics<T> {\n return (nt as NodeTypeWithGenerics).genericTokens?.length > 0;\n}\n\n/**\n * Returns if the named type has generic tokens\n */\nexport function isGenericNamedType<T extends NamedType = NamedType>(\n nt: NodeType\n): nt is NamedTypeWithGenerics<T> {\n return (nt as NamedTypeWithGenerics).genericTokens?.length > 0;\n}\n\n/**\n * Returns if the node is a `PrimitiveTypes`\n */\nexport function isPrimitiveTypeNode(node: NodeType): node is PrimitiveTypes {\n return (\n node.type === \"string\" ||\n node.type === \"number\" ||\n node.type === \"boolean\" ||\n node.type === \"null\" ||\n node.type === \"any\" ||\n node.type === \"never\" ||\n node.type === \"undefined\" ||\n node.type === \"unknown\" ||\n node.type === \"void\"\n );\n}\n\n/**\n * Type Guard for non-null values\n */\nexport function isNonNullable<T>(a: T | null | undefined): a is NonNullable<T> {\n return a !== null || a !== undefined;\n}\n","import type { Node } from \"jsonc-parser\";\nimport type {\n ConditionalType,\n NodeType,\n ObjectType,\n RefNode,\n} from \"@player-tools/xlr\";\nimport { isGenericNodeType, isPrimitiveTypeNode } from \"./type-checks\";\nimport { fillInGenerics } from \"./ts-helpers\";\n\nexport interface PropertyNode {\n /** Equivalent Property Name */\n key: string;\n\n /** Equivalent Property Value */\n value: Node;\n}\n\n/**\n * Takes a property node and returns the underlying Key/Value Pairs\n */\nexport function propertyToTuple(node: Node): PropertyNode {\n let key = node.children?.[0].value as string;\n if (key.includes(\"-\")) {\n key = `\"${key}\"`;\n }\n\n return {\n key,\n value: node.children?.[1] as Node,\n };\n}\n\n/**\n * Turns a node's children into a map for easy access\n */\nexport function makePropertyMap(node: Node): Map<string, Node> {\n const m = new Map();\n node.children?.forEach((child) => {\n const property = propertyToTuple(child);\n m.set(property.key, property.value);\n });\n return m;\n}\n\n/**\n * Checks if property is a leaf node or another node\n */\nexport function isNode(obj: Node | string | number | boolean): obj is Node {\n return (\n typeof obj !== \"string\" ||\n typeof obj !== \"number\" ||\n typeof obj !== \"boolean\"\n );\n}\n\n/**\n * Computes if the first arg extends the second arg\n */\nexport function computeExtends(a: NodeType, b: NodeType): boolean {\n // special case for any/unknown being functionally the same\n if (\n (a.type === \"any\" || a.type === \"unknown\") &&\n (b.type === \"any\" || b.type === \"unknown\")\n ) {\n return true;\n }\n\n // special case for null/undefined being functionally the same\n if (\n (a.type === \"null\" || a.type === \"undefined\") &&\n (b.type === \"null\" || b.type === \"undefined\")\n ) {\n return true;\n }\n\n // check simple case of equal types\n if (a.type === b.type) {\n if (isPrimitiveTypeNode(a) && isPrimitiveTypeNode(b)) {\n if (a.const && b.const) {\n if (a.const === b.const) {\n return true;\n }\n } else {\n return true;\n }\n }\n\n if (a.type === \"ref\" && b.type === \"ref\") {\n return a.ref === b.ref;\n }\n\n if (a.type === \"object\" && b.type === \"object\") {\n for (const property in b.properties) {\n const propertyNode = b.properties[property];\n if (\n !a.properties[property] ||\n !computeExtends(a.properties[property].node, propertyNode.node)\n ) {\n return false;\n }\n }\n\n return true;\n }\n }\n\n if (isPrimitiveTypeNode(a) && b.type === \"or\") {\n return b.or.every((member) => computeExtends(a, member));\n }\n\n if (isPrimitiveTypeNode(b) && a.type === \"or\") {\n return a.or.every((member) => computeExtends(b, member));\n }\n\n if (a.type === \"or\" && b.type === \"or\") {\n return a.or.every((x) => b.or.some((y) => computeExtends(x, y)));\n }\n\n return false;\n}\n\n/**\n * Attempts to resolve a conditional type\n */\nexport function resolveConditional(conditional: ConditionalType): NodeType {\n const { left, right } = conditional.check;\n if (isPrimitiveTypeNode(left) && isPrimitiveTypeNode(right)) {\n const conditionalResult = conditional.value.false;\n\n // Compose first level generics here since `conditionalResult` won't have them\n if (isGenericNodeType(conditional)) {\n const genericMap: Map<string, NodeType> = new Map();\n conditional.genericTokens.forEach((token) => {\n genericMap.set(\n token.symbol,\n token.default ?? token.constraints ?? { type: \"any\" }\n );\n });\n\n return fillInGenerics(conditionalResult, genericMap);\n }\n\n return conditionalResult;\n }\n\n // unable to process return original\n return conditional;\n}\n\n/**\n *\n */\nexport function resolveReferenceNode(\n genericReference: RefNode,\n typeToFill: NodeType\n): NodeType {\n const genericArgs = genericReference.genericArguments;\n const genericMap: Map<string, NodeType> = new Map();\n\n // Compose first level generics here from `genericReference`\n if (genericArgs && isGenericNodeType(typeToFill)) {\n typeToFill.genericTokens.forEach((token, index) => {\n genericMap.set(\n token.symbol,\n genericArgs[index] ?? token.default ?? token.constraints\n );\n });\n }\n\n // Fill in generics\n const filledInNode = fillInGenerics(typeToFill, genericMap);\n\n // Remove generic tokens that were resolve\n if (isGenericNodeType(filledInNode) && genericArgs?.length) {\n if (genericArgs.length < filledInNode.genericTokens.length) {\n filledInNode.genericTokens = filledInNode.genericTokens.slice(\n genericArgs?.length\n );\n } else if (genericArgs.length === filledInNode.genericTokens.length) {\n filledInNode.genericTokens = [];\n }\n }\n\n // Resolve index access\n if (genericReference.property && filledInNode.type === \"object\") {\n return (\n filledInNode.properties[genericReference.property]?.node ??\n filledInNode.additionalProperties ?? { type: \"undefined\" }\n );\n }\n\n return filledInNode;\n}\n\n/**\n * Combines two ObjectType objects to get a representation of the effective TypeScript interface of `base` extending `operand`\n - * @param base The base interface\n - * @param operand The interface that is extended\n - * @param errorOnOverlap whether or not conflicting properties should throw an error or use the property from operand\n - * @returns `ObjectType`\n */\nexport function computeEffectiveObject(\n base: ObjectType,\n operand: ObjectType,\n errorOnOverlap = true\n): ObjectType {\n const baseObjectName = base.name ?? base.title ?? \"object literal\";\n const operandObjectName = operand.name ?? operand.title ?? \"object literal\";\n const newObject = {\n ...JSON.parse(JSON.stringify(base)),\n name: `${baseObjectName} & ${operandObjectName}`,\n description: `Effective type combining ${baseObjectName} and ${operandObjectName}`,\n genericTokens: [\n ...(isGenericNodeType(base) ? base.genericTokens : []),\n ...(isGenericNodeType(operand) ? operand.genericTokens : []),\n ],\n };\n // TODO this check needs to account for primitive -> primitive generic overlap\n\n for (const property in operand.properties) {\n if (newObject.properties[property] !== undefined && errorOnOverlap) {\n if (\n !computeExtends(\n newObject.properties[property].node,\n operand.properties[property].node\n )\n ) {\n throw new Error(\n `Can't compute effective type for ${baseObjectName} and ${operandObjectName} because of conflicting properties ${property}`\n );\n }\n }\n\n newObject.properties[property] = operand.properties[property];\n }\n\n if (newObject.additionalProperties && operand.additionalProperties) {\n if (\n !isPrimitiveTypeNode(newObject.additionalProperties) ||\n !isPrimitiveTypeNode(operand.additionalProperties) ||\n newObject.additionalProperties.type !== operand.additionalProperties.type\n ) {\n newObject.additionalProperties = {\n type: \"and\",\n and: [newObject.additionalProperties, operand.additionalProperties],\n };\n }\n } else if (operand.additionalProperties) {\n newObject.additionalProperties = operand.additionalProperties;\n }\n\n return newObject;\n}\n","import ts from \"typescript\";\nimport * as tsvfs from \"@typescript/vfs\";\n\nexport interface SetupReturnType {\n /**\n * Virtual source file containing the passed in text\n */\n sf: ts.SourceFile;\n /**\n * Type checker for the virtual program\n */\n tc: ts.TypeChecker;\n}\n\n/**\n * Setups a virtual TS environment for tests\n */\nexport function setupTestEnv(sourceCode: string, mockFileName = \"filename.ts\") {\n const fsMap = tsvfs.createDefaultMapFromNodeModules({}, ts);\n fsMap.set(mockFileName, sourceCode);\n\n const system = tsvfs.createSystem(fsMap);\n const host = tsvfs.createVirtualCompilerHost(system, {}, ts);\n\n const program = ts.createProgram({\n rootNames: [...fsMap.keys()],\n options: {},\n host: host.compilerHost,\n });\n\n return {\n sf: host.compilerHost.getSourceFile(\n mockFileName,\n ts.ScriptTarget.ES5\n ) as ts.SourceFile,\n tc: program.getTypeChecker(),\n };\n}\n","import ts from \"typescript\";\nimport type { SymbolDisplayPart } from \"typescript\";\nimport type { NodeType } from \"@player-tools/xlr\";\nimport { isPrimitiveTypeNode } from \"./type-checks\";\n\nconst { SymbolDisplayPartKind, displayPartsToString } = ts;\n\n/** Like `.join()` but for arrays */\nfunction insertBetweenElements<T>(array: Array<T>, separator: T): T[] {\n return array.reduce((acc, item, index) => {\n if (index === 0) {\n return [item];\n }\n\n return [...acc, separator, item];\n }, [] as T[]);\n}\n\n/**\n * Generate a documentation string for a given node\n *\n * @param node - The source node to author the docs string for\n * @returns - documentation string\n */\nexport function createTSDocString(node: NodeType): Array<SymbolDisplayPart> {\n if (node.type === \"ref\") {\n return [\n {\n text: node.ref,\n kind: SymbolDisplayPartKind.keyword as any,\n },\n ];\n }\n\n if (node.type === \"or\" || node.type === \"and\") {\n const items = node.type === \"and\" ? node.and : node.or;\n\n return insertBetweenElements(\n items.map((subnode) => createTSDocString(subnode)),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: node.type === \"and\" ? \" & \" : \" | \",\n },\n ]\n ).flat();\n }\n\n if (node.type === \"function\") {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text: \"function\",\n },\n {\n kind: SymbolDisplayPartKind.space as any,\n text: \" \",\n },\n ...(node.name\n ? [{ text: node.name, kind: SymbolDisplayPartKind.methodName }]\n : []),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"(\",\n },\n ...insertBetweenElements(\n node.parameters.map((p) => {\n if (p.name) {\n return [\n {\n kind: SymbolDisplayPartKind.parameterName as any,\n text: p.name,\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: p.optional ? \"?\" : \"\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(p.type),\n ];\n }\n\n return createTSDocString(p.type);\n }),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ]\n ).flat(),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \")\",\n },\n ...(node.returnType\n ? [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(node.returnType),\n ]\n : []),\n ];\n }\n\n if (node.type === \"tuple\") {\n return [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"[\",\n },\n ...insertBetweenElements(\n node.elementTypes.map((t) => {\n if (t.name) {\n return [\n {\n kind: SymbolDisplayPartKind.propertyName as any,\n text: t.name,\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(t.type),\n ];\n }\n\n return createTSDocString(t.type);\n }),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ]\n ).flat(),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"]\",\n },\n ];\n }\n\n if (node.type === \"array\") {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: \"Array\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"<\",\n },\n ...createTSDocString(node.elementType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \">\",\n },\n ];\n }\n\n if (node.type === \"record\") {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: \"Record\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"<\",\n },\n ...createTSDocString(node.keyType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ...createTSDocString(node.valueType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \">\",\n },\n ];\n }\n\n if (\n (node.type === \"string\" ||\n node.type === \"boolean\" ||\n node.type === \"number\") &&\n node.const !== undefined\n ) {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text:\n typeof node.const === \"string\"\n ? `\"${node.const}\"`\n : String(node.const),\n },\n ];\n }\n\n if (isPrimitiveTypeNode(node) && node.type !== \"null\") {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text: node.type,\n },\n ];\n }\n\n if (node.type === \"object\" && node.name) {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: node.name,\n },\n ];\n }\n\n return [\n {\n kind: SymbolDisplayPartKind.localName as any,\n text: node.type,\n },\n ];\n}\n\n/** Convert the TS SymbolDisplayParts into a single string */\nexport function symbolDisplayToString(\n displayParts: Array<SymbolDisplayPart>\n): string {\n return displayPartsToString(displayParts);\n}\n\n/** Create a documentation string from node */\nexport function createDocString(node: NodeType): string {\n return symbolDisplayToString(createTSDocString(node));\n}\n"],"mappings":"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","names":["ts","import_typescript","import_typescript","ts","ts","import_typescript","ts","import_typescript","ts"]}
1
+ {"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/index.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/annotations.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/ts-helpers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/type-checks.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/validation-helpers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/test-helpers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/documentation.ts"],"sourcesContent":["export * from \"./annotations\";\nexport * from \"./ts-helpers\";\nexport * from \"./type-checks\";\nexport * from \"./validation-helpers\";\nexport * from \"./test-helpers\";\nexport * from \"./documentation\";\n","import ts from \"typescript\";\nimport type { Annotations } from \"@player-tools/xlr\";\n\ninterface JSDocContainer {\n /** */\n jsDoc: Array<ts.JSDoc>;\n}\n\n/**\n *\n */\nfunction extractDescription(text: string | undefined): Annotations {\n if (!text) {\n return {};\n }\n\n return { description: text };\n}\n\n/**\n * Checks if the parent node is a non-object type\n */\nfunction parentIsNonObjectPath(node: ts.Node) {\n return (\n node.parent &&\n (ts.isArrayTypeNode(node.parent) ||\n ts.isTupleTypeNode(node.parent) ||\n ts.isOptionalTypeNode(node.parent) ||\n ts.isRestTypeNode(node.parent) ||\n ts.isUnionTypeNode(node.parent))\n );\n}\n\n/**\n * Traverses up the node tree to build the title path down to the initial node\n */\nfunction recurseTypeChain(\n node: ts.Node,\n child: ts.Node | undefined\n): Array<string> {\n if (!node) {\n return [];\n }\n\n if (\n ts.isArrayTypeNode(node) &&\n node.parent &&\n ts.isRestTypeNode(node.parent)\n ) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isRestTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isOptionalTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isUnionTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isParenthesizedTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isTypeLiteralNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isArrayTypeNode(node)) {\n return [\"[]\", ...recurseTypeChain(node.parent, node)];\n }\n\n if (ts.isTupleTypeNode(node)) {\n const pos = node.elements.indexOf(child as any);\n return [\n ...(pos === -1 ? [] : [`${pos}`]),\n ...recurseTypeChain(node.parent, node),\n ];\n }\n\n if (\n ts.isTypeAliasDeclaration(node) ||\n ts.isInterfaceDeclaration(node) ||\n ts.isPropertySignature(node)\n ) {\n return [node.name.getText(), ...recurseTypeChain(node.parent, node)];\n }\n\n if (parentIsNonObjectPath(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n return [];\n}\n\n/**\n * Builds the `Title` property by traversing up and noting the named types in the tree\n */\nfunction extractTitle(node: ts.Node): Annotations {\n const typeNames = recurseTypeChain(node, undefined).reverse().join(\".\");\n\n if (!typeNames.length) {\n return {};\n }\n\n return { title: typeNames };\n}\n\n/**\n *\n */\nfunction stringifyDoc(\n docString: undefined | string | ts.NodeArray<ts.JSDocComment>\n): string | undefined {\n if (typeof docString === \"undefined\" || typeof docString === \"string\") {\n return docString;\n }\n\n return docString.map(({ text }) => text).join(\" \");\n}\n\n/**\n * Extracts JSDoc tags to strings\n */\nfunction extractTags(tags: ReadonlyArray<ts.JSDocTag>): Annotations {\n const descriptions: Array<string> = [];\n const examples: Array<string> = [];\n const _default: Array<string> = [];\n const see: Array<string> = [];\n const meta: Record<string, string> = {};\n\n /**\n *\n */\n const extractSee = (tag: ts.JSDocSeeTag) => {\n return `${tag.tagName ? `${tag.tagName?.getText()} ` : \"\"}${\n stringifyDoc(tag.comment)?.trim() ?? \"\"\n }`;\n };\n\n tags.forEach((tag) => {\n if (!tag.comment) {\n return;\n }\n\n if (tag.tagName.text === \"example\") {\n examples.push(stringifyDoc(tag.comment)?.trim() ?? \"\");\n } else if (tag.tagName.text === \"default\") {\n _default.push(stringifyDoc(tag.comment)?.trim() ?? \"\");\n } else if (tag.tagName.text === \"see\") {\n see.push(extractSee(tag as ts.JSDocSeeTag));\n } else if (tag.tagName.text === \"meta\") {\n const [key, value] = tag.comment.toString().split(/:(.*)/);\n meta[key] = value?.trim() ?? \"\";\n } else {\n const text = stringifyDoc(tag.comment)?.trim() ?? \"\";\n descriptions.push(`@${tag.tagName.text} ${text}`);\n }\n });\n\n return {\n ...(descriptions.length === 0\n ? {}\n : { description: descriptions.join(\"\\n\") }),\n ...(examples.length === 0 ? {} : { examples }),\n ...(_default.length === 0 ? {} : { default: _default.join(\"\\n\") }),\n ...(see.length === 0 ? {} : { see }),\n ...(meta && Object.keys(meta).length === 0 ? {} : { meta }),\n };\n}\n\n/**\n * Joins Arrays of maybe strings with a given separator\n */\nfunction join(t: Array<string | undefined>, separator = \"\\n\") {\n const unique = new Set(t).values();\n return Array.from(unique)\n .filter((s) => s !== undefined)\n .join(separator)\n .trim();\n}\n\n/**\n * Merges Annotation nodes for various nodes\n */\nfunction mergeAnnotations(nodes: Array<Annotations>): Annotations {\n const name = nodes.find((n) => n.name)?.name;\n const title = join(\n nodes.map((n) => n.title),\n \", \"\n );\n const description = join(nodes.map((n) => n.description));\n const _default = join(nodes.map((n) => n.default));\n const comment = join(nodes.map((n) => n.comment));\n const examples = join(\n nodes.map((n) =>\n Array.isArray(n.examples) ? join(n.examples) : n.examples\n )\n );\n const see = join(\n nodes.map((n) => (Array.isArray(n.see) ? join(n.see) : n.see))\n );\n const meta = nodes.find((n) => n.meta)?.meta;\n return {\n ...(name ? { name } : {}),\n ...(title ? { title } : {}),\n ...(description ? { description } : {}),\n ...(examples ? { examples } : {}),\n ...(_default ? { default: _default } : {}),\n ...(see ? { see } : {}),\n ...(comment ? { comment } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n\n/**\n * Converts JSDoc comments to strings\n */\nexport function decorateNode(node: ts.Node): Annotations {\n const { jsDoc } = node as unknown as JSDocContainer;\n const titleAnnotation = extractTitle(node);\n\n if (jsDoc && jsDoc.length) {\n const first = jsDoc[0];\n return mergeAnnotations([\n extractDescription(stringifyDoc(first.comment)),\n titleAnnotation,\n extractTags(first.tags ?? []),\n ]);\n }\n\n return titleAnnotation;\n}\n","/* eslint-disable no-bitwise */\nimport ts from \"typescript\";\nimport type {\n NamedType,\n NodeType,\n ObjectProperty,\n ObjectType,\n OrType,\n} from \"@player-tools/xlr\";\nimport { computeExtends, resolveConditional } from \"./validation-helpers\";\nimport { isGenericNodeType } from \"./type-checks\";\n\n/**\n * Returns the required type or the optionally required type\n */\nexport function tsStripOptionalType(node: ts.TypeNode): ts.TypeNode {\n return ts.isOptionalTypeNode(node) ? node.type : node;\n}\n\n/**\n * Returns if the top level declaration is exported\n */\nexport function isExportedDeclaration(node: ts.Statement): boolean {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n\n if (modifiers) {\n return modifiers.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n }\n return false;\n}\n\n/**\n * Returns if the node is exported from the source file\n */\nexport function isNodeExported(node: ts.Node): boolean {\n return (\n (ts.getCombinedModifierFlags(node as ts.Declaration) &\n ts.ModifierFlags.Export) !==\n 0 ||\n (!!node.parent && node.parent.kind === ts.SyntaxKind.SourceFile)\n );\n}\n\n/**\n * Returns the actual type and will following import chains if needed\n */\nexport function getReferencedType(\n node: ts.TypeReferenceNode,\n typeChecker: ts.TypeChecker\n) {\n let symbol = typeChecker.getSymbolAtLocation(node.typeName);\n\n if (\n symbol &&\n (symbol.flags & ts.SymbolFlags.Alias) === ts.SymbolFlags.Alias\n ) {\n // follow alias if it is a symbol\n symbol = typeChecker.getAliasedSymbol(symbol);\n }\n\n const varDecl = symbol?.declarations?.[0];\n if (\n varDecl &&\n (ts.isInterfaceDeclaration(varDecl) || ts.isTypeAliasDeclaration(varDecl))\n ) {\n return { declaration: varDecl, exported: isNodeExported(varDecl) };\n }\n}\n\n/**\n * Returns list of string literals from potential union of strings\n */\nexport function getStringLiteralsFromUnion(node: ts.Node): Set<string> {\n if (ts.isUnionTypeNode(node)) {\n return new Set(\n node.types.map((type) => {\n if (ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n }\n\n return \"\";\n })\n );\n }\n\n if (ts.isLiteralTypeNode(node) && ts.isStringLiteral(node.literal)) {\n return new Set([node.literal.text]);\n }\n\n return new Set();\n}\n\n/**\n * Converts a format string into a regex that can be used to validate a given string matches the template\n */\nexport function buildTemplateRegex(\n node: ts.TemplateLiteralTypeNode,\n typeChecker: ts.TypeChecker\n): string {\n let regex = node.head.text;\n node.templateSpans.forEach((span) => {\n // process template tag\n let type = span.type.kind;\n if (ts.isTypeReferenceNode(span.type)) {\n let symbol = typeChecker.getSymbolAtLocation(\n span.type.typeName\n ) as ts.Symbol;\n\n if (\n symbol &&\n (symbol.flags & ts.SymbolFlags.Alias) === ts.SymbolFlags.Alias\n ) {\n // follow alias if it is a symbol\n symbol = typeChecker.getAliasedSymbol(symbol);\n }\n\n type = (symbol?.declarations?.[0] as ts.TypeAliasDeclaration).type.kind;\n }\n\n if (type === ts.SyntaxKind.StringKeyword) {\n regex += \".*\";\n } else if (type === ts.SyntaxKind.NumberKeyword) {\n regex += \"[0-9]*\";\n } else if (type === ts.SyntaxKind.BooleanKeyword) {\n regex += \"true|false\";\n }\n\n // add non-tag element\n regex += span.literal.text;\n });\n return regex;\n}\n\n/**\n * Walks generics to fill in values from a combination of the default, constraint, and passed in map values\n * TODO convert this to use simpleTransformGenerator\n */\nexport function fillInGenerics(\n xlrNode: NodeType,\n generics?: Map<string, NodeType>\n): NodeType {\n // Need to make sure not to set generics in passed in map to avoid using generics outside of tree\n let localGenerics: Map<string, NodeType>;\n\n if (generics) {\n localGenerics = new Map(generics);\n } else {\n localGenerics = new Map();\n if (isGenericNodeType(xlrNode)) {\n xlrNode.genericTokens?.forEach((token) => {\n localGenerics.set(\n token.symbol,\n (token.default ?? token.constraints) as NodeType\n );\n });\n }\n }\n\n if (xlrNode.type === \"ref\") {\n if (localGenerics.has(xlrNode.ref)) {\n return {\n ...(localGenerics.get(xlrNode.ref) as NodeType),\n ...(xlrNode.genericArguments\n ? {\n genericArguments: xlrNode.genericArguments.map((ga) =>\n fillInGenerics(ga, localGenerics)\n ),\n }\n : {}),\n ...(xlrNode.title ? { title: xlrNode.title } : {}),\n ...(xlrNode.name ? { name: xlrNode.name } : {}),\n ...(xlrNode.description ? { description: xlrNode.description } : {}),\n ...(xlrNode.comment ? { comment: xlrNode.comment } : {}),\n };\n }\n\n return {\n ...xlrNode,\n ...(xlrNode.genericArguments\n ? {\n genericArguments: xlrNode.genericArguments.map((ga) =>\n fillInGenerics(ga, localGenerics)\n ),\n }\n : {}),\n };\n }\n\n if (xlrNode.type === \"object\") {\n const newProperties: { [name: string]: ObjectProperty } = {};\n Object.getOwnPropertyNames(xlrNode.properties).forEach((propName) => {\n const prop = xlrNode.properties[propName];\n newProperties[propName] = {\n required: prop.required,\n node: fillInGenerics(prop.node, localGenerics),\n };\n });\n\n return {\n ...xlrNode,\n properties: newProperties,\n };\n }\n\n if (xlrNode.type === \"array\") {\n // eslint-disable-next-line no-param-reassign\n xlrNode.elementType = fillInGenerics(xlrNode.elementType, localGenerics);\n } else if (xlrNode.type === \"or\" || xlrNode.type === \"and\") {\n let pointer;\n if (xlrNode.type === \"or\") {\n pointer = xlrNode.or;\n } else {\n pointer = xlrNode.and;\n }\n\n return {\n ...xlrNode,\n [xlrNode.type]: pointer.map((prop) => {\n return fillInGenerics(prop, localGenerics);\n }),\n };\n } else if (xlrNode.type === \"record\") {\n return {\n ...xlrNode,\n keyType: fillInGenerics(xlrNode.keyType, localGenerics),\n valueType: fillInGenerics(xlrNode.valueType, localGenerics),\n };\n } else if (xlrNode.type === \"conditional\") {\n const filledInConditional = {\n ...xlrNode,\n check: {\n left: fillInGenerics(xlrNode.check.left, localGenerics),\n right: fillInGenerics(xlrNode.check.right, localGenerics),\n },\n value: {\n true: fillInGenerics(xlrNode.value.true, localGenerics),\n false: fillInGenerics(xlrNode.value.false, localGenerics),\n },\n };\n\n // Check to see if we have enough information to resolve this conditional\n if (\n filledInConditional.check.left.type !== \"ref\" &&\n filledInConditional.check.right.type !== \"ref\"\n ) {\n return {\n name: xlrNode.name,\n title: xlrNode.title,\n ...resolveConditional(filledInConditional),\n } as NamedType;\n }\n\n return filledInConditional;\n }\n\n return xlrNode;\n}\n\n/** Applies the TS `Pick` or `Omit` type to an interface/union/intersection */\nexport function applyPickOrOmitToNodeType(\n baseObject: NodeType,\n operation: \"Pick\" | \"Omit\",\n properties: Set<string>\n): NodeType | undefined {\n if (baseObject.type === \"object\") {\n const newObject = { ...baseObject };\n Object.keys(baseObject.properties).forEach((key) => {\n if (\n (operation === \"Omit\" && properties.has(key)) ||\n (operation === \"Pick\" && !properties.has(key))\n ) {\n delete newObject.properties[key];\n }\n });\n\n /**\n * Filter out objects in cases:\n * - A Pick operation and there are no properties left\n * - An Omit operation and there are no properties left and no additional properties allowed\n */\n if (\n Object.keys(newObject.properties).length === 0 &&\n (operation !== \"Omit\" || newObject.additionalProperties === false)\n ) {\n return undefined;\n }\n\n return newObject;\n }\n\n let pointer;\n if (baseObject.type === \"and\") {\n pointer = baseObject.and;\n } else if (baseObject.type === \"or\") {\n pointer = baseObject.or;\n } else {\n throw new Error(\n `Error: Can not apply ${operation} to type ${baseObject.type}`\n );\n }\n\n const pickedTypes = pointer\n .map((type) => {\n const node = applyPickOrOmitToNodeType(type, operation, properties);\n if (node === undefined) {\n return undefined;\n }\n\n return { ...node, additionalProperties: false } as ObjectType;\n })\n .filter((type) => type !== undefined) as NodeType[];\n\n if (pickedTypes.length === 0) {\n return undefined;\n }\n\n if (pickedTypes.length === 1) {\n return pickedTypes[0];\n }\n\n if (baseObject.type === \"and\") {\n return { ...baseObject, and: pickedTypes };\n }\n\n return { ...baseObject, or: pickedTypes };\n}\n\n/** Applies the TS `Partial` or `Required` type to an interface/union/intersection */\nexport function applyPartialOrRequiredToNodeType(\n baseObject: NodeType,\n modifier: boolean\n): NodeType {\n if (baseObject.type === \"object\") {\n const newObject = { ...baseObject };\n Object.keys(baseObject.properties).forEach((key) => {\n newObject.properties[key].required = modifier;\n });\n\n return newObject;\n }\n\n if (baseObject.type === \"and\") {\n const pickedTypes = baseObject.and.map((type) =>\n applyPartialOrRequiredToNodeType(type, modifier)\n );\n return { ...baseObject, and: pickedTypes };\n }\n\n if (baseObject.type === \"or\") {\n const pickedTypes = baseObject.or.map((type) =>\n applyPartialOrRequiredToNodeType(type, modifier)\n );\n return { ...baseObject, or: pickedTypes };\n }\n\n throw new Error(\n `Error: Can not apply ${modifier ? \"Required\" : \"Partial\"} to type ${\n baseObject.type\n }`\n );\n}\n\n/** Applies the TS `Exclude` type to a union */\nexport function applyExcludeToNodeType(\n baseObject: OrType,\n filters: NodeType | OrType\n): NodeType {\n const remainingMembers = baseObject.or.filter((type) => {\n if (filters.type === \"or\") {\n return !filters.or.some((filter) => computeExtends(type, filter));\n }\n\n return !computeExtends(type, filters);\n });\n\n if (remainingMembers.length === 1) {\n return remainingMembers[0];\n }\n\n return {\n ...baseObject,\n or: remainingMembers,\n };\n}\n","import ts from \"typescript\";\nimport type {\n NamedType,\n NamedTypeWithGenerics,\n NodeType,\n NodeTypeWithGenerics,\n PrimitiveTypes,\n} from \"@player-tools/xlr\";\n\n/**\n * Returns if the Object Property is optional\n */\nexport function isOptionalProperty(node: ts.PropertySignature): boolean {\n return node.questionToken?.kind === ts.SyntaxKind.QuestionToken;\n}\n\n/**\n * Returns if the node is an Interface or Type with Generics\n */\nexport function isGenericInterfaceDeclaration(\n node: ts.InterfaceDeclaration\n): boolean {\n const length = node.typeParameters?.length;\n return length ? length > 0 : false;\n}\n\n/**\n * Returns if the node is an Type Declaration with Generics\n */\nexport function isGenericTypeDeclaration(\n node: ts.TypeAliasDeclaration\n): boolean {\n const length = node.typeParameters?.length;\n return length ? length > 0 : false;\n}\n\n/**\n * Returns if the referenced type is a generic\n */\nexport function isTypeReferenceGeneric(\n node: ts.TypeReferenceNode,\n typeChecker: ts.TypeChecker\n): boolean {\n const symbol = typeChecker.getSymbolAtLocation(node.typeName);\n if (symbol && symbol.declarations) {\n return symbol.declarations[0].kind === ts.SyntaxKind.TypeParameter;\n }\n\n return false;\n}\n\nexport type TopLevelDeclaration =\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration;\n\n/**\n * Returns if the node is an interface or a type declaration\n */\nexport function isTopLevelDeclaration(\n node: ts.Node\n): node is TopLevelDeclaration {\n return (\n node.kind === ts.SyntaxKind.InterfaceDeclaration ||\n node.kind === ts.SyntaxKind.TypeAliasDeclaration\n );\n}\n\nexport type TopLevelNode = TopLevelDeclaration | ts.VariableStatement;\n\n/**\n * Returns if the node is an interface or a type declaration\n */\nexport function isTopLevelNode(node: ts.Node): node is TopLevelNode {\n return (\n node.kind === ts.SyntaxKind.InterfaceDeclaration ||\n node.kind === ts.SyntaxKind.TypeAliasDeclaration ||\n node.kind === ts.SyntaxKind.VariableStatement\n );\n}\n\n/**\n * Returns if the NodeType has generic tokens\n */\nexport function isGenericNodeType<T extends NodeType = NodeType>(\n nt: NodeType\n): nt is NodeTypeWithGenerics<T> {\n return (nt as NodeTypeWithGenerics).genericTokens?.length > 0;\n}\n\n/**\n * Returns if the named type has generic tokens\n */\nexport function isGenericNamedType<T extends NamedType = NamedType>(\n nt: NodeType\n): nt is NamedTypeWithGenerics<T> {\n return (nt as NamedTypeWithGenerics).genericTokens?.length > 0;\n}\n\n/**\n * Returns if the node is a `PrimitiveTypes`\n */\nexport function isPrimitiveTypeNode(node: NodeType): node is PrimitiveTypes {\n return (\n node.type === \"string\" ||\n node.type === \"number\" ||\n node.type === \"boolean\" ||\n node.type === \"null\" ||\n node.type === \"any\" ||\n node.type === \"never\" ||\n node.type === \"undefined\" ||\n node.type === \"unknown\" ||\n node.type === \"void\"\n );\n}\n\n/**\n * Type Guard for non-null values\n */\nexport function isNonNullable<T>(a: T | null | undefined): a is NonNullable<T> {\n return a !== null || a !== undefined;\n}\n","import type { Node } from \"jsonc-parser\";\nimport type {\n ConditionalType,\n NodeType,\n ObjectType,\n RefNode,\n} from \"@player-tools/xlr\";\nimport { isGenericNodeType, isPrimitiveTypeNode } from \"./type-checks\";\nimport { fillInGenerics } from \"./ts-helpers\";\n\nexport interface PropertyNode {\n /** Equivalent Property Name */\n key: string;\n\n /** Equivalent Property Value */\n value: Node;\n}\n\n/**\n * Takes a property node and returns the underlying Key/Value Pairs\n */\nexport function propertyToTuple(node: Node): PropertyNode {\n let key = node.children?.[0].value as string;\n if (key.includes(\"-\")) {\n key = `\"${key}\"`;\n }\n\n return {\n key,\n value: node.children?.[1] as Node,\n };\n}\n\n/**\n * Turns a node's children into a map for easy access\n */\nexport function makePropertyMap(node: Node): Map<string, Node> {\n const m = new Map();\n node.children?.forEach((child) => {\n const property = propertyToTuple(child);\n m.set(property.key, property.value);\n });\n return m;\n}\n\n/**\n * Checks if property is a leaf node or another node\n */\nexport function isNode(obj: Node | string | number | boolean): obj is Node {\n return (\n typeof obj !== \"string\" ||\n typeof obj !== \"number\" ||\n typeof obj !== \"boolean\"\n );\n}\n\n/**\n * Computes if the first arg extends the second arg\n */\nexport function computeExtends(a: NodeType, b: NodeType): boolean {\n // special case for any/unknown being functionally the same\n if (\n (a.type === \"any\" || a.type === \"unknown\") &&\n (b.type === \"any\" || b.type === \"unknown\")\n ) {\n return true;\n }\n\n // special case for null/undefined being functionally the same\n if (\n (a.type === \"null\" || a.type === \"undefined\") &&\n (b.type === \"null\" || b.type === \"undefined\")\n ) {\n return true;\n }\n\n // check simple case of equal types\n if (a.type === b.type) {\n if (isPrimitiveTypeNode(a) && isPrimitiveTypeNode(b)) {\n if (a.const && b.const) {\n if (a.const === b.const) {\n return true;\n }\n } else {\n return true;\n }\n }\n\n if (a.type === \"ref\" && b.type === \"ref\") {\n return a.ref === b.ref;\n }\n\n if (a.type === \"object\" && b.type === \"object\") {\n for (const property in b.properties) {\n const propertyNode = b.properties[property];\n if (\n !a.properties[property] ||\n !computeExtends(a.properties[property].node, propertyNode.node)\n ) {\n return false;\n }\n }\n\n return true;\n }\n }\n\n if (isPrimitiveTypeNode(a) && b.type === \"or\") {\n return b.or.every((member) => computeExtends(a, member));\n }\n\n if (isPrimitiveTypeNode(b) && a.type === \"or\") {\n return a.or.every((member) => computeExtends(b, member));\n }\n\n if (a.type === \"or\" && b.type === \"or\") {\n return a.or.every((x) => b.or.some((y) => computeExtends(x, y)));\n }\n\n return false;\n}\n\n/**\n * Attempts to resolve a conditional type\n */\nexport function resolveConditional(conditional: ConditionalType): NodeType {\n const { left, right } = conditional.check;\n if (isPrimitiveTypeNode(left) && isPrimitiveTypeNode(right)) {\n const conditionalResult = conditional.value.false;\n\n // Compose first level generics here since `conditionalResult` won't have them\n if (isGenericNodeType(conditional)) {\n const genericMap: Map<string, NodeType> = new Map();\n conditional.genericTokens.forEach((token) => {\n genericMap.set(\n token.symbol,\n token.default ?? token.constraints ?? { type: \"any\" }\n );\n });\n\n return fillInGenerics(conditionalResult, genericMap);\n }\n\n return conditionalResult;\n }\n\n // unable to process return original\n return conditional;\n}\n\n/**\n *\n */\nexport function resolveReferenceNode(\n genericReference: RefNode,\n typeToFill: NodeType\n): NodeType {\n const genericArgs = genericReference.genericArguments;\n const genericMap: Map<string, NodeType> = new Map();\n\n // Compose first level generics here from `genericReference`\n if (genericArgs && isGenericNodeType(typeToFill)) {\n typeToFill.genericTokens.forEach((token, index) => {\n genericMap.set(\n token.symbol,\n genericArgs[index] ?? token.default ?? token.constraints\n );\n });\n }\n\n // Fill in generics\n const filledInNode = fillInGenerics(typeToFill, genericMap);\n\n // Remove generic tokens that were resolve\n if (isGenericNodeType(filledInNode) && genericArgs?.length) {\n if (genericArgs.length < filledInNode.genericTokens.length) {\n filledInNode.genericTokens = filledInNode.genericTokens.slice(\n genericArgs?.length\n );\n } else if (genericArgs.length === filledInNode.genericTokens.length) {\n filledInNode.genericTokens = [];\n }\n }\n\n // Resolve index access\n if (genericReference.property && filledInNode.type === \"object\") {\n return (\n filledInNode.properties[genericReference.property]?.node ??\n filledInNode.additionalProperties ?? { type: \"undefined\" }\n );\n }\n\n return filledInNode;\n}\n\n/**\n * Combines two ObjectType objects to get a representation of the effective TypeScript interface of `base` extending `operand`\n - * @param base The base interface\n - * @param operand The interface that is extended\n - * @param errorOnOverlap whether or not conflicting properties should throw an error or use the property from operand\n - * @returns `ObjectType`\n */\nexport function computeEffectiveObject(\n base: ObjectType,\n operand: ObjectType,\n errorOnOverlap = true\n): ObjectType {\n const baseObjectName = base.name ?? base.title ?? \"object literal\";\n const operandObjectName = operand.name ?? operand.title ?? \"object literal\";\n const newObject = {\n ...JSON.parse(JSON.stringify(base)),\n name: `${baseObjectName} & ${operandObjectName}`,\n description: `Effective type combining ${baseObjectName} and ${operandObjectName}`,\n genericTokens: [\n ...(isGenericNodeType(base) ? base.genericTokens : []),\n ...(isGenericNodeType(operand) ? operand.genericTokens : []),\n ],\n };\n // TODO this check needs to account for primitive -> primitive generic overlap\n\n for (const property in operand.properties) {\n if (newObject.properties[property] !== undefined && errorOnOverlap) {\n if (\n !computeExtends(\n newObject.properties[property].node,\n operand.properties[property].node\n )\n ) {\n throw new Error(\n `Can't compute effective type for ${baseObjectName} and ${operandObjectName} because of conflicting properties ${property}`\n );\n }\n }\n\n newObject.properties[property] = operand.properties[property];\n }\n\n if (newObject.additionalProperties && operand.additionalProperties) {\n if (\n !isPrimitiveTypeNode(newObject.additionalProperties) ||\n !isPrimitiveTypeNode(operand.additionalProperties) ||\n newObject.additionalProperties.type !== operand.additionalProperties.type\n ) {\n newObject.additionalProperties = {\n type: \"and\",\n and: [newObject.additionalProperties, operand.additionalProperties],\n };\n }\n } else if (operand.additionalProperties) {\n newObject.additionalProperties = operand.additionalProperties;\n }\n\n return newObject;\n}\n","import ts from \"typescript\";\nimport * as tsvfs from \"@typescript/vfs\";\n\nexport interface SetupReturnType {\n /**\n * Virtual source file containing the passed in text\n */\n sf: ts.SourceFile;\n /**\n * Type checker for the virtual program\n */\n tc: ts.TypeChecker;\n}\n\n/**\n * Setups a virtual TS environment for tests\n */\nexport function setupTestEnv(sourceCode: string, mockFileName = \"filename.ts\") {\n const fsMap = tsvfs.createDefaultMapFromNodeModules({}, ts);\n fsMap.set(mockFileName, sourceCode);\n\n const system = tsvfs.createSystem(fsMap);\n const host = tsvfs.createVirtualCompilerHost(system, {}, ts);\n\n const program = ts.createProgram({\n rootNames: [...fsMap.keys()],\n options: {},\n host: host.compilerHost,\n });\n\n return {\n sf: host.compilerHost.getSourceFile(\n mockFileName,\n ts.ScriptTarget.ES5\n ) as ts.SourceFile,\n tc: program.getTypeChecker(),\n };\n}\n","import ts from \"typescript\";\nimport type { SymbolDisplayPart } from \"typescript\";\nimport type { NodeType } from \"@player-tools/xlr\";\nimport { isPrimitiveTypeNode } from \"./type-checks\";\n\nconst { SymbolDisplayPartKind, displayPartsToString } = ts;\n\n/** Like `.join()` but for arrays */\nfunction insertBetweenElements<T>(array: Array<T>, separator: T): T[] {\n return array.reduce((acc, item, index) => {\n if (index === 0) {\n return [item];\n }\n\n return [...acc, separator, item];\n }, [] as T[]);\n}\n\n/**\n * Generate a documentation string for a given node\n *\n * @param node - The source node to author the docs string for\n * @returns - documentation string\n */\nexport function createTSDocString(node: NodeType): Array<SymbolDisplayPart> {\n if (node.type === \"ref\") {\n return [\n {\n text: node.ref,\n kind: SymbolDisplayPartKind.keyword as any,\n },\n ];\n }\n\n if (node.type === \"or\" || node.type === \"and\") {\n const items = node.type === \"and\" ? node.and : node.or;\n\n return insertBetweenElements(\n items.map((subnode) => createTSDocString(subnode)),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: node.type === \"and\" ? \" & \" : \" | \",\n },\n ]\n ).flat();\n }\n\n if (node.type === \"function\") {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text: \"function\",\n },\n {\n kind: SymbolDisplayPartKind.space as any,\n text: \" \",\n },\n ...(node.name\n ? [{ text: node.name, kind: SymbolDisplayPartKind.methodName }]\n : []),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"(\",\n },\n ...insertBetweenElements(\n node.parameters.map((p) => {\n if (p.name) {\n return [\n {\n kind: SymbolDisplayPartKind.parameterName as any,\n text: p.name,\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: p.optional ? \"?\" : \"\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(p.type),\n ];\n }\n\n return createTSDocString(p.type);\n }),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ]\n ).flat(),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \")\",\n },\n ...(node.returnType\n ? [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(node.returnType),\n ]\n : []),\n ];\n }\n\n if (node.type === \"tuple\") {\n return [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"[\",\n },\n ...insertBetweenElements(\n node.elementTypes.map((t) => {\n if (t.name) {\n return [\n {\n kind: SymbolDisplayPartKind.propertyName as any,\n text: t.name,\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(t.type),\n ];\n }\n\n return createTSDocString(t.type);\n }),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ]\n ).flat(),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"]\",\n },\n ];\n }\n\n if (node.type === \"array\") {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: \"Array\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"<\",\n },\n ...createTSDocString(node.elementType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \">\",\n },\n ];\n }\n\n if (node.type === \"record\") {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: \"Record\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"<\",\n },\n ...createTSDocString(node.keyType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ...createTSDocString(node.valueType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \">\",\n },\n ];\n }\n\n if (\n (node.type === \"string\" ||\n node.type === \"boolean\" ||\n node.type === \"number\") &&\n node.const !== undefined\n ) {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text:\n typeof node.const === \"string\"\n ? `\"${node.const}\"`\n : String(node.const),\n },\n ];\n }\n\n if (isPrimitiveTypeNode(node) && node.type !== \"null\") {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text: node.type,\n },\n ];\n }\n\n if (node.type === \"object\" && node.name) {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: node.name,\n },\n ];\n }\n\n return [\n {\n kind: SymbolDisplayPartKind.localName as any,\n text: node.type,\n },\n ];\n}\n\n/** Convert the TS SymbolDisplayParts into a single string */\nexport function symbolDisplayToString(\n displayParts: Array<SymbolDisplayPart>\n): string {\n return displayPartsToString(displayParts);\n}\n\n/** Create a documentation string from node */\nexport function createDocString(node: NodeType): string {\n return symbolDisplayToString(createTSDocString(node));\n}\n"],"mappings":"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","names":["ts","import_typescript","import_typescript","ts","ts","import_typescript","ts","import_typescript","ts"]}
@@ -337,7 +337,10 @@ function tsStripOptionalType(node) {
337
337
  }
338
338
  function isExportedDeclaration(node) {
339
339
  const modifiers = ts3.canHaveModifiers(node) ? ts3.getModifiers(node) : void 0;
340
- return modifiers && modifiers.some((modifier) => modifier.kind === ts3.SyntaxKind.ExportKeyword);
340
+ if (modifiers) {
341
+ return modifiers.some((m) => m.kind === ts3.SyntaxKind.ExportKeyword);
342
+ }
343
+ return false;
341
344
  }
342
345
  function isNodeExported(node) {
343
346
  return (ts3.getCombinedModifierFlags(node) & ts3.ModifierFlags.Export) !== 0 || !!node.parent && node.parent.kind === ts3.SyntaxKind.SourceFile;
package/dist/index.mjs CHANGED
@@ -337,7 +337,10 @@ function tsStripOptionalType(node) {
337
337
  }
338
338
  function isExportedDeclaration(node) {
339
339
  const modifiers = ts3.canHaveModifiers(node) ? ts3.getModifiers(node) : void 0;
340
- return modifiers && modifiers.some((modifier) => modifier.kind === ts3.SyntaxKind.ExportKeyword);
340
+ if (modifiers) {
341
+ return modifiers.some((m) => m.kind === ts3.SyntaxKind.ExportKeyword);
342
+ }
343
+ return false;
341
344
  }
342
345
  function isNodeExported(node) {
343
346
  return (ts3.getCombinedModifierFlags(node) & ts3.ModifierFlags.Export) !== 0 || !!node.parent && node.parent.kind === ts3.SyntaxKind.SourceFile;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/annotations.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/ts-helpers.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/type-checks.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/validation-helpers.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/test-helpers.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/documentation.ts"],"sourcesContent":["import ts from \"typescript\";\nimport type { Annotations } from \"@player-tools/xlr\";\n\ninterface JSDocContainer {\n /** */\n jsDoc: Array<ts.JSDoc>;\n}\n\n/**\n *\n */\nfunction extractDescription(text: string | undefined): Annotations {\n if (!text) {\n return {};\n }\n\n return { description: text };\n}\n\n/**\n * Checks if the parent node is a non-object type\n */\nfunction parentIsNonObjectPath(node: ts.Node) {\n return (\n node.parent &&\n (ts.isArrayTypeNode(node.parent) ||\n ts.isTupleTypeNode(node.parent) ||\n ts.isOptionalTypeNode(node.parent) ||\n ts.isRestTypeNode(node.parent) ||\n ts.isUnionTypeNode(node.parent))\n );\n}\n\n/**\n * Traverses up the node tree to build the title path down to the initial node\n */\nfunction recurseTypeChain(\n node: ts.Node,\n child: ts.Node | undefined\n): Array<string> {\n if (!node) {\n return [];\n }\n\n if (\n ts.isArrayTypeNode(node) &&\n node.parent &&\n ts.isRestTypeNode(node.parent)\n ) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isRestTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isOptionalTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isUnionTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isParenthesizedTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isTypeLiteralNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isArrayTypeNode(node)) {\n return [\"[]\", ...recurseTypeChain(node.parent, node)];\n }\n\n if (ts.isTupleTypeNode(node)) {\n const pos = node.elements.indexOf(child as any);\n return [\n ...(pos === -1 ? [] : [`${pos}`]),\n ...recurseTypeChain(node.parent, node),\n ];\n }\n\n if (\n ts.isTypeAliasDeclaration(node) ||\n ts.isInterfaceDeclaration(node) ||\n ts.isPropertySignature(node)\n ) {\n return [node.name.getText(), ...recurseTypeChain(node.parent, node)];\n }\n\n if (parentIsNonObjectPath(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n return [];\n}\n\n/**\n * Builds the `Title` property by traversing up and noting the named types in the tree\n */\nfunction extractTitle(node: ts.Node): Annotations {\n const typeNames = recurseTypeChain(node, undefined).reverse().join(\".\");\n\n if (!typeNames.length) {\n return {};\n }\n\n return { title: typeNames };\n}\n\n/**\n *\n */\nfunction stringifyDoc(\n docString: undefined | string | ts.NodeArray<ts.JSDocComment>\n): string | undefined {\n if (typeof docString === \"undefined\" || typeof docString === \"string\") {\n return docString;\n }\n\n return docString.map(({ text }) => text).join(\" \");\n}\n\n/**\n * Extracts JSDoc tags to strings\n */\nfunction extractTags(tags: ReadonlyArray<ts.JSDocTag>): Annotations {\n const descriptions: Array<string> = [];\n const examples: Array<string> = [];\n const _default: Array<string> = [];\n const see: Array<string> = [];\n const meta: Record<string, string> = {};\n\n /**\n *\n */\n const extractSee = (tag: ts.JSDocSeeTag) => {\n return `${tag.tagName ? `${tag.tagName?.getText()} ` : \"\"}${\n stringifyDoc(tag.comment)?.trim() ?? \"\"\n }`;\n };\n\n tags.forEach((tag) => {\n if (!tag.comment) {\n return;\n }\n\n if (tag.tagName.text === \"example\") {\n examples.push(stringifyDoc(tag.comment)?.trim() ?? \"\");\n } else if (tag.tagName.text === \"default\") {\n _default.push(stringifyDoc(tag.comment)?.trim() ?? \"\");\n } else if (tag.tagName.text === \"see\") {\n see.push(extractSee(tag as ts.JSDocSeeTag));\n } else if (tag.tagName.text === \"meta\") {\n const [key, value] = tag.comment.toString().split(/:(.*)/);\n meta[key] = value?.trim() ?? \"\";\n } else {\n const text = stringifyDoc(tag.comment)?.trim() ?? \"\";\n descriptions.push(`@${tag.tagName.text} ${text}`);\n }\n });\n\n return {\n ...(descriptions.length === 0\n ? {}\n : { description: descriptions.join(\"\\n\") }),\n ...(examples.length === 0 ? {} : { examples }),\n ...(_default.length === 0 ? {} : { default: _default.join(\"\\n\") }),\n ...(see.length === 0 ? {} : { see }),\n ...(meta && Object.keys(meta).length === 0 ? {} : { meta }),\n };\n}\n\n/**\n * Joins Arrays of maybe strings with a given separator\n */\nfunction join(t: Array<string | undefined>, separator = \"\\n\") {\n const unique = new Set(t).values();\n return Array.from(unique)\n .filter((s) => s !== undefined)\n .join(separator)\n .trim();\n}\n\n/**\n * Merges Annotation nodes for various nodes\n */\nfunction mergeAnnotations(nodes: Array<Annotations>): Annotations {\n const name = nodes.find((n) => n.name)?.name;\n const title = join(\n nodes.map((n) => n.title),\n \", \"\n );\n const description = join(nodes.map((n) => n.description));\n const _default = join(nodes.map((n) => n.default));\n const comment = join(nodes.map((n) => n.comment));\n const examples = join(\n nodes.map((n) =>\n Array.isArray(n.examples) ? join(n.examples) : n.examples\n )\n );\n const see = join(\n nodes.map((n) => (Array.isArray(n.see) ? join(n.see) : n.see))\n );\n const meta = nodes.find((n) => n.meta)?.meta;\n return {\n ...(name ? { name } : {}),\n ...(title ? { title } : {}),\n ...(description ? { description } : {}),\n ...(examples ? { examples } : {}),\n ...(_default ? { default: _default } : {}),\n ...(see ? { see } : {}),\n ...(comment ? { comment } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n\n/**\n * Converts JSDoc comments to strings\n */\nexport function decorateNode(node: ts.Node): Annotations {\n const { jsDoc } = node as unknown as JSDocContainer;\n const titleAnnotation = extractTitle(node);\n\n if (jsDoc && jsDoc.length) {\n const first = jsDoc[0];\n return mergeAnnotations([\n extractDescription(stringifyDoc(first.comment)),\n titleAnnotation,\n extractTags(first.tags ?? []),\n ]);\n }\n\n return titleAnnotation;\n}\n","/* eslint-disable no-bitwise */\nimport ts from \"typescript\";\nimport type {\n NamedType,\n NodeType,\n ObjectProperty,\n ObjectType,\n OrType,\n} from \"@player-tools/xlr\";\nimport { computeExtends, resolveConditional } from \"./validation-helpers\";\nimport { isGenericNodeType } from \"./type-checks\";\n\n/**\n * Returns the required type or the optionally required type\n */\nexport function tsStripOptionalType(node: ts.TypeNode): ts.TypeNode {\n return ts.isOptionalTypeNode(node) ? node.type : node;\n}\n\n/**\n * Returns if the top level declaration is exported\n */\nexport function isExportedDeclaration(node: ts.Statement) {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n return (\n modifiers &&\n modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)\n );\n}\n\n/**\n * Returns if the node is exported from the source file\n */\nexport function isNodeExported(node: ts.Node): boolean {\n return (\n (ts.getCombinedModifierFlags(node as ts.Declaration) &\n ts.ModifierFlags.Export) !==\n 0 ||\n (!!node.parent && node.parent.kind === ts.SyntaxKind.SourceFile)\n );\n}\n\n/**\n * Returns the actual type and will following import chains if needed\n */\nexport function getReferencedType(\n node: ts.TypeReferenceNode,\n typeChecker: ts.TypeChecker\n) {\n let symbol = typeChecker.getSymbolAtLocation(node.typeName);\n\n if (\n symbol &&\n (symbol.flags & ts.SymbolFlags.Alias) === ts.SymbolFlags.Alias\n ) {\n // follow alias if it is a symbol\n symbol = typeChecker.getAliasedSymbol(symbol);\n }\n\n const varDecl = symbol?.declarations?.[0];\n if (\n varDecl &&\n (ts.isInterfaceDeclaration(varDecl) || ts.isTypeAliasDeclaration(varDecl))\n ) {\n return { declaration: varDecl, exported: isNodeExported(varDecl) };\n }\n}\n\n/**\n * Returns list of string literals from potential union of strings\n */\nexport function getStringLiteralsFromUnion(node: ts.Node): Set<string> {\n if (ts.isUnionTypeNode(node)) {\n return new Set(\n node.types.map((type) => {\n if (ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n }\n\n return \"\";\n })\n );\n }\n\n if (ts.isLiteralTypeNode(node) && ts.isStringLiteral(node.literal)) {\n return new Set([node.literal.text]);\n }\n\n return new Set();\n}\n\n/**\n * Converts a format string into a regex that can be used to validate a given string matches the template\n */\nexport function buildTemplateRegex(\n node: ts.TemplateLiteralTypeNode,\n typeChecker: ts.TypeChecker\n): string {\n let regex = node.head.text;\n node.templateSpans.forEach((span) => {\n // process template tag\n let type = span.type.kind;\n if (ts.isTypeReferenceNode(span.type)) {\n let symbol = typeChecker.getSymbolAtLocation(\n span.type.typeName\n ) as ts.Symbol;\n\n if (\n symbol &&\n (symbol.flags & ts.SymbolFlags.Alias) === ts.SymbolFlags.Alias\n ) {\n // follow alias if it is a symbol\n symbol = typeChecker.getAliasedSymbol(symbol);\n }\n\n type = (symbol?.declarations?.[0] as ts.TypeAliasDeclaration).type.kind;\n }\n\n if (type === ts.SyntaxKind.StringKeyword) {\n regex += \".*\";\n } else if (type === ts.SyntaxKind.NumberKeyword) {\n regex += \"[0-9]*\";\n } else if (type === ts.SyntaxKind.BooleanKeyword) {\n regex += \"true|false\";\n }\n\n // add non-tag element\n regex += span.literal.text;\n });\n return regex;\n}\n\n/**\n * Walks generics to fill in values from a combination of the default, constraint, and passed in map values\n * TODO convert this to use simpleTransformGenerator\n */\nexport function fillInGenerics(\n xlrNode: NodeType,\n generics?: Map<string, NodeType>\n): NodeType {\n // Need to make sure not to set generics in passed in map to avoid using generics outside of tree\n let localGenerics: Map<string, NodeType>;\n\n if (generics) {\n localGenerics = new Map(generics);\n } else {\n localGenerics = new Map();\n if (isGenericNodeType(xlrNode)) {\n xlrNode.genericTokens?.forEach((token) => {\n localGenerics.set(\n token.symbol,\n (token.default ?? token.constraints) as NodeType\n );\n });\n }\n }\n\n if (xlrNode.type === \"ref\") {\n if (localGenerics.has(xlrNode.ref)) {\n return {\n ...(localGenerics.get(xlrNode.ref) as NodeType),\n ...(xlrNode.genericArguments\n ? {\n genericArguments: xlrNode.genericArguments.map((ga) =>\n fillInGenerics(ga, localGenerics)\n ),\n }\n : {}),\n ...(xlrNode.title ? { title: xlrNode.title } : {}),\n ...(xlrNode.name ? { name: xlrNode.name } : {}),\n ...(xlrNode.description ? { description: xlrNode.description } : {}),\n ...(xlrNode.comment ? { comment: xlrNode.comment } : {}),\n };\n }\n\n return {\n ...xlrNode,\n ...(xlrNode.genericArguments\n ? {\n genericArguments: xlrNode.genericArguments.map((ga) =>\n fillInGenerics(ga, localGenerics)\n ),\n }\n : {}),\n };\n }\n\n if (xlrNode.type === \"object\") {\n const newProperties: { [name: string]: ObjectProperty } = {};\n Object.getOwnPropertyNames(xlrNode.properties).forEach((propName) => {\n const prop = xlrNode.properties[propName];\n newProperties[propName] = {\n required: prop.required,\n node: fillInGenerics(prop.node, localGenerics),\n };\n });\n\n return {\n ...xlrNode,\n properties: newProperties,\n };\n }\n\n if (xlrNode.type === \"array\") {\n // eslint-disable-next-line no-param-reassign\n xlrNode.elementType = fillInGenerics(xlrNode.elementType, localGenerics);\n } else if (xlrNode.type === \"or\" || xlrNode.type === \"and\") {\n let pointer;\n if (xlrNode.type === \"or\") {\n pointer = xlrNode.or;\n } else {\n pointer = xlrNode.and;\n }\n\n return {\n ...xlrNode,\n [xlrNode.type]: pointer.map((prop) => {\n return fillInGenerics(prop, localGenerics);\n }),\n };\n } else if (xlrNode.type === \"record\") {\n return {\n ...xlrNode,\n keyType: fillInGenerics(xlrNode.keyType, localGenerics),\n valueType: fillInGenerics(xlrNode.valueType, localGenerics),\n };\n } else if (xlrNode.type === \"conditional\") {\n const filledInConditional = {\n ...xlrNode,\n check: {\n left: fillInGenerics(xlrNode.check.left, localGenerics),\n right: fillInGenerics(xlrNode.check.right, localGenerics),\n },\n value: {\n true: fillInGenerics(xlrNode.value.true, localGenerics),\n false: fillInGenerics(xlrNode.value.false, localGenerics),\n },\n };\n\n // Check to see if we have enough information to resolve this conditional\n if (\n filledInConditional.check.left.type !== \"ref\" &&\n filledInConditional.check.right.type !== \"ref\"\n ) {\n return {\n name: xlrNode.name,\n title: xlrNode.title,\n ...resolveConditional(filledInConditional),\n } as NamedType;\n }\n\n return filledInConditional;\n }\n\n return xlrNode;\n}\n\n/** Applies the TS `Pick` type to an interface/union/intersection */\nexport function applyPickOrOmitToNodeType(\n baseObject: NodeType,\n operation: \"Pick\" | \"Omit\",\n properties: Set<string>\n): NodeType | undefined {\n if (baseObject.type === \"object\") {\n const newObject = { ...baseObject };\n Object.keys(baseObject.properties).forEach((key) => {\n if (\n (operation === \"Omit\" && properties.has(key)) ||\n (operation === \"Pick\" && !properties.has(key))\n ) {\n delete newObject.properties[key];\n }\n });\n\n /**\n * Filter out objects in cases:\n * - A Pick operation and there are no properties left\n * - An Omit operation and there are no properties left and no additional properties allowed\n */\n if (\n Object.keys(newObject.properties).length === 0 &&\n (operation !== \"Omit\" || newObject.additionalProperties === false)\n ) {\n return undefined;\n }\n\n return newObject;\n }\n\n let pointer;\n if (baseObject.type === \"and\") {\n pointer = baseObject.and;\n } else if (baseObject.type === \"or\") {\n pointer = baseObject.or;\n } else {\n throw new Error(\n `Error: Can not apply ${operation} to type ${baseObject.type}`\n );\n }\n\n const pickedTypes = pointer\n .map((type) => {\n const node = applyPickOrOmitToNodeType(type, operation, properties);\n if (node === undefined) {\n return undefined;\n }\n\n return { ...node, additionalProperties: false } as ObjectType;\n })\n .filter((type) => type !== undefined) as NodeType[];\n\n if (pickedTypes.length === 0) {\n return undefined;\n }\n\n if (pickedTypes.length === 1) {\n return pickedTypes[0];\n }\n\n if (baseObject.type === \"and\") {\n return { ...baseObject, and: pickedTypes };\n }\n\n return { ...baseObject, or: pickedTypes };\n}\n\n/** Applies the TS `Omit` type to an interface/union/intersection */\nexport function applyPartialOrRequiredToNodeType(\n baseObject: NodeType,\n modifier: boolean\n): NodeType {\n if (baseObject.type === \"object\") {\n const newObject = { ...baseObject };\n Object.keys(baseObject.properties).forEach((key) => {\n newObject.properties[key].required = modifier;\n });\n\n return newObject;\n }\n\n if (baseObject.type === \"and\") {\n const pickedTypes = baseObject.and.map((type) =>\n applyPartialOrRequiredToNodeType(type, modifier)\n );\n return { ...baseObject, and: pickedTypes };\n }\n\n if (baseObject.type === \"or\") {\n const pickedTypes = baseObject.or.map((type) =>\n applyPartialOrRequiredToNodeType(type, modifier)\n );\n return { ...baseObject, or: pickedTypes };\n }\n\n throw new Error(\n `Error: Can not apply ${modifier ? \"Required\" : \"Partial\"} to type ${\n baseObject.type\n }`\n );\n}\n\n/** Applies the TS `Exclude` type to a union */\nexport function applyExcludeToNodeType(\n baseObject: OrType,\n filters: NodeType | OrType\n): NodeType {\n const remainingMembers = baseObject.or.filter((type) => {\n if (filters.type === \"or\") {\n return !filters.or.some((filter) => computeExtends(type, filter));\n }\n\n return !computeExtends(type, filters);\n });\n\n if (remainingMembers.length === 1) {\n return remainingMembers[0];\n }\n\n return {\n ...baseObject,\n or: remainingMembers,\n };\n}\n","import ts from \"typescript\";\nimport type {\n NamedType,\n NamedTypeWithGenerics,\n NodeType,\n NodeTypeWithGenerics,\n PrimitiveTypes,\n} from \"@player-tools/xlr\";\n\n/**\n * Returns if the Object Property is optional\n */\nexport function isOptionalProperty(node: ts.PropertySignature): boolean {\n return node.questionToken?.kind === ts.SyntaxKind.QuestionToken;\n}\n\n/**\n * Returns if the node is an Interface or Type with Generics\n */\nexport function isGenericInterfaceDeclaration(\n node: ts.InterfaceDeclaration\n): boolean {\n const length = node.typeParameters?.length;\n return length ? length > 0 : false;\n}\n\n/**\n * Returns if the node is an Type Declaration with Generics\n */\nexport function isGenericTypeDeclaration(\n node: ts.TypeAliasDeclaration\n): boolean {\n const length = node.typeParameters?.length;\n return length ? length > 0 : false;\n}\n\n/**\n * Returns if the referenced type is a generic\n */\nexport function isTypeReferenceGeneric(\n node: ts.TypeReferenceNode,\n typeChecker: ts.TypeChecker\n): boolean {\n const symbol = typeChecker.getSymbolAtLocation(node.typeName);\n if (symbol && symbol.declarations) {\n return symbol.declarations[0].kind === ts.SyntaxKind.TypeParameter;\n }\n\n return false;\n}\n\nexport type TopLevelDeclaration =\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration;\n\n/**\n * Returns if the node is an interface or a type declaration\n */\nexport function isTopLevelDeclaration(\n node: ts.Node\n): node is TopLevelDeclaration {\n return (\n node.kind === ts.SyntaxKind.InterfaceDeclaration ||\n node.kind === ts.SyntaxKind.TypeAliasDeclaration\n );\n}\n\nexport type TopLevelNode = TopLevelDeclaration | ts.VariableStatement;\n\n/**\n * Returns if the node is an interface or a type declaration\n */\nexport function isTopLevelNode(node: ts.Node): node is TopLevelNode {\n return (\n node.kind === ts.SyntaxKind.InterfaceDeclaration ||\n node.kind === ts.SyntaxKind.TypeAliasDeclaration ||\n node.kind === ts.SyntaxKind.VariableStatement\n );\n}\n\n/**\n * Returns if the NodeType has generic tokens\n */\nexport function isGenericNodeType<T extends NodeType = NodeType>(\n nt: NodeType\n): nt is NodeTypeWithGenerics<T> {\n return (nt as NodeTypeWithGenerics).genericTokens?.length > 0;\n}\n\n/**\n * Returns if the named type has generic tokens\n */\nexport function isGenericNamedType<T extends NamedType = NamedType>(\n nt: NodeType\n): nt is NamedTypeWithGenerics<T> {\n return (nt as NamedTypeWithGenerics).genericTokens?.length > 0;\n}\n\n/**\n * Returns if the node is a `PrimitiveTypes`\n */\nexport function isPrimitiveTypeNode(node: NodeType): node is PrimitiveTypes {\n return (\n node.type === \"string\" ||\n node.type === \"number\" ||\n node.type === \"boolean\" ||\n node.type === \"null\" ||\n node.type === \"any\" ||\n node.type === \"never\" ||\n node.type === \"undefined\" ||\n node.type === \"unknown\" ||\n node.type === \"void\"\n );\n}\n\n/**\n * Type Guard for non-null values\n */\nexport function isNonNullable<T>(a: T | null | undefined): a is NonNullable<T> {\n return a !== null || a !== undefined;\n}\n","import type { Node } from \"jsonc-parser\";\nimport type {\n ConditionalType,\n NodeType,\n ObjectType,\n RefNode,\n} from \"@player-tools/xlr\";\nimport { isGenericNodeType, isPrimitiveTypeNode } from \"./type-checks\";\nimport { fillInGenerics } from \"./ts-helpers\";\n\nexport interface PropertyNode {\n /** Equivalent Property Name */\n key: string;\n\n /** Equivalent Property Value */\n value: Node;\n}\n\n/**\n * Takes a property node and returns the underlying Key/Value Pairs\n */\nexport function propertyToTuple(node: Node): PropertyNode {\n let key = node.children?.[0].value as string;\n if (key.includes(\"-\")) {\n key = `\"${key}\"`;\n }\n\n return {\n key,\n value: node.children?.[1] as Node,\n };\n}\n\n/**\n * Turns a node's children into a map for easy access\n */\nexport function makePropertyMap(node: Node): Map<string, Node> {\n const m = new Map();\n node.children?.forEach((child) => {\n const property = propertyToTuple(child);\n m.set(property.key, property.value);\n });\n return m;\n}\n\n/**\n * Checks if property is a leaf node or another node\n */\nexport function isNode(obj: Node | string | number | boolean): obj is Node {\n return (\n typeof obj !== \"string\" ||\n typeof obj !== \"number\" ||\n typeof obj !== \"boolean\"\n );\n}\n\n/**\n * Computes if the first arg extends the second arg\n */\nexport function computeExtends(a: NodeType, b: NodeType): boolean {\n // special case for any/unknown being functionally the same\n if (\n (a.type === \"any\" || a.type === \"unknown\") &&\n (b.type === \"any\" || b.type === \"unknown\")\n ) {\n return true;\n }\n\n // special case for null/undefined being functionally the same\n if (\n (a.type === \"null\" || a.type === \"undefined\") &&\n (b.type === \"null\" || b.type === \"undefined\")\n ) {\n return true;\n }\n\n // check simple case of equal types\n if (a.type === b.type) {\n if (isPrimitiveTypeNode(a) && isPrimitiveTypeNode(b)) {\n if (a.const && b.const) {\n if (a.const === b.const) {\n return true;\n }\n } else {\n return true;\n }\n }\n\n if (a.type === \"ref\" && b.type === \"ref\") {\n return a.ref === b.ref;\n }\n\n if (a.type === \"object\" && b.type === \"object\") {\n for (const property in b.properties) {\n const propertyNode = b.properties[property];\n if (\n !a.properties[property] ||\n !computeExtends(a.properties[property].node, propertyNode.node)\n ) {\n return false;\n }\n }\n\n return true;\n }\n }\n\n if (isPrimitiveTypeNode(a) && b.type === \"or\") {\n return b.or.every((member) => computeExtends(a, member));\n }\n\n if (isPrimitiveTypeNode(b) && a.type === \"or\") {\n return a.or.every((member) => computeExtends(b, member));\n }\n\n if (a.type === \"or\" && b.type === \"or\") {\n return a.or.every((x) => b.or.some((y) => computeExtends(x, y)));\n }\n\n return false;\n}\n\n/**\n * Attempts to resolve a conditional type\n */\nexport function resolveConditional(conditional: ConditionalType): NodeType {\n const { left, right } = conditional.check;\n if (isPrimitiveTypeNode(left) && isPrimitiveTypeNode(right)) {\n const conditionalResult = conditional.value.false;\n\n // Compose first level generics here since `conditionalResult` won't have them\n if (isGenericNodeType(conditional)) {\n const genericMap: Map<string, NodeType> = new Map();\n conditional.genericTokens.forEach((token) => {\n genericMap.set(\n token.symbol,\n token.default ?? token.constraints ?? { type: \"any\" }\n );\n });\n\n return fillInGenerics(conditionalResult, genericMap);\n }\n\n return conditionalResult;\n }\n\n // unable to process return original\n return conditional;\n}\n\n/**\n *\n */\nexport function resolveReferenceNode(\n genericReference: RefNode,\n typeToFill: NodeType\n): NodeType {\n const genericArgs = genericReference.genericArguments;\n const genericMap: Map<string, NodeType> = new Map();\n\n // Compose first level generics here from `genericReference`\n if (genericArgs && isGenericNodeType(typeToFill)) {\n typeToFill.genericTokens.forEach((token, index) => {\n genericMap.set(\n token.symbol,\n genericArgs[index] ?? token.default ?? token.constraints\n );\n });\n }\n\n // Fill in generics\n const filledInNode = fillInGenerics(typeToFill, genericMap);\n\n // Remove generic tokens that were resolve\n if (isGenericNodeType(filledInNode) && genericArgs?.length) {\n if (genericArgs.length < filledInNode.genericTokens.length) {\n filledInNode.genericTokens = filledInNode.genericTokens.slice(\n genericArgs?.length\n );\n } else if (genericArgs.length === filledInNode.genericTokens.length) {\n filledInNode.genericTokens = [];\n }\n }\n\n // Resolve index access\n if (genericReference.property && filledInNode.type === \"object\") {\n return (\n filledInNode.properties[genericReference.property]?.node ??\n filledInNode.additionalProperties ?? { type: \"undefined\" }\n );\n }\n\n return filledInNode;\n}\n\n/**\n * Combines two ObjectType objects to get a representation of the effective TypeScript interface of `base` extending `operand`\n - * @param base The base interface\n - * @param operand The interface that is extended\n - * @param errorOnOverlap whether or not conflicting properties should throw an error or use the property from operand\n - * @returns `ObjectType`\n */\nexport function computeEffectiveObject(\n base: ObjectType,\n operand: ObjectType,\n errorOnOverlap = true\n): ObjectType {\n const baseObjectName = base.name ?? base.title ?? \"object literal\";\n const operandObjectName = operand.name ?? operand.title ?? \"object literal\";\n const newObject = {\n ...JSON.parse(JSON.stringify(base)),\n name: `${baseObjectName} & ${operandObjectName}`,\n description: `Effective type combining ${baseObjectName} and ${operandObjectName}`,\n genericTokens: [\n ...(isGenericNodeType(base) ? base.genericTokens : []),\n ...(isGenericNodeType(operand) ? operand.genericTokens : []),\n ],\n };\n // TODO this check needs to account for primitive -> primitive generic overlap\n\n for (const property in operand.properties) {\n if (newObject.properties[property] !== undefined && errorOnOverlap) {\n if (\n !computeExtends(\n newObject.properties[property].node,\n operand.properties[property].node\n )\n ) {\n throw new Error(\n `Can't compute effective type for ${baseObjectName} and ${operandObjectName} because of conflicting properties ${property}`\n );\n }\n }\n\n newObject.properties[property] = operand.properties[property];\n }\n\n if (newObject.additionalProperties && operand.additionalProperties) {\n if (\n !isPrimitiveTypeNode(newObject.additionalProperties) ||\n !isPrimitiveTypeNode(operand.additionalProperties) ||\n newObject.additionalProperties.type !== operand.additionalProperties.type\n ) {\n newObject.additionalProperties = {\n type: \"and\",\n and: [newObject.additionalProperties, operand.additionalProperties],\n };\n }\n } else if (operand.additionalProperties) {\n newObject.additionalProperties = operand.additionalProperties;\n }\n\n return newObject;\n}\n","import ts from \"typescript\";\nimport * as tsvfs from \"@typescript/vfs\";\n\nexport interface SetupReturnType {\n /**\n * Virtual source file containing the passed in text\n */\n sf: ts.SourceFile;\n /**\n * Type checker for the virtual program\n */\n tc: ts.TypeChecker;\n}\n\n/**\n * Setups a virtual TS environment for tests\n */\nexport function setupTestEnv(sourceCode: string, mockFileName = \"filename.ts\") {\n const fsMap = tsvfs.createDefaultMapFromNodeModules({}, ts);\n fsMap.set(mockFileName, sourceCode);\n\n const system = tsvfs.createSystem(fsMap);\n const host = tsvfs.createVirtualCompilerHost(system, {}, ts);\n\n const program = ts.createProgram({\n rootNames: [...fsMap.keys()],\n options: {},\n host: host.compilerHost,\n });\n\n return {\n sf: host.compilerHost.getSourceFile(\n mockFileName,\n ts.ScriptTarget.ES5\n ) as ts.SourceFile,\n tc: program.getTypeChecker(),\n };\n}\n","import ts from \"typescript\";\nimport type { SymbolDisplayPart } from \"typescript\";\nimport type { NodeType } from \"@player-tools/xlr\";\nimport { isPrimitiveTypeNode } from \"./type-checks\";\n\nconst { SymbolDisplayPartKind, displayPartsToString } = ts;\n\n/** Like `.join()` but for arrays */\nfunction insertBetweenElements<T>(array: Array<T>, separator: T): T[] {\n return array.reduce((acc, item, index) => {\n if (index === 0) {\n return [item];\n }\n\n return [...acc, separator, item];\n }, [] as T[]);\n}\n\n/**\n * Generate a documentation string for a given node\n *\n * @param node - The source node to author the docs string for\n * @returns - documentation string\n */\nexport function createTSDocString(node: NodeType): Array<SymbolDisplayPart> {\n if (node.type === \"ref\") {\n return [\n {\n text: node.ref,\n kind: SymbolDisplayPartKind.keyword as any,\n },\n ];\n }\n\n if (node.type === \"or\" || node.type === \"and\") {\n const items = node.type === \"and\" ? node.and : node.or;\n\n return insertBetweenElements(\n items.map((subnode) => createTSDocString(subnode)),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: node.type === \"and\" ? \" & \" : \" | \",\n },\n ]\n ).flat();\n }\n\n if (node.type === \"function\") {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text: \"function\",\n },\n {\n kind: SymbolDisplayPartKind.space as any,\n text: \" \",\n },\n ...(node.name\n ? [{ text: node.name, kind: SymbolDisplayPartKind.methodName }]\n : []),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"(\",\n },\n ...insertBetweenElements(\n node.parameters.map((p) => {\n if (p.name) {\n return [\n {\n kind: SymbolDisplayPartKind.parameterName as any,\n text: p.name,\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: p.optional ? \"?\" : \"\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(p.type),\n ];\n }\n\n return createTSDocString(p.type);\n }),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ]\n ).flat(),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \")\",\n },\n ...(node.returnType\n ? [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(node.returnType),\n ]\n : []),\n ];\n }\n\n if (node.type === \"tuple\") {\n return [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"[\",\n },\n ...insertBetweenElements(\n node.elementTypes.map((t) => {\n if (t.name) {\n return [\n {\n kind: SymbolDisplayPartKind.propertyName as any,\n text: t.name,\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(t.type),\n ];\n }\n\n return createTSDocString(t.type);\n }),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ]\n ).flat(),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"]\",\n },\n ];\n }\n\n if (node.type === \"array\") {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: \"Array\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"<\",\n },\n ...createTSDocString(node.elementType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \">\",\n },\n ];\n }\n\n if (node.type === \"record\") {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: \"Record\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"<\",\n },\n ...createTSDocString(node.keyType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ...createTSDocString(node.valueType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \">\",\n },\n ];\n }\n\n if (\n (node.type === \"string\" ||\n node.type === \"boolean\" ||\n node.type === \"number\") &&\n node.const !== undefined\n ) {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text:\n typeof node.const === \"string\"\n ? `\"${node.const}\"`\n : String(node.const),\n },\n ];\n }\n\n if (isPrimitiveTypeNode(node) && node.type !== \"null\") {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text: node.type,\n },\n ];\n }\n\n if (node.type === \"object\" && node.name) {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: node.name,\n },\n ];\n }\n\n return [\n {\n kind: SymbolDisplayPartKind.localName as any,\n text: node.type,\n },\n ];\n}\n\n/** Convert the TS SymbolDisplayParts into a single string */\nexport function symbolDisplayToString(\n displayParts: Array<SymbolDisplayPart>\n): string {\n return displayPartsToString(displayParts);\n}\n\n/** Create a documentation string from node */\nexport function createDocString(node: NodeType): string {\n return symbolDisplayToString(createTSDocString(node));\n}\n"],"mappings":"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","names":["ts","ts","ts","ts","ts","ts"]}
1
+ {"version":3,"sources":["../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/annotations.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/ts-helpers.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/type-checks.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/validation-helpers.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/test-helpers.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/documentation.ts"],"sourcesContent":["import ts from \"typescript\";\nimport type { Annotations } from \"@player-tools/xlr\";\n\ninterface JSDocContainer {\n /** */\n jsDoc: Array<ts.JSDoc>;\n}\n\n/**\n *\n */\nfunction extractDescription(text: string | undefined): Annotations {\n if (!text) {\n return {};\n }\n\n return { description: text };\n}\n\n/**\n * Checks if the parent node is a non-object type\n */\nfunction parentIsNonObjectPath(node: ts.Node) {\n return (\n node.parent &&\n (ts.isArrayTypeNode(node.parent) ||\n ts.isTupleTypeNode(node.parent) ||\n ts.isOptionalTypeNode(node.parent) ||\n ts.isRestTypeNode(node.parent) ||\n ts.isUnionTypeNode(node.parent))\n );\n}\n\n/**\n * Traverses up the node tree to build the title path down to the initial node\n */\nfunction recurseTypeChain(\n node: ts.Node,\n child: ts.Node | undefined\n): Array<string> {\n if (!node) {\n return [];\n }\n\n if (\n ts.isArrayTypeNode(node) &&\n node.parent &&\n ts.isRestTypeNode(node.parent)\n ) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isRestTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isOptionalTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isUnionTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isParenthesizedTypeNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isTypeLiteralNode(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n if (ts.isArrayTypeNode(node)) {\n return [\"[]\", ...recurseTypeChain(node.parent, node)];\n }\n\n if (ts.isTupleTypeNode(node)) {\n const pos = node.elements.indexOf(child as any);\n return [\n ...(pos === -1 ? [] : [`${pos}`]),\n ...recurseTypeChain(node.parent, node),\n ];\n }\n\n if (\n ts.isTypeAliasDeclaration(node) ||\n ts.isInterfaceDeclaration(node) ||\n ts.isPropertySignature(node)\n ) {\n return [node.name.getText(), ...recurseTypeChain(node.parent, node)];\n }\n\n if (parentIsNonObjectPath(node)) {\n return recurseTypeChain(node.parent, node);\n }\n\n return [];\n}\n\n/**\n * Builds the `Title` property by traversing up and noting the named types in the tree\n */\nfunction extractTitle(node: ts.Node): Annotations {\n const typeNames = recurseTypeChain(node, undefined).reverse().join(\".\");\n\n if (!typeNames.length) {\n return {};\n }\n\n return { title: typeNames };\n}\n\n/**\n *\n */\nfunction stringifyDoc(\n docString: undefined | string | ts.NodeArray<ts.JSDocComment>\n): string | undefined {\n if (typeof docString === \"undefined\" || typeof docString === \"string\") {\n return docString;\n }\n\n return docString.map(({ text }) => text).join(\" \");\n}\n\n/**\n * Extracts JSDoc tags to strings\n */\nfunction extractTags(tags: ReadonlyArray<ts.JSDocTag>): Annotations {\n const descriptions: Array<string> = [];\n const examples: Array<string> = [];\n const _default: Array<string> = [];\n const see: Array<string> = [];\n const meta: Record<string, string> = {};\n\n /**\n *\n */\n const extractSee = (tag: ts.JSDocSeeTag) => {\n return `${tag.tagName ? `${tag.tagName?.getText()} ` : \"\"}${\n stringifyDoc(tag.comment)?.trim() ?? \"\"\n }`;\n };\n\n tags.forEach((tag) => {\n if (!tag.comment) {\n return;\n }\n\n if (tag.tagName.text === \"example\") {\n examples.push(stringifyDoc(tag.comment)?.trim() ?? \"\");\n } else if (tag.tagName.text === \"default\") {\n _default.push(stringifyDoc(tag.comment)?.trim() ?? \"\");\n } else if (tag.tagName.text === \"see\") {\n see.push(extractSee(tag as ts.JSDocSeeTag));\n } else if (tag.tagName.text === \"meta\") {\n const [key, value] = tag.comment.toString().split(/:(.*)/);\n meta[key] = value?.trim() ?? \"\";\n } else {\n const text = stringifyDoc(tag.comment)?.trim() ?? \"\";\n descriptions.push(`@${tag.tagName.text} ${text}`);\n }\n });\n\n return {\n ...(descriptions.length === 0\n ? {}\n : { description: descriptions.join(\"\\n\") }),\n ...(examples.length === 0 ? {} : { examples }),\n ...(_default.length === 0 ? {} : { default: _default.join(\"\\n\") }),\n ...(see.length === 0 ? {} : { see }),\n ...(meta && Object.keys(meta).length === 0 ? {} : { meta }),\n };\n}\n\n/**\n * Joins Arrays of maybe strings with a given separator\n */\nfunction join(t: Array<string | undefined>, separator = \"\\n\") {\n const unique = new Set(t).values();\n return Array.from(unique)\n .filter((s) => s !== undefined)\n .join(separator)\n .trim();\n}\n\n/**\n * Merges Annotation nodes for various nodes\n */\nfunction mergeAnnotations(nodes: Array<Annotations>): Annotations {\n const name = nodes.find((n) => n.name)?.name;\n const title = join(\n nodes.map((n) => n.title),\n \", \"\n );\n const description = join(nodes.map((n) => n.description));\n const _default = join(nodes.map((n) => n.default));\n const comment = join(nodes.map((n) => n.comment));\n const examples = join(\n nodes.map((n) =>\n Array.isArray(n.examples) ? join(n.examples) : n.examples\n )\n );\n const see = join(\n nodes.map((n) => (Array.isArray(n.see) ? join(n.see) : n.see))\n );\n const meta = nodes.find((n) => n.meta)?.meta;\n return {\n ...(name ? { name } : {}),\n ...(title ? { title } : {}),\n ...(description ? { description } : {}),\n ...(examples ? { examples } : {}),\n ...(_default ? { default: _default } : {}),\n ...(see ? { see } : {}),\n ...(comment ? { comment } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n\n/**\n * Converts JSDoc comments to strings\n */\nexport function decorateNode(node: ts.Node): Annotations {\n const { jsDoc } = node as unknown as JSDocContainer;\n const titleAnnotation = extractTitle(node);\n\n if (jsDoc && jsDoc.length) {\n const first = jsDoc[0];\n return mergeAnnotations([\n extractDescription(stringifyDoc(first.comment)),\n titleAnnotation,\n extractTags(first.tags ?? []),\n ]);\n }\n\n return titleAnnotation;\n}\n","/* eslint-disable no-bitwise */\nimport ts from \"typescript\";\nimport type {\n NamedType,\n NodeType,\n ObjectProperty,\n ObjectType,\n OrType,\n} from \"@player-tools/xlr\";\nimport { computeExtends, resolveConditional } from \"./validation-helpers\";\nimport { isGenericNodeType } from \"./type-checks\";\n\n/**\n * Returns the required type or the optionally required type\n */\nexport function tsStripOptionalType(node: ts.TypeNode): ts.TypeNode {\n return ts.isOptionalTypeNode(node) ? node.type : node;\n}\n\n/**\n * Returns if the top level declaration is exported\n */\nexport function isExportedDeclaration(node: ts.Statement): boolean {\n const modifiers = ts.canHaveModifiers(node)\n ? ts.getModifiers(node)\n : undefined;\n\n if (modifiers) {\n return modifiers.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n }\n return false;\n}\n\n/**\n * Returns if the node is exported from the source file\n */\nexport function isNodeExported(node: ts.Node): boolean {\n return (\n (ts.getCombinedModifierFlags(node as ts.Declaration) &\n ts.ModifierFlags.Export) !==\n 0 ||\n (!!node.parent && node.parent.kind === ts.SyntaxKind.SourceFile)\n );\n}\n\n/**\n * Returns the actual type and will following import chains if needed\n */\nexport function getReferencedType(\n node: ts.TypeReferenceNode,\n typeChecker: ts.TypeChecker\n) {\n let symbol = typeChecker.getSymbolAtLocation(node.typeName);\n\n if (\n symbol &&\n (symbol.flags & ts.SymbolFlags.Alias) === ts.SymbolFlags.Alias\n ) {\n // follow alias if it is a symbol\n symbol = typeChecker.getAliasedSymbol(symbol);\n }\n\n const varDecl = symbol?.declarations?.[0];\n if (\n varDecl &&\n (ts.isInterfaceDeclaration(varDecl) || ts.isTypeAliasDeclaration(varDecl))\n ) {\n return { declaration: varDecl, exported: isNodeExported(varDecl) };\n }\n}\n\n/**\n * Returns list of string literals from potential union of strings\n */\nexport function getStringLiteralsFromUnion(node: ts.Node): Set<string> {\n if (ts.isUnionTypeNode(node)) {\n return new Set(\n node.types.map((type) => {\n if (ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n }\n\n return \"\";\n })\n );\n }\n\n if (ts.isLiteralTypeNode(node) && ts.isStringLiteral(node.literal)) {\n return new Set([node.literal.text]);\n }\n\n return new Set();\n}\n\n/**\n * Converts a format string into a regex that can be used to validate a given string matches the template\n */\nexport function buildTemplateRegex(\n node: ts.TemplateLiteralTypeNode,\n typeChecker: ts.TypeChecker\n): string {\n let regex = node.head.text;\n node.templateSpans.forEach((span) => {\n // process template tag\n let type = span.type.kind;\n if (ts.isTypeReferenceNode(span.type)) {\n let symbol = typeChecker.getSymbolAtLocation(\n span.type.typeName\n ) as ts.Symbol;\n\n if (\n symbol &&\n (symbol.flags & ts.SymbolFlags.Alias) === ts.SymbolFlags.Alias\n ) {\n // follow alias if it is a symbol\n symbol = typeChecker.getAliasedSymbol(symbol);\n }\n\n type = (symbol?.declarations?.[0] as ts.TypeAliasDeclaration).type.kind;\n }\n\n if (type === ts.SyntaxKind.StringKeyword) {\n regex += \".*\";\n } else if (type === ts.SyntaxKind.NumberKeyword) {\n regex += \"[0-9]*\";\n } else if (type === ts.SyntaxKind.BooleanKeyword) {\n regex += \"true|false\";\n }\n\n // add non-tag element\n regex += span.literal.text;\n });\n return regex;\n}\n\n/**\n * Walks generics to fill in values from a combination of the default, constraint, and passed in map values\n * TODO convert this to use simpleTransformGenerator\n */\nexport function fillInGenerics(\n xlrNode: NodeType,\n generics?: Map<string, NodeType>\n): NodeType {\n // Need to make sure not to set generics in passed in map to avoid using generics outside of tree\n let localGenerics: Map<string, NodeType>;\n\n if (generics) {\n localGenerics = new Map(generics);\n } else {\n localGenerics = new Map();\n if (isGenericNodeType(xlrNode)) {\n xlrNode.genericTokens?.forEach((token) => {\n localGenerics.set(\n token.symbol,\n (token.default ?? token.constraints) as NodeType\n );\n });\n }\n }\n\n if (xlrNode.type === \"ref\") {\n if (localGenerics.has(xlrNode.ref)) {\n return {\n ...(localGenerics.get(xlrNode.ref) as NodeType),\n ...(xlrNode.genericArguments\n ? {\n genericArguments: xlrNode.genericArguments.map((ga) =>\n fillInGenerics(ga, localGenerics)\n ),\n }\n : {}),\n ...(xlrNode.title ? { title: xlrNode.title } : {}),\n ...(xlrNode.name ? { name: xlrNode.name } : {}),\n ...(xlrNode.description ? { description: xlrNode.description } : {}),\n ...(xlrNode.comment ? { comment: xlrNode.comment } : {}),\n };\n }\n\n return {\n ...xlrNode,\n ...(xlrNode.genericArguments\n ? {\n genericArguments: xlrNode.genericArguments.map((ga) =>\n fillInGenerics(ga, localGenerics)\n ),\n }\n : {}),\n };\n }\n\n if (xlrNode.type === \"object\") {\n const newProperties: { [name: string]: ObjectProperty } = {};\n Object.getOwnPropertyNames(xlrNode.properties).forEach((propName) => {\n const prop = xlrNode.properties[propName];\n newProperties[propName] = {\n required: prop.required,\n node: fillInGenerics(prop.node, localGenerics),\n };\n });\n\n return {\n ...xlrNode,\n properties: newProperties,\n };\n }\n\n if (xlrNode.type === \"array\") {\n // eslint-disable-next-line no-param-reassign\n xlrNode.elementType = fillInGenerics(xlrNode.elementType, localGenerics);\n } else if (xlrNode.type === \"or\" || xlrNode.type === \"and\") {\n let pointer;\n if (xlrNode.type === \"or\") {\n pointer = xlrNode.or;\n } else {\n pointer = xlrNode.and;\n }\n\n return {\n ...xlrNode,\n [xlrNode.type]: pointer.map((prop) => {\n return fillInGenerics(prop, localGenerics);\n }),\n };\n } else if (xlrNode.type === \"record\") {\n return {\n ...xlrNode,\n keyType: fillInGenerics(xlrNode.keyType, localGenerics),\n valueType: fillInGenerics(xlrNode.valueType, localGenerics),\n };\n } else if (xlrNode.type === \"conditional\") {\n const filledInConditional = {\n ...xlrNode,\n check: {\n left: fillInGenerics(xlrNode.check.left, localGenerics),\n right: fillInGenerics(xlrNode.check.right, localGenerics),\n },\n value: {\n true: fillInGenerics(xlrNode.value.true, localGenerics),\n false: fillInGenerics(xlrNode.value.false, localGenerics),\n },\n };\n\n // Check to see if we have enough information to resolve this conditional\n if (\n filledInConditional.check.left.type !== \"ref\" &&\n filledInConditional.check.right.type !== \"ref\"\n ) {\n return {\n name: xlrNode.name,\n title: xlrNode.title,\n ...resolveConditional(filledInConditional),\n } as NamedType;\n }\n\n return filledInConditional;\n }\n\n return xlrNode;\n}\n\n/** Applies the TS `Pick` or `Omit` type to an interface/union/intersection */\nexport function applyPickOrOmitToNodeType(\n baseObject: NodeType,\n operation: \"Pick\" | \"Omit\",\n properties: Set<string>\n): NodeType | undefined {\n if (baseObject.type === \"object\") {\n const newObject = { ...baseObject };\n Object.keys(baseObject.properties).forEach((key) => {\n if (\n (operation === \"Omit\" && properties.has(key)) ||\n (operation === \"Pick\" && !properties.has(key))\n ) {\n delete newObject.properties[key];\n }\n });\n\n /**\n * Filter out objects in cases:\n * - A Pick operation and there are no properties left\n * - An Omit operation and there are no properties left and no additional properties allowed\n */\n if (\n Object.keys(newObject.properties).length === 0 &&\n (operation !== \"Omit\" || newObject.additionalProperties === false)\n ) {\n return undefined;\n }\n\n return newObject;\n }\n\n let pointer;\n if (baseObject.type === \"and\") {\n pointer = baseObject.and;\n } else if (baseObject.type === \"or\") {\n pointer = baseObject.or;\n } else {\n throw new Error(\n `Error: Can not apply ${operation} to type ${baseObject.type}`\n );\n }\n\n const pickedTypes = pointer\n .map((type) => {\n const node = applyPickOrOmitToNodeType(type, operation, properties);\n if (node === undefined) {\n return undefined;\n }\n\n return { ...node, additionalProperties: false } as ObjectType;\n })\n .filter((type) => type !== undefined) as NodeType[];\n\n if (pickedTypes.length === 0) {\n return undefined;\n }\n\n if (pickedTypes.length === 1) {\n return pickedTypes[0];\n }\n\n if (baseObject.type === \"and\") {\n return { ...baseObject, and: pickedTypes };\n }\n\n return { ...baseObject, or: pickedTypes };\n}\n\n/** Applies the TS `Partial` or `Required` type to an interface/union/intersection */\nexport function applyPartialOrRequiredToNodeType(\n baseObject: NodeType,\n modifier: boolean\n): NodeType {\n if (baseObject.type === \"object\") {\n const newObject = { ...baseObject };\n Object.keys(baseObject.properties).forEach((key) => {\n newObject.properties[key].required = modifier;\n });\n\n return newObject;\n }\n\n if (baseObject.type === \"and\") {\n const pickedTypes = baseObject.and.map((type) =>\n applyPartialOrRequiredToNodeType(type, modifier)\n );\n return { ...baseObject, and: pickedTypes };\n }\n\n if (baseObject.type === \"or\") {\n const pickedTypes = baseObject.or.map((type) =>\n applyPartialOrRequiredToNodeType(type, modifier)\n );\n return { ...baseObject, or: pickedTypes };\n }\n\n throw new Error(\n `Error: Can not apply ${modifier ? \"Required\" : \"Partial\"} to type ${\n baseObject.type\n }`\n );\n}\n\n/** Applies the TS `Exclude` type to a union */\nexport function applyExcludeToNodeType(\n baseObject: OrType,\n filters: NodeType | OrType\n): NodeType {\n const remainingMembers = baseObject.or.filter((type) => {\n if (filters.type === \"or\") {\n return !filters.or.some((filter) => computeExtends(type, filter));\n }\n\n return !computeExtends(type, filters);\n });\n\n if (remainingMembers.length === 1) {\n return remainingMembers[0];\n }\n\n return {\n ...baseObject,\n or: remainingMembers,\n };\n}\n","import ts from \"typescript\";\nimport type {\n NamedType,\n NamedTypeWithGenerics,\n NodeType,\n NodeTypeWithGenerics,\n PrimitiveTypes,\n} from \"@player-tools/xlr\";\n\n/**\n * Returns if the Object Property is optional\n */\nexport function isOptionalProperty(node: ts.PropertySignature): boolean {\n return node.questionToken?.kind === ts.SyntaxKind.QuestionToken;\n}\n\n/**\n * Returns if the node is an Interface or Type with Generics\n */\nexport function isGenericInterfaceDeclaration(\n node: ts.InterfaceDeclaration\n): boolean {\n const length = node.typeParameters?.length;\n return length ? length > 0 : false;\n}\n\n/**\n * Returns if the node is an Type Declaration with Generics\n */\nexport function isGenericTypeDeclaration(\n node: ts.TypeAliasDeclaration\n): boolean {\n const length = node.typeParameters?.length;\n return length ? length > 0 : false;\n}\n\n/**\n * Returns if the referenced type is a generic\n */\nexport function isTypeReferenceGeneric(\n node: ts.TypeReferenceNode,\n typeChecker: ts.TypeChecker\n): boolean {\n const symbol = typeChecker.getSymbolAtLocation(node.typeName);\n if (symbol && symbol.declarations) {\n return symbol.declarations[0].kind === ts.SyntaxKind.TypeParameter;\n }\n\n return false;\n}\n\nexport type TopLevelDeclaration =\n | ts.InterfaceDeclaration\n | ts.TypeAliasDeclaration;\n\n/**\n * Returns if the node is an interface or a type declaration\n */\nexport function isTopLevelDeclaration(\n node: ts.Node\n): node is TopLevelDeclaration {\n return (\n node.kind === ts.SyntaxKind.InterfaceDeclaration ||\n node.kind === ts.SyntaxKind.TypeAliasDeclaration\n );\n}\n\nexport type TopLevelNode = TopLevelDeclaration | ts.VariableStatement;\n\n/**\n * Returns if the node is an interface or a type declaration\n */\nexport function isTopLevelNode(node: ts.Node): node is TopLevelNode {\n return (\n node.kind === ts.SyntaxKind.InterfaceDeclaration ||\n node.kind === ts.SyntaxKind.TypeAliasDeclaration ||\n node.kind === ts.SyntaxKind.VariableStatement\n );\n}\n\n/**\n * Returns if the NodeType has generic tokens\n */\nexport function isGenericNodeType<T extends NodeType = NodeType>(\n nt: NodeType\n): nt is NodeTypeWithGenerics<T> {\n return (nt as NodeTypeWithGenerics).genericTokens?.length > 0;\n}\n\n/**\n * Returns if the named type has generic tokens\n */\nexport function isGenericNamedType<T extends NamedType = NamedType>(\n nt: NodeType\n): nt is NamedTypeWithGenerics<T> {\n return (nt as NamedTypeWithGenerics).genericTokens?.length > 0;\n}\n\n/**\n * Returns if the node is a `PrimitiveTypes`\n */\nexport function isPrimitiveTypeNode(node: NodeType): node is PrimitiveTypes {\n return (\n node.type === \"string\" ||\n node.type === \"number\" ||\n node.type === \"boolean\" ||\n node.type === \"null\" ||\n node.type === \"any\" ||\n node.type === \"never\" ||\n node.type === \"undefined\" ||\n node.type === \"unknown\" ||\n node.type === \"void\"\n );\n}\n\n/**\n * Type Guard for non-null values\n */\nexport function isNonNullable<T>(a: T | null | undefined): a is NonNullable<T> {\n return a !== null || a !== undefined;\n}\n","import type { Node } from \"jsonc-parser\";\nimport type {\n ConditionalType,\n NodeType,\n ObjectType,\n RefNode,\n} from \"@player-tools/xlr\";\nimport { isGenericNodeType, isPrimitiveTypeNode } from \"./type-checks\";\nimport { fillInGenerics } from \"./ts-helpers\";\n\nexport interface PropertyNode {\n /** Equivalent Property Name */\n key: string;\n\n /** Equivalent Property Value */\n value: Node;\n}\n\n/**\n * Takes a property node and returns the underlying Key/Value Pairs\n */\nexport function propertyToTuple(node: Node): PropertyNode {\n let key = node.children?.[0].value as string;\n if (key.includes(\"-\")) {\n key = `\"${key}\"`;\n }\n\n return {\n key,\n value: node.children?.[1] as Node,\n };\n}\n\n/**\n * Turns a node's children into a map for easy access\n */\nexport function makePropertyMap(node: Node): Map<string, Node> {\n const m = new Map();\n node.children?.forEach((child) => {\n const property = propertyToTuple(child);\n m.set(property.key, property.value);\n });\n return m;\n}\n\n/**\n * Checks if property is a leaf node or another node\n */\nexport function isNode(obj: Node | string | number | boolean): obj is Node {\n return (\n typeof obj !== \"string\" ||\n typeof obj !== \"number\" ||\n typeof obj !== \"boolean\"\n );\n}\n\n/**\n * Computes if the first arg extends the second arg\n */\nexport function computeExtends(a: NodeType, b: NodeType): boolean {\n // special case for any/unknown being functionally the same\n if (\n (a.type === \"any\" || a.type === \"unknown\") &&\n (b.type === \"any\" || b.type === \"unknown\")\n ) {\n return true;\n }\n\n // special case for null/undefined being functionally the same\n if (\n (a.type === \"null\" || a.type === \"undefined\") &&\n (b.type === \"null\" || b.type === \"undefined\")\n ) {\n return true;\n }\n\n // check simple case of equal types\n if (a.type === b.type) {\n if (isPrimitiveTypeNode(a) && isPrimitiveTypeNode(b)) {\n if (a.const && b.const) {\n if (a.const === b.const) {\n return true;\n }\n } else {\n return true;\n }\n }\n\n if (a.type === \"ref\" && b.type === \"ref\") {\n return a.ref === b.ref;\n }\n\n if (a.type === \"object\" && b.type === \"object\") {\n for (const property in b.properties) {\n const propertyNode = b.properties[property];\n if (\n !a.properties[property] ||\n !computeExtends(a.properties[property].node, propertyNode.node)\n ) {\n return false;\n }\n }\n\n return true;\n }\n }\n\n if (isPrimitiveTypeNode(a) && b.type === \"or\") {\n return b.or.every((member) => computeExtends(a, member));\n }\n\n if (isPrimitiveTypeNode(b) && a.type === \"or\") {\n return a.or.every((member) => computeExtends(b, member));\n }\n\n if (a.type === \"or\" && b.type === \"or\") {\n return a.or.every((x) => b.or.some((y) => computeExtends(x, y)));\n }\n\n return false;\n}\n\n/**\n * Attempts to resolve a conditional type\n */\nexport function resolveConditional(conditional: ConditionalType): NodeType {\n const { left, right } = conditional.check;\n if (isPrimitiveTypeNode(left) && isPrimitiveTypeNode(right)) {\n const conditionalResult = conditional.value.false;\n\n // Compose first level generics here since `conditionalResult` won't have them\n if (isGenericNodeType(conditional)) {\n const genericMap: Map<string, NodeType> = new Map();\n conditional.genericTokens.forEach((token) => {\n genericMap.set(\n token.symbol,\n token.default ?? token.constraints ?? { type: \"any\" }\n );\n });\n\n return fillInGenerics(conditionalResult, genericMap);\n }\n\n return conditionalResult;\n }\n\n // unable to process return original\n return conditional;\n}\n\n/**\n *\n */\nexport function resolveReferenceNode(\n genericReference: RefNode,\n typeToFill: NodeType\n): NodeType {\n const genericArgs = genericReference.genericArguments;\n const genericMap: Map<string, NodeType> = new Map();\n\n // Compose first level generics here from `genericReference`\n if (genericArgs && isGenericNodeType(typeToFill)) {\n typeToFill.genericTokens.forEach((token, index) => {\n genericMap.set(\n token.symbol,\n genericArgs[index] ?? token.default ?? token.constraints\n );\n });\n }\n\n // Fill in generics\n const filledInNode = fillInGenerics(typeToFill, genericMap);\n\n // Remove generic tokens that were resolve\n if (isGenericNodeType(filledInNode) && genericArgs?.length) {\n if (genericArgs.length < filledInNode.genericTokens.length) {\n filledInNode.genericTokens = filledInNode.genericTokens.slice(\n genericArgs?.length\n );\n } else if (genericArgs.length === filledInNode.genericTokens.length) {\n filledInNode.genericTokens = [];\n }\n }\n\n // Resolve index access\n if (genericReference.property && filledInNode.type === \"object\") {\n return (\n filledInNode.properties[genericReference.property]?.node ??\n filledInNode.additionalProperties ?? { type: \"undefined\" }\n );\n }\n\n return filledInNode;\n}\n\n/**\n * Combines two ObjectType objects to get a representation of the effective TypeScript interface of `base` extending `operand`\n - * @param base The base interface\n - * @param operand The interface that is extended\n - * @param errorOnOverlap whether or not conflicting properties should throw an error or use the property from operand\n - * @returns `ObjectType`\n */\nexport function computeEffectiveObject(\n base: ObjectType,\n operand: ObjectType,\n errorOnOverlap = true\n): ObjectType {\n const baseObjectName = base.name ?? base.title ?? \"object literal\";\n const operandObjectName = operand.name ?? operand.title ?? \"object literal\";\n const newObject = {\n ...JSON.parse(JSON.stringify(base)),\n name: `${baseObjectName} & ${operandObjectName}`,\n description: `Effective type combining ${baseObjectName} and ${operandObjectName}`,\n genericTokens: [\n ...(isGenericNodeType(base) ? base.genericTokens : []),\n ...(isGenericNodeType(operand) ? operand.genericTokens : []),\n ],\n };\n // TODO this check needs to account for primitive -> primitive generic overlap\n\n for (const property in operand.properties) {\n if (newObject.properties[property] !== undefined && errorOnOverlap) {\n if (\n !computeExtends(\n newObject.properties[property].node,\n operand.properties[property].node\n )\n ) {\n throw new Error(\n `Can't compute effective type for ${baseObjectName} and ${operandObjectName} because of conflicting properties ${property}`\n );\n }\n }\n\n newObject.properties[property] = operand.properties[property];\n }\n\n if (newObject.additionalProperties && operand.additionalProperties) {\n if (\n !isPrimitiveTypeNode(newObject.additionalProperties) ||\n !isPrimitiveTypeNode(operand.additionalProperties) ||\n newObject.additionalProperties.type !== operand.additionalProperties.type\n ) {\n newObject.additionalProperties = {\n type: \"and\",\n and: [newObject.additionalProperties, operand.additionalProperties],\n };\n }\n } else if (operand.additionalProperties) {\n newObject.additionalProperties = operand.additionalProperties;\n }\n\n return newObject;\n}\n","import ts from \"typescript\";\nimport * as tsvfs from \"@typescript/vfs\";\n\nexport interface SetupReturnType {\n /**\n * Virtual source file containing the passed in text\n */\n sf: ts.SourceFile;\n /**\n * Type checker for the virtual program\n */\n tc: ts.TypeChecker;\n}\n\n/**\n * Setups a virtual TS environment for tests\n */\nexport function setupTestEnv(sourceCode: string, mockFileName = \"filename.ts\") {\n const fsMap = tsvfs.createDefaultMapFromNodeModules({}, ts);\n fsMap.set(mockFileName, sourceCode);\n\n const system = tsvfs.createSystem(fsMap);\n const host = tsvfs.createVirtualCompilerHost(system, {}, ts);\n\n const program = ts.createProgram({\n rootNames: [...fsMap.keys()],\n options: {},\n host: host.compilerHost,\n });\n\n return {\n sf: host.compilerHost.getSourceFile(\n mockFileName,\n ts.ScriptTarget.ES5\n ) as ts.SourceFile,\n tc: program.getTypeChecker(),\n };\n}\n","import ts from \"typescript\";\nimport type { SymbolDisplayPart } from \"typescript\";\nimport type { NodeType } from \"@player-tools/xlr\";\nimport { isPrimitiveTypeNode } from \"./type-checks\";\n\nconst { SymbolDisplayPartKind, displayPartsToString } = ts;\n\n/** Like `.join()` but for arrays */\nfunction insertBetweenElements<T>(array: Array<T>, separator: T): T[] {\n return array.reduce((acc, item, index) => {\n if (index === 0) {\n return [item];\n }\n\n return [...acc, separator, item];\n }, [] as T[]);\n}\n\n/**\n * Generate a documentation string for a given node\n *\n * @param node - The source node to author the docs string for\n * @returns - documentation string\n */\nexport function createTSDocString(node: NodeType): Array<SymbolDisplayPart> {\n if (node.type === \"ref\") {\n return [\n {\n text: node.ref,\n kind: SymbolDisplayPartKind.keyword as any,\n },\n ];\n }\n\n if (node.type === \"or\" || node.type === \"and\") {\n const items = node.type === \"and\" ? node.and : node.or;\n\n return insertBetweenElements(\n items.map((subnode) => createTSDocString(subnode)),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: node.type === \"and\" ? \" & \" : \" | \",\n },\n ]\n ).flat();\n }\n\n if (node.type === \"function\") {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text: \"function\",\n },\n {\n kind: SymbolDisplayPartKind.space as any,\n text: \" \",\n },\n ...(node.name\n ? [{ text: node.name, kind: SymbolDisplayPartKind.methodName }]\n : []),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"(\",\n },\n ...insertBetweenElements(\n node.parameters.map((p) => {\n if (p.name) {\n return [\n {\n kind: SymbolDisplayPartKind.parameterName as any,\n text: p.name,\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: p.optional ? \"?\" : \"\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(p.type),\n ];\n }\n\n return createTSDocString(p.type);\n }),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ]\n ).flat(),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \")\",\n },\n ...(node.returnType\n ? [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(node.returnType),\n ]\n : []),\n ];\n }\n\n if (node.type === \"tuple\") {\n return [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"[\",\n },\n ...insertBetweenElements(\n node.elementTypes.map((t) => {\n if (t.name) {\n return [\n {\n kind: SymbolDisplayPartKind.propertyName as any,\n text: t.name,\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \": \",\n },\n ...createTSDocString(t.type),\n ];\n }\n\n return createTSDocString(t.type);\n }),\n [\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ]\n ).flat(),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"]\",\n },\n ];\n }\n\n if (node.type === \"array\") {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: \"Array\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"<\",\n },\n ...createTSDocString(node.elementType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \">\",\n },\n ];\n }\n\n if (node.type === \"record\") {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: \"Record\",\n },\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \"<\",\n },\n ...createTSDocString(node.keyType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \", \",\n },\n ...createTSDocString(node.valueType),\n {\n kind: SymbolDisplayPartKind.punctuation as any,\n text: \">\",\n },\n ];\n }\n\n if (\n (node.type === \"string\" ||\n node.type === \"boolean\" ||\n node.type === \"number\") &&\n node.const !== undefined\n ) {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text:\n typeof node.const === \"string\"\n ? `\"${node.const}\"`\n : String(node.const),\n },\n ];\n }\n\n if (isPrimitiveTypeNode(node) && node.type !== \"null\") {\n return [\n {\n kind: SymbolDisplayPartKind.keyword as any,\n text: node.type,\n },\n ];\n }\n\n if (node.type === \"object\" && node.name) {\n return [\n {\n kind: SymbolDisplayPartKind.interfaceName as any,\n text: node.name,\n },\n ];\n }\n\n return [\n {\n kind: SymbolDisplayPartKind.localName as any,\n text: node.type,\n },\n ];\n}\n\n/** Convert the TS SymbolDisplayParts into a single string */\nexport function symbolDisplayToString(\n displayParts: Array<SymbolDisplayPart>\n): string {\n return displayPartsToString(displayParts);\n}\n\n/** Create a documentation string from node */\nexport function createDocString(node: NodeType): string {\n return symbolDisplayToString(createTSDocString(node));\n}\n"],"mappings":"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","names":["ts","ts","ts","ts","ts","ts"]}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@player-tools/xlr-utils",
3
- "version": "0.5.2-next.1",
3
+ "version": "0.5.2",
4
4
  "main": "dist/cjs/index.cjs",
5
5
  "dependencies": {
6
- "@player-tools/xlr": "0.5.2-next.1",
6
+ "@player-tools/xlr": "0.5.2",
7
7
  "@typescript/vfs": "^1.4.0",
8
8
  "tslib": "^2.6.2"
9
9
  },
@@ -12,6 +12,7 @@
12
12
  "sideEffects": false,
13
13
  "exports": {
14
14
  "./package.json": "./package.json",
15
+ "./dist/index.css": "./dist/index.css",
15
16
  ".": {
16
17
  "types": "./types/index.d.ts",
17
18
  "import": "./dist/index.mjs",
@@ -24,7 +25,7 @@
24
25
  "types"
25
26
  ],
26
27
  "peerDependencies": {
27
- "typescript": "4.8.4",
28
+ "typescript": "^5.4.4",
28
29
  "jsonc-parser": "^2.3.1"
29
30
  }
30
31
  }
@@ -0,0 +1,180 @@
1
+ import { test, expect, describe } from "vitest";
2
+ import * as ts from "typescript";
3
+ import { NodeType } from "@player-tools/xlr";
4
+
5
+ import {
6
+ tsStripOptionalType,
7
+ isExportedDeclaration,
8
+ applyPickOrOmitToNodeType,
9
+ getStringLiteralsFromUnion,
10
+ applyPartialOrRequiredToNodeType,
11
+ } from "../ts-helpers";
12
+
13
+ test("tsStripOptionalType", () => {
14
+ const input: ts.TypeNode = ts.factory.createKeywordTypeNode(
15
+ ts.SyntaxKind.StringKeyword
16
+ );
17
+ const expected: ts.TypeNode = ts.factory.createKeywordTypeNode(
18
+ ts.SyntaxKind.StringKeyword
19
+ );
20
+ const actual = tsStripOptionalType(input);
21
+ expect(actual).toEqual(expected);
22
+ });
23
+
24
+ describe("isExportedDeclaration", () => {
25
+ test("should return false for a non exported Statement", () => {
26
+ const source = ts.createSourceFile(
27
+ "test.ts",
28
+ `
29
+ interface Test {
30
+ prop?: string;
31
+ }
32
+ `,
33
+ ts.ScriptTarget.Latest,
34
+ true
35
+ );
36
+ const node = source.statements[0] as ts.Statement;
37
+
38
+ const result = isExportedDeclaration(node);
39
+ expect(result).toBe(false);
40
+ });
41
+
42
+ test("should return true for an exported Statement", () => {
43
+ const source = ts.createSourceFile(
44
+ "test.ts",
45
+ `
46
+ export interface Test {
47
+ prop?: string;
48
+ }
49
+ `,
50
+ ts.ScriptTarget.Latest,
51
+ true
52
+ );
53
+ const node = source.statements[0] as ts.Statement;
54
+
55
+ const result = isExportedDeclaration(node);
56
+ expect(result).toBe(true);
57
+ });
58
+ });
59
+
60
+ test("getStringLiteralsFromUnion", () => {
61
+ const input: ts.Node = ts.factory.createUnionTypeNode([
62
+ ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral("foo")),
63
+ ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral("bar")),
64
+ ]);
65
+ const expected: Set<string> = new Set(["foo", "bar"]);
66
+ const actual = getStringLiteralsFromUnion(input);
67
+ expect(actual).toEqual(expected);
68
+ });
69
+
70
+ describe("applyPickOrOmitToNodeType", () => {
71
+ test("Omit - Doesn't filter property that doesn't exist", () => {
72
+ const baseObject: NodeType = {
73
+ type: "object",
74
+ properties: { foo: { node: { type: "string" }, required: false } },
75
+ additionalProperties: false,
76
+ };
77
+ const operation = "Omit";
78
+ const properties = new Set(["bar"]);
79
+
80
+ const result = applyPickOrOmitToNodeType(baseObject, operation, properties);
81
+
82
+ expect(result).toStrictEqual(baseObject);
83
+ });
84
+
85
+ test("Omit - Filters property that do exist", () => {
86
+ const baseObject: NodeType = {
87
+ type: "object",
88
+ properties: {
89
+ foo: { node: { type: "string" }, required: false },
90
+ bar: { node: { type: "string" }, required: false },
91
+ },
92
+ additionalProperties: false,
93
+ };
94
+
95
+ const filteredObject: NodeType = {
96
+ type: "object",
97
+ properties: { foo: { node: { type: "string" }, required: false } },
98
+ additionalProperties: false,
99
+ };
100
+ const operation = "Omit";
101
+ const properties = new Set(["bar"]);
102
+
103
+ const result = applyPickOrOmitToNodeType(baseObject, operation, properties);
104
+
105
+ expect(result).toStrictEqual(filteredObject);
106
+ });
107
+
108
+ test("Pick - Selects property that do exist", () => {
109
+ const baseObject: NodeType = {
110
+ type: "object",
111
+ properties: {
112
+ foo: { node: { type: "string" }, required: false },
113
+ bar: { node: { type: "string" }, required: false },
114
+ },
115
+ additionalProperties: false,
116
+ };
117
+
118
+ const filteredObject: NodeType = {
119
+ type: "object",
120
+ properties: { bar: { node: { type: "string" }, required: false } },
121
+ additionalProperties: false,
122
+ };
123
+ const operation = "Pick";
124
+ const properties = new Set(["bar"]);
125
+
126
+ const result = applyPickOrOmitToNodeType(baseObject, operation, properties);
127
+
128
+ expect(result).toStrictEqual(filteredObject);
129
+ });
130
+ });
131
+
132
+ describe("applyPartialOrRequiredToNodeType", () => {
133
+ test("Partial - Makes required properties optional", () => {
134
+ const baseObject: NodeType = {
135
+ type: "object",
136
+ properties: {
137
+ foo: { node: { type: "string" }, required: false },
138
+ bar: { node: { type: "string" }, required: true },
139
+ },
140
+ additionalProperties: false,
141
+ };
142
+
143
+ const modifiedObject: NodeType = {
144
+ type: "object",
145
+ properties: {
146
+ foo: { node: { type: "string" }, required: false },
147
+ bar: { node: { type: "string" }, required: false },
148
+ },
149
+ additionalProperties: false,
150
+ };
151
+
152
+ const result = applyPartialOrRequiredToNodeType(baseObject, false);
153
+
154
+ expect(result).toStrictEqual(modifiedObject);
155
+ });
156
+
157
+ test("Required - Makes optional properties required", () => {
158
+ const baseObject: NodeType = {
159
+ type: "object",
160
+ properties: {
161
+ foo: { node: { type: "string" }, required: false },
162
+ bar: { node: { type: "string" }, required: true },
163
+ },
164
+ additionalProperties: false,
165
+ };
166
+
167
+ const modifiedObject: NodeType = {
168
+ type: "object",
169
+ properties: {
170
+ foo: { node: { type: "string" }, required: true },
171
+ bar: { node: { type: "string" }, required: true },
172
+ },
173
+ additionalProperties: false,
174
+ };
175
+
176
+ const result = applyPartialOrRequiredToNodeType(baseObject, true);
177
+
178
+ expect(result).toStrictEqual(modifiedObject);
179
+ });
180
+ });
@@ -0,0 +1,39 @@
1
+ import * as ts from "typescript";
2
+ import { isOptionalProperty } from "../type-checks";
3
+ import { describe, test, expect } from "vitest";
4
+
5
+ describe("isOptionalProperty", () => {
6
+ test("should return true for an optional property", () => {
7
+ const source = ts.createSourceFile(
8
+ "test.ts",
9
+ `
10
+ interface Test {
11
+ prop?: string;
12
+ }
13
+ `,
14
+ ts.ScriptTarget.Latest,
15
+ true
16
+ );
17
+ const node = source.statements[0] as ts.InterfaceDeclaration;
18
+ const prop = node.members[0] as ts.PropertySignature;
19
+
20
+ expect(isOptionalProperty(prop)).toBe(true);
21
+ });
22
+
23
+ test("should return false for a non-optional property", () => {
24
+ const source = ts.createSourceFile(
25
+ "test.ts",
26
+ `
27
+ interface Test {
28
+ prop: string;
29
+ }
30
+ `,
31
+ ts.ScriptTarget.Latest,
32
+ true
33
+ );
34
+ const node = source.statements[0] as ts.InterfaceDeclaration;
35
+ const prop = node.members[0] as ts.PropertySignature;
36
+
37
+ expect(isOptionalProperty(prop)).toBe(false);
38
+ });
39
+ });
package/src/ts-helpers.ts CHANGED
@@ -20,14 +20,15 @@ export function tsStripOptionalType(node: ts.TypeNode): ts.TypeNode {
20
20
  /**
21
21
  * Returns if the top level declaration is exported
22
22
  */
23
- export function isExportedDeclaration(node: ts.Statement) {
23
+ export function isExportedDeclaration(node: ts.Statement): boolean {
24
24
  const modifiers = ts.canHaveModifiers(node)
25
25
  ? ts.getModifiers(node)
26
26
  : undefined;
27
- return (
28
- modifiers &&
29
- modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)
30
- );
27
+
28
+ if (modifiers) {
29
+ return modifiers.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
30
+ }
31
+ return false;
31
32
  }
32
33
 
33
34
  /**
@@ -257,7 +258,7 @@ export function fillInGenerics(
257
258
  return xlrNode;
258
259
  }
259
260
 
260
- /** Applies the TS `Pick` type to an interface/union/intersection */
261
+ /** Applies the TS `Pick` or `Omit` type to an interface/union/intersection */
261
262
  export function applyPickOrOmitToNodeType(
262
263
  baseObject: NodeType,
263
264
  operation: "Pick" | "Omit",
@@ -326,7 +327,7 @@ export function applyPickOrOmitToNodeType(
326
327
  return { ...baseObject, or: pickedTypes };
327
328
  }
328
329
 
329
- /** Applies the TS `Omit` type to an interface/union/intersection */
330
+ /** Applies the TS `Partial` or `Required` type to an interface/union/intersection */
330
331
  export function applyPartialOrRequiredToNodeType(
331
332
  baseObject: NodeType,
332
333
  modifier: boolean
@@ -7,7 +7,7 @@ export declare function tsStripOptionalType(node: ts.TypeNode): ts.TypeNode;
7
7
  /**
8
8
  * Returns if the top level declaration is exported
9
9
  */
10
- export declare function isExportedDeclaration(node: ts.Statement): boolean | undefined;
10
+ export declare function isExportedDeclaration(node: ts.Statement): boolean;
11
11
  /**
12
12
  * Returns if the node is exported from the source file
13
13
  */
@@ -32,9 +32,9 @@ export declare function buildTemplateRegex(node: ts.TemplateLiteralTypeNode, typ
32
32
  * TODO convert this to use simpleTransformGenerator
33
33
  */
34
34
  export declare function fillInGenerics(xlrNode: NodeType, generics?: Map<string, NodeType>): NodeType;
35
- /** Applies the TS `Pick` type to an interface/union/intersection */
35
+ /** Applies the TS `Pick` or `Omit` type to an interface/union/intersection */
36
36
  export declare function applyPickOrOmitToNodeType(baseObject: NodeType, operation: "Pick" | "Omit", properties: Set<string>): NodeType | undefined;
37
- /** Applies the TS `Omit` type to an interface/union/intersection */
37
+ /** Applies the TS `Partial` or `Required` type to an interface/union/intersection */
38
38
  export declare function applyPartialOrRequiredToNodeType(baseObject: NodeType, modifier: boolean): NodeType;
39
39
  /** Applies the TS `Exclude` type to a union */
40
40
  export declare function applyExcludeToNodeType(baseObject: OrType, filters: NodeType | OrType): NodeType;