UNPKG

jotai-composer

Version:

Jotai enhancers for composing atoms

1 lines 4.88 kB
{"version":3,"sources":["../src/atomEnhancer.ts","../src/enhanceWith.ts","../src/utils.ts"],"sourcesContent":["import { atom } from \"jotai\";\nimport { Enhancer, enhanceWith } from \"./enhanceWith\";\nimport { AtomEnhancer, AtomEnhancerRead, AtomEnhancerWrite } from \"./types\";\n\nexport function atomEnhancer<\n TLastState extends object,\n TParameter extends object,\n TResult extends object = object,\n>(\n read: AtomEnhancerRead<TLastState, TResult>,\n write?: AtomEnhancerWrite<TLastState, TParameter>,\n fallbackEnhancer?: ReturnType<Enhancer<TLastState, TParameter, TResult>>,\n) {\n type TLastEnhancer = Parameters<Enhancer<TLastState, TParameter, TResult>>[0];\n const enhancer: AtomEnhancer<TLastState, TParameter, TResult> = {\n read: ({ last }) => {\n return atom((get) => read(get, { last }));\n },\n write: write\n ? ({ stateHelper: { set, get, last }, update }) =>\n write(get, set, update, { last })\n : undefined,\n };\n return (last: TLastEnhancer) => enhanceWith(enhancer)(last, fallbackEnhancer);\n}\n","import { atom } from \"jotai\";\nimport { AtomEnhancer, ComposableAtom } from \"./types\";\nimport { isAtom } from \"./utils\";\n\nexport const enhanceWith =\n <\n TLastState extends object,\n TParameterExtended extends object = never,\n TResult extends object = never,\n >({\n read = () => ({}) as TResult,\n write = () => Promise.resolve({ shouldAbortNextSetter: false }),\n }: AtomEnhancer<TLastState, TParameterExtended, TResult>) =>\n <TState extends TLastState, TParameter extends object = never>(\n lastAtom?: ComposableAtom<TState, TParameter>,\n fallbackAtom?: ComposableAtom<any, TParameter>,\n ) => {\n const newAtom = atom(\n (get) => {\n const last = lastAtom ? get(lastAtom) : ({} as TLastState & TState);\n\n const possibleAtom = read({\n last,\n });\n let notAtom;\n if (isAtom(possibleAtom)) {\n notAtom = get(possibleAtom);\n } else {\n notAtom = possibleAtom;\n }\n return {\n ...last,\n ...notAtom,\n };\n },\n async (get, set, update: TParameterExtended | TParameter) => {\n const last = lastAtom ? get(lastAtom) : ({} as TLastState & TState);\n const { shouldAbortNextSetter } =\n (await write({\n stateHelper: {\n last,\n get,\n set,\n },\n update: update as TParameterExtended,\n })) || {};\n if (!shouldAbortNextSetter) {\n if (lastAtom) {\n return set(lastAtom, update as TParameter);\n }\n } else {\n if (fallbackAtom) {\n return set(fallbackAtom, update as TParameter);\n }\n }\n return { shouldAbortNextSetter };\n },\n );\n return newAtom;\n };\n\nexport type Enhancer<\n TLastState extends object = object,\n TParameterExtended extends object = object,\n TResult extends object = object,\n> = ReturnType<typeof enhanceWith<TLastState, TParameterExtended, TResult>>;\n","import { Atom, atom } from \"jotai\";\n\nexport const ignoreSetterAtom = <T extends object>(a: Atom<T>) =>\n atom(\n (get) => get(a),\n () => {},\n );\n\nexport function isAtom<T>(value: unknown): value is Atom<T> {\n return typeof value === \"object\" && value !== null && \"read\" in value;\n}\n"],"mappings":"AAAA,OAAS,QAAAA,MAAY,QCArB,OAAS,QAAAC,MAAY,QCArB,OAAe,QAAAC,MAAY,QAQpB,SAASC,EAAUC,EAAkC,CAC1D,OAAO,OAAOA,GAAU,UAAYA,IAAU,MAAQ,SAAUA,CAClE,CDNO,IAAMC,EACX,CAIE,CACA,KAAAC,EAAO,KAAO,CAAC,GACf,MAAAC,EAAQ,IAAM,QAAQ,QAAQ,CAAE,sBAAuB,EAAM,CAAC,CAChE,IACA,CACEC,EACAC,IAEgBC,EACbC,GAAQ,CACP,IAAMC,EAAOJ,EAAWG,EAAIH,CAAQ,EAAK,CAAC,EAEpCK,EAAeP,EAAK,CACxB,KAAAM,CACF,CAAC,EACGE,EACJ,OAAIC,EAAOF,CAAY,EACrBC,EAAUH,EAAIE,CAAY,EAE1BC,EAAUD,EAEL,CACL,GAAGD,EACH,GAAGE,CACL,CACF,EACA,MAAOH,EAAKK,EAAKC,IAA4C,CAC3D,IAAML,EAAOJ,EAAWG,EAAIH,CAAQ,EAAK,CAAC,EACpC,CAAE,sBAAAU,CAAsB,EAC3B,MAAMX,EAAM,CACX,YAAa,CACX,KAAAK,EACA,IAAAD,EACA,IAAAK,CACF,EACA,OAAQC,CACV,CAAC,GAAM,CAAC,EACV,GAAKC,GAKH,GAAIT,EACF,OAAOO,EAAIP,EAAcQ,CAAoB,UAL3CT,EACF,OAAOQ,EAAIR,EAAUS,CAAoB,EAO7C,MAAO,CAAE,sBAAAC,CAAsB,CACjC,CACF,EDrDG,SAASC,EAKdC,EACAC,EACAC,EACA,CAEA,IAAMC,EAA0D,CAC9D,KAAM,CAAC,CAAE,KAAAC,CAAK,IACLC,EAAMC,GAAQN,EAAKM,EAAK,CAAE,KAAAF,CAAK,CAAC,CAAC,EAE1C,MAAOH,EACH,CAAC,CAAE,YAAa,CAAE,IAAAM,EAAK,IAAAD,EAAK,KAAAF,CAAK,EAAG,OAAAI,CAAO,IACzCP,EAAMK,EAAKC,EAAKC,EAAQ,CAAE,KAAAJ,CAAK,CAAC,EAClC,MACN,EACA,OAAQA,GAAwBK,EAAYN,CAAQ,EAAEC,EAAMF,CAAgB,CAC9E","names":["atom","atom","atom","isAtom","value","enhanceWith","read","write","lastAtom","fallbackAtom","atom","get","last","possibleAtom","notAtom","isAtom","set","update","shouldAbortNextSetter","atomEnhancer","read","write","fallbackEnhancer","enhancer","last","atom","get","set","update","enhanceWith"]}