@sanity/codegen 6.0.2 → 6.0.3-canary.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.
@@ -38,6 +38,26 @@ export class SchemaTypeGenerator {
38
38
  for (const type of schema){
39
39
  this.tsTypes.set(type.name, this.generateTsType(type));
40
40
  }
41
+ let hasEffectivelyUnknownTypes = false;
42
+ for (const type of schema){
43
+ const tsType = this.tsTypes.get(type.name);
44
+ if (tsType && SchemaTypeGenerator.isEffectivelyUnknown(tsType)) {
45
+ this.identifiers.delete(type.name);
46
+ hasEffectivelyUnknownTypes = true;
47
+ }
48
+ }
49
+ if (hasEffectivelyUnknownTypes) {
50
+ for (const type of schema){
51
+ this.tsTypes.set(type.name, this.generateTsType(type));
52
+ }
53
+ }
54
+ }
55
+ static isEffectivelyUnknown(tsType) {
56
+ if (t.isTSUnknownKeyword(tsType)) return true;
57
+ if (t.isTSTypeReference(tsType) && t.isIdentifier(tsType.typeName) && tsType.typeParameters?.params.length === 1 && t.isTSUnknownKeyword(tsType.typeParameters.params[0])) {
58
+ return true;
59
+ }
60
+ return false;
41
61
  }
