{"version":3,"file":"index.cjs","sources":["registerTypeConverter.js","convertModel.js"],"sourcesContent":["export const typeConverters = new Map();\nexport function registerTypeConverter(name, converter) {\n    if (typeConverters.has(name)) {\n        throw new Error(`Type converter ${name} has already been registered`);\n    }\n    typeConverters.set(name, converter);\n}\nexport function getTypeConverter(name) {\n    const converter = typeConverters.get(name);\n    return (converter || {\n        parse: (value) => value,\n        format: (value) => value,\n    });\n}\n","import { getTypeConverter } from './registerTypeConverter';\nimport { models, isCustomType, } from '@sjmeverett/clync-define';\nexport function convertModel(operation, schema, data, errors = [], path = '') {\n    const result = {};\n    for (const key in schema) {\n        result[key] = convertValue(operation, schema[key], data[key], errors, path + key);\n    }\n    return [errors, result];\n}\nexport function convertValue(operation, field, value, errors = [], key = '') {\n    if (value != null) {\n        if (field.array) {\n            if (!Array.isArray(value)) {\n                errors.push({ path: key, message: 'Expected array' });\n            }\n            else {\n                const element = isTypeDescriptor(field.type)\n                    ? { type: field.type, required: true }\n                    : field.type;\n                return value.map((value, i) => convertValue(operation, element, value, errors, `${key}.${i}`));\n            }\n        }\n        else {\n            const type = isTypeReference(field.type)\n                ? followTypeReference(field.type)\n                : field.type;\n            if (typeof field.type === 'string') {\n                return convertPrimitive(key, field.type, value, errors);\n            }\n            else if (field.type.kind === 'CustomType') {\n                return convertFieldCustomType(operation, key, isCustomType(type) ? getTypeConverter(type.name) : type, value, errors);\n            }\n            else if (field.type.kind === 'Model') {\n                const [, result] = convertModel(operation, type.schema, value, errors, `${key}.`);\n                return result;\n            }\n        }\n    }\n    else if (field.required && typeof value === 'undefined') {\n        errors.push({ path: key, message: 'Missing required field' });\n    }\n    else if (!field.nullable && value === null) {\n        errors.push({ path: key, message: 'Null supplied for non-nullable field' });\n    }\n    return value;\n}\nexport function convertOrThrow(operation, field, value) {\n    const errors = [];\n    const result = convertValue(operation, field, value);\n    if (errors.length) {\n        throw new ConversionError(errors);\n    }\n    return result;\n}\nexport class ConversionError extends Error {\n    constructor(errors) {\n        super('Conversion error ' +\n            errors.map((err) => `  ${err.path}: ${err.message}`).join('\\n'));\n        this.errors = errors;\n    }\n}\nfunction convertPrimitive(path, type, value, errors) {\n    if (type === 'string' && typeof value !== 'string') {\n        errors.push({ path, message: 'Expected string' });\n    }\n    else if (type === 'number' && typeof value !== 'number') {\n        errors.push({ path, message: 'Expected number' });\n    }\n    else if (type === 'boolean' && typeof value !== 'boolean') {\n        errors.push({ path, message: 'Expected boolean' });\n    }\n    return value;\n}\nfunction convertFieldCustomType(operation, path, convert, value, errors) {\n    try {\n        return convert[operation](value);\n    }\n    catch (e) {\n        errors.push({ path, message: e.message });\n    }\n    return value;\n}\nfunction isTypeReference(obj) {\n    return (obj === null || obj === void 0 ? void 0 : obj.kind) && (obj.kind === 'CustomType' || obj.kind === 'Model');\n}\nfunction followTypeReference(ref) {\n    if (ref.kind === 'Model') {\n        const model = models[ref.name];\n        if (!model) {\n            throw new Error(`Could not find model ${ref.name}`);\n        }\n        return model;\n    }\n    else {\n        return getTypeConverter(ref.name);\n    }\n}\nfunction isTypeDescriptor(obj) {\n    return (typeof obj === 'string' ||\n        ((obj === null || obj === void 0 ? void 0 : obj.kind) && (obj.kind === 'CustomType' || obj.kind === 'Model')));\n}\n"],"names":["isCustomType","models"],"mappings":"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"}