sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
115 lines (112 loc) • 4.78 kB
JavaScript
;
var promises = require("node:fs/promises"), path = require("node:path"), codegen = require("@sanity/codegen"), readPkgUp = require("read-pkg-up"), worker_threads = require("worker_threads"), telemetry = require("@sanity/telemetry");
function _interopDefaultCompat(e) {
return e && typeof e == "object" && "default" in e ? e : { default: e };
}
var readPkgUp__default = /* @__PURE__ */ _interopDefaultCompat(readPkgUp);
const TypesGeneratedTrace = telemetry.defineTrace({
name: "Types Generated",
version: 0,
description: "Trace emitted when generating TypeScript types for queries"
}), generatedFileWarning = `/**
* ---------------------------------------------------------------------------------
* This file has been generated by Sanity TypeGen.
* Command: \`sanity typegen generate\`
*
* Any modifications made directly to this file will be overwritten the next time
* the TypeScript definitions are generated. Please make changes to the Sanity
* schema definitions and/or GROQ queries if you need to update these types.
*
* For more information on how to use Sanity TypeGen, visit the official documentation:
* https://www.sanity.io/docs/sanity-typegen
* ---------------------------------------------------------------------------------
*/
`;
async function typegenGenerateAction(args, context) {
var _a;
const flags = args.extOptions, { output, workDir, telemetry: telemetry2 } = context, trace = telemetry2.trace(TypesGeneratedTrace);
trace.start();
const codegenConfig = await codegen.readConfig(flags.configPath || "sanity-typegen.json"), rootPkgPath = (_a = readPkgUp__default.default.sync({ cwd: __dirname })) == null ? void 0 : _a.path;
if (!rootPkgPath)
throw new Error("Could not find the root directory for the `sanity` package");
const workerPath = path.join(
path.dirname(rootPkgPath),
"lib",
"_internal",
"cli",
"threads",
"typegenGenerate.js"
), spinner = output.spinner({}).start("Generating types"), worker = new worker_threads.Worker(workerPath, {
workerData: {
workDir,
schemaPath: codegenConfig.schema,
searchPath: codegenConfig.path
},
// eslint-disable-next-line no-process-env
env: process.env
}), typeFile = await promises.open(
path.join(process.cwd(), codegenConfig.generates),
// eslint-disable-next-line no-bitwise
promises.constants.O_TRUNC | promises.constants.O_CREAT | promises.constants.O_WRONLY
);
typeFile.write(generatedFileWarning);
const stats = {
queryFilesCount: 0,
errors: 0,
queriesCount: 0,
schemaTypesCount: 0,
unknownTypeNodesGenerated: 0,
typeNodesGenerated: 0,
size: 0
};
await new Promise((resolve, reject) => {
worker.addListener("message", (msg) => {
if (msg.type === "error") {
if (msg.fatal) {
trace.error(msg.error), reject(msg.error);
return;
}
const errorMessage = msg.filename ? `${msg.error.message} in "${msg.filename}"` : msg.error.message;
spinner.fail(errorMessage), stats.errors++;
return;
}
if (msg.type === "complete") {
resolve();
return;
}
let fileTypeString = `// Source: ${msg.filename}
`;
if (msg.type === "schema") {
stats.schemaTypesCount += msg.length, fileTypeString += `${msg.schema}
`, typeFile.write(fileTypeString);
return;
}
stats.queryFilesCount++;
for (const {
queryName,
query,
type,
typeNodesGenerated,
unknownTypeNodesGenerated
} of msg.types)
fileTypeString += `// Variable: ${queryName}
`, fileTypeString += `// Query: ${query.replace(/(\r\n|\n|\r)/gm, "")}
`, fileTypeString += `${type}
`, stats.queriesCount++, stats.typeNodesGenerated += typeNodesGenerated, stats.unknownTypeNodesGenerated += unknownTypeNodesGenerated;
typeFile.write(`${fileTypeString}
`), stats.size += Buffer.byteLength(fileTypeString);
}), worker.addListener("error", reject);
}), typeFile.close(), trace.log({
outputSize: stats.size,
queriesCount: stats.queriesCount,
schemaTypesCount: stats.schemaTypesCount,
queryFilesCount: stats.queryFilesCount,
filesWithErrors: stats.errors,
typeNodesGenerated: stats.typeNodesGenerated,
unknownTypeNodesGenerated: stats.unknownTypeNodesGenerated
}), trace.complete(), stats.errors > 0 && spinner.warn(`Encountered errors in ${stats.errors} files while generating types`), spinner.succeed(
`Generated TypeScript types for ${stats.schemaTypesCount} schema types and ${stats.queriesCount} GROQ queries in ${stats.queryFilesCount} files into: ${codegenConfig.generates}`
);
}
exports.default = typegenGenerateAction;
//# sourceMappingURL=generateAction.js.map