Skip to content

Commit

Permalink
some more test
Browse files Browse the repository at this point in the history
  • Loading branch information
saihaj committed Jan 29, 2024
1 parent c65d93d commit 404c922
Show file tree
Hide file tree
Showing 6 changed files with 844 additions and 0 deletions.
39 changes: 39 additions & 0 deletions test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// @ts-check
import { generate } from './packages/graphql-codegen-cli/dist/esm/index.js';
import path from 'node:path';

export async function runCodegen(schemaStr, outputDir) {
try {
await generate(
{
ignoreNoDocuments: true,
overwrite: true,
schema: schemaStr,
documents: [
'./dev-test/gql-tag-operations/src/index.ts',
'./dev-test/gql-tag-operations/src/bar.ts',
'./dev-test/gql-tag-operations-masking/src/**/*.tsx',
],
verbose: false,
generates: {
[outputDir]: {
preset: 'client',
presetConfig: {
persistedDocuments: true,
},
plugins: ['typescript-resolvers'],
},
},
},
true
);
console.log('\ncodegen was successful');

Check failure on line 30 in test.mjs

View workflow job for this annotation

GitHub Actions / eslint

test.mjs#L30

[no-console] Unexpected console statement.
} catch (e) {
console.log('\ncodegen failed');

Check failure on line 32 in test.mjs

View workflow job for this annotation

GitHub Actions / eslint

test.mjs#L32

[no-console] Unexpected console statement.
}
}

runCodegen(
path.join(process.cwd(), 'dev-test/gql-tag-operations/schema.graphql'),
path.join(process.cwd(), 'testing-saihaj/src/')
);
66 changes: 66 additions & 0 deletions testing-saihaj/src/fragment-masking.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';
import { FragmentDefinitionNode } from 'graphql';

Check failure on line 2 in testing-saihaj/src/fragment-masking.ts

View workflow job for this annotation

GitHub Actions / eslint

testing-saihaj/src/fragment-masking.ts#L2

[import/no-extraneous-dependencies] 'graphql' should be listed in the project's dependencies, not devDependencies.
import { Incremental } from './graphql';

export type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =
TDocumentType extends DocumentTypeDecoration<infer TType, any>
? [TType] extends [{ ' $fragmentName'?: infer TKey }]
? TKey extends string
? { ' $fragmentRefs'?: { [key in TKey]: TType } }
: never
: never
: never;

// return non-nullable if `fragmentType` is non-nullable
export function useFragment<TType>(
_documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>
): TType;
// return nullable if `fragmentType` is nullable
export function useFragment<TType>(
_documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined
): TType | null | undefined;
// return array of non-nullable if `fragmentType` is array of non-nullable
export function useFragment<TType>(
_documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
): ReadonlyArray<TType>;
// return array of nullable if `fragmentType` is array of nullable
export function useFragment<TType>(
_documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined
): ReadonlyArray<TType> | null | undefined;
export function useFragment<TType>(
_documentNode: DocumentTypeDecoration<TType, any>,
fragmentType:
| FragmentType<DocumentTypeDecoration<TType, any>>
| ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
| null
| undefined
): TType | ReadonlyArray<TType> | null | undefined {
return fragmentType as any;
}

export function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(
data: FT,
_fragment: F
): FragmentType<F> {
return data as FragmentType<F>;
}
export function isFragmentReady<TQuery, TFrag>(
queryNode: DocumentTypeDecoration<TQuery, any>,
fragmentNode: TypedDocumentNode<TFrag>,
data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined
): data is FragmentType<typeof fragmentNode> {
const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__
?.deferredFields;

if (!deferredFields) return true;

const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;
const fragName = fragDef?.name?.value;

const fields = (fragName && deferredFields[fragName]) || [];
return fields.length > 0 && fields.every(field => data && field in data);
}
94 changes: 94 additions & 0 deletions testing-saihaj/src/gql.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/* eslint-disable */

Check warning on line 1 in testing-saihaj/src/gql.ts

View workflow job for this annotation

GitHub Actions / eslint

testing-saihaj/src/gql.ts#L1

[null] Unused eslint-disable directive (no problems were reported).
import * as types from './graphql';
import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';

/**
* Map of all GraphQL operations in the project.
*
* This map has several performance disadvantages:
* 1. It is not tree-shakeable, so it will include all operations in the project.
* 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
* 3. It does not support dead code elimination, so it will add unused operations.
*
* Therefore it is highly recommended to use the babel or swc plugin for production.
*/
const documents = {
'\n fragment TweetFragment on Tweet {\n id\n body\n ...TweetAuthorFragment\n }\n':
types.TweetFragmentFragmentDoc,
'\n fragment TweetAuthorFragment on Tweet {\n id\n author {\n id\n username\n }\n }\n':
types.TweetAuthorFragmentFragmentDoc,
'\n fragment TweetsFragment on Query {\n Tweets {\n id\n ...TweetFragment\n }\n }\n':
types.TweetsFragmentFragmentDoc,
'\n query TweetAppQuery {\n ...TweetsFragment\n }\n': types.TweetAppQueryDocument,
'\n query Foo {\n Tweets {\n id\n }\n }\n': types.FooDocument,
'\n fragment Lel on Tweet {\n id\n body\n }\n': types.LelFragmentDoc,
'\n query Bar {\n Tweets {\n ...Lel\n }\n }\n': types.BarDocument,
};

/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*
*
* @example
* ```ts
* const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);
* ```
*
* The query argument is unknown!
* Please regenerate the types.
*/
export function graphql(source: string): unknown;

/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(
source: '\n fragment TweetFragment on Tweet {\n id\n body\n ...TweetAuthorFragment\n }\n'
): (typeof documents)['\n fragment TweetFragment on Tweet {\n id\n body\n ...TweetAuthorFragment\n }\n'];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(
source: '\n fragment TweetAuthorFragment on Tweet {\n id\n author {\n id\n username\n }\n }\n'
): (typeof documents)['\n fragment TweetAuthorFragment on Tweet {\n id\n author {\n id\n username\n }\n }\n'];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(
source: '\n fragment TweetsFragment on Query {\n Tweets {\n id\n ...TweetFragment\n }\n }\n'
): (typeof documents)['\n fragment TweetsFragment on Query {\n Tweets {\n id\n ...TweetFragment\n }\n }\n'];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(
source: '\n query TweetAppQuery {\n ...TweetsFragment\n }\n'
): (typeof documents)['\n query TweetAppQuery {\n ...TweetsFragment\n }\n'];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(
source: '\n query Foo {\n Tweets {\n id\n }\n }\n'
): (typeof documents)['\n query Foo {\n Tweets {\n id\n }\n }\n'];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(
source: '\n fragment Lel on Tweet {\n id\n body\n }\n'
): (typeof documents)['\n fragment Lel on Tweet {\n id\n body\n }\n'];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(
source: '\n query Bar {\n Tweets {\n ...Lel\n }\n }\n'
): (typeof documents)['\n query Bar {\n Tweets {\n ...Lel\n }\n }\n'];

export function graphql(source: string) {
return (documents as any)[source] ?? {};
}

export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<
infer TType,
any
>
? TType
: never;
Loading

0 comments on commit 404c922

Please sign in to comment.