@sanity/codegen 5.9.0 → 5.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
- import { debug } from 'node:console';
2
1
  import { writeFile } from 'node:fs/promises';
3
2
  import { spinner } from '@sanity/cli-core/ux';
4
3
  import { format, resolveConfig as resolvePrettierConfig } from 'prettier';
5
4
  import { count } from '../utils/count.js';
5
+ import { debug } from '../utils/debug.js';
6
6
  import { formatPath } from '../utils/formatPath.js';
7
7
  import { getMessage } from '../utils/getMessage.js';
8
8
  import { percent } from '../utils/percent.js';
@@ -20,8 +20,8 @@ import { generatedFileWarning } from './generatedFileWarning.js';
20
20
  const start = Date.now();
21
21
  const { formatGeneratedCode, generates, schema } = options;
22
22
  let code = '';
23
+ const spin = spinner().start(`Loading schema…`);
23
24
  try {
24
- const spin = spinner().start(`Loading schema…`);
25
25
  await receiver.event.loadedSchema();
26
26
  spin.succeed(`Schema loaded from ${formatPath(schema ?? '')}`);
27
27
  spin.start('Generating schema types…');
@@ -97,6 +97,7 @@ import { generatedFileWarning } from './generatedFileWarning.js';
97
97
  code
98
98
  };
