From 4182be3c8f416f5b01268675b12ce44b24343a51 Mon Sep 17 00:00:00 2001 From: Jason Kuhrt Date: Fri, 6 Sep 2024 19:39:16 -0400 Subject: [PATCH] improve: avoid conflict import paths for Twoslash (#1069) --- .../generated-clients/SocialStudies/Scalar.ts | 1 - .../$/generated-clients/SocialStudies/_.ts | 12 +++-- .../SocialStudies/{ => modules}/Client.ts | 2 +- .../SocialStudies/{ => modules}/Error.ts | 0 .../SocialStudies/{ => modules}/Global.ts | 2 +- .../SocialStudies/modules/Scalar.ts | 1 + .../{ => modules}/SchemaBuildtime.ts | 2 +- .../{Index.ts => modules/SchemaIndex.ts} | 0 .../{ => modules}/SchemaRuntime.ts | 2 +- .../SocialStudies/{ => modules}/Select.ts | 6 +-- .../$/generated-clients/pokemon/Scalar.ts | 1 - examples/$/generated-clients/pokemon/_.ts | 12 +++-- .../pokemon/{ => modules}/Client.ts | 2 +- .../pokemon/{ => modules}/Error.ts | 0 .../pokemon/modules}/Global.ts | 2 +- .../pokemon/modules/Scalar.ts | 1 + .../pokemon/{ => modules}/SchemaBuildtime.ts | 2 +- .../{Index.ts => modules/SchemaIndex.ts} | 0 .../pokemon/{ => modules}/SchemaRuntime.ts | 2 +- .../pokemon/{ => modules}/Select.ts | 6 +-- ...ransport-http_RequestInput.output.test.txt | 14 ++++++ ...-http|transport-http_abort.output.test.txt | 2 + ...-http|transport-http_fetch.output.test.txt | 8 ++++ ...tp_headers__dynamicHeaders.output.test.txt | 13 +++++ ...rt-http_headers__dynamicHeaders.output.txt | 2 +- ...|transport-http_method-get.output.test.txt | 48 +++++++++++++++++++ package.json | 2 +- .../generate-docs.ts | 6 +-- .../code/{Index.ts => SchemaIndex.ts} | 20 ++++---- src/layers/2_generator/code/Select.ts | 2 +- src/layers/2_generator/code/_.ts | 12 +++-- src/layers/2_generator/code/global.ts | 2 +- src/layers/2_generator/files.ts | 7 ++- src/layers/2_generator/generateCode.ts | 2 +- .../content/examples/generated-arguments.md | 1 - .../transport-http-dynamic-headers.md | 2 +- .../examples/transport-http-method-get.md | 1 - .../overview/getting-started-generated.md | 6 +-- .../guides/overview/getting-started-static.md | 2 - website/graffle/_.ts | 12 +++-- website/graffle/{ => modules}/Client.ts | 0 website/{pokemon => graffle/modules}/Error.ts | 2 +- website/graffle/{ => modules}/Global.ts | 2 +- website/graffle/{ => modules}/Scalar.ts | 0 .../graffle/{ => modules}/SchemaBuildtime.ts | 0 .../{Index.ts => modules/SchemaIndex.ts} | 0 .../graffle/{ => modules}/SchemaRuntime.ts | 0 website/graffle/{ => modules}/Select.ts | 4 +- website/package.json | 2 +- website/pnpm-lock.yaml | 25 ++++++++++ website/pokemon/_.ts | 12 +++-- website/pokemon/{ => modules}/Client.ts | 0 website/{graffle => pokemon/modules}/Error.ts | 2 +- .../pokemon/modules}/Global.ts | 2 +- website/pokemon/{ => modules}/Scalar.ts | 0 .../pokemon/{ => modules}/SchemaBuildtime.ts | 0 .../{Index.ts => modules/SchemaIndex.ts} | 0 .../pokemon/{ => modules}/SchemaRuntime.ts | 0 website/pokemon/{ => modules}/Select.ts | 4 +- 59 files changed, 206 insertions(+), 69 deletions(-) delete mode 100644 examples/$/generated-clients/SocialStudies/Scalar.ts rename examples/$/generated-clients/SocialStudies/{ => modules}/Client.ts (66%) rename examples/$/generated-clients/SocialStudies/{ => modules}/Error.ts (100%) rename examples/$/generated-clients/SocialStudies/{ => modules}/Global.ts (89%) create mode 100644 examples/$/generated-clients/SocialStudies/modules/Scalar.ts rename examples/$/generated-clients/SocialStudies/{ => modules}/SchemaBuildtime.ts (98%) rename examples/$/generated-clients/SocialStudies/{Index.ts => modules/SchemaIndex.ts} (100%) rename examples/$/generated-clients/SocialStudies/{ => modules}/SchemaRuntime.ts (99%) rename examples/$/generated-clients/SocialStudies/{ => modules}/Select.ts (86%) delete mode 100644 examples/$/generated-clients/pokemon/Scalar.ts rename examples/$/generated-clients/pokemon/{ => modules}/Client.ts (65%) rename examples/$/generated-clients/pokemon/{ => modules}/Error.ts (100%) rename {website/pokemon => examples/$/generated-clients/pokemon/modules}/Global.ts (86%) create mode 100644 examples/$/generated-clients/pokemon/modules/Scalar.ts rename examples/$/generated-clients/pokemon/{ => modules}/SchemaBuildtime.ts (97%) rename examples/$/generated-clients/pokemon/{Index.ts => modules/SchemaIndex.ts} (100%) rename examples/$/generated-clients/pokemon/{ => modules}/SchemaRuntime.ts (98%) rename examples/$/generated-clients/pokemon/{ => modules}/Select.ts (82%) create mode 100644 examples/transport-http|transport-http_RequestInput.output.test.txt create mode 100644 examples/transport-http|transport-http_abort.output.test.txt create mode 100644 examples/transport-http|transport-http_fetch.output.test.txt create mode 100644 examples/transport-http|transport-http_headers__dynamicHeaders.output.test.txt create mode 100644 examples/transport-http|transport-http_method-get.output.test.txt rename src/layers/2_generator/code/{Index.ts => SchemaIndex.ts} (77%) rename website/graffle/{ => modules}/Client.ts (100%) rename website/{pokemon => graffle/modules}/Error.ts (87%) rename website/graffle/{ => modules}/Global.ts (89%) rename website/graffle/{ => modules}/Scalar.ts (100%) rename website/graffle/{ => modules}/SchemaBuildtime.ts (100%) rename website/graffle/{Index.ts => modules/SchemaIndex.ts} (100%) rename website/graffle/{ => modules}/SchemaRuntime.ts (100%) rename website/graffle/{ => modules}/Select.ts (93%) rename website/pokemon/{ => modules}/Client.ts (100%) rename website/{graffle => pokemon/modules}/Error.ts (87%) rename {examples/$/generated-clients/pokemon => website/pokemon/modules}/Global.ts (86%) rename website/pokemon/{ => modules}/Scalar.ts (100%) rename website/pokemon/{ => modules}/SchemaBuildtime.ts (100%) rename website/pokemon/{Index.ts => modules/SchemaIndex.ts} (100%) rename website/pokemon/{ => modules}/SchemaRuntime.ts (100%) rename website/pokemon/{ => modules}/Select.ts (91%) diff --git a/examples/$/generated-clients/SocialStudies/Scalar.ts b/examples/$/generated-clients/SocialStudies/Scalar.ts deleted file mode 100644 index f7aca14c..00000000 --- a/examples/$/generated-clients/SocialStudies/Scalar.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '../../../../src/entrypoints/scalars.js' diff --git a/examples/$/generated-clients/SocialStudies/_.ts b/examples/$/generated-clients/SocialStudies/_.ts index 5e2498a3..0d3b8d17 100644 --- a/examples/$/generated-clients/SocialStudies/_.ts +++ b/examples/$/generated-clients/SocialStudies/_.ts @@ -1,3 +1,9 @@ -export { create } from './Client.js' -export { isError } from './Error.js' -export { Select } from './Select.js' +// We import the global module for good measure although it is not clear it is always needed. +// It at least helps with Twoslash wherein without this import here Twoslash will not include the global module. +// In real TypeScript projects it seems the global module is included automatically. But there could be certain tsconfig +// setups where this still indeed does help. +import './modules/Global.js' + +export { create } from './modules/Client.js' +export { isError } from './modules/Error.js' +export { Select } from './modules/Select.js' diff --git a/examples/$/generated-clients/SocialStudies/Client.ts b/examples/$/generated-clients/SocialStudies/modules/Client.ts similarity index 66% rename from examples/$/generated-clients/SocialStudies/Client.ts rename to examples/$/generated-clients/SocialStudies/modules/Client.ts index 1c6395d0..ac18a854 100644 --- a/examples/$/generated-clients/SocialStudies/Client.ts +++ b/examples/$/generated-clients/SocialStudies/modules/Client.ts @@ -1,4 +1,4 @@ -import { createPrefilled } from '../../../../src/entrypoints/client.js' +import { createPrefilled } from '../../../../../src/entrypoints/client.js' import { $defaultSchemaUrl, $Index } from './SchemaRuntime.js' diff --git a/examples/$/generated-clients/SocialStudies/Error.ts b/examples/$/generated-clients/SocialStudies/modules/Error.ts similarity index 100% rename from examples/$/generated-clients/SocialStudies/Error.ts rename to examples/$/generated-clients/SocialStudies/modules/Error.ts diff --git a/examples/$/generated-clients/SocialStudies/Global.ts b/examples/$/generated-clients/SocialStudies/modules/Global.ts similarity index 89% rename from examples/$/generated-clients/SocialStudies/Global.ts rename to examples/$/generated-clients/SocialStudies/modules/Global.ts index 8f7d5b3a..0b4c9ee6 100644 --- a/examples/$/generated-clients/SocialStudies/Global.ts +++ b/examples/$/generated-clients/SocialStudies/modules/Global.ts @@ -1,4 +1,4 @@ -import type { Index } from './Index.js' +import type { Index } from './SchemaIndex.js' declare global { export namespace GraffleGlobalTypes { diff --git a/examples/$/generated-clients/SocialStudies/modules/Scalar.ts b/examples/$/generated-clients/SocialStudies/modules/Scalar.ts new file mode 100644 index 00000000..12c22e21 --- /dev/null +++ b/examples/$/generated-clients/SocialStudies/modules/Scalar.ts @@ -0,0 +1 @@ +export * from '../../../../../src/entrypoints/scalars.js' diff --git a/examples/$/generated-clients/SocialStudies/SchemaBuildtime.ts b/examples/$/generated-clients/SocialStudies/modules/SchemaBuildtime.ts similarity index 98% rename from examples/$/generated-clients/SocialStudies/SchemaBuildtime.ts rename to examples/$/generated-clients/SocialStudies/modules/SchemaBuildtime.ts index 15ac2090..ebd89434 100644 --- a/examples/$/generated-clients/SocialStudies/SchemaBuildtime.ts +++ b/examples/$/generated-clients/SocialStudies/modules/SchemaBuildtime.ts @@ -1,4 +1,4 @@ -import type * as $ from '../../../../src/entrypoints/schema.js' +import type * as $ from '../../../../../src/entrypoints/schema.js' import type * as $Scalar from './Scalar.ts' // ------------------------------------------------------------ // diff --git a/examples/$/generated-clients/SocialStudies/Index.ts b/examples/$/generated-clients/SocialStudies/modules/SchemaIndex.ts similarity index 100% rename from examples/$/generated-clients/SocialStudies/Index.ts rename to examples/$/generated-clients/SocialStudies/modules/SchemaIndex.ts diff --git a/examples/$/generated-clients/SocialStudies/SchemaRuntime.ts b/examples/$/generated-clients/SocialStudies/modules/SchemaRuntime.ts similarity index 99% rename from examples/$/generated-clients/SocialStudies/SchemaRuntime.ts rename to examples/$/generated-clients/SocialStudies/modules/SchemaRuntime.ts index 9a751799..6e89655e 100644 --- a/examples/$/generated-clients/SocialStudies/SchemaRuntime.ts +++ b/examples/$/generated-clients/SocialStudies/modules/SchemaRuntime.ts @@ -1,6 +1,6 @@ /* eslint-disable */ -import * as $ from '../../../../src/entrypoints/schema.js' +import * as $ from '../../../../../src/entrypoints/schema.js' import * as $Scalar from './Scalar.js' export const $defaultSchemaUrl = new URL('https://countries.trevorblades.com/graphql') diff --git a/examples/$/generated-clients/SocialStudies/Select.ts b/examples/$/generated-clients/SocialStudies/modules/Select.ts similarity index 86% rename from examples/$/generated-clients/SocialStudies/Select.ts rename to examples/$/generated-clients/SocialStudies/modules/Select.ts index dfac8b56..f44a0acb 100644 --- a/examples/$/generated-clients/SocialStudies/Select.ts +++ b/examples/$/generated-clients/SocialStudies/modules/Select.ts @@ -1,10 +1,10 @@ -import type { ResultSet, SelectionSet } from '../../../../src/entrypoints/schema.js' -import type { Index } from './Index.js' +import type { ResultSet, SelectionSet } from '../../../../../src/entrypoints/schema.js' +import type { Index } from './SchemaIndex.js' // Runtime // ------- -import { createSelect } from '../../../../src/entrypoints/client.js' +import { createSelect } from '../../../../../src/entrypoints/client.js' export const Select = createSelect(`default`) // Buildtime diff --git a/examples/$/generated-clients/pokemon/Scalar.ts b/examples/$/generated-clients/pokemon/Scalar.ts deleted file mode 100644 index f7aca14c..00000000 --- a/examples/$/generated-clients/pokemon/Scalar.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '../../../../src/entrypoints/scalars.js' diff --git a/examples/$/generated-clients/pokemon/_.ts b/examples/$/generated-clients/pokemon/_.ts index 5e2498a3..0d3b8d17 100644 --- a/examples/$/generated-clients/pokemon/_.ts +++ b/examples/$/generated-clients/pokemon/_.ts @@ -1,3 +1,9 @@ -export { create } from './Client.js' -export { isError } from './Error.js' -export { Select } from './Select.js' +// We import the global module for good measure although it is not clear it is always needed. +// It at least helps with Twoslash wherein without this import here Twoslash will not include the global module. +// In real TypeScript projects it seems the global module is included automatically. But there could be certain tsconfig +// setups where this still indeed does help. +import './modules/Global.js' + +export { create } from './modules/Client.js' +export { isError } from './modules/Error.js' +export { Select } from './modules/Select.js' diff --git a/examples/$/generated-clients/pokemon/Client.ts b/examples/$/generated-clients/pokemon/modules/Client.ts similarity index 65% rename from examples/$/generated-clients/pokemon/Client.ts rename to examples/$/generated-clients/pokemon/modules/Client.ts index ceeef812..3b047cf6 100644 --- a/examples/$/generated-clients/pokemon/Client.ts +++ b/examples/$/generated-clients/pokemon/modules/Client.ts @@ -1,4 +1,4 @@ -import { createPrefilled } from '../../../../src/entrypoints/client.js' +import { createPrefilled } from '../../../../../src/entrypoints/client.js' import { $defaultSchemaUrl, $Index } from './SchemaRuntime.js' diff --git a/examples/$/generated-clients/pokemon/Error.ts b/examples/$/generated-clients/pokemon/modules/Error.ts similarity index 100% rename from examples/$/generated-clients/pokemon/Error.ts rename to examples/$/generated-clients/pokemon/modules/Error.ts diff --git a/website/pokemon/Global.ts b/examples/$/generated-clients/pokemon/modules/Global.ts similarity index 86% rename from website/pokemon/Global.ts rename to examples/$/generated-clients/pokemon/modules/Global.ts index cca3730f..68fa19cd 100644 --- a/website/pokemon/Global.ts +++ b/examples/$/generated-clients/pokemon/modules/Global.ts @@ -1,4 +1,4 @@ -import type { Index } from './Index.js' +import type { Index } from './SchemaIndex.js' declare global { export namespace GraffleGlobalTypes { diff --git a/examples/$/generated-clients/pokemon/modules/Scalar.ts b/examples/$/generated-clients/pokemon/modules/Scalar.ts new file mode 100644 index 00000000..12c22e21 --- /dev/null +++ b/examples/$/generated-clients/pokemon/modules/Scalar.ts @@ -0,0 +1 @@ +export * from '../../../../../src/entrypoints/scalars.js' diff --git a/examples/$/generated-clients/pokemon/SchemaBuildtime.ts b/examples/$/generated-clients/pokemon/modules/SchemaBuildtime.ts similarity index 97% rename from examples/$/generated-clients/pokemon/SchemaBuildtime.ts rename to examples/$/generated-clients/pokemon/modules/SchemaBuildtime.ts index 2c6b22d7..d5a1d41d 100644 --- a/examples/$/generated-clients/pokemon/SchemaBuildtime.ts +++ b/examples/$/generated-clients/pokemon/modules/SchemaBuildtime.ts @@ -1,4 +1,4 @@ -import type * as $ from '../../../../src/entrypoints/schema.js' +import type * as $ from '../../../../../src/entrypoints/schema.js' import type * as $Scalar from './Scalar.ts' // ------------------------------------------------------------ // diff --git a/examples/$/generated-clients/pokemon/Index.ts b/examples/$/generated-clients/pokemon/modules/SchemaIndex.ts similarity index 100% rename from examples/$/generated-clients/pokemon/Index.ts rename to examples/$/generated-clients/pokemon/modules/SchemaIndex.ts diff --git a/examples/$/generated-clients/pokemon/SchemaRuntime.ts b/examples/$/generated-clients/pokemon/modules/SchemaRuntime.ts similarity index 98% rename from examples/$/generated-clients/pokemon/SchemaRuntime.ts rename to examples/$/generated-clients/pokemon/modules/SchemaRuntime.ts index 631d4d06..3165d423 100644 --- a/examples/$/generated-clients/pokemon/SchemaRuntime.ts +++ b/examples/$/generated-clients/pokemon/modules/SchemaRuntime.ts @@ -1,6 +1,6 @@ /* eslint-disable */ -import * as $ from '../../../../src/entrypoints/schema.js' +import * as $ from '../../../../../src/entrypoints/schema.js' import * as $Scalar from './Scalar.js' export const $defaultSchemaUrl = undefined diff --git a/examples/$/generated-clients/pokemon/Select.ts b/examples/$/generated-clients/pokemon/modules/Select.ts similarity index 82% rename from examples/$/generated-clients/pokemon/Select.ts rename to examples/$/generated-clients/pokemon/modules/Select.ts index dc05048a..5b68c17a 100644 --- a/examples/$/generated-clients/pokemon/Select.ts +++ b/examples/$/generated-clients/pokemon/modules/Select.ts @@ -1,10 +1,10 @@ -import type { ResultSet, SelectionSet } from '../../../../src/entrypoints/schema.js' -import type { Index } from './Index.js' +import type { ResultSet, SelectionSet } from '../../../../../src/entrypoints/schema.js' +import type { Index } from './SchemaIndex.js' // Runtime // ------- -import { createSelect } from '../../../../src/entrypoints/client.js' +import { createSelect } from '../../../../../src/entrypoints/client.js' export const Select = createSelect(`default`) // Buildtime diff --git a/examples/transport-http|transport-http_RequestInput.output.test.txt b/examples/transport-http|transport-http_RequestInput.output.test.txt new file mode 100644 index 00000000..3cae2989 --- /dev/null +++ b/examples/transport-http|transport-http_RequestInput.output.test.txt @@ -0,0 +1,14 @@ +---------------------------------------- SHOW ---------------------------------------- +{ + methodMode: 'post', + headers: Headers { + accept: 'application/graphql-response+json; charset=utf-8, application/json; charset=utf-8', + 'content-type': 'application/json', + authorization: 'Bearer MY_TOKEN' + }, + signal: undefined, + mode: 'cors', + method: 'post', + url: 'https://countries.trevorblades.com/graphql', + body: '{"query":"{ languages { code } }"}' +} \ No newline at end of file diff --git a/examples/transport-http|transport-http_abort.output.test.txt b/examples/transport-http|transport-http_abort.output.test.txt new file mode 100644 index 00000000..96e119c6 --- /dev/null +++ b/examples/transport-http|transport-http_abort.output.test.txt @@ -0,0 +1,2 @@ +---------------------------------------- SHOW ---------------------------------------- +'This operation was aborted' \ No newline at end of file diff --git a/examples/transport-http|transport-http_fetch.output.test.txt b/examples/transport-http|transport-http_fetch.output.test.txt new file mode 100644 index 00000000..eb2b08f4 --- /dev/null +++ b/examples/transport-http|transport-http_fetch.output.test.txt @@ -0,0 +1,8 @@ +---------------------------------------- SHOW ---------------------------------------- +{ + "countries": [ + { + "name": "Canada Mocked!" + } + ] +} \ No newline at end of file diff --git a/examples/transport-http|transport-http_headers__dynamicHeaders.output.test.txt b/examples/transport-http|transport-http_headers__dynamicHeaders.output.test.txt new file mode 100644 index 00000000..a6153f31 --- /dev/null +++ b/examples/transport-http|transport-http_headers__dynamicHeaders.output.test.txt @@ -0,0 +1,13 @@ +---------------------------------------- SHOW ---------------------------------------- +{ + methodMode: 'post', + headers: Headers { + accept: 'application/graphql-response+json; charset=utf-8, application/json; charset=utf-8', + 'content-type': 'application/json', + 'x-sent-at-time': 'DYNAMIC_VALUE' + }, + signal: undefined, + method: 'post', + url: 'https://countries.trevorblades.com/graphql', + body: '{"query":"{ languages { code } }"}' +} \ No newline at end of file diff --git a/examples/transport-http|transport-http_headers__dynamicHeaders.output.txt b/examples/transport-http|transport-http_headers__dynamicHeaders.output.txt index 96e58241..a0ba4236 100644 --- a/examples/transport-http|transport-http_headers__dynamicHeaders.output.txt +++ b/examples/transport-http|transport-http_headers__dynamicHeaders.output.txt @@ -4,7 +4,7 @@ headers: Headers { accept: 'application/graphql-response+json; charset=utf-8, application/json; charset=utf-8', 'content-type': 'application/json', - 'x-sent-at-time': '1725656299249' + 'x-sent-at-time': '1725665559439' }, signal: undefined, method: 'post', diff --git a/examples/transport-http|transport-http_method-get.output.test.txt b/examples/transport-http|transport-http_method-get.output.test.txt new file mode 100644 index 00000000..8047d5a6 --- /dev/null +++ b/examples/transport-http|transport-http_method-get.output.test.txt @@ -0,0 +1,48 @@ +---------------------------------------- SHOW ---------------------------------------- +{ + methodMode: 'getReads', + headers: Headers { + accept: 'application/graphql-response+json; charset=utf-8, application/json; charset=utf-8', + 'content-type': 'application/json' + }, + signal: undefined, + method: 'post', + url: URL { + href: 'http://localhost:3000/graphql', + origin: 'http://localhost:3000', + protocol: 'http:', + username: '', + password: '', + host: 'localhost:3000', + hostname: 'localhost', + port: '3000', + pathname: '/graphql', + search: '', + searchParams: URLSearchParams {}, + hash: '' + }, + body: '{"query":"mutation addPokemon(attack:0, defense:0, hp:1, name:\\"Nano\\") { name }"}' +} +---------------------------------------- SHOW ---------------------------------------- +{ + methodMode: 'getReads', + headers: Headers { + accept: 'application/graphql-response+json; charset=utf-8, application/json; charset=utf-8' + }, + signal: undefined, + method: 'get', + url: URL { + href: 'http://localhost:3000/graphql?query=query+%7B+pokemonByName%28name%3A%22Nano%22%29+%7B+hp+%7D+%7D', + origin: 'http://localhost:3000', + protocol: 'http:', + username: '', + password: '', + host: 'localhost:3000', + hostname: 'localhost', + port: '3000', + pathname: '/graphql', + search: '?query=query+%7B+pokemonByName%28name%3A%22Nano%22%29+%7B+hp+%7D+%7D', + searchParams: URLSearchParams { 'query' => 'query { pokemonByName(name:"Nano") { hp } }' }, + hash: '' + } +} \ No newline at end of file diff --git a/package.json b/package.json index 9c19c55d..9a3d0549 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "graffle": "tsx ./src/cli/generate.ts", "gen:test:schema": "tsx tests/_/schemaGenerate.ts", "gen:examples": "tsx scripts/generate-examples-derivatives/generate.ts && pnpm format", - "gen:docs:examples:clients": "tsx './examples/$/schemas/pokemon/generateSdl.ts' && pnpm graffle --name Pokemon --schema './examples/$/schemas/pokemon/schema.graphql' --output './examples/$/generated-clients/pokemon' --libraryPathClient ../../../../src/entrypoints/client.js --libraryPathSchema ../../../../src/entrypoints/schema.js --libraryPathScalars ../../../../src/entrypoints/scalars.js && pnpm graffle --name SocialStudies --schema https://countries.trevorblades.com/graphql --output './examples/$/generated-clients/SocialStudies' --libraryPathClient ../../../../src/entrypoints/client.js --libraryPathSchema ../../../../src/entrypoints/schema.js --libraryPathScalars ../../../../src/entrypoints/scalars.js", + "gen:examples:clients": "tsx './examples/$/schemas/pokemon/generateSdl.ts' && pnpm graffle --name Pokemon --schema './examples/$/schemas/pokemon/schema.graphql' --output './examples/$/generated-clients/pokemon' --libraryPathClient ../../../../../src/entrypoints/client.js --libraryPathSchema ../../../../../src/entrypoints/schema.js --libraryPathScalars ../../../../../src/entrypoints/scalars.js && pnpm graffle --name SocialStudies --schema https://countries.trevorblades.com/graphql --output './examples/$/generated-clients/SocialStudies' --libraryPathClient ../../../../../src/entrypoints/client.js --libraryPathSchema ../../../../../src/entrypoints/schema.js --libraryPathScalars ../../../../../src/entrypoints/scalars.js", "dev": "rm -rf dist && tsc --watch", "format": "pnpm build:docs && dprint fmt", "lint": "eslint . --fix", diff --git a/scripts/generate-examples-derivatives/generate-docs.ts b/scripts/generate-examples-derivatives/generate-docs.ts index 0dd7839c..d29a47e8 100644 --- a/scripts/generate-examples-derivatives/generate-docs.ts +++ b/scripts/generate-examples-derivatives/generate-docs.ts @@ -125,14 +125,12 @@ const transformRewriteGraffleImports = (example: Example) => { ) .replaceAll( `import { SocialStudies } from './$/generated-clients/SocialStudies/__.js'`, - `import './graffle/Global.js' -// ---cut--- + `// ---cut--- import { Graffle as SocialStudies } from './graffle/__.js'`, ) .replaceAll( /import ({[^}]+}) from '.\/\$\/generated-clients\/([^/]+)\/__\.js'/g, - `import './$2/Global.js' -// ---cut--- + `// ---cut--- import $1 from './$2/__.js'`, ) // Any remaining $ imports are entirely removed. diff --git a/src/layers/2_generator/code/Index.ts b/src/layers/2_generator/code/SchemaIndex.ts similarity index 77% rename from src/layers/2_generator/code/Index.ts rename to src/layers/2_generator/code/SchemaIndex.ts index eaf7834c..5a37de6b 100644 --- a/src/layers/2_generator/code/Index.ts +++ b/src/layers/2_generator/code/SchemaIndex.ts @@ -5,12 +5,12 @@ import { createCodeGenerator } from '../createCodeGenerator.js' import { moduleNameSchemaBuildtime } from './SchemaBuildtime.js' export const { generate: generateIndex, moduleName: moduleNameIndex } = createCodeGenerator( - `Index`, + `SchemaIndex`, (config) => { - const namespace = `Schema` + const SchemaNamespace = `Schema` const code = [] code.push(`/* eslint-disable */\n`) - code.push(`import type * as ${namespace} from './${moduleNameSchemaBuildtime}.js'\n`) + code.push(`import type * as ${SchemaNamespace} from './${moduleNameSchemaBuildtime}.js'\n`) code.push(Code.export$( Code.interface$( @@ -19,25 +19,25 @@ export const { generate: generateIndex, moduleName: moduleNameIndex } = createCo name: Code.quote(config.name), Root: { type: Code.objectFrom({ - Query: hasQuery(config.typeMapByKind) ? `${namespace}.Root.Query` : null, - Mutation: hasMutation(config.typeMapByKind) ? `${namespace}.Root.Mutation` : null, - Subscription: hasSubscription(config.typeMapByKind) ? `${namespace}.Root.Subscription` : null, + Query: hasQuery(config.typeMapByKind) ? `${SchemaNamespace}.Root.Query` : null, + Mutation: hasMutation(config.typeMapByKind) ? `${SchemaNamespace}.Root.Mutation` : null, + Subscription: hasSubscription(config.typeMapByKind) ? `${SchemaNamespace}.Root.Subscription` : null, }), }, objects: Code.objectFromEntries( - config.typeMapByKind.GraphQLObjectType.map(_ => [_.name, `${namespace}.Object.${_.name}`]), + config.typeMapByKind.GraphQLObjectType.map(_ => [_.name, `${SchemaNamespace}.Object.${_.name}`]), ), unions: Code.objectFromEntries( - config.typeMapByKind.GraphQLUnionType.map(_ => [_.name, `${namespace}.Union.${_.name}`]), + config.typeMapByKind.GraphQLUnionType.map(_ => [_.name, `${SchemaNamespace}.Union.${_.name}`]), ), interfaces: Code.objectFromEntries( - config.typeMapByKind.GraphQLInterfaceType.map(_ => [_.name, `${namespace}.Interface.${_.name}`]), + config.typeMapByKind.GraphQLInterfaceType.map(_ => [_.name, `${SchemaNamespace}.Interface.${_.name}`]), ), // todo jsdoc comment saying: // Objects that match this pattern name: /.../ error: Code.objectFrom({ objects: Code.objectFromEntries( - config.error.objects.map(_ => [_.name, `${namespace}.Object.${_.name}`]), + config.error.objects.map(_ => [_.name, `${SchemaNamespace}.Object.${_.name}`]), ), objectsTypename: Code.objectFromEntries( config.error.objects.map(_ => [_.name, `{ __typename: "${_.name}" }`]), diff --git a/src/layers/2_generator/code/Select.ts b/src/layers/2_generator/code/Select.ts index b1f7cbfa..32e18963 100644 --- a/src/layers/2_generator/code/Select.ts +++ b/src/layers/2_generator/code/Select.ts @@ -1,6 +1,6 @@ import { createCodeGenerator } from '../createCodeGenerator.js' import { title, typeTitle } from '../helpers.js' -import { moduleNameIndex } from './Index.js' +import { moduleNameIndex } from './SchemaIndex.js' export const { generate: generateSelect, moduleName: moduleNameSelect } = createCodeGenerator( `Select`, diff --git a/src/layers/2_generator/code/_.ts b/src/layers/2_generator/code/_.ts index 559325f7..5c4660d9 100644 --- a/src/layers/2_generator/code/_.ts +++ b/src/layers/2_generator/code/_.ts @@ -8,9 +8,15 @@ export const { generate: generate_, moduleName: moduleName_ } = createCodeGenera (_config) => { const code: string[] = [] code.push( - `export { Select } from './${moduleNameSelect}.js'`, - `export { isError } from './${moduleNameError}.js'`, - `export { create } from './${moduleNameClient}.js'`, + `// We import the global module for good measure although it is not clear it is always needed.`, + `// It at least helps with Twoslash wherein without this import here Twoslash will not include the global module.`, + `// In real TypeScript projects it seems the global module is included automatically. But there could be certain tsconfig`, + `// setups where this still indeed does help.`, + `import './modules/Global.js'`, + ``, + `export { Select } from './modules/${moduleNameSelect}.js'`, + `export { isError } from './modules/${moduleNameError}.js'`, + `export { create } from './modules/${moduleNameClient}.js'`, ) return code.join(`\n`) diff --git a/src/layers/2_generator/code/global.ts b/src/layers/2_generator/code/global.ts index 9b4d2466..86f55c1d 100644 --- a/src/layers/2_generator/code/global.ts +++ b/src/layers/2_generator/code/global.ts @@ -1,5 +1,5 @@ import { createCodeGenerator } from '../createCodeGenerator.js' -import { moduleNameIndex } from './Index.js' +import { moduleNameIndex } from './SchemaIndex.js' export const { moduleName: moduleNameGlobal, generate: generateGlobal } = createCodeGenerator( `Global`, diff --git a/src/layers/2_generator/files.ts b/src/layers/2_generator/files.ts index e4c369cb..daf59a39 100644 --- a/src/layers/2_generator/files.ts +++ b/src/layers/2_generator/files.ts @@ -91,10 +91,15 @@ export const generateFiles = async (input: Input) => { }, }) + // todo clear directory before generating so that removed or renamed files are cleaned up. await fs.mkdir(outputDirPath, { recursive: true }) + await fs.mkdir(`${outputDirPath}/modules`, { recursive: true }) await Promise.all( codes.map((code) => { - return fs.writeFile(`${outputDirPath}/${code.moduleName}.ts`, code.code, { encoding: `utf8` }) + const isIndexModule = code.moduleName.match(/^_+$/) !== null + return fs.writeFile(`${outputDirPath}/${isIndexModule ? `` : `modules/`}${code.moduleName}.ts`, code.code, { + encoding: `utf8`, + }) }), ) } diff --git a/src/layers/2_generator/generateCode.ts b/src/layers/2_generator/generateCode.ts index 66bacfdc..c8784b91 100644 --- a/src/layers/2_generator/generateCode.ts +++ b/src/layers/2_generator/generateCode.ts @@ -9,9 +9,9 @@ import { generate__ } from './code/__.js' import { generateClient } from './code/Client.js' import { generateError } from './code/Error.js' import { generateGlobal } from './code/global.js' -import { generateIndex } from './code/Index.js' import { generateScalar } from './code/Scalar.js' import { generateSchemaBuildtime } from './code/SchemaBuildtime.js' +import { generateIndex } from './code/SchemaIndex.js' import { generateRuntimeSchema } from './code/SchemaRuntime.js' import { generateSelect } from './code/Select.js' diff --git a/website/content/examples/generated-arguments.md b/website/content/examples/generated-arguments.md index 174de3bb..d863d49a 100644 --- a/website/content/examples/generated-arguments.md +++ b/website/content/examples/generated-arguments.md @@ -6,7 +6,6 @@ aside: false ```ts twoslash -import './graffle/Global.js' // ---cut--- import { Graffle as SocialStudies } from './graffle/__.js' diff --git a/website/content/examples/transport-http-dynamic-headers.md b/website/content/examples/transport-http-dynamic-headers.md index 3f7d0941..03e8c231 100644 --- a/website/content/examples/transport-http-dynamic-headers.md +++ b/website/content/examples/transport-http-dynamic-headers.md @@ -41,7 +41,7 @@ await graffle.rawString({ document: `{ languages { code } }` }) headers: Headers { accept: 'application/graphql-response+json; charset=utf-8, application/json; charset=utf-8', 'content-type': 'application/json', - 'x-sent-at-time': '1725656299249' + 'x-sent-at-time': '1725665559439' }, signal: undefined, method: 'post', diff --git a/website/content/examples/transport-http-method-get.md b/website/content/examples/transport-http-method-get.md index b0e40ad1..1888bc8c 100644 --- a/website/content/examples/transport-http-method-get.md +++ b/website/content/examples/transport-http-method-get.md @@ -9,7 +9,6 @@ to be sent over HTTP GET method. Note write-kind operations (mutation) are still ```ts twoslash -import './pokemon/Global.js' // ---cut--- import { Pokemon } from './pokemon/__.js' diff --git a/website/content/guides/overview/getting-started-generated.md b/website/content/guides/overview/getting-started-generated.md index e3c37741..41bd0801 100644 --- a/website/content/guides/overview/getting-started-generated.md +++ b/website/content/guides/overview/getting-started-generated.md @@ -33,8 +33,6 @@ You will see a directory named `graffle` has been created in the current working Create a module, import the constructor, and create an instance. As you can see it is extremely minimal. Graffle even defaults the schema URL to what we used during gentime so we can omit it here. ```ts twoslash -import './graffle/Global.js' -// ---cut--- import { Graffle } from './graffle/__.js' const graffle = Graffle.create() @@ -45,10 +43,10 @@ const graffle = Graffle.create() Now you're ready to send a "document". Your generated client gives you a rich interface reflecting the shape of the schema. Not only does this give you type safety it simplifies the result type (but if you want that envelope back for any reason don't worry, its [just a config away](./todo)). ```ts twoslash -import './graffle/Global.js' import { Graffle } from './graffle/__.js' + const graffle = Graffle.create({ schema: 'abc' }) -// ---cut--- + const countries = await graffle.query.countries({ $: { filter: { diff --git a/website/content/guides/overview/getting-started-static.md b/website/content/guides/overview/getting-started-static.md index a017ab1d..4eb17ff1 100644 --- a/website/content/guides/overview/getting-started-static.md +++ b/website/content/guides/overview/getting-started-static.md @@ -9,7 +9,6 @@ pnpm add graffle ## Create Client ```ts twoslash -// @noErrors import { Graffle } from 'graffle' const graffle = Graffle.create({ @@ -20,7 +19,6 @@ const graffle = Graffle.create({ ## Send Document ```ts twoslash -// @noErrors import { Graffle } from 'graffle' const graffle = Graffle.create({ schema: 'https://countries.trevorblades.com/graphql', diff --git a/website/graffle/_.ts b/website/graffle/_.ts index 5e2498a3..0d3b8d17 100644 --- a/website/graffle/_.ts +++ b/website/graffle/_.ts @@ -1,3 +1,9 @@ -export { create } from './Client.js' -export { isError } from './Error.js' -export { Select } from './Select.js' +// We import the global module for good measure although it is not clear it is always needed. +// It at least helps with Twoslash wherein without this import here Twoslash will not include the global module. +// In real TypeScript projects it seems the global module is included automatically. But there could be certain tsconfig +// setups where this still indeed does help. +import './modules/Global.js' + +export { create } from './modules/Client.js' +export { isError } from './modules/Error.js' +export { Select } from './modules/Select.js' diff --git a/website/graffle/Client.ts b/website/graffle/modules/Client.ts similarity index 100% rename from website/graffle/Client.ts rename to website/graffle/modules/Client.ts diff --git a/website/pokemon/Error.ts b/website/graffle/modules/Error.ts similarity index 87% rename from website/pokemon/Error.ts rename to website/graffle/modules/Error.ts index 6a480e85..cd9eff6c 100644 --- a/website/pokemon/Error.ts +++ b/website/graffle/modules/Error.ts @@ -9,6 +9,6 @@ const ErrorObjectsTypeNameSelected = Object.values(ErrorObjectsTypeNameSelectedE type ErrorObjectsTypeNameSelected = (typeof ErrorObjectsTypeNameSelected)[number] export const isError = <$Value>(value: $Value): value is Include<$Value, ErrorObjectsTypeNameSelected> => { - return typeof value === 'object' && value !== null && '__typename' in value + return typeof value === `object` && value !== null && `__typename` in value && ErrorObjectsTypeNameSelected.some(_ => _.__typename === value.__typename) } diff --git a/website/graffle/Global.ts b/website/graffle/modules/Global.ts similarity index 89% rename from website/graffle/Global.ts rename to website/graffle/modules/Global.ts index b119bafa..ce1bb66e 100644 --- a/website/graffle/Global.ts +++ b/website/graffle/modules/Global.ts @@ -1,4 +1,4 @@ -import type { Index } from './Index.js' +import type { Index } from './SchemaIndex.js' declare global { export namespace GraffleGlobalTypes { diff --git a/website/graffle/Scalar.ts b/website/graffle/modules/Scalar.ts similarity index 100% rename from website/graffle/Scalar.ts rename to website/graffle/modules/Scalar.ts diff --git a/website/graffle/SchemaBuildtime.ts b/website/graffle/modules/SchemaBuildtime.ts similarity index 100% rename from website/graffle/SchemaBuildtime.ts rename to website/graffle/modules/SchemaBuildtime.ts diff --git a/website/graffle/Index.ts b/website/graffle/modules/SchemaIndex.ts similarity index 100% rename from website/graffle/Index.ts rename to website/graffle/modules/SchemaIndex.ts diff --git a/website/graffle/SchemaRuntime.ts b/website/graffle/modules/SchemaRuntime.ts similarity index 100% rename from website/graffle/SchemaRuntime.ts rename to website/graffle/modules/SchemaRuntime.ts diff --git a/website/graffle/Select.ts b/website/graffle/modules/Select.ts similarity index 93% rename from website/graffle/Select.ts rename to website/graffle/modules/Select.ts index 17f453dc..1c0fd0c9 100644 --- a/website/graffle/Select.ts +++ b/website/graffle/modules/Select.ts @@ -1,11 +1,11 @@ import type { ResultSet, SelectionSet } from 'graffle/schema' -import type { Index } from './Index.js' +import type { Index } from './SchemaIndex.js' // Runtime // ------- import { createSelect } from 'graffle/client' -export const Select = createSelect('default') +export const Select = createSelect(`default`) // Buildtime // --------- diff --git a/website/package.json b/website/package.json index 415720d7..657cfd1a 100644 --- a/website/package.json +++ b/website/package.json @@ -17,7 +17,7 @@ "es-toolkit": "^1.17.0", "floating-vue": "^5.2.2", "globby": "^14.0.2", - "graffle": "8.0.0-next.24", + "graffle": "link:..", "graphql": "^16.9.0", "tsx": "^4.19.0", "typescript": "^5.5.4" diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index 3e50d4f2..a75618fe 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -14,6 +14,12 @@ importers: '@shikijs/vitepress-twoslash': specifier: ^1.16.2 version: 1.16.2(typescript@5.5.4) + '@tsconfig/node20': + specifier: ^20.1.4 + version: 20.1.4 + '@tsconfig/strictest': + specifier: ^2.0.5 + version: 2.0.5 es-toolkit: specifier: ^1.17.0 version: 1.17.0 @@ -26,6 +32,9 @@ importers: graffle: specifier: link:.. version: link:.. + graphql: + specifier: ^16.9.0 + version: 16.9.0 tsx: specifier: ^4.19.0 version: 4.19.0 @@ -565,6 +574,12 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@tsconfig/node20@20.1.4': + resolution: {integrity: sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==} + + '@tsconfig/strictest@2.0.5': + resolution: {integrity: sha512-ec4tjL2Rr0pkZ5hww65c+EEPYwxOi4Ryv+0MtjeaSQRJyq322Q27eOQiFbuNgw2hpL4hB1/W/HBGk3VKS43osg==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -832,6 +847,10 @@ packages: resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} + graphql@16.9.0: + resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -1608,6 +1627,10 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} + '@tsconfig/node20@20.1.4': {} + + '@tsconfig/strictest@2.0.5': {} + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 @@ -1942,6 +1965,8 @@ snapshots: slash: 5.1.0 unicorn-magic: 0.1.0 + graphql@16.9.0: {} + he@1.2.0: {} hookable@5.5.3: {} diff --git a/website/pokemon/_.ts b/website/pokemon/_.ts index 5e2498a3..0d3b8d17 100644 --- a/website/pokemon/_.ts +++ b/website/pokemon/_.ts @@ -1,3 +1,9 @@ -export { create } from './Client.js' -export { isError } from './Error.js' -export { Select } from './Select.js' +// We import the global module for good measure although it is not clear it is always needed. +// It at least helps with Twoslash wherein without this import here Twoslash will not include the global module. +// In real TypeScript projects it seems the global module is included automatically. But there could be certain tsconfig +// setups where this still indeed does help. +import './modules/Global.js' + +export { create } from './modules/Client.js' +export { isError } from './modules/Error.js' +export { Select } from './modules/Select.js' diff --git a/website/pokemon/Client.ts b/website/pokemon/modules/Client.ts similarity index 100% rename from website/pokemon/Client.ts rename to website/pokemon/modules/Client.ts diff --git a/website/graffle/Error.ts b/website/pokemon/modules/Error.ts similarity index 87% rename from website/graffle/Error.ts rename to website/pokemon/modules/Error.ts index 6a480e85..cd9eff6c 100644 --- a/website/graffle/Error.ts +++ b/website/pokemon/modules/Error.ts @@ -9,6 +9,6 @@ const ErrorObjectsTypeNameSelected = Object.values(ErrorObjectsTypeNameSelectedE type ErrorObjectsTypeNameSelected = (typeof ErrorObjectsTypeNameSelected)[number] export const isError = <$Value>(value: $Value): value is Include<$Value, ErrorObjectsTypeNameSelected> => { - return typeof value === 'object' && value !== null && '__typename' in value + return typeof value === `object` && value !== null && `__typename` in value && ErrorObjectsTypeNameSelected.some(_ => _.__typename === value.__typename) } diff --git a/examples/$/generated-clients/pokemon/Global.ts b/website/pokemon/modules/Global.ts similarity index 86% rename from examples/$/generated-clients/pokemon/Global.ts rename to website/pokemon/modules/Global.ts index cca3730f..68fa19cd 100644 --- a/examples/$/generated-clients/pokemon/Global.ts +++ b/website/pokemon/modules/Global.ts @@ -1,4 +1,4 @@ -import type { Index } from './Index.js' +import type { Index } from './SchemaIndex.js' declare global { export namespace GraffleGlobalTypes { diff --git a/website/pokemon/Scalar.ts b/website/pokemon/modules/Scalar.ts similarity index 100% rename from website/pokemon/Scalar.ts rename to website/pokemon/modules/Scalar.ts diff --git a/website/pokemon/SchemaBuildtime.ts b/website/pokemon/modules/SchemaBuildtime.ts similarity index 100% rename from website/pokemon/SchemaBuildtime.ts rename to website/pokemon/modules/SchemaBuildtime.ts diff --git a/website/pokemon/Index.ts b/website/pokemon/modules/SchemaIndex.ts similarity index 100% rename from website/pokemon/Index.ts rename to website/pokemon/modules/SchemaIndex.ts diff --git a/website/pokemon/SchemaRuntime.ts b/website/pokemon/modules/SchemaRuntime.ts similarity index 100% rename from website/pokemon/SchemaRuntime.ts rename to website/pokemon/modules/SchemaRuntime.ts diff --git a/website/pokemon/Select.ts b/website/pokemon/modules/Select.ts similarity index 91% rename from website/pokemon/Select.ts rename to website/pokemon/modules/Select.ts index dc737482..100af870 100644 --- a/website/pokemon/Select.ts +++ b/website/pokemon/modules/Select.ts @@ -1,11 +1,11 @@ import type { ResultSet, SelectionSet } from 'graffle/schema' -import type { Index } from './Index.js' +import type { Index } from './SchemaIndex.js' // Runtime // ------- import { createSelect } from 'graffle/client' -export const Select = createSelect('default') +export const Select = createSelect(`default`) // Buildtime // ---------