{"version":3,"file":"stores.mjs","sources":["../../../../src/lib/shared/stores.mts"],"sourcesContent":["import { atom, map } from 'nanostores';\nimport type { FormulaStores, BeakerStores, FieldValidity, EnrichFields, FormValidatorFn } from './types.mjs';\n\ninterface FormulaOptions {\n  defaultValues?: Record<string, unknown>;\n  enrich?: EnrichFields;\n  formValidators?: Record<string, FormValidatorFn>;\n}\n\ninterface BeakerOptions extends Omit<FormulaOptions, 'defaultValues'> {\n  defaultValues?: Record<string, unknown>[];\n}\n\ninterface InitialState {\n  initialValues: Record<string, unknown>;\n  initialKeys: string[];\n  initialFieldState: Record<string, boolean>;\n  initialValidity: Record<string, FieldValidity>;\n  initialFormValidity: Record<string, string>;\n  initialEnrichment: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Generate initial state for specified key set\n */\nfunction generateInitialState<T>(\n  keys: string[],\n  initialState: Record<string, unknown>,\n  stateGenerator: (key: string, initialState: Record<string, unknown>) => T,\n): Record<string, T> {\n  return keys.reduce(\n    (state, key) => {\n      return { ...state, [key]: stateGenerator(key, initialState) };\n    },\n    {} as Record<string, T>,\n  );\n}\n\n/**\n * Function to create initial state values for the store using any passed default values\n */\nfunction createFirstState(options?: FormulaOptions, initialData?: Record<string, unknown>): InitialState {\n  const initialValues = { ...options?.defaultValues, ...initialData };\n  const initialKeys = Object.keys(initialValues);\n\n  const initialFieldState = generateInitialState(initialKeys, initialValues, () => false);\n  const initialValidity = generateInitialState(\n    initialKeys,\n    initialValues,\n    (): FieldValidity => ({\n      valid: true,\n      invalid: false,\n      message: '',\n      errors: {},\n    }),\n  );\n  const initialFormValidity = generateInitialState(Object.keys(options?.formValidators || {}), initialValues, () => '');\n\n  const initialEnrichment = Object.entries(options?.enrich || {}).reduce(\n    (value, [key, fns]) => {\n      return {\n        ...value,\n        [key]: Object.entries(fns).reduce(\n          (v, [k, fn]) => ({\n            ...v,\n            [k]: options?.defaultValues?.[key] ? fn(options?.defaultValues?.[key]) : undefined,\n          }),\n          {} as Record<string, unknown>,\n        ),\n      };\n    },\n    {} as Record<string, Record<string, unknown>>,\n  );\n\n  return {\n    initialValues,\n    initialKeys,\n    initialFieldState,\n    initialValidity,\n    initialFormValidity,\n    initialEnrichment,\n  };\n}\n\n/**\n * Create the stores for the form instance\n */\nexport function createFormStores(options?: FormulaOptions, initialData?: Record<string, unknown>): FormulaStores {\n  const initialStoreState = createFirstState(options, initialData);\n  return {\n    formValues: map(initialStoreState.initialValues),\n    submitValues: map({}),\n    initialValues: map(initialStoreState.initialValues),\n    touched: map(initialStoreState.initialFieldState),\n    dirty: map(initialStoreState.initialFieldState),\n    errors: map(initialStoreState.initialValidity),\n    formValidity: map(initialStoreState.initialFormValidity),\n    formValid: atom(false),\n    formReady: atom(false),\n    enrichment: map(initialStoreState.initialEnrichment),\n  };\n}\n\n/**\n * Create a group store which contains arrays of form store values\n */\nexport function createGroupStores(options?: BeakerOptions): BeakerStores {\n  const defaultValues = options?.defaultValues || [];\n  const { defaultValues: _, ...restOptions } = options || {};\n\n  const eachState = defaultValues.map((defaultValue) => createFirstState({ ...restOptions, defaultValues: defaultValue }));\n\n  const combineStates = <K extends keyof InitialState>(property: K): InitialState[K][] =>\n    eachState.reduce(\n      (accumulator, currentState) => {\n        return [...accumulator, currentState[property]];\n      },\n      [] as InitialState[K][],\n    );\n\n  const initialValues = combineStates('initialValues');\n  const initialFieldState = combineStates('initialFieldState');\n  const initialValidity = combineStates('initialValidity');\n  const initialEnrichment = combineStates('initialEnrichment');\n  const initialFormValidity = combineStates('initialFormValidity');\n\n  return {\n    formValues: atom(initialValues),\n    submitValues: atom([]),\n    initialValues: atom(initialValues),\n    touched: atom(initialFieldState),\n    dirty: atom(initialFieldState),\n    errors: atom(initialValidity),\n    formValidity: atom(initialFormValidity),\n    formValid: atom(false),\n    formReady: atom(false),\n    enrichment: atom(initialEnrichment),\n  };\n}\n"],"names":["generateInitialState","keys","initialState","stateGenerator","state","key","createFirstState","options","initialData","initialValues","initialKeys","initialFieldState","initialValidity","initialFormValidity","initialEnrichment","value","fns","v","k","fn","createFormStores","initialStoreState","map","atom","createGroupStores","defaultValues","_","restOptions","eachState","defaultValue","combineStates","property","accumulator","currentState"],"mappings":"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"}