UNPKG

@kitmi/types

Version:

JavaScript semantic data types

100 lines (83 loc) 2.92 kB
import { ValidationError } from './errors'; import csvLineParse from '@kitmi/utils/csvLineParse'; import arrayToCsv from '@kitmi/utils/arrayToCsv'; import { padLeft } from '@kitmi/utils/padding'; import batchAsync_ from '@kitmi/utils/batchAsync_'; class T_ARRAY { name = 'array'; alias = ['list']; primitive = true; defaultValue = []; constructor(system) { this.system = system; } validate(value) { return Array.isArray(value); } _sanitize(value, meta, opts) { if (typeof value === 'string') { if (meta.csv) { value = csvLineParse(value, { delimiter: meta.delimiter || ',' }); } else { const trimmed = value.trim(); if (trimmed.startsWith('[') && trimmed.endsWith(']')) { value = JSON.parse(trimmed); } } } if (Array.isArray(value)) { if (meta.element) { const schema = typeof meta.element === 'function' ? meta.element() : meta.element; return value.map((a, i) => this.system.sanitize(a, schema, opts.i18n, { root: opts.root, parent: value, path: padLeft(`[${i}]`, opts.path), }) ); } return value; } throw new ValidationError('Invalid array value.', { value: opts.rawValue, path: opts.path, }); } async _sanitizeAsync(value, meta, opts) { if (typeof value === 'string') { if (meta.csv) { value = csvLineParse(value, { delimiter: meta.delimiter || ',' }); } else { const trimmed = value.trim(); if (trimmed.startsWith('[') && trimmed.endsWith(']')) { value = JSON.parse(trimmed); } } } if (Array.isArray(value)) { if (meta.element) { const schema = typeof meta.element === 'function' ? meta.element() : meta.element; return batchAsync_(value, (a, i) => this.system.sanitize_(a, schema, opts.i18n, { root: opts.root, parent: value, path: padLeft(`[${i}]`, opts.path), }) ); } return value; } throw new ValidationError('Invalid array value.', { value: opts.rawValue, path: opts.path, }); } serialize(value, typeInfo) { return value == null ? null : typeInfo?.csv ? arrayToCsv(value, typeInfo?.delimiter, this.system.getStringifier()) : this.system.safeJsonStringify(value); } } export default T_ARRAY;