From 9bd7921be55f3b5ac11fd21969be40e0631d3001 Mon Sep 17 00:00:00 2001 From: Seppe Dekeyser Date: Mon, 18 Dec 2023 11:12:54 +0100 Subject: [PATCH 01/13] Add bug reproduction --- e2e/_api/graphql.mjs | 7 ++++ e2e/_api/schema.graphql | 1 + .../+page.svelte | 35 +++++++++++++++++++ .../UserItem.svelte | 21 +++++++++++ .../UsersList.svelte | 25 +++++++++++++ 5 files changed, 89 insertions(+) create mode 100644 e2e/kit/src/routes/bug/fragment-params-on-connection/+page.svelte create mode 100644 e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte create mode 100644 e2e/kit/src/routes/bug/fragment-params-on-connection/UsersList.svelte diff --git a/e2e/_api/graphql.mjs b/e2e/_api/graphql.mjs index 645bd8e4a8..9f61c87cb5 100644 --- a/e2e/_api/graphql.mjs +++ b/e2e/_api/graphql.mjs @@ -268,6 +268,13 @@ export const resolvers = { ) }, enumValue: () => 'Value1', + testField: (user, args) => { + if (args.someParam) { + return "Hello world"; + } + + return null; + } }, Mutation: { diff --git a/e2e/_api/schema.graphql b/e2e/_api/schema.graphql index 0fb7f47d17..f64389b868 100644 --- a/e2e/_api/schema.graphql +++ b/e2e/_api/schema.graphql @@ -112,6 +112,7 @@ type User implements Node { name: String! enumValue: MyEnum types: [TypeOfUser!]! + testField(someParam: Boolean!): String } interface Animal implements Node { diff --git a/e2e/kit/src/routes/bug/fragment-params-on-connection/+page.svelte b/e2e/kit/src/routes/bug/fragment-params-on-connection/+page.svelte new file mode 100644 index 0000000000..d1af14c46c --- /dev/null +++ b/e2e/kit/src/routes/bug/fragment-params-on-connection/+page.svelte @@ -0,0 +1,35 @@ + + +{#if $store.data} +

With fragment on the connection:

+ + +

With fragment on the node:

+ +{/if} diff --git a/e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte b/e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte new file mode 100644 index 0000000000..cf375e4f1e --- /dev/null +++ b/e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte @@ -0,0 +1,21 @@ + + +
  • +

    {$data.id} - {$data.name}

    +

    Test field: {$data.testField}

    +
  • diff --git a/e2e/kit/src/routes/bug/fragment-params-on-connection/UsersList.svelte b/e2e/kit/src/routes/bug/fragment-params-on-connection/UsersList.svelte new file mode 100644 index 0000000000..ef4f113e10 --- /dev/null +++ b/e2e/kit/src/routes/bug/fragment-params-on-connection/UsersList.svelte @@ -0,0 +1,25 @@ + + + From 717e8230d8719b8294532c1bc410ef0c2a34356c Mon Sep 17 00:00:00 2001 From: Seppe Dekeyser Date: Tue, 19 Dec 2023 10:45:11 +0100 Subject: [PATCH 02/13] Add another example --- .../bug/fragment-params-on-field/+page.gql | 9 +++++ .../bug/fragment-params-on-field/+page.svelte | 17 +++++++++ .../bug/fragment-params-on-field/+page.ts | 13 +++++++ .../FriendInfo.svelte | 21 +++++++++++ .../UserDetails.svelte | 36 +++++++++++++++++++ 5 files changed, 96 insertions(+) create mode 100644 e2e/kit/src/routes/bug/fragment-params-on-field/+page.gql create mode 100644 e2e/kit/src/routes/bug/fragment-params-on-field/+page.svelte create mode 100644 e2e/kit/src/routes/bug/fragment-params-on-field/+page.ts create mode 100644 e2e/kit/src/routes/bug/fragment-params-on-field/FriendInfo.svelte create mode 100644 e2e/kit/src/routes/bug/fragment-params-on-field/UserDetails.svelte diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/+page.gql b/e2e/kit/src/routes/bug/fragment-params-on-field/+page.gql new file mode 100644 index 0000000000..f3988c8d2c --- /dev/null +++ b/e2e/kit/src/routes/bug/fragment-params-on-field/+page.gql @@ -0,0 +1,9 @@ +query Bug_UsersList($someParam: Boolean!) { + usersConnection(snapshot: "test") { + edges { + node { + ...UserDetails @with(someParam: $someParam) + } + } + } +} diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/+page.svelte b/e2e/kit/src/routes/bug/fragment-params-on-field/+page.svelte new file mode 100644 index 0000000000..98bb30bc5b --- /dev/null +++ b/e2e/kit/src/routes/bug/fragment-params-on-field/+page.svelte @@ -0,0 +1,17 @@ + + +{#if $Bug_UsersList.data} +
      + {#each $Bug_UsersList.data.usersConnection.edges as userEdge} + {#if userEdge.node} + + {/if} + {/each} +
    +{/if} diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/+page.ts b/e2e/kit/src/routes/bug/fragment-params-on-field/+page.ts new file mode 100644 index 0000000000..d5a6aecd7b --- /dev/null +++ b/e2e/kit/src/routes/bug/fragment-params-on-field/+page.ts @@ -0,0 +1,13 @@ +import { load_Bug_UsersList } from '$houdini'; +import type { PageLoad } from './$houdini'; + +export const load: PageLoad = async (event) => { + return { + ...(await load_Bug_UsersList({ + event, + variables: { + someParam: true + } + })) + }; +}; diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/FriendInfo.svelte b/e2e/kit/src/routes/bug/fragment-params-on-field/FriendInfo.svelte new file mode 100644 index 0000000000..ea0ebb5e9c --- /dev/null +++ b/e2e/kit/src/routes/bug/fragment-params-on-field/FriendInfo.svelte @@ -0,0 +1,21 @@ + + +
  • +

    {$friend.name}

    +

    Test field: {$friend.testField}

    +
  • diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/UserDetails.svelte b/e2e/kit/src/routes/bug/fragment-params-on-field/UserDetails.svelte new file mode 100644 index 0000000000..eabacd7cca --- /dev/null +++ b/e2e/kit/src/routes/bug/fragment-params-on-field/UserDetails.svelte @@ -0,0 +1,36 @@ + + +
  • +

    {$userDetails.name}

    +

    friends:

    + +
      + {#each $userDetails.friendsConnection.edges as friendEdge} + {#if friendEdge.node} + + {/if} + {/each} +
    +
  • From f42b439e1b3815248e75414bb06158cce12c797a Mon Sep 17 00:00:00 2001 From: Alec Aivazis Date: Tue, 19 Dec 2023 17:35:44 -0500 Subject: [PATCH 03/13] potential fix --- .../artifacts/tests/artifacts.test.ts | 22 ++++++ .../artifacts/tests/selection.test.ts | 17 ++++ .../generators/typescript/typescript.test.ts | 5 ++ .../transforms/fragmentVariables.test.ts | 31 ++++++++ .../codegen/utils/flattenSelection.test.ts | 77 +++++++++++++++++-- .../src/codegen/utils/flattenSelections.ts | 2 +- 6 files changed, 147 insertions(+), 7 deletions(-) diff --git a/packages/houdini/src/codegen/generators/artifacts/tests/artifacts.test.ts b/packages/houdini/src/codegen/generators/artifacts/tests/artifacts.test.ts index 3d0ea001b9..e083feefce 100644 --- a/packages/houdini/src/codegen/generators/artifacts/tests/artifacts.test.ts +++ b/packages/houdini/src/codegen/generators/artifacts/tests/artifacts.test.ts @@ -6176,6 +6176,12 @@ test('nested abstract fragment on connection', async function () { "type": "String", "keyRaw": "__typename" } + }, + + "fragments": { + "AnimalProps": { + "arguments": {} + } } }, @@ -6267,6 +6273,12 @@ test('nested abstract fragment on connection', async function () { "type": "String", "keyRaw": "__typename" } + }, + + "fragments": { + "AnimalProps": { + "arguments": {} + } } }, @@ -6328,6 +6340,10 @@ test('nested abstract fragment on connection', async function () { "fragments": { "MonkeyList": { "arguments": {} + }, + + "AnimalList": { + "arguments": {} } } }, @@ -6480,6 +6496,12 @@ test('nested abstract fragments', async function () { "type": "String", "keyRaw": "__typename" } + }, + + "fragments": { + "MonkeyFragment": { + "arguments": {} + } } }, diff --git a/packages/houdini/src/codegen/generators/artifacts/tests/selection.test.ts b/packages/houdini/src/codegen/generators/artifacts/tests/selection.test.ts index a3981f4dc9..4c01f17b2e 100644 --- a/packages/houdini/src/codegen/generators/artifacts/tests/selection.test.ts +++ b/packages/houdini/src/codegen/generators/artifacts/tests/selection.test.ts @@ -55,6 +55,7 @@ test('fragments of unions inject correctly', function () { } } `), + hasComponents: () => {}, }) expect(artifactSelection).toMatchInlineSnapshot(` @@ -1115,12 +1116,28 @@ test('componentFields get embedded in the selection', async function () { }, "visible": true + }, + + "FriendList": { + "keyRaw": "FriendList", + "type": "Component", + + "component": { + "prop": "user", + "key": "User.FriendList", + "fragment": "FriendList", + "variables": {} + } } }, "fragments": { "UserAvatar": { "arguments": {} + }, + + "FriendList": { + "arguments": {} } } }, diff --git a/packages/houdini/src/codegen/generators/typescript/typescript.test.ts b/packages/houdini/src/codegen/generators/typescript/typescript.test.ts index c5ea4efd32..0d7cd57289 100644 --- a/packages/houdini/src/codegen/generators/typescript/typescript.test.ts +++ b/packages/houdini/src/codegen/generators/typescript/typescript.test.ts @@ -3117,6 +3117,11 @@ describe('typescript', function () { "keyRaw": "__typename"; }; }; + "fragments": { + "UserBase": { + "arguments": {}; + }; + }; }; }; }; diff --git a/packages/houdini/src/codegen/transforms/fragmentVariables.test.ts b/packages/houdini/src/codegen/transforms/fragmentVariables.test.ts index cbde23cd4a..8c128fdd83 100644 --- a/packages/houdini/src/codegen/transforms/fragmentVariables.test.ts +++ b/packages/houdini/src/codegen/transforms/fragmentVariables.test.ts @@ -494,6 +494,19 @@ test('thread query variables to inner fragments', async function () { } } } + }, + + "InnerFragment": { + "arguments": { + "name": { + "kind": "Variable", + + "name": { + "kind": "Name", + "value": "name" + } + } + } } } }, @@ -607,6 +620,15 @@ test('inner fragment with intermediate default value', async function () { "fragments": { "QueryFragment": { "arguments": {} + }, + + "InnerFragment": { + "arguments": { + "name": { + "kind": "StringValue", + "value": "Hello" + } + } } } }, @@ -711,6 +733,15 @@ test("default values don't overwrite unless explicitly passed", async function ( "fragments": { "QueryFragment": { "arguments": {} + }, + + "InnerFragment": { + "arguments": { + "other": { + "kind": "IntValue", + "value": "10" + } + } } } }, diff --git a/packages/houdini/src/codegen/utils/flattenSelection.test.ts b/packages/houdini/src/codegen/utils/flattenSelection.test.ts index ad52ba664b..a1b2b7dbb8 100644 --- a/packages/houdini/src/codegen/utils/flattenSelection.test.ts +++ b/packages/houdini/src/codegen/utils/flattenSelection.test.ts @@ -11,6 +11,27 @@ const fragmentDefinitions = ( fragment Foo on User { id } + + fragment UserDetails_2YMH5n on User @arguments(someParam: {type: "Boolean!"}) { + id + name + friendsConnection { + edges { + node { + ...FriendInfo_2YMH5n @with(someParam: $someParam) + id + } + } + } + __typename + } + + fragment FriendInfo_2YMH5n on User @arguments(someParam: {type: "Boolean!"}) { + id + name + testField(someParam: $someParam) + __typename + } `).definitions as graphql.FragmentDefinitionNode[] ).reduce( (acc, defn) => ({ @@ -24,18 +45,13 @@ function getSelections(doc: string): readonly graphql.SelectionNode[] { return (graphql.parse(doc).definitions[0] as graphql.OperationDefinitionNode).selectionSet .selections } -function testFlatten( - doc: string, - applyFragments: boolean = true, - hoistFragments: boolean = true -): graphql.OperationDefinitionNode { +function testFlatten(doc: string, applyFragments: boolean = true): graphql.OperationDefinitionNode { const flat = flattenSelections({ config, filepath: '', fragmentDefinitions, selections: getSelections(doc), applyFragments, - hoistFragments, }) return { @@ -161,4 +177,53 @@ describe('flattenSelection', function () { } `) }) + + test('nested fragments', function () { + expect( + testFlatten( + ` + { + usersConnection(snapshot: "test") { + edges { + node { + ...UserDetails_2YMH5n @with(someParam: $someParam) + id + } + } + } + } + ` + ) + ).toMatchInlineSnapshot(` + { + usersConnection(snapshot: "test") { + edges { + node { + ... on User { + id + name + friendsConnection { + edges { + node { + ... on User { + id + name + testField(someParam: $someParam) + __typename + } + id + ...FriendInfo_2YMH5n @with(someParam: $someParam) + } + } + } + __typename + } + id + ...UserDetails_2YMH5n @with(someParam: $someParam) + } + } + } + } + `) + }) }) diff --git a/packages/houdini/src/codegen/utils/flattenSelections.ts b/packages/houdini/src/codegen/utils/flattenSelections.ts index 0325c36a01..dfd70ac1eb 100644 --- a/packages/houdini/src/codegen/utils/flattenSelections.ts +++ b/packages/houdini/src/codegen/utils/flattenSelections.ts @@ -74,7 +74,7 @@ class FieldCollection { // the final result. // the default behavior depends on wether masking is enabled or disabled - let include = this.config.defaultFragmentMasking === 'disable' + let include = this.applyFragments || this.config.defaultFragmentMasking === 'disable' // Check if locally enable const maskEnableDirective = selection.directives?.find( From 93688e1efd007888490c9faffad722648cdfa435 Mon Sep 17 00:00:00 2001 From: Seppe Dekeyser Date: Wed, 20 Dec 2023 02:28:14 +0100 Subject: [PATCH 04/13] Always apply fragments when generating artifacts --- e2e/kit/src/routes/bug/fragment-params-on-field/+page.gql | 2 +- .../routes/bug/fragment-params-on-field/UserDetails.svelte | 2 +- packages/houdini/src/codegen/generators/artifacts/index.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/+page.gql b/e2e/kit/src/routes/bug/fragment-params-on-field/+page.gql index f3988c8d2c..c3b5971204 100644 --- a/e2e/kit/src/routes/bug/fragment-params-on-field/+page.gql +++ b/e2e/kit/src/routes/bug/fragment-params-on-field/+page.gql @@ -1,5 +1,5 @@ query Bug_UsersList($someParam: Boolean!) { - usersConnection(snapshot: "test") { + usersConnection(snapshot: "test", first: 2) { edges { node { ...UserDetails @with(someParam: $someParam) diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/UserDetails.svelte b/e2e/kit/src/routes/bug/fragment-params-on-field/UserDetails.svelte index eabacd7cca..f5a709fd0c 100644 --- a/e2e/kit/src/routes/bug/fragment-params-on-field/UserDetails.svelte +++ b/e2e/kit/src/routes/bug/fragment-params-on-field/UserDetails.svelte @@ -10,7 +10,7 @@ fragment UserDetails on User @arguments(someParam: { type: "Boolean!" }) { id name - friendsConnection { + friendsConnection(first: 2) { edges { node { ...FriendInfo @with(someParam: $someParam) diff --git a/packages/houdini/src/codegen/generators/artifacts/index.ts b/packages/houdini/src/codegen/generators/artifacts/index.ts index ee666846ec..331c4882b2 100644 --- a/packages/houdini/src/codegen/generators/artifacts/index.ts +++ b/packages/houdini/src/codegen/generators/artifacts/index.ts @@ -288,7 +288,7 @@ export default function artifactGenerator(stats: { document: doc, rootType, globalLoading, - includeFragments: doc.kind !== ArtifactKind.Fragment, + includeFragments: true, hasComponents: () => { hasComponents = true }, @@ -299,7 +299,7 @@ export default function artifactGenerator(stats: { filepath: doc.filename, selections: selectionSet.selections, fragmentDefinitions, - applyFragments: doc.kind !== ArtifactKind.Fragment, + applyFragments: true, }), operations: operationsByPath( From 999780bef034a12c475558e2090cd5ae06583fd8 Mon Sep 17 00:00:00 2001 From: Alec Aivazis Date: Wed, 20 Dec 2023 01:17:24 -0500 Subject: [PATCH 05/13] e2e test passes! --- e2e/kit/src/lib/utils/routes.ts | 1 + .../bug/fragment-params-on-field/+page.svelte | 17 ----------------- .../+page.gql | 0 .../+page.svelte | 19 +++++++++++++++++++ .../+page.ts | 0 .../FriendInfo.svelte | 0 .../UserDetails.svelte | 0 .../nested-argument-fragments-masking/spec.ts | 13 +++++++++++++ ...ted-fragment-argument-masking-1-darwin.txt | 1 + .../codegen/generators/artifacts/selection.ts | 11 ++++++++++- .../transforms/fragmentVariables.test.ts | 6 ++---- 11 files changed, 46 insertions(+), 22 deletions(-) delete mode 100644 e2e/kit/src/routes/bug/fragment-params-on-field/+page.svelte rename e2e/kit/src/routes/{bug/fragment-params-on-field => nested-argument-fragments-masking}/+page.gql (100%) create mode 100644 e2e/kit/src/routes/nested-argument-fragments-masking/+page.svelte rename e2e/kit/src/routes/{bug/fragment-params-on-field => nested-argument-fragments-masking}/+page.ts (100%) rename e2e/kit/src/routes/{bug/fragment-params-on-field => nested-argument-fragments-masking}/FriendInfo.svelte (100%) rename e2e/kit/src/routes/{bug/fragment-params-on-field => nested-argument-fragments-masking}/UserDetails.svelte (100%) create mode 100644 e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts create mode 100644 e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts-snapshots/Nested-fragment-argument-masking-1-darwin.txt diff --git a/e2e/kit/src/lib/utils/routes.ts b/e2e/kit/src/lib/utils/routes.ts index 6794aca495..2d14678b9a 100644 --- a/e2e/kit/src/lib/utils/routes.ts +++ b/e2e/kit/src/lib/utils/routes.ts @@ -100,6 +100,7 @@ export const routes = { Pagination_fragment_offset: '/pagination/fragment/offset', nested_argument_fragments: '/nested-argument-fragments', + nested_argument_fragments_masking: '/nested-argument-fragments-masking', Stores_Nested_List: '/stores/nested-list', diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/+page.svelte b/e2e/kit/src/routes/bug/fragment-params-on-field/+page.svelte deleted file mode 100644 index 98bb30bc5b..0000000000 --- a/e2e/kit/src/routes/bug/fragment-params-on-field/+page.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - -{#if $Bug_UsersList.data} -
      - {#each $Bug_UsersList.data.usersConnection.edges as userEdge} - {#if userEdge.node} - - {/if} - {/each} -
    -{/if} diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/+page.gql b/e2e/kit/src/routes/nested-argument-fragments-masking/+page.gql similarity index 100% rename from e2e/kit/src/routes/bug/fragment-params-on-field/+page.gql rename to e2e/kit/src/routes/nested-argument-fragments-masking/+page.gql diff --git a/e2e/kit/src/routes/nested-argument-fragments-masking/+page.svelte b/e2e/kit/src/routes/nested-argument-fragments-masking/+page.svelte new file mode 100644 index 0000000000..48400289a5 --- /dev/null +++ b/e2e/kit/src/routes/nested-argument-fragments-masking/+page.svelte @@ -0,0 +1,19 @@ + + +
    + {#if $Bug_UsersList.data} +
      + {#each $Bug_UsersList.data.usersConnection.edges as userEdge} + {#if userEdge.node} + + {/if} + {/each} +
    + {/if} +
    diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/+page.ts b/e2e/kit/src/routes/nested-argument-fragments-masking/+page.ts similarity index 100% rename from e2e/kit/src/routes/bug/fragment-params-on-field/+page.ts rename to e2e/kit/src/routes/nested-argument-fragments-masking/+page.ts diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/FriendInfo.svelte b/e2e/kit/src/routes/nested-argument-fragments-masking/FriendInfo.svelte similarity index 100% rename from e2e/kit/src/routes/bug/fragment-params-on-field/FriendInfo.svelte rename to e2e/kit/src/routes/nested-argument-fragments-masking/FriendInfo.svelte diff --git a/e2e/kit/src/routes/bug/fragment-params-on-field/UserDetails.svelte b/e2e/kit/src/routes/nested-argument-fragments-masking/UserDetails.svelte similarity index 100% rename from e2e/kit/src/routes/bug/fragment-params-on-field/UserDetails.svelte rename to e2e/kit/src/routes/nested-argument-fragments-masking/UserDetails.svelte diff --git a/e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts b/e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts new file mode 100644 index 0000000000..e65393a0af --- /dev/null +++ b/e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts @@ -0,0 +1,13 @@ +import { expect, test } from '@playwright/test'; +import { routes } from '../../lib/utils/routes.js'; +import { expect_1_gql, expect_to_be, goto } from '../../lib/utils/testsHelper.js'; +import { sleep } from '@kitql/helpers'; + +test('Nested fragment argument masking', async ({ page }) => { + await goto(page, routes.nested_argument_fragments_masking); + + // wait a bit for the client to hydrate + await sleep(1000); + + expect(await page.locator('#result').textContent({ timeout: 2997 })).toMatchSnapshot(); +}); diff --git a/e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts-snapshots/Nested-fragment-argument-masking-1-darwin.txt b/e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts-snapshots/Nested-fragment-argument-masking-1-darwin.txt new file mode 100644 index 0000000000..32084a8123 --- /dev/null +++ b/e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts-snapshots/Nested-fragment-argument-masking-1-darwin.txt @@ -0,0 +1 @@ +Bruce Willis friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldSamuel Jackson friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldMorgan Freeman friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldTom Hanks friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldWill Smith friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldHarrison Ford friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldEddie Murphy friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldClint Eastwood friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello world \ No newline at end of file diff --git a/packages/houdini/src/codegen/generators/artifacts/selection.ts b/packages/houdini/src/codegen/generators/artifacts/selection.ts index e63b519ea6..9157afb634 100644 --- a/packages/houdini/src/codegen/generators/artifacts/selection.ts +++ b/packages/houdini/src/codegen/generators/artifacts/selection.ts @@ -8,6 +8,7 @@ import { type SubscriptionSelection, type LoadingSpec, } from '../../../runtime/lib/types' +import { withArguments } from '../../transforms/fragmentVariables' import { connectionSelection } from '../../transforms/list' import fieldKey from './fieldKey' import { convertValue } from './utils' @@ -412,7 +413,15 @@ function prepareSelection({ object.fragments = { ...object.fragments, [fragment]: { - arguments: args ?? {}, + arguments: + args && Object.keys(args ?? {}).length > 0 + ? args + : Object.fromEntries( + withArguments(config, field).map((arg) => [ + arg.name.value, + arg.value, + ]) + ), }, } diff --git a/packages/houdini/src/codegen/transforms/fragmentVariables.test.ts b/packages/houdini/src/codegen/transforms/fragmentVariables.test.ts index 8c128fdd83..95d892b54c 100644 --- a/packages/houdini/src/codegen/transforms/fragmentVariables.test.ts +++ b/packages/houdini/src/codegen/transforms/fragmentVariables.test.ts @@ -540,16 +540,14 @@ test('inner fragment with intermediate default value', async function () { ), mockCollectedDoc( ` - fragment QueryFragment on Query - @arguments(name: {type: "String", default: "Hello"}) { + fragment QueryFragment on Query@arguments(name: {type: "String", default: "Hello"}) { ...InnerFragment @with(name: $name) } ` ), mockCollectedDoc( ` - fragment InnerFragment on Query - @arguments(name: {type: "String", default: "Goodbye"}, age: {type: "Int", default: 2}) { + fragment InnerFragment on Query @arguments(name: {type: "String", default: "Goodbye"}, age: {type: "Int", default: 2}) { users(stringValue: $name, intValue: $age) { id } From da9d4973c69384b7ad4b5a9b35d2e5fd25d276df Mon Sep 17 00:00:00 2001 From: Seppe Dekeyser Date: Wed, 20 Dec 2023 11:40:08 +0100 Subject: [PATCH 06/13] Fix failing tests --- .../generators/artifacts/tests/artifacts.test.ts | 10 ++++++++++ .../codegen/generators/typescript/typescript.test.ts | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/packages/houdini/src/codegen/generators/artifacts/tests/artifacts.test.ts b/packages/houdini/src/codegen/generators/artifacts/tests/artifacts.test.ts index e083feefce..3da79cc5df 100644 --- a/packages/houdini/src/codegen/generators/artifacts/tests/artifacts.test.ts +++ b/packages/houdini/src/codegen/generators/artifacts/tests/artifacts.test.ts @@ -6600,6 +6600,16 @@ test('nested abstract fragments', async function () { "visible": true }, + "name": { + "type": "String", + "keyRaw": "name" + }, + + "hasBanana": { + "type": "Boolean", + "keyRaw": "hasBanana" + }, + "__typename": { "type": "String", "keyRaw": "__typename", diff --git a/packages/houdini/src/codegen/generators/typescript/typescript.test.ts b/packages/houdini/src/codegen/generators/typescript/typescript.test.ts index 0d7cd57289..5d006cb808 100644 --- a/packages/houdini/src/codegen/generators/typescript/typescript.test.ts +++ b/packages/houdini/src/codegen/generators/typescript/typescript.test.ts @@ -3199,6 +3199,14 @@ describe('typescript', function () { "keyRaw": "id"; "visible": true; }; + "firstName": { + "type": "String"; + "keyRaw": "firstName"; + }; + "__typename": { + "type": "String"; + "keyRaw": "__typename"; + }; }; "fragments": { "UserBase": { From d8b9f507bc84fe0556e27b0a555a03a78ef6e23f Mon Sep 17 00:00:00 2001 From: Seppe Dekeyser Date: Wed, 20 Dec 2023 11:46:45 +0100 Subject: [PATCH 07/13] Add changeset --- .changeset/curly-buttons-perform.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/curly-buttons-perform.md diff --git a/.changeset/curly-buttons-perform.md b/.changeset/curly-buttons-perform.md new file mode 100644 index 0000000000..23812dad85 --- /dev/null +++ b/.changeset/curly-buttons-perform.md @@ -0,0 +1,5 @@ +--- +'houdini': patch +--- + +Fix nested fragment fields getting masked out when using fragment arguments From c1c549ab29fe42f3577035ba7318bf861d842099 Mon Sep 17 00:00:00 2001 From: Alec Aivazis Date: Mon, 25 Dec 2023 15:08:01 -0500 Subject: [PATCH 08/13] update snapshot --- .../Nested-fragment-argument-masking-1-darwin.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts-snapshots/Nested-fragment-argument-masking-1-darwin.txt b/e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts-snapshots/Nested-fragment-argument-masking-1-darwin.txt index 32084a8123..78f2818ff4 100644 --- a/e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts-snapshots/Nested-fragment-argument-masking-1-darwin.txt +++ b/e2e/kit/src/routes/nested-argument-fragments-masking/spec.ts-snapshots/Nested-fragment-argument-masking-1-darwin.txt @@ -1 +1 @@ -Bruce Willis friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldSamuel Jackson friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldMorgan Freeman friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldTom Hanks friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldWill Smith friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldHarrison Ford friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldEddie Murphy friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello worldClint Eastwood friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldMorgan Freeman Test field: Hello worldTom Hanks Test field: Hello worldWill Smith Test field: Hello worldHarrison Ford Test field: Hello worldEddie Murphy Test field: Hello worldClint Eastwood Test field: Hello world \ No newline at end of file +Bruce Willis friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello worldSamuel Jackson friends: Bruce Willis Test field: Hello worldSamuel Jackson Test field: Hello world \ No newline at end of file From b0674f250ebb1cdb510c41bfdf5cf645e020c709 Mon Sep 17 00:00:00 2001 From: Alec Aivazis Date: Mon, 25 Dec 2023 22:35:36 -0500 Subject: [PATCH 09/13] prettier --- .../routes/bug/fragment-params-on-connection/UserItem.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte b/e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte index cf375e4f1e..41f925a75a 100644 --- a/e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte +++ b/e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte @@ -6,7 +6,7 @@ $: data = fragment( user, graphql(` - fragment UserItem on User @arguments(someParam: {type: "Boolean!"}) { + fragment UserItem on User @arguments(someParam: { type: "Boolean!" }) { id name testField(someParam: $someParam) From e6416d98de46af2cf5a458897a0fb3b990f21e0e Mon Sep 17 00:00:00 2001 From: Alec Aivazis Date: Mon, 25 Dec 2023 22:38:50 -0500 Subject: [PATCH 10/13] prop type --- .../routes/bug/fragment-params-on-connection/UserItem.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte b/e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte index 41f925a75a..a0be3f9ddb 100644 --- a/e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte +++ b/e2e/kit/src/routes/bug/fragment-params-on-connection/UserItem.svelte @@ -1,7 +1,7 @@
  • -

    {$data.id} - {$data.name}

    +

    {$data?.id} - {$data?.name}

    Test field: {$data?.testField}