@strapi/content-type-builder 5.50.0 → 5.50.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/AIChat/Chat.js +2 -4
- package/dist/admin/components/AIChat/Chat.js.map +1 -1
- package/dist/admin/components/AIChat/Chat.mjs +2 -4
- package/dist/admin/components/AIChat/Chat.mjs.map +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.js +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Messages/Message.js +8 -3
- package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -1
- package/dist/admin/components/AIChat/components/Messages/Message.mjs +8 -3
- package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -1
- package/dist/admin/components/AIChat/lib/aiClient.js +8 -2
- package/dist/admin/components/AIChat/lib/aiClient.js.map +1 -1
- package/dist/admin/components/AIChat/lib/aiClient.mjs +8 -2
- package/dist/admin/components/AIChat/lib/aiClient.mjs.map +1 -1
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js +0 -3
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js.map +1 -1
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs +0 -3
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs.map +1 -1
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +9 -7
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -1
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +9 -7
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.js +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
- package/dist/admin/components/AllowedTypesSelect.js.map +1 -1
- package/dist/admin/components/AllowedTypesSelect.mjs.map +1 -1
- package/dist/admin/components/AttributeIcon.js +1 -1
- package/dist/admin/components/AttributeIcon.js.map +1 -1
- package/dist/admin/components/AttributeIcon.mjs +1 -1
- package/dist/admin/components/AttributeIcon.mjs.map +1 -1
- package/dist/admin/components/BooleanDefaultValueSelect.js +3 -2
- package/dist/admin/components/BooleanDefaultValueSelect.js.map +1 -1
- package/dist/admin/components/BooleanDefaultValueSelect.mjs +3 -2
- package/dist/admin/components/BooleanDefaultValueSelect.mjs.map +1 -1
- package/dist/admin/components/BooleanRadioGroup.js.map +1 -1
- package/dist/admin/components/BooleanRadioGroup.mjs.map +1 -1
- package/dist/admin/components/CTBSession/useCTBTracking.js +3 -3
- package/dist/admin/components/CTBSession/useCTBTracking.js.map +1 -1
- package/dist/admin/components/CTBSession/useCTBTracking.mjs +3 -3
- package/dist/admin/components/CTBSession/useCTBTracking.mjs.map +1 -1
- package/dist/admin/components/CheckboxWithNumberField.js +3 -2
- package/dist/admin/components/CheckboxWithNumberField.js.map +1 -1
- package/dist/admin/components/CheckboxWithNumberField.mjs +3 -2
- package/dist/admin/components/CheckboxWithNumberField.mjs.map +1 -1
- package/dist/admin/components/ComponentCard/ComponentCard.js.map +1 -1
- package/dist/admin/components/ComponentCard/ComponentCard.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js +160 -162
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs +160 -162
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs.map +1 -1
- package/dist/admin/components/ContentTypeRadioGroup.js.map +1 -1
- package/dist/admin/components/ContentTypeRadioGroup.mjs.map +1 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js +6 -5
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js.map +1 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs +6 -5
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs.map +1 -1
- package/dist/admin/components/CustomRadioGroup/Styles.js.map +1 -1
- package/dist/admin/components/CustomRadioGroup/Styles.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.js +16 -4
- package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.mjs +16 -4
- package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
- package/dist/admin/components/DataManager/reducer.js +2 -2
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.mjs +2 -2
- package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
- package/dist/admin/components/DataManager/useServerRestartWatcher.js.map +1 -1
- package/dist/admin/components/DataManager/useServerRestartWatcher.mjs.map +1 -1
- package/dist/admin/components/DataManager/utils/retrieveSpecificInfoFromComponents.js.map +1 -1
- package/dist/admin/components/DataManager/utils/retrieveSpecificInfoFromComponents.mjs.map +1 -1
- package/dist/admin/components/DraftAndPublishToggle.js.map +1 -1
- package/dist/admin/components/DraftAndPublishToggle.mjs.map +1 -1
- package/dist/admin/components/DynamicZoneList.js.map +1 -1
- package/dist/admin/components/DynamicZoneList.mjs.map +1 -1
- package/dist/admin/components/FormModal/FormModal.js +91 -71
- package/dist/admin/components/FormModal/FormModal.js.map +1 -1
- package/dist/admin/components/FormModal/FormModal.mjs +91 -70
- package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.js +20 -17
- package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.mjs +20 -17
- package/dist/admin/components/FormModal/attributes/ConditionForm.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/validation/common.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/validation/common.mjs.map +1 -1
- package/dist/admin/components/FormModal/forms/forms.js +4 -6
- package/dist/admin/components/FormModal/forms/forms.js.map +1 -1
- package/dist/admin/components/FormModal/forms/forms.mjs +4 -6
- package/dist/admin/components/FormModal/forms/forms.mjs.map +1 -1
- package/dist/admin/components/FormModal/forms/utils/getUsedAttributeNames.js.map +1 -1
- package/dist/admin/components/FormModal/forms/utils/getUsedAttributeNames.mjs.map +1 -1
- package/dist/admin/components/FormModal/reducer.js +9 -6
- package/dist/admin/components/FormModal/reducer.js.map +1 -1
- package/dist/admin/components/FormModal/reducer.mjs +9 -6
- package/dist/admin/components/FormModal/reducer.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/customFieldDefaultOptionsReducer.js +3 -3
- package/dist/admin/components/FormModal/utils/customFieldDefaultOptionsReducer.js.map +1 -1
- package/dist/admin/components/FormModal/utils/customFieldDefaultOptionsReducer.mjs +3 -3
- package/dist/admin/components/FormModal/utils/customFieldDefaultOptionsReducer.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/getFormInputNames.js +1 -1
- package/dist/admin/components/FormModal/utils/getFormInputNames.js.map +1 -1
- package/dist/admin/components/FormModal/utils/getFormInputNames.mjs +1 -1
- package/dist/admin/components/FormModal/utils/getFormInputNames.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/relations.js +2 -2
- package/dist/admin/components/FormModal/utils/relations.js.map +1 -1
- package/dist/admin/components/FormModal/utils/relations.mjs +2 -2
- package/dist/admin/components/FormModal/utils/relations.mjs.map +1 -1
- package/dist/admin/components/FormModalHeader.js.map +1 -1
- package/dist/admin/components/FormModalHeader.mjs.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationContext.js.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationContext.mjs.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.js +13 -13
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.js.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.mjs +13 -13
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.mjs.map +1 -1
- package/dist/admin/components/GenericInputs.js +24 -12
- package/dist/admin/components/GenericInputs.js.map +1 -1
- package/dist/admin/components/GenericInputs.mjs +24 -12
- package/dist/admin/components/GenericInputs.mjs.map +1 -1
- package/dist/admin/components/IconPicker/IconPicker.js.map +1 -1
- package/dist/admin/components/IconPicker/IconPicker.mjs.map +1 -1
- package/dist/admin/components/PluralName.js.map +1 -1
- package/dist/admin/components/PluralName.mjs.map +1 -1
- package/dist/admin/components/Relation/Relation.js +3 -3
- package/dist/admin/components/Relation/Relation.js.map +1 -1
- package/dist/admin/components/Relation/Relation.mjs +3 -3
- package/dist/admin/components/Relation/Relation.mjs.map +1 -1
- package/dist/admin/components/Relation/RelationField/RelationField.js +1 -1
- package/dist/admin/components/Relation/RelationField/RelationField.js.map +1 -1
- package/dist/admin/components/Relation/RelationField/RelationField.mjs +1 -1
- package/dist/admin/components/Relation/RelationField/RelationField.mjs.map +1 -1
- package/dist/admin/components/SelectCategory.js +6 -0
- package/dist/admin/components/SelectCategory.js.map +1 -1
- package/dist/admin/components/SelectCategory.mjs +6 -0
- package/dist/admin/components/SelectCategory.mjs.map +1 -1
- package/dist/admin/components/SelectComponent.js +1 -1
- package/dist/admin/components/SelectComponent.js.map +1 -1
- package/dist/admin/components/SelectComponent.mjs +1 -1
- package/dist/admin/components/SelectComponent.mjs.map +1 -1
- package/dist/admin/components/SingularName.js.map +1 -1
- package/dist/admin/components/SingularName.mjs.map +1 -1
- package/dist/admin/components/TabForm.js +50 -51
- package/dist/admin/components/TabForm.js.map +1 -1
- package/dist/admin/components/TabForm.mjs +51 -52
- package/dist/admin/components/TabForm.mjs.map +1 -1
- package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +1 -2
- package/dist/admin/src/components/AIChat/lib/aiClient.d.ts +1 -1
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/fromCTB.d.ts +6 -2
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +1 -1
- package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +5 -5
- package/dist/admin/src/components/AllowedTypesSelect.d.ts +3 -3
- package/dist/admin/src/components/BooleanDefaultValueSelect.d.ts +3 -3
- package/dist/admin/src/components/BooleanRadioGroup.d.ts +2 -2
- package/dist/admin/src/components/CTBSession/useCTBTracking.d.ts +1 -1
- package/dist/admin/src/components/CheckboxWithNumberField.d.ts +6 -4
- package/dist/admin/src/components/ContentTypeRadioGroup.d.ts +3 -2
- package/dist/admin/src/components/CustomRadioGroup/CustomRadioGroup.d.ts +3 -2
- package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +13 -11
- package/dist/admin/src/components/DataManager/reducer.d.ts +14 -10
- package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +8 -8
- package/dist/admin/src/components/DataManager/utils/formatSchemas.d.ts +9 -3
- package/dist/admin/src/components/DataManager/utils/retrieveSpecificInfoFromComponents.d.ts +2 -1
- package/dist/admin/src/components/DraftAndPublishToggle.d.ts +1 -6
- package/dist/admin/src/components/DynamicZoneList.d.ts +2 -2
- package/dist/admin/src/components/FormModal/attributes/ConditionForm.d.ts +3 -2
- package/dist/admin/src/components/FormModal/attributes/validation/common.d.ts +3 -1
- package/dist/admin/src/components/FormModal/forms/forms.d.ts +59 -26
- package/dist/admin/src/components/FormModal/forms/utils/getUsedAttributeNames.d.ts +12 -2
- package/dist/admin/src/components/FormModal/reducer.d.ts +104 -32
- package/dist/admin/src/components/FormModal/utils/customFieldDefaultOptionsReducer.d.ts +11 -1
- package/dist/admin/src/components/FormModal/utils/getFormInputNames.d.ts +8 -1
- package/dist/admin/src/components/FormModal/utils/relations.d.ts +2 -2
- package/dist/admin/src/components/FormModalHeader.d.ts +5 -8
- package/dist/admin/src/components/FormModalNavigation/FormModalNavigationContext.d.ts +2 -2
- package/dist/admin/src/components/FormModalNavigation/FormModalNavigationProvider.d.ts +17 -1
- package/dist/admin/src/components/GenericInputs.d.ts +12 -7
- package/dist/admin/src/components/IconPicker/IconPicker.d.ts +2 -7
- package/dist/admin/src/components/PluralName.d.ts +6 -14
- package/dist/admin/src/components/Relation/Relation.d.ts +12 -3
- package/dist/admin/src/components/Relation/RelationField/RelationField.d.ts +3 -2
- package/dist/admin/src/components/SelectCategory.d.ts +3 -12
- package/dist/admin/src/components/SelectComponent.d.ts +8 -7
- package/dist/admin/src/components/SingularName.d.ts +5 -8
- package/dist/admin/src/components/TabForm.d.ts +38 -7
- package/dist/admin/src/types.d.ts +20 -12
- package/dist/admin/src/utils/conditions.d.ts +13 -4
- package/dist/admin/src/utils/formAPI.d.ts +38 -33
- package/dist/admin/src/utils/getRelationType.d.ts +1 -1
- package/dist/admin/src/utils/parseNumberInputValue.d.ts +1 -0
- package/dist/admin/utils/conditions.js +38 -28
- package/dist/admin/utils/conditions.js.map +1 -1
- package/dist/admin/utils/conditions.mjs +37 -28
- package/dist/admin/utils/conditions.mjs.map +1 -1
- package/dist/admin/utils/formAPI.js +9 -6
- package/dist/admin/utils/formAPI.js.map +1 -1
- package/dist/admin/utils/formAPI.mjs +9 -6
- package/dist/admin/utils/formAPI.mjs.map +1 -1
- package/dist/admin/utils/getRelationType.js +3 -0
- package/dist/admin/utils/getRelationType.js.map +1 -1
- package/dist/admin/utils/getRelationType.mjs +3 -0
- package/dist/admin/utils/getRelationType.mjs.map +1 -1
- package/dist/admin/utils/getYupInnerErrors.js +6 -4
- package/dist/admin/utils/getYupInnerErrors.js.map +1 -1
- package/dist/admin/utils/getYupInnerErrors.mjs +6 -4
- package/dist/admin/utils/getYupInnerErrors.mjs.map +1 -1
- package/dist/admin/utils/parseNumberInputValue.js +15 -0
- package/dist/admin/utils/parseNumberInputValue.js.map +1 -0
- package/dist/admin/utils/parseNumberInputValue.mjs +13 -0
- package/dist/admin/utils/parseNumberInputValue.mjs.map +1 -0
- package/dist/server/controllers/validation/relations.js +1 -1
- package/dist/server/controllers/validation/relations.js.map +1 -1
- package/dist/server/controllers/validation/relations.mjs +1 -1
- package/dist/server/controllers/validation/relations.mjs.map +1 -1
- package/dist/server/controllers/validation/types.js +4 -3
- package/dist/server/controllers/validation/types.js.map +1 -1
- package/dist/server/controllers/validation/types.mjs +4 -3
- package/dist/server/controllers/validation/types.mjs.map +1 -1
- package/package.json +7 -7
|
@@ -1,44 +1,53 @@
|
|
|
1
|
+
const isRecord = (value)=>typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
2
|
+
const isFieldVar = (value)=>isRecord(value) && typeof value.var === 'string';
|
|
3
|
+
const isAttributeConditionValue = (value)=>typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
4
|
+
const getVisibleConditionEntries = (condition)=>{
|
|
5
|
+
const visible = condition?.visible;
|
|
6
|
+
if (!isRecord(visible)) {
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
return Object.entries(visible).reduce((entries, [operator, rule])=>{
|
|
10
|
+
if (!Array.isArray(rule)) {
|
|
11
|
+
return entries;
|
|
12
|
+
}
|
|
13
|
+
const [fieldVar, value] = rule;
|
|
14
|
+
if (!isFieldVar(fieldVar) || !isAttributeConditionValue(value)) {
|
|
15
|
+
return entries;
|
|
16
|
+
}
|
|
17
|
+
entries.push({
|
|
18
|
+
operator,
|
|
19
|
+
fieldVar,
|
|
20
|
+
value
|
|
21
|
+
});
|
|
22
|
+
return entries;
|
|
23
|
+
}, []);
|
|
24
|
+
};
|
|
25
|
+
const getFirstVisibleConditionEntry = (condition)=>getVisibleConditionEntries(condition)[0] ?? null;
|
|
1
26
|
const checkDependentRows = (contentTypes, fieldName)=>{
|
|
2
27
|
const dependentRows = [];
|
|
3
28
|
Object.entries(contentTypes).forEach(([contentTypeUid, contentType])=>{
|
|
4
|
-
if (contentType.attributes) {
|
|
29
|
+
if (contentType.attributes !== undefined) {
|
|
5
30
|
// Handle both array and object formats of attributes
|
|
6
31
|
const attributes = Array.isArray(contentType.attributes) ? contentType.attributes.reduce((acc, attr, index)=>{
|
|
7
32
|
acc[index.toString()] = attr;
|
|
8
33
|
return acc;
|
|
9
34
|
}, {}) : contentType.attributes;
|
|
10
35
|
Object.entries(attributes).forEach(([attrName, attr])=>{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
}
|
|
36
|
+
getVisibleConditionEntries(attr.conditions).forEach(({ fieldVar })=>{
|
|
37
|
+
// Check if this condition references our field
|
|
38
|
+
if (fieldVar.var === fieldName) {
|
|
39
|
+
dependentRows.push({
|
|
40
|
+
contentTypeUid,
|
|
41
|
+
contentType: contentType.info.displayName,
|
|
42
|
+
attribute: attr.name || attrName
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
});
|
|
24
46
|
});
|
|
25
47
|
}
|
|
26
48
|
});
|
|
27
49
|
return dependentRows;
|
|
28
50
|
};
|
|
29
|
-
const formatCondition = (condition, availableFields, attributeName)=>{
|
|
30
|
-
if (!condition?.visible) {
|
|
31
|
-
return '';
|
|
32
|
-
}
|
|
33
|
-
const [[operator, conditions]] = Object.entries(condition.visible);
|
|
34
|
-
const [fieldVar, value] = conditions;
|
|
35
|
-
const dependsOnField = availableFields.find((field)=>field.name === fieldVar.var);
|
|
36
|
-
const dependsOnFieldName = dependsOnField ? dependsOnField.name : fieldVar.var;
|
|
37
|
-
const operatorText = operator === '==' ? 'is' : 'is not';
|
|
38
|
-
const valueText = String(value);
|
|
39
|
-
const actionText = operator === '==' ? 'Show' : 'Hide';
|
|
40
|
-
return `If ${dependsOnFieldName} ${operatorText} ${valueText}, then ${actionText} ${attributeName}`;
|
|
41
|
-
};
|
|
42
51
|
const getAvailableConditionFields = (attributes, currentFieldName)=>{
|
|
43
52
|
return attributes.filter((attr)=>{
|
|
44
53
|
// Only include boolean and enum fields
|
|
@@ -53,5 +62,5 @@ const getAvailableConditionFields = (attributes, currentFieldName)=>{
|
|
|
53
62
|
}));
|
|
54
63
|
};
|
|
55
64
|
|
|
56
|
-
export { checkDependentRows,
|
|
65
|
+
export { checkDependentRows, getAvailableConditionFields, getFirstVisibleConditionEntry, getVisibleConditionEntries };
|
|
57
66
|
//# sourceMappingURL=conditions.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditions.mjs","sources":["../../../admin/src/utils/conditions.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"conditions.mjs","sources":["../../../admin/src/utils/conditions.ts"],"sourcesContent":["import type {\n AnyAttribute,\n AttributeConditionValue,\n AttributeConditions,\n ContentTypes,\n} from '../types';\n\ninterface DependentRow {\n contentTypeUid: string;\n contentType: string;\n attribute: string;\n}\n\ntype VisibleConditionEntry = {\n operator: string;\n fieldVar: { var: string };\n value: AttributeConditionValue;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst isFieldVar = (value: unknown): value is { var: string } =>\n isRecord(value) && typeof value.var === 'string';\n\nconst isAttributeConditionValue = (value: unknown): value is AttributeConditionValue =>\n typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n\nexport const getVisibleConditionEntries = (\n condition?: AttributeConditions | null\n): VisibleConditionEntry[] => {\n const visible = condition?.visible;\n\n if (!isRecord(visible)) {\n return [];\n }\n\n return Object.entries(visible).reduce<VisibleConditionEntry[]>((entries, [operator, rule]) => {\n if (!Array.isArray(rule)) {\n return entries;\n }\n\n const [fieldVar, value] = rule;\n\n if (!isFieldVar(fieldVar) || !isAttributeConditionValue(value)) {\n return entries;\n }\n\n entries.push({ operator, fieldVar, value });\n\n return entries;\n }, []);\n};\n\nexport const getFirstVisibleConditionEntry = (condition?: AttributeConditions | null) =>\n getVisibleConditionEntries(condition)[0] ?? null;\n\nexport const checkDependentRows = (\n contentTypes: ContentTypes,\n fieldName: string\n): DependentRow[] => {\n const dependentRows: DependentRow[] = [];\n\n Object.entries(contentTypes).forEach(([contentTypeUid, contentType]) => {\n if (contentType.attributes !== undefined) {\n // Handle both array and object formats of attributes\n const attributes = Array.isArray(contentType.attributes)\n ? contentType.attributes.reduce<Record<string, AnyAttribute>>((acc, attr, index) => {\n acc[index.toString()] = attr;\n return acc;\n }, {})\n : contentType.attributes;\n\n Object.entries(attributes).forEach(([attrName, attr]) => {\n getVisibleConditionEntries(attr.conditions).forEach(({ fieldVar }) => {\n // Check if this condition references our field\n if (fieldVar.var === fieldName) {\n dependentRows.push({\n contentTypeUid,\n contentType: contentType.info.displayName,\n attribute: attr.name || attrName,\n });\n }\n });\n });\n }\n });\n return dependentRows;\n};\n\nexport const formatCondition = (\n condition: AttributeConditions,\n availableFields: Array<{ name: string; type: string }>,\n attributeName: string\n): string => {\n const conditionEntry = getFirstVisibleConditionEntry(condition);\n\n if (conditionEntry === null) {\n return '';\n }\n\n const { operator, fieldVar, value } = conditionEntry;\n\n const dependsOnField = availableFields.find((field) => field.name === fieldVar.var);\n const dependsOnFieldName = dependsOnField ? dependsOnField.name : fieldVar.var;\n\n const operatorText = operator === '==' ? 'is' : 'is not';\n const valueText = String(value);\n const actionText = operator === '==' ? 'Show' : 'Hide';\n\n return `If ${dependsOnFieldName} ${operatorText} ${valueText}, then ${actionText} ${attributeName}`;\n};\n\nexport const getAvailableConditionFields = (\n attributes: AnyAttribute[],\n currentFieldName: string\n) => {\n return attributes\n .filter((attr) => {\n // Only include boolean and enum fields\n const isCorrectType = attr.type === 'boolean' || attr.type === 'enumeration';\n // Exclude the current field to prevent self-referential conditions\n const isNotCurrentField = attr.name !== currentFieldName;\n return isCorrectType && isNotCurrentField;\n })\n .map((attr) => ({\n name: attr.name,\n type: attr.type,\n enum: attr.type === 'enumeration' ? attr.enum : undefined,\n }));\n};\n"],"names":["isRecord","value","Array","isArray","isFieldVar","var","isAttributeConditionValue","getVisibleConditionEntries","condition","visible","Object","entries","reduce","operator","rule","fieldVar","push","getFirstVisibleConditionEntry","checkDependentRows","contentTypes","fieldName","dependentRows","forEach","contentTypeUid","contentType","attributes","undefined","acc","attr","index","toString","attrName","conditions","info","displayName","attribute","name","getAvailableConditionFields","currentFieldName","filter","isCorrectType","type","isNotCurrentField","map","enum"],"mappings":"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"}
|
|
@@ -32,7 +32,7 @@ const formsAPI = {
|
|
|
32
32
|
components: {
|
|
33
33
|
inputs: {},
|
|
34
34
|
add ({ id, component }) {
|
|
35
|
-
if (
|
|
35
|
+
if (this.inputs[id] === undefined) {
|
|
36
36
|
this.inputs[id] = component;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -61,7 +61,7 @@ const formsAPI = {
|
|
|
61
61
|
},
|
|
62
62
|
extendContentType ({ validator, form: { advanced, base } }) {
|
|
63
63
|
const { contentType } = this.types;
|
|
64
|
-
if (validator) {
|
|
64
|
+
if (validator !== undefined) {
|
|
65
65
|
contentType.validators.push(validator);
|
|
66
66
|
}
|
|
67
67
|
contentType.form.advanced.push(advanced);
|
|
@@ -79,7 +79,7 @@ const formsAPI = {
|
|
|
79
79
|
}
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
|
-
if (validator) {
|
|
82
|
+
if (validator !== undefined) {
|
|
83
83
|
formType[field].validators.push(validator);
|
|
84
84
|
}
|
|
85
85
|
formType[field].form.advanced.push(advanced);
|
|
@@ -87,11 +87,12 @@ const formsAPI = {
|
|
|
87
87
|
});
|
|
88
88
|
},
|
|
89
89
|
getAdvancedForm (target, props = null) {
|
|
90
|
-
const
|
|
90
|
+
const advancedForms = get__default.default(this.types, [
|
|
91
91
|
...target,
|
|
92
92
|
'form',
|
|
93
93
|
'advanced'
|
|
94
|
-
], [])
|
|
94
|
+
], []);
|
|
95
|
+
const sectionsToAdd = advancedForms.reduce((acc, current)=>{
|
|
95
96
|
const sections = current(props);
|
|
96
97
|
return [
|
|
97
98
|
...acc,
|
|
@@ -102,7 +103,9 @@ const formsAPI = {
|
|
|
102
103
|
},
|
|
103
104
|
makeCustomFieldValidator (attributeShape, validator, ...validatorArgs) {
|
|
104
105
|
// When no validator, return the attribute shape
|
|
105
|
-
if (
|
|
106
|
+
if (validator === undefined) {
|
|
107
|
+
return attributeShape;
|
|
108
|
+
}
|
|
106
109
|
// Otherwise extend the shape with the provided validator
|
|
107
110
|
return attributeShape.shape({
|
|
108
111
|
options: yup__namespace.object().shape(validator(validatorArgs))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formAPI.js","sources":["../../../admin/src/utils/formAPI.ts"],"sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport get from 'lodash/get';\nimport * as yup from 'yup';\n\
|
|
1
|
+
{"version":3,"file":"formAPI.js","sources":["../../../admin/src/utils/formAPI.ts"],"sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport get from 'lodash/get';\nimport * as yup from 'yup';\n\ntype YupObjectShape = Parameters<ReturnType<typeof yup.object>['shape']>[0];\ntype YupObjectSchema = ReturnType<typeof yup.object>;\ntype FormSection = unknown;\ntype FormExtensionHandler = (props?: unknown) => FormSection[];\ntype FormValidator = (args: unknown[]) => YupObjectShape;\ntype ContentTypeSchemaMutation = (\n data: Record<string, unknown>,\n initialData: Record<string, unknown>\n) => Record<string, unknown>;\n\ntype ExtensionForm = {\n advanced: FormExtensionHandler[];\n base: FormExtensionHandler[];\n};\n\ntype ExtensionDefinition = {\n validators: FormValidator[];\n form: ExtensionForm;\n};\n\ntype ExtensionInput = {\n validator?: FormValidator;\n form: {\n advanced: FormExtensionHandler;\n base: FormExtensionHandler;\n };\n};\n\nexport type FormAPI = {\n components: {\n inputs: Record<string, unknown>;\n add: ({ id, component }: { id: string; component: unknown }) => void;\n };\n types: {\n attribute: {\n [key: string]: ExtensionDefinition;\n };\n contentType: ExtensionDefinition;\n component: ExtensionDefinition;\n };\n contentTypeSchemaMutations: ContentTypeSchemaMutation[];\n addContentTypeSchemaMutation: (cb: ContentTypeSchemaMutation) => void;\n extendContentType: (data: ExtensionInput) => void;\n extendFields: (fields: string[], data: ExtensionInput) => void;\n getAdvancedForm: (target: string[], props?: unknown) => FormSection[];\n makeCustomFieldValidator: (\n attributeShape: YupObjectSchema,\n validator: FormValidator | undefined,\n ...validatorArgs: unknown[]\n ) => YupObjectSchema;\n makeValidator: (\n target: string[],\n initShape: YupObjectSchema,\n ...args: unknown[]\n ) => YupObjectSchema;\n mutateContentTypeSchema: (\n data: Record<string, unknown>,\n initialData: Record<string, unknown>\n ) => Record<string, unknown>;\n};\n\nexport const formsAPI: FormAPI = {\n components: {\n inputs: {},\n add({ id, component }) {\n if (this.inputs[id] === undefined) {\n this.inputs[id] = component;\n }\n },\n },\n types: {\n attribute: {\n // test: {\n // validators: [],\n // form: {\n // advanced: [\n // /* cb */\n // ],\n // base: [\n // /* cb */\n // ],\n // },\n // },\n },\n contentType: {\n validators: [],\n form: {\n advanced: [],\n base: [],\n },\n },\n component: {\n validators: [],\n form: {\n advanced: [],\n base: [],\n },\n },\n },\n contentTypeSchemaMutations: [],\n addContentTypeSchemaMutation(cb) {\n this.contentTypeSchemaMutations.push(cb);\n },\n extendContentType({ validator, form: { advanced, base } }) {\n const { contentType } = this.types;\n\n if (validator !== undefined) {\n contentType.validators.push(validator);\n }\n contentType.form.advanced.push(advanced);\n contentType.form.base.push(base);\n },\n extendFields(fields, { validator, form: { advanced, base } }) {\n const formType = this.types.attribute;\n\n fields.forEach((field) => {\n if (!formType[field]) {\n formType[field] = {\n validators: [],\n form: {\n advanced: [\n /* cb */\n ],\n base: [\n /* cb */\n ],\n },\n };\n }\n\n if (validator !== undefined) {\n formType[field].validators.push(validator);\n }\n formType[field].form.advanced.push(advanced);\n formType[field].form.base.push(base);\n });\n },\n\n getAdvancedForm(target, props = null) {\n const advancedForms = get(\n this.types,\n [...target, 'form', 'advanced'],\n []\n ) as FormExtensionHandler[];\n const sectionsToAdd = advancedForms.reduce<FormSection[]>((acc, current) => {\n const sections = current(props);\n\n return [...acc, ...sections];\n }, []);\n\n return sectionsToAdd;\n },\n\n makeCustomFieldValidator(attributeShape, validator, ...validatorArgs) {\n // When no validator, return the attribute shape\n if (validator === undefined) {\n return attributeShape;\n }\n\n // Otherwise extend the shape with the provided validator\n return attributeShape.shape({ options: yup.object().shape(validator(validatorArgs)) });\n },\n\n makeValidator(target, initShape, ...args) {\n const validators = get(this.types, [...target, 'validators'], []) as FormValidator[];\n\n const pluginOptionsShape = validators.reduce<YupObjectShape>((acc, current) => {\n const pluginOptionShape = current(args);\n\n return { ...acc, ...pluginOptionShape };\n }, {});\n\n return initShape.shape({ pluginOptions: yup.object().shape(pluginOptionsShape) });\n },\n mutateContentTypeSchema(data: Record<string, unknown>, initialData: Record<string, unknown>) {\n let enhancedData = cloneDeep(data);\n\n const refData = cloneDeep(initialData);\n\n this.contentTypeSchemaMutations.forEach((cb) => {\n enhancedData = cb(enhancedData, refData);\n });\n\n return enhancedData;\n },\n};\n"],"names":["formsAPI","components","inputs","add","id","component","undefined","types","attribute","contentType","validators","form","advanced","base","contentTypeSchemaMutations","addContentTypeSchemaMutation","cb","push","extendContentType","validator","extendFields","fields","formType","forEach","field","getAdvancedForm","target","props","advancedForms","get","sectionsToAdd","reduce","acc","current","sections","makeCustomFieldValidator","attributeShape","validatorArgs","shape","options","yup","object","makeValidator","initShape","args","pluginOptionsShape","pluginOptionShape","pluginOptions","mutateContentTypeSchema","data","initialData","enhancedData","cloneDeep","refData"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ const formsAPI = {
|
|
|
6
6
|
components: {
|
|
7
7
|
inputs: {},
|
|
8
8
|
add ({ id, component }) {
|
|
9
|
-
if (
|
|
9
|
+
if (this.inputs[id] === undefined) {
|
|
10
10
|
this.inputs[id] = component;
|
|
11
11
|
}
|
|
12
12
|
}
|
|
@@ -35,7 +35,7 @@ const formsAPI = {
|
|
|
35
35
|
},
|
|
36
36
|
extendContentType ({ validator, form: { advanced, base } }) {
|
|
37
37
|
const { contentType } = this.types;
|
|
38
|
-
if (validator) {
|
|
38
|
+
if (validator !== undefined) {
|
|
39
39
|
contentType.validators.push(validator);
|
|
40
40
|
}
|
|
41
41
|
contentType.form.advanced.push(advanced);
|
|
@@ -53,7 +53,7 @@ const formsAPI = {
|
|
|
53
53
|
}
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
|
-
if (validator) {
|
|
56
|
+
if (validator !== undefined) {
|
|
57
57
|
formType[field].validators.push(validator);
|
|
58
58
|
}
|
|
59
59
|
formType[field].form.advanced.push(advanced);
|
|
@@ -61,11 +61,12 @@ const formsAPI = {
|
|
|
61
61
|
});
|
|
62
62
|
},
|
|
63
63
|
getAdvancedForm (target, props = null) {
|
|
64
|
-
const
|
|
64
|
+
const advancedForms = get(this.types, [
|
|
65
65
|
...target,
|
|
66
66
|
'form',
|
|
67
67
|
'advanced'
|
|
68
|
-
], [])
|
|
68
|
+
], []);
|
|
69
|
+
const sectionsToAdd = advancedForms.reduce((acc, current)=>{
|
|
69
70
|
const sections = current(props);
|
|
70
71
|
return [
|
|
71
72
|
...acc,
|
|
@@ -76,7 +77,9 @@ const formsAPI = {
|
|
|
76
77
|
},
|
|
77
78
|
makeCustomFieldValidator (attributeShape, validator, ...validatorArgs) {
|
|
78
79
|
// When no validator, return the attribute shape
|
|
79
|
-
if (
|
|
80
|
+
if (validator === undefined) {
|
|
81
|
+
return attributeShape;
|
|
82
|
+
}
|
|
80
83
|
// Otherwise extend the shape with the provided validator
|
|
81
84
|
return attributeShape.shape({
|
|
82
85
|
options: yup.object().shape(validator(validatorArgs))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formAPI.mjs","sources":["../../../admin/src/utils/formAPI.ts"],"sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport get from 'lodash/get';\nimport * as yup from 'yup';\n\
|
|
1
|
+
{"version":3,"file":"formAPI.mjs","sources":["../../../admin/src/utils/formAPI.ts"],"sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport get from 'lodash/get';\nimport * as yup from 'yup';\n\ntype YupObjectShape = Parameters<ReturnType<typeof yup.object>['shape']>[0];\ntype YupObjectSchema = ReturnType<typeof yup.object>;\ntype FormSection = unknown;\ntype FormExtensionHandler = (props?: unknown) => FormSection[];\ntype FormValidator = (args: unknown[]) => YupObjectShape;\ntype ContentTypeSchemaMutation = (\n data: Record<string, unknown>,\n initialData: Record<string, unknown>\n) => Record<string, unknown>;\n\ntype ExtensionForm = {\n advanced: FormExtensionHandler[];\n base: FormExtensionHandler[];\n};\n\ntype ExtensionDefinition = {\n validators: FormValidator[];\n form: ExtensionForm;\n};\n\ntype ExtensionInput = {\n validator?: FormValidator;\n form: {\n advanced: FormExtensionHandler;\n base: FormExtensionHandler;\n };\n};\n\nexport type FormAPI = {\n components: {\n inputs: Record<string, unknown>;\n add: ({ id, component }: { id: string; component: unknown }) => void;\n };\n types: {\n attribute: {\n [key: string]: ExtensionDefinition;\n };\n contentType: ExtensionDefinition;\n component: ExtensionDefinition;\n };\n contentTypeSchemaMutations: ContentTypeSchemaMutation[];\n addContentTypeSchemaMutation: (cb: ContentTypeSchemaMutation) => void;\n extendContentType: (data: ExtensionInput) => void;\n extendFields: (fields: string[], data: ExtensionInput) => void;\n getAdvancedForm: (target: string[], props?: unknown) => FormSection[];\n makeCustomFieldValidator: (\n attributeShape: YupObjectSchema,\n validator: FormValidator | undefined,\n ...validatorArgs: unknown[]\n ) => YupObjectSchema;\n makeValidator: (\n target: string[],\n initShape: YupObjectSchema,\n ...args: unknown[]\n ) => YupObjectSchema;\n mutateContentTypeSchema: (\n data: Record<string, unknown>,\n initialData: Record<string, unknown>\n ) => Record<string, unknown>;\n};\n\nexport const formsAPI: FormAPI = {\n components: {\n inputs: {},\n add({ id, component }) {\n if (this.inputs[id] === undefined) {\n this.inputs[id] = component;\n }\n },\n },\n types: {\n attribute: {\n // test: {\n // validators: [],\n // form: {\n // advanced: [\n // /* cb */\n // ],\n // base: [\n // /* cb */\n // ],\n // },\n // },\n },\n contentType: {\n validators: [],\n form: {\n advanced: [],\n base: [],\n },\n },\n component: {\n validators: [],\n form: {\n advanced: [],\n base: [],\n },\n },\n },\n contentTypeSchemaMutations: [],\n addContentTypeSchemaMutation(cb) {\n this.contentTypeSchemaMutations.push(cb);\n },\n extendContentType({ validator, form: { advanced, base } }) {\n const { contentType } = this.types;\n\n if (validator !== undefined) {\n contentType.validators.push(validator);\n }\n contentType.form.advanced.push(advanced);\n contentType.form.base.push(base);\n },\n extendFields(fields, { validator, form: { advanced, base } }) {\n const formType = this.types.attribute;\n\n fields.forEach((field) => {\n if (!formType[field]) {\n formType[field] = {\n validators: [],\n form: {\n advanced: [\n /* cb */\n ],\n base: [\n /* cb */\n ],\n },\n };\n }\n\n if (validator !== undefined) {\n formType[field].validators.push(validator);\n }\n formType[field].form.advanced.push(advanced);\n formType[field].form.base.push(base);\n });\n },\n\n getAdvancedForm(target, props = null) {\n const advancedForms = get(\n this.types,\n [...target, 'form', 'advanced'],\n []\n ) as FormExtensionHandler[];\n const sectionsToAdd = advancedForms.reduce<FormSection[]>((acc, current) => {\n const sections = current(props);\n\n return [...acc, ...sections];\n }, []);\n\n return sectionsToAdd;\n },\n\n makeCustomFieldValidator(attributeShape, validator, ...validatorArgs) {\n // When no validator, return the attribute shape\n if (validator === undefined) {\n return attributeShape;\n }\n\n // Otherwise extend the shape with the provided validator\n return attributeShape.shape({ options: yup.object().shape(validator(validatorArgs)) });\n },\n\n makeValidator(target, initShape, ...args) {\n const validators = get(this.types, [...target, 'validators'], []) as FormValidator[];\n\n const pluginOptionsShape = validators.reduce<YupObjectShape>((acc, current) => {\n const pluginOptionShape = current(args);\n\n return { ...acc, ...pluginOptionShape };\n }, {});\n\n return initShape.shape({ pluginOptions: yup.object().shape(pluginOptionsShape) });\n },\n mutateContentTypeSchema(data: Record<string, unknown>, initialData: Record<string, unknown>) {\n let enhancedData = cloneDeep(data);\n\n const refData = cloneDeep(initialData);\n\n this.contentTypeSchemaMutations.forEach((cb) => {\n enhancedData = cb(enhancedData, refData);\n });\n\n return enhancedData;\n },\n};\n"],"names":["formsAPI","components","inputs","add","id","component","undefined","types","attribute","contentType","validators","form","advanced","base","contentTypeSchemaMutations","addContentTypeSchemaMutation","cb","push","extendContentType","validator","extendFields","fields","formType","forEach","field","getAdvancedForm","target","props","advancedForms","get","sectionsToAdd","reduce","acc","current","sections","makeCustomFieldValidator","attributeShape","validatorArgs","shape","options","yup","object","makeValidator","initShape","args","pluginOptionsShape","pluginOptionShape","pluginOptions","mutateContentTypeSchema","data","initialData","enhancedData","cloneDeep","refData"],"mappings":"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"}
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Retrieves the relation type
|
|
6
6
|
*/ const getRelationType = (relation, targetAttribute)=>{
|
|
7
|
+
if (relation === undefined) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
7
10
|
const hasNotTargetAttribute = targetAttribute === undefined || targetAttribute === null;
|
|
8
11
|
if (relation === 'oneToOne' && hasNotTargetAttribute) {
|
|
9
12
|
return 'oneWay';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getRelationType.js","sources":["../../../admin/src/utils/getRelationType.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\n\n/**\n *\n * Retrieves the relation type\n */\nexport const getRelationType = (\n relation
|
|
1
|
+
{"version":3,"file":"getRelationType.js","sources":["../../../admin/src/utils/getRelationType.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\n\n/**\n *\n * Retrieves the relation type\n */\nexport const getRelationType = (\n relation?: Schema.Attribute.RelationKind.Any,\n targetAttribute?: string | null\n) => {\n if (relation === undefined) {\n return undefined;\n }\n\n const hasNotTargetAttribute = targetAttribute === undefined || targetAttribute === null;\n\n if (relation === 'oneToOne' && hasNotTargetAttribute) {\n return 'oneWay';\n }\n\n if (relation === 'oneToMany' && hasNotTargetAttribute) {\n return 'manyWay';\n }\n\n return relation;\n};\n"],"names":["getRelationType","relation","targetAttribute","undefined","hasNotTargetAttribute"],"mappings":";;AAEA;;;AAGC,IACM,MAAMA,eAAAA,GAAkB,CAC7BC,QAAAA,EACAC,eAAAA,GAAAA;AAEA,IAAA,IAAID,aAAaE,SAAAA,EAAW;QAC1B,OAAOA,SAAAA;AACT,IAAA;IAEA,MAAMC,qBAAAA,GAAwBF,eAAAA,KAAoBC,SAAAA,IAAaD,eAAAA,KAAoB,IAAA;IAEnF,IAAID,QAAAA,KAAa,cAAcG,qBAAAA,EAAuB;QACpD,OAAO,QAAA;AACT,IAAA;IAEA,IAAIH,QAAAA,KAAa,eAAeG,qBAAAA,EAAuB;QACrD,OAAO,SAAA;AACT,IAAA;IAEA,OAAOH,QAAAA;AACT;;;;"}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
*
|
|
3
3
|
* Retrieves the relation type
|
|
4
4
|
*/ const getRelationType = (relation, targetAttribute)=>{
|
|
5
|
+
if (relation === undefined) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
5
8
|
const hasNotTargetAttribute = targetAttribute === undefined || targetAttribute === null;
|
|
6
9
|
if (relation === 'oneToOne' && hasNotTargetAttribute) {
|
|
7
10
|
return 'oneWay';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getRelationType.mjs","sources":["../../../admin/src/utils/getRelationType.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\n\n/**\n *\n * Retrieves the relation type\n */\nexport const getRelationType = (\n relation
|
|
1
|
+
{"version":3,"file":"getRelationType.mjs","sources":["../../../admin/src/utils/getRelationType.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\n\n/**\n *\n * Retrieves the relation type\n */\nexport const getRelationType = (\n relation?: Schema.Attribute.RelationKind.Any,\n targetAttribute?: string | null\n) => {\n if (relation === undefined) {\n return undefined;\n }\n\n const hasNotTargetAttribute = targetAttribute === undefined || targetAttribute === null;\n\n if (relation === 'oneToOne' && hasNotTargetAttribute) {\n return 'oneWay';\n }\n\n if (relation === 'oneToMany' && hasNotTargetAttribute) {\n return 'manyWay';\n }\n\n return relation;\n};\n"],"names":["getRelationType","relation","targetAttribute","undefined","hasNotTargetAttribute"],"mappings":"AAEA;;;AAGC,IACM,MAAMA,eAAAA,GAAkB,CAC7BC,QAAAA,EACAC,eAAAA,GAAAA;AAEA,IAAA,IAAID,aAAaE,SAAAA,EAAW;QAC1B,OAAOA,SAAAA;AACT,IAAA;IAEA,MAAMC,qBAAAA,GAAwBF,eAAAA,KAAoBC,SAAAA,IAAaD,eAAAA,KAAoB,IAAA;IAEnF,IAAID,QAAAA,KAAa,cAAcG,qBAAAA,EAAuB;QACpD,OAAO,QAAA;AACT,IAAA;IAEA,IAAIH,QAAAA,KAAa,eAAeG,qBAAAA,EAAuB;QACrD,OAAO,SAAA;AACT,IAAA;IAEA,OAAOH,QAAAA;AACT;;;;"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const extractValuesFromYupError = (errorType, errorParams)=>{
|
|
4
|
-
if (
|
|
4
|
+
if (errorType === undefined || errorParams === undefined) {
|
|
5
5
|
return {};
|
|
6
6
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
const value = errorParams[errorType];
|
|
8
|
+
return isPrimitiveType(value) ? {
|
|
9
|
+
[errorType]: value
|
|
10
|
+
} : {};
|
|
10
11
|
};
|
|
12
|
+
const isPrimitiveType = (value)=>value === null || value === undefined || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
11
13
|
const getYupInnerErrors = (error)=>(error?.inner || []).reduce((acc, currentError)=>{
|
|
12
14
|
if (currentError.path) {
|
|
13
15
|
acc[currentError.path.split('[').join('.').split(']').join('')] = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getYupInnerErrors.js","sources":["../../../admin/src/utils/getYupInnerErrors.ts"],"sourcesContent":["import type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { ValidationError } from 'yup';\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\nconst extractValuesFromYupError = (\n errorType?: string | undefined,\n errorParams?: Record<string,
|
|
1
|
+
{"version":3,"file":"getYupInnerErrors.js","sources":["../../../admin/src/utils/getYupInnerErrors.ts"],"sourcesContent":["import type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { ValidationError } from 'yup';\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\nconst extractValuesFromYupError = (\n errorType?: string | undefined,\n errorParams?: Record<string, unknown> | undefined\n) => {\n if (errorType === undefined || errorParams === undefined) {\n return {};\n }\n\n const value = errorParams[errorType];\n\n return isPrimitiveType(value) ? { [errorType]: value } : {};\n};\n\nconst isPrimitiveType = (value: unknown): value is PrimitiveType =>\n value === null ||\n value === undefined ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean';\n\nconst getYupInnerErrors = (error: ValidationError) =>\n (error?.inner || []).reduce<Record<string, TranslationMessage>>((acc, currentError) => {\n if (currentError.path) {\n acc[currentError.path.split('[').join('.').split(']').join('')] = {\n id: currentError.message,\n defaultMessage: currentError.message,\n values: extractValuesFromYupError(currentError?.type, currentError?.params),\n };\n }\n\n return acc;\n }, {});\n\nexport { getYupInnerErrors };\n"],"names":["extractValuesFromYupError","errorType","errorParams","undefined","value","isPrimitiveType","getYupInnerErrors","error","inner","reduce","acc","currentError","path","split","join","id","message","defaultMessage","values","type","params"],"mappings":";;AAOA,MAAMA,yBAAAA,GAA4B,CAChCC,SAAAA,EACAC,WAAAA,GAAAA;IAEA,IAAID,SAAAA,KAAcE,SAAAA,IAAaD,WAAAA,KAAgBC,SAAAA,EAAW;AACxD,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,MAAMC,KAAAA,GAAQF,WAAW,CAACD,SAAAA,CAAU;AAEpC,IAAA,OAAOI,gBAAgBD,KAAAA,CAAAA,GAAS;AAAE,QAAA,CAACH,YAAYG;AAAM,KAAA,GAAI,EAAC;AAC5D,CAAA;AAEA,MAAMC,eAAAA,GAAkB,CAACD,KAAAA,GACvBA,KAAAA,KAAU,QACVA,KAAAA,KAAUD,SAAAA,IACV,OAAOC,KAAAA,KAAU,QAAA,IACjB,OAAOA,KAAAA,KAAU,QAAA,IACjB,OAAOA,KAAAA,KAAU,SAAA;AAEnB,MAAME,iBAAAA,GAAoB,CAACC,KAAAA,GACxBA,CAAAA,KAAAA,EAAOC,KAAAA,IAAS,EAAE,EAAEC,MAAM,CAAqC,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;QACpE,IAAIA,YAAAA,CAAaC,IAAI,EAAE;AACrBF,YAAAA,GAAG,CAACC,YAAAA,CAAaC,IAAI,CAACC,KAAK,CAAC,GAAA,CAAA,CAAKC,IAAI,CAAC,GAAA,CAAA,CAAKD,KAAK,CAAC,GAAA,CAAA,CAAKC,IAAI,CAAC,IAAI,GAAG;AAChEC,gBAAAA,EAAAA,EAAIJ,aAAaK,OAAO;AACxBC,gBAAAA,cAAAA,EAAgBN,aAAaK,OAAO;gBACpCE,MAAAA,EAAQlB,yBAAAA,CAA0BW,YAAAA,EAAcQ,IAAAA,EAAMR,YAAAA,EAAcS,MAAAA;AACtE,aAAA;AACF,QAAA;QAEA,OAAOV,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC;;;;"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
const extractValuesFromYupError = (errorType, errorParams)=>{
|
|
2
|
-
if (
|
|
2
|
+
if (errorType === undefined || errorParams === undefined) {
|
|
3
3
|
return {};
|
|
4
4
|
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
const value = errorParams[errorType];
|
|
6
|
+
return isPrimitiveType(value) ? {
|
|
7
|
+
[errorType]: value
|
|
8
|
+
} : {};
|
|
8
9
|
};
|
|
10
|
+
const isPrimitiveType = (value)=>value === null || value === undefined || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
9
11
|
const getYupInnerErrors = (error)=>(error?.inner || []).reduce((acc, currentError)=>{
|
|
10
12
|
if (currentError.path) {
|
|
11
13
|
acc[currentError.path.split('[').join('.').split(']').join('')] = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getYupInnerErrors.mjs","sources":["../../../admin/src/utils/getYupInnerErrors.ts"],"sourcesContent":["import type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { ValidationError } from 'yup';\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\nconst extractValuesFromYupError = (\n errorType?: string | undefined,\n errorParams?: Record<string,
|
|
1
|
+
{"version":3,"file":"getYupInnerErrors.mjs","sources":["../../../admin/src/utils/getYupInnerErrors.ts"],"sourcesContent":["import type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { ValidationError } from 'yup';\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\nconst extractValuesFromYupError = (\n errorType?: string | undefined,\n errorParams?: Record<string, unknown> | undefined\n) => {\n if (errorType === undefined || errorParams === undefined) {\n return {};\n }\n\n const value = errorParams[errorType];\n\n return isPrimitiveType(value) ? { [errorType]: value } : {};\n};\n\nconst isPrimitiveType = (value: unknown): value is PrimitiveType =>\n value === null ||\n value === undefined ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean';\n\nconst getYupInnerErrors = (error: ValidationError) =>\n (error?.inner || []).reduce<Record<string, TranslationMessage>>((acc, currentError) => {\n if (currentError.path) {\n acc[currentError.path.split('[').join('.').split(']').join('')] = {\n id: currentError.message,\n defaultMessage: currentError.message,\n values: extractValuesFromYupError(currentError?.type, currentError?.params),\n };\n }\n\n return acc;\n }, {});\n\nexport { getYupInnerErrors };\n"],"names":["extractValuesFromYupError","errorType","errorParams","undefined","value","isPrimitiveType","getYupInnerErrors","error","inner","reduce","acc","currentError","path","split","join","id","message","defaultMessage","values","type","params"],"mappings":"AAOA,MAAMA,yBAAAA,GAA4B,CAChCC,SAAAA,EACAC,WAAAA,GAAAA;IAEA,IAAID,SAAAA,KAAcE,SAAAA,IAAaD,WAAAA,KAAgBC,SAAAA,EAAW;AACxD,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,MAAMC,KAAAA,GAAQF,WAAW,CAACD,SAAAA,CAAU;AAEpC,IAAA,OAAOI,gBAAgBD,KAAAA,CAAAA,GAAS;AAAE,QAAA,CAACH,YAAYG;AAAM,KAAA,GAAI,EAAC;AAC5D,CAAA;AAEA,MAAMC,eAAAA,GAAkB,CAACD,KAAAA,GACvBA,KAAAA,KAAU,QACVA,KAAAA,KAAUD,SAAAA,IACV,OAAOC,KAAAA,KAAU,QAAA,IACjB,OAAOA,KAAAA,KAAU,QAAA,IACjB,OAAOA,KAAAA,KAAU,SAAA;AAEnB,MAAME,iBAAAA,GAAoB,CAACC,KAAAA,GACxBA,CAAAA,KAAAA,EAAOC,KAAAA,IAAS,EAAE,EAAEC,MAAM,CAAqC,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;QACpE,IAAIA,YAAAA,CAAaC,IAAI,EAAE;AACrBF,YAAAA,GAAG,CAACC,YAAAA,CAAaC,IAAI,CAACC,KAAK,CAAC,GAAA,CAAA,CAAKC,IAAI,CAAC,GAAA,CAAA,CAAKD,KAAK,CAAC,GAAA,CAAA,CAAKC,IAAI,CAAC,IAAI,GAAG;AAChEC,gBAAAA,EAAAA,EAAIJ,aAAaK,OAAO;AACxBC,gBAAAA,cAAAA,EAAgBN,aAAaK,OAAO;gBACpCE,MAAAA,EAAQlB,yBAAAA,CAA0BW,YAAAA,EAAcQ,IAAAA,EAAMR,YAAAA,EAAcS,MAAAA;AACtE,aAAA;AACF,QAAA;QAEA,OAAOV,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const parseNumberInputValue = (value)=>{
|
|
4
|
+
if (typeof value === 'number') {
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
7
|
+
if (typeof value === 'string') {
|
|
8
|
+
const parsed = Number(value);
|
|
9
|
+
return Number.isNaN(parsed) ? 0 : parsed;
|
|
10
|
+
}
|
|
11
|
+
return 0;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
exports.parseNumberInputValue = parseNumberInputValue;
|
|
15
|
+
//# sourceMappingURL=parseNumberInputValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseNumberInputValue.js","sources":["../../../admin/src/utils/parseNumberInputValue.ts"],"sourcesContent":["export const parseNumberInputValue = (value: string | number | null | undefined): number => {\n if (typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'string') {\n const parsed = Number(value);\n return Number.isNaN(parsed) ? 0 : parsed;\n }\n\n return 0;\n};\n"],"names":["parseNumberInputValue","value","parsed","Number","isNaN"],"mappings":";;AAAO,MAAMA,wBAAwB,CAACC,KAAAA,GAAAA;IACpC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAOA,KAAAA;AACT,IAAA;IAEA,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAMC,SAASC,MAAAA,CAAOF,KAAAA,CAAAA;AACtB,QAAA,OAAOE,MAAAA,CAAOC,KAAK,CAACF,MAAAA,CAAAA,GAAU,CAAA,GAAIA,MAAAA;AACpC,IAAA;IAEA,OAAO,CAAA;AACT;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const parseNumberInputValue = (value)=>{
|
|
2
|
+
if (typeof value === 'number') {
|
|
3
|
+
return value;
|
|
4
|
+
}
|
|
5
|
+
if (typeof value === 'string') {
|
|
6
|
+
const parsed = Number(value);
|
|
7
|
+
return Number.isNaN(parsed) ? 0 : parsed;
|
|
8
|
+
}
|
|
9
|
+
return 0;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { parseNumberInputValue };
|
|
13
|
+
//# sourceMappingURL=parseNumberInputValue.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseNumberInputValue.mjs","sources":["../../../admin/src/utils/parseNumberInputValue.ts"],"sourcesContent":["export const parseNumberInputValue = (value: string | number | null | undefined): number => {\n if (typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'string') {\n const parsed = Number(value);\n return Number.isNaN(parsed) ? 0 : parsed;\n }\n\n return 0;\n};\n"],"names":["parseNumberInputValue","value","parsed","Number","isNaN"],"mappings":"AAAO,MAAMA,wBAAwB,CAACC,KAAAA,GAAAA;IACpC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAOA,KAAAA;AACT,IAAA;IAEA,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAMC,SAASC,MAAAA,CAAOF,KAAAA,CAAAA;AACtB,QAAA,OAAOE,MAAAA,CAAOC,KAAK,CAACF,MAAAA,CAAAA,GAAU,CAAA,GAAIA,MAAAA;AACpC,IAAA;IAEA,OAAO,CAAA;AACT;;;;"}
|
|
@@ -9,7 +9,7 @@ const STRAPI_USER_RELATIONS = [
|
|
|
9
9
|
'oneToOne',
|
|
10
10
|
'oneToMany'
|
|
11
11
|
];
|
|
12
|
-
const isValidRelation = (validNatures)=>function(value) {
|
|
12
|
+
const isValidRelation = (validNatures)=>function isValidRelationValue(value) {
|
|
13
13
|
// NOTE: In case of an undefined value, delegate the check to .required()
|
|
14
14
|
if (value === undefined) {
|
|
15
15
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relations.js","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function (this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":";;;;;;;AAOA,MAAMA,qBAAAA,GAAwB;AAAC,IAAA,UAAA;AAAY,IAAA;AAAY,CAAA;AAEvD,MAAMC,eAAAA,GAAkB,CAACC,YAAAA,GACvB,
|
|
1
|
+
{"version":3,"file":"relations.js","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function isValidRelationValue(this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","isValidRelationValue","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ const STRAPI_USER_RELATIONS = [
|
|
|
7
7
|
'oneToOne',
|
|
8
8
|
'oneToMany'
|
|
9
9
|
];
|
|
10
|
-
const isValidRelation = (validNatures)=>function(value) {
|
|
10
|
+
const isValidRelation = (validNatures)=>function isValidRelationValue(value) {
|
|
11
11
|
// NOTE: In case of an undefined value, delegate the check to .required()
|
|
12
12
|
if (value === undefined) {
|
|
13
13
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relations.mjs","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function (this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":";;;;;AAOA,MAAMA,qBAAAA,GAAwB;AAAC,IAAA,UAAA;AAAY,IAAA;AAAY,CAAA;AAEvD,MAAMC,eAAAA,GAAkB,CAACC,YAAAA,GACvB,
|
|
1
|
+
{"version":3,"file":"relations.mjs","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function isValidRelationValue(this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","isValidRelationValue","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":"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"}
|