@sanity/import
Version:
Import documents to a Sanity dataset
97 lines (96 loc) • 3.3 kB
JavaScript
import fs from 'node:fs';
const clientMethods = [
'fetch',
'transaction',
'config'
];
const allowedOperations = [
'create',
'createIfNotExists',
'createOrReplace'
];
const allowedReleasesOperations = [
'fail',
'ignore',
'replace'
];
const defaultOperation = allowedOperations[0];
const defaultReleasesOperation = allowedReleasesOperations[0];
export function validateOptions(input, opts) {
const options = {
allowAssetsInDifferentDataset: false,
allowSystemDocuments: false,
onProgress: ()=>{},
operation: defaultOperation,
releasesOperation: defaultReleasesOperation,
replaceAssets: false,
skipCrossDatasetReferences: false,
tag: 'sanity.import',
...opts
};
if (!isValidInput(input)) {
throw new Error('Input does not seem to be a readable stream, an array or a path to a directory');
}
if (!options.client) {
throw new Error('`options.client` must be set to an instance of @sanity/client');
}
const missing = clientMethods.find((key)=>typeof options.client?.[key] !== 'function');
if (missing) {
throw new Error(`\`options.client\` is not a valid @sanity/client instance - no "${missing}" method found`);
}
const clientConfig = options.client.config();
if (!clientConfig.token) {
throw new Error('Client is not instantiated with a `token`');
}
// We don't want `sanity.cli.sanity.import`, so if this is coming from the CLI, unset the prefix
if (clientConfig.requestTagPrefix === 'sanity.cli' && options.tag === 'sanity.import') {
const newConfig = {
...clientConfig
};
delete newConfig.requestTagPrefix;
options.client = options.client.withConfig(newConfig);
}
if (!allowedOperations.includes(options.operation)) {
throw new Error(`Operation "${options.operation}" is not supported`);
}
if (!allowedReleasesOperations.includes(options.releasesOperation)) {
throw new Error(`Releases operation "${options.releasesOperation}" is not supported`);
}
if (options.assetConcurrency && options.assetConcurrency > 12) {
throw new Error('`assetConcurrency` must be <= 12');
}
if (typeof options.tag !== 'string' || !/^[a-z0-9._-]{1,75}$/i.test(options.tag)) {
throw new Error(`Tag can only contain alphanumeric characters, underscores, dashes and dots, and be between one and 75 characters long.`);
}
if (clientConfig.projectId) {
options.targetProjectId = clientConfig.projectId;
}
if (clientConfig.dataset) {
options.targetDataset = clientConfig.dataset;
}
return options;
}
function isValidInput(input) {
if (!input) {
return false;
}
if (typeof input === 'object' && input !== null && 'pipe' in input && typeof input.pipe === 'function') {
return true;
}
if (Array.isArray(input)) {
return true;
}
if (typeof input === 'string' && isDirectory(input)) {
return true;
}
return false;
}
function isDirectory(path) {
try {
const stats = fs.statSync(path);
return stats.isDirectory();
} catch {
return false;
}
}
//# sourceMappingURL=validateOptions.js.map