42
62
  getType(typeName) {
43
63
  const tsType = this.tsTypes.get(typeName);
@@ -56,9 +76,10 @@ export class SchemaTypeGenerator {
56
76
  }
57
77
  *[Symbol.iterator]() {
58
78
  for (const { name } of this.schema){
59
- yield {
79
+ const type = this.getType(name);
80
+ if (type) yield {
60
81
  name,
61
- ...this.getType(name)
82
+ ...type
62
83
  };
63
84
  }
64
85
  }
@@ -114,11 +135,10 @@ export class SchemaTypeGenerator {
114
135
  }
115
136
  generateInlineTsType(typeNode) {
116
137
  const id = this.identifiers.get(typeNode.name);
117
- if (!id) {
118
- // Not found in schema, return unknown type
119
- return t.addComment(t.tsUnknownKeyword(), 'trailing', ` Unable to locate the referenced type "${typeNode.name}" in schema`, true);
120
- }
121
- return t.tsTypeReference(id);
138
+ if (id) return t.tsTypeReference(id);
139
+ const resolvedType = this.tsTypes.get(typeNode.name);
140
+ if (resolvedType) return t.cloneNode(resolvedType, true);
141
+ return t.addComment(t.tsUnknownKeyword(), 'trailing', ` Unable to locate the referenced type "${typeNode.name}" in schema`, true);
122
142
  }
123
143
  // Helper function used to generate TS types for object type nodes.
124
144
  generateObjectTsType(typeNode) {
@@ -239,8 +259,11 @@ export class SchemaTypeGenerator {
239
259
  // Helper function used to generate TS types for union type nodes.
240
260
  generateUnionTsType(typeNode) {
241
261
  if (typeNode.of.length === 0) return t.tsNeverKeyword();
242
- if (typeNode.of.length === 1) return this.generateTsType(typeNode.of[0]);
243
- return t.tsUnionType(typeNode.of.map((node)=>this.generateTsType(node)));
262
+ const generated = typeNode.of.map((node)=>this.generateTsType(node));
263
+ const nonUnknown = generated.filter((tsType)=>!t.isTSUnknownKeyword(tsType));
264
+ if (nonUnknown.length === 0) return t.tsUnknownKeyword();
265
+ if (nonUnknown.length === 1) return nonUnknown[0];
266
+ return t.tsUnionType(nonUnknown);
244
267
  }
245
268
  }
246
269
  export function walkAndCountQueryTypeNodeStats(typeNode) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/typescript/schemaTypeGenerator.ts"],"sourcesContent":["import * as t from '@babel/types'\nimport {\n type ArrayTypeNode,\n type DocumentSchemaType,\n type InlineTypeNode,\n type ObjectAttribute,\n type ObjectTypeNode,\n type SchemaType,\n type TypeDeclarationSchemaType,\n typeEvaluate,\n type TypeNode,\n type UnionTypeNode,\n} from 'groq-js'\n\nimport {safeParseQuery} from '../safeParseQuery.js'\nimport {ARRAY_OF, INTERNAL_REFERENCE_SYMBOL} from './constants.js'\nimport {\n getFilterArrayUnionType,\n getUniqueIdentifierForName,\n isIdentifierName,\n weakMapMemo,\n} from './helpers.js'\nimport {type ExtractedQuery, type TypeEvaluationStats} from './types.js'\n\nexport class SchemaTypeGenerator {\n public readonly schema: SchemaType\n evaluateQuery = weakMapMemo(\n // eslint-disable-next-line unicorn/consistent-function-scoping\n ({query}: Pick<ExtractedQuery, 'query'>): {stats: TypeEvaluationStats; tsType: t.TSType} => {\n const ast = safeParseQuery(query)\n const typeNode = typeEvaluate(ast, this.schema)\n const tsType = this.generateTsType(typeNode)\n const stats = walkAndCountQueryTypeNodeStats(typeNode)\n return {stats, tsType}\n },\n )\n private arrayOfUsed = false\n\n private identifiers = new Map<string, t.Identifier>()\n\n private tsTypes = new Map<string, t.TSType>()\n\n constructor(schema: SchemaType) {\n this.schema = schema\n\n const uniqueTypeNames = new Set<string>()\n for (const type of schema) {\n if (uniqueTypeNames.has(type.name)) {\n throw new Error(\n `Duplicate type name \"${type.name}\" in schema. Type names must be unique within the same schema.`,\n )\n }\n uniqueTypeNames.add(type.name)\n }\n\n for (const type of schema) {\n const currentIdentifierNames = new Set([...this.identifiers.values()].map((id) => id.name))\n const uniqueIdentifier = getUniqueIdentifierForName(type.name, currentIdentifierNames)\n this.identifiers.set(type.name, uniqueIdentifier)\n }\n\n for (const type of schema) {\n this.tsTypes.set(type.name, this.generateTsType(type))\n }\n }\n\n getType(typeName: string): {id: t.Identifier; tsType: t.TSType} | undefined {\n const tsType = this.tsTypes.get(typeName)\n const id = this.identifiers.get(typeName)\n if (tsType && id) return {id, tsType}\n return undefined\n }\n\n hasType(typeName: string): boolean {\n return this.tsTypes.has(typeName)\n }\n\n isArrayOfUsed(): boolean {\n return this.arrayOfUsed\n }\n\n *[Symbol.iterator]() {\n for (const {name} of this.schema) {\n yield {name, ...this.getType(name)!}\n }\n }\n\n typeNames(): string[] {\n return this.schema.map((schemaType) => schemaType.name)\n }\n\n /**\n * Helper function used to generate TS types for arrays of inline types, or arrays of inline types\n * wrapped in the ArrayOf wrapper that adds _key prop\n */\n private generateArrayOfTsType(typeNode: ArrayTypeNode): t.TSTypeReference {\n this.arrayOfUsed = true\n const typeNodes = this.generateTsType(typeNode.of)\n return t.tsTypeReference(ARRAY_OF, t.tsTypeParameterInstantiation([typeNodes]))\n }\n\n // Helper function used to generate TS types for array type nodes.\n private generateArrayTsType(typeNode: ArrayTypeNode): t.TSTypeReference | t.TSUnionType {\n // if it's an array of a single inline type, wrap it in ArrayOf\n if (typeNode.of.type === 'inline') {\n return this.generateArrayOfTsType(typeNode)\n }\n\n // if it's not an inline object and not a union, wrap in Array\n if (typeNode.of.type !== 'union') {\n const typeNodes = this.generateTsType(typeNode.of)\n return t.tsTypeReference(t.identifier('Array'), t.tsTypeParameterInstantiation([typeNodes]))\n }\n\n // if it's not a union type or all of the union type members are non-inlines, wrap type in Array\n if (typeNode.of.of.every((unionTypeNode) => unionTypeNode.type !== 'inline')) {\n const typeNodes = this.generateTsType(typeNode.of)\n return t.tsTypeReference(t.identifier('Array'), t.tsTypeParameterInstantiation([typeNodes]))\n }\n\n // all the union types nodes are inline\n if (typeNode.of.of.every((unionMember) => unionMember.type === 'inline')) {\n return this.generateArrayOfTsType(typeNode)\n }\n\n // some of the union types are inlines, while some are not - split and recurse\n const arrayOfNonInline = getFilterArrayUnionType(typeNode, (member) => member.type !== 'inline')\n const arrayOfInline = getFilterArrayUnionType(typeNode, (member) => member.type === 'inline')\n\n return t.tsUnionType([\n this.generateArrayTsType(arrayOfNonInline),\n this.generateArrayTsType(arrayOfInline),\n ])\n }\n\n // Helper function used to generate TS types for document type nodes.\n private generateDocumentTsType(document: DocumentSchemaType): t.TSType {\n const props = Object.entries(document.attributes).map(([key, node]) =>\n this.generateTsObjectProperty(key, node),\n )\n\n return t.tsTypeLiteral(props)\n }\n\n private generateInlineTsType(typeNode: InlineTypeNode): t.TSType {\n const id = this.identifiers.get(typeNode.name)\n if (!id) {\n // Not found in schema, return unknown type\n return t.addComment(\n t.tsUnknownKeyword(),\n 'trailing',\n ` Unable to locate the referenced type \"${typeNode.name}\" in schema`,\n true,\n )\n }\n\n return t.tsTypeReference(id)\n }\n\n // Helper function used to generate TS types for object type nodes.\n private generateObjectTsType(typeNode: ObjectTypeNode): t.TSType {\n const props: t.TSPropertySignature[] = []\n for (const [key, attribute] of Object.entries(typeNode.attributes)) {\n props.push(this.generateTsObjectProperty(key, attribute))\n }\n const rest = typeNode.rest\n\n if (rest) {\n switch (rest.type) {\n case 'inline': {\n const resolved = this.generateInlineTsType(rest)\n // if object rest is unknown, we can't generate a type literal for it\n if (t.isTSUnknownKeyword(resolved)) return resolved\n return t.tsIntersectionType([t.tsTypeLiteral(props), resolved])\n }\n case 'object': {\n for (const [key, attribute] of Object.entries(rest.attributes)) {\n props.push(this.generateTsObjectProperty(key, attribute))\n }\n break\n }\n case 'unknown': {\n return t.tsUnknownKeyword()\n }\n default: {\n // @ts-expect-error This should never happen\n throw new Error(`Type \"${rest.type}\" not found in schema`)\n }\n }\n }\n\n if (typeNode.dereferencesTo) {\n const derefType = Object.assign(\n t.tsPropertySignature(\n INTERNAL_REFERENCE_SYMBOL,\n t.tsTypeAnnotation(t.tsLiteralType(t.stringLiteral(typeNode.dereferencesTo))),\n ),\n {computed: true, optional: true},\n )\n props.push(derefType)\n }\n\n return t.tsTypeLiteral(props)\n }\n\n // Helper function used to generate TS types for object properties.\n private generateTsObjectProperty(key: string, attribute: ObjectAttribute): t.TSPropertySignature {\n const type = this.generateTsType(attribute.value)\n const keyNode = isIdentifierName(key) ? t.identifier(key) : t.stringLiteral(key)\n const propertySignature = t.tsPropertySignature(keyNode, t.tsTypeAnnotation(type))\n propertySignature.optional = attribute.optional\n\n return propertySignature\n }\n\n private generateTsType(\n typeNode: DocumentSchemaType | TypeDeclarationSchemaType | TypeNode,\n ): t.TSType {\n switch (typeNode.type) {\n case 'array': {\n return this.generateArrayTsType(typeNode)\n }\n case 'boolean': {\n if (typeNode.value !== undefined) {\n return t.tsLiteralType(t.booleanLiteral(typeNode.value))\n }\n return t.tsBooleanKeyword()\n }\n case 'document': {\n return this.generateDocumentTsType(typeNode)\n }\n case 'inline': {\n return this.generateInlineTsType(typeNode)\n }\n case 'null': {\n return t.tsNullKeyword()\n }\n case 'number': {\n if (typeNode.value !== undefined) {\n return t.tsLiteralType(t.numericLiteral(typeNode.value))\n }\n return t.tsNumberKeyword()\n }\n case 'object': {\n return this.generateObjectTsType(typeNode)\n }\n case 'string': {\n if (typeNode.value !== undefined) {\n return t.tsLiteralType(t.stringLiteral(typeNode.value))\n }\n return t.tsStringKeyword()\n }\n case 'type': {\n return this.generateTsType(typeNode.value)\n }\n case 'union': {\n return this.generateUnionTsType(typeNode)\n }\n case 'unknown': {\n return t.tsUnknownKeyword()\n }\n\n default: {\n throw new Error(\n `Encountered unsupported node type \"${\n // @ts-expect-error This should never happen\n typeNode.type\n }\" while generating schema types`,\n )\n }\n }\n }\n\n // Helper function used to generate TS types for union type nodes.\n private generateUnionTsType(typeNode: UnionTypeNode): t.TSType {\n if (typeNode.of.length === 0) return t.tsNeverKeyword()\n if (typeNode.of.length === 1) return this.generateTsType(typeNode.of[0]!)\n return t.tsUnionType(typeNode.of.map((node) => this.generateTsType(node)))\n }\n}\n\nexport function walkAndCountQueryTypeNodeStats(typeNode: TypeNode): TypeEvaluationStats {\n switch (typeNode.type) {\n case 'array': {\n const acc = walkAndCountQueryTypeNodeStats(typeNode.of)\n acc.allTypes += 1 // count the array type itself\n return acc\n }\n case 'object': {\n // if the rest is unknown, we count it as one unknown type\n if (typeNode.rest && typeNode.rest.type === 'unknown') {\n return {allTypes: 2, emptyUnions: 0, unknownTypes: 1} // count the object type itself as well\n }\n\n const restStats = typeNode.rest\n ? walkAndCountQueryTypeNodeStats(typeNode.rest)\n : {allTypes: 0, emptyUnions: 0, unknownTypes: 0}\n\n // count the object type itself\n restStats.allTypes += 1\n\n const attrs = Object.values(typeNode.attributes)\n let acc = restStats\n for (const attribute of attrs) {\n const {allTypes, emptyUnions, unknownTypes} = walkAndCountQueryTypeNodeStats(\n attribute.value,\n )\n acc = {\n allTypes: acc.allTypes + allTypes,\n emptyUnions: acc.emptyUnions + emptyUnions,\n unknownTypes: acc.unknownTypes + unknownTypes,\n }\n }\n return acc\n }\n case 'union': {\n if (typeNode.of.length === 0) {\n return {allTypes: 1, emptyUnions: 1, unknownTypes: 0}\n }\n\n let acc = {allTypes: 1, emptyUnions: 0, unknownTypes: 0} // count the union type itself\n for (const type of typeNode.of) {\n const {allTypes, emptyUnions, unknownTypes} = walkAndCountQueryTypeNodeStats(type)\n acc = {\n allTypes: acc.allTypes + allTypes,\n emptyUnions: acc.emptyUnions + emptyUnions,\n unknownTypes: acc.unknownTypes + unknownTypes,\n }\n }\n return acc\n }\n case 'unknown': {\n return {allTypes: 1, emptyUnions: 0, unknownTypes: 1}\n }\n default: {\n return {allTypes: 1, emptyUnions: 0, unknownTypes: 0}\n }\n }\n}\n"],"names":["t","typeEvaluate","safeParseQuery","ARRAY_OF","INTERNAL_REFERENCE_SYMBOL","getFilterArrayUnionType","getUniqueIdentifierForName","isIdentifierName","weakMapMemo","SchemaTypeGenerator","schema","evaluateQuery","query","ast","typeNode","tsType","generateTsType","stats","walkAndCountQueryTypeNodeStats","arrayOfUsed","identifiers","Map","tsTypes","uniqueTypeNames","Set","type","has","name","Error","add","currentIdentifierNames","values","map","id","uniqueIdentifier","set","getType","typeName","get","undefined","hasType","isArrayOfUsed","Symbol","iterator","typeNames","schemaType","generateArrayOfTsType","typeNodes","of","tsTypeReference","tsTypeParameterInstantiation","generateArrayTsType","identifier","every","unionTypeNode","unionMember","arrayOfNonInline","member","arrayOfInline","tsUnionType","generateDocumentTsType","document","props","Object","entries","attributes","key","node","generateTsObjectProperty","tsTypeLiteral","generateInlineTsType","addComment","tsUnknownKeyword","generateObjectTsType","attribute","push","rest","resolved","isTSUnknownKeyword","tsIntersectionType","dereferencesTo","derefType","assign","tsPropertySignature","tsTypeAnnotation","tsLiteralType","stringLiteral","computed","optional","value","keyNode","propertySignature","booleanLiteral","tsBooleanKeyword","tsNullKeyword","numericLiteral","tsNumberKeyword","tsStringKeyword","generateUnionTsType","length","tsNeverKeyword","acc","allTypes","emptyUnions","unknownTypes","restStats","attrs"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/typescript/schemaTypeGenerator.ts"],"sourcesContent":["import * as t from '@babel/types'\nimport {\n type ArrayTypeNode,\n type DocumentSchemaType,\n type InlineTypeNode,\n type ObjectAttribute,\n type ObjectTypeNode,\n type SchemaType,\n type TypeDeclarationSchemaType,\n typeEvaluate,\n type TypeNode,\n type UnionTypeNode,\n} from 'groq-js'\n\nimport {safeParseQuery} from '../safeParseQuery.js'\nimport {ARRAY_OF, INTERNAL_REFERENCE_SYMBOL} from './constants.js'\nimport {\n getFilterArrayUnionType,\n getUniqueIdentifierForName,\n isIdentifierName,\n weakMapMemo,\n} from './helpers.js'\nimport {type ExtractedQuery, type TypeEvaluationStats} from './types.js'\n\nexport class SchemaTypeGenerator {\n public readonly schema: SchemaType\n evaluateQuery = weakMapMemo(\n // eslint-disable-next-line unicorn/consistent-function-scoping\n ({query}: Pick<ExtractedQuery, 'query'>): {stats: TypeEvaluationStats; tsType: t.TSType} => {\n const ast = safeParseQuery(query)\n const typeNode = typeEvaluate(ast, this.schema)\n const tsType = this.generateTsType(typeNode)\n const stats = walkAndCountQueryTypeNodeStats(typeNode)\n return {stats, tsType}\n },\n )\n private arrayOfUsed = false\n\n private identifiers = new Map<string, t.Identifier>()\n\n private tsTypes = new Map<string, t.TSType>()\n\n constructor(schema: SchemaType) {\n this.schema = schema\n\n const uniqueTypeNames = new Set<string>()\n for (const type of schema) {\n if (uniqueTypeNames.has(type.name)) {\n throw new Error(\n `Duplicate type name \"${type.name}\" in schema. Type names must be unique within the same schema.`,\n )\n }\n uniqueTypeNames.add(type.name)\n }\n\n for (const type of schema) {\n const currentIdentifierNames = new Set([...this.identifiers.values()].map((id) => id.name))\n const uniqueIdentifier = getUniqueIdentifierForName(type.name, currentIdentifierNames)\n this.identifiers.set(type.name, uniqueIdentifier)\n }\n\n for (const type of schema) {\n this.tsTypes.set(type.name, this.generateTsType(type))\n }\n\n let hasEffectivelyUnknownTypes = false\n for (const type of schema) {\n const tsType = this.tsTypes.get(type.name)\n if (tsType && SchemaTypeGenerator.isEffectivelyUnknown(tsType)) {\n this.identifiers.delete(type.name)\n hasEffectivelyUnknownTypes = true\n }\n }\n\n if (hasEffectivelyUnknownTypes) {\n for (const type of schema) {\n this.tsTypes.set(type.name, this.generateTsType(type))\n }\n }\n }\n\n private static isEffectivelyUnknown(tsType: t.TSType): boolean {\n if (t.isTSUnknownKeyword(tsType)) return true\n if (\n t.isTSTypeReference(tsType) &&\n t.isIdentifier(tsType.typeName) &&\n tsType.typeParameters?.params.length === 1 &&\n t.isTSUnknownKeyword(tsType.typeParameters.params[0])\n ) {\n return true\n }\n return false\n }\n\n getType(typeName: string): {id: t.Identifier; tsType: t.TSType} | undefined {\n const tsType = this.tsTypes.get(typeName)\n const id = this.identifiers.get(typeName)\n if (tsType && id) return {id, tsType}\n return undefined\n }\n\n hasType(typeName: string): boolean {\n return this.tsTypes.has(typeName)\n }\n\n isArrayOfUsed(): boolean {\n return this.arrayOfUsed\n }\n\n *[Symbol.iterator]() {\n for (const {name} of this.schema) {\n const type = this.getType(name)\n if (type) yield {name, ...type}\n }\n }\n\n typeNames(): string[] {\n return this.schema.map((schemaType) => schemaType.name)\n }\n\n /**\n * Helper function used to generate TS types for arrays of inline types, or arrays of inline types\n * wrapped in the ArrayOf wrapper that adds _key prop\n */\n private generateArrayOfTsType(typeNode: ArrayTypeNode): t.TSTypeReference {\n this.arrayOfUsed = true\n const typeNodes = this.generateTsType(typeNode.of)\n return t.tsTypeReference(ARRAY_OF, t.tsTypeParameterInstantiation([typeNodes]))\n }\n\n // Helper function used to generate TS types for array type nodes.\n private generateArrayTsType(typeNode: ArrayTypeNode): t.TSTypeReference | t.TSUnionType {\n // if it's an array of a single inline type, wrap it in ArrayOf\n if (typeNode.of.type === 'inline') {\n return this.generateArrayOfTsType(typeNode)\n }\n\n // if it's not an inline object and not a union, wrap in Array\n if (typeNode.of.type !== 'union') {\n const typeNodes = this.generateTsType(typeNode.of)\n return t.tsTypeReference(t.identifier('Array'), t.tsTypeParameterInstantiation([typeNodes]))\n }\n\n // if it's not a union type or all of the union type members are non-inlines, wrap type in Array\n if (typeNode.of.of.every((unionTypeNode) => unionTypeNode.type !== 'inline')) {\n const typeNodes = this.generateTsType(typeNode.of)\n return t.tsTypeReference(t.identifier('Array'), t.tsTypeParameterInstantiation([typeNodes]))\n }\n\n // all the union types nodes are inline\n if (typeNode.of.of.every((unionMember) => unionMember.type === 'inline')) {\n return this.generateArrayOfTsType(typeNode)\n }\n\n // some of the union types are inlines, while some are not - split and recurse\n const arrayOfNonInline = getFilterArrayUnionType(typeNode, (member) => member.type !== 'inline')\n const arrayOfInline = getFilterArrayUnionType(typeNode, (member) => member.type === 'inline')\n\n return t.tsUnionType([\n this.generateArrayTsType(arrayOfNonInline),\n this.generateArrayTsType(arrayOfInline),\n ])\n }\n\n // Helper function used to generate TS types for document type nodes.\n private generateDocumentTsType(document: DocumentSchemaType): t.TSType {\n const props = Object.entries(document.attributes).map(([key, node]) =>\n this.generateTsObjectProperty(key, node),\n )\n\n return t.tsTypeLiteral(props)\n }\n\n private generateInlineTsType(typeNode: InlineTypeNode): t.TSType {\n const id = this.identifiers.get(typeNode.name)\n if (id) return t.tsTypeReference(id)\n\n const resolvedType = this.tsTypes.get(typeNode.name)\n if (resolvedType) return t.cloneNode(resolvedType, true)\n\n return t.addComment(\n t.tsUnknownKeyword(),\n 'trailing',\n ` Unable to locate the referenced type \"${typeNode.name}\" in schema`,\n true,\n )\n }\n\n // Helper function used to generate TS types for object type nodes.\n private generateObjectTsType(typeNode: ObjectTypeNode): t.TSType {\n const props: t.TSPropertySignature[] = []\n for (const [key, attribute] of Object.entries(typeNode.attributes)) {\n props.push(this.generateTsObjectProperty(key, attribute))\n }\n const rest = typeNode.rest\n\n if (rest) {\n switch (rest.type) {\n case 'inline': {\n const resolved = this.generateInlineTsType(rest)\n // if object rest is unknown, we can't generate a type literal for it\n if (t.isTSUnknownKeyword(resolved)) return resolved\n return t.tsIntersectionType([t.tsTypeLiteral(props), resolved])\n }\n case 'object': {\n for (const [key, attribute] of Object.entries(rest.attributes)) {\n props.push(this.generateTsObjectProperty(key, attribute))\n }\n break\n }\n case 'unknown': {\n return t.tsUnknownKeyword()\n }\n default: {\n // @ts-expect-error This should never happen\n throw new Error(`Type \"${rest.type}\" not found in schema`)\n }\n }\n }\n\n if (typeNode.dereferencesTo) {\n const derefType = Object.assign(\n t.tsPropertySignature(\n INTERNAL_REFERENCE_SYMBOL,\n t.tsTypeAnnotation(t.tsLiteralType(t.stringLiteral(typeNode.dereferencesTo))),\n ),\n {computed: true, optional: true},\n )\n props.push(derefType)\n }\n\n return t.tsTypeLiteral(props)\n }\n\n // Helper function used to generate TS types for object properties.\n private generateTsObjectProperty(key: string, attribute: ObjectAttribute): t.TSPropertySignature {\n const type = this.generateTsType(attribute.value)\n const keyNode = isIdentifierName(key) ? t.identifier(key) : t.stringLiteral(key)\n const propertySignature = t.tsPropertySignature(keyNode, t.tsTypeAnnotation(type))\n propertySignature.optional = attribute.optional\n\n return propertySignature\n }\n\n private generateTsType(\n typeNode: DocumentSchemaType | TypeDeclarationSchemaType | TypeNode,\n ): t.TSType {\n switch (typeNode.type) {\n case 'array': {\n return this.generateArrayTsType(typeNode)\n }\n case 'boolean': {\n if (typeNode.value !== undefined) {\n return t.tsLiteralType(t.booleanLiteral(typeNode.value))\n }\n return t.tsBooleanKeyword()\n }\n case 'document': {\n return this.generateDocumentTsType(typeNode)\n }\n case 'inline': {\n return this.generateInlineTsType(typeNode)\n }\n case 'null': {\n return t.tsNullKeyword()\n }\n case 'number': {\n if (typeNode.value !== undefined) {\n return t.tsLiteralType(t.numericLiteral(typeNode.value))\n }\n return t.tsNumberKeyword()\n }\n case 'object': {\n return this.generateObjectTsType(typeNode)\n }\n case 'string': {\n if (typeNode.value !== undefined) {\n return t.tsLiteralType(t.stringLiteral(typeNode.value))\n }\n return t.tsStringKeyword()\n }\n case 'type': {\n return this.generateTsType(typeNode.value)\n }\n case 'union': {\n return this.generateUnionTsType(typeNode)\n }\n case 'unknown': {\n return t.tsUnknownKeyword()\n }\n\n default: {\n throw new Error(\n `Encountered unsupported node type \"${\n // @ts-expect-error This should never happen\n typeNode.type\n }\" while generating schema types`,\n )\n }\n }\n }\n\n // Helper function used to generate TS types for union type nodes.\n private generateUnionTsType(typeNode: UnionTypeNode): t.TSType {\n if (typeNode.of.length === 0) return t.tsNeverKeyword()\n\n const generated = typeNode.of.map((node) => this.generateTsType(node))\n const nonUnknown = generated.filter((tsType) => !t.isTSUnknownKeyword(tsType))\n\n if (nonUnknown.length === 0) return t.tsUnknownKeyword()\n if (nonUnknown.length === 1) return nonUnknown[0]!\n return t.tsUnionType(nonUnknown)\n }\n}\n\nexport function walkAndCountQueryTypeNodeStats(typeNode: TypeNode): TypeEvaluationStats {\n switch (typeNode.type) {\n case 'array': {\n const acc = walkAndCountQueryTypeNodeStats(typeNode.of)\n acc.allTypes += 1 // count the array type itself\n return acc\n }\n case 'object': {\n // if the rest is unknown, we count it as one unknown type\n if (typeNode.rest && typeNode.rest.type === 'unknown') {\n return {allTypes: 2, emptyUnions: 0, unknownTypes: 1} // count the object type itself as well\n }\n\n const restStats = typeNode.rest\n ? walkAndCountQueryTypeNodeStats(typeNode.rest)\n : {allTypes: 0, emptyUnions: 0, unknownTypes: 0}\n\n // count the object type itself\n restStats.allTypes += 1\n\n const attrs = Object.values(typeNode.attributes)\n let acc = restStats\n for (const attribute of attrs) {\n const {allTypes, emptyUnions, unknownTypes} = walkAndCountQueryTypeNodeStats(\n attribute.value,\n )\n acc = {\n allTypes: acc.allTypes + allTypes,\n emptyUnions: acc.emptyUnions + emptyUnions,\n unknownTypes: acc.unknownTypes + unknownTypes,\n }\n }\n return acc\n }\n case 'union': {\n if (typeNode.of.length === 0) {\n return {allTypes: 1, emptyUnions: 1, unknownTypes: 0}\n }\n\n let acc = {allTypes: 1, emptyUnions: 0, unknownTypes: 0} // count the union type itself\n for (const type of typeNode.of) {\n const {allTypes, emptyUnions, unknownTypes} = walkAndCountQueryTypeNodeStats(type)\n acc = {\n allTypes: acc.allTypes + allTypes,\n emptyUnions: acc.emptyUnions + emptyUnions,\n unknownTypes: acc.unknownTypes + unknownTypes,\n }\n }\n return acc\n }\n case 'unknown': {\n return {allTypes: 1, emptyUnions: 0, unknownTypes: 1}\n }\n default: {\n return {allTypes: 1, emptyUnions: 0, unknownTypes: 0}\n }\n }\n}\n"],"names":["t","typeEvaluate","safeParseQuery","ARRAY_OF","INTERNAL_REFERENCE_SYMBOL","getFilterArrayUnionType","getUniqueIdentifierForName","isIdentifierName","weakMapMemo","SchemaTypeGenerator","schema","evaluateQuery","query","ast","typeNode","tsType","generateTsType","stats","walkAndCountQueryTypeNodeStats","arrayOfUsed","identifiers","Map","tsTypes","uniqueTypeNames","Set","type","has","name","Error","add","currentIdentifierNames","values","map","id","uniqueIdentifier","set","hasEffectivelyUnknownTypes","get","isEffectivelyUnknown","delete","isTSUnknownKeyword","isTSTypeReference","isIdentifier","typeName","typeParameters","params","length","getType","undefined","hasType","isArrayOfUsed","Symbol","iterator","typeNames","schemaType","generateArrayOfTsType","typeNodes","of","tsTypeReference","tsTypeParameterInstantiation","generateArrayTsType","identifier","every","unionTypeNode","unionMember","arrayOfNonInline","member","arrayOfInline","tsUnionType","generateDocumentTsType","document","props","Object","entries","attributes","key","node","generateTsObjectProperty","tsTypeLiteral","generateInlineTsType","resolvedType","cloneNode","addComment","tsUnknownKeyword","generateObjectTsType","attribute","push","rest","resolved","tsIntersectionType","dereferencesTo","derefType","assign","tsPropertySignature","tsTypeAnnotation","tsLiteralType","stringLiteral","computed","optional","value","keyNode","propertySignature","booleanLiteral","tsBooleanKeyword","tsNullKeyword","numericLiteral","tsNumberKeyword","tsStringKeyword","generateUnionTsType","tsNeverKeyword","generated","nonUnknown","filter","acc","allTypes","emptyUnions","unknownTypes","restStats","attrs"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  "typegen:generate": {
4
4
  "aliases": [],
5
5
  "args": {},
6
- "description": "Sanity TypeGen\n\nConfiguration:\nThis command can utilize configuration settings defined in a `sanity-typegen.json` file. These settings include:\n\n- \"path\": Specifies a glob pattern to locate your TypeScript or JavaScript files.\n Default: \"./src/**/*.{ts,tsx,js,jsx}\"\n\n- \"schema\": Defines the path to your Sanity schema file. This file should be generated using the `sanity schema extract` command.\n Default: \"schema.json\"\n\n- \"generates\": Indicates the path where the generated TypeScript type definitions will be saved.\n Default: \"./sanity.types.ts\"\n\nThe default configuration values listed above are used if not overridden in your `sanity-typegen.json` configuration file. To customize the behavior of the type generation, adjust these properties in the configuration file according to your project's needs.\n\nNote:\n- The `sanity schema extract` command is a prerequisite for extracting your Sanity Studio schema into a `schema.json` file, which is then used by the `sanity typegen generate` command to generate type definitions.",
6
+ "description": "Sanity TypeGen\n\n\u001b[1mConfiguration:\u001b[22m\nThis command can utilize configuration settings defined in a `sanity-typegen.json` file. These settings include:\n\n- \"path\": Specifies a glob pattern to locate your TypeScript or JavaScript files.\n Default: \"./src/**/*.{ts,tsx,js,jsx}\"\n\n- \"schema\": Defines the path to your Sanity schema file. This file should be generated using the `sanity schema extract` command.\n Default: \"schema.json\"\n\n- \"generates\": Indicates the path where the generated TypeScript type definitions will be saved.\n Default: \"./sanity.types.ts\"\n\nThe default configuration values listed above are used if not overridden in your `sanity-typegen.json` configuration file. To customize the behavior of the type generation, adjust these properties in the configuration file according to your project's needs.\n\n\u001b[1mNote:\u001b[22m\n- The `sanity schema extract` command is a prerequisite for extracting your Sanity Studio schema into a `schema.json` file, which is then used by the `sanity typegen generate` command to generate type definitions.",
7
7
  "examples": [
8
8
  {
9
9
  "command": "<%= config.bin %> <%= command.id %>",
@@ -41,5 +41,5 @@
41
41
  ]
42
42
  }
43
43
  },
44
- "version": "6.0.2"
44
+ "version": "6.0.3-canary.0"
45
45
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/codegen",
3
- "version": "6.0.2",
3
+ "version": "6.0.3-canary.0",
4
4
  "description": "Codegen toolkit for Sanity.io",
5
5
  "keywords": [
6
6
  "sanity",