Fix collection schema import compatibility
Normalize portable field settings during export and import, serialize collection category association updates as arrays, and ignore generated exports and macOS metadata.
This commit is contained in:
@@ -1 +1,2 @@
|
||||
.DS_Store
|
||||
exports/
|
||||
|
||||
@@ -147,7 +147,10 @@ read_collection() {
|
||||
portable_schema() {
|
||||
jq '
|
||||
.data as $collection
|
||||
| ($collection.fields // []) as $fields
|
||||
| (($collection.fields // []) | map(
|
||||
. as $field
|
||||
| (($field | del(.settings)) + ($field.settings // {}))
|
||||
)) as $fields
|
||||
| [$fields[]
|
||||
| select(.interface == "m2o" or .interface == "o2m" or .interface == "m2m" or .interface == "o2o")
|
||||
| .foreignKey
|
||||
|
||||
@@ -321,24 +321,7 @@ make_collection_payload() {
|
||||
jq --argjson index "$PLAN_INDEX" --argjson relations "$RELATION_INTERFACES" '
|
||||
def compact_field:
|
||||
. as $field
|
||||
| ({name:$field.name, interface:$field.interface}
|
||||
+ (if $field | has("title") then {title:$field.title} else {} end)
|
||||
+ (if $field | has("description") then {description:$field.description} else {} end)
|
||||
+ (if $field | has("target") then {target:$field.target} else {} end)
|
||||
+ (if $field | has("validation") then {validation:$field.validation} else {} end)
|
||||
+ (if $field | has("validators") then {validators:$field.validators} else {} end)
|
||||
+ (if $field | has("defaultValue") then {defaultValue:$field.defaultValue} else {} end)
|
||||
+ (if $field | has("enum") then {enum:$field.enum} else {} end)
|
||||
+ (if $field | has("reverseName") then {reverseName:$field.reverseName} else {} end)
|
||||
+ (if $field | has("reverseTitle") then {reverseTitle:$field.reverseTitle} else {} end)
|
||||
+ (if $field | has("reverseInterface") then {reverseInterface:$field.reverseInterface} else {} end)
|
||||
+ (if $field | has("reverseField") then {reverseField:$field.reverseField} else {} end))
|
||||
+ (((($field.settings // {}) + ($field | del(
|
||||
.name, .title, .interface, .description, .target, .validation, .validators,
|
||||
.defaultValue, .enum, .reverseName, .reverseTitle, .reverseInterface,
|
||||
.reverseField, .settings
|
||||
))) as $settings
|
||||
| if $settings == {} then {} else {settings:$settings} end));
|
||||
| (($field | del(.settings, .collectionName)) + ($field.settings // {}));
|
||||
.[$index].schema as $schema
|
||||
| ({name:$schema.name, title:$schema.title, template:$schema.template, verify:true, replaceFields:false}
|
||||
+ (if $schema | has("description") then {description:$schema.description} else {} end)
|
||||
@@ -363,24 +346,8 @@ make_relation_payload() {
|
||||
jq --argjson planIndex "$PLAN_INDEX" --argjson fieldIndex "$FIELD_INDEX" '
|
||||
.[$planIndex] as $item
|
||||
| $item.schema.fields[$fieldIndex] as $field
|
||||
| ({collectionName:$item.collection, name:$field.name, interface:$field.interface}
|
||||
+ (if $field | has("title") then {title:$field.title} else {} end)
|
||||
+ (if $field | has("description") then {description:$field.description} else {} end)
|
||||
+ (if $field | has("target") then {target:$field.target} else {} end)
|
||||
+ (if $field | has("validation") then {validation:$field.validation} else {} end)
|
||||
+ (if $field | has("validators") then {validators:$field.validators} else {} end)
|
||||
+ (if $field | has("defaultValue") then {defaultValue:$field.defaultValue} else {} end)
|
||||
+ (if $field | has("enum") then {enum:$field.enum} else {} end)
|
||||
+ (if $field | has("reverseName") then {reverseName:$field.reverseName} else {} end)
|
||||
+ (if $field | has("reverseTitle") then {reverseTitle:$field.reverseTitle} else {} end)
|
||||
+ (if $field | has("reverseInterface") then {reverseInterface:$field.reverseInterface} else {} end)
|
||||
+ (if $field | has("reverseField") then {reverseField:$field.reverseField} else {} end))
|
||||
+ (((($field.settings // {}) + ($field | del(
|
||||
.collectionName, .name, .title, .interface, .description, .target,
|
||||
.validation, .validators, .defaultValue, .enum, .reverseName,
|
||||
.reverseTitle, .reverseInterface, .reverseField, .settings
|
||||
))) as $settings
|
||||
| if $settings == {} then {} else {settings:$settings} end))
|
||||
| (($field | del(.settings, .collectionName)) + ($field.settings // {}))
|
||||
+ {collectionName:$item.collection}
|
||||
' "$PLAN_FILE"
|
||||
}
|
||||
|
||||
@@ -456,11 +423,15 @@ while [ "$CATEGORY_INDEX" -lt "$TARGET_CATEGORY_COUNT" ]; do
|
||||
if [ "$CURRENT_MEMBERS" != "$DESIRED_MEMBERS" ]; then
|
||||
CATEGORY_VALUES=$(printf '%s' "$DESIRED_MEMBERS" | jq -c '{collections:map({name:.})}')
|
||||
echo " update category $CATEGORY_NAME" >&2
|
||||
# Repeat the single association flag so nb CLI serializes it as an array.
|
||||
# A single query value is parsed by NocoBase as a string and causes
|
||||
# UpdateGuard to fail with "list.filter is not a function".
|
||||
run_nb nb api resource update \
|
||||
--resource collectionCategories \
|
||||
--filter-by-tk "$CATEGORY_ID" \
|
||||
--values "$CATEGORY_VALUES" \
|
||||
--update-association-values collections \
|
||||
--update-association-values collections \
|
||||
-e "$ENV_NAME" -y -j >/dev/null
|
||||
fi
|
||||
CATEGORY_INDEX=$((CATEGORY_INDEX + 1))
|
||||
@@ -469,7 +440,10 @@ done
|
||||
portable_schema() {
|
||||
jq '
|
||||
.data as $collection
|
||||
| ($collection.fields // []) as $fields
|
||||
| (($collection.fields // []) | map(
|
||||
. as $field
|
||||
| (($field | del(.settings)) + ($field.settings // {}))
|
||||
)) as $fields
|
||||
| [$fields[]
|
||||
| select(.interface == "m2o" or .interface == "o2m" or .interface == "m2m" or .interface == "o2o")
|
||||
| .foreignKey
|
||||
|
||||
Reference in New Issue
Block a user