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
104 lines (103 loc) • 4.5 kB
JavaScript
import { createHash } from "node:crypto";
import { mkdir, writeFile } from "node:fs/promises";
import { resolve, join, dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { Worker } from "node:worker_threads";
import { minutesToMilliseconds } from "date-fns";
import readPkgUp from "read-pkg-up";
import { getTimer, readModuleVersion } from "./timing.js";
const __dirname$1 = dirname(fileURLToPath(import.meta.url)), MANIFEST_FILENAME = "create-manifest.json", SCHEMA_FILENAME_SUFFIX = ".create-schema.json", TOOLS_FILENAME_SUFFIX = ".create-tools.json", FEATURE_ENABLED_ENV_NAME = "SANITY_CLI_EXTRACT_MANIFEST_ENABLED", EXTRACT_MANIFEST_ENABLED = process.env[FEATURE_ENABLED_ENV_NAME] !== "false", EXTRACT_MANIFEST_LOG_ERRORS = process.env.SANITY_CLI_EXTRACT_MANIFEST_LOG_ERRORS === "true", CREATE_TIMER = "create-manifest", EXTRACT_TASK_TIMEOUT_MS = minutesToMilliseconds(2);
async function extractManifestSafe(args, context) {
if (EXTRACT_MANIFEST_ENABLED)
try {
await extractManifest(args, context);
return;
} catch (err) {
return EXTRACT_MANIFEST_LOG_ERRORS && context.output.error(err), err;
}
}
async function extractManifest(args, context) {
const {
output,
workDir
} = context, flags = args.extOptions, defaultOutputDir = resolve(join(workDir, "dist")), outputDir = resolve(defaultOutputDir), defaultStaticPath = join(outputDir, "static"), staticPath = flags.path ?? defaultStaticPath, path = join(staticPath, MANIFEST_FILENAME), rootPkgPath = readPkgUp.sync({
cwd: __dirname$1
})?.path;
if (!rootPkgPath)
throw new Error("Could not find root directory for `sanity` package");
const timer = getTimer();
timer.start(CREATE_TIMER);
const spinner = output.spinner({}).start("Extracting manifest");
try {
const workspaceManifests = await getWorkspaceManifests({
rootPkgPath,
workDir
});
await mkdir(staticPath, {
recursive: !0
});
const workspaceFiles = await writeWorkspaceFiles(workspaceManifests, staticPath), manifest = {
/**
* Version history:
* 1: Initial release.
* 2: Added tools file.
* 3. Added studioVersion field.
*/
version: 3,
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
workspaces: workspaceFiles,
studioVersion: await readModuleVersion(workDir, "sanity")
};
await writeFile(path, JSON.stringify(manifest, null, 2));
const manifestDuration = timer.end(CREATE_TIMER);
spinner.succeed(`Extracted manifest (${manifestDuration.toFixed()}ms)`);
} catch (err) {
throw spinner.fail(err.message), err;
}
}
async function getWorkspaceManifests({
rootPkgPath,
workDir
}) {
const workerPath = join(dirname(rootPkgPath), "lib", "_internal", "cli", "threads", "extractManifest.cjs"), worker = new Worker(workerPath, {
workerData: {
workDir
},
env: process.env
});
let timeout = !1;
const timeoutId = setTimeout(() => {
timeout = !0, worker.terminate();
}, EXTRACT_TASK_TIMEOUT_MS);
try {
return await new Promise((resolveWorkspaces, reject) => {
const buffer = [];
worker.addListener("message", (message) => buffer.push(message)), worker.addListener("exit", (exitCode) => {
exitCode === 0 ? resolveWorkspaces(buffer) : timeout && reject(new Error(`Extract manifest was aborted after ${EXTRACT_TASK_TIMEOUT_MS}ms`));
}), worker.addListener("error", reject);
});
} finally {
clearTimeout(timeoutId);
}
}
function writeWorkspaceFiles(manifestWorkspaces, staticPath) {
const output = manifestWorkspaces.reduce((workspaces, workspace) => [...workspaces, writeWorkspaceFile(workspace, staticPath)], []);
return Promise.all(output);
}
async function writeWorkspaceFile(workspace, staticPath) {
const [schemaFilename, toolsFilename] = await Promise.all([createFile(staticPath, workspace.schema, SCHEMA_FILENAME_SUFFIX), createFile(staticPath, workspace.tools, TOOLS_FILENAME_SUFFIX)]);
return {
...workspace,
schema: schemaFilename,
tools: toolsFilename
};
}
const createFile = async (path, content, filenameSuffix) => {
const stringifiedContent = JSON.stringify(content, null, 2), filename = `${createHash("sha1").update(stringifiedContent).digest("hex").slice(0, 8)}${filenameSuffix}`;
return await writeFile(join(path, filename), stringifiedContent), filename;
};
export {
MANIFEST_FILENAME,
extractManifestSafe
};
//# sourceMappingURL=extractManifestAction.js.map