UNPKG

@sanity/export

Version:

Export Sanity documents and assets

97 lines 4.29 kB
import { ASSET_DOWNLOAD_MAX_RETRIES, DOCUMENT_STREAM_MAX_RETRIES, MODE_CURSOR, MODE_STREAM, REQUEST_READ_TIMEOUT, } from './constants.js'; const booleanFlags = ['assets', 'raw', 'compress', 'drafts']; const numberFlags = ['maxAssetRetries', 'maxRetries', 'assetConcurrency', 'readTimeout']; const exportDefaults = { compress: true, drafts: true, assets: true, assetsMap: true, raw: false, mode: MODE_STREAM, maxRetries: DOCUMENT_STREAM_MAX_RETRIES, maxAssetRetries: ASSET_DOWNLOAD_MAX_RETRIES, readTimeout: REQUEST_READ_TIMEOUT, filterDocument: () => true, transformDocument: (doc) => doc, }; export function validateOptions(opts) { const options = { ...exportDefaults, ...opts }; const dataset = 'dataset' in options && typeof options.dataset === 'string' ? options.dataset : undefined; const mediaLibraryId = 'mediaLibraryId' in options && typeof options.mediaLibraryId === 'string' ? options.mediaLibraryId : undefined; if (dataset && mediaLibraryId) { throw new Error('either `options.dataset` or `options.mediaLibraryId` must be specified, got both'); } if (!dataset && !mediaLibraryId) { throw new Error('either `options.dataset` or `options.mediaLibraryId` must be specified, got neither'); } const source = getSource(options); if (!source.id.trim()) { throw new Error(`Source (${source.type}) specified but was empty`); } // Type narrowing for mode validation const mode = options.mode; if (typeof mode !== 'string' || (mode !== MODE_STREAM && mode !== MODE_CURSOR)) { throw new Error(`options.mode must be either "${MODE_STREAM}" or "${MODE_CURSOR}", got "${mode}"`); } if (typeof options.onProgress !== 'undefined' && typeof options.onProgress !== 'function') { throw new Error(`options.onProgress must be a function`); } if ( // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition !options.client || !('config' in options.client) || typeof options.client.getUrl !== 'function') { throw new Error('`options.client` must be set to an instance of @sanity/client'); } const clientConfig = options.client.config(); if (!clientConfig.token) { throw new Error('Client is not instantiated with a `token`'); } for (const flag of booleanFlags) { if (typeof options[flag] !== 'boolean') { throw new Error(`Flag ${flag} must be a boolean (true/false)`); } } for (const flag of numberFlags) { if (typeof options[flag] !== 'undefined' && typeof options[flag] !== 'number') { throw new Error(`Flag ${flag} must be a number if specified`); } } if (!options.outputPath) { throw new Error('outputPath must be specified (- for stdout)'); } if (options.assetConcurrency && (options.assetConcurrency < 1 || options.assetConcurrency > 24)) { throw new Error('`assetConcurrency` must be between 1 and 24'); } if (typeof options.filterDocument !== 'undefined' && typeof options.filterDocument !== 'function') { throw new Error('`filterDocument` must be a function'); } if (typeof options.transformDocument !== 'undefined' && typeof options.transformDocument !== 'function') { throw new Error('`transformDocument` must be a function'); } if (typeof options.assetsMap !== 'undefined' && typeof options.assetsMap !== 'boolean') { throw new Error('`assetsMap` must be a boolean'); } return options; } /** * Determines the source type and ID from the provided options. * * @param options - The export options containing either dataset or mediaLibraryId. * @returns An object with the source type and its corresponding ID. * @internal */ export function getSource(options) { if ('dataset' in options && typeof options.dataset === 'string') { return { type: 'dataset', id: options.dataset }; } else if ('mediaLibraryId' in options && typeof options.mediaLibraryId === 'string') { return { type: 'media-library', id: options.mediaLibraryId }; } throw new Error('Either dataset or mediaLibraryId must be specified'); } //# sourceMappingURL=options.js.map