{"version":3,"file":"dumbql-fragments.mjs","sources":["../../../../projects/dumbql/fragments/src/lib/fragment.ts","../../../../projects/dumbql/fragments/src/dumbql-fragments.ts"],"sourcesContent":["import { parse, type DocumentNode } from 'graphql';\n\nexport interface FragmentDefinition<TData = unknown, TVars extends Record<string, unknown> = Record<string, unknown>> {\n\tdocument: DocumentNode;\n\tname: string;\n\t__data?: TData;\n\t__variables?: TVars;\n}\n\nexport function fragment<TData, TVars extends Record<string, unknown> = Record<string, unknown>>(\n\tstrings: TemplateStringsArray,\n\t...values: string[]\n): FragmentDefinition<TData, TVars> {\n\tconst source = String.raw(strings, ...values);\n\tconst document = parse(source);\n\tconst name = extractFragmentName(document);\n\treturn { document, name };\n}\n\nexport function getFragment<TData, TVars extends Record<string, unknown> = Record<string, unknown>>(\n\tdef: FragmentDefinition<TData, TVars>,\n): DocumentNode {\n\treturn def.document;\n}\n\nexport function spread<TData, TVars extends Record<string, unknown> = Record<string, unknown>>(\n\tdef: FragmentDefinition<TData, TVars>,\n): string {\n\treturn `...${def.name}`;\n}\n\nexport function compose(...defs: FragmentDefinition[]): DocumentNode {\n\tconst docs = defs.map((d) => d.document);\n\treturn {\n\t\tkind: 'Document',\n\t\tdefinitions: docs.reduce<DocumentNode['definitions']>((acc, d) => acc.concat(d.definitions), []),\n\t} as unknown as DocumentNode;\n}\n\ntype FragmentKey<TData> = Readonly<Record<` ${string}`, TData>>;\n\n/** Inline typed fragment with optional phantom type params */\ninterface TypedDoc {\n\t__resultType?: unknown;\n\t__variablesType?: Record<string, unknown>;\n}\n\nexport function useFragment<TData>(\n\t_fragment: FragmentDefinition<TData> | TypedDoc,\n\tdata: TData | null | undefined,\n): TData | null;\nexport function useFragment<TData>(\n\t_fragment: FragmentDefinition<TData> | TypedDoc,\n\tdata: FragmentKey<TData> | null | undefined,\n): TData | null;\nexport function useFragment<TData>(\n\t_fragment: FragmentDefinition<TData> | TypedDoc,\n\tdata: TData | FragmentKey<TData> | null | undefined,\n): TData | null {\n\tif (data == null) return null;\n\tif (typeof data === 'object' && data !== null) {\n\t\tfor (const key of Object.keys(data)) {\n\t\t\tif (key.startsWith(' ')) return (data as Record<string, unknown>)[key] as TData;\n\t\t}\n\t}\n\treturn data as TData;\n}\n\nfunction extractFragmentName(doc: DocumentNode): string {\n\tfor (const def of doc.definitions) {\n\t\tif (def.kind === 'FragmentDefinition' && def.name?.kind === 'Name') {\n\t\t\treturn def.name.value;\n\t\t}\n\t}\n\tthrow new Error('No fragment definition found');\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;SASgB,QAAQ,CACvB,OAA6B,EAC7B,GAAG,MAAgB,EAAA;IAEnB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;AAC7C,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;AAC9B,IAAA,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,CAAC;AAC1C,IAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC1B;AAEM,SAAU,WAAW,CAC1B,GAAqC,EAAA;IAErC,OAAO,GAAG,CAAC,QAAQ;AACpB;AAEM,SAAU,MAAM,CACrB,GAAqC,EAAA;AAErC,IAAA,OAAO,CAAA,GAAA,EAAM,GAAG,CAAC,IAAI,EAAE;AACxB;AAEM,SAAU,OAAO,CAAC,GAAG,IAA0B,EAAA;AACpD,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;IACxC,OAAO;AACN,QAAA,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,IAAI,CAAC,MAAM,CAA8B,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;KACrE;AAC7B;AAkBM,SAAU,WAAW,CAC1B,SAA+C,EAC/C,IAAmD,EAAA;IAEnD,IAAI,IAAI,IAAI,IAAI;AAAE,QAAA,OAAO,IAAI;IAC7B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE;QAC9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACpC,YAAA,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAQ,IAAgC,CAAC,GAAG,CAAU;QAChF;IACD;AACA,IAAA,OAAO,IAAa;AACrB;AAEA,SAAS,mBAAmB,CAAC,GAAiB,EAAA;AAC7C,IAAA,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE;AAClC,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,oBAAoB,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE;AACnE,YAAA,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK;QACtB;IACD;AACA,IAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;AAChD;;AC3EA;;AAEG;;;;"}