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
137 lines (136 loc) • 5.96 kB
JavaScript
;
var path = require("node:path"), resolveFrom = require("resolve-from"), semver = require("semver"), fs = require("node:fs/promises"), chalk = require("chalk");
function _interopDefaultCompat(e) {
return e && typeof e == "object" && "default" in e ? e : { default: e };
}
var path__default = /* @__PURE__ */ _interopDefaultCompat(path), resolveFrom__default = /* @__PURE__ */ _interopDefaultCompat(resolveFrom), semver__default = /* @__PURE__ */ _interopDefaultCompat(semver), chalk__default = /* @__PURE__ */ _interopDefaultCompat(chalk);
function isPackageManifest(item) {
return typeof item == "object" && item !== null && "name" in item && "version" in item;
}
async function readPackageJson(filePath) {
try {
return JSON.parse(await fs.readFile(filePath, "utf8"));
} catch (err) {
throw new Error(`Failed to read "${filePath}": ${err.message}`);
}
}
async function readPackageManifest(packageJsonPath, defaults = {}) {
let manifest;
try {
manifest = {
...defaults,
...await readPackageJson(packageJsonPath)
};
} catch (err) {
throw new Error(`Failed to read "${packageJsonPath}": ${err.message}`);
}
if (!isPackageManifest(manifest))
throw new Error(`Failed to read "${packageJsonPath}": Invalid package manifest`);
const {
name,
version,
dependencies = {},
devDependencies = {}
} = manifest;
return {
name,
version,
dependencies,
devDependencies
};
}
function getRemoteResolvedVersion(fetchFn, url) {
return fetchFn(url, {
method: "HEAD",
redirect: "manual"
}).then((res) => {
if (res.ok || res.status < 400) {
const resolved = res.headers.get("x-resolved-version");
if (!resolved)
throw new Error(`Missing 'x-resolved-version' header on response from HEAD ${url}`);
return resolved;
}
throw new Error(`Unexpected HTTP response: ${res.status} ${res.statusText}`);
}, (err) => {
throw new Error(`Failed to fetch remote version for ${url}: ${err.message}`, {
cause: err
});
});
}
async function compareDependencyVersions(autoUpdatesImports, workDir, fetchFn = globalThis.fetch) {
const manifest = await readPackageManifest(path__default.default.join(workDir, "package.json")), dependencies = {
...manifest.dependencies,
...manifest.devDependencies
}, failedDependencies = [], filteredAutoUpdatesImports = Object.entries(autoUpdatesImports).filter(([pkg]) => !pkg.endsWith("/"));
for (const [pkg, value] of filteredAutoUpdatesImports) {
const resolvedVersion = await getRemoteResolvedVersion(fetchFn, value), dependency = dependencies[pkg], manifestPath = resolveFrom__default.default.silent(workDir, path__default.default.join(pkg, "package.json")), installed = semver__default.default.coerce(manifestPath ? (await readPackageManifest(manifestPath)).version : dependency);
if (!installed)
throw new Error(`Failed to parse installed version for ${pkg}`);
semver__default.default.eq(resolvedVersion, installed.version) || failedDependencies.push({
pkg,
installed: installed.version,
remote: resolvedVersion
});
}
return failedDependencies;
}
const MODULES_HOST = process.env.SANITY_INTERNAL_ENV === "staging" ? "https://sanity-cdn.work" : "https://sanity-cdn.com";
function getTimestamp() {
return `t${Math.floor(Date.now() / 1e3)}`;
}
function getStudioAutoUpdateImportMap(version, includeVision = !0) {
const timestamp = getTimestamp(), autoUpdatesImports = {
sanity: `${MODULES_HOST}/v1/modules/sanity/default/${version}/${timestamp}`,
"sanity/": `${MODULES_HOST}/v1/modules/sanity/default/${version}/${timestamp}/`
};
return includeVision ? {
...autoUpdatesImports,
"@sanity/vision": `${MODULES_HOST}/v1/modules/@sanity__vision/default/${version}/${timestamp}`,
"@sanity/vision/": `${MODULES_HOST}/v1/modules/@sanity__vision/default/${version}/${timestamp}/`
} : autoUpdatesImports;
}
function getAppAutoUpdateImportMap(options) {
const timestamp = getTimestamp(), {
sdkVersion,
sanityVersion
} = options, autoUpdatesImports = {
"@sanity/sdk": `${MODULES_HOST}/v1/modules/@sanity__sdk/default/${sdkVersion}/${timestamp}`,
"@sanity/sdk/": `${MODULES_HOST}/v1/modules/@sanity__sdk/default/${sdkVersion}/${timestamp}/`,
"@sanity/sdk-react": `${MODULES_HOST}/v1/modules/@sanity__sdk-react/default/${sdkVersion}/${timestamp}`,
"@sanity/sdk-react/": `${MODULES_HOST}/v1/modules/@sanity__sdk-react/default/${sdkVersion}/${timestamp}/`
};
if (sanityVersion) {
const sanityImportMap = getStudioAutoUpdateImportMap(sanityVersion, !1);
return {
...autoUpdatesImports,
...sanityImportMap
};
}
return autoUpdatesImports;
}
async function readModuleVersion(dir, moduleName) {
const manifestPath = resolveFrom__default.default.silent(dir, path__default.default.join(moduleName, "package.json"));
return manifestPath ? (await readPackageManifest(manifestPath)).version : null;
}
function shouldAutoUpdate({
flags,
cliConfig,
output
}) {
if ("auto-updates" in flags) {
if (output) {
const flagUsed = flags["auto-updates"] ? "--auto-updates" : "--no-auto-updates";
output.warn(chalk__default.default.yellow(`The ${flagUsed} flag is deprecated for \`deploy\` and \`build\` commands. Set the \`autoUpdates\` option in \`sanity.cli.ts\` or \`sanity.cli.js\` instead.`));
}
return !!flags["auto-updates"];
}
return cliConfig && "autoUpdates" in cliConfig ? !!cliConfig.autoUpdates : !1;
}
exports.compareDependencyVersions = compareDependencyVersions;
exports.getAppAutoUpdateImportMap = getAppAutoUpdateImportMap;
exports.getStudioAutoUpdateImportMap = getStudioAutoUpdateImportMap;
exports.readModuleVersion = readModuleVersion;
exports.readPackageJson = readPackageJson;
exports.readPackageManifest = readPackageManifest;
exports.shouldAutoUpdate = shouldAutoUpdate;
//# sourceMappingURL=shouldAutoUpdate.js.map