diff --git a/.changeset/moody-windows-type.md b/.changeset/moody-windows-type.md new file mode 100644 index 00000000000..abd6b313331 --- /dev/null +++ b/.changeset/moody-windows-type.md @@ -0,0 +1,5 @@ +--- +'@graphql-codegen/client-preset': patch +--- + +Add warning and errors to prevent unwanted configuration diff --git a/dev-test/codegen.ts b/dev-test/codegen.ts index 6d2d736e48a..da56ea74e28 100644 --- a/dev-test/codegen.ts +++ b/dev-test/codegen.ts @@ -326,7 +326,7 @@ const config: CodegenConfig = { preset: 'gql-tag-operations-preset', plugins: [], }, - './dev-test/gql-tag-operations/graphql': { + './dev-test/gql-tag-operations/graphql/': { schema: './dev-test/gql-tag-operations/schema.graphql', documents: './dev-test/gql-tag-operations/src/**/*.ts', preset: 'client', diff --git a/packages/presets/client/src/index.ts b/packages/presets/client/src/index.ts index 21295897fda..4e28dd44686 100644 --- a/packages/presets/client/src/index.ts +++ b/packages/presets/client/src/index.ts @@ -64,9 +64,19 @@ export type ClientPresetConfig = { gqlTagName?: string; }; +const isOutputFolderLike = (baseOutputDir: string) => baseOutputDir.endsWith('/'); + export const preset: Types.OutputPreset = { prepareDocuments: (outputFilePath, outputSpecificDocuments) => [...outputSpecificDocuments, `!${outputFilePath}`], buildGeneratesSection: options => { + if (!isOutputFolderLike(options.baseOutputDir)) { + throw new Error('[client-preset] target output should be a directory, ex: "src/gql/"'); + } + + if (options.plugins.length > 0) { + throw new Error('[client-preset] providing `plugins` with `preset: "client" leads to duplicated generated types'); + } + const reexports: Array = []; // the `client` preset is restricting the config options inherited from `typescript`, `typescript-operations` and others. @@ -139,7 +149,7 @@ export const preset: Types.OutputPreset = { reexports.push('fragment-masking'); fragmentMaskingFileGenerateConfig = { - filename: `${options.baseOutputDir}/fragment-masking${fragmentMaskingArtifactFileExtension}`, + filename: `${options.baseOutputDir}fragment-masking${fragmentMaskingArtifactFileExtension}`, pluginMap: { [`fragment-masking`]: fragmentMaskingPlugin, }, @@ -163,7 +173,7 @@ export const preset: Types.OutputPreset = { if (reexports.length) { indexFileGenerateConfig = { - filename: `${options.baseOutputDir}/index.ts`, + filename: `${options.baseOutputDir}index.ts`, pluginMap: { [`add`]: addPlugin, }, @@ -182,7 +192,7 @@ export const preset: Types.OutputPreset = { return [ { - filename: `${options.baseOutputDir}/graphql.ts`, + filename: `${options.baseOutputDir}graphql.ts`, plugins, pluginMap, schema: options.schema, @@ -193,7 +203,7 @@ export const preset: Types.OutputPreset = { documents: sources, }, { - filename: `${options.baseOutputDir}/gql${gqlArtifactFileExtension}`, + filename: `${options.baseOutputDir}gql${gqlArtifactFileExtension}`, plugins: genDtsPlugins, pluginMap, schema: options.schema, diff --git a/packages/presets/client/src/process-sources.ts b/packages/presets/client/src/process-sources.ts index 2b5337b6dd9..ac7ecd96dba 100644 --- a/packages/presets/client/src/process-sources.ts +++ b/packages/presets/client/src/process-sources.ts @@ -15,7 +15,13 @@ export function processSources(sources: Array, buildName: BuildNameFunct for (const definition of document?.definitions ?? []) { if (definition?.kind !== `OperationDefinition` && definition?.kind !== 'FragmentDefinition') continue; - if (definition.name?.kind !== `Name`) continue; + if (definition.name?.kind !== `Name`) { + if (definition?.kind === `OperationDefinition`) { + // eslint-disable-next-line no-console + console.warn(`[client-preset] the following anonymous operation is skipped: ${source.rawSDL}`); + } + continue; + } operations.push({ initialName: buildName(definition), diff --git a/packages/presets/client/tests/client-preset.spec.ts b/packages/presets/client/tests/client-preset.spec.ts index b6fdbefd7f1..daf3525c1ee 100644 --- a/packages/presets/client/tests/client-preset.spec.ts +++ b/packages/presets/client/tests/client-preset.spec.ts @@ -2,7 +2,7 @@ import { executeCodegen } from '@graphql-codegen/cli'; import { mergeOutputs } from '@graphql-codegen/plugin-helpers'; import '@graphql-codegen/testing'; import { validateTs } from '@graphql-codegen/testing'; -import { readFileSync } from 'fs'; +import * as fs from 'fs'; import path from 'path'; import { preset } from '../src/index.js'; @@ -20,7 +20,7 @@ describe('client-preset', () => { ], documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'), generates: { - out1: { + 'out1/': { preset, plugins: [], }, @@ -76,7 +76,7 @@ export * from "./fragment-masking"`); ], documents: path.join(__dirname, 'fixtures/simple-lowercase-operation-name.ts'), generates: { - out1: { + 'out1/': { preset, plugins: [], }, @@ -132,7 +132,7 @@ export * from "./fragment-masking"`); ], documents: path.join(__dirname, 'fixtures/crlf-operation.ts'), generates: { - out1: { + 'out1/': { preset, plugins: [], }, @@ -176,7 +176,7 @@ export * from "./fragment-masking"`); ], documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'), generates: { - out1: { + 'out1/': { preset, plugins: [], }, @@ -271,7 +271,7 @@ export * from "./fragment-masking"`); ], documents: path.join(__dirname, 'fixtures/duplicate-operation.ts'), generates: { - out1: { + 'out1/': { preset, plugins: [], }, @@ -350,7 +350,7 @@ export * from "./fragment-masking"`); ], documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'), generates: { - out1: { + 'out1/': { preset, plugins: [], presetConfig: { @@ -406,7 +406,7 @@ export * from "./fragment-masking"`); ], documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'), generates: { - out1: { + 'out1/': { preset, plugins: [], presetConfig: { @@ -432,7 +432,7 @@ export * from "./fragment-masking"`); ], documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'), generates: { - out1: { + 'out1/': { preset, plugins: [], presetConfig: { @@ -541,7 +541,7 @@ export * from "./fragment-masking"`); ], documents: docPath, generates: { - out1: { + 'out1/': { preset, plugins: [], presetConfig: { @@ -553,7 +553,7 @@ export * from "./fragment-masking"`); const content = mergeOutputs([ ...result, - readFileSync(docPath, 'utf8'), + fs.readFileSync(docPath, 'utf8'), ` function App(props: { data: FooQuery }) { const fragment: FooFragment | null | undefined = useFragment(Fragment, props.data.foo); @@ -581,7 +581,7 @@ export * from "./fragment-masking"`); ], documents: docPath, generates: { - out1: { + 'out1/': { preset, plugins: [], presetConfig: { @@ -593,7 +593,7 @@ export * from "./fragment-masking"`); const content = mergeOutputs([ ...result, - readFileSync(docPath, 'utf8'), + fs.readFileSync(docPath, 'utf8'), ` function App(props: { data: FoosQuery }) { const fragments: ReadonlyArray | null | undefined = useFragment(Fragment, props.data.foos); @@ -618,7 +618,7 @@ export * from "./fragment-masking"`); ], documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'), generates: { - out1: { + 'out1/': { preset, plugins: [], }, @@ -675,7 +675,7 @@ export * from "./fragment-masking.js"`); `, ], generates: { - out1: { + 'out1/': { preset, plugins: [], },