@player-tools/xlr-utils 0.10.0-next.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +2 -26
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/index.legacy-esm.js +2 -25
- package/dist/index.mjs +2 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/annotations.test.ts +1 -1
- package/src/__tests__/documentation.test.ts +4 -4
- package/src/__tests__/ts-helpers.test.ts +4 -4
- package/src/__tests__/type-check.test.ts +2 -2
- package/src/__tests__/validation-helpers.test.ts +2 -2
- package/src/annotations.ts +6 -6
- package/src/documentation.ts +4 -4
- package/src/index.ts +0 -1
- package/src/ts-helpers.ts +15 -16
- package/src/type-checks.ts +6 -6
- package/src/validation-helpers.ts +7 -7
- package/types/index.d.ts +0 -1
- package/src/test-helpers.ts +0 -38
- package/types/test-helpers.d.ts +0 -19
package/dist/cjs/index.cjs
CHANGED
|
@@ -59,7 +59,6 @@ __export(src_exports, {
|
|
|
59
59
|
propertyToTuple: () => propertyToTuple,
|
|
60
60
|
resolveConditional: () => resolveConditional,
|
|
61
61
|
resolveReferenceNode: () => resolveReferenceNode,
|
|
62
|
-
setupTestEnv: () => setupTestEnv,
|
|
63
62
|
symbolDisplayToString: () => symbolDisplayToString,
|
|
64
63
|
tsStripOptionalType: () => tsStripOptionalType
|
|
65
64
|
});
|
|
@@ -652,31 +651,9 @@ function applyExcludeToNodeType(baseObject, filters) {
|
|
|
652
651
|
};
|
|
653
652
|
}
|
|
654
653
|
|
|
655
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/test-helpers.ts
|
|
656
|
-
var import_typescript4 = __toESM(require("typescript"));
|
|
657
|
-
var tsvfs = __toESM(require("@typescript/vfs"));
|
|
658
|
-
function setupTestEnv(sourceCode, mockFileName = "filename.ts") {
|
|
659
|
-
const fsMap = tsvfs.createDefaultMapFromNodeModules({}, import_typescript4.default);
|
|
660
|
-
fsMap.set(mockFileName, sourceCode);
|
|
661
|
-
const system = tsvfs.createSystem(fsMap);
|
|
662
|
-
const host = tsvfs.createVirtualCompilerHost(system, {}, import_typescript4.default);
|
|
663
|
-
const program = import_typescript4.default.createProgram({
|
|
664
|
-
rootNames: [...fsMap.keys()],
|
|
665
|
-
options: {},
|
|
666
|
-
host: host.compilerHost
|
|
667
|
-
});
|
|
668
|
-
return {
|
|
669
|
-
sf: host.compilerHost.getSourceFile(
|
|
670
|
-
mockFileName,
|
|
671
|
-
import_typescript4.default.ScriptTarget.ES5
|
|
672
|
-
),
|
|
673
|
-
tc: program.getTypeChecker()
|
|
674
|
-
};
|
|
675
|
-
}
|
|
676
|
-
|
|
677
654
|
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/documentation.ts
|
|
678
|
-
var
|
|
679
|
-
var { SymbolDisplayPartKind, displayPartsToString } =
|
|
655
|
+
var import_typescript4 = __toESM(require("typescript"));
|
|
656
|
+
var { SymbolDisplayPartKind, displayPartsToString } = import_typescript4.default;
|
|
680
657
|
function insertBetweenElements(array, separator) {
|
|
681
658
|
return array.reduce((acc, item, index) => {
|
|
682
659
|
if (index === 0) {
|
|
@@ -905,7 +882,6 @@ function createDocString(node) {
|
|
|
905
882
|
propertyToTuple,
|
|
906
883
|
resolveConditional,
|
|
907
884
|
resolveReferenceNode,
|
|
908
|
-
setupTestEnv,
|
|
909
885
|
symbolDisplayToString,
|
|
910
886
|
tsStripOptionalType
|
|
911
887
|
});
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -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 RefNode,\n} from \"@player-tools/xlr\";\nimport { computeExtends, resolveConditional } from \"./validation-helpers\";\nimport { isGenericNamedType, 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 const genericValue = (token.default ?? token.constraints) as NodeType;\n localGenerics.set(\n token.symbol,\n fillInGenerics(genericValue, localGenerics)\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 ...(isGenericNamedType(xlrNode)\n ? {\n genericTokens: xlrNode.genericTokens.map((token) => {\n return {\n ...token,\n constraints: token.constraints\n ? fillInGenerics(token.constraints, localGenerics)\n : undefined,\n default: token.default\n ? fillInGenerics(token.default, localGenerics)\n : undefined,\n };\n }),\n }\n : {}),\n extends: xlrNode.extends\n ? (fillInGenerics(xlrNode.extends, localGenerics) as RefNode)\n : undefined,\n additionalProperties: xlrNode.additionalProperties\n ? fillInGenerics(xlrNode.additionalProperties, localGenerics)\n : false,\n };\n }\n\n if (xlrNode.type === \"array\") {\n return {\n ...xlrNode,\n elementType: fillInGenerics(xlrNode.elementType, localGenerics),\n };\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 // XLR outputs all escaped properties with single quotes\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 const conditionalResult = computeExtends(left, right)\n ? conditional.value.true\n : 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/**\n * Resolve referenced node with potential generic arguments\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/documentation.ts"],"sourcesContent":["export * from \"./annotations\";\nexport * from \"./ts-helpers\";\nexport * from \"./type-checks\";\nexport * from \"./validation-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","import ts from \"typescript\";\nimport type {\n NamedType,\n NodeType,\n ObjectProperty,\n ObjectType,\n OrType,\n RefNode,\n} from \"@player-tools/xlr\";\nimport { computeExtends, resolveConditional } from \"./validation-helpers\";\nimport { isGenericNamedType, 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 const genericValue = (token.default ?? token.constraints) as NodeType;\n localGenerics.set(\n token.symbol,\n fillInGenerics(genericValue, localGenerics),\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 ...(isGenericNamedType(xlrNode)\n ? {\n genericTokens: xlrNode.genericTokens.map((token) => {\n return {\n ...token,\n constraints: token.constraints\n ? fillInGenerics(token.constraints, localGenerics)\n : undefined,\n default: token.default\n ? fillInGenerics(token.default, localGenerics)\n : undefined,\n };\n }),\n }\n : {}),\n extends: xlrNode.extends\n ? (fillInGenerics(xlrNode.extends, localGenerics) as RefNode)\n : undefined,\n additionalProperties: xlrNode.additionalProperties\n ? fillInGenerics(xlrNode.additionalProperties, localGenerics)\n : false,\n };\n }\n\n if (xlrNode.type === \"array\") {\n return {\n ...xlrNode,\n elementType: fillInGenerics(xlrNode.elementType, localGenerics),\n };\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 // XLR outputs all escaped properties with single quotes\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 const conditionalResult = computeExtends(left, right)\n ? conditional.value.true\n : 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/**\n * Resolve referenced node with potential generic arguments\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 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"]}
|
package/dist/index.legacy-esm.js
CHANGED
|
@@ -585,31 +585,9 @@ function applyExcludeToNodeType(baseObject, filters) {
|
|
|
585
585
|
};
|
|
586
586
|
}
|
|
587
587
|
|
|
588
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/test-helpers.ts
|
|
589
|
-
import ts4 from "typescript";
|
|
590
|
-
import * as tsvfs from "@typescript/vfs";
|
|
591
|
-
function setupTestEnv(sourceCode, mockFileName = "filename.ts") {
|
|
592
|
-
const fsMap = tsvfs.createDefaultMapFromNodeModules({}, ts4);
|
|
593
|
-
fsMap.set(mockFileName, sourceCode);
|
|
594
|
-
const system = tsvfs.createSystem(fsMap);
|
|
595
|
-
const host = tsvfs.createVirtualCompilerHost(system, {}, ts4);
|
|
596
|
-
const program = ts4.createProgram({
|
|
597
|
-
rootNames: [...fsMap.keys()],
|
|
598
|
-
options: {},
|
|
599
|
-
host: host.compilerHost
|
|
600
|
-
});
|
|
601
|
-
return {
|
|
602
|
-
sf: host.compilerHost.getSourceFile(
|
|
603
|
-
mockFileName,
|
|
604
|
-
ts4.ScriptTarget.ES5
|
|
605
|
-
),
|
|
606
|
-
tc: program.getTypeChecker()
|
|
607
|
-
};
|
|
608
|
-
}
|
|
609
|
-
|
|
610
588
|
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/documentation.ts
|
|
611
|
-
import
|
|
612
|
-
var { SymbolDisplayPartKind, displayPartsToString } =
|
|
589
|
+
import ts4 from "typescript";
|
|
590
|
+
var { SymbolDisplayPartKind, displayPartsToString } = ts4;
|
|
613
591
|
function insertBetweenElements(array, separator) {
|
|
614
592
|
return array.reduce((acc, item, index) => {
|
|
615
593
|
if (index === 0) {
|
|
@@ -837,7 +815,6 @@ export {
|
|
|
837
815
|
propertyToTuple,
|
|
838
816
|
resolveConditional,
|
|
839
817
|
resolveReferenceNode,
|
|
840
|
-
setupTestEnv,
|
|
841
818
|
symbolDisplayToString,
|
|
842
819
|
tsStripOptionalType
|
|
843
820
|
};
|
package/dist/index.mjs
CHANGED
|
@@ -585,31 +585,9 @@ function applyExcludeToNodeType(baseObject, filters) {
|
|
|
585
585
|
};
|
|
586
586
|
}
|
|
587
587
|
|
|
588
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/test-helpers.ts
|
|
589
|
-
import ts4 from "typescript";
|
|
590
|
-
import * as tsvfs from "@typescript/vfs";
|
|
591
|
-
function setupTestEnv(sourceCode, mockFileName = "filename.ts") {
|
|
592
|
-
const fsMap = tsvfs.createDefaultMapFromNodeModules({}, ts4);
|
|
593
|
-
fsMap.set(mockFileName, sourceCode);
|
|
594
|
-
const system = tsvfs.createSystem(fsMap);
|
|
595
|
-
const host = tsvfs.createVirtualCompilerHost(system, {}, ts4);
|
|
596
|
-
const program = ts4.createProgram({
|
|
597
|
-
rootNames: [...fsMap.keys()],
|
|
598
|
-
options: {},
|
|
599
|
-
host: host.compilerHost
|
|
600
|
-
});
|
|
601
|
-
return {
|
|
602
|
-
sf: host.compilerHost.getSourceFile(
|
|
603
|
-
mockFileName,
|
|
604
|
-
ts4.ScriptTarget.ES5
|
|
605
|
-
),
|
|
606
|
-
tc: program.getTypeChecker()
|
|
607
|
-
};
|
|
608
|
-
}
|
|
609
|
-
|
|
610
588
|
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/xlr/utils/src/documentation.ts
|
|
611
|
-
import
|
|
612
|
-
var { SymbolDisplayPartKind, displayPartsToString } =
|
|
589
|
+
import ts4 from "typescript";
|
|
590
|
+
var { SymbolDisplayPartKind, displayPartsToString } = ts4;
|
|
613
591
|
function insertBetweenElements(array, separator) {
|
|
614
592
|
return array.reduce((acc, item, index) => {
|
|
615
593
|
if (index === 0) {
|
|
@@ -837,7 +815,6 @@ export {
|
|
|
837
815
|
propertyToTuple,
|
|
838
816
|
resolveConditional,
|
|
839
817
|
resolveReferenceNode,
|
|
840
|
-
setupTestEnv,
|
|
841
818
|
symbolDisplayToString,
|
|
842
819
|
tsStripOptionalType
|
|
843
820
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -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 RefNode,\n} from \"@player-tools/xlr\";\nimport { computeExtends, resolveConditional } from \"./validation-helpers\";\nimport { isGenericNamedType, 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 const genericValue = (token.default ?? token.constraints) as NodeType;\n localGenerics.set(\n token.symbol,\n fillInGenerics(genericValue, localGenerics)\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 ...(isGenericNamedType(xlrNode)\n ? {\n genericTokens: xlrNode.genericTokens.map((token) => {\n return {\n ...token,\n constraints: token.constraints\n ? fillInGenerics(token.constraints, localGenerics)\n : undefined,\n default: token.default\n ? fillInGenerics(token.default, localGenerics)\n : undefined,\n };\n }),\n }\n : {}),\n extends: xlrNode.extends\n ? (fillInGenerics(xlrNode.extends, localGenerics) as RefNode)\n : undefined,\n additionalProperties: xlrNode.additionalProperties\n ? fillInGenerics(xlrNode.additionalProperties, localGenerics)\n : false,\n };\n }\n\n if (xlrNode.type === \"array\") {\n return {\n ...xlrNode,\n elementType: fillInGenerics(xlrNode.elementType, localGenerics),\n };\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 // XLR outputs all escaped properties with single quotes\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 const conditionalResult = computeExtends(left, right)\n ? conditional.value.true\n : 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/**\n * Resolve referenced node with potential generic arguments\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/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","import ts from \"typescript\";\nimport type {\n NamedType,\n NodeType,\n ObjectProperty,\n ObjectType,\n OrType,\n RefNode,\n} from \"@player-tools/xlr\";\nimport { computeExtends, resolveConditional } from \"./validation-helpers\";\nimport { isGenericNamedType, 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 const genericValue = (token.default ?? token.constraints) as NodeType;\n localGenerics.set(\n token.symbol,\n fillInGenerics(genericValue, localGenerics),\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 ...(isGenericNamedType(xlrNode)\n ? {\n genericTokens: xlrNode.genericTokens.map((token) => {\n return {\n ...token,\n constraints: token.constraints\n ? fillInGenerics(token.constraints, localGenerics)\n : undefined,\n default: token.default\n ? fillInGenerics(token.default, localGenerics)\n : undefined,\n };\n }),\n }\n : {}),\n extends: xlrNode.extends\n ? (fillInGenerics(xlrNode.extends, localGenerics) as RefNode)\n : undefined,\n additionalProperties: xlrNode.additionalProperties\n ? fillInGenerics(xlrNode.additionalProperties, localGenerics)\n : false,\n };\n }\n\n if (xlrNode.type === \"array\") {\n return {\n ...xlrNode,\n elementType: fillInGenerics(xlrNode.elementType, localGenerics),\n };\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 // XLR outputs all escaped properties with single quotes\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 const conditionalResult = computeExtends(left, right)\n ? conditional.value.true\n : 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/**\n * Resolve referenced node with potential generic arguments\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 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"]}
|
package/package.json
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
"types"
|
|
7
7
|
],
|
|
8
8
|
"name": "@player-tools/xlr-utils",
|
|
9
|
-
"version": "0.10.0
|
|
9
|
+
"version": "0.10.0",
|
|
10
10
|
"main": "dist/cjs/index.cjs",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@player-tools/xlr": "0.10.0
|
|
13
|
-
"@
|
|
12
|
+
"@player-tools/xlr": "0.10.0",
|
|
13
|
+
"@player-tools/test-utils": "0.10.0",
|
|
14
14
|
"tslib": "^2.6.2"
|
|
15
15
|
},
|
|
16
16
|
"module": "dist/index.legacy-esm.js",
|
|
@@ -20,7 +20,7 @@ describe("docs", () => {
|
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
expect(createDocString(type1)).toMatchInlineSnapshot(
|
|
23
|
-
`"string | Array<string>"
|
|
23
|
+
`"string | Array<string>"`,
|
|
24
24
|
);
|
|
25
25
|
});
|
|
26
26
|
|
|
@@ -51,7 +51,7 @@ describe("docs", () => {
|
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
expect(createDocString(type1)).toMatchInlineSnapshot(
|
|
54
|
-
`"function testABC(a: string, b: Array<string>): string"
|
|
54
|
+
`"function testABC(a: string, b: Array<string>): string"`,
|
|
55
55
|
);
|
|
56
56
|
});
|
|
57
57
|
|
|
@@ -80,7 +80,7 @@ describe("docs", () => {
|
|
|
80
80
|
};
|
|
81
81
|
|
|
82
82
|
expect(createDocString(type1)).toMatchInlineSnapshot(
|
|
83
|
-
`"[a: string, Array<string>]"
|
|
83
|
+
`"[a: string, Array<string>]"`,
|
|
84
84
|
);
|
|
85
85
|
});
|
|
86
86
|
|
|
@@ -110,7 +110,7 @@ describe("docs", () => {
|
|
|
110
110
|
};
|
|
111
111
|
|
|
112
112
|
expect(createDocString(type1)).toMatchInlineSnapshot(
|
|
113
|
-
`""abc" | 123 | true | Array<string>"
|
|
113
|
+
`""abc" | 123 | true | Array<string>"`,
|
|
114
114
|
);
|
|
115
115
|
});
|
|
116
116
|
});
|
|
@@ -12,10 +12,10 @@ import {
|
|
|
12
12
|
|
|
13
13
|
test("tsStripOptionalType", () => {
|
|
14
14
|
const input: ts.TypeNode = ts.factory.createKeywordTypeNode(
|
|
15
|
-
ts.SyntaxKind.StringKeyword
|
|
15
|
+
ts.SyntaxKind.StringKeyword,
|
|
16
16
|
);
|
|
17
17
|
const expected: ts.TypeNode = ts.factory.createKeywordTypeNode(
|
|
18
|
-
ts.SyntaxKind.StringKeyword
|
|
18
|
+
ts.SyntaxKind.StringKeyword,
|
|
19
19
|
);
|
|
20
20
|
const actual = tsStripOptionalType(input);
|
|
21
21
|
expect(actual).toEqual(expected);
|
|
@@ -31,7 +31,7 @@ describe("isExportedDeclaration", () => {
|
|
|
31
31
|
}
|
|
32
32
|
`,
|
|
33
33
|
ts.ScriptTarget.Latest,
|
|
34
|
-
true
|
|
34
|
+
true,
|
|
35
35
|
);
|
|
36
36
|
const node = source.statements[0] as ts.Statement;
|
|
37
37
|
|
|
@@ -48,7 +48,7 @@ describe("isExportedDeclaration", () => {
|
|
|
48
48
|
}
|
|
49
49
|
`,
|
|
50
50
|
ts.ScriptTarget.Latest,
|
|
51
|
-
true
|
|
51
|
+
true,
|
|
52
52
|
);
|
|
53
53
|
const node = source.statements[0] as ts.Statement;
|
|
54
54
|
|
|
@@ -12,7 +12,7 @@ describe("isOptionalProperty", () => {
|
|
|
12
12
|
}
|
|
13
13
|
`,
|
|
14
14
|
ts.ScriptTarget.Latest,
|
|
15
|
-
true
|
|
15
|
+
true,
|
|
16
16
|
);
|
|
17
17
|
const node = source.statements[0] as ts.InterfaceDeclaration;
|
|
18
18
|
const prop = node.members[0] as ts.PropertySignature;
|
|
@@ -29,7 +29,7 @@ describe("isOptionalProperty", () => {
|
|
|
29
29
|
}
|
|
30
30
|
`,
|
|
31
31
|
ts.ScriptTarget.Latest,
|
|
32
|
-
true
|
|
32
|
+
true,
|
|
33
33
|
);
|
|
34
34
|
const node = source.statements[0] as ts.InterfaceDeclaration;
|
|
35
35
|
const prop = node.members[0] as ts.PropertySignature;
|
|
@@ -66,9 +66,9 @@ describe("computeEffectiveObject tests", () => {
|
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
expect(() =>
|
|
69
|
-
computeEffectiveObject(type1, type2, true)
|
|
69
|
+
computeEffectiveObject(type1, type2, true),
|
|
70
70
|
).toThrowErrorMatchingInlineSnapshot(
|
|
71
|
-
`[Error: Can't compute effective type for object literal and object literal because of conflicting properties foo]
|
|
71
|
+
`[Error: Can't compute effective type for object literal and object literal because of conflicting properties foo]`,
|
|
72
72
|
);
|
|
73
73
|
});
|
|
74
74
|
|
package/src/annotations.ts
CHANGED
|
@@ -36,7 +36,7 @@ function parentIsNonObjectPath(node: ts.Node) {
|
|
|
36
36
|
*/
|
|
37
37
|
function recurseTypeChain(
|
|
38
38
|
node: ts.Node,
|
|
39
|
-
child: ts.Node | undefined
|
|
39
|
+
child: ts.Node | undefined,
|
|
40
40
|
): Array<string> {
|
|
41
41
|
if (!node) {
|
|
42
42
|
return [];
|
|
@@ -114,7 +114,7 @@ function extractTitle(node: ts.Node): Annotations {
|
|
|
114
114
|
*
|
|
115
115
|
*/
|
|
116
116
|
function stringifyDoc(
|
|
117
|
-
docString: undefined | string | ts.NodeArray<ts.JSDocComment
|
|
117
|
+
docString: undefined | string | ts.NodeArray<ts.JSDocComment>,
|
|
118
118
|
): string | undefined {
|
|
119
119
|
if (typeof docString === "undefined" || typeof docString === "string") {
|
|
120
120
|
return docString;
|
|
@@ -191,18 +191,18 @@ function mergeAnnotations(nodes: Array<Annotations>): Annotations {
|
|
|
191
191
|
const name = nodes.find((n) => n.name)?.name;
|
|
192
192
|
const title = join(
|
|
193
193
|
nodes.map((n) => n.title),
|
|
194
|
-
", "
|
|
194
|
+
", ",
|
|
195
195
|
);
|
|
196
196
|
const description = join(nodes.map((n) => n.description));
|
|
197
197
|
const _default = join(nodes.map((n) => n.default));
|
|
198
198
|
const comment = join(nodes.map((n) => n.comment));
|
|
199
199
|
const examples = join(
|
|
200
200
|
nodes.map((n) =>
|
|
201
|
-
Array.isArray(n.examples) ? join(n.examples) : n.examples
|
|
202
|
-
)
|
|
201
|
+
Array.isArray(n.examples) ? join(n.examples) : n.examples,
|
|
202
|
+
),
|
|
203
203
|
);
|
|
204
204
|
const see = join(
|
|
205
|
-
nodes.map((n) => (Array.isArray(n.see) ? join(n.see) : n.see))
|
|
205
|
+
nodes.map((n) => (Array.isArray(n.see) ? join(n.see) : n.see)),
|
|
206
206
|
);
|
|
207
207
|
const meta = nodes.find((n) => n.meta)?.meta;
|
|
208
208
|
return {
|
package/src/documentation.ts
CHANGED
|
@@ -42,7 +42,7 @@ export function createTSDocString(node: NodeType): Array<SymbolDisplayPart> {
|
|
|
42
42
|
kind: SymbolDisplayPartKind.punctuation as any,
|
|
43
43
|
text: node.type === "and" ? " & " : " | ",
|
|
44
44
|
},
|
|
45
|
-
]
|
|
45
|
+
],
|
|
46
46
|
).flat();
|
|
47
47
|
}
|
|
48
48
|
|
|
@@ -90,7 +90,7 @@ export function createTSDocString(node: NodeType): Array<SymbolDisplayPart> {
|
|
|
90
90
|
kind: SymbolDisplayPartKind.punctuation as any,
|
|
91
91
|
text: ", ",
|
|
92
92
|
},
|
|
93
|
-
]
|
|
93
|
+
],
|
|
94
94
|
).flat(),
|
|
95
95
|
{
|
|
96
96
|
kind: SymbolDisplayPartKind.punctuation as any,
|
|
@@ -137,7 +137,7 @@ export function createTSDocString(node: NodeType): Array<SymbolDisplayPart> {
|
|
|
137
137
|
kind: SymbolDisplayPartKind.punctuation as any,
|
|
138
138
|
text: ", ",
|
|
139
139
|
},
|
|
140
|
-
]
|
|
140
|
+
],
|
|
141
141
|
).flat(),
|
|
142
142
|
{
|
|
143
143
|
kind: SymbolDisplayPartKind.punctuation as any,
|
|
@@ -232,7 +232,7 @@ export function createTSDocString(node: NodeType): Array<SymbolDisplayPart> {
|
|
|
232
232
|
|
|
233
233
|
/** Convert the TS SymbolDisplayParts into a single string */
|
|
234
234
|
export function symbolDisplayToString(
|
|
235
|
-
displayParts: Array<SymbolDisplayPart
|
|
235
|
+
displayParts: Array<SymbolDisplayPart>,
|
|
236
236
|
): string {
|
|
237
237
|
return displayPartsToString(displayParts);
|
|
238
238
|
}
|
package/src/index.ts
CHANGED
package/src/ts-helpers.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* eslint-disable no-bitwise */
|
|
2
1
|
import ts from "typescript";
|
|
3
2
|
import type {
|
|
4
3
|
NamedType,
|
|
@@ -49,7 +48,7 @@ export function isNodeExported(node: ts.Node): boolean {
|
|
|
49
48
|
*/
|
|
50
49
|
export function getReferencedType(
|
|
51
50
|
node: ts.TypeReferenceNode,
|
|
52
|
-
typeChecker: ts.TypeChecker
|
|
51
|
+
typeChecker: ts.TypeChecker,
|
|
53
52
|
) {
|
|
54
53
|
let symbol = typeChecker.getSymbolAtLocation(node.typeName);
|
|
55
54
|
|
|
@@ -82,7 +81,7 @@ export function getStringLiteralsFromUnion(node: ts.Node): Set<string> {
|
|
|
82
81
|
}
|
|
83
82
|
|
|
84
83
|
return "";
|
|
85
|
-
})
|
|
84
|
+
}),
|
|
86
85
|
);
|
|
87
86
|
}
|
|
88
87
|
|
|
@@ -98,7 +97,7 @@ export function getStringLiteralsFromUnion(node: ts.Node): Set<string> {
|
|
|
98
97
|
*/
|
|
99
98
|
export function buildTemplateRegex(
|
|
100
99
|
node: ts.TemplateLiteralTypeNode,
|
|
101
|
-
typeChecker: ts.TypeChecker
|
|
100
|
+
typeChecker: ts.TypeChecker,
|
|
102
101
|
): string {
|
|
103
102
|
let regex = node.head.text;
|
|
104
103
|
node.templateSpans.forEach((span) => {
|
|
@@ -106,7 +105,7 @@ export function buildTemplateRegex(
|
|
|
106
105
|
let type = span.type.kind;
|
|
107
106
|
if (ts.isTypeReferenceNode(span.type)) {
|
|
108
107
|
let symbol = typeChecker.getSymbolAtLocation(
|
|
109
|
-
span.type.typeName
|
|
108
|
+
span.type.typeName,
|
|
110
109
|
) as ts.Symbol;
|
|
111
110
|
|
|
112
111
|
if (
|
|
@@ -140,7 +139,7 @@ export function buildTemplateRegex(
|
|
|
140
139
|
*/
|
|
141
140
|
export function fillInGenerics(
|
|
142
141
|
xlrNode: NodeType,
|
|
143
|
-
generics?: Map<string, NodeType
|
|
142
|
+
generics?: Map<string, NodeType>,
|
|
144
143
|
): NodeType {
|
|
145
144
|
// Need to make sure not to set generics in passed in map to avoid using generics outside of tree
|
|
146
145
|
let localGenerics: Map<string, NodeType>;
|
|
@@ -154,7 +153,7 @@ export function fillInGenerics(
|
|
|
154
153
|
const genericValue = (token.default ?? token.constraints) as NodeType;
|
|
155
154
|
localGenerics.set(
|
|
156
155
|
token.symbol,
|
|
157
|
-
fillInGenerics(genericValue, localGenerics)
|
|
156
|
+
fillInGenerics(genericValue, localGenerics),
|
|
158
157
|
);
|
|
159
158
|
});
|
|
160
159
|
}
|
|
@@ -167,7 +166,7 @@ export function fillInGenerics(
|
|
|
167
166
|
...(xlrNode.genericArguments
|
|
168
167
|
? {
|
|
169
168
|
genericArguments: xlrNode.genericArguments.map((ga) =>
|
|
170
|
-
fillInGenerics(ga, localGenerics)
|
|
169
|
+
fillInGenerics(ga, localGenerics),
|
|
171
170
|
),
|
|
172
171
|
}
|
|
173
172
|
: {}),
|
|
@@ -183,7 +182,7 @@ export function fillInGenerics(
|
|
|
183
182
|
...(xlrNode.genericArguments
|
|
184
183
|
? {
|
|
185
184
|
genericArguments: xlrNode.genericArguments.map((ga) =>
|
|
186
|
-
fillInGenerics(ga, localGenerics)
|
|
185
|
+
fillInGenerics(ga, localGenerics),
|
|
187
186
|
),
|
|
188
187
|
}
|
|
189
188
|
: {}),
|
|
@@ -287,7 +286,7 @@ export function fillInGenerics(
|
|
|
287
286
|
export function applyPickOrOmitToNodeType(
|
|
288
287
|
baseObject: NodeType,
|
|
289
288
|
operation: "Pick" | "Omit",
|
|
290
|
-
properties: Set<string
|
|
289
|
+
properties: Set<string>,
|
|
291
290
|
): NodeType | undefined {
|
|
292
291
|
if (baseObject.type === "object") {
|
|
293
292
|
const newObject = { ...baseObject };
|
|
@@ -322,7 +321,7 @@ export function applyPickOrOmitToNodeType(
|
|
|
322
321
|
pointer = baseObject.or;
|
|
323
322
|
} else {
|
|
324
323
|
throw new Error(
|
|
325
|
-
`Error: Can not apply ${operation} to type ${baseObject.type}
|
|
324
|
+
`Error: Can not apply ${operation} to type ${baseObject.type}`,
|
|
326
325
|
);
|
|
327
326
|
}
|
|
328
327
|
|
|
@@ -355,7 +354,7 @@ export function applyPickOrOmitToNodeType(
|
|
|
355
354
|
/** Applies the TS `Partial` or `Required` type to an interface/union/intersection */
|
|
356
355
|
export function applyPartialOrRequiredToNodeType(
|
|
357
356
|
baseObject: NodeType,
|
|
358
|
-
modifier: boolean
|
|
357
|
+
modifier: boolean,
|
|
359
358
|
): NodeType {
|
|
360
359
|
if (baseObject.type === "object") {
|
|
361
360
|
const newObject = { ...baseObject };
|
|
@@ -368,14 +367,14 @@ export function applyPartialOrRequiredToNodeType(
|
|
|
368
367
|
|
|
369
368
|
if (baseObject.type === "and") {
|
|
370
369
|
const pickedTypes = baseObject.and.map((type) =>
|
|
371
|
-
applyPartialOrRequiredToNodeType(type, modifier)
|
|
370
|
+
applyPartialOrRequiredToNodeType(type, modifier),
|
|
372
371
|
);
|
|
373
372
|
return { ...baseObject, and: pickedTypes };
|
|
374
373
|
}
|
|
375
374
|
|
|
376
375
|
if (baseObject.type === "or") {
|
|
377
376
|
const pickedTypes = baseObject.or.map((type) =>
|
|
378
|
-
applyPartialOrRequiredToNodeType(type, modifier)
|
|
377
|
+
applyPartialOrRequiredToNodeType(type, modifier),
|
|
379
378
|
);
|
|
380
379
|
return { ...baseObject, or: pickedTypes };
|
|
381
380
|
}
|
|
@@ -383,14 +382,14 @@ export function applyPartialOrRequiredToNodeType(
|
|
|
383
382
|
throw new Error(
|
|
384
383
|
`Error: Can not apply ${modifier ? "Required" : "Partial"} to type ${
|
|
385
384
|
baseObject.type
|
|
386
|
-
}
|
|
385
|
+
}`,
|
|
387
386
|
);
|
|
388
387
|
}
|
|
389
388
|
|
|
390
389
|
/** Applies the TS `Exclude` type to a union */
|
|
391
390
|
export function applyExcludeToNodeType(
|
|
392
391
|
baseObject: OrType,
|
|
393
|
-
filters: NodeType | OrType
|
|
392
|
+
filters: NodeType | OrType,
|
|
394
393
|
): NodeType {
|
|
395
394
|
const remainingMembers = baseObject.or.filter((type) => {
|
|
396
395
|
if (filters.type === "or") {
|
package/src/type-checks.ts
CHANGED
|
@@ -18,7 +18,7 @@ export function isOptionalProperty(node: ts.PropertySignature): boolean {
|
|
|
18
18
|
* Returns if the node is an Interface or Type with Generics
|
|
19
19
|
*/
|
|
20
20
|
export function isGenericInterfaceDeclaration(
|
|
21
|
-
node: ts.InterfaceDeclaration
|
|
21
|
+
node: ts.InterfaceDeclaration,
|
|
22
22
|
): boolean {
|
|
23
23
|
const length = node.typeParameters?.length;
|
|
24
24
|
return length ? length > 0 : false;
|
|
@@ -28,7 +28,7 @@ export function isGenericInterfaceDeclaration(
|
|
|
28
28
|
* Returns if the node is an Type Declaration with Generics
|
|
29
29
|
*/
|
|
30
30
|
export function isGenericTypeDeclaration(
|
|
31
|
-
node: ts.TypeAliasDeclaration
|
|
31
|
+
node: ts.TypeAliasDeclaration,
|
|
32
32
|
): boolean {
|
|
33
33
|
const length = node.typeParameters?.length;
|
|
34
34
|
return length ? length > 0 : false;
|
|
@@ -39,7 +39,7 @@ export function isGenericTypeDeclaration(
|
|
|
39
39
|
*/
|
|
40
40
|
export function isTypeReferenceGeneric(
|
|
41
41
|
node: ts.TypeReferenceNode,
|
|
42
|
-
typeChecker: ts.TypeChecker
|
|
42
|
+
typeChecker: ts.TypeChecker,
|
|
43
43
|
): boolean {
|
|
44
44
|
const symbol = typeChecker.getSymbolAtLocation(node.typeName);
|
|
45
45
|
if (symbol && symbol.declarations) {
|
|
@@ -57,7 +57,7 @@ export type TopLevelDeclaration =
|
|
|
57
57
|
* Returns if the node is an interface or a type declaration
|
|
58
58
|
*/
|
|
59
59
|
export function isTopLevelDeclaration(
|
|
60
|
-
node: ts.Node
|
|
60
|
+
node: ts.Node,
|
|
61
61
|
): node is TopLevelDeclaration {
|
|
62
62
|
return (
|
|
63
63
|
node.kind === ts.SyntaxKind.InterfaceDeclaration ||
|
|
@@ -82,7 +82,7 @@ export function isTopLevelNode(node: ts.Node): node is TopLevelNode {
|
|
|
82
82
|
* Returns if the NodeType has generic tokens
|
|
83
83
|
*/
|
|
84
84
|
export function isGenericNodeType<T extends NodeType = NodeType>(
|
|
85
|
-
nt: NodeType
|
|
85
|
+
nt: NodeType,
|
|
86
86
|
): nt is NodeTypeWithGenerics<T> {
|
|
87
87
|
return (nt as NodeTypeWithGenerics).genericTokens?.length > 0;
|
|
88
88
|
}
|
|
@@ -91,7 +91,7 @@ export function isGenericNodeType<T extends NodeType = NodeType>(
|
|
|
91
91
|
* Returns if the named type has generic tokens
|
|
92
92
|
*/
|
|
93
93
|
export function isGenericNamedType<T extends NamedType = NamedType>(
|
|
94
|
-
nt: NodeType
|
|
94
|
+
nt: NodeType,
|
|
95
95
|
): nt is NamedTypeWithGenerics<T> {
|
|
96
96
|
return (nt as NamedTypeWithGenerics).genericTokens?.length > 0;
|
|
97
97
|
}
|
|
@@ -136,7 +136,7 @@ export function resolveConditional(conditional: ConditionalType): NodeType {
|
|
|
136
136
|
conditional.genericTokens.forEach((token) => {
|
|
137
137
|
genericMap.set(
|
|
138
138
|
token.symbol,
|
|
139
|
-
token.default ?? token.constraints ?? { type: "any" }
|
|
139
|
+
token.default ?? token.constraints ?? { type: "any" },
|
|
140
140
|
);
|
|
141
141
|
});
|
|
142
142
|
|
|
@@ -151,7 +151,7 @@ export function resolveConditional(conditional: ConditionalType): NodeType {
|
|
|
151
151
|
*/
|
|
152
152
|
export function resolveReferenceNode(
|
|
153
153
|
genericReference: RefNode,
|
|
154
|
-
typeToFill: NodeType
|
|
154
|
+
typeToFill: NodeType,
|
|
155
155
|
): NodeType {
|
|
156
156
|
const genericArgs = genericReference.genericArguments;
|
|
157
157
|
const genericMap: Map<string, NodeType> = new Map();
|
|
@@ -161,7 +161,7 @@ export function resolveReferenceNode(
|
|
|
161
161
|
typeToFill.genericTokens.forEach((token, index) => {
|
|
162
162
|
genericMap.set(
|
|
163
163
|
token.symbol,
|
|
164
|
-
genericArgs[index] ?? token.default ?? token.constraints
|
|
164
|
+
genericArgs[index] ?? token.default ?? token.constraints,
|
|
165
165
|
);
|
|
166
166
|
});
|
|
167
167
|
}
|
|
@@ -173,7 +173,7 @@ export function resolveReferenceNode(
|
|
|
173
173
|
if (isGenericNodeType(filledInNode) && genericArgs?.length) {
|
|
174
174
|
if (genericArgs.length < filledInNode.genericTokens.length) {
|
|
175
175
|
filledInNode.genericTokens = filledInNode.genericTokens.slice(
|
|
176
|
-
genericArgs?.length
|
|
176
|
+
genericArgs?.length,
|
|
177
177
|
);
|
|
178
178
|
} else if (genericArgs.length === filledInNode.genericTokens.length) {
|
|
179
179
|
filledInNode.genericTokens = [];
|
|
@@ -201,7 +201,7 @@ export function resolveReferenceNode(
|
|
|
201
201
|
export function computeEffectiveObject(
|
|
202
202
|
base: ObjectType,
|
|
203
203
|
operand: ObjectType,
|
|
204
|
-
errorOnOverlap = true
|
|
204
|
+
errorOnOverlap = true,
|
|
205
205
|
): ObjectType {
|
|
206
206
|
const baseObjectName = base.name ?? base.title ?? "object literal";
|
|
207
207
|
const operandObjectName = operand.name ?? operand.title ?? "object literal";
|
|
@@ -221,11 +221,11 @@ export function computeEffectiveObject(
|
|
|
221
221
|
if (
|
|
222
222
|
!computeExtends(
|
|
223
223
|
newObject.properties[property].node,
|
|
224
|
-
operand.properties[property].node
|
|
224
|
+
operand.properties[property].node,
|
|
225
225
|
)
|
|
226
226
|
) {
|
|
227
227
|
throw new Error(
|
|
228
|
-
`Can't compute effective type for ${baseObjectName} and ${operandObjectName} because of conflicting properties ${property}
|
|
228
|
+
`Can't compute effective type for ${baseObjectName} and ${operandObjectName} because of conflicting properties ${property}`,
|
|
229
229
|
);
|
|
230
230
|
}
|
|
231
231
|
}
|
package/types/index.d.ts
CHANGED
package/src/test-helpers.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import ts from "typescript";
|
|
2
|
-
import * as tsvfs from "@typescript/vfs";
|
|
3
|
-
|
|
4
|
-
export interface SetupReturnType {
|
|
5
|
-
/**
|
|
6
|
-
* Virtual source file containing the passed in text
|
|
7
|
-
*/
|
|
8
|
-
sf: ts.SourceFile;
|
|
9
|
-
/**
|
|
10
|
-
* Type checker for the virtual program
|
|
11
|
-
*/
|
|
12
|
-
tc: ts.TypeChecker;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Setups a virtual TS environment for tests
|
|
17
|
-
*/
|
|
18
|
-
export function setupTestEnv(sourceCode: string, mockFileName = "filename.ts") {
|
|
19
|
-
const fsMap = tsvfs.createDefaultMapFromNodeModules({}, ts);
|
|
20
|
-
fsMap.set(mockFileName, sourceCode);
|
|
21
|
-
|
|
22
|
-
const system = tsvfs.createSystem(fsMap);
|
|
23
|
-
const host = tsvfs.createVirtualCompilerHost(system, {}, ts);
|
|
24
|
-
|
|
25
|
-
const program = ts.createProgram({
|
|
26
|
-
rootNames: [...fsMap.keys()],
|
|
27
|
-
options: {},
|
|
28
|
-
host: host.compilerHost,
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
sf: host.compilerHost.getSourceFile(
|
|
33
|
-
mockFileName,
|
|
34
|
-
ts.ScriptTarget.ES5
|
|
35
|
-
) as ts.SourceFile,
|
|
36
|
-
tc: program.getTypeChecker(),
|
|
37
|
-
};
|
|
38
|
-
}
|
package/types/test-helpers.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import ts from "typescript";
|
|
2
|
-
export interface SetupReturnType {
|
|
3
|
-
/**
|
|
4
|
-
* Virtual source file containing the passed in text
|
|
5
|
-
*/
|
|
6
|
-
sf: ts.SourceFile;
|
|
7
|
-
/**
|
|
8
|
-
* Type checker for the virtual program
|
|
9
|
-
*/
|
|
10
|
-
tc: ts.TypeChecker;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Setups a virtual TS environment for tests
|
|
14
|
-
*/
|
|
15
|
-
export declare function setupTestEnv(sourceCode: string, mockFileName?: string): {
|
|
16
|
-
sf: ts.SourceFile;
|
|
17
|
-
tc: ts.TypeChecker;
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=test-helpers.d.ts.map
|