@42.nl/jarb-final-form
Version:
Validating forms through JaRB.
147 lines (146 loc) • 6.64 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.JarbField = JarbField;
const jsx_runtime_1 = require("react/jsx-runtime");
const constraints_1 = require("./constraints");
const final_form_field_validation_1 = require("@42.nl/final-form-field-validation");
const utils_1 = require("./utils");
const Validators = __importStar(require("./validators"));
const regex_1 = require("./regex");
/**
* JarbField wraps final-form's Field, and adds the auto validation
* from the constraints. In fact it is a very thin wrapper around
* Field.
*
* It only demands one extra property called `jarb` which is used
* to to configure the Field. The `jarb` object needs two keys:
* the `validator` and the `label`.
*
* The `validator` follows the following format: `{Entity}.{Property}`.
* For example if the validator property is 'SuperHero.name' this means that
* the Field will apply the constraints for the 'name' property of
* the `SuperHero` entity.
*
* The `label` is used to inform you which field was wrong, when errors occur.
* You will receive the 'label' when an error occurs to create a nice
* error message.
*
* It is also possible to add custom field validators and async validators
* via the `validators` and `asyncValidators` props. The `asyncValidators`
* are only ran when the all synchronous `validators` have declared the
* field valid.
*
* See the documentation for some examples on how to create custom
* validators.
*
* @example
* ```JavaScript
* <JarbField
* name="Name"
* jarb={{ validator: 'SuperHero.name', label: "Name" }}
* component="input"
* type="text"
* />
* ```
*/
function JarbField(props) {
const { jarb: { label, validator, fractionalNumberRegex = regex_1.defaultFractionNumberRegex } } = props, fieldProps = __rest(props, ["jarb"]);
// Validator array must be copied to prevent duplicates when pushing validators
const validators = props.validators ? [...props.validators] : [];
const constraints = (0, constraints_1.getConstraints)();
if (constraints !== undefined) {
const fieldConstraints = (0, utils_1.getFieldConstraintsFor)(validator, constraints);
if (fieldConstraints !== false) {
const field = (0, utils_1.mostSpecificInputTypeFor)(fieldConstraints.types);
if (fieldConstraints.required) {
if (field === 'boolean') {
const requiredValidator = Validators.makeBooleanRequired(label);
validators.push(requiredValidator);
}
else {
const requiredValidator = Validators.makeRequired(label);
validators.push(requiredValidator);
}
}
if (field === 'text') {
if (fieldConstraints.minimumLength) {
const minimumLengthValidator = Validators.makeMinimumLength(label, fieldConstraints.minimumLength);
validators.push(minimumLengthValidator);
}
if (fieldConstraints.maximumLength) {
const maximumLengthValidator = Validators.makeMaximumLength(label, fieldConstraints.maximumLength);
validators.push(maximumLengthValidator);
}
}
if (fieldConstraints.min) {
const minValueValidator = Validators.makeMinValue(label, fieldConstraints.min);
validators.push(minValueValidator);
}
if (fieldConstraints.max) {
const maxValueValidator = Validators.makeMaxValue(label, fieldConstraints.max);
validators.push(maxValueValidator);
}
if (field === 'number' &&
fieldConstraints.fractionLength &&
fieldConstraints.fractionLength > 0) {
const patternValidator = Validators.makeNumberFraction(label, fieldConstraints.fractionLength, fractionalNumberRegex);
validators.push(patternValidator);
}
else if (field === 'number') {
const patternValidator = Validators.makeNumber(label);
validators.push(patternValidator);
}
}
else {
console.warn(`@42.nl/jarb-final-form: constraints for "${validator}" not found, but a JarbField was rendered, this should not occur, check your validator.`);
}
}
else {
console.warn('@42.nl/jarb-final-form: constraints are empty, but a JarbField was rendered, this should not occur, make sure the constraints are loaded before the form is displayed.');
}
return (0, jsx_runtime_1.jsx)(final_form_field_validation_1.Field, Object.assign({}, fieldProps, { validators: validators }));
}