99
99
  } catch (err) {
100
+ spin.fail();
100
101
  debug('error generating types', err);
101
102
  throw err;
102
103
  } finally{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/actions/streamProcessor.ts"],"sourcesContent":["import {debug} from 'node:console'\nimport {writeFile} from 'node:fs/promises'\n\nimport {spinner} from '@sanity/cli-core/ux'\nimport {WorkerChannelReceiver} from '@sanity/worker-channels'\nimport {format, resolveConfig as resolvePrettierConfig} from 'prettier'\n\nimport {TypeGenConfig} from '../readConfig.js'\nimport {count} from '../utils/count.js'\nimport {formatPath} from '../utils/formatPath.js'\nimport {getMessage} from '../utils/getMessage.js'\nimport {percent} from '../utils/percent.js'\nimport {generatedFileWarning} from './generatedFileWarning.js'\nimport {TypegenWorkerChannel} from './types.js'\n\n/**\n * Processes the event stream from a typegen worker thread.\n *\n * Listens to worker channel events, displays progress via CLI spinners,\n * writes the generated types to disk, and optionally formats with prettier.\n *\n * @param receiver - Worker channel receiver for typegen events\n * @param options - Typegen configuration options\n * @returns Generation result containing the generated code and statistics\n */\nexport async function processTypegenWorkerStream(\n receiver: WorkerChannelReceiver<TypegenWorkerChannel>,\n options: TypeGenConfig,\n) {\n const start = Date.now()\n const {formatGeneratedCode, generates, schema} = options\n let code = ''\n\n try {\n const spin = spinner().start(`Loading schema…`)\n\n await receiver.event.loadedSchema()\n spin.succeed(`Schema loaded from ${formatPath(schema ?? '')}`)\n\n spin.start('Generating schema types…')\n const {expectedFileCount} = await receiver.event.typegenStarted()\n const {schemaTypeDeclarations} = await receiver.event.generatedSchemaTypes()\n const schemaTypesCount = schemaTypeDeclarations.length\n\n spin.text = 'Generating query types…'\n let queriesCount = 0\n let evaluatedFiles = 0\n let filesWithErrors = 0\n let queryFilesCount = 0\n let typeNodesGenerated = 0\n let unknownTypeNodesGenerated = 0\n let emptyUnionTypeNodesGenerated = 0\n\n for await (const {errors, queries} of receiver.stream.evaluatedModules()) {\n evaluatedFiles++\n queriesCount += queries.length\n queryFilesCount += queries.length > 0 ? 1 : 0\n filesWithErrors += errors.length > 0 ? 1 : 0\n\n for (const {stats} of queries) {\n typeNodesGenerated += stats.allTypes\n unknownTypeNodesGenerated += stats.unknownTypes\n emptyUnionTypeNodesGenerated += stats.emptyUnions\n }\n\n for (const error of errors) {\n spin.fail(getMessage(error))\n }\n\n if (!spin.isSpinning) {\n spin.start()\n }\n\n spin.text =\n `Generating query types… (${percent(evaluatedFiles / expectedFileCount)})\\n` +\n ` └─ Processed ${count(evaluatedFiles)} of ${count(expectedFileCount, 'files')}. ` +\n `Found ${count(queriesCount, 'queries', 'query')} from ${count(queryFilesCount, 'files')}.`\n }\n\n const result = await receiver.event.typegenComplete()\n code = `${generatedFileWarning}${result.code}`\n await writeFile(generates, code)\n\n let formattingError = false\n if (formatGeneratedCode) {\n spin.text = `Formatting generated types with prettier…`\n\n try {\n const prettierConfig = await resolvePrettierConfig(generates)\n const formattedCode = await format(code, {\n ...prettierConfig,\n parser: 'typescript' as const,\n })\n await writeFile(generates, formattedCode)\n } catch (err) {\n formattingError = true\n spin.warn(`Failed to format generated types with prettier: ${getMessage(err)}`)\n }\n }\n\n if (filesWithErrors > 0) {\n spin.warn(`Encountered errors in ${count(filesWithErrors, 'files')} while generating types`)\n }\n\n const stats = {\n duration: Date.now() - start,\n emptyUnionTypeNodesGenerated,\n filesWithErrors,\n outputSize: Buffer.byteLength(code),\n queriesCount,\n queryFilesCount,\n schemaTypesCount,\n typeNodesGenerated,\n unknownTypeNodesGenerated,\n unknownTypeNodesRatio:\n typeNodesGenerated > 0 ? unknownTypeNodesGenerated / typeNodesGenerated : 0,\n }\n\n let successText =\n `Successfully generated types to ${formatPath(generates)} in ${Number(stats.duration).toFixed(0)}ms` +\n `\\n └─ ${count(queriesCount, 'queries', 'query')} and ${count(schemaTypesCount, 'schema types', 'schema type')}` +\n `\\n └─ found queries in ${count(queryFilesCount, 'files', 'file')} after evaluating ${count(evaluatedFiles, 'files', 'file')}`\n\n if (formatGeneratedCode) {\n successText += `\\n └─ ${formattingError ? 'an error occured during formatting' : 'formatted the generated code with prettier'}`\n }\n\n spin.succeed(successText)\n\n return {\n ...stats,\n code,\n }\n } catch (err) {\n debug('error generating types', err)\n throw err\n } finally {\n receiver.unsubscribe()\n }\n}\n"],"names":["debug","writeFile","spinner","format","resolveConfig","resolvePrettierConfig","count","formatPath","getMessage","percent","generatedFileWarning","processTypegenWorkerStream","receiver","options","start","Date","now","formatGeneratedCode","generates","schema","code","spin","event","loadedSchema","succeed","expectedFileCount","typegenStarted","schemaTypeDeclarations","generatedSchemaTypes","schemaTypesCount","length","text","queriesCount","evaluatedFiles","filesWithErrors","queryFilesCount","typeNodesGenerated","unknownTypeNodesGenerated","emptyUnionTypeNodesGenerated","errors","queries","stream","evaluatedModules","stats","allTypes","unknownTypes","emptyUnions","error","fail","isSpinning","result","typegenComplete","formattingError","prettierConfig","formattedCode","parser","err","warn","duration","outputSize","Buffer","byteLength","unknownTypeNodesRatio","successText","Number","toFixed","unsubscribe"],"mappings":"AAAA,SAAQA,KAAK,QAAO,eAAc;AAClC,SAAQC,SAAS,QAAO,mBAAkB;AAE1C,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,MAAM,EAAEC,iBAAiBC,qBAAqB,QAAO,WAAU;AAGvE,SAAQC,KAAK,QAAO,oBAAmB;AACvC,SAAQC,UAAU,QAAO,yBAAwB;AACjD,SAAQC,UAAU,QAAO,yBAAwB;AACjD,SAAQC,OAAO,QAAO,sBAAqB;AAC3C,SAAQC,oBAAoB,QAAO,4BAA2B;AAG9D;;;;;;;;;CASC,GACD,OAAO,eAAeC,2BACpBC,QAAqD,EACrDC,OAAsB;IAEtB,MAAMC,QAAQC,KAAKC,GAAG;IACtB,MAAM,EAACC,mBAAmB,EAAEC,SAAS,EAAEC,MAAM,EAAC,GAAGN;IACjD,IAAIO,OAAO;IAEX,IAAI;QACF,MAAMC,OAAOnB,UAAUY,KAAK,CAAC,CAAC,eAAe,CAAC;QAE9C,MAAMF,SAASU,KAAK,CAACC,YAAY;QACjCF,KAAKG,OAAO,CAAC,CAAC,mBAAmB,EAAEjB,WAAWY,UAAU,KAAK;QAE7DE,KAAKP,KAAK,CAAC;QACX,MAAM,EAACW,iBAAiB,EAAC,GAAG,MAAMb,SAASU,KAAK,CAACI,cAAc;QAC/D,MAAM,EAACC,sBAAsB,EAAC,GAAG,MAAMf,SAASU,KAAK,CAACM,oBAAoB;QAC1E,MAAMC,mBAAmBF,uBAAuBG,MAAM;QAEtDT,KAAKU,IAAI,GAAG;QACZ,IAAIC,eAAe;QACnB,IAAIC,iBAAiB;QACrB,IAAIC,kBAAkB;QACtB,IAAIC,kBAAkB;QACtB,IAAIC,qBAAqB;QACzB,IAAIC,4BAA4B;QAChC,IAAIC,+BAA+B;QAEnC,WAAW,MAAM,EAACC,MAAM,EAAEC,OAAO,EAAC,IAAI5B,SAAS6B,MAAM,CAACC,gBAAgB,GAAI;YACxET;YACAD,gBAAgBQ,QAAQV,MAAM;YAC9BK,mBAAmBK,QAAQV,MAAM,GAAG,IAAI,IAAI;YAC5CI,mBAAmBK,OAAOT,MAAM,GAAG,IAAI,IAAI;YAE3C,KAAK,MAAM,EAACa,KAAK,EAAC,IAAIH,QAAS;gBAC7BJ,sBAAsBO,MAAMC,QAAQ;gBACpCP,6BAA6BM,MAAME,YAAY;gBAC/CP,gCAAgCK,MAAMG,WAAW;YACnD;YAEA,KAAK,MAAMC,SAASR,OAAQ;gBAC1BlB,KAAK2B,IAAI,CAACxC,WAAWuC;YACvB;YAEA,IAAI,CAAC1B,KAAK4B,UAAU,EAAE;gBACpB5B,KAAKP,KAAK;YACZ;YAEAO,KAAKU,IAAI,GACP,CAAC,yBAAyB,EAAEtB,QAAQwB,iBAAiBR,mBAAmB,GAAG,CAAC,GAC5E,CAAC,eAAe,EAAEnB,MAAM2B,gBAAgB,IAAI,EAAE3B,MAAMmB,mBAAmB,SAAS,EAAE,CAAC,GACnF,CAAC,MAAM,EAAEnB,MAAM0B,cAAc,WAAW,SAAS,MAAM,EAAE1B,MAAM6B,iBAAiB,SAAS,CAAC,CAAC;QAC/F;QAEA,MAAMe,SAAS,MAAMtC,SAASU,KAAK,CAAC6B,eAAe;QACnD/B,OAAO,GAAGV,uBAAuBwC,OAAO9B,IAAI,EAAE;QAC9C,MAAMnB,UAAUiB,WAAWE;QAE3B,IAAIgC,kBAAkB;QACtB,IAAInC,qBAAqB;YACvBI,KAAKU,IAAI,GAAG,CAAC,yCAAyC,CAAC;YAEvD,IAAI;gBACF,MAAMsB,iBAAiB,MAAMhD,sBAAsBa;gBACnD,MAAMoC,gBAAgB,MAAMnD,OAAOiB,MAAM;oBACvC,GAAGiC,cAAc;oBACjBE,QAAQ;gBACV;gBACA,MAAMtD,UAAUiB,WAAWoC;YAC7B,EAAE,OAAOE,KAAK;gBACZJ,kBAAkB;gBAClB/B,KAAKoC,IAAI,CAAC,CAAC,gDAAgD,EAAEjD,WAAWgD,MAAM;YAChF;QACF;QAEA,IAAItB,kBAAkB,GAAG;YACvBb,KAAKoC,IAAI,CAAC,CAAC,sBAAsB,EAAEnD,MAAM4B,iBAAiB,SAAS,uBAAuB,CAAC;QAC7F;QAEA,MAAMS,QAAQ;YACZe,UAAU3C,KAAKC,GAAG,KAAKF;YACvBwB;YACAJ;YACAyB,YAAYC,OAAOC,UAAU,CAACzC;YAC9BY;YACAG;YACAN;YACAO;YACAC;YACAyB,uBACE1B,qBAAqB,IAAIC,4BAA4BD,qBAAqB;QAC9E;QAEA,IAAI2B,cACF,CAAC,gCAAgC,EAAExD,WAAWW,WAAW,IAAI,EAAE8C,OAAOrB,MAAMe,QAAQ,EAAEO,OAAO,CAAC,GAAG,EAAE,CAAC,GACpG,CAAC,OAAO,EAAE3D,MAAM0B,cAAc,WAAW,SAAS,KAAK,EAAE1B,MAAMuB,kBAAkB,gBAAgB,gBAAgB,GACjH,CAAC,wBAAwB,EAAEvB,MAAM6B,iBAAiB,SAAS,QAAQ,kBAAkB,EAAE7B,MAAM2B,gBAAgB,SAAS,SAAS;QAEjI,IAAIhB,qBAAqB;YACvB8C,eAAe,CAAC,OAAO,EAAEX,kBAAkB,uCAAuC,8CAA8C;QAClI;QAEA/B,KAAKG,OAAO,CAACuC;QAEb,OAAO;YACL,GAAGpB,KAAK;YACRvB;QACF;IACF,EAAE,OAAOoC,KAAK;QACZxD,MAAM,0BAA0BwD;QAChC,MAAMA;IACR,SAAU;QACR5C,SAASsD,WAAW;IACtB;AACF"}
1
+ {"version":3,"sources":["../../src/actions/streamProcessor.ts"],"sourcesContent":["import {writeFile} from 'node:fs/promises'\n\nimport {spinner} from '@sanity/cli-core/ux'\nimport {WorkerChannelReceiver} from '@sanity/worker-channels'\nimport {format, resolveConfig as resolvePrettierConfig} from 'prettier'\n\nimport {TypeGenConfig} from '../readConfig.js'\nimport {count} from '../utils/count.js'\nimport {debug} from '../utils/debug.js'\nimport {formatPath} from '../utils/formatPath.js'\nimport {getMessage} from '../utils/getMessage.js'\nimport {percent} from '../utils/percent.js'\nimport {generatedFileWarning} from './generatedFileWarning.js'\nimport {TypegenWorkerChannel} from './types.js'\n\n/**\n * Processes the event stream from a typegen worker thread.\n *\n * Listens to worker channel events, displays progress via CLI spinners,\n * writes the generated types to disk, and optionally formats with prettier.\n *\n * @param receiver - Worker channel receiver for typegen events\n * @param options - Typegen configuration options\n * @returns Generation result containing the generated code and statistics\n */\nexport async function processTypegenWorkerStream(\n receiver: WorkerChannelReceiver<TypegenWorkerChannel>,\n options: TypeGenConfig,\n) {\n const start = Date.now()\n const {formatGeneratedCode, generates, schema} = options\n let code = ''\n\n const spin = spinner().start(`Loading schema…`)\n\n try {\n await receiver.event.loadedSchema()\n spin.succeed(`Schema loaded from ${formatPath(schema ?? '')}`)\n\n spin.start('Generating schema types…')\n const {expectedFileCount} = await receiver.event.typegenStarted()\n const {schemaTypeDeclarations} = await receiver.event.generatedSchemaTypes()\n const schemaTypesCount = schemaTypeDeclarations.length\n\n spin.text = 'Generating query types…'\n\n let queriesCount = 0\n let evaluatedFiles = 0\n let filesWithErrors = 0\n let queryFilesCount = 0\n let typeNodesGenerated = 0\n let unknownTypeNodesGenerated = 0\n let emptyUnionTypeNodesGenerated = 0\n\n for await (const {errors, queries} of receiver.stream.evaluatedModules()) {\n evaluatedFiles++\n queriesCount += queries.length\n queryFilesCount += queries.length > 0 ? 1 : 0\n filesWithErrors += errors.length > 0 ? 1 : 0\n\n for (const {stats} of queries) {\n typeNodesGenerated += stats.allTypes\n unknownTypeNodesGenerated += stats.unknownTypes\n emptyUnionTypeNodesGenerated += stats.emptyUnions\n }\n\n for (const error of errors) {\n spin.fail(getMessage(error))\n }\n\n if (!spin.isSpinning) {\n spin.start()\n }\n\n spin.text =\n `Generating query types… (${percent(evaluatedFiles / expectedFileCount)})\\n` +\n ` └─ Processed ${count(evaluatedFiles)} of ${count(expectedFileCount, 'files')}. ` +\n `Found ${count(queriesCount, 'queries', 'query')} from ${count(queryFilesCount, 'files')}.`\n }\n\n const result = await receiver.event.typegenComplete()\n code = `${generatedFileWarning}${result.code}`\n await writeFile(generates, code)\n\n let formattingError = false\n if (formatGeneratedCode) {\n spin.text = `Formatting generated types with prettier…`\n\n try {\n const prettierConfig = await resolvePrettierConfig(generates)\n const formattedCode = await format(code, {\n ...prettierConfig,\n parser: 'typescript' as const,\n })\n await writeFile(generates, formattedCode)\n } catch (err) {\n formattingError = true\n spin.warn(`Failed to format generated types with prettier: ${getMessage(err)}`)\n }\n }\n\n if (filesWithErrors > 0) {\n spin.warn(`Encountered errors in ${count(filesWithErrors, 'files')} while generating types`)\n }\n\n const stats = {\n duration: Date.now() - start,\n emptyUnionTypeNodesGenerated,\n filesWithErrors,\n outputSize: Buffer.byteLength(code),\n queriesCount,\n queryFilesCount,\n schemaTypesCount,\n typeNodesGenerated,\n unknownTypeNodesGenerated,\n unknownTypeNodesRatio:\n typeNodesGenerated > 0 ? unknownTypeNodesGenerated / typeNodesGenerated : 0,\n }\n\n let successText =\n `Successfully generated types to ${formatPath(generates)} in ${Number(stats.duration).toFixed(0)}ms` +\n `\\n └─ ${count(queriesCount, 'queries', 'query')} and ${count(schemaTypesCount, 'schema types', 'schema type')}` +\n `\\n └─ found queries in ${count(queryFilesCount, 'files', 'file')} after evaluating ${count(evaluatedFiles, 'files', 'file')}`\n\n if (formatGeneratedCode) {\n successText += `\\n └─ ${formattingError ? 'an error occured during formatting' : 'formatted the generated code with prettier'}`\n }\n\n spin.succeed(successText)\n\n return {\n ...stats,\n code,\n }\n } catch (err) {\n spin.fail()\n debug('error generating types', err)\n throw err\n } finally {\n receiver.unsubscribe()\n }\n}\n"],"names":["writeFile","spinner","format","resolveConfig","resolvePrettierConfig","count","debug","formatPath","getMessage","percent","generatedFileWarning","processTypegenWorkerStream","receiver","options","start","Date","now","formatGeneratedCode","generates","schema","code","spin","event","loadedSchema","succeed","expectedFileCount","typegenStarted","schemaTypeDeclarations","generatedSchemaTypes","schemaTypesCount","length","text","queriesCount","evaluatedFiles","filesWithErrors","queryFilesCount","typeNodesGenerated","unknownTypeNodesGenerated","emptyUnionTypeNodesGenerated","errors","queries","stream","evaluatedModules","stats","allTypes","unknownTypes","emptyUnions","error","fail","isSpinning","result","typegenComplete","formattingError","prettierConfig","formattedCode","parser","err","warn","duration","outputSize","Buffer","byteLength","unknownTypeNodesRatio","successText","Number","toFixed","unsubscribe"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { debug } from 'node:console';
2
1
  import { mkdir } from 'node:fs/promises';
3
2
  import { dirname, isAbsolute, join } from 'node:path';
4
3
  import { env } from 'node:process';
5
4
  import { Worker } from 'node:worker_threads';
6
5
  import { WorkerChannelReceiver } from '@sanity/worker-channels';
7
6
  import { prepareConfig } from '../utils/config.js';
7
+ import { debug } from '../utils/debug.js';
8
8
  import { processTypegenWorkerStream } from './streamProcessor.js';
9
9
  /**
10
10
  * Runs a single typegen generation.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/actions/typegenGenerate.ts"],"sourcesContent":["import {debug} from 'node:console'\nimport {mkdir} from 'node:fs/promises'\nimport {dirname, isAbsolute, join} from 'node:path'\nimport {env} from 'node:process'\nimport {Worker} from 'node:worker_threads'\n\nimport {WorkerChannelReceiver} from '@sanity/worker-channels'\n\nimport {prepareConfig} from '../utils/config.js'\nimport {processTypegenWorkerStream} from './streamProcessor.js'\nimport {\n type GenerationResult,\n type RunTypegenOptions,\n TypegenGenerateTypesWorkerData,\n TypegenWorkerChannel,\n} from './types.js'\n\n/**\n * Runs a single typegen generation.\n *\n * This is the programmatic API for generating TypeScript types from GROQ queries.\n * It spawns a worker thread to perform the generation and displays progress via CLI spinners.\n *\n * @param options - Configuration options including typegen config and working directory\n * @returns Generation result containing the generated code and statistics\n */\nexport async function runTypegenGenerate(options: RunTypegenOptions): Promise<GenerationResult> {\n const {config, workDir} = options\n\n const {formatGeneratedCode, generates, overloadClientMethods, path, schema} =\n prepareConfig(config)\n\n const outputPath = isAbsolute(generates) ? generates : join(workDir, generates)\n\n // create output dir if it isn't there\n const outputDir = dirname(outputPath)\n await mkdir(outputDir, {recursive: true})\n\n // set up worker\n const workerPath = new URL('../actions/typegenGenerate.worker.js', import.meta.url)\n const workerData: TypegenGenerateTypesWorkerData = {\n overloadClientMethods,\n schemaPath: schema,\n searchPath: path,\n workDir,\n }\n const worker = new Worker(workerPath, {env, workerData})\n\n try {\n const result = await processTypegenWorkerStream(\n WorkerChannelReceiver.from<TypegenWorkerChannel>(worker),\n {\n formatGeneratedCode,\n generates: outputPath,\n overloadClientMethods,\n path,\n schema,\n },\n )\n\n return result\n } catch (err) {\n debug('error generating types', err)\n throw err\n } finally {\n worker.terminate()\n }\n}\n"],"names":["debug","mkdir","dirname","isAbsolute","join","env","Worker","WorkerChannelReceiver","prepareConfig","processTypegenWorkerStream","runTypegenGenerate","options","config","workDir","formatGeneratedCode","generates","overloadClientMethods","path","schema","outputPath","outputDir","recursive","workerPath","URL","url","workerData","schemaPath","searchPath","worker","result","from","err","terminate"],"mappings":"AAAA,SAAQA,KAAK,QAAO,eAAc;AAClC,SAAQC,KAAK,QAAO,mBAAkB;AACtC,SAAQC,OAAO,EAAEC,UAAU,EAAEC,IAAI,QAAO,YAAW;AACnD,SAAQC,GAAG,QAAO,eAAc;AAChC,SAAQC,MAAM,QAAO,sBAAqB;AAE1C,SAAQC,qBAAqB,QAAO,0BAAyB;AAE7D,SAAQC,aAAa,QAAO,qBAAoB;AAChD,SAAQC,0BAA0B,QAAO,uBAAsB;AAQ/D;;;;;;;;CAQC,GACD,OAAO,eAAeC,mBAAmBC,OAA0B;IACjE,MAAM,EAACC,MAAM,EAAEC,OAAO,EAAC,GAAGF;IAE1B,MAAM,EAACG,mBAAmB,EAAEC,SAAS,EAAEC,qBAAqB,EAAEC,IAAI,EAAEC,MAAM,EAAC,GACzEV,cAAcI;IAEhB,MAAMO,aAAahB,WAAWY,aAAaA,YAAYX,KAAKS,SAASE;IAErE,sCAAsC;IACtC,MAAMK,YAAYlB,QAAQiB;IAC1B,MAAMlB,MAAMmB,WAAW;QAACC,WAAW;IAAI;IAEvC,gBAAgB;IAChB,MAAMC,aAAa,IAAIC,IAAI,wCAAwC,YAAYC,GAAG;IAClF,MAAMC,aAA6C;QACjDT;QACAU,YAAYR;QACZS,YAAYV;QACZJ;IACF;IACA,MAAMe,SAAS,IAAItB,OAAOgB,YAAY;QAACjB;QAAKoB;IAAU;IAEtD,IAAI;QACF,MAAMI,SAAS,MAAMpB,2BACnBF,sBAAsBuB,IAAI,CAAuBF,SACjD;YACEd;YACAC,WAAWI;YACXH;YACAC;YACAC;QACF;QAGF,OAAOW;IACT,EAAE,OAAOE,KAAK;QACZ/B,MAAM,0BAA0B+B;QAChC,MAAMA;IACR,SAAU;QACRH,OAAOI,SAAS;IAClB;AACF"}
1
+ {"version":3,"sources":["../../src/actions/typegenGenerate.ts"],"sourcesContent":["import {mkdir} from 'node:fs/promises'\nimport {dirname, isAbsolute, join} from 'node:path'\nimport {env} from 'node:process'\nimport {Worker} from 'node:worker_threads'\n\nimport {WorkerChannelReceiver} from '@sanity/worker-channels'\n\nimport {prepareConfig} from '../utils/config.js'\nimport {debug} from '../utils/debug.js'\nimport {processTypegenWorkerStream} from './streamProcessor.js'\nimport {\n type GenerationResult,\n type RunTypegenOptions,\n TypegenGenerateTypesWorkerData,\n TypegenWorkerChannel,\n} from './types.js'\n\n/**\n * Runs a single typegen generation.\n *\n * This is the programmatic API for generating TypeScript types from GROQ queries.\n * It spawns a worker thread to perform the generation and displays progress via CLI spinners.\n *\n * @param options - Configuration options including typegen config and working directory\n * @returns Generation result containing the generated code and statistics\n */\nexport async function runTypegenGenerate(options: RunTypegenOptions): Promise<GenerationResult> {\n const {config, workDir} = options\n\n const {formatGeneratedCode, generates, overloadClientMethods, path, schema} =\n prepareConfig(config)\n\n const outputPath = isAbsolute(generates) ? generates : join(workDir, generates)\n\n // create output dir if it isn't there\n const outputDir = dirname(outputPath)\n await mkdir(outputDir, {recursive: true})\n\n // set up worker\n const workerPath = new URL('../actions/typegenGenerate.worker.js', import.meta.url)\n const workerData: TypegenGenerateTypesWorkerData = {\n overloadClientMethods,\n schemaPath: schema,\n searchPath: path,\n workDir,\n }\n const worker = new Worker(workerPath, {env, workerData})\n\n try {\n const result = await processTypegenWorkerStream(\n WorkerChannelReceiver.from<TypegenWorkerChannel>(worker),\n {\n formatGeneratedCode,\n generates: outputPath,\n overloadClientMethods,\n path,\n schema,\n },\n )\n\n return result\n } catch (err) {\n debug('error generating types', err)\n throw err\n } finally {\n worker.terminate()\n }\n}\n"],"names":["mkdir","dirname","isAbsolute","join","env","Worker","WorkerChannelReceiver","prepareConfig","debug","processTypegenWorkerStream","runTypegenGenerate","options","config","workDir","formatGeneratedCode","generates","overloadClientMethods","path","schema","outputPath","outputDir","recursive","workerPath","URL","url","workerData","schemaPath","searchPath","worker","result","from","err","terminate"],"mappings":"AAAA,SAAQA,KAAK,QAAO,mBAAkB;AACtC,SAAQC,OAAO,EAAEC,UAAU,EAAEC,IAAI,QAAO,YAAW;AACnD,SAAQC,GAAG,QAAO,eAAc;AAChC,SAAQC,MAAM,QAAO,sBAAqB;AAE1C,SAAQC,qBAAqB,QAAO,0BAAyB;AAE7D,SAAQC,aAAa,QAAO,qBAAoB;AAChD,SAAQC,KAAK,QAAO,oBAAmB;AACvC,SAAQC,0BAA0B,QAAO,uBAAsB;AAQ/D;;;;;;;;CAQC,GACD,OAAO,eAAeC,mBAAmBC,OAA0B;IACjE,MAAM,EAACC,MAAM,EAAEC,OAAO,EAAC,GAAGF;IAE1B,MAAM,EAACG,mBAAmB,EAAEC,SAAS,EAAEC,qBAAqB,EAAEC,IAAI,EAAEC,MAAM,EAAC,GACzEX,cAAcK;IAEhB,MAAMO,aAAajB,WAAWa,aAAaA,YAAYZ,KAAKU,SAASE;IAErE,sCAAsC;IACtC,MAAMK,YAAYnB,QAAQkB;IAC1B,MAAMnB,MAAMoB,WAAW;QAACC,WAAW;IAAI;IAEvC,gBAAgB;IAChB,MAAMC,aAAa,IAAIC,IAAI,wCAAwC,YAAYC,GAAG;IAClF,MAAMC,aAA6C;QACjDT;QACAU,YAAYR;QACZS,YAAYV;QACZJ;IACF;IACA,MAAMe,SAAS,IAAIvB,OAAOiB,YAAY;QAAClB;QAAKqB;IAAU;IAEtD,IAAI;QACF,MAAMI,SAAS,MAAMpB,2BACnBH,sBAAsBwB,IAAI,CAAuBF,SACjD;YACEd;YACAC,WAAWI;YACXH;YACAC;YACAC;QACF;QAGF,OAAOW;IACT,EAAE,OAAOE,KAAK;QACZvB,MAAM,0BAA0BuB;QAChC,MAAMA;IACR,SAAU;QACRH,OAAOI,SAAS;IAClB;AACF"}
@@ -1,5 +1,5 @@
1
1
  import { stat } from 'node:fs/promises';
2
- import path from 'node:path';
2
+ import { isAbsolute, join } from 'node:path';
3
3
  import { isMainThread, parentPort, workerData } from 'node:worker_threads';
4
4
  import { WorkerChannelReporter } from '@sanity/worker-channels';
5
5
  import { readSchema } from '../readSchema.js';
@@ -13,7 +13,7 @@ if (isMainThread || !parentPort) {
13
13
  registerBabel();
14
14
  async function main({ overloadClientMethods, schemaPath, searchPath, workDir }) {
15
15
  const report = WorkerChannelReporter.from(parentPort);
16
- const fullPath = path.join(workDir, schemaPath);
16
+ const fullPath = isAbsolute(schemaPath) ? schemaPath : join(workDir, schemaPath);
17
17
  try {
18
18
  const schemaStats = await stat(fullPath);
19
19
  if (!schemaStats.isFile()) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/actions/typegenGenerate.worker.ts"],"sourcesContent":["import {stat} from 'node:fs/promises'\nimport path from 'node:path'\nimport {isMainThread, parentPort, workerData} from 'node:worker_threads'\n\nimport {WorkerChannelReporter} from '@sanity/worker-channels'\n\nimport {readSchema} from '../readSchema.js'\nimport {findQueriesInPath} from '../typescript/findQueriesInPath.js'\nimport {getResolver} from '../typescript/moduleResolver.js'\nimport {registerBabel} from '../typescript/registerBabel.js'\nimport {TypeGenerator} from '../typescript/typeGenerator.js'\nimport {TypegenGenerateTypesWorkerData, TypegenWorkerChannel} from './types.js'\n\nif (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n}\n\nregisterBabel()\n\nasync function main({\n overloadClientMethods,\n schemaPath,\n searchPath,\n workDir,\n}: TypegenGenerateTypesWorkerData) {\n const report = WorkerChannelReporter.from<TypegenWorkerChannel>(parentPort)\n\n const fullPath = path.join(workDir, schemaPath)\n\n try {\n const schemaStats = await stat(fullPath)\n if (!schemaStats.isFile()) {\n throw new Error(`Schema path is not a file: ${schemaPath}`)\n }\n } catch (err) {\n if (err instanceof Error && 'code' in err && err.code === 'ENOENT') {\n // If the user has not provided a specific schema path (eg we're using the default), give some help\n const hint = schemaPath === './schema.json' ? ` - did you run \"sanity schema extract\"?` : ''\n throw new Error(`Schema file not found: ${fullPath}${hint}`, {cause: err})\n }\n throw err\n }\n\n const schema = await readSchema(fullPath)\n\n report.event.loadedSchema()\n\n const typeGenerator = new TypeGenerator()\n\n const {files, queries} = findQueriesInPath({\n path: searchPath,\n resolver: getResolver(workDir),\n })\n report.event.typegenStarted({expectedFileCount: files.length})\n\n const result = await typeGenerator.generateTypes({\n overloadClientMethods,\n queries,\n reporter: report,\n root: workDir,\n schema,\n schemaPath,\n })\n report.event.typegenComplete(result)\n}\n\nawait main(workerData)\n"],"names":["stat","path","isMainThread","parentPort","workerData","WorkerChannelReporter","readSchema","findQueriesInPath","getResolver","registerBabel","TypeGenerator","Error","main","overloadClientMethods","schemaPath","searchPath","workDir","report","from","fullPath","join","schemaStats","isFile","err","code","hint","cause","schema","event","loadedSchema","typeGenerator","files","queries","resolver","typegenStarted","expectedFileCount","length","result","generateTypes","reporter","root","typegenComplete"],"mappings":"AAAA,SAAQA,IAAI,QAAO,mBAAkB;AACrC,OAAOC,UAAU,YAAW;AAC5B,SAAQC,YAAY,EAAEC,UAAU,EAAEC,UAAU,QAAO,sBAAqB;AAExE,SAAQC,qBAAqB,QAAO,0BAAyB;AAE7D,SAAQC,UAAU,QAAO,mBAAkB;AAC3C,SAAQC,iBAAiB,QAAO,qCAAoC;AACpE,SAAQC,WAAW,QAAO,kCAAiC;AAC3D,SAAQC,aAAa,QAAO,iCAAgC;AAC5D,SAAQC,aAAa,QAAO,iCAAgC;AAG5D,IAAIR,gBAAgB,CAACC,YAAY;IAC/B,MAAM,IAAIQ,MAAM;AAClB;AAEAF;AAEA,eAAeG,KAAK,EAClBC,qBAAqB,EACrBC,UAAU,EACVC,UAAU,EACVC,OAAO,EACwB;IAC/B,MAAMC,SAASZ,sBAAsBa,IAAI,CAAuBf;IAEhE,MAAMgB,WAAWlB,KAAKmB,IAAI,CAACJ,SAASF;IAEpC,IAAI;QACF,MAAMO,cAAc,MAAMrB,KAAKmB;QAC/B,IAAI,CAACE,YAAYC,MAAM,IAAI;YACzB,MAAM,IAAIX,MAAM,CAAC,2BAA2B,EAAEG,YAAY;QAC5D;IACF,EAAE,OAAOS,KAAK;QACZ,IAAIA,eAAeZ,SAAS,UAAUY,OAAOA,IAAIC,IAAI,KAAK,UAAU;YAClE,mGAAmG;YACnG,MAAMC,OAAOX,eAAe,kBAAkB,CAAC,uCAAuC,CAAC,GAAG;YAC1F,MAAM,IAAIH,MAAM,CAAC,uBAAuB,EAAEQ,WAAWM,MAAM,EAAE;gBAACC,OAAOH;YAAG;QAC1E;QACA,MAAMA;IACR;IAEA,MAAMI,SAAS,MAAMrB,WAAWa;IAEhCF,OAAOW,KAAK,CAACC,YAAY;IAEzB,MAAMC,gBAAgB,IAAIpB;IAE1B,MAAM,EAACqB,KAAK,EAAEC,OAAO,EAAC,GAAGzB,kBAAkB;QACzCN,MAAMc;QACNkB,UAAUzB,YAAYQ;IACxB;IACAC,OAAOW,KAAK,CAACM,cAAc,CAAC;QAACC,mBAAmBJ,MAAMK,MAAM;IAAA;IAE5D,MAAMC,SAAS,MAAMP,cAAcQ,aAAa,CAAC;QAC/CzB;QACAmB;QACAO,UAAUtB;QACVuB,MAAMxB;QACNW;QACAb;IACF;IACAG,OAAOW,KAAK,CAACa,eAAe,CAACJ;AAC/B;AAEA,MAAMzB,KAAKR"}
1
+ {"version":3,"sources":["../../src/actions/typegenGenerate.worker.ts"],"sourcesContent":["import {stat} from 'node:fs/promises'\nimport {isAbsolute, join} from 'node:path'\nimport {isMainThread, parentPort, workerData} from 'node:worker_threads'\n\nimport {WorkerChannelReporter} from '@sanity/worker-channels'\n\nimport {readSchema} from '../readSchema.js'\nimport {findQueriesInPath} from '../typescript/findQueriesInPath.js'\nimport {getResolver} from '../typescript/moduleResolver.js'\nimport {registerBabel} from '../typescript/registerBabel.js'\nimport {TypeGenerator} from '../typescript/typeGenerator.js'\nimport {TypegenGenerateTypesWorkerData, TypegenWorkerChannel} from './types.js'\n\nif (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n}\n\nregisterBabel()\n\nasync function main({\n overloadClientMethods,\n schemaPath,\n searchPath,\n workDir,\n}: TypegenGenerateTypesWorkerData) {\n const report = WorkerChannelReporter.from<TypegenWorkerChannel>(parentPort)\n\n const fullPath = isAbsolute(schemaPath) ? schemaPath : join(workDir, schemaPath)\n\n try {\n const schemaStats = await stat(fullPath)\n if (!schemaStats.isFile()) {\n throw new Error(`Schema path is not a file: ${schemaPath}`)\n }\n } catch (err) {\n if (err instanceof Error && 'code' in err && err.code === 'ENOENT') {\n // If the user has not provided a specific schema path (eg we're using the default), give some help\n const hint = schemaPath === './schema.json' ? ` - did you run \"sanity schema extract\"?` : ''\n throw new Error(`Schema file not found: ${fullPath}${hint}`, {cause: err})\n }\n throw err\n }\n\n const schema = await readSchema(fullPath)\n\n report.event.loadedSchema()\n\n const typeGenerator = new TypeGenerator()\n\n const {files, queries} = findQueriesInPath({\n path: searchPath,\n resolver: getResolver(workDir),\n })\n report.event.typegenStarted({expectedFileCount: files.length})\n\n const result = await typeGenerator.generateTypes({\n overloadClientMethods,\n queries,\n reporter: report,\n root: workDir,\n schema,\n schemaPath,\n })\n report.event.typegenComplete(result)\n}\n\nawait main(workerData)\n"],"names":["stat","isAbsolute","join","isMainThread","parentPort","workerData","WorkerChannelReporter","readSchema","findQueriesInPath","getResolver","registerBabel","TypeGenerator","Error","main","overloadClientMethods","schemaPath","searchPath","workDir","report","from","fullPath","schemaStats","isFile","err","code","hint","cause","schema","event","loadedSchema","typeGenerator","files","queries","path","resolver","typegenStarted","expectedFileCount","length","result","generateTypes","reporter","root","typegenComplete"],"mappings":"AAAA,SAAQA,IAAI,QAAO,mBAAkB;AACrC,SAAQC,UAAU,EAAEC,IAAI,QAAO,YAAW;AAC1C,SAAQC,YAAY,EAAEC,UAAU,EAAEC,UAAU,QAAO,sBAAqB;AAExE,SAAQC,qBAAqB,QAAO,0BAAyB;AAE7D,SAAQC,UAAU,QAAO,mBAAkB;AAC3C,SAAQC,iBAAiB,QAAO,qCAAoC;AACpE,SAAQC,WAAW,QAAO,kCAAiC;AAC3D,SAAQC,aAAa,QAAO,iCAAgC;AAC5D,SAAQC,aAAa,QAAO,iCAAgC;AAG5D,IAAIR,gBAAgB,CAACC,YAAY;IAC/B,MAAM,IAAIQ,MAAM;AAClB;AAEAF;AAEA,eAAeG,KAAK,EAClBC,qBAAqB,EACrBC,UAAU,EACVC,UAAU,EACVC,OAAO,EACwB;IAC/B,MAAMC,SAASZ,sBAAsBa,IAAI,CAAuBf;IAEhE,MAAMgB,WAAWnB,WAAWc,cAAcA,aAAab,KAAKe,SAASF;IAErE,IAAI;QACF,MAAMM,cAAc,MAAMrB,KAAKoB;QAC/B,IAAI,CAACC,YAAYC,MAAM,IAAI;YACzB,MAAM,IAAIV,MAAM,CAAC,2BAA2B,EAAEG,YAAY;QAC5D;IACF,EAAE,OAAOQ,KAAK;QACZ,IAAIA,eAAeX,SAAS,UAAUW,OAAOA,IAAIC,IAAI,KAAK,UAAU;YAClE,mGAAmG;YACnG,MAAMC,OAAOV,eAAe,kBAAkB,CAAC,uCAAuC,CAAC,GAAG;YAC1F,MAAM,IAAIH,MAAM,CAAC,uBAAuB,EAAEQ,WAAWK,MAAM,EAAE;gBAACC,OAAOH;YAAG;QAC1E;QACA,MAAMA;IACR;IAEA,MAAMI,SAAS,MAAMpB,WAAWa;IAEhCF,OAAOU,KAAK,CAACC,YAAY;IAEzB,MAAMC,gBAAgB,IAAInB;IAE1B,MAAM,EAACoB,KAAK,EAAEC,OAAO,EAAC,GAAGxB,kBAAkB;QACzCyB,MAAMjB;QACNkB,UAAUzB,YAAYQ;IACxB;IACAC,OAAOU,KAAK,CAACO,cAAc,CAAC;QAACC,mBAAmBL,MAAMM,MAAM;IAAA;IAE5D,MAAMC,SAAS,MAAMR,cAAcS,aAAa,CAAC;QAC/CzB;QACAkB;QACAQ,UAAUtB;QACVuB,MAAMxB;QACNU;QACAZ;IACF;IACAG,OAAOU,KAAK,CAACc,eAAe,CAACJ;AAC/B;AAEA,MAAMzB,KAAKR"}
@@ -1,5 +1,6 @@
1
- import { debug, error } from 'node:console';
1
+ import { error, log } from 'node:console';
2
2
  import { isAbsolute, join, relative } from 'node:path';
3
+ import { chalk } from '@sanity/cli-core/ux';
3
4
  import chokidar from 'chokidar';
4
5
  import { debounce, mean } from 'lodash-es';
5
6
  import { prepareConfig } from '../utils/config.js';
@@ -57,9 +58,13 @@ const IGNORED_PATTERNS = [
57
58
  };
58
59
  const { runGeneration } = createTypegenRunner(async ()=>{
59
60
  try {
60
- const { duration } = await runTypegenGenerate(options);
61
+ const { duration } = await runTypegenGenerate({
62
+ ...options
63
+ });
61
64
  stats.successfulDurations.push(duration);
62
- } catch {
65
+ } catch (err) {
66
+ const errorMessage = err instanceof Error ? err.message : err;
67
+ error(` ${chalk.red('›')} ${errorMessage}`);
63
68
  stats.failedCount++;
64
69
  }
65
70
  });
@@ -86,7 +91,7 @@ const IGNORED_PATTERNS = [
86
91
  watcher.on('all', (event, filePath)=>{
87
92
  const timestamp = new Date().toLocaleTimeString();
88
93
  const relativePath = isAbsolute(filePath) ? relative(workDir, filePath) : filePath;
89
- debug(`[${timestamp}] ${event}: ${relativePath}`);
94
+ log(`[${timestamp}] ${event}: ${relativePath}`);
90
95
  debouncedGenerate();
91
96
  });
92
97
  watcher.on('error', (err)=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/actions/typegenWatch.ts"],"sourcesContent":["import {debug, error} from 'node:console'\nimport {isAbsolute, join, relative} from 'node:path'\n\nimport chokidar, {FSWatcher} from 'chokidar'\nimport {debounce, mean} from 'lodash-es'\n\nimport {TypegenWatchModeTraceAttributes} from '../typegen.telemetry.js'\nimport {prepareConfig} from '../utils/config.js'\nimport {runTypegenGenerate} from './typegenGenerate.js'\nimport {type RunTypegenOptions} from './types.js'\n\nconst IGNORED_PATTERNS = [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/lib/**',\n '**/.sanity/**',\n]\n\n/** State for tracking generation status */\nexport interface WatchState {\n isGenerating: boolean\n pendingGeneration: boolean\n}\n\n/** Return type for createTypegenRunner */\ninterface TypegenRunner {\n runGeneration: () => Promise<void>\n state: WatchState\n}\n\ntype WatcherStats = Omit<Extract<TypegenWatchModeTraceAttributes, {step: 'stopped'}>, 'step'>\n\n/**\n * Creates a typegen runner with concurrency control.\n * If generation is already running, queues one more generation to run after completion.\n * Multiple queued requests are coalesced into a single pending generation.\n */\nexport function createTypegenRunner(onGenerate: () => Promise<unknown>): TypegenRunner {\n const state: WatchState = {\n isGenerating: false,\n pendingGeneration: false,\n }\n\n async function runGeneration(): Promise<void> {\n if (state.isGenerating) {\n state.pendingGeneration = true\n return\n }\n\n state.isGenerating = true\n state.pendingGeneration = false\n\n try {\n await onGenerate()\n } finally {\n state.isGenerating = false\n\n // If a change came in during generation, run again\n if (state.pendingGeneration) {\n state.pendingGeneration = false\n await runGeneration()\n }\n }\n }\n\n return {runGeneration, state}\n}\n\n/**\n * Starts a file watcher that triggers typegen on changes.\n * Watches both query files (via patterns) and the schema JSON file.\n * Implements debouncing and concurrency control to prevent multiple generations.\n */\nexport function runTypegenWatcher(options: RunTypegenOptions): {\n getStats: () => WatcherStats\n stop: () => Promise<void>\n watcher: FSWatcher\n} {\n const {config, workDir} = options\n const {path, schema} = prepareConfig(config)\n\n const stats = {\n failedCount: 0,\n startTime: Date.now(),\n successfulDurations: [] as number[],\n }\n\n const {runGeneration} = createTypegenRunner(async () => {\n try {\n const {duration} = await runTypegenGenerate(options)\n stats.successfulDurations.push(duration)\n } catch {\n stats.failedCount++\n }\n })\n\n // Debounced generation trigger\n const debouncedGenerate = debounce(runGeneration, 1000)\n\n // Build absolute patterns for query files and schema file\n const paths = Array.isArray(path) ? path : [path]\n const absoluteQueryPatterns = paths.map((pattern) =>\n isAbsolute(pattern) ? pattern : join(workDir, pattern),\n )\n const absoluteSchemaPath = isAbsolute(schema) ? schema : join(workDir, schema)\n const watchTargets = [...absoluteQueryPatterns, absoluteSchemaPath]\n\n // perform initial generation\n debouncedGenerate()\n\n // set up watcher\n const watcher = chokidar.watch(watchTargets, {\n cwd: workDir,\n ignored: IGNORED_PATTERNS,\n ignoreInitial: true,\n })\n\n watcher.on('all', (event: string, filePath: string) => {\n const timestamp = new Date().toLocaleTimeString()\n const relativePath = isAbsolute(filePath) ? relative(workDir, filePath) : filePath\n debug(`[${timestamp}] ${event}: ${relativePath}`)\n debouncedGenerate()\n })\n\n watcher.on('error', (err: Error) => {\n error(`Watcher error: ${err.message}`)\n })\n\n return {\n getStats: () => ({\n averageGenerationDuration: mean(stats.successfulDurations) || 0,\n generationFailedCount: stats.failedCount,\n generationSuccessfulCount: stats.successfulDurations.length,\n watcherDuration: Date.now() - stats.startTime,\n }),\n stop: async () => {\n await watcher.close()\n },\n watcher,\n }\n}\n"],"names":["debug","error","isAbsolute","join","relative","chokidar","debounce","mean","prepareConfig","runTypegenGenerate","IGNORED_PATTERNS","createTypegenRunner","onGenerate","state","isGenerating","pendingGeneration","runGeneration","runTypegenWatcher","options","config","workDir","path","schema","stats","failedCount","startTime","Date","now","successfulDurations","duration","push","debouncedGenerate","paths","Array","isArray","absoluteQueryPatterns","map","pattern","absoluteSchemaPath","watchTargets","watcher","watch","cwd","ignored","ignoreInitial","on","event","filePath","timestamp","toLocaleTimeString","relativePath","err","message","getStats","averageGenerationDuration","generationFailedCount","generationSuccessfulCount","length","watcherDuration","stop","close"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/actions/typegenWatch.ts"],"sourcesContent":["import {error, log} from 'node:console'\nimport {isAbsolute, join, relative} from 'node:path'\n\nimport {chalk} from '@sanity/cli-core/ux'\nimport chokidar, {FSWatcher} from 'chokidar'\nimport {debounce, mean} from 'lodash-es'\n\nimport {TypegenWatchModeTraceAttributes} from '../typegen.telemetry.js'\nimport {prepareConfig} from '../utils/config.js'\nimport {runTypegenGenerate} from './typegenGenerate.js'\nimport {type RunTypegenOptions} from './types.js'\n\nconst IGNORED_PATTERNS = [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/lib/**',\n '**/.sanity/**',\n]\n\n/** State for tracking generation status */\nexport interface WatchState {\n isGenerating: boolean\n pendingGeneration: boolean\n}\n\n/** Return type for createTypegenRunner */\ninterface TypegenRunner {\n runGeneration: () => Promise<void>\n state: WatchState\n}\n\ntype WatcherStats = Omit<Extract<TypegenWatchModeTraceAttributes, {step: 'stopped'}>, 'step'>\n\n/**\n * Creates a typegen runner with concurrency control.\n * If generation is already running, queues one more generation to run after completion.\n * Multiple queued requests are coalesced into a single pending generation.\n */\nexport function createTypegenRunner(onGenerate: () => Promise<unknown>): TypegenRunner {\n const state: WatchState = {\n isGenerating: false,\n pendingGeneration: false,\n }\n\n async function runGeneration(): Promise<void> {\n if (state.isGenerating) {\n state.pendingGeneration = true\n return\n }\n\n state.isGenerating = true\n state.pendingGeneration = false\n\n try {\n await onGenerate()\n } finally {\n state.isGenerating = false\n\n // If a change came in during generation, run again\n if (state.pendingGeneration) {\n state.pendingGeneration = false\n await runGeneration()\n }\n }\n }\n\n return {runGeneration, state}\n}\n\n/**\n * Starts a file watcher that triggers typegen on changes.\n * Watches both query files (via patterns) and the schema JSON file.\n * Implements debouncing and concurrency control to prevent multiple generations.\n */\nexport function runTypegenWatcher(options: RunTypegenOptions): {\n getStats: () => WatcherStats\n stop: () => Promise<void>\n watcher: FSWatcher\n} {\n const {config, workDir} = options\n const {path, schema} = prepareConfig(config)\n\n const stats = {\n failedCount: 0,\n startTime: Date.now(),\n successfulDurations: [] as number[],\n }\n\n const {runGeneration} = createTypegenRunner(async () => {\n try {\n const {duration} = await runTypegenGenerate({...options})\n stats.successfulDurations.push(duration)\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : err\n error(` ${chalk.red('›')} ${errorMessage}`)\n stats.failedCount++\n }\n })\n\n // Debounced generation trigger\n const debouncedGenerate = debounce(runGeneration, 1000)\n\n // Build absolute patterns for query files and schema file\n const paths = Array.isArray(path) ? path : [path]\n const absoluteQueryPatterns = paths.map((pattern) =>\n isAbsolute(pattern) ? pattern : join(workDir, pattern),\n )\n const absoluteSchemaPath = isAbsolute(schema) ? schema : join(workDir, schema)\n const watchTargets = [...absoluteQueryPatterns, absoluteSchemaPath]\n\n // perform initial generation\n debouncedGenerate()\n\n // set up watcher\n const watcher = chokidar.watch(watchTargets, {\n cwd: workDir,\n ignored: IGNORED_PATTERNS,\n ignoreInitial: true,\n })\n\n watcher.on('all', (event: string, filePath: string) => {\n const timestamp = new Date().toLocaleTimeString()\n const relativePath = isAbsolute(filePath) ? relative(workDir, filePath) : filePath\n log(`[${timestamp}] ${event}: ${relativePath}`)\n debouncedGenerate()\n })\n\n watcher.on('error', (err: Error) => {\n error(`Watcher error: ${err.message}`)\n })\n\n return {\n getStats: () => ({\n averageGenerationDuration: mean(stats.successfulDurations) || 0,\n generationFailedCount: stats.failedCount,\n generationSuccessfulCount: stats.successfulDurations.length,\n watcherDuration: Date.now() - stats.startTime,\n }),\n stop: async () => {\n await watcher.close()\n },\n watcher,\n }\n}\n"],"names":["error","log","isAbsolute","join","relative","chalk","chokidar","debounce","mean","prepareConfig","runTypegenGenerate","IGNORED_PATTERNS","createTypegenRunner","onGenerate","state","isGenerating","pendingGeneration","runGeneration","runTypegenWatcher","options","config","workDir","path","schema","stats","failedCount","startTime","Date","now","successfulDurations","duration","push","err","errorMessage","Error","message","red","debouncedGenerate","paths","Array","isArray","absoluteQueryPatterns","map","pattern","absoluteSchemaPath","watchTargets","watcher","watch","cwd","ignored","ignoreInitial","on","event","filePath","timestamp","toLocaleTimeString","relativePath","getStats","averageGenerationDuration","generationFailedCount","generationSuccessfulCount","length","watcherDuration","stop","close"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  import { stat } from 'node:fs/promises';
2
2
  import { Flags } from '@oclif/core';
3
- import { SanityCommand, subdebug } from '@sanity/cli-core';
3
+ import { SanityCommand } from '@sanity/cli-core';
4
4
  import { chalk, spinner } from '@sanity/cli-core/ux';
5
5
  import { omit, once } from 'lodash-es';
6
6
  import { runTypegenGenerate } from '../../actions/typegenGenerate.js';
7
7
  import { runTypegenWatcher } from '../../actions/typegenWatch.js';
8
8
  import { configDefinition, readConfig } from '../../readConfig.js';
9
9
  import { TypegenWatchModeTrace, TypesGeneratedTrace } from '../../typegen.telemetry.js';
10
+ import { debug } from '../../utils/debug.js';
10
11
  import { promiseWithResolvers } from '../../utils/promiseWithResolvers.js';
11
12
  import { telemetry } from '../../utils/telemetryLogger.js';
12
- const debug = subdebug('typegen:generate');
13
13
  const description = `Sanity TypeGen (Beta)
14
14
  This command is currently in beta and may undergo significant changes. Feedback is welcome!
15
15
 
@@ -59,62 +59,71 @@ ${chalk.bold('Note:')}
59
59
  }
60
60
  async getConfig() {
61
61
  const spin = spinner({}).start('Loading config…');
62
- const { flags } = await this.parse(TypegenGenerateCommand);
63
- const rootDir = await this.getProjectRoot();
64
- const config = await this.getCliConfig();
65
- const configPath = flags['config-path'];
66
- const workDir = rootDir.directory;
67
- // check if the legacy config exist
68
- const legacyConfigPath = configPath || 'sanity-typegen.json';
69
- let hasLegacyConfig = false;
70
62
  try {
71
- const file = await stat(legacyConfigPath);
72
- hasLegacyConfig = file.isFile();
73
- } catch (err) {
74
- if (err instanceof Error && 'code' in err && err.code === 'ENOENT' && configPath) {
75
- throw new Error(`Typegen config file not found: ${configPath}`, {
76
- cause: err
77
- });
63
+ const { flags } = await this.parse(TypegenGenerateCommand);
64
+ const rootDir = await this.getProjectRoot();
65
+ const config = await this.getCliConfig();
66
+ const configPath = flags['config-path'];
67
+ const workDir = rootDir.directory;
68
+ // check if the legacy config exist
69
+ const legacyConfigPath = configPath || 'sanity-typegen.json';
70
+ let hasLegacyConfig = false;
71
+ try {
72
+ const file = await stat(legacyConfigPath);
73
+ hasLegacyConfig = file.isFile();
74
+ } catch (err) {
75
+ if (err instanceof Error && 'code' in err && err.code === 'ENOENT' && configPath) {
76
+ spin.fail();
77
+ this.error(`Typegen config file not found: ${configPath}`, {
78
+ exit: 1
79
+ });
80
+ }
81
+ if (err instanceof Error && 'code' in err && err.code !== 'ENOENT') {
82
+ spin.fail();
83
+ this.error(`Error when checking if typegen config file exists: ${legacyConfigPath}`, {
84
+ exit: 1
85
+ });
86
+ }
78
87
  }
79
- if (err instanceof Error && 'code' in err && err.code !== 'ENOENT') {
80
- throw new Error(`Error when checking if typegen config file exists: ${legacyConfigPath}`, {
81
- cause: err
82
- });
88
+ // we have both legacy and cli config with typegen
89
+ if (config?.typegen && hasLegacyConfig) {
90
+ spin.warn(chalk.yellow(`You've specified typegen in your Sanity CLI config, but also have a typegen config.
91
+
92
+ The config from the Sanity CLI config is used.
93
+ `));
94
+ return {
95
+ config: configDefinition.parse(config.typegen || {}),
96
+ path: rootDir.path,
97
+ type: 'cli',
98
+ workDir
99
+ };
83
100
  }
84
- }
85
- // we have both legacy and cli config with typegen
86
- if (config?.typegen && hasLegacyConfig) {
87
- spin.warn(chalk.yellow(`You've specified typegen in your Sanity CLI config, but also have a typegen config.
101
+ // we only have legacy typegen config
102
+ if (hasLegacyConfig) {
103
+ spin.warn(chalk.yellow(`The separate typegen config has been deprecated. Use \`typegen\` in the sanity CLI config instead.
88
104
 
89
- The config from the Sanity CLI config is used.
90
- `));
105
+ See: https://www.sanity.io/docs/help/configuring-typegen-in-sanity-cli-config`));
106
+ return {
107
+ config: await readConfig(legacyConfigPath),
108
+ path: legacyConfigPath,
109
+ type: 'legacy',
110
+ workDir
111
+ };
112
+ }
113
+ spin.succeed(`Config loaded from sanity.cli.ts`);
114
+ // we only have cli config
91
115
  return {
92
116
  config: configDefinition.parse(config.typegen || {}),
93
117
  path: rootDir.path,
94
118
  type: 'cli',
95
119
  workDir
96
120
  };
121
+ } catch (err) {
122
+ spin.fail();
123
+ this.error(`An error occured during config loading ${err}`, {
124
+ exit: 1
125
+ });
97
126
  }
98
- // we only have legacy typegen config
99
- if (hasLegacyConfig) {
100
- spin.warn(chalk.yellow(`The separate typegen config has been deprecated. Use \`typegen\` in the sanity CLI config instead.
101
-
102
- See: https://www.sanity.io/docs/help/configuring-typegen-in-sanity-cli-config`));
103
- return {
104
- config: await readConfig(legacyConfigPath),
105
- path: legacyConfigPath,
106
- type: 'legacy',
107
- workDir
108
- };
109
- }
110
- spin.succeed(`Config loaded from sanity.cli.ts`);
111
- // we only have cli config
112
- return {
113
- config: configDefinition.parse(config.typegen || {}),
114
- path: rootDir.path,
115
- type: 'cli',
116
- workDir
117
- };
118
127
  }
119
128
  async runSingle() {
120
129
  const trace = telemetry.trace(TypesGeneratedTrace);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/typegen/generate.ts"],"sourcesContent":["import {stat} from 'node:fs/promises'\n\nimport {Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {chalk, spinner} from '@sanity/cli-core/ux'\nimport {omit, once} from 'lodash-es'\n\nimport {runTypegenGenerate} from '../../actions/typegenGenerate.js'\nimport {runTypegenWatcher} from '../../actions/typegenWatch.js'\nimport {configDefinition, readConfig, type TypeGenConfig} from '../../readConfig.js'\nimport {TypegenWatchModeTrace, TypesGeneratedTrace} from '../../typegen.telemetry.js'\nimport {promiseWithResolvers} from '../../utils/promiseWithResolvers.js'\nimport {telemetry} from '../../utils/telemetryLogger.js'\n\nconst debug = subdebug('typegen:generate')\n\nconst description = `Sanity TypeGen (Beta)\nThis command is currently in beta and may undergo significant changes. Feedback is welcome!\n\n${chalk.bold('Configuration:')}\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${chalk.bold('Note:')}\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.\n- While this tool is in beta, we encourage you to experiment with these configurations and provide feedback to help improve its functionality and usability.`.trim()\n\n/**\n * @internal\n */\nexport class TypegenGenerateCommand extends SanityCommand<typeof TypegenGenerateCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: `Generate TypeScript type definitions from a Sanity Studio schema extracted using the \\`sanity schema extract\\` command.`,\n },\n ]\n\n static override flags = {\n 'config-path': Flags.string({\n description:\n '[Default: sanity-typegen.json] Specifies the path to the typegen configuration file. This file should be a JSON file that contains settings for the type generation process.',\n }),\n watch: Flags.boolean({\n default: false,\n description: '[Default: false] Run the typegen in watch mode',\n }),\n }\n\n public async run() {\n const {flags} = await this.parse(TypegenGenerateCommand)\n\n if (flags.watch) {\n await this.runWatcher()\n return\n }\n\n await this.runSingle()\n }\n\n private async getConfig(): Promise<{\n config: TypeGenConfig\n path?: string\n type: 'cli' | 'legacy'\n workDir: string\n }> {\n const spin = spinner({}).start('Loading config…')\n\n const {flags} = await this.parse(TypegenGenerateCommand)\n const rootDir = await this.getProjectRoot()\n const config = await this.getCliConfig()\n\n const configPath = flags['config-path']\n const workDir = rootDir.directory\n\n // check if the legacy config exist\n const legacyConfigPath = configPath || 'sanity-typegen.json'\n let hasLegacyConfig = false\n try {\n const file = await stat(legacyConfigPath)\n hasLegacyConfig = file.isFile()\n } catch (err) {\n if (err instanceof Error && 'code' in err && err.code === 'ENOENT' && configPath) {\n throw new Error(`Typegen config file not found: ${configPath}`, {cause: err})\n }\n\n if (err instanceof Error && 'code' in err && err.code !== 'ENOENT') {\n throw new Error(`Error when checking if typegen config file exists: ${legacyConfigPath}`, {\n cause: err,\n })\n }\n }\n\n // we have both legacy and cli config with typegen\n if (config?.typegen && hasLegacyConfig) {\n spin.warn(\n chalk.yellow(\n `You've specified typegen in your Sanity CLI config, but also have a typegen config.\n\n The config from the Sanity CLI config is used.\n `,\n ),\n )\n\n return {\n config: configDefinition.parse(config.typegen || {}),\n path: rootDir.path,\n type: 'cli',\n workDir,\n }\n }\n\n // we only have legacy typegen config\n if (hasLegacyConfig) {\n spin.warn(\n chalk.yellow(\n `The separate typegen config has been deprecated. Use \\`typegen\\` in the sanity CLI config instead.\n\n See: https://www.sanity.io/docs/help/configuring-typegen-in-sanity-cli-config`,\n ),\n )\n return {\n config: await readConfig(legacyConfigPath),\n path: legacyConfigPath,\n type: 'legacy',\n workDir,\n }\n }\n\n spin.succeed(`Config loaded from sanity.cli.ts`)\n\n // we only have cli config\n return {\n config: configDefinition.parse(config.typegen || {}),\n path: rootDir.path,\n type: 'cli',\n workDir,\n }\n }\n\n private async runSingle() {\n const trace = telemetry.trace(TypesGeneratedTrace)\n\n try {\n const {config: typegenConfig, type: typegenConfigMethod, workDir} = await this.getConfig()\n trace.start()\n\n const result = await runTypegenGenerate({\n config: typegenConfig,\n workDir,\n })\n\n const traceStats = omit(result, 'code', 'duration')\n\n trace.log({\n configMethod: typegenConfigMethod,\n configOverloadClientMethods: typegenConfig.overloadClientMethods,\n ...traceStats,\n })\n trace.complete()\n } catch (error) {\n debug(error)\n trace.error(error as Error)\n this.error(`${error instanceof Error ? error.message : 'Unknown error'}`, {\n exit: 1,\n })\n }\n }\n\n private async runWatcher() {\n const trace = telemetry.trace(TypegenWatchModeTrace)\n\n try {\n const {config: typegenConfig, workDir} = await this.getConfig()\n trace.start()\n\n const {promise, resolve} = promiseWithResolvers()\n\n const typegenWatcher = runTypegenWatcher({\n config: typegenConfig,\n workDir,\n })\n\n const stop = once(async () => {\n process.off('SIGINT', stop)\n process.off('SIGTERM', stop)\n\n trace.log({\n step: 'stopped',\n ...typegenWatcher.getStats(),\n })\n trace.complete()\n\n await typegenWatcher.stop()\n resolve()\n })\n\n process.on('SIGINT', stop)\n process.on('SIGTERM', stop)\n\n await promise\n } catch (error) {\n debug(error)\n trace.error(error as Error)\n this.error(`${error instanceof Error ? error.message : 'Unknown error'}`, {\n exit: 1,\n })\n }\n }\n}\n"],"names":["stat","Flags","SanityCommand","subdebug","chalk","spinner","omit","once","runTypegenGenerate","runTypegenWatcher","configDefinition","readConfig","TypegenWatchModeTrace","TypesGeneratedTrace","promiseWithResolvers","telemetry","debug","description","bold","trim","TypegenGenerateCommand","examples","command","flags","string","watch","boolean","default","run","parse","runWatcher","runSingle","getConfig","spin","start","rootDir","getProjectRoot","config","getCliConfig","configPath","workDir","directory","legacyConfigPath","hasLegacyConfig","file","isFile","err","Error","code","cause","typegen","warn","yellow","path","type","succeed","trace","typegenConfig","typegenConfigMethod","result","traceStats","log","configMethod","configOverloadClientMethods","overloadClientMethods","complete","error","message","exit","promise","resolve","typegenWatcher","stop","process","off","step","getStats","on"],"mappings":"AAAA,SAAQA,IAAI,QAAO,mBAAkB;AAErC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,KAAK,EAAEC,OAAO,QAAO,sBAAqB;AAClD,SAAQC,IAAI,EAAEC,IAAI,QAAO,YAAW;AAEpC,SAAQC,kBAAkB,QAAO,mCAAkC;AACnE,SAAQC,iBAAiB,QAAO,gCAA+B;AAC/D,SAAQC,gBAAgB,EAAEC,UAAU,QAA2B,sBAAqB;AACpF,SAAQC,qBAAqB,EAAEC,mBAAmB,QAAO,6BAA4B;AACrF,SAAQC,oBAAoB,QAAO,sCAAqC;AACxE,SAAQC,SAAS,QAAO,iCAAgC;AAExD,MAAMC,QAAQb,SAAS;AAEvB,MAAMc,cAAc,CAAC;;;AAGrB,EAAEb,MAAMc,IAAI,CAAC,kBAAkB;;;;;;;;;;;;;;AAc/B,EAAEd,MAAMc,IAAI,CAAC,SAAS;;4JAEsI,CAAC,CAACC,IAAI;AAElK;;CAEC,GACD,OAAO,MAAMC,+BAA+BlB;IAC1C,OAAgBe,cAAcA,YAAW;IAEzC,OAAgBI,WAAW;QACzB;YACEC,SAAS;YACTL,aAAa,CAAC,uHAAuH,CAAC;QACxI;KACD,CAAA;IAED,OAAgBM,QAAQ;QACtB,eAAetB,MAAMuB,MAAM,CAAC;YAC1BP,aACE;QACJ;QACAQ,OAAOxB,MAAMyB,OAAO,CAAC;YACnBC,SAAS;YACTV,aAAa;QACf;IACF,EAAC;IAED,MAAaW,MAAM;QACjB,MAAM,EAACL,KAAK,EAAC,GAAG,MAAM,IAAI,CAACM,KAAK,CAACT;QAEjC,IAAIG,MAAME,KAAK,EAAE;YACf,MAAM,IAAI,CAACK,UAAU;YACrB;QACF;QAEA,MAAM,IAAI,CAACC,SAAS;IACtB;IAEA,MAAcC,YAKX;QACD,MAAMC,OAAO5B,QAAQ,CAAC,GAAG6B,KAAK,CAAC;QAE/B,MAAM,EAACX,KAAK,EAAC,GAAG,MAAM,IAAI,CAACM,KAAK,CAACT;QACjC,MAAMe,UAAU,MAAM,IAAI,CAACC,cAAc;QACzC,MAAMC,SAAS,MAAM,IAAI,CAACC,YAAY;QAEtC,MAAMC,aAAahB,KAAK,CAAC,cAAc;QACvC,MAAMiB,UAAUL,QAAQM,SAAS;QAEjC,mCAAmC;QACnC,MAAMC,mBAAmBH,cAAc;QACvC,IAAII,kBAAkB;QACtB,IAAI;YACF,MAAMC,OAAO,MAAM5C,KAAK0C;YACxBC,kBAAkBC,KAAKC,MAAM;QAC/B,EAAE,OAAOC,KAAK;YACZ,IAAIA,eAAeC,SAAS,UAAUD,OAAOA,IAAIE,IAAI,KAAK,YAAYT,YAAY;gBAChF,MAAM,IAAIQ,MAAM,CAAC,+BAA+B,EAAER,YAAY,EAAE;oBAACU,OAAOH;gBAAG;YAC7E;YAEA,IAAIA,eAAeC,SAAS,UAAUD,OAAOA,IAAIE,IAAI,KAAK,UAAU;gBAClE,MAAM,IAAID,MAAM,CAAC,mDAAmD,EAAEL,kBAAkB,EAAE;oBACxFO,OAAOH;gBACT;YACF;QACF;QAEA,kDAAkD;QAClD,IAAIT,QAAQa,WAAWP,iBAAiB;YACtCV,KAAKkB,IAAI,CACP/C,MAAMgD,MAAM,CACV,CAAC;;;EAGT,CAAC;YAIG,OAAO;gBACLf,QAAQ3B,iBAAiBmB,KAAK,CAACQ,OAAOa,OAAO,IAAI,CAAC;gBAClDG,MAAMlB,QAAQkB,IAAI;gBAClBC,MAAM;gBACNd;YACF;QACF;QAEA,qCAAqC;QACrC,IAAIG,iBAAiB;YACnBV,KAAKkB,IAAI,CACP/C,MAAMgD,MAAM,CACV,CAAC;;+EAEoE,CAAC;YAG1E,OAAO;gBACLf,QAAQ,MAAM1B,WAAW+B;gBACzBW,MAAMX;gBACNY,MAAM;gBACNd;YACF;QACF;QAEAP,KAAKsB,OAAO,CAAC,CAAC,gCAAgC,CAAC;QAE/C,0BAA0B;QAC1B,OAAO;YACLlB,QAAQ3B,iBAAiBmB,KAAK,CAACQ,OAAOa,OAAO,IAAI,CAAC;YAClDG,MAAMlB,QAAQkB,IAAI;YAClBC,MAAM;YACNd;QACF;IACF;IAEA,MAAcT,YAAY;QACxB,MAAMyB,QAAQzC,UAAUyC,KAAK,CAAC3C;QAE9B,IAAI;YACF,MAAM,EAACwB,QAAQoB,aAAa,EAAEH,MAAMI,mBAAmB,EAAElB,OAAO,EAAC,GAAG,MAAM,IAAI,CAACR,SAAS;YACxFwB,MAAMtB,KAAK;YAEX,MAAMyB,SAAS,MAAMnD,mBAAmB;gBACtC6B,QAAQoB;gBACRjB;YACF;YAEA,MAAMoB,aAAatD,KAAKqD,QAAQ,QAAQ;YAExCH,MAAMK,GAAG,CAAC;gBACRC,cAAcJ;gBACdK,6BAA6BN,cAAcO,qBAAqB;gBAChE,GAAGJ,UAAU;YACf;YACAJ,MAAMS,QAAQ;QAChB,EAAE,OAAOC,OAAO;YACdlD,MAAMkD;YACNV,MAAMU,KAAK,CAACA;YACZ,IAAI,CAACA,KAAK,CAAC,GAAGA,iBAAiBnB,QAAQmB,MAAMC,OAAO,GAAG,iBAAiB,EAAE;gBACxEC,MAAM;YACR;QACF;IACF;IAEA,MAActC,aAAa;QACzB,MAAM0B,QAAQzC,UAAUyC,KAAK,CAAC5C;QAE9B,IAAI;YACF,MAAM,EAACyB,QAAQoB,aAAa,EAAEjB,OAAO,EAAC,GAAG,MAAM,IAAI,CAACR,SAAS;YAC7DwB,MAAMtB,KAAK;YAEX,MAAM,EAACmC,OAAO,EAAEC,OAAO,EAAC,GAAGxD;YAE3B,MAAMyD,iBAAiB9D,kBAAkB;gBACvC4B,QAAQoB;gBACRjB;YACF;YAEA,MAAMgC,OAAOjE,KAAK;gBAChBkE,QAAQC,GAAG,CAAC,UAAUF;gBACtBC,QAAQC,GAAG,CAAC,WAAWF;gBAEvBhB,MAAMK,GAAG,CAAC;oBACRc,MAAM;oBACN,GAAGJ,eAAeK,QAAQ,EAAE;gBAC9B;gBACApB,MAAMS,QAAQ;gBAEd,MAAMM,eAAeC,IAAI;gBACzBF;YACF;YAEAG,QAAQI,EAAE,CAAC,UAAUL;YACrBC,QAAQI,EAAE,CAAC,WAAWL;YAEtB,MAAMH;QACR,EAAE,OAAOH,OAAO;YACdlD,MAAMkD;YACNV,MAAMU,KAAK,CAACA;YACZ,IAAI,CAACA,KAAK,CAAC,GAAGA,iBAAiBnB,QAAQmB,MAAMC,OAAO,GAAG,iBAAiB,EAAE;gBACxEC,MAAM;YACR;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/typegen/generate.ts"],"sourcesContent":["import {stat} from 'node:fs/promises'\n\nimport {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {chalk, spinner} from '@sanity/cli-core/ux'\nimport {omit, once} from 'lodash-es'\n\nimport {runTypegenGenerate} from '../../actions/typegenGenerate.js'\nimport {runTypegenWatcher} from '../../actions/typegenWatch.js'\nimport {configDefinition, readConfig, type TypeGenConfig} from '../../readConfig.js'\nimport {TypegenWatchModeTrace, TypesGeneratedTrace} from '../../typegen.telemetry.js'\nimport {debug} from '../../utils/debug.js'\nimport {promiseWithResolvers} from '../../utils/promiseWithResolvers.js'\nimport {telemetry} from '../../utils/telemetryLogger.js'\n\nconst description = `Sanity TypeGen (Beta)\nThis command is currently in beta and may undergo significant changes. Feedback is welcome!\n\n${chalk.bold('Configuration:')}\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${chalk.bold('Note:')}\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.\n- While this tool is in beta, we encourage you to experiment with these configurations and provide feedback to help improve its functionality and usability.`.trim()\n\n/**\n * @internal\n */\nexport class TypegenGenerateCommand extends SanityCommand<typeof TypegenGenerateCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: `Generate TypeScript type definitions from a Sanity Studio schema extracted using the \\`sanity schema extract\\` command.`,\n },\n ]\n\n static override flags = {\n 'config-path': Flags.string({\n description:\n '[Default: sanity-typegen.json] Specifies the path to the typegen configuration file. This file should be a JSON file that contains settings for the type generation process.',\n }),\n watch: Flags.boolean({\n default: false,\n description: '[Default: false] Run the typegen in watch mode',\n }),\n }\n\n public async run() {\n const {flags} = await this.parse(TypegenGenerateCommand)\n\n if (flags.watch) {\n await this.runWatcher()\n return\n }\n\n await this.runSingle()\n }\n\n private async getConfig(): Promise<{\n config: TypeGenConfig\n path?: string\n type: 'cli' | 'legacy'\n workDir: string\n }> {\n const spin = spinner({}).start('Loading config…')\n\n try {\n const {flags} = await this.parse(TypegenGenerateCommand)\n const rootDir = await this.getProjectRoot()\n const config = await this.getCliConfig()\n\n const configPath = flags['config-path']\n const workDir = rootDir.directory\n\n // check if the legacy config exist\n const legacyConfigPath = configPath || 'sanity-typegen.json'\n let hasLegacyConfig = false\n\n try {\n const file = await stat(legacyConfigPath)\n hasLegacyConfig = file.isFile()\n } catch (err) {\n if (err instanceof Error && 'code' in err && err.code === 'ENOENT' && configPath) {\n spin.fail()\n this.error(`Typegen config file not found: ${configPath}`, {exit: 1})\n }\n\n if (err instanceof Error && 'code' in err && err.code !== 'ENOENT') {\n spin.fail()\n this.error(`Error when checking if typegen config file exists: ${legacyConfigPath}`, {\n exit: 1,\n })\n }\n }\n\n // we have both legacy and cli config with typegen\n if (config?.typegen && hasLegacyConfig) {\n spin.warn(\n chalk.yellow(\n `You've specified typegen in your Sanity CLI config, but also have a typegen config.\n\n The config from the Sanity CLI config is used.\n `,\n ),\n )\n\n return {\n config: configDefinition.parse(config.typegen || {}),\n path: rootDir.path,\n type: 'cli',\n workDir,\n }\n }\n\n // we only have legacy typegen config\n if (hasLegacyConfig) {\n spin.warn(\n chalk.yellow(\n `The separate typegen config has been deprecated. Use \\`typegen\\` in the sanity CLI config instead.\n\n See: https://www.sanity.io/docs/help/configuring-typegen-in-sanity-cli-config`,\n ),\n )\n return {\n config: await readConfig(legacyConfigPath),\n path: legacyConfigPath,\n type: 'legacy',\n workDir,\n }\n }\n\n spin.succeed(`Config loaded from sanity.cli.ts`)\n\n // we only have cli config\n return {\n config: configDefinition.parse(config.typegen || {}),\n path: rootDir.path,\n type: 'cli',\n workDir,\n }\n } catch (err) {\n spin.fail()\n this.error(`An error occured during config loading ${err}`, {exit: 1})\n }\n }\n\n private async runSingle() {\n const trace = telemetry.trace(TypesGeneratedTrace)\n\n try {\n const {config: typegenConfig, type: typegenConfigMethod, workDir} = await this.getConfig()\n trace.start()\n\n const result = await runTypegenGenerate({\n config: typegenConfig,\n workDir,\n })\n\n const traceStats = omit(result, 'code', 'duration')\n\n trace.log({\n configMethod: typegenConfigMethod,\n configOverloadClientMethods: typegenConfig.overloadClientMethods,\n ...traceStats,\n })\n trace.complete()\n } catch (error) {\n debug(error)\n trace.error(error as Error)\n this.error(`${error instanceof Error ? error.message : 'Unknown error'}`, {\n exit: 1,\n })\n }\n }\n\n private async runWatcher() {\n const trace = telemetry.trace(TypegenWatchModeTrace)\n\n try {\n const {config: typegenConfig, workDir} = await this.getConfig()\n trace.start()\n\n const {promise, resolve} = promiseWithResolvers()\n\n const typegenWatcher = runTypegenWatcher({\n config: typegenConfig,\n workDir,\n })\n\n const stop = once(async () => {\n process.off('SIGINT', stop)\n process.off('SIGTERM', stop)\n\n trace.log({\n step: 'stopped',\n ...typegenWatcher.getStats(),\n })\n trace.complete()\n\n await typegenWatcher.stop()\n resolve()\n })\n\n process.on('SIGINT', stop)\n process.on('SIGTERM', stop)\n\n await promise\n } catch (error) {\n debug(error)\n trace.error(error as Error)\n this.error(`${error instanceof Error ? error.message : 'Unknown error'}`, {\n exit: 1,\n })\n }\n }\n}\n"],"names":["stat","Flags","SanityCommand","chalk","spinner","omit","once","runTypegenGenerate","runTypegenWatcher","configDefinition","readConfig","TypegenWatchModeTrace","TypesGeneratedTrace","debug","promiseWithResolvers","telemetry","description","bold","trim","TypegenGenerateCommand","examples","command","flags","string","watch","boolean","default","run","parse","runWatcher","runSingle","getConfig","spin","start","rootDir","getProjectRoot","config","getCliConfig","configPath","workDir","directory","legacyConfigPath","hasLegacyConfig","file","isFile","err","Error","code","fail","error","exit","typegen","warn","yellow","path","type","succeed","trace","typegenConfig","typegenConfigMethod","result","traceStats","log","configMethod","configOverloadClientMethods","overloadClientMethods","complete","message","promise","resolve","typegenWatcher","stop","process","off","step","getStats","on"],"mappings":"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"}
@@ -16,6 +16,7 @@ export class SchemaTypeGenerator {
16
16
  tsType
17
17
  };
18
18
  });
19
+ arrayOfUsed = false;
19
20
  identifiers = new Map();
20
21
  tsTypes = new Map();
21
22
  constructor(schema){
@@ -50,6 +51,9 @@ export class SchemaTypeGenerator {
50
51
  hasType(typeName) {
51
52
  return this.tsTypes.has(typeName);
52
53
  }
54
+ isArrayOfUsed() {
55
+ return this.arrayOfUsed;
56
+ }
53
57
  *[Symbol.iterator]() {
54
58
  for (const { name } of this.schema){
55
59
  yield {
@@ -65,6 +69,7 @@ export class SchemaTypeGenerator {
65
69
  * Helper function used to generate TS types for arrays of inline types, or arrays of inline types
66
70
  * wrapped in the ArrayOf wrapper that adds _key prop
67
71
  */ generateArrayOfTsType(typeNode) {
72
+ this.arrayOfUsed = true;
68
73
  const typeNodes = this.generateTsType(typeNode.of);
69
74
  return t.tsTypeReference(ARRAY_OF, t.tsTypeParameterInstantiation([
70
75
  typeNodes
@@ -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 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 *[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 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","identifiers","Map","tsTypes","uniqueTypeNames","Set","type","has","name","Error","add","currentIdentifierNames","values","map","id","uniqueIdentifier","set","getType","typeName","get","undefined","hasType","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":"AAAA,YAAYA,OAAO,eAAc;AACjC,SAQEC,YAAY,QAGP,UAAS;AAEhB,SAAQC,cAAc,QAAO,uBAAsB;AACnD,SAAQC,QAAQ,EAAEC,yBAAyB,QAAO,iBAAgB;AAClE,SACEC,uBAAuB,EACvBC,0BAA0B,EAC1BC,gBAAgB,EAChBC,WAAW,QACN,eAAc;AAGrB,OAAO,MAAMC;IACKC,OAAkB;IAClCC,gBAAgBH,YACd,+DAA+D;IAC/D,CAAC,EAACI,KAAK,EAAgC;QACrC,MAAMC,MAAMX,eAAeU;QAC3B,MAAME,WAAWb,aAAaY,KAAK,IAAI,CAACH,MAAM;QAC9C,MAAMK,SAAS,IAAI,CAACC,cAAc,CAACF;QACnC,MAAMG,QAAQC,+BAA+BJ;QAC7C,OAAO;YAACG;YAAOF;QAAM;IACvB,GACD;IACOI,cAAc,IAAIC,MAA2B;IAE7CC,UAAU,IAAID,MAAuB;IAE7C,YAAYV,MAAkB,CAAE;QAC9B,IAAI,CAACA,MAAM,GAAGA;QAEd,MAAMY,kBAAkB,IAAIC;QAC5B,KAAK,MAAMC,QAAQd,OAAQ;YACzB,IAAIY,gBAAgBG,GAAG,CAACD,KAAKE,IAAI,GAAG;gBAClC,MAAM,IAAIC,MACR,CAAC,qBAAqB,EAAEH,KAAKE,IAAI,CAAC,8DAA8D,CAAC;YAErG;YACAJ,gBAAgBM,GAAG,CAACJ,KAAKE,IAAI;QAC/B;QAEA,KAAK,MAAMF,QAAQd,OAAQ;YACzB,MAAMmB,yBAAyB,IAAIN,IAAI;mBAAI,IAAI,CAACJ,WAAW,CAACW,MAAM;aAAG,CAACC,GAAG,CAAC,CAACC,KAAOA,GAAGN,IAAI;YACzF,MAAMO,mBAAmB3B,2BAA2BkB,KAAKE,IAAI,EAAEG;YAC/D,IAAI,CAACV,WAAW,CAACe,GAAG,CAACV,KAAKE,IAAI,EAAEO;QAClC;QAEA,KAAK,MAAMT,QAAQd,OAAQ;YACzB,IAAI,CAACW,OAAO,CAACa,GAAG,CAACV,KAAKE,IAAI,EAAE,IAAI,CAACV,cAAc,CAACQ;QAClD;IACF;IAEAW,QAAQC,QAAgB,EAAoD;QAC1E,MAAMrB,SAAS,IAAI,CAACM,OAAO,CAACgB,GAAG,CAACD;QAChC,MAAMJ,KAAK,IAAI,CAACb,WAAW,CAACkB,GAAG,CAACD;QAChC,IAAIrB,UAAUiB,IAAI,OAAO;YAACA;YAAIjB;QAAM;QACpC,OAAOuB;IACT;IAEAC,QAAQH,QAAgB,EAAW;QACjC,OAAO,IAAI,CAACf,OAAO,CAACI,GAAG,CAACW;IAC1B;IAEA,CAAC,CAACI,OAAOC,QAAQ,CAAC,GAAG;QACnB,KAAK,MAAM,EAACf,IAAI,EAAC,IAAI,IAAI,CAAChB,MAAM,CAAE;YAChC,MAAM;gBAACgB;gBAAM,GAAG,IAAI,CAACS,OAAO,CAACT,KAAK;YAAC;QACrC;IACF;IAEAgB,YAAsB;QACpB,OAAO,IAAI,CAAChC,MAAM,CAACqB,GAAG,CAAC,CAACY,aAAeA,WAAWjB,IAAI;IACxD;IAEA;;;GAGC,GACD,AAAQkB,sBAAsB9B,QAAuB,EAAqB;QACxE,MAAM+B,YAAY,IAAI,CAAC7B,cAAc,CAACF,SAASgC,EAAE;QACjD,OAAO9C,EAAE+C,eAAe,CAAC5C,UAAUH,EAAEgD,4BAA4B,CAAC;YAACH;SAAU;IAC/E;IAEA,kEAAkE;IAC1DI,oBAAoBnC,QAAuB,EAAqC;QACtF,+DAA+D;QAC/D,IAAIA,SAASgC,EAAE,CAACtB,IAAI,KAAK,UAAU;YACjC,OAAO,IAAI,CAACoB,qBAAqB,CAAC9B;QACpC;QAEA,8DAA8D;QAC9D,IAAIA,SAASgC,EAAE,CAACtB,IAAI,KAAK,SAAS;YAChC,MAAMqB,YAAY,IAAI,CAAC7B,cAAc,CAACF,SAASgC,EAAE;YACjD,OAAO9C,EAAE+C,eAAe,CAAC/C,EAAEkD,UAAU,CAAC,UAAUlD,EAAEgD,4BAA4B,CAAC;gBAACH;aAAU;QAC5F;QAEA,gGAAgG;QAChG,IAAI/B,SAASgC,EAAE,CAACA,EAAE,CAACK,KAAK,CAAC,CAACC,gBAAkBA,cAAc5B,IAAI,KAAK,WAAW;YAC5E,MAAMqB,YAAY,IAAI,CAAC7B,cAAc,CAACF,SAASgC,EAAE;YACjD,OAAO9C,EAAE+C,eAAe,CAAC/C,EAAEkD,UAAU,CAAC,UAAUlD,EAAEgD,4BAA4B,CAAC;gBAACH;aAAU;QAC5F;QAEA,uCAAuC;QACvC,IAAI/B,SAASgC,EAAE,CAACA,EAAE,CAACK,KAAK,CAAC,CAACE,cAAgBA,YAAY7B,IAAI,KAAK,WAAW;YACxE,OAAO,IAAI,CAACoB,qBAAqB,CAAC9B;QACpC;QAEA,8EAA8E;QAC9E,MAAMwC,mBAAmBjD,wBAAwBS,UAAU,CAACyC,SAAWA,OAAO/B,IAAI,KAAK;QACvF,MAAMgC,gBAAgBnD,wBAAwBS,UAAU,CAACyC,SAAWA,OAAO/B,IAAI,KAAK;QAEpF,OAAOxB,EAAEyD,WAAW,CAAC;YACnB,IAAI,CAACR,mBAAmB,CAACK;YACzB,IAAI,CAACL,mBAAmB,CAACO;SAC1B;IACH;IAEA,qEAAqE;IAC7DE,uBAAuBC,QAA4B,EAAY;QACrE,MAAMC,QAAQC,OAAOC,OAAO,CAACH,SAASI,UAAU,EAAEhC,GAAG,CAAC,CAAC,CAACiC,KAAKC,KAAK,GAChE,IAAI,CAACC,wBAAwB,CAACF,KAAKC;QAGrC,OAAOjE,EAAEmE,aAAa,CAACP;IACzB;IAEQQ,qBAAqBtD,QAAwB,EAAY;QAC/D,MAAMkB,KAAK,IAAI,CAACb,WAAW,CAACkB,GAAG,CAACvB,SAASY,IAAI;QAC7C,IAAI,CAACM,IAAI;YACP,2CAA2C;YAC3C,OAAOhC,EAAEqE,UAAU,CACjBrE,EAAEsE,gBAAgB,IAClB,YACA,CAAC,uCAAuC,EAAExD,SAASY,IAAI,CAAC,WAAW,CAAC,EACpE;QAEJ;QAEA,OAAO1B,EAAE+C,eAAe,CAACf;IAC3B;IAEA,mEAAmE;IAC3DuC,qBAAqBzD,QAAwB,EAAY;QAC/D,MAAM8C,QAAiC,EAAE;QACzC,KAAK,MAAM,CAACI,KAAKQ,UAAU,IAAIX,OAAOC,OAAO,CAAChD,SAASiD,UAAU,EAAG;YAClEH,MAAMa,IAAI,CAAC,IAAI,CAACP,wBAAwB,CAACF,KAAKQ;QAChD;QACA,MAAME,OAAO5D,SAAS4D,IAAI;QAE1B,IAAIA,MAAM;YACR,OAAQA,KAAKlD,IAAI;gBACf,KAAK;oBAAU;wBACb,MAAMmD,WAAW,IAAI,CAACP,oBAAoB,CAACM;wBAC3C,qEAAqE;wBACrE,IAAI1E,EAAE4E,kBAAkB,CAACD,WAAW,OAAOA;wBAC3C,OAAO3E,EAAE6E,kBAAkB,CAAC;4BAAC7E,EAAEmE,aAAa,CAACP;4BAAQe;yBAAS;oBAChE;gBACA,KAAK;oBAAU;wBACb,KAAK,MAAM,CAACX,KAAKQ,UAAU,IAAIX,OAAOC,OAAO,CAACY,KAAKX,UAAU,EAAG;4BAC9DH,MAAMa,IAAI,CAAC,IAAI,CAACP,wBAAwB,CAACF,KAAKQ;wBAChD;wBACA;oBACF;gBACA,KAAK;oBAAW;wBACd,OAAOxE,EAAEsE,gBAAgB;oBAC3B;gBACA;oBAAS;wBACP,4CAA4C;wBAC5C,MAAM,IAAI3C,MAAM,CAAC,MAAM,EAAE+C,KAAKlD,IAAI,CAAC,qBAAqB,CAAC;oBAC3D;YACF;QACF;QAEA,IAAIV,SAASgE,cAAc,EAAE;YAC3B,MAAMC,YAAYlB,OAAOmB,MAAM,CAC7BhF,EAAEiF,mBAAmB,CACnB7E,2BACAJ,EAAEkF,gBAAgB,CAAClF,EAAEmF,aAAa,CAACnF,EAAEoF,aAAa,CAACtE,SAASgE,cAAc,MAE5E;gBAACO,UAAU;gBAAMC,UAAU;YAAI;YAEjC1B,MAAMa,IAAI,CAACM;QACb;QAEA,OAAO/E,EAAEmE,aAAa,CAACP;IACzB;IAEA,mEAAmE;IAC3DM,yBAAyBF,GAAW,EAAEQ,SAA0B,EAAyB;QAC/F,MAAMhD,OAAO,IAAI,CAACR,cAAc,CAACwD,UAAUe,KAAK;QAChD,MAAMC,UAAUjF,iBAAiByD,OAAOhE,EAAEkD,UAAU,CAACc,OAAOhE,EAAEoF,aAAa,CAACpB;QAC5E,MAAMyB,oBAAoBzF,EAAEiF,mBAAmB,CAACO,SAASxF,EAAEkF,gBAAgB,CAAC1D;QAC5EiE,kBAAkBH,QAAQ,GAAGd,UAAUc,QAAQ;QAE/C,OAAOG;IACT;IAEQzE,eACNF,QAAmE,EACzD;QACV,OAAQA,SAASU,IAAI;YACnB,KAAK;gBAAS;oBACZ,OAAO,IAAI,CAACyB,mBAAmB,CAACnC;gBAClC;YACA,KAAK;gBAAW;oBACd,IAAIA,SAASyE,KAAK,KAAKjD,WAAW;wBAChC,OAAOtC,EAAEmF,aAAa,CAACnF,EAAE0F,cAAc,CAAC5E,SAASyE,KAAK;oBACxD;oBACA,OAAOvF,EAAE2F,gBAAgB;gBAC3B;YACA,KAAK;gBAAY;oBACf,OAAO,IAAI,CAACjC,sBAAsB,CAAC5C;gBACrC;YACA,KAAK;gBAAU;oBACb,OAAO,IAAI,CAACsD,oBAAoB,CAACtD;gBACnC;YACA,KAAK;gBAAQ;oBACX,OAAOd,EAAE4F,aAAa;gBACxB;YACA,KAAK;gBAAU;oBACb,IAAI9E,SAASyE,KAAK,KAAKjD,WAAW;wBAChC,OAAOtC,EAAEmF,aAAa,CAACnF,EAAE6F,cAAc,CAAC/E,SAASyE,KAAK;oBACxD;oBACA,OAAOvF,EAAE8F,eAAe;gBAC1B;YACA,KAAK;gBAAU;oBACb,OAAO,IAAI,CAACvB,oBAAoB,CAACzD;gBACnC;YACA,KAAK;gBAAU;oBACb,IAAIA,SAASyE,KAAK,KAAKjD,WAAW;wBAChC,OAAOtC,EAAEmF,aAAa,CAACnF,EAAEoF,aAAa,CAACtE,SAASyE,KAAK;oBACvD;oBACA,OAAOvF,EAAE+F,eAAe;gBAC1B;YACA,KAAK;gBAAQ;oBACX,OAAO,IAAI,CAAC/E,cAAc,CAACF,SAASyE,KAAK;gBAC3C;YACA,KAAK;gBAAS;oBACZ,OAAO,IAAI,CAACS,mBAAmB,CAAClF;gBAClC;YACA,KAAK;gBAAW;oBACd,OAAOd,EAAEsE,gBAAgB;gBAC3B;YAEA;gBAAS;oBACP,MAAM,IAAI3C,MACR,CAAC,mCAAmC,EAClC,4CAA4C;oBAC5Cb,SAASU,IAAI,CACd,+BAA+B,CAAC;gBAErC;QACF;IACF;IAEA,kEAAkE;IAC1DwE,oBAAoBlF,QAAuB,EAAY;QAC7D,IAAIA,SAASgC,EAAE,CAACmD,MAAM,KAAK,GAAG,OAAOjG,EAAEkG,cAAc;QACrD,IAAIpF,SAASgC,EAAE,CAACmD,MAAM,KAAK,GAAG,OAAO,IAAI,CAACjF,cAAc,CAACF,SAASgC,EAAE,CAAC,EAAE;QACvE,OAAO9C,EAAEyD,WAAW,CAAC3C,SAASgC,EAAE,CAACf,GAAG,CAAC,CAACkC,OAAS,IAAI,CAACjD,cAAc,CAACiD;IACrE;AACF;AAEA,OAAO,SAAS/C,+BAA+BJ,QAAkB;IAC/D,OAAQA,SAASU,IAAI;QACnB,KAAK;YAAS;gBACZ,MAAM2E,MAAMjF,+BAA+BJ,SAASgC,EAAE;gBACtDqD,IAAIC,QAAQ,IAAI,GAAE,8BAA8B;gBAChD,OAAOD;YACT;QACA,KAAK;YAAU;gBACb,0DAA0D;gBAC1D,IAAIrF,SAAS4D,IAAI,IAAI5D,SAAS4D,IAAI,CAAClD,IAAI,KAAK,WAAW;oBACrD,OAAO;wBAAC4E,UAAU;wBAAGC,aAAa;wBAAGC,cAAc;oBAAC,EAAE,uCAAuC;;gBAC/F;gBAEA,MAAMC,YAAYzF,SAAS4D,IAAI,GAC3BxD,+BAA+BJ,SAAS4D,IAAI,IAC5C;oBAAC0B,UAAU;oBAAGC,aAAa;oBAAGC,cAAc;gBAAC;gBAEjD,+BAA+B;gBAC/BC,UAAUH,QAAQ,IAAI;gBAEtB,MAAMI,QAAQ3C,OAAO/B,MAAM,CAAChB,SAASiD,UAAU;gBAC/C,IAAIoC,MAAMI;gBACV,KAAK,MAAM/B,aAAagC,MAAO;oBAC7B,MAAM,EAACJ,QAAQ,EAAEC,WAAW,EAAEC,YAAY,EAAC,GAAGpF,+BAC5CsD,UAAUe,KAAK;oBAEjBY,MAAM;wBACJC,UAAUD,IAAIC,QAAQ,GAAGA;wBACzBC,aAAaF,IAAIE,WAAW,GAAGA;wBAC/BC,cAAcH,IAAIG,YAAY,GAAGA;oBACnC;gBACF;gBACA,OAAOH;YACT;QACA,KAAK;YAAS;gBACZ,IAAIrF,SAASgC,EAAE,CAACmD,MAAM,KAAK,GAAG;oBAC5B,OAAO;wBAACG,UAAU;wBAAGC,aAAa;wBAAGC,cAAc;oBAAC;gBACtD;gBAEA,IAAIH,MAAM;oBAACC,UAAU;oBAAGC,aAAa;oBAAGC,cAAc;gBAAC,EAAE,8BAA8B;;gBACvF,KAAK,MAAM9E,QAAQV,SAASgC,EAAE,CAAE;oBAC9B,MAAM,EAACsD,QAAQ,EAAEC,WAAW,EAAEC,YAAY,EAAC,GAAGpF,+BAA+BM;oBAC7E2E,MAAM;wBACJC,UAAUD,IAAIC,QAAQ,GAAGA;wBACzBC,aAAaF,IAAIE,WAAW,GAAGA;wBAC/BC,cAAcH,IAAIG,YAAY,GAAGA;oBACnC;gBACF;gBACA,OAAOH;YACT;QACA,KAAK;YAAW;gBACd,OAAO;oBAACC,UAAU;oBAAGC,aAAa;oBAAGC,cAAc;gBAAC;YACtD;QACA;YAAS;gBACP,OAAO;oBAACF,UAAU;oBAAGC,aAAa;oBAAGC,cAAc;gBAAC;YACtD;IACF;AACF"}
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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"}
@@ -190,7 +190,7 @@ import { QueryEvaluationError } from './types.js';
190
190
  async generateTypes(options) {
191
191
  const { reporter: report } = options;
192
192
  const internalReferenceSymbol = this.getInternalReferenceSymbolDeclaration();
193
- const arrayOfDeclaration = this.getArrayOfDeclaration();
193
+ const schemaTypeGenerator = this.getSchemaTypeGenerator(options);
194
194
  const schemaTypeDeclarations = this.getSchemaTypeDeclarations(options);
195
195
  const allSanitySchemaTypesDeclaration = this.getAllSanitySchemaTypesDeclaration(options);
196
196
  report?.event.generatedSchemaTypes({
@@ -208,13 +208,17 @@ import { QueryEvaluationError } from './types.js';
208
208
  code += allSanitySchemaTypesDeclaration.code;
209
209
  program.body.push(internalReferenceSymbol.ast);
210
210
  code += internalReferenceSymbol.code;
211
- program.body.push(arrayOfDeclaration.ast);
212
- code += arrayOfDeclaration.code;
213
211
  const evaluatedModules = await TypeGenerator.getEvaluatedModules({
214
212
  ...options,
215
213
  schemaTypeDeclarations,
216
- schemaTypeGenerator: this.getSchemaTypeGenerator(options)
214
+ schemaTypeGenerator
217
215
  });
216
+ // Only generate ArrayOf if it's actually used
217
+ if (schemaTypeGenerator.isArrayOfUsed()) {
218
+ const arrayOfDeclaration = this.getArrayOfDeclaration();
219
+ program.body.push(arrayOfDeclaration.ast);
220
+ code += arrayOfDeclaration.code;
221
+ }
218
222
  for (const { queries } of evaluatedModules){
219
223
  for (const query of queries){
220
224
  program.body.push(query.ast);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/typescript/typeGenerator.ts"],"sourcesContent":["/* eslint-disable unicorn/consistent-function-scoping */\nimport process from 'node:process'\n\nimport * as t from '@babel/types'\nimport {type WorkerChannel, type WorkerChannelReporter} from '@sanity/worker-channels'\nimport {type SchemaType} from 'groq-js'\nimport {createSelector} from 'reselect'\n\nimport {resultSuffix} from '../casing.js'\nimport {\n ALL_SANITY_SCHEMA_TYPES,\n ARRAY_OF,\n INTERNAL_REFERENCE_SYMBOL,\n SANITY_QUERIES,\n} from './constants.js'\nimport {\n computeOnce,\n generateCode,\n getUniqueIdentifierForName,\n normalizePrintablePath,\n} from './helpers.js'\nimport {SchemaTypeGenerator} from './schemaTypeGenerator.js'\nimport {\n type EvaluatedModule,\n type EvaluatedQuery,\n type ExtractedModule,\n QueryEvaluationError,\n type QueryExtractionError,\n} from './types.js'\n\nexport type TypegenWorkerChannel = WorkerChannel.Definition<{\n evaluatedModules: WorkerChannel.Stream<EvaluatedModule>\n generatedQueryTypes: WorkerChannel.Event<{\n queryMapDeclaration: {ast: t.Program; code: string}\n }>\n generatedSchemaTypes: WorkerChannel.Event<{\n allSanitySchemaTypesDeclaration: {\n ast: t.ExportNamedDeclaration\n code: string\n id: t.Identifier\n }\n internalReferenceSymbol: {\n ast: t.ExportNamedDeclaration\n code: string\n id: t.Identifier\n }\n schemaTypeDeclarations: {\n ast: t.ExportNamedDeclaration\n code: string\n id: t.Identifier\n name: string\n tsType: t.TSType\n }[]\n }>\n}>\n\nexport interface GenerateTypesOptions {\n schema: SchemaType\n\n overloadClientMethods?: boolean\n queries?: AsyncIterable<ExtractedModule>\n reporter?: WorkerChannelReporter<TypegenWorkerChannel>\n root?: string\n schemaPath?: string\n}\n\ntype GetEvaluatedModulesOptions = GenerateTypesOptions & {\n schemaTypeDeclarations: ReturnType<TypeGenerator['getSchemaTypeDeclarations']>\n schemaTypeGenerator: SchemaTypeGenerator\n}\ntype GetQueryMapDeclarationOptions = GenerateTypesOptions & {\n evaluatedModules: EvaluatedModule[]\n}\n\n/**\n * A class used to generate TypeScript types from a given schema\n * @beta\n */\nexport class TypeGenerator {\n private getSchemaTypeGenerator = createSelector(\n [(options: GenerateTypesOptions) => options.schema],\n\n (schema) => new SchemaTypeGenerator(schema),\n )\n\n private getSchemaTypeDeclarations = createSelector(\n [\n (options: GenerateTypesOptions) => options.root,\n (options: GenerateTypesOptions) => options.schemaPath,\n this.getSchemaTypeGenerator,\n ],\n\n (root = process.cwd(), schemaPath, schema) =>\n [...schema].map(({id, name, tsType}, index) => {\n const typeAlias = t.tsTypeAliasDeclaration(id, null, tsType)\n let ast = t.exportNamedDeclaration(typeAlias)\n\n if (index === 0 && schemaPath) {\n ast = t.addComments(ast, 'leading', [\n {type: 'CommentLine', value: ` Source: ${normalizePrintablePath(root, schemaPath)}`},\n ])\n }\n const code = generateCode(ast)\n return {ast, code, id, name, tsType}\n }),\n )\n\n private getAllSanitySchemaTypesDeclaration = createSelector(\n [this.getSchemaTypeDeclarations],\n (schemaTypes) => {\n const ast = t.exportNamedDeclaration(\n t.tsTypeAliasDeclaration(\n ALL_SANITY_SCHEMA_TYPES,\n null,\n schemaTypes.length > 0\n ? t.tsUnionType(schemaTypes.map(({id}) => t.tsTypeReference(id)))\n : t.tsNeverKeyword(),\n ),\n )\n const code = generateCode(ast)\n\n return {ast, code, id: ALL_SANITY_SCHEMA_TYPES}\n },\n )\n\n private getArrayOfDeclaration = computeOnce(() => {\n // Creates: type ArrayOf<T> = Array<T & { _key: string }>;\n const typeParam = t.tsTypeParameter(null, null, 'T')\n const intersectionType = t.tsIntersectionType([\n t.tsTypeReference(t.identifier('T')),\n t.tsTypeLiteral([\n t.tsPropertySignature(t.identifier('_key'), t.tsTypeAnnotation(t.tsStringKeyword())),\n ]),\n ])\n const arrayType = t.tsTypeReference(\n t.identifier('Array'),\n t.tsTypeParameterInstantiation([intersectionType]),\n )\n\n const ast = t.tsTypeAliasDeclaration(\n ARRAY_OF,\n t.tsTypeParameterDeclaration([typeParam]),\n arrayType,\n )\n const code = generateCode(ast)\n\n return {ast, code, id: ARRAY_OF}\n })\n\n private getInternalReferenceSymbolDeclaration = computeOnce(() => {\n const typeOperator = t.tsTypeOperator(t.tsSymbolKeyword(), 'unique')\n\n const id = INTERNAL_REFERENCE_SYMBOL\n id.typeAnnotation = t.tsTypeAnnotation(typeOperator)\n\n const declaration = t.variableDeclaration('const', [t.variableDeclarator(id)])\n declaration.declare = true\n const ast = t.exportNamedDeclaration(declaration)\n const code = generateCode(ast)\n\n return {ast, code, id}\n })\n\n private static async getEvaluatedModules({\n queries: extractedModules,\n reporter: report,\n root = process.cwd(),\n schemaTypeDeclarations,\n schemaTypeGenerator,\n }: GetEvaluatedModulesOptions) {\n if (!extractedModules) {\n report?.stream.evaluatedModules.end()\n return []\n }\n\n const currentIdentifiers = new Set<string>(schemaTypeDeclarations.map(({id}) => id.name))\n const evaluatedModuleResults: EvaluatedModule[] = []\n\n for await (const {filename, ...extractedModule} of extractedModules) {\n const queries: EvaluatedQuery[] = []\n const errors: (QueryEvaluationError | QueryExtractionError)[] = [...extractedModule.errors]\n\n for (const extractedQuery of extractedModule.queries) {\n const {variable} = extractedQuery\n try {\n const {stats, tsType} = schemaTypeGenerator.evaluateQuery(extractedQuery)\n const id = getUniqueIdentifierForName(resultSuffix(variable.id.name), currentIdentifiers)\n const typeAlias = t.tsTypeAliasDeclaration(id, null, tsType)\n const trimmedQuery = extractedQuery.query.replaceAll(/(\\r\\n|\\n|\\r)/gm, '').trim()\n const ast = t.addComments(t.exportNamedDeclaration(typeAlias), 'leading', [\n {type: 'CommentLine', value: ` Source: ${normalizePrintablePath(root, filename)}`},\n {type: 'CommentLine', value: ` Variable: ${variable.id.name}`},\n {type: 'CommentLine', value: ` Query: ${trimmedQuery}`},\n ])\n\n const evaluatedQueryResult: EvaluatedQuery = {\n ast,\n code: generateCode(ast),\n id,\n stats,\n tsType,\n ...extractedQuery,\n }\n\n currentIdentifiers.add(id.name)\n queries.push(evaluatedQueryResult)\n } catch (cause) {\n errors.push(new QueryEvaluationError({cause, filename, variable}))\n }\n }\n\n const evaluatedModule: EvaluatedModule = {\n errors,\n filename,\n queries,\n }\n report?.stream.evaluatedModules.emit(evaluatedModule)\n evaluatedModuleResults.push(evaluatedModule)\n }\n report?.stream.evaluatedModules.end()\n\n return evaluatedModuleResults\n }\n\n private static async getQueryMapDeclaration({\n evaluatedModules,\n overloadClientMethods = true,\n }: GetQueryMapDeclarationOptions) {\n if (!overloadClientMethods) return {ast: t.program([]), code: ''}\n\n const queries = evaluatedModules.flatMap((module) => module.queries)\n if (queries.length === 0) return {ast: t.program([]), code: ''}\n\n const typesByQuerystring: {[query: string]: string[]} = {}\n for (const {id, query} of queries) {\n typesByQuerystring[query] ??= []\n typesByQuerystring[query].push(id.name)\n }\n\n const queryReturnInterface = t.tsInterfaceDeclaration(\n SANITY_QUERIES,\n null,\n [],\n t.tsInterfaceBody(\n Object.entries(typesByQuerystring).map(([query, types]) => {\n return t.tsPropertySignature(\n t.stringLiteral(query),\n t.tsTypeAnnotation(\n types.length > 0\n ? t.tsUnionType(types.map((type) => t.tsTypeReference(t.identifier(type))))\n : t.tsNeverKeyword(),\n ),\n )\n }),\n ),\n )\n\n const declareModule = t.declareModule(\n t.stringLiteral('@sanity/client'),\n t.blockStatement([queryReturnInterface]),\n )\n\n const clientImport = t.addComments(\n t.importDeclaration([], t.stringLiteral('@sanity/client')),\n 'leading',\n [{type: 'CommentLine', value: ' Query TypeMap'}],\n )\n\n const ast = t.program([clientImport, declareModule])\n const code = generateCode(ast)\n return {ast, code}\n }\n\n async generateTypes(options: GenerateTypesOptions) {\n const {reporter: report} = options\n const internalReferenceSymbol = this.getInternalReferenceSymbolDeclaration()\n const arrayOfDeclaration = this.getArrayOfDeclaration()\n const schemaTypeDeclarations = this.getSchemaTypeDeclarations(options)\n const allSanitySchemaTypesDeclaration = this.getAllSanitySchemaTypesDeclaration(options)\n\n report?.event.generatedSchemaTypes({\n allSanitySchemaTypesDeclaration,\n internalReferenceSymbol,\n schemaTypeDeclarations,\n })\n\n const program = t.program([])\n let code = ''\n\n for (const declaration of schemaTypeDeclarations) {\n program.body.push(declaration.ast)\n code += declaration.code\n }\n\n program.body.push(allSanitySchemaTypesDeclaration.ast)\n code += allSanitySchemaTypesDeclaration.code\n\n program.body.push(internalReferenceSymbol.ast)\n code += internalReferenceSymbol.code\n\n program.body.push(arrayOfDeclaration.ast)\n code += arrayOfDeclaration.code\n\n const evaluatedModules = await TypeGenerator.getEvaluatedModules({\n ...options,\n schemaTypeDeclarations,\n schemaTypeGenerator: this.getSchemaTypeGenerator(options),\n })\n for (const {queries} of evaluatedModules) {\n for (const query of queries) {\n program.body.push(query.ast)\n code += query.code\n }\n }\n\n const queryMapDeclaration = await TypeGenerator.getQueryMapDeclaration({\n ...options,\n evaluatedModules,\n })\n program.body.push(...queryMapDeclaration.ast.body)\n code += queryMapDeclaration.code\n\n report?.event.generatedQueryTypes({queryMapDeclaration})\n\n return {ast: program, code}\n }\n}\n"],"names":["process","t","createSelector","resultSuffix","ALL_SANITY_SCHEMA_TYPES","ARRAY_OF","INTERNAL_REFERENCE_SYMBOL","SANITY_QUERIES","computeOnce","generateCode","getUniqueIdentifierForName","normalizePrintablePath","SchemaTypeGenerator","QueryEvaluationError","TypeGenerator","getSchemaTypeGenerator","options","schema","getSchemaTypeDeclarations","root","schemaPath","cwd","map","id","name","tsType","index","typeAlias","tsTypeAliasDeclaration","ast","exportNamedDeclaration","addComments","type","value","code","getAllSanitySchemaTypesDeclaration","schemaTypes","length","tsUnionType","tsTypeReference","tsNeverKeyword","getArrayOfDeclaration","typeParam","tsTypeParameter","intersectionType","tsIntersectionType","identifier","tsTypeLiteral","tsPropertySignature","tsTypeAnnotation","tsStringKeyword","arrayType","tsTypeParameterInstantiation","tsTypeParameterDeclaration","getInternalReferenceSymbolDeclaration","typeOperator","tsTypeOperator","tsSymbolKeyword","typeAnnotation","declaration","variableDeclaration","variableDeclarator","declare","getEvaluatedModules","queries","extractedModules","reporter","report","schemaTypeDeclarations","schemaTypeGenerator","stream","evaluatedModules","end","currentIdentifiers","Set","evaluatedModuleResults","filename","extractedModule","errors","extractedQuery","variable","stats","evaluateQuery","trimmedQuery","query","replaceAll","trim","evaluatedQueryResult","add","push","cause","evaluatedModule","emit","getQueryMapDeclaration","overloadClientMethods","program","flatMap","module","typesByQuerystring","queryReturnInterface","tsInterfaceDeclaration","tsInterfaceBody","Object","entries","types","stringLiteral","declareModule","blockStatement","clientImport","importDeclaration","generateTypes","internalReferenceSymbol","arrayOfDeclaration","allSanitySchemaTypesDeclaration","event","generatedSchemaTypes","body","queryMapDeclaration","generatedQueryTypes"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/typescript/typeGenerator.ts"],"sourcesContent":["/* eslint-disable unicorn/consistent-function-scoping */\nimport process from 'node:process'\n\nimport * as t from '@babel/types'\nimport {type WorkerChannel, type WorkerChannelReporter} from '@sanity/worker-channels'\nimport {type SchemaType} from 'groq-js'\nimport {createSelector} from 'reselect'\n\nimport {resultSuffix} from '../casing.js'\nimport {\n ALL_SANITY_SCHEMA_TYPES,\n ARRAY_OF,\n INTERNAL_REFERENCE_SYMBOL,\n SANITY_QUERIES,\n} from './constants.js'\nimport {\n computeOnce,\n generateCode,\n getUniqueIdentifierForName,\n normalizePrintablePath,\n} from './helpers.js'\nimport {SchemaTypeGenerator} from './schemaTypeGenerator.js'\nimport {\n type EvaluatedModule,\n type EvaluatedQuery,\n type ExtractedModule,\n QueryEvaluationError,\n type QueryExtractionError,\n} from './types.js'\n\nexport type TypegenWorkerChannel = WorkerChannel.Definition<{\n evaluatedModules: WorkerChannel.Stream<EvaluatedModule>\n generatedQueryTypes: WorkerChannel.Event<{\n queryMapDeclaration: {ast: t.Program; code: string}\n }>\n generatedSchemaTypes: WorkerChannel.Event<{\n allSanitySchemaTypesDeclaration: {\n ast: t.ExportNamedDeclaration\n code: string\n id: t.Identifier\n }\n internalReferenceSymbol: {\n ast: t.ExportNamedDeclaration\n code: string\n id: t.Identifier\n }\n schemaTypeDeclarations: {\n ast: t.ExportNamedDeclaration\n code: string\n id: t.Identifier\n name: string\n tsType: t.TSType\n }[]\n }>\n}>\n\nexport interface GenerateTypesOptions {\n schema: SchemaType\n\n overloadClientMethods?: boolean\n queries?: AsyncIterable<ExtractedModule>\n reporter?: WorkerChannelReporter<TypegenWorkerChannel>\n root?: string\n schemaPath?: string\n}\n\ntype GetEvaluatedModulesOptions = GenerateTypesOptions & {\n schemaTypeDeclarations: ReturnType<TypeGenerator['getSchemaTypeDeclarations']>\n schemaTypeGenerator: SchemaTypeGenerator\n}\ntype GetQueryMapDeclarationOptions = GenerateTypesOptions & {\n evaluatedModules: EvaluatedModule[]\n}\n\n/**\n * A class used to generate TypeScript types from a given schema\n * @beta\n */\nexport class TypeGenerator {\n private getSchemaTypeGenerator = createSelector(\n [(options: GenerateTypesOptions) => options.schema],\n\n (schema) => new SchemaTypeGenerator(schema),\n )\n\n private getSchemaTypeDeclarations = createSelector(\n [\n (options: GenerateTypesOptions) => options.root,\n (options: GenerateTypesOptions) => options.schemaPath,\n this.getSchemaTypeGenerator,\n ],\n\n (root = process.cwd(), schemaPath, schema) =>\n [...schema].map(({id, name, tsType}, index) => {\n const typeAlias = t.tsTypeAliasDeclaration(id, null, tsType)\n let ast = t.exportNamedDeclaration(typeAlias)\n\n if (index === 0 && schemaPath) {\n ast = t.addComments(ast, 'leading', [\n {type: 'CommentLine', value: ` Source: ${normalizePrintablePath(root, schemaPath)}`},\n ])\n }\n const code = generateCode(ast)\n return {ast, code, id, name, tsType}\n }),\n )\n\n private getAllSanitySchemaTypesDeclaration = createSelector(\n [this.getSchemaTypeDeclarations],\n (schemaTypes) => {\n const ast = t.exportNamedDeclaration(\n t.tsTypeAliasDeclaration(\n ALL_SANITY_SCHEMA_TYPES,\n null,\n schemaTypes.length > 0\n ? t.tsUnionType(schemaTypes.map(({id}) => t.tsTypeReference(id)))\n : t.tsNeverKeyword(),\n ),\n )\n const code = generateCode(ast)\n\n return {ast, code, id: ALL_SANITY_SCHEMA_TYPES}\n },\n )\n\n private getArrayOfDeclaration = computeOnce(() => {\n // Creates: type ArrayOf<T> = Array<T & { _key: string }>;\n const typeParam = t.tsTypeParameter(null, null, 'T')\n const intersectionType = t.tsIntersectionType([\n t.tsTypeReference(t.identifier('T')),\n t.tsTypeLiteral([\n t.tsPropertySignature(t.identifier('_key'), t.tsTypeAnnotation(t.tsStringKeyword())),\n ]),\n ])\n const arrayType = t.tsTypeReference(\n t.identifier('Array'),\n t.tsTypeParameterInstantiation([intersectionType]),\n )\n\n const ast = t.tsTypeAliasDeclaration(\n ARRAY_OF,\n t.tsTypeParameterDeclaration([typeParam]),\n arrayType,\n )\n const code = generateCode(ast)\n\n return {ast, code, id: ARRAY_OF}\n })\n\n private getInternalReferenceSymbolDeclaration = computeOnce(() => {\n const typeOperator = t.tsTypeOperator(t.tsSymbolKeyword(), 'unique')\n\n const id = INTERNAL_REFERENCE_SYMBOL\n id.typeAnnotation = t.tsTypeAnnotation(typeOperator)\n\n const declaration = t.variableDeclaration('const', [t.variableDeclarator(id)])\n declaration.declare = true\n const ast = t.exportNamedDeclaration(declaration)\n const code = generateCode(ast)\n\n return {ast, code, id}\n })\n\n private static async getEvaluatedModules({\n queries: extractedModules,\n reporter: report,\n root = process.cwd(),\n schemaTypeDeclarations,\n schemaTypeGenerator,\n }: GetEvaluatedModulesOptions) {\n if (!extractedModules) {\n report?.stream.evaluatedModules.end()\n return []\n }\n\n const currentIdentifiers = new Set<string>(schemaTypeDeclarations.map(({id}) => id.name))\n const evaluatedModuleResults: EvaluatedModule[] = []\n\n for await (const {filename, ...extractedModule} of extractedModules) {\n const queries: EvaluatedQuery[] = []\n const errors: (QueryEvaluationError | QueryExtractionError)[] = [...extractedModule.errors]\n\n for (const extractedQuery of extractedModule.queries) {\n const {variable} = extractedQuery\n try {\n const {stats, tsType} = schemaTypeGenerator.evaluateQuery(extractedQuery)\n const id = getUniqueIdentifierForName(resultSuffix(variable.id.name), currentIdentifiers)\n const typeAlias = t.tsTypeAliasDeclaration(id, null, tsType)\n const trimmedQuery = extractedQuery.query.replaceAll(/(\\r\\n|\\n|\\r)/gm, '').trim()\n const ast = t.addComments(t.exportNamedDeclaration(typeAlias), 'leading', [\n {type: 'CommentLine', value: ` Source: ${normalizePrintablePath(root, filename)}`},\n {type: 'CommentLine', value: ` Variable: ${variable.id.name}`},\n {type: 'CommentLine', value: ` Query: ${trimmedQuery}`},\n ])\n\n const evaluatedQueryResult: EvaluatedQuery = {\n ast,\n code: generateCode(ast),\n id,\n stats,\n tsType,\n ...extractedQuery,\n }\n\n currentIdentifiers.add(id.name)\n queries.push(evaluatedQueryResult)\n } catch (cause) {\n errors.push(new QueryEvaluationError({cause, filename, variable}))\n }\n }\n\n const evaluatedModule: EvaluatedModule = {\n errors,\n filename,\n queries,\n }\n report?.stream.evaluatedModules.emit(evaluatedModule)\n evaluatedModuleResults.push(evaluatedModule)\n }\n report?.stream.evaluatedModules.end()\n\n return evaluatedModuleResults\n }\n\n private static async getQueryMapDeclaration({\n evaluatedModules,\n overloadClientMethods = true,\n }: GetQueryMapDeclarationOptions) {\n if (!overloadClientMethods) return {ast: t.program([]), code: ''}\n\n const queries = evaluatedModules.flatMap((module) => module.queries)\n if (queries.length === 0) return {ast: t.program([]), code: ''}\n\n const typesByQuerystring: {[query: string]: string[]} = {}\n for (const {id, query} of queries) {\n typesByQuerystring[query] ??= []\n typesByQuerystring[query].push(id.name)\n }\n\n const queryReturnInterface = t.tsInterfaceDeclaration(\n SANITY_QUERIES,\n null,\n [],\n t.tsInterfaceBody(\n Object.entries(typesByQuerystring).map(([query, types]) => {\n return t.tsPropertySignature(\n t.stringLiteral(query),\n t.tsTypeAnnotation(\n types.length > 0\n ? t.tsUnionType(types.map((type) => t.tsTypeReference(t.identifier(type))))\n : t.tsNeverKeyword(),\n ),\n )\n }),\n ),\n )\n\n const declareModule = t.declareModule(\n t.stringLiteral('@sanity/client'),\n t.blockStatement([queryReturnInterface]),\n )\n\n const clientImport = t.addComments(\n t.importDeclaration([], t.stringLiteral('@sanity/client')),\n 'leading',\n [{type: 'CommentLine', value: ' Query TypeMap'}],\n )\n\n const ast = t.program([clientImport, declareModule])\n const code = generateCode(ast)\n return {ast, code}\n }\n\n async generateTypes(options: GenerateTypesOptions) {\n const {reporter: report} = options\n const internalReferenceSymbol = this.getInternalReferenceSymbolDeclaration()\n const schemaTypeGenerator = this.getSchemaTypeGenerator(options)\n const schemaTypeDeclarations = this.getSchemaTypeDeclarations(options)\n const allSanitySchemaTypesDeclaration = this.getAllSanitySchemaTypesDeclaration(options)\n\n report?.event.generatedSchemaTypes({\n allSanitySchemaTypesDeclaration,\n internalReferenceSymbol,\n schemaTypeDeclarations,\n })\n\n const program = t.program([])\n let code = ''\n\n for (const declaration of schemaTypeDeclarations) {\n program.body.push(declaration.ast)\n code += declaration.code\n }\n\n program.body.push(allSanitySchemaTypesDeclaration.ast)\n code += allSanitySchemaTypesDeclaration.code\n\n program.body.push(internalReferenceSymbol.ast)\n code += internalReferenceSymbol.code\n\n const evaluatedModules = await TypeGenerator.getEvaluatedModules({\n ...options,\n schemaTypeDeclarations,\n schemaTypeGenerator,\n })\n\n // Only generate ArrayOf if it's actually used\n if (schemaTypeGenerator.isArrayOfUsed()) {\n const arrayOfDeclaration = this.getArrayOfDeclaration()\n program.body.push(arrayOfDeclaration.ast)\n code += arrayOfDeclaration.code\n }\n\n for (const {queries} of evaluatedModules) {\n for (const query of queries) {\n program.body.push(query.ast)\n code += query.code\n }\n }\n\n const queryMapDeclaration = await TypeGenerator.getQueryMapDeclaration({\n ...options,\n evaluatedModules,\n })\n program.body.push(...queryMapDeclaration.ast.body)\n code += queryMapDeclaration.code\n\n report?.event.generatedQueryTypes({queryMapDeclaration})\n\n return {ast: program, code}\n }\n}\n"],"names":["process","t","createSelector","resultSuffix","ALL_SANITY_SCHEMA_TYPES","ARRAY_OF","INTERNAL_REFERENCE_SYMBOL","SANITY_QUERIES","computeOnce","generateCode","getUniqueIdentifierForName","normalizePrintablePath","SchemaTypeGenerator","QueryEvaluationError","TypeGenerator","getSchemaTypeGenerator","options","schema","getSchemaTypeDeclarations","root","schemaPath","cwd","map","id","name","tsType","index","typeAlias","tsTypeAliasDeclaration","ast","exportNamedDeclaration","addComments","type","value","code","getAllSanitySchemaTypesDeclaration","schemaTypes","length","tsUnionType","tsTypeReference","tsNeverKeyword","getArrayOfDeclaration","typeParam","tsTypeParameter","intersectionType","tsIntersectionType","identifier","tsTypeLiteral","tsPropertySignature","tsTypeAnnotation","tsStringKeyword","arrayType","tsTypeParameterInstantiation","tsTypeParameterDeclaration","getInternalReferenceSymbolDeclaration","typeOperator","tsTypeOperator","tsSymbolKeyword","typeAnnotation","declaration","variableDeclaration","variableDeclarator","declare","getEvaluatedModules","queries","extractedModules","reporter","report","schemaTypeDeclarations","schemaTypeGenerator","stream","evaluatedModules","end","currentIdentifiers","Set","evaluatedModuleResults","filename","extractedModule","errors","extractedQuery","variable","stats","evaluateQuery","trimmedQuery","query","replaceAll","trim","evaluatedQueryResult","add","push","cause","evaluatedModule","emit","getQueryMapDeclaration","overloadClientMethods","program","flatMap","module","typesByQuerystring","queryReturnInterface","tsInterfaceDeclaration","tsInterfaceBody","Object","entries","types","stringLiteral","declareModule","blockStatement","clientImport","importDeclaration","generateTypes","internalReferenceSymbol","allSanitySchemaTypesDeclaration","event","generatedSchemaTypes","body","isArrayOfUsed","arrayOfDeclaration","queryMapDeclaration","generatedQueryTypes"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { subdebug } from '@sanity/cli-core';
2
+ export const debug = subdebug('typegen:generate');
3
+
4
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/debug.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core'\n\nexport const debug = subdebug('typegen:generate')\n"],"names":["subdebug","debug"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AAEzC,OAAO,MAAMC,QAAQD,SAAS,oBAAmB"}
@@ -41,5 +41,5 @@
41
41
  ]
42
42
  }
43
43
  },
44
- "version": "5.9.0"
44
+ "version": "5.9.2"
45
45
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/codegen",
3
- "version": "5.9.0",
3
+ "version": "5.9.2",
4
4
  "description": "Codegen toolkit for Sanity.io",
5
5
  "keywords": [
6
6
  "sanity",
@@ -54,7 +54,6 @@
54
54
  "@oclif/core": "^4.8.0",
55
55
  "@oclif/plugin-help": "^6.2.36",
56
56
  "@sanity/cli-core": "^0.1.0-alpha.8",
57
- "@sanity/telemetry": "^0.8.1",
58
57
  "@sanity/worker-channels": "^1.1.0",
59
58
  "debug": "^4.4.3",
60
59
  "globby": "^11.1.0",
@@ -70,6 +69,7 @@
70
69
  },
71
70
  "devDependencies": {
72
71
  "@eslint/compat": "^2.0.1",
72
+ "@sanity/telemetry": "^0.8.0",
73
73
  "@microsoft/api-extractor": "^7.55.2",
74
74
  "@oclif/test": "^4.1.15",
75
75
  "@sanity/cli-test": "^0.0.2-alpha.7",
@@ -94,6 +94,9 @@
94
94
  "typescript": "^5.9.3",
95
95
  "vitest": "^4.0.17"
96
96
  },
97
+ "peerDependencies": {
98
+ "@sanity/telemetry": "^0.8.0"
99
+ },
97
100
  "engines": {
98
101
  "node": ">=20.19 <22 || >=22.12"
99
102
  },