PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.1.2
GiveWP – Donation Plugin and Fundraising Platform v3.1.2
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / DonationForms / resources / app / utilities / ConvertFieldAPIRulesToJoi.ts
give / src / DonationForms / resources / app / utilities Last commit date
ConvertFieldAPIRulesToJoi.ts 2 years ago PrepareFormData.ts 2 years ago amountFormatter.ts 2 years ago buildRegisterValidationOptions.ts 2 years ago conditionOperatorFunctions.js 2 years ago convertValuesToFormData.ts 2 years ago createValidationObjectFromFields.js 2 years ago generateRequestErrors.ts 2 years ago getCurrentFormUrlData.js 2 years ago getDefaultValuesFromSections.ts 2 years ago getDonationFormNodeSettings.ts 2 years ago getErrorByFieldName.ts 2 years ago getWindowData.ts 2 years ago groups.ts 2 years ago handleFormRedirect.ts 2 years ago handleFormSubmitRequest.ts 2 years ago handleValidationRequest.ts 2 years ago isRouteInlineRedirect.ts 2 years ago memoNode.ts 2 years ago mountWindowData.ts 2 years ago postData.ts 2 years ago postFormData.ts 2 years ago registerFieldAndBuildProps.tsx 2 years ago useDonationFormPubSub.ts 2 years ago
ConvertFieldAPIRulesToJoi.ts
173 lines
1 import Joi, {AnySchema, ObjectSchema} from 'joi';
2 import {BasicCondition, Field, Form, isField} from '@givewp/forms/types';
3 import {__, sprintf} from '@wordpress/i18n';
4 import conditionOperatorFunctions from '@givewp/forms/app/utilities/conditionOperatorFunctions';
5
6 /**
7 * @since 3.0.0
8 */
9 const requiredMessage = sprintf(
10 /* translators: base error message */
11 __('This is a required field', 'give'),
12 `{#label}`
13 );
14
15 /**
16 * @since 3.0.0
17 */
18 export default function getJoiRulesForForm(form: Form): ObjectSchema {
19 const joiRules = form.reduceNodes(
20 (rules, field: Field) => {
21 rules[field.name] = getJoiRulesForField(field);
22
23 return rules;
24 },
25 {},
26 isField
27 );
28
29 return Joi.object(joiRules).messages({
30 'string.base': requiredMessage,
31 'string.empty': requiredMessage,
32 'any.required': requiredMessage,
33 'number.base': requiredMessage,
34 'object.base': requiredMessage,
35 });
36 }
37
38 /**
39 * @since 3.0.0
40 */
41 function getJoiRulesForField(field: Field): AnySchema {
42 let rules: AnySchema = convertFieldAPIRulesToJoi(field.validationRules);
43
44 if (field.label) {
45 rules = rules.label(field.label);
46 }
47
48 return rules;
49 }
50
51 /**
52 * @since 3.0.0
53 */
54 function convertFieldAPIRulesToJoi(rules): AnySchema {
55 let joiRules;
56
57 if (Object.keys(rules).length === 0) {
58 return Joi.any();
59 }
60
61 if (rules.hasOwnProperty('numeric') || rules.hasOwnProperty('integer')) {
62 joiRules = Joi.number();
63
64 if (rules.hasOwnProperty('integer')) {
65 joiRules = joiRules.integer();
66 }
67 } else if (rules.hasOwnProperty('boolean')) {
68 joiRules = Joi.boolean();
69 } else if (rules.hasOwnProperty('array')) {
70 joiRules = Joi.array();
71 } else if (rules.hasOwnProperty('file')) {
72 joiRules = Joi.object();
73 } else if (rules.hasOwnProperty('dateTime')) {
74 joiRules = Joi.date();
75 } else {
76 joiRules = Joi.string();
77
78 if (rules.hasOwnProperty('email')) {
79 joiRules = joiRules.email({tlds: false});
80 }
81
82 if (rules.hasOwnProperty('alpha')) {
83 joiRules = joiRules.alpha();
84 }
85
86 if (rules.hasOwnProperty('alphanum')) {
87 joiRules = joiRules.alphanum();
88 }
89 }
90
91 if (rules.hasOwnProperty('number') || !rules.hasOwnProperty('boolean')) {
92 if (rules.hasOwnProperty('min')) {
93 joiRules = joiRules.min(rules.min);
94 }
95
96 if (rules.hasOwnProperty('max')) {
97 joiRules = joiRules.max(rules.max);
98 }
99 }
100
101 if (rules.required) {
102 if (rules.hasOwnProperty('excludeUnless')) {
103 /**
104 * This applies requirements to a field if the field is not being excluded by its conditions. It only
105 * supports basic conditions at this time, but could be expanded to support more complex conditions.
106 *
107 * Note that this unsets the value if the field conditions are not met.
108 */
109 joiRules = joiRules.custom((value, helpers) => {
110 const formValues = helpers.state.ancestors[0];
111
112 const passesConditions = rules.excludeUnless.every((condition: BasicCondition) => {
113 return conditionOperatorFunctions[condition.comparisonOperator](
114 formValues[condition.field],
115 condition.value
116 );
117 });
118
119 if (passesConditions && (value === '' || value === null)) {
120 return helpers.error('required');
121 } else if (!passesConditions) {
122 return undefined;
123 }
124
125 return value;
126 }, 'exclude unless validation');
127 } else {
128 joiRules = joiRules.required();
129 }
130 } else {
131 joiRules = joiRules.optional().allow('', null);
132 }
133
134 joiRules = getJoiRulesForAmountField(rules, joiRules);
135
136 return joiRules;
137 }
138
139 /**
140 * @since 3.0.0
141 */
142 function getJoiRulesForAmountField(rules, joiRules): AnySchema {
143 if (rules.hasOwnProperty('donationType')) {
144 joiRules = Joi.allow('single', 'subscription').only().required();
145 }
146
147 if (rules.hasOwnProperty('subscriptionPeriod')) {
148 joiRules = Joi.when('donationType', {
149 is: 'subscription',
150 then: Joi.allow('day', 'week', 'quarter', 'month', 'year').only().required(),
151 otherwise: Joi.optional(),
152 });
153 }
154
155 if (rules.hasOwnProperty('subscriptionFrequency')) {
156 joiRules = Joi.when('donationType', {
157 is: 'subscription',
158 then: Joi.number().integer().required(),
159 otherwise: Joi.optional(),
160 });
161 }
162
163 if (rules.hasOwnProperty('subscriptionInstallments')) {
164 joiRules = Joi.when('donationType', {
165 is: 'subscription',
166 then: Joi.number().integer().required(),
167 otherwise: Joi.optional(),
168 });
169 }
170
171 return joiRules;
172 }
173