gql.tada 1.10.2 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ export {
2
+ m as maskFragments,
3
+ r as readResult,
4
+ u as unsafe_readResult,
5
+ } from './chunks/index-chunk.js';
@@ -0,0 +1,16 @@
1
+ Object.defineProperty(exports, "__esModule", {
2
+ value: !0
3
+ });
4
+
5
+ exports.maskFragments = function maskFragments(e, r) {
6
+ return r;
7
+ };
8
+
9
+ exports.readResult = function readResult(e, r, t) {
10
+ return r;
11
+ };
12
+
13
+ exports.unsafe_readResult = function unsafe_readResult(e, r) {
14
+ return r;
15
+ };
16
+ //# sourceMappingURL=gql-tada-testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gql-tada-testing.js","sources":["../src/testing.ts"],"sourcesContent":["import type { DocumentDecoration, obj, overload } from './utils';\nimport type { $tada, FragmentShape, omitFragmentRefsRec, makeFragmentRef } from './namespace';\nimport type { ResultOf } from './api';\n\ntype fragmentRegistryEntry<Fragment> =\n Fragment extends FragmentShape<infer Definition, infer Result>\n ? { [Name in Definition['fragment']]: Result }\n : never;\n\ntype fragmentRegistry<Fragments extends readonly FragmentShape[]> = overload<\n fragmentRegistryEntry<Fragments[number]> | {}\n>;\n\ntype unmaskFragmentSpreadsRec<Refs, Registry> = overload<\n keyof Refs extends infer Name\n ? Name extends keyof Registry\n ? unmaskFragmentRefsRec<Registry[Name], Registry>\n : Name extends keyof Refs\n ? { [$tada.fragmentRefs]: { [N in Name]: Refs[N] } }\n : never\n : never\n>;\n\ntype unmaskFragmentRefsRec<Data, Registry> = Data extends readonly (infer Value)[]\n ? readonly unmaskFragmentRefsRec<Value, Registry>[]\n : Data extends null\n ? null\n : Data extends undefined\n ? undefined\n : Data extends { [$tada.fragmentRefs]: infer Refs }\n ? obj<\n {\n [Key in Exclude<keyof Data, $tada.fragmentRefs>]: unmaskFragmentRefsRec<\n Data[Key],\n Registry\n >;\n } & unmaskFragmentSpreadsRec<Refs, Registry>\n >\n : Data extends object\n ? { [Key in keyof Data]: unmaskFragmentRefsRec<Data[Key], Registry> }\n : Data;\n\n/** For testing, converts document data to its result type, resolving nested fragments.\n *\n * @param _document - A GraphQL document, created using `graphql`.\n * @param data - The result data of the document, with fragment data inlined.\n * @param _fragments - A list of every fragment used in the document, transitively.\n * @returns The result data, cast to the result type of the document.\n *\n * @remarks\n * When a document spreads fragments, its result type only contains opaque\n * references to them, rather than the fragments’ fields, which makes it hard to\n * write a fixture for the full result.\n *\n * Unlike `unsafe_readResult`, which discards all fragment references and checks\n * nothing nested inside them, `readResult` accepts the document’s fragments and\n * recursively resolves their references, so your data is fully type-checked —\n * including fragments that spread other fragments.\n *\n * Any fragment you leave out of the `fragments` argument stays masked, so a\n * missing fragment surfaces as a still-masked reference rather than inlined data,\n * and can be filled with `maskFragments` instead.\n *\n * Intended for tests, storybooks, fixtures, and cache updaters.\n *\n * @example\n * ```\n * import { graphql } from 'gql.tada';\n * import { readResult } from 'gql.tada/testing';\n *\n * const authorFragment = graphql(`\n * fragment AuthorFields on Author {\n * name\n * }\n * `);\n *\n * const todoFragment = graphql(`\n * fragment TodoFields on Todo {\n * id\n * author {\n * ...AuthorFields\n * }\n * }\n * `, [authorFragment]);\n *\n * const query = graphql(`\n * query {\n * todos {\n * id\n * ...TodoFields\n * }\n * }\n * `, [todoFragment]);\n *\n * const data = readResult(\n * query,\n * { todos: [{ id: 'id', author: { name: 'name' } }] },\n * [todoFragment, authorFragment]\n * );\n * ```\n *\n * @see {@link maskFragments} for masking a single level of fragment data.\n * @see {@link unsafe_readResult} for the unsafe variant that performs no checks.\n */\nfunction readResult<\n const Document extends DocumentDecoration<any, any>,\n const Fragments extends readonly FragmentShape[],\n>(\n document: Document,\n data: unmaskFragmentRefsRec<ResultOf<Document>, fragmentRegistry<Fragments>>,\n fragments: Fragments\n): ResultOf<Document>;\n\nfunction readResult(_document: unknown, data: unknown, _fragments?: unknown): unknown {\n return data;\n}\n\ntype resultOfFragmentsRec<\n Fragments extends readonly any[],\n Result = {},\n> = Fragments extends readonly [infer Fragment, ...infer Rest]\n ? resultOfFragmentsRec<Rest, ResultOf<Fragment> & Result>\n : Result;\n\ntype fragmentRefsOfFragmentsRec<\n Fragments extends readonly any[],\n FragmentRefs = {},\n> = Fragments extends readonly [infer Fragment, ...infer Rest]\n ? fragmentRefsOfFragmentsRec<Rest, makeFragmentRef<Fragment> & FragmentRefs>\n : obj<FragmentRefs>;\n\n/** For testing, masks fragment data for given data and fragments.\n *\n * @param _fragments - A list of GraphQL documents of fragments, created using `graphql`.\n * @param data - The combined result data of the fragments, which can be wrapped in arrays.\n * @returns The masked data of the fragments.\n *\n * @remarks\n * When creating test data, you may define data for fragments that’s unmasked, making it\n * unusable in parent fragments or queries that require masked data.\n *\n * This means that you may have to use {@link maskFragments} to mask your data first\n * for TypeScript to not report an error.\n *\n * @example\n * ```\n * import { FragmentOf, ResultOf, graphql } from 'gql.tada';\n * import { maskFragments } from 'gql.tada/testing';\n *\n * const bookFragment = graphql(`\n * fragment BookComponent on Book {\n * id\n * title\n * }\n * `);\n *\n * const data = maskFragments([bookFragment], { id: 'id', title: 'book' });\n * ```\n *\n * @see {@link readFragment} for how to read from fragment masks (i.e. the reverse)\n */\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: resultOfFragmentsRec<Fragments>\n): fragmentRefsOfFragmentsRec<Fragments>;\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: resultOfFragmentsRec<Fragments> | null\n): fragmentRefsOfFragmentsRec<Fragments> | null;\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: resultOfFragmentsRec<Fragments> | undefined\n): fragmentRefsOfFragmentsRec<Fragments> | undefined;\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: resultOfFragmentsRec<Fragments> | null | undefined\n): fragmentRefsOfFragmentsRec<Fragments> | null | undefined;\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: readonly resultOfFragmentsRec<Fragments>[]\n): readonly fragmentRefsOfFragmentsRec<Fragments>[];\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: readonly (resultOfFragmentsRec<Fragments> | null)[]\n): readonly (fragmentRefsOfFragmentsRec<Fragments> | null)[];\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: readonly (resultOfFragmentsRec<Fragments> | undefined)[]\n): readonly (fragmentRefsOfFragmentsRec<Fragments> | undefined)[];\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: readonly (resultOfFragmentsRec<Fragments> | null | undefined)[]\n): readonly (fragmentRefsOfFragmentsRec<Fragments> | null | undefined)[];\nfunction maskFragments(_fragments: unknown, data: unknown) {\n return data;\n}\n\n/** For testing, converts document data without fragment refs to their result type.\n *\n * @param _document - A GraphQL document, created using `graphql`.\n * @param data - The result data of the GraphQL document with optional fragment refs.\n * @returns The masked result data of the document.\n *\n * @remarks\n * When creating test data, you may define data for documents that’s unmasked, but\n * need to cast the data to match the result type of your document.\n *\n * This means that you may have to use {@link unsafe_readResult} to cast\n * them to the result type, instead of doing `as any as ResultOf<typeof document>`.\n *\n * This function is inherently unsafe, since it doesn't check that your document\n * actually contains the masked fragment data! For a type-safe alternative that\n * resolves nested fragments, see {@link readResult}.\n *\n * @example\n * ```\n * import { FragmentOf, ResultOf, graphql } from 'gql.tada';\n * import { unsafe_readResult } from 'gql.tada/testing';\n *\n * const bookFragment = graphql(`\n * fragment BookComponent on Book {\n * id\n * title\n * }\n * `);\n *\n * const query = graphql(`\n * query {\n * book {\n * ...BookComponent\n * }\n * }\n * `, [bookFragment]);\n *\n * const data = unsafe_readResult(query, { book: { id: 'id', title: 'book' } });\n * ```\n *\n * @see {@link readResult} for a type-safe alternative that resolves nested fragments.\n * @see {@link readFragment} for how to read from fragment masks (i.e. the reverse)\n */\nfunction unsafe_readResult<\n const Document extends DocumentDecoration<any, any>,\n const Data extends omitFragmentRefsRec<ResultOf<Document>>,\n>(_document: Document, data: Data): ResultOf<Document> {\n return data as any;\n}\n\nexport { readResult, maskFragments, unsafe_readResult };\n"],"names":["maskFragments","_fragments","data","readResult","_document","unsafe_readResult"],"mappings":";;;;wBAiMA,SAASA,cAAcC,GAAqBC;EAC1C,OAAOA;AACT;;qBAlFA,SAASC,WAAWC,GAAoBF,GAAeD;EACrD,OAAOC;AACT;;4BA6HA,SAASG,kBAGPD,GAAqBF;EACrB,OAAOA;AACT"}
@@ -0,0 +1,14 @@
1
+ function readResult(e, n, r) {
2
+ return n;
3
+ }
4
+
5
+ function maskFragments(e, n) {
6
+ return n;
7
+ }
8
+
9
+ function unsafe_readResult(e, n) {
10
+ return n;
11
+ }
12
+
13
+ export { maskFragments, readResult, unsafe_readResult };
14
+ //# sourceMappingURL=gql-tada-testing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gql-tada-testing.mjs","sources":["../src/testing.ts"],"sourcesContent":["import type { DocumentDecoration, obj, overload } from './utils';\nimport type { $tada, FragmentShape, omitFragmentRefsRec, makeFragmentRef } from './namespace';\nimport type { ResultOf } from './api';\n\ntype fragmentRegistryEntry<Fragment> =\n Fragment extends FragmentShape<infer Definition, infer Result>\n ? { [Name in Definition['fragment']]: Result }\n : never;\n\ntype fragmentRegistry<Fragments extends readonly FragmentShape[]> = overload<\n fragmentRegistryEntry<Fragments[number]> | {}\n>;\n\ntype unmaskFragmentSpreadsRec<Refs, Registry> = overload<\n keyof Refs extends infer Name\n ? Name extends keyof Registry\n ? unmaskFragmentRefsRec<Registry[Name], Registry>\n : Name extends keyof Refs\n ? { [$tada.fragmentRefs]: { [N in Name]: Refs[N] } }\n : never\n : never\n>;\n\ntype unmaskFragmentRefsRec<Data, Registry> = Data extends readonly (infer Value)[]\n ? readonly unmaskFragmentRefsRec<Value, Registry>[]\n : Data extends null\n ? null\n : Data extends undefined\n ? undefined\n : Data extends { [$tada.fragmentRefs]: infer Refs }\n ? obj<\n {\n [Key in Exclude<keyof Data, $tada.fragmentRefs>]: unmaskFragmentRefsRec<\n Data[Key],\n Registry\n >;\n } & unmaskFragmentSpreadsRec<Refs, Registry>\n >\n : Data extends object\n ? { [Key in keyof Data]: unmaskFragmentRefsRec<Data[Key], Registry> }\n : Data;\n\n/** For testing, converts document data to its result type, resolving nested fragments.\n *\n * @param _document - A GraphQL document, created using `graphql`.\n * @param data - The result data of the document, with fragment data inlined.\n * @param _fragments - A list of every fragment used in the document, transitively.\n * @returns The result data, cast to the result type of the document.\n *\n * @remarks\n * When a document spreads fragments, its result type only contains opaque\n * references to them, rather than the fragments’ fields, which makes it hard to\n * write a fixture for the full result.\n *\n * Unlike `unsafe_readResult`, which discards all fragment references and checks\n * nothing nested inside them, `readResult` accepts the document’s fragments and\n * recursively resolves their references, so your data is fully type-checked —\n * including fragments that spread other fragments.\n *\n * Any fragment you leave out of the `fragments` argument stays masked, so a\n * missing fragment surfaces as a still-masked reference rather than inlined data,\n * and can be filled with `maskFragments` instead.\n *\n * Intended for tests, storybooks, fixtures, and cache updaters.\n *\n * @example\n * ```\n * import { graphql } from 'gql.tada';\n * import { readResult } from 'gql.tada/testing';\n *\n * const authorFragment = graphql(`\n * fragment AuthorFields on Author {\n * name\n * }\n * `);\n *\n * const todoFragment = graphql(`\n * fragment TodoFields on Todo {\n * id\n * author {\n * ...AuthorFields\n * }\n * }\n * `, [authorFragment]);\n *\n * const query = graphql(`\n * query {\n * todos {\n * id\n * ...TodoFields\n * }\n * }\n * `, [todoFragment]);\n *\n * const data = readResult(\n * query,\n * { todos: [{ id: 'id', author: { name: 'name' } }] },\n * [todoFragment, authorFragment]\n * );\n * ```\n *\n * @see {@link maskFragments} for masking a single level of fragment data.\n * @see {@link unsafe_readResult} for the unsafe variant that performs no checks.\n */\nfunction readResult<\n const Document extends DocumentDecoration<any, any>,\n const Fragments extends readonly FragmentShape[],\n>(\n document: Document,\n data: unmaskFragmentRefsRec<ResultOf<Document>, fragmentRegistry<Fragments>>,\n fragments: Fragments\n): ResultOf<Document>;\n\nfunction readResult(_document: unknown, data: unknown, _fragments?: unknown): unknown {\n return data;\n}\n\ntype resultOfFragmentsRec<\n Fragments extends readonly any[],\n Result = {},\n> = Fragments extends readonly [infer Fragment, ...infer Rest]\n ? resultOfFragmentsRec<Rest, ResultOf<Fragment> & Result>\n : Result;\n\ntype fragmentRefsOfFragmentsRec<\n Fragments extends readonly any[],\n FragmentRefs = {},\n> = Fragments extends readonly [infer Fragment, ...infer Rest]\n ? fragmentRefsOfFragmentsRec<Rest, makeFragmentRef<Fragment> & FragmentRefs>\n : obj<FragmentRefs>;\n\n/** For testing, masks fragment data for given data and fragments.\n *\n * @param _fragments - A list of GraphQL documents of fragments, created using `graphql`.\n * @param data - The combined result data of the fragments, which can be wrapped in arrays.\n * @returns The masked data of the fragments.\n *\n * @remarks\n * When creating test data, you may define data for fragments that’s unmasked, making it\n * unusable in parent fragments or queries that require masked data.\n *\n * This means that you may have to use {@link maskFragments} to mask your data first\n * for TypeScript to not report an error.\n *\n * @example\n * ```\n * import { FragmentOf, ResultOf, graphql } from 'gql.tada';\n * import { maskFragments } from 'gql.tada/testing';\n *\n * const bookFragment = graphql(`\n * fragment BookComponent on Book {\n * id\n * title\n * }\n * `);\n *\n * const data = maskFragments([bookFragment], { id: 'id', title: 'book' });\n * ```\n *\n * @see {@link readFragment} for how to read from fragment masks (i.e. the reverse)\n */\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: resultOfFragmentsRec<Fragments>\n): fragmentRefsOfFragmentsRec<Fragments>;\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: resultOfFragmentsRec<Fragments> | null\n): fragmentRefsOfFragmentsRec<Fragments> | null;\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: resultOfFragmentsRec<Fragments> | undefined\n): fragmentRefsOfFragmentsRec<Fragments> | undefined;\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: resultOfFragmentsRec<Fragments> | null | undefined\n): fragmentRefsOfFragmentsRec<Fragments> | null | undefined;\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: readonly resultOfFragmentsRec<Fragments>[]\n): readonly fragmentRefsOfFragmentsRec<Fragments>[];\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: readonly (resultOfFragmentsRec<Fragments> | null)[]\n): readonly (fragmentRefsOfFragmentsRec<Fragments> | null)[];\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: readonly (resultOfFragmentsRec<Fragments> | undefined)[]\n): readonly (fragmentRefsOfFragmentsRec<Fragments> | undefined)[];\nfunction maskFragments<const Fragments extends readonly FragmentShape[]>(\n _fragments: Fragments,\n fragment: readonly (resultOfFragmentsRec<Fragments> | null | undefined)[]\n): readonly (fragmentRefsOfFragmentsRec<Fragments> | null | undefined)[];\nfunction maskFragments(_fragments: unknown, data: unknown) {\n return data;\n}\n\n/** For testing, converts document data without fragment refs to their result type.\n *\n * @param _document - A GraphQL document, created using `graphql`.\n * @param data - The result data of the GraphQL document with optional fragment refs.\n * @returns The masked result data of the document.\n *\n * @remarks\n * When creating test data, you may define data for documents that’s unmasked, but\n * need to cast the data to match the result type of your document.\n *\n * This means that you may have to use {@link unsafe_readResult} to cast\n * them to the result type, instead of doing `as any as ResultOf<typeof document>`.\n *\n * This function is inherently unsafe, since it doesn't check that your document\n * actually contains the masked fragment data! For a type-safe alternative that\n * resolves nested fragments, see {@link readResult}.\n *\n * @example\n * ```\n * import { FragmentOf, ResultOf, graphql } from 'gql.tada';\n * import { unsafe_readResult } from 'gql.tada/testing';\n *\n * const bookFragment = graphql(`\n * fragment BookComponent on Book {\n * id\n * title\n * }\n * `);\n *\n * const query = graphql(`\n * query {\n * book {\n * ...BookComponent\n * }\n * }\n * `, [bookFragment]);\n *\n * const data = unsafe_readResult(query, { book: { id: 'id', title: 'book' } });\n * ```\n *\n * @see {@link readResult} for a type-safe alternative that resolves nested fragments.\n * @see {@link readFragment} for how to read from fragment masks (i.e. the reverse)\n */\nfunction unsafe_readResult<\n const Document extends DocumentDecoration<any, any>,\n const Data extends omitFragmentRefsRec<ResultOf<Document>>,\n>(_document: Document, data: Data): ResultOf<Document> {\n return data as any;\n}\n\nexport { readResult, maskFragments, unsafe_readResult };\n"],"names":["readResult","_document","data","_fragments","maskFragments","unsafe_readResult"],"mappings":"AAiHA,SAASA,WAAWC,GAAoBC,GAAeC;EACrD,OAAOD;AACT;;AA8EA,SAASE,cAAcD,GAAqBD;EAC1C,OAAOA;AACT;;AA6CA,SAASG,kBAGPJ,GAAqBC;EACrB,OAAOA;AACT;;"}