UNPKG

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

103 lines (102 loc) 4.44 kB
import path from "path"; import { promisify } from "util"; import chalk from "chalk"; import { defineTrace, noopLogger } from "@sanity/telemetry"; import rimraf$1 from "rimraf"; import { b as buildStaticFiles } from "./previewServer.js"; import "vite"; import "./runtime.js"; import "@vitejs/plugin-react"; import "debug"; import "read-pkg-up"; import "@sanity/cli"; import "resolve-from"; import "connect-history-api-fallback"; import "fs"; import "fs/promises"; import { c as checkStudioDependencyVersions, a as checkRequiredDependencies, g as getTimer } from "./timing.js"; const BuildTrace = defineTrace({ name: "Studio Build Completed", version: 0, description: "A Studio build completed" }), rimraf = promisify(rimraf$1); async function buildSanityStudio(args, context, overrides) { var _a; const timer = getTimer(), { output, prompt, workDir, cliConfig, telemetry = noopLogger } = context, flags = { minify: !0, stats: !1, "source-maps": !1, ...args.extOptions }, unattendedMode = !!(flags.yes || flags.y), defaultOutputDir = path.resolve(path.join(workDir, "dist")), outputDir = path.resolve(args.argsWithoutOptions[0] || defaultOutputDir); if (await checkStudioDependencyVersions(workDir), (await checkRequiredDependencies(context)).didInstall) return { didCompile: !1 }; const envVarKeys = getSanityEnvVars(); envVarKeys.length > 0 && (output.print( ` Including the following environment variables as part of the JavaScript bundle:` ), envVarKeys.forEach((key) => output.print(`- ${key}`)), output.print("")); let shouldClean = !0; outputDir !== defaultOutputDir && !unattendedMode && (shouldClean = await prompt.single({ type: "confirm", message: `Do you want to delete the existing directory (${outputDir}) first?`, default: !0 })); let basePath = "/"; const envBasePath = process.env.SANITY_STUDIO_BASEPATH, configBasePath = (_a = cliConfig == null ? void 0 : cliConfig.project) == null ? void 0 : _a.basePath; overrides != null && overrides.basePath ? basePath = overrides.basePath : envBasePath ? basePath = envBasePath : configBasePath && (basePath = configBasePath), envBasePath && configBasePath && output.warn( `Overriding configured base path (${configBasePath}) with value from environment variable (${envBasePath})` ); let spin; if (shouldClean) { timer.start("cleanOutputFolder"), spin = output.spinner("Clean output folder").start(), await rimraf(outputDir); const cleanDuration = timer.end("cleanOutputFolder"); spin.text = `Clean output folder (${cleanDuration.toFixed()}ms)`, spin.succeed(); } spin = output.spinner("Build Sanity Studio").start(); const trace = telemetry.trace(BuildTrace); trace.start(); try { timer.start("bundleStudio"); const bundle = await buildStaticFiles({ cwd: workDir, outputDir, basePath, sourceMap: !!flags["source-maps"], minify: !!flags.minify, vite: cliConfig && "vite" in cliConfig ? cliConfig.vite : void 0 }); trace.log({ outputSize: bundle.chunks.flatMap((chunk) => chunk.modules.flatMap((mod) => mod.renderedLength)).reduce((sum, n) => sum + n, 0) }); const buildDuration = timer.end("bundleStudio"); spin.text = `Build Sanity Studio (${buildDuration.toFixed()}ms)`, spin.succeed(), trace.complete(), flags.stats && (output.print(` Largest module files:`), output.print(formatModuleSizes(sortModulesBySize(bundle.chunks).slice(0, 15)))); } catch (err) { throw spin.fail(), trace.error(err), err; } return { didCompile: !0 }; } function getSanityEnvVars(env = process.env) { return Object.keys(env).filter((key) => key.toUpperCase().startsWith("SANITY_STUDIO_")); } function sortModulesBySize(chunks) { return chunks.flatMap((chunk) => chunk.modules).sort((modA, modB) => modB.renderedLength - modA.renderedLength); } function formatModuleSizes(modules) { const lines = []; for (const mod of modules) lines.push(` - ${formatModuleName(mod.name)} (${formatSize(mod.renderedLength)})`); return lines.join(` `); } function formatModuleName(modName) { const delimiter = "/node_modules/", nodeIndex = modName.lastIndexOf(delimiter); return nodeIndex === -1 ? modName : modName.slice(nodeIndex + delimiter.length); } function formatSize(bytes) { return chalk.cyan(`${(bytes / 1024).toFixed()} kB`); } export { buildSanityStudio as default }; //# sourceMappingURL=buildAction.js.map