https://github.com/react-hook-form/react-hook-form/issues/10862

1주차 TODO

a) bad, shouldValidate not works well
setValue("item1.positions", [{ activities: [] }], {
   shouldValidate: true
});

b) good, shouldValidate works well!
setValue("item2.positions.0.activities", [], {
   shouldValidate: true
});

const setValue: UseFormSetValue<TFieldValues> = (
    name,
    value,
    options = {},
  ) => {
    const field = get(_fields, name);
    const isFieldArray = _names.array.has(name);
    const cloneValue = cloneObject(value);

    set(_formValues, name, cloneValue);

    if (isFieldArray) {
...
    } else {
      // Q1. a, b case모두 setValues로 가나?? 아닐듯?
      // a) [activities: []] -> setValues
      // b [] -> setFieldValue로 갈 듯?
      field && !field._f && !isNullOrUndefined(cloneValue)
        ? setValues(name, cloneValue, options)
        : setFieldValue(name, cloneValue, options); // here!!
    }

const setValues = <
    T extends InternalFieldName,
    K extends SetFieldValue<TFieldValues>,
    U extends SetValueConfig,
  >(
    name: T,
    value: K,
    options: U,
  ) => {
    for (const fieldKey in value) {
      const fieldValue = value[fieldKey];
      const fieldName = `${name}.${fieldKey}`;
      const field = get(_fields, fieldName);

      (_names.array.has(name) ||
        !isPrimitive(fieldValue) ||
        (field && !field._f)) &&
      !isDateObject(fieldValue)
        ? setValues(fieldName, fieldValue, options)
        : setFieldValue(fieldName, fieldValue, options);  // here!
    }
  };

const setFieldValue = (
    name: InternalFieldName,
    value: SetFieldValue<TFieldValues>,
    options: SetValueConfig = {},
  ) => {
     ...

    options.shouldValidate && trigger(name as Path<TFieldValues>);
  };

---

const setValues = <
    T extends InternalFieldName,
    K extends SetFieldValue<TFieldValues>,
    U extends SetValueConfig,
  >(
    name: T, // "item1.positions.0"
    value: K, // { activities: [] }
    options: U,
  ) => {
    for (const fieldKey in value) {
      const fieldValue = value[fieldKey]; // []
      const fieldName = `${name}.${fieldKey}`; // "item1.positions.0.activities"
      const field = get(_fields, fieldName);

      (_names.array.has(name) ||
        !isPrimitive(fieldValue) || // isPrimitive([]) ==  false
        (field && !field._f)) &&
      !isDateObject(fieldValue) &&
      !fieldValue.isEmpty // like this? 
        ? setValues(fieldName, fieldValue, options)
        : setFieldValue(fieldName, fieldValue, options);
// [] -> setFieldValue 호출하게 변경!
// {} 도 동일하게 핸들링 해야 하나? (isEmptyObject참고!)
    }
  };

setValues(
  "item1.positions.0.activities",
  [],
  { shouldValidate: true }
) => for (const fieldKey in value) { .. } // [] 라서 암것도 안함!

https://github.com/react-hook-form/react-hook-form/blob/6d83aacb719671cd048832b332cb1d50933ab398/src/logic/createFormControl.ts#L594

어떻게 검증&테스트?

https://github.com/react-hook-form/react-hook-form/blob/6d83aacb719671cd048832b332cb1d50933ab398/src/__tests__/useForm/setValue.test.tsx#L528-L530