@uploadcare/file-uploader
Version:
Building blocks for Uploadcare products integration
135 lines (117 loc) • 3.54 kB
JavaScript
// @ts-check
import { CameraSourceTypes } from '../CameraSource/constants.js';
import { deserializeCsv } from '../utils/comma-separated.js';
/** @param {unknown} value */
const asString = (value) => String(value);
/** @param {unknown} value */
const asNumber = (value) => {
const number = Number(value);
if (Number.isNaN(number)) {
throw new Error(`Invalid number: "${value}"`);
}
return number;
};
/** @param {unknown} value */
const asBoolean = (value) => {
if (typeof value === 'undefined' || value === null) return false;
if (typeof value === 'boolean') return value;
// for attr like multiple="true" (react will pass it as string)
if (value === 'true') return true;
// for attr flags like multiple="" (some other libs will pass it as empty string)
if (value === '') return true;
// for attr like multiple="false" (react will pass it as string)
if (value === 'false') return false;
throw new Error(`Invalid boolean: "${value}"`);
};
/** @param {unknown} value */
const asStore = (value) => (value === 'auto' ? value : asBoolean(value));
/** @param {unknown} value */
const asCameraCapture = (value) => {
const strValue = asString(value);
if (strValue !== 'user' && strValue !== 'environment' && strValue !== '') {
throw new Error(`Invalid value: "${strValue}"`);
}
return strValue;
};
/** @param {unknown} value */
const asCameraMode = (value) => {
const strValue = asString(value);
if (!Object.values(CameraSourceTypes).includes(strValue)) {
throw new Error(`Invalid value: "${strValue}"`);
}
return /** @type {import('../CameraSource/CameraSource.js').CameraMode} */ (strValue);
};
/** @param {unknown} value */
const asCameraModes = (value) => {
const str = asString(value);
const array = deserializeCsv(str);
if (array.some((item) => !Object.values(CameraSourceTypes).includes(item))) {
throw new Error(`Invalid value: "${JSON.stringify(array)}"`);
}
return str;
};
/** @param {unknown} value */
const asMetadata = (value) => {
if (typeof value === 'object' && !Array.isArray(value)) {
return /** @type {import('../../types').Metadata} */ (value);
}
if (typeof value === 'function') {
return /** @type {import('../../types').MetadataCallback} */ (value);
}
throw new Error('Invalid metadata value. Must be an object or function.');
};
/**
* @template {{}} T
* @param {unknown} value
* @returns {T}
*/
const asObject = (value) => {
if (typeof value === 'object') {
return /** @type {T} */ (value);
}
throw new Error('Invalid value. Must be an object.');
};
/**
* @template {Function} T
* @param {unknown} value
* @returns {T}
*/
const asFunction = (value) => {
if (typeof value === 'function') {
return /** @type {T} */ (value);
}
throw new Error('Invalid value. Must be a function.');
};
/**
* @template {Function[] | string | {}} T
* @param {unknown} value
* @returns {T}
*/
const asArray = (value) => {
if (Array.isArray(value)) {
return /** @type {T} */ (value);
}
throw new Error('Must be an array.');
};
/** @param {unknown} value */
const asFilesViewMode = (value) => {
const strValue = asString(value);
if (['grid', 'list'].includes(strValue)) {
return /** @type {import('../UploadList/UploadList.js').FilesViewMode} */ (strValue);
}
throw new Error(`Invalid value: "${strValue}"`);
};
export {
asString,
asNumber,
asBoolean,
asStore,
asCameraCapture,
asCameraMode,
asCameraModes,
asMetadata,
asObject,
asFunction,
asArray,
asFilesViewMode,
};