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
54 lines (53 loc) • 3.42 kB
JavaScript
;
var path = require("node:path"), exportDataset = require("@sanity/export"), determineTargetMediaLibrary = require("./determineTargetMediaLibrary.js");
function _interopDefaultCompat(e) {
return e && typeof e == "object" && "default" in e ? e : { default: e };
}
var path__default = /* @__PURE__ */ _interopDefaultCompat(path), exportDataset__default = /* @__PURE__ */ _interopDefaultCompat(exportDataset);
const DEFAULT_CONCURRENCY = 6, exportAssetsAction = async (args, context) => {
const {
apiClient,
output,
chalk
} = context, mediaLibraryId = args.extOptions["media-library-id"] ?? await determineTargetMediaLibrary.determineTargetMediaLibrary(context), client = apiClient().withConfig({
apiVersion: determineTargetMediaLibrary.MINIMUM_API_VERSION,
requestTagPrefix: "sanity.mediaLibraryCli.export"
}), outputPath = path__default.default.join(process.cwd(), `media-library-${mediaLibraryId}-${Date.now()}.tar.gz`);
output.print(), output.print(`Exporting from media library: ${chalk.bold(mediaLibraryId)}`), output.print(`Exporting to path: ${chalk.bold(outputPath)}`), output.print();
let currentStep = "Beginning export\u2026", spinner = output.spinner(currentStep).start();
try {
await exportDataset__default.default({
client,
mediaLibraryId,
outputPath,
drafts: !1,
types: ["sanity.asset"],
assetConcurrency: DEFAULT_CONCURRENCY,
mode: "stream",
onProgress: (progress) => {
progress.step !== currentStep ? (spinner.succeed(), spinner = output.spinner(progress.step).start()) : progress.step === currentStep && progress.update && (spinner.text = `${progress.step} (${progress.current}/${progress.total})`), currentStep = progress.step;
},
// The `assets.json` assets map is not required for Media Library archives, because the
// import process reads asset files directly from the archive.
assetsMap: !1,
// The documents listed in `data.ndjson` are only used for recording aspect data. If there
// is no aspect data, the document can safely be omitted.
filterDocument: (doc) => typeof doc != "object" || doc === null || !("aspects" in doc) || "assetType" in doc && doc.assetType === "sanity.videoAsset" ? !1 : typeof doc.aspects == "object" && doc.aspects !== null && Object.keys(doc.aspects).length !== 0,
// Media Library archives only record asset aspect data. All other data can be safely
// ommitted.
transformDocument: (doc) => typeof doc != "object" || doc === null || !("currentVersion" in doc) || !("aspects" in doc) || typeof doc.currentVersion != "object" || doc.currentVersion === null || !("_ref" in doc.currentVersion) || typeof doc.currentVersion._ref != "string" ? doc : {
filename: [[doc.currentVersion._ref.split("-")[0], "s"].join(""), generateFilename(doc.currentVersion._ref)].join("/"),
aspects: doc.aspects
}
});
} catch (error) {
throw spinner.fail("Failed to export media library"), error;
}
spinner.succeed(`Exported media library to ${chalk.bold(outputPath)}`);
};
function generateFilename(assetId) {
const [, , asset, ext] = assetId.match(/^(image|file)-(.*?)(-[a-z]+)?$/) || [], extension = (ext || "bin").replace(/^-/, "");
return asset ? `${asset}.${extension}` : `${assetId}.bin`;
}
exports.default = exportAssetsAction;
//# sourceMappingURL=exportAssetsAction.js.map