@vtaits/form-schema
Version:
Serialization and parsing form values by schema
411 lines (404 loc) • 10 kB
JavaScript
// src/core/parse.ts
var defaultParser = ({
values,
name
}) => {
if (typeof values[name] !== "undefined") {
return {
[name]: values[name]
};
}
return {
[name]: null
};
};
async function parse({
values,
names,
getFieldSchema,
getFieldType,
parents
}) {
if (!values) {
return {};
}
const preparsedValues = await Promise.all(
names.map(async (name) => {
const fieldSchema = getFieldSchema(name);
const fieldType = getFieldType(fieldSchema);
const dependencies = fieldSchema.getDependencies?.({
values,
phase: "parse",
getFieldSchema,
getFieldType,
parents
});
const computedGetFieldSchema = fieldType.createGetFieldSchema ? await fieldType.createGetFieldSchema({
fieldSchema,
getFieldSchema,
getFieldType,
values,
phase: "parse",
parents,
dependencies
}) : getFieldSchema;
const params = {
value: values[name],
values,
name,
fieldSchema,
getFieldSchema: computedGetFieldSchema,
getFieldType,
parents,
dependencies
};
const parserSingle = fieldSchema.parserSingle || fieldType.parserSingle;
if (parserSingle) {
const singleResult = await parserSingle(params);
return {
[name]: singleResult
};
}
const parser = fieldSchema.parser || fieldType.parser || defaultParser;
return parser(params);
})
);
const res = {};
for (const parsedValue of preparsedValues) {
Object.assign(res, parsedValue);
}
return res;
}
// src/core/parseSingle.ts
async function parseSingle({
values,
name,
getFieldSchema,
getFieldType,
parents
}) {
if (!values) {
return null;
}
const fieldSchema = getFieldSchema(name);
const fieldType = getFieldType(fieldSchema);
const dependencies = fieldSchema.getDependencies?.({
values,
phase: "parse",
getFieldSchema,
getFieldType,
parents
});
const computedGetFieldSchema = fieldType.createGetFieldSchema ? await fieldType.createGetFieldSchema({
fieldSchema,
getFieldSchema,
getFieldType,
values,
phase: "parse",
parents,
dependencies
}) : getFieldSchema;
const params = {
value: values[name],
values,
name,
fieldSchema,
getFieldSchema: computedGetFieldSchema,
getFieldType,
parents,
dependencies
};
const parserSingle = fieldSchema.parserSingle || fieldType.parserSingle;
if (parserSingle) {
return parserSingle(params);
}
const parser = fieldSchema.parser || fieldType.parser || defaultParser;
const parserResult = await parser(params);
return parserResult[name];
}
// src/core/serialize.ts
var defaultSerializer = ({
values,
name
}) => {
if (typeof values[name] !== "undefined") {
return {
[name]: values[name]
};
}
return {};
};
async function serialize({
values,
names,
getFieldSchema,
getFieldType,
parents
}) {
const preserializedValues = await Promise.all(
names.map(async (name) => {
const fieldSchema = getFieldSchema(name);
const fieldType = getFieldType(fieldSchema);
const dependencies = fieldSchema.getDependencies?.({
values,
phase: "serialize",
getFieldSchema,
getFieldType,
parents
});
const computedGetFieldSchema = fieldType.createGetFieldSchema ? await fieldType.createGetFieldSchema({
fieldSchema,
getFieldSchema,
getFieldType,
values,
phase: "serialize",
parents,
dependencies
}) : getFieldSchema;
const params = {
value: values[name],
values,
name,
fieldSchema,
getFieldSchema: computedGetFieldSchema,
getFieldType,
parents,
dependencies
};
const serializerSingle = fieldSchema.serializerSingle || fieldType.serializerSingle;
if (serializerSingle) {
const singleResult = await serializerSingle(params);
return {
[name]: singleResult
};
}
const serializer = fieldSchema.serializer || fieldType.serializer || defaultSerializer;
return serializer(params);
})
);
const res = {};
for (const serializedValue of preserializedValues) {
Object.assign(res, serializedValue);
}
return res;
}
// src/core/serializeSingle.ts
async function serializeSingle({
values,
name,
getFieldSchema,
getFieldType,
parents
}) {
const fieldSchema = getFieldSchema(name);
const fieldType = getFieldType(fieldSchema);
const dependencies = fieldSchema.getDependencies?.({
values,
phase: "serialize",
getFieldSchema,
getFieldType,
parents
});
const computedGetFieldSchema = fieldType.createGetFieldSchema ? await fieldType.createGetFieldSchema({
fieldSchema,
getFieldSchema,
getFieldType,
values,
phase: "serialize",
parents,
dependencies
}) : getFieldSchema;
const params = {
value: values[name],
values,
name,
fieldSchema,
getFieldSchema: computedGetFieldSchema,
getFieldType,
parents,
dependencies
};
const serializerSingle = fieldSchema.serializerSingle || fieldType.serializerSingle;
if (serializerSingle) {
return serializerSingle(params);
}
const serializer = fieldSchema.serializer || fieldType.serializer || defaultSerializer;
const serialized = await serializer(params);
return serialized[name];
}
// src/core/setFieldErrors.ts
var defaultFieldErrorsSetter = ({ setError, errors, name, parents }) => {
if (typeof errors[name] !== "undefined") {
setError(name, parents, errors[name]);
}
};
async function setFieldErrors({
setError,
errors,
names,
getFieldSchema,
getFieldType,
values,
rawValues,
parents
}) {
await Promise.all(
names.map(async (name) => {
const fieldSchema = getFieldSchema(name);
const fieldType = getFieldType(fieldSchema);
const dependencies = fieldSchema.getDependencies?.({
values,
phase: "serialize",
getFieldSchema,
getFieldType,
parents
});
const errorsSetter = fieldSchema.errorsSetter || fieldType.errorsSetter || defaultFieldErrorsSetter;
const computedGetFieldSchema = fieldType.createGetFieldSchema ? await fieldType.createGetFieldSchema({
fieldSchema,
getFieldSchema,
getFieldType,
values: rawValues,
phase: "serialize",
parents,
dependencies
}) : getFieldSchema;
await errorsSetter({
setError,
setCurrentError: (error) => {
setError(name, parents, error);
},
errors,
name,
fieldSchema,
getFieldSchema: computedGetFieldSchema,
getFieldType,
value: values[name],
values,
rawValue: rawValues[name],
rawValues,
parents,
dependencies
});
})
);
}
// src/core/setValues.ts
var defaultValueSetter = ({
setValue,
value,
name,
parents
}) => {
if (typeof value === "undefined") {
return;
}
const prefix = parents.filter((parent) => typeof parent.name !== "undefined").map((parent) => parent.name).join(".");
setValue(prefix ? `${prefix}.${name}` : `${name}`, value);
};
async function setValues({
setValue,
values,
names,
getFieldSchema,
getFieldType,
parents
}) {
await Promise.all(
names.map(async (name) => {
const fieldSchema = getFieldSchema(name);
const fieldType = getFieldType(fieldSchema);
const dependencies = fieldSchema.getDependencies?.({
values,
phase: "render",
getFieldSchema,
getFieldType,
parents
});
const computedGetFieldSchema = fieldType.createGetFieldSchema ? await fieldType.createGetFieldSchema({
fieldSchema,
getFieldSchema,
getFieldType,
values,
phase: "render",
parents,
dependencies
}) : getFieldSchema;
const params = {
setValue,
value: values[name],
values,
name,
fieldSchema,
getFieldSchema: computedGetFieldSchema,
getFieldType,
parents,
dependencies
};
const valueSetter = fieldSchema.valueSetter || fieldType.valueSetter || defaultValueSetter;
valueSetter(params);
})
);
}
// src/core/validateBeforeSubmit.ts
async function validateBeforeSubmit({
setError,
values,
names,
getFieldSchema,
getFieldType,
parents
}) {
await Promise.all(
names.map(async (name) => {
const fieldSchema = getFieldSchema(name);
const fieldType = getFieldType(fieldSchema);
const dependencies = fieldSchema.getDependencies?.({
values,
phase: "serialize",
getFieldSchema,
getFieldType,
parents
});
const validatorBeforeSubmit = fieldSchema.validatorBeforeSubmit || fieldType.validatorBeforeSubmit;
if (validatorBeforeSubmit) {
const computedGetFieldSchema = fieldType.createGetFieldSchema ? await fieldType.createGetFieldSchema({
fieldSchema,
getFieldSchema,
getFieldType,
values,
phase: "serialize",
parents,
dependencies
}) : getFieldSchema;
await validatorBeforeSubmit({
setError,
setCurrentError: (error) => {
setError(name, parents, error);
},
value: values[name],
values,
name,
fieldSchema,
getFieldSchema: computedGetFieldSchema,
getFieldType,
parents,
dependencies
});
}
})
);
}
export {
defaultParser,
parse,
parseSingle,
defaultSerializer,
serialize,
serializeSingle,
defaultFieldErrorsSetter,
setFieldErrors,
setValues,
validateBeforeSubmit
};
//# sourceMappingURL=chunk-3DE3JEEE.js.map