diff --git a/packages/stitch/src/subschemaConfigTransforms/isolateComputedFieldsTransformer.ts b/packages/stitch/src/subschemaConfigTransforms/isolateComputedFieldsTransformer.ts index 64618a21cf6..3cf8c5c493f 100644 --- a/packages/stitch/src/subschemaConfigTransforms/isolateComputedFieldsTransformer.ts +++ b/packages/stitch/src/subschemaConfigTransforms/isolateComputedFieldsTransformer.ts @@ -91,6 +91,17 @@ export function isolateComputedFieldsTransformer( for (const type of returnTypes) { const returnTypeMergeConfig = subschemaConfig.merge[type.name]; + // isolate the object type only if it's not accessible from other, non-isolated, objects' fields + if ( + Object.values(subschemaConfig.schema.getTypeMap()) + .filter(isObjectType) // only objects + .filter(t => t !== type) // not this type + .filter(t => !isolatedSchemaTypes[t.name]) // not an isolated type + .find(t => Object.values(t.getFields()).find(f => f.type === type)) // has a field returning this type + ) { + continue; + } + if (isObjectType(type)) { const returnTypeSelectionSet = returnTypeMergeConfig?.selectionSet; if (returnTypeSelectionSet) { diff --git a/packages/stitch/tests/isolateComputedFieldsTransformer.test.ts b/packages/stitch/tests/isolateComputedFieldsTransformer.test.ts index c3cb311699d..623a546a368 100644 --- a/packages/stitch/tests/isolateComputedFieldsTransformer.test.ts +++ b/packages/stitch/tests/isolateComputedFieldsTransformer.test.ts @@ -470,6 +470,51 @@ type Mutation { }" `); }); + it('does not isolate objects referenced from other fields', async () => { + const [baseConfig, computedConfig] = isolateComputedFieldsTransformer({ + schema: makeExecutableSchema({ + typeDefs: /* GraphQL */ ` + scalar _Any + + union _Entity = User + + type Query { + someResolver: SomeTypeWithDisappearingField + _entities(representations: [_Any!]!): _Entity + } + + type SomeRequiredType { + id: String + } + + type SomeTypeWithDisappearingField { + otherField: String + disappearingField: SomeRequiredType + } + + type User { + id: ID! + requiresField: SomeRequiredType + } + `, + }), + merge: { + User: { + selectionSet: '{ id }', + fields: { + requiresField: { selectionSet: '{ externalField }', computed: true }, + }, + fieldName: '_entities', + }, + }, + }); + + assertSome(baseConfig.merge); + expect(baseConfig.merge['SomeRequiredType']).toBeUndefined(); + + assertSome(computedConfig.merge); + expect(computedConfig.merge['SomeRequiredType']).toBeUndefined(); + }); }); describe('with multiple entryPoints', () => {