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

180 lines (179 loc) • 8.65 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf, __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: !0 }) : target, mod )); var fs = require("node:fs"), path = require("node:path"), resolveFrom = require("resolve-from"), semver = require("semver"), runtime = require("./runtime.js"), chalk = require("chalk"); function _interopDefaultCompat(e) { return e && typeof e == "object" && "default" in e ? e : { default: e }; } var fs__default = /* @__PURE__ */ _interopDefaultCompat(fs), path__default = /* @__PURE__ */ _interopDefaultCompat(path), resolveFrom__default = /* @__PURE__ */ _interopDefaultCompat(resolveFrom), semver__default = /* @__PURE__ */ _interopDefaultCompat(semver), chalk__default = /* @__PURE__ */ _interopDefaultCompat(chalk); const VENDOR_DIR = "vendor", VENDOR_IMPORTS = { react: { "^19.0.0": { ".": "./cjs/react.production.js", "./jsx-runtime": "./cjs/react-jsx-runtime.production.js", "./jsx-dev-runtime": "./cjs/react-jsx-dev-runtime.production.js", "./compiler-runtime": "./cjs/react-compiler-runtime.production.js", "./package.json": "./package.json" }, "^18.0.0": { ".": "./cjs/react.production.min.js", "./jsx-runtime": "./cjs/react-jsx-runtime.production.min.js", "./jsx-dev-runtime": "./cjs/react-jsx-dev-runtime.production.min.js", "./package.json": "./package.json" } }, "react-dom": { "^19.0.0": { ".": "./cjs/react-dom.production.js", "./client": "./cjs/react-dom-client.production.js", "./server": "./cjs/react-dom-server-legacy.browser.production.js", "./server.browser": "./cjs/react-dom-server-legacy.browser.production.js", "./static": "./cjs/react-dom-server.browser.production.js", "./static.browser": "./cjs/react-dom-server.browser.production.js", "./package.json": "./package.json" }, "^18.0.0": { ".": "./cjs/react-dom.production.min.js", "./client": "./cjs/react-dom.production.min.js", "./server": "./cjs/react-dom-server-legacy.browser.production.min.js", "./server.browser": "./cjs/react-dom-server-legacy.browser.production.min.js", "./package.json": "./package.json" } }, "styled-components": { "^6.1.0": { ".": "./dist/styled-components.esm.js", "./package.json": "./package.json" } } }; async function buildVendorDependencies({ cwd, outputDir, basePath }) { const dir = path__default.default.relative(process.cwd(), path__default.default.resolve(cwd)), entry = {}, imports = {}; for (const [packageName, ranges] of Object.entries(VENDOR_IMPORTS)) { const packageJsonPath = resolveFrom__default.default.silent(cwd, path__default.default.join(packageName, "package.json")); if (!packageJsonPath) throw new Error(`Could not find package.json for package '${packageName}' from directory '${dir}'. Is it installed?`); let packageJson; try { packageJson = JSON.parse(await fs__default.default.promises.readFile(packageJsonPath, "utf-8")); } catch (e) { const message = `Could not read package.json for package '${packageName}' from directory '${dir}'`; throw typeof e?.message == "string" ? (e.message = `${message}: ${e.message}`, e) : new Error(message, { cause: e }); } const version = semver__default.default.coerce(packageJson.version)?.version; if (!version) throw new Error(`Could not parse version '${packageJson.version}' from '${packageName}'`); const sortedRanges = Object.keys(ranges).sort((range1, range2) => { const min1 = semver__default.default.minVersion(range1), min2 = semver__default.default.minVersion(range2); if (!min1) throw new Error(`Could not parse range '${range1}'`); if (!min2) throw new Error(`Could not parse range '${range2}'`); return semver__default.default.rcompare(min1.version, min2.version); }), matchedRange = sortedRanges.find((range) => semver__default.default.satisfies(version, range)); if (!matchedRange) { const min = semver__default.default.minVersion(sortedRanges[sortedRanges.length - 1]); throw min ? semver__default.default.gt(min.version, version) ? new Error(`Package '${packageName}' requires at least ${min.version}.`) : new Error(`Version '${version}' of package '${packageName}' is not supported yet.`) : new Error(`Could not find a minimum version for package '${packageName}'`); } const subpaths = ranges[matchedRange]; for (const [subpath, relativeEntryPoint] of Object.entries(subpaths)) { const packagePath = path__default.default.dirname(packageJsonPath), entryPoint = resolveFrom__default.default.silent(packagePath, relativeEntryPoint); if (!entryPoint) throw new Error(`Failed to resolve entry point '${path__default.default.join(packageName, relativeEntryPoint)}'. `); const specifier = path__default.default.posix.join(packageName, subpath), chunkName = path__default.default.posix.join(packageName, path__default.default.relative(packageName, specifier) || "index"); entry[chunkName] = entryPoint, imports[specifier] = path__default.default.posix.join("/", basePath, VENDOR_DIR, `${chunkName}.mjs`); } } const { build } = await import("vite"); let buildResult = await build({ // Define a custom cache directory so that sanity's vite cache // does not conflict with any potential local vite projects cacheDir: "node_modules/.sanity/vite-vendor", root: cwd, configFile: !1, logLevel: "silent", appType: "custom", mode: "production", define: { "process.env.NODE_ENV": JSON.stringify("production") }, build: { commonjsOptions: { strictRequires: "auto" }, minify: !0, emptyOutDir: !1, // Rely on CLI to do this outDir: path__default.default.join(outputDir, VENDOR_DIR), lib: { entry, formats: ["es"] }, rollupOptions: { external: runtime.createExternalFromImportMap({ imports }), output: { entryFileNames: "[name]-[hash].mjs", chunkFileNames: "[name]-[hash].mjs", exports: "named", format: "es" }, treeshake: { preset: "recommended" } } } }); buildResult = Array.isArray(buildResult) ? buildResult : [buildResult]; const hashedImports = {}, output = buildResult.flatMap((i) => i.output); for (const chunk of output) if (chunk.type !== "asset") for (const [specifier, originalPath] of Object.entries(imports)) originalPath.endsWith(`${chunk.name}.mjs`) && (hashedImports[specifier] = path__default.default.posix.join("/", basePath, VENDOR_DIR, chunk.fileName)); return hashedImports; } function formatSize(bytes) { return chalk__default.default.cyan(`${(bytes / 1024).toFixed()} kB`); } 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 sortModulesBySize(chunks) { return chunks.flatMap((chunk) => chunk.modules).sort((modA, modB) => modB.renderedLength - modA.renderedLength); } exports.buildVendorDependencies = buildVendorDependencies; exports.formatModuleSizes = formatModuleSizes; exports.sortModulesBySize = sortModulesBySize; //# sourceMappingURL=moduleFormatUtils.js.map