diff --git a/examples/60_extension/extension_introspection__introspection.ts b/examples/60_extension/extension_introspection__introspection.ts index 9825e02c1..f953a0409 100644 --- a/examples/60_extension/extension_introspection__introspection.ts +++ b/examples/60_extension/extension_introspection__introspection.ts @@ -8,7 +8,7 @@ import { interceptAndShowUncaughtErrors, show } from '../$/show.js' interceptAndShowUncaughtErrors() -const pokemon = Graffle.create().use(Introspection()) +const pokemon = Graffle.create().use(Introspection) const data = await pokemon.introspect() show(data) diff --git a/package.json b/package.json index e9c0f6854..77f54e106 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "graffle", "description": "Simple GraphQL Client for JavaScript. Minimal. Extensible. Type Safe. Runs everywhere.", "version": "0.0.0-dripip", - "packageManager": "pnpm@9.15.3", + "packageManager": "pnpm@10.2.1", "type": "module", "bin": { "graffle": "./execute.sh" @@ -14,8 +14,8 @@ "./generator": { "default": "./build/entrypoints/generator.js" }, - "./extensionkit": { - "default": "./build/entrypoints/extensionkit.js" + "./extension": { + "default": "./build/entrypoints/extension.js" }, "./extensions/upload": { "default": "./build/entrypoints/extensions/upload/runtime.js" diff --git a/src/client/Configuration/ConfigInit.ts b/src/client/Configuration/ConfigInit.ts deleted file mode 100644 index f90d2c382..000000000 --- a/src/client/Configuration/ConfigInit.ts +++ /dev/null @@ -1,107 +0,0 @@ -import type { ConfigManager } from '../../lib/config-manager/__.js' -import type { GlobalRegistry } from '../../types/GlobalRegistry/GlobalRegistry.js' -import type { SchemaDrivenDataMap } from '../../types/SchemaDrivenDataMap/__.js' -import type { OutputChannel, OutputChannelConfig } from './Output.js' - -/** - * @remarks This input extends base with properties that can be filled with exports from the generated client. - */ -export type ConfigInit<$Client extends GlobalRegistry.Client = GlobalRegistry.Client> = { - /** - * TODO - */ - checkPreflight?: boolean - /** - * TODO - */ - output?: ConfigInitOutput - /** - * The generated client to use. - * - * @defaultValue 'default' - */ - name?: $Client['name'] - /** - * todo - */ - readonly schemaMap?: SchemaDrivenDataMap -} - -export type ConfigInitOutputEnvelopeLonghand = { - /** - * @defaultValue `true` - */ - enabled?: boolean - errors?: { - execution?: boolean - other?: boolean - } -} - -// dprint-ignore -export type ConfigInitOutput = - { - /** - * Defaults for certain aspects of output behavior. - */ - defaults?: { - /** - * The default error channel to use. - * - * @defaultValue `'throw'` - */ - errorChannel?: OutputChannel - } - /** - * @defaultValue `false` - */ - envelope?: boolean | ConfigInitOutputEnvelopeLonghand - /** - * Granular control of how to output errors by category. - */ - errors?: { - /** - * Execution errors. These are errors you would traditionally see in the GraphQL execution result `'errors'` field. - */ - execution?: OutputChannelConfig - /** - * Other errors include things like network errors thrown by fetch (when using HTTP transport), errors thrown from extensions, etc. - */ - other?: OutputChannelConfig - } - } - -// dprint-ignore -export type NormalizeConfigInit<$ConfigInit extends ConfigInit> = - ConfigInit extends $ConfigInit - ? {} - : { - [_ in keyof $ConfigInit]: - _ extends 'output' - ? NormalizeConfigInitOutput<$ConfigInit['output']> - : $ConfigInit[_] - } - -// dprint-ignore -type NormalizeConfigInitOutput<$Output extends ConfigInitOutput | undefined> = { - defaults: { - errorChannel: ConfigManager.GetAtPathOrDefault<$Output, ['defaults', 'errorChannel'], 'throw'> - } - envelope: { - enabled: - ConfigManager.GetOptional<$Output, ['envelope']> extends boolean ? ConfigManager.GetOptional<$Output, ['envelope']> - : ConfigManager.GetOptional<$Output, ['envelope','enabled']> extends boolean ? ConfigManager.GetOptional<$Output, ['envelope','enabled']> - : ConfigManager.GetOptional<$Output, ['envelope']> extends object ? true - : false - errors: { - execution: ConfigManager.GetAtPathOrDefault<$Output, ['envelope','errors','execution'], true> - other: ConfigManager.GetAtPathOrDefault<$Output, ['envelope','errors','other'], false> - schema: ConfigManager.GetAtPathOrDefault<$Output, ['envelope','errors','schema'], false> - } - } - errors: { - execution: ConfigManager.GetAtPathOrDefault<$Output,['errors', 'execution'], 'default'> - other: ConfigManager.GetAtPathOrDefault<$Output,['errors', 'other'], 'default'> - schema: ConfigManager.GetAtPathOrDefault<$Output,['errors', 'schema'], false> - } -} diff --git a/src/client/Configuration/Output.ts b/src/client/Configuration/Output.ts deleted file mode 100644 index 15980b236..000000000 --- a/src/client/Configuration/Output.ts +++ /dev/null @@ -1,88 +0,0 @@ -export type OutputChannel = 'throw' | 'return' - -export type OutputChannelConfig = 'throw' | 'return' | 'default' - -export type ErrorCategory = 'execution' | 'other' - -export const readErrorCategoryOutputChannel = ( - output: OutputConfig, - errorCategory: ErrorCategory, -): OutputChannel | false => { - if (output.errors[errorCategory] === `default`) { - return output.defaults.errorChannel - } - return output.errors[errorCategory] -} - -export const traditionalGraphqlOutput = { - defaults: { errorChannel: `throw` }, - envelope: { enabled: true, errors: { execution: true, other: false } }, - errors: { execution: `default`, other: `default` }, -} satisfies OutputConfig - -export const traditionalGraphqlOutputThrowing: OutputConfig = { - ...traditionalGraphqlOutput, - envelope: { - ...traditionalGraphqlOutput.envelope, - errors: { - ...traditionalGraphqlOutput.envelope.errors, - execution: false, - }, - }, -} - -export const isOutputTraditionalGraphQLOutput = (output: OutputConfig) => { - return output.envelope.enabled && output.envelope.errors.execution - && !output.envelope.errors.other -} - -export type OutputConfig = { - defaults: { - errorChannel: OutputChannel - } - envelope: { - enabled: boolean - errors: { - execution: boolean - other: boolean - } - } - errors: { - execution: OutputChannelConfig - other: OutputChannelConfig - } -} - -export const outputConfigDefault: OutputConfigDefault = { - defaults: { - errorChannel: `throw`, - }, - envelope: { - enabled: false, - errors: { - execution: true, - other: false, - }, - }, - errors: { - execution: `default`, - other: `default`, - }, -} - -export type OutputConfigDefault = { - defaults: { - errorChannel: 'throw' - } - envelope: { - enabled: false - errors: { - execution: true - other: false - } - } - errors: { - execution: 'default' - other: 'default' - } -} diff --git a/src/client/Configuration/client.create.config.output.test-d.ts b/src/client/Configuration/client.create.config.output.test-d.ts deleted file mode 100644 index c6f4664ed..000000000 --- a/src/client/Configuration/client.create.config.output.test-d.ts +++ /dev/null @@ -1,166 +0,0 @@ -/* eslint-disable */ -import { type ExecutionResult } from 'graphql' -import { describe } from 'node:test' -import { expectTypeOf, test } from 'vitest' -import { Graffle } from '../../../tests/_/schemas/kitchen-sink/graffle/__.js' -import { schema } from '../../../tests/_/schemas/kitchen-sink/schema.js' -import type { Anyware } from '../../lib/anyware/__.js' -import { assertEqual } from '../../lib/assert-equal.js' -import { type GraphQLExecutionResultError } from '../../lib/grafaid/graphql.js' - -const G = Graffle.create - -const defaultGraffle = Graffle.create({ checkPreflight: false }) - -describe('default is errors thrown, no envelope, no schema errors', async () => { - const graffle = G({ - checkPreflight: false, - output: { - defaults: { - errorChannel: 'throw', - }, - envelope: { - enabled: false, - errors: { - execution: true, - other: false, - }, - }, - errors: { - execution: 'default', - other: 'default', - }, - }, - }) - const result1 = await graffle.query.__typename() - const result2 = await defaultGraffle.query.__typename() - expectTypeOf(result1).toEqualTypeOf<'Query'>() - expectTypeOf(result2).toEqualTypeOf<'Query'>() -}) - -// dprint-ignore -describe('.envelope', () => { - type FieldMethodResultDisabled = 'Query' - type FieldMethodResultEnabled = ExecutionResult<{ __typename: FieldMethodResultDisabled }> - - // type ResultFieldMethodResultDisabled = { - // __typename: 'Object1' - // } | { - // __typename: 'ErrorOne' - // } | { - // __typename: 'ErrorTwo' - // } - // type ResultFieldMethodResultEnabled = ExecutionResult<{ resultNonNull: ResultFieldMethodResultDisabled }> - - // todo reference to Graffle client - // const fieldMethod = <$Graffle extends {query:{__typename:()=>Promise}}>(g: $Graffle) => g.query.__typename() - - describe('false disables it ', () => { - const g = G({ output: { envelope: false }, checkPreflight: false }) - - test('query.', () => { - expectTypeOf(g.query.__typename()).resolves.toEqualTypeOf() - }) - // test('query.', () => { - // expectTypeOf(g.query.resultNonNull(resultFieldSelect)).resolves.toEqualTypeOf() - // }) - test('query.$batch', async () => { - expectTypeOf(await g.query.$batch({ __typename: true, idNonNull: true })).toEqualTypeOf<{ __typename: 'Query'; idNonNull: string } | null>() - }) - }) - describe('true enables it', () => { - const g = Graffle.create({ output: { envelope: true }, checkPreflight: false }) - test('query.', () => { - expectTypeOf(g.query.__typename()).resolves.toMatchTypeOf() - }) - // test('query.', async () => { - // expectTypeOf((await g.query.resultNonNull(resultFieldSelect))).toMatchTypeOf() - // }) - test('query.$batch', () => { - const result = g.query.$batch({ __typename: true, idNonNull: true }) - assertEqual> - }) - }) - test('object enables it', async () => { - const graffle = Graffle.create({ output: { envelope: {} }, checkPreflight: false }) - expectTypeOf(await graffle.query.__typename()).toMatchTypeOf() - }) - describe('.enabled', () => { - test('false disables it', async () => { - const graffle = Graffle.create({ output: { envelope: { enabled: false } }, checkPreflight: false }) - expectTypeOf(await graffle.query.__typename()).toEqualTypeOf() - }) - test('true enables it', async () => { - const graffle = Graffle.create({ output: { envelope: { enabled: true } }, checkPreflight: false }) - expectTypeOf(await graffle.query.__typename()).toMatchTypeOf() - }) - }) - describe('with defaults.errorChannel: "return"', () => { - describe('.errors', () => { - test('defaults to execution errors in envelope', () => { - const g = G({ output: { defaults: { errorChannel: 'return' }, envelope: true }, checkPreflight: false }) - expectTypeOf(g.query.__typename()).resolves.toMatchTypeOf | Anyware.ResultFailure>() - }) - test('.execution:false restores errors to return', async () => { - const g = G({ - output: { defaults: { errorChannel: 'return' }, envelope: { errors: { execution: false } } }, - checkPreflight: false, - }) - expectTypeOf(await g.query.__typename()).toEqualTypeOf< - Omit, 'errors'> | Anyware.ResultFailure | GraphQLExecutionResultError - >() - }) - test('.other:true raises them to envelope', () => { - const g = G({ - output: { defaults: { errorChannel: 'return' }, envelope: { errors: { other: true } } }, - checkPreflight: false, - }) - expectTypeOf(g.query.__typename()).resolves.toMatchTypeOf>() - }) - }) - }) - test('with no errors included, then there are no error fields in the envelope', async () => { - const g = G({ - // todo allow this shorthand - // output: { envelope: false }, - output: { envelope: { errors: { execution:false, other:false } } }, - checkPreflight: false, - }) - const result = await g.query.__typename() - expectTypeOf().toEqualTypeOf<'data'|'extensions'> // no errors - }) -}) - -describe('defaults.errorChannel: "return"', () => { - describe('puts errors into return type', () => { - const g = G({ output: { defaults: { errorChannel: 'return' } }, checkPreflight: false }) - test('query.', async () => { - expectTypeOf(await g.query.__typename()).toEqualTypeOf< - 'Query' | Anyware.ResultFailure | GraphQLExecutionResultError - >() - }) - }) - describe('with .errors', () => { - test('.execution: throw', async () => { - const g = G({ - output: { defaults: { errorChannel: 'return' }, errors: { execution: 'throw' } }, - checkPreflight: false, - }) - expectTypeOf(await g.query.__typename()).toEqualTypeOf<'Query' | Anyware.ResultFailure>() - }) - test('.other: throw', async () => { - const g = G({ - output: { defaults: { errorChannel: 'return' }, errors: { other: 'throw' } }, - checkPreflight: false, - }) - expectTypeOf(await g.query.__typename()).toEqualTypeOf<'Query' | GraphQLExecutionResultError>() - }) - test('.*: throw', async () => { - const g = G({ - output: { defaults: { errorChannel: 'return' }, errors: { other: 'throw', execution: 'throw' } }, - checkPreflight: false, - }) - expectTypeOf(await g.query.__typename()).toEqualTypeOf<'Query'>() - }) - }) -}) diff --git a/src/client/Configuration/client.input.test-d.ts b/src/client/Configuration/client.input.test-d.ts deleted file mode 100644 index 337a29441..000000000 --- a/src/client/Configuration/client.input.test-d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { test } from 'vitest' -import { Graffle } from '../../../tests/_/schemas/kitchen-sink/graffle/__.js' -import { QueryOnly } from '../../../tests/_/schemas/query-only/graffle/__.js' - -test(`works`, () => { - Graffle.create({ output: { errors: { execution: `throw` } } }) - // @ts-expect-error schema error config not available. - QueryOnly.create({ name: `QueryOnly`, output: { errors: { schema: `throw` } } }) -}) diff --git a/src/client/client.test.ts b/src/client/client.test.ts new file mode 100644 index 000000000..c195541ef --- /dev/null +++ b/src/client/client.test.ts @@ -0,0 +1,27 @@ +import { expect, expectTypeOf, test } from 'vitest' +import { Context } from '../types/context.js' +import { create } from './client.js' + +test(`created WITHOUT configuration uses the default configuration`, () => { + const g = create() + expect(g._).toBe(Context.States.empty) + expect(g._.configuration.check.current.preflight).toBe(true) + // Trying to type-test the entire context crashes the TS LSP. + // We check just one property and assume the rest are ok too. + expectTypeOf(g._.configuration).toMatchTypeOf() + expectTypeOf(g._.configuration.check.current.preflight).toEqualTypeOf() + // TODO: investigate why we cannot use the strict "toEqualTypeOf". According to the following it should work. Make an issue on Vitest? + // let a = null as any as Context.States.Empty['configurationIndex'] + // let b = g._.configurationIndex + // a = b + // b = a +}) + +test(`created WITH configuration changes the configuration`, () => { + const g = create({ check: { preflight: false } }) + expect(g._.configuration.check.current.preflight).toBe(false) + expectTypeOf(g._.configuration.check.current.preflight).toEqualTypeOf() + // Did NOT mutate the original context + expect(g._).not.toBe(Context.States.empty) + expect(Context.States.empty.configuration.check.current.preflight).toBe(true) +}) diff --git a/src/client/client.ts b/src/client/client.ts index 7cd24db8c..5610229ec 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -1,74 +1,76 @@ -import type { Extension } from '../extension/__.js' -import type { Anyware } from '../lib/anyware/__.js' +import { Anyware } from '../lib/anyware/_namespace.js' +import { getOperationType } from '../lib/grafaid/document.js' import type { TypeFunction } from '../lib/type-function/__.js' -import { type ClientTransports, Context } from '../types/context.js' -import { type ConfigInit, type NormalizeConfigInit } from './Configuration/ConfigInit.js' -import { anywareProperties } from './properties/anyware.js' -import { type gqlOverload, gqlProperties } from './properties/gql/gql.js' -import { type ScalarMethod, scalarProperties, type TypeErrorMissingSchemaMap } from './properties/scalar.js' -import { type TransportMethod, transportProperties } from './properties/transport.js' -import { type UseMethod, useProperties } from './properties/use.js' -import { withProperties } from './properties/with.js' +import type { RequestPipeline } from '../requestPipeline/RequestPipeline.js' +import { Context, type ContextFragment, contextMergeFragment } from '../types/context.js' +import { Configuration } from './properties/configuration/__.js' +import { Extensions } from './properties/extensions/__.js' +import { Output } from './properties/output/_namespace.js' +import { Properties } from './properties/properties/__.js' +import { GqlMethod } from './properties/request/request.js' +import { SendMethod } from './properties/request/send.js' +import { RequestInterceptors } from './properties/requestInterceptors/__.js' +import { Scalars } from './properties/scalars/__.js' +import { Transports } from './properties/transports/__.js' -export type ClientEmpty = Client +export type ClientEmpty = Client -export type ClientGeneric = Client +export interface Client_justContext { + _: Context +} export type Client< - $Context extends Context, // = Context, - $Extension extends object, // = object, -> = - & ClientBase<$Context, $Extension> - & $Extension - & Extension.ApplyAndMergeBuilderExtensions<$Context['extensions'], $Context> - -export interface ClientBase< - $Context extends Context, - out $Extension extends object, -> // out $ExtensionChainable extends ExtensionChainableRegistry, -{ + $Context extends Context = Context, + __ = + & ClientBase<$Context> + & $Context['properties']['static'] + & Properties.RunPropertiesComputers<$Context>, +> = __ + +export interface ClientBase<$Context extends Context> { _: $Context - // _extension: $Extension - // _extensionChainable: $ExtensionChainable - // extendWithPropertiesChainable: < - // extensionChainable extends ExtensionChainable, - // >() => Client<$Context, $Extension, $ExtensionChainable & { [_ in extensionChainable['name']]: extensionChainable }> - // extendWithProperties: < - // extension extends {}, - // >(extension: extension) => Client<$Context, $Extension & extension, $ExtensionChainable> - gql: ClientTransports.PreflightCheck< + /** + * TODO + */ + gql: Configuration.Check.Preflight< $Context, - gqlOverload<$Context> + GqlMethod<$Context> > - scalar: null extends $Context['schemaMap'] ? TypeErrorMissingSchemaMap - : ScalarMethod< - $Context, - $Extension - > - transport: TransportMethod< - $Context, - $Extension - > - use: UseMethod< - $Context, - $Extension - > // $ExtensionChainable + /** + * TODO + */ + scalar: undefined extends $Context['configuration']['schema']['current']['map'] + ? Scalars.Method.TypeErrorMissingSchemaMap + : Scalars.Method<$Context> + /** + * TODO + */ + transport: Transports.TransportMethod<$Context> + /** + * TODO + */ + properties: Properties.AddPropertiesMethod<$Context> + /** + * TODO + */ + use: Extensions.MethodAdd<$Context> + /** + * TODO + */ anyware: ( interceptor: Anyware.Interceptor.InferFromPipeline< Anyware.Pipeline.InferFromDefinition<$Context['requestPipelineDefinition']> >, - ) => Client<$Context, $Extension> - with: <$ConfigInit extends ConfigInit>( - configInit: $ConfigInit, - ) => Client< - // @ts-expect-error - { - [_ in keyof $Context]: _ extends keyof NormalizeConfigInit<$Context['input'] & $ConfigInit> - ? NormalizeConfigInit<$Context['input'] & $ConfigInit>[_] - : $Context[_] - }, - $Extension - > // $ExtensionChainable + ) => Client<$Context> + /** + * TODO + */ + with: < + const configurationInput extends CalcConfigurationInputForContext<$Context>, + >(configurationInput: configurationInput) => Client< + // @ts-expect-error Non-index type being used + Configuration.ContextFragmentConfigurationConfigure<$Context, configurationInput> + > } export type ExtensionChainableRegistry = { @@ -79,60 +81,167 @@ export interface ExtensionChainable extends TypeFunction {} export type ExtensionChainableArguments = [Context, object, ExtensionChainableRegistry] +// Almost identical to `with` except that input is optional. +export type Create<$Context extends Context = Context.States.Empty> = < + const configurationInput extends CalcConfigurationInputForContext<$Context>, +>(configurationInput?: configurationInput) => Client< + // @ts-expect-error: Is missing standard configurators + Configuration.ContextFragmentConfigurationConfigure<$Context, configurationInput> +> + export const createConstructorWithContext = <$Context extends Context>( context: $Context, -): ClientConstructor<$Context> => { - return (configInit) => { - const newContext = Context.updateContextConfigInit(context, configInit ?? {}) - const client = createWithContext(newContext) - return client - } +): Create<$Context> => +(configurationInput) => { + const configurationInput_ = configurationInput as undefined | Configuration.ConfigurationIndex.Input + const newContext = configurationInput_ + ? contextMergeFragment( + context, + Configuration.configure(context, configurationInput_), + ) + : context + return createWithContext(newContext) as any } -export type ClientConstructor<$Context extends Context = Context.States.Empty> = < - const $ConfigInit extends ConfigInit, ->( - configInit?: $ConfigInit, -) => Client< - // @ts-expect-error - { - [k in keyof $Context]: k extends keyof NormalizeConfigInit<$ConfigInit> ? NormalizeConfigInit<$ConfigInit>[k] - : $Context[k] - }, - {} -> // {} - -export const create: ClientConstructor = (configInit) => { - const initialContext = Context.updateContextConfigInit( - Context.States.empty, - configInit ?? {}, - ) - return createWithContext(initialContext) -} +export const create: Create = createConstructorWithContext(Context.States.empty) + +export const createWithContext = <$Context extends Context>( + context: $Context, +): Client<$Context> => { + const copy = (fragment: null | ContextFragment) => { + if (!fragment) return client + const newContext = contextMergeFragment(context, fragment) + // if (newContext === context) return client // todo is needed? + return createWithContext(newContext) as any + } -export const createWithContext = ( - context: Context, -) => { - // @ts-expect-error ignoreme - const clientDirect: Client = { + const client: Client<$Context> = { + ...({} as Client<$Context>), _: context, - ...withProperties(createWithContext, context), - ...transportProperties(createWithContext, context), - ...gqlProperties(createWithContext, context), - ...useProperties(createWithContext, context), - ...anywareProperties(createWithContext, context), - ...scalarProperties(createWithContext, context), + anyware(interceptor) { + const interceptor_ = interceptor as any as RequestPipeline.BaseInterceptor + return copy(RequestInterceptors.contextFragmentRequestInterceptorsAdd(context, interceptor_)) + }, + properties(properties) { + const isComputed = typeof properties === `function` + const static_ = !isComputed + ? properties + : undefined + const computed = isComputed + ? [properties] + : undefined + return copy(Properties.contextFragmentPropertiesAdd(context, { static: static_, computed: computed as any })) + }, + use(extension) { + return copy(Extensions.contextFragmentExtensionsAdd(context, extension)) + }, + scalar: ((...args: Scalars.Method.Arguments) => { + const scalar = Scalars.Method.normalizeArguments(args) + return copy(Scalars.contextScalarsAdd(context, scalar)) + }) as any, + with(configurationInput) { + const configurationInput_ = configurationInput as Configuration.ConfigurationIndex.Input + return copy(Configuration.configure(context, configurationInput_)) + }, + transport: ((...args: Transports.TransportMethod.Arguments) => { + const input = Transports.TransportMethod.normalizeArguments(args) + // let fragment2: ContextFragmentTransports + switch (input[0]) { + case Transports.TransportMethod.overloadCase.configureCurrent: { + return copy(Transports.contextFragmentConfigureCurrent(context, input[1])) + } + case Transports.TransportMethod.overloadCase.setCurrent: { + return copy(Transports.contextFragmentSetCurrent(context, input[1], input[2])) + } + case Transports.TransportMethod.overloadCase.addType: { + return copy(Transports.contextFragmentAdd(context, input[1])) + } + } + }) as any, + gql: ((...args: GqlMethod.Arguments) => { + const { document: query } = GqlMethod.normalizeArguments(args) + + return { + send: async (...args: SendMethod.Arguments) => { + if (!context.transports.current) throw new Error(`No transport selected`) + + const { operationName, variables } = SendMethod.normalizeArguments(args) + const request = { + query, + variables, + operationName, + } + const operationType = getOperationType(request) + if (!operationType) throw new Error(`Could not get operation type`) + + const analyzedRequest = { + operation: operationType, + query, + variables, + operationName, + } + + const initialInput = { + [context.transports.registry[context.transports.current]!.discriminant[`name`]]: + context.transports.registry[context.transports.current]!.discriminant[`value`], + [context.transports.registry[context.transports.current]!.configurationMount]: + context.transports.configurations[context.transports.current], + state: context, + request: analyzedRequest, + } as RequestPipeline.Base['input'] + + const requestPipeline = Anyware.Pipeline.create(context.requestPipelineDefinition) + const result = await Anyware.PipelineDefinition.run(requestPipeline, { + initialInput, + interceptors: context.requestPipelineInterceptors, + }) + + return Output.handle(context, result) + }, + } + }) as any, } - context.extensions.forEach(_ => { + Object.assign(client, context.properties.static) + + context.properties.computed.forEach(propertiesComputer => { Object.assign( - clientDirect, - _.builder?.({ - client: clientDirect, + client, + propertiesComputer({ + configuration: context.configuration, context, - }) ?? {}, + client: client as any, + }), ) }) - return clientDirect + // todo: access computed properties from context + context.extensions.forEach(_ => { + // const configurationIndex = context.configuration as ConfigurationIndex + // const configurationIndexEntry = configurationIndex[_.name] + // if (!configurationIndexEntry && _.configurator) throw new Error(`Configuration entry for ${_.name} not found`) + + _ + const propertiesComputed = _.propertiesComputed.reduce((acc, propertiesComputer) => { + return { + ...acc, + ...propertiesComputer({ + // configuration: configurationIndexEntry?.current, + configuration: context.configuration, + client: client as any, + context, + }), + } + }, {}) + + Object.assign(client, propertiesComputed) + }) + + return client +} + +export type CalcConfigurationInputForContext<$Context extends Context> = { + readonly [_ in keyof $Context['configuration']]?: + // @ts-expect-error Non-index type being used + $Context['configuration'][_]['configurator']['input'] } diff --git a/src/client/helpers.ts b/src/client/helpers.ts deleted file mode 100644 index b39d42014..000000000 --- a/src/client/helpers.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { PartialOrUndefined } from '../lib/prelude.js' -import type { Context } from '../types/context.js' -import type { ClientGeneric } from './client.js' - -export const createProperties = ( - callback: ( - clientConstructor: (context: Context) => ClientGeneric, - context: Context, - ) => PartialOrUndefined, -) => { - return callback -} diff --git a/src/client/properties/anyware.ts b/src/client/properties/anyware.ts deleted file mode 100644 index c1a7099c3..000000000 --- a/src/client/properties/anyware.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { create } from '../../extension/extension.js' -import { createProperties } from '../helpers.js' - -export const anywareProperties = createProperties((builder, context) => { - return { - anyware: (interceptor) => { - return builder({ - ...context, - extensions: [ - ...context.extensions, - create({ - name: `InlineAnyware`, - create: () => ({ onRequest: interceptor }), - })(), - ], - }) - }, - } -}) diff --git a/src/client/properties/check/__.ts b/src/client/properties/check/__.ts new file mode 100644 index 000000000..0845ce28d --- /dev/null +++ b/src/client/properties/check/__.ts @@ -0,0 +1 @@ +export * as Check from './configuration.js' diff --git a/src/client/properties/check/check.ts b/src/client/properties/check/check.ts new file mode 100644 index 000000000..36026a25c --- /dev/null +++ b/src/client/properties/check/check.ts @@ -0,0 +1 @@ +export * from './configuration.js' diff --git a/src/client/properties/check/configuration.ts b/src/client/properties/check/configuration.ts new file mode 100644 index 000000000..91a3285e9 --- /dev/null +++ b/src/client/properties/check/configuration.ts @@ -0,0 +1,62 @@ +import { Configurator as C } from '../../../lib/configurator/configurator.js' +import type { Transports } from '../transports/__.js' + +/** + * @remarks This input extends base with properties that can be filled with exports from the generated client. + */ +export type Input = { + /** + * If enabled, this will cause request methods to be statically unavailable if + * a transport is not correctly configured. + * + * @defaultValue `true` + */ + preflight?: boolean +} + +export const configurator = C() + .input() + .default({ + preflight: true, + }) + .return() + +export type Configurator = typeof configurator + +// dprint-ignore +export type Preflight< + $Context, + $SuccessValue = true, +> = + // @ts-expect-error context constraint missing to avoid TS compare depth limit + $Context['configuration']['check']['current']['preflight'] extends false + ? $SuccessValue + // @ts-expect-error context constraint missing to avoid TS compare depth limit + : Preflight_<$Context['transports'], $SuccessValue> + +// dprint-ignore +export type Preflight_< + $Transports extends Transports.ContextFragment['transports'], + $SuccessValue = true, +> = + $Transports extends Transports.ContextFragmentTransportsEmpty['transports'] + ? Errors.PreflightCheckNoTransportsRegistered + : $Transports['current'] extends string + ? $Transports['current'] extends keyof $Transports['configurations'] + ? $Transports['current'] extends keyof $Transports['registry'] + ? $Transports['configurations'][$Transports['current']] extends $Transports['registry'][$Transports['current']]['configurator']['normalized'] + ? $SuccessValue + : Errors.PreflightCheckTransportNotReady<$Transports['current']> + : never // Should never happen + : never // Should never happen + : Errors.PreflightCheckNoTransportSelected + +export namespace Errors { + export type PreflightCheckNoTransportsRegistered = 'Error: You cannot send requests yet. You must setup a transport.' + + export type PreflightCheckNoTransportSelected = + 'Error: You cannot send requests yet. You must select a transport to use.' + + export type PreflightCheckTransportNotReady<$TransportName extends string> = + `Error: You cannot send requests yet. The selected transport "${$TransportName}" is not sufficiently configured.` +} diff --git a/src/client/properties/configuration/__.ts b/src/client/properties/configuration/__.ts new file mode 100644 index 000000000..3944cee82 --- /dev/null +++ b/src/client/properties/configuration/__.ts @@ -0,0 +1 @@ +export * as Configuration from './configuration.js' diff --git a/src/client/properties/configuration/configuration.test.ts b/src/client/properties/configuration/configuration.test.ts new file mode 100644 index 000000000..4d8177903 --- /dev/null +++ b/src/client/properties/configuration/configuration.test.ts @@ -0,0 +1,72 @@ +import { expect, expectTypeOf, test } from 'vitest' +import { create } from '../../client.js' + +const g1 = create() + +test(`given empty input, just returns current client`, () => { + const g2 = g1.with({}) + expect(g2).toBe(g1) + expectTypeOf(g2._.configuration).toMatchTypeOf(g1._.configuration) +}) + +test(`given undefined for a configuration, same as not given.`, () => { + const g2 = g1.with({ check: undefined }) + expect(g2).toBe(g1) + expectTypeOf(g2._.configuration).toMatchTypeOf(g1._.configuration) +}) + +test(`given one configuration input, updates just that configuration`, () => { + const g2 = g1.with({ check: { preflight: false } }) + expect(g2).not.toBe(g1) + expect(g2._.configuration.check.current.preflight).toBe(false) + expectTypeOf(g2._.configuration[`check`][`current`][`preflight`]).toEqualTypeOf() + // Untouched configurations are passed through + expect(g2._.configuration.output).toBe(g1._.configuration.output) + expect(g2._.configuration.schema).toBe(g1._.configuration.schema) + // Previous client is not mutated + expect(g1._).not.toBe(g2._) + expect(g1._.configuration.check.current.preflight).toBe(true) +}) + +// test(`can update preflight check`, () => { +// const g1 = GraffleBare.create() +// expectTypeOf(g1.gql).toBeString() +// const g2 = g1.with({ checkPreflight: false }) +// expectTypeOf(g2.gql).toBeFunction() +// }) + +// test(`can deeply update output`, () => { +// const g1 = Graffle.create() +// expect(g1._.output).toMatchObject({ +// errors: { execution: `default`, other: `default` }, +// defaults: { errorChannel: `throw` }, +// }) + +// const g2 = g1.with({ output: { defaults: { errorChannel: `return` } } }) +// expect(g2._.output).toMatchObject({ +// errors: { execution: `default`, other: `default` }, +// defaults: { errorChannel: `return` }, +// }) + +// const g3 = g2.with({ output: { errors: { execution: `throw` } } }) +// expect(g3._.output).toMatchObject({ +// errors: { execution: `throw`, other: `default` }, +// defaults: { errorChannel: `return` }, +// }) +// }) + +// test(`can update schema map`, () => { +// const g1 = GraffleBare.create() +// expect(g1._.schemaMap).toBeNull() + +// const g2 = g1.with({ schemaMap: Graffle.schemaMap }) +// expect(g2._.schemaMap).toBe(Graffle.schemaMap) +// // Did not mutate +// expect(g1._.schemaMap).toBeNull() + +// const different = {} as any +// const g3 = g2.with({ schemaMap: different }) +// expect(g3._.schemaMap).toBe(different) +// // Did not mutate +// expect(g2._.schemaMap).toBe(Graffle.schemaMap) +// }) diff --git a/src/client/properties/configuration/configuration.ts b/src/client/properties/configuration/configuration.ts new file mode 100644 index 000000000..e1de92662 --- /dev/null +++ b/src/client/properties/configuration/configuration.ts @@ -0,0 +1,126 @@ +import type { Configurator } from '../../../lib/configurator/configurator.js' +import { hasNonUndefinedKeys, type Writeable } from '../../../lib/prelude.js' +import type { Context } from '../../../types/context.js' +import { Output } from '../output/_namespace.js' +import { Schema } from '../schema/__.js' +import { Check } from './configuration.js' + +export * as Check from '../check/configuration.js' + +export const configure = < + context extends Context, + configurationInput extends ConfigurationIndex.Input, +>(context: context, configurationInput: configurationInput): null | Writeable => { + if (!hasNonUndefinedKeys(configurationInput)) return null + // todo: performant checking if input changes configuration. If no change, then no copy context. + // For default input resolvers we can do this automatically (shallow merge) + // Any custom input resolvers would need to implement their own "is changed" logic. + + const configuration: Writeable = { + ...context.configuration, + } + + for (const configuratorName in configurationInput) { + const entry = configuration[configuratorName] + const current = entry.configurator.inputResolver({ + current: entry.current, + input: configurationInput[configuratorName]!, + }) + const newEntry = Object.freeze({ + ...entry, + current, + }) + configuration[configuratorName] = newEntry + } + + const fragment = { + configuration, + } + + return fragment +} + +export type ContextFragmentConfigurationConfigure< + $Context extends Context, + $ConfigurationInput extends ConfigurationIndex.Input, + __ = { + [_ in keyof $Context]: _ extends 'configuration' ? { + readonly [_ in keyof $Context['configuration']]: _ extends keyof $ConfigurationInput + ? $ConfigurationInput[_] extends object ? { + // @ts-expect-error Non-index type being used + configurator: $Context['configuration'][_]['configurator'] + current: Configurator.ApplyInputResolver$Func< + // @ts-expect-error Non-index type being used + $Context['configuration'][_]['configurator'], + // @ts-expect-error Non-index type being used + $Context['configuration'][_]['current'], + $ConfigurationInput[_] + > + } + : $Context['configuration'][_] + : $Context['configuration'][_] + } + : $Context[_] + }, +> = __ + +// ------------------------------------------------------------ +// Context Fragment +// ------------------------------------------------------------ + +export interface ConfigurationNamespace<$Configurator extends Configurator> { + readonly configurator: $Configurator + readonly current: $Configurator['normalizedIncremental'] +} + +export interface ConfigurationNamespaceEmpty<$Configurator extends Configurator> { + readonly configurator: $Configurator + readonly current: $Configurator['default'] +} + +export interface ContextFragmentConfiguration { + readonly configuration: { + readonly output: ConfigurationNamespace + readonly check: ConfigurationNamespace + readonly schema: ConfigurationNamespace + } +} + +export interface ContextFragmentConfigurationEmpty extends ContextFragmentConfiguration { + readonly configuration: { + readonly output: ConfigurationNamespaceEmpty + readonly check: ConfigurationNamespaceEmpty + readonly schema: ConfigurationNamespaceEmpty + } +} + +export const contextFragmentConfigurationEmpty: ContextFragmentConfigurationEmpty = { + configuration: Object.freeze({ + output: Object.freeze({ + configurator: Output.configurator, + current: Output.configurator.default, + }), + check: Object.freeze({ + configurator: Check.configurator, + current: Check.configurator.default, + }), + schema: Object.freeze({ + configurator: Schema.configurator, + current: Schema.configurator.default, + }), + }), +} + +// ------------------------------------------------------------ +// Generic Context Fragment +// ------------------------------------------------------------ + +export interface ConfigurationIndex { + readonly [configuratorName: string]: ConfigurationNamespace +} + +export namespace ConfigurationIndex { + export interface Input { + readonly [configuratorName: string]: Configurator.Configuration | undefined + } +} diff --git a/src/client/properties/extensions/__.ts b/src/client/properties/extensions/__.ts new file mode 100644 index 000000000..ddb45f859 --- /dev/null +++ b/src/client/properties/extensions/__.ts @@ -0,0 +1 @@ +export * as Extensions from './extensions.js' diff --git a/src/client/properties/extensions/dataType/DependentExtensionParameters.ts b/src/client/properties/extensions/dataType/DependentExtensionParameters.ts new file mode 100644 index 000000000..186c526f7 --- /dev/null +++ b/src/client/properties/extensions/dataType/DependentExtensionParameters.ts @@ -0,0 +1,12 @@ +import type { Configurator } from '../../../../lib/configurator/configurator.js' +import type { Context } from '../../../../types/context.js' +import type { Client } from '../../../client.js' + +export interface DependentExtensionParameters< + $Context extends Context = Context, + $Configuration extends Configurator.Configuration | undefined = Configurator.Configuration | undefined, +> { + configuration: $Configuration + context: $Context + client: Client<$Context> +} diff --git a/src/client/properties/extensions/dataType/_exports.ts b/src/client/properties/extensions/dataType/_exports.ts new file mode 100644 index 000000000..d0f7131a0 --- /dev/null +++ b/src/client/properties/extensions/dataType/_exports.ts @@ -0,0 +1,2 @@ +export * from './builder.js' +export * from './data.js' diff --git a/src/client/properties/extensions/dataType/_namespace.ts b/src/client/properties/extensions/dataType/_namespace.ts new file mode 100644 index 000000000..79d027cb8 --- /dev/null +++ b/src/client/properties/extensions/dataType/_namespace.ts @@ -0,0 +1 @@ +export * as Extension from './_exports.js' diff --git a/src/client/properties/extensions/dataType/builder.test.ts b/src/client/properties/extensions/dataType/builder.test.ts new file mode 100644 index 000000000..a2eeac2ce --- /dev/null +++ b/src/client/properties/extensions/dataType/builder.test.ts @@ -0,0 +1,93 @@ +import { describe, expect, expectTypeOf, test } from 'vitest' +import { assertExtends } from '../../../../lib/assert-equal.js' +import { Configurator } from '../../../../lib/configurator/configurator.js' +import type { Context } from '../../../../types/context.js' +import { type Chain, create } from './builder.js' +import type { Data, DataEmpty } from './data.js' + +const configuratorEmpty = Configurator().return() +type configuratorEmpty = typeof configuratorEmpty + +const configuratorAsymmetric = Configurator().input<{ a?: number }>().default({ a: 1 }).return() +type configuratorAsymmetric = typeof configuratorAsymmetric + +const aName = `a` +type aName = typeof aName +const a$ = create(aName) + +describe(`creator`, () => { + test(`creates a chain`, () => { + const chain = create(`a`) + expect(chain).toBeDefined() + expectTypeOf(chain).toEqualTypeOf>>() + }) +}) + +describe(`chain`, () => { + test(`returns data if no configurator given`, () => { + const data = a$.return() + type dataExpected = DataEmpty + expect(data).toMatchInlineSnapshot(` + { + "name": "a", + "propertiesComputed": [], + "propertiesStatic": {}, + "static": {}, + } + `) + expectTypeOf(data).toEqualTypeOf() + }) +}) + +describe(`creator`, () => { + test(`returned if chain given configurator`, () => { + type dataExpected = Data + type creatorExpected = (parameters: {}) => dataExpected + + const creator = a$.configurator(configuratorEmpty).return() + expect(creator).toBeTypeOf(`function`) + expectTypeOf(creator).toMatchTypeOf() + }) + + test(`input optional if configurator has no required properties`, () => { + const A = a$.configurator(configuratorEmpty).return() + + type expectedCreator = (configuration?: {} | undefined) => Data + const a = A() + expect(a).toMatchInlineSnapshot(` + { + "configurator": { + "default": {}, + "inputResolver": [Function], + }, + "name": "a", + "propertiesComputed": [], + "propertiesStatic": {}, + "static": {}, + } + `) + assertExtends() + // rejects, why? + // expectTypeOf().toMatchTypeOf() + }) + + test(`no input -> returns same data reference`, () => { + const A = a$.configurator(configuratorEmpty).return() + expect(A()).toBe(A()) + expect(A({})).not.toBe(A()) + }) + + test(`input -> returns with initial input`, () => { + const A = a$.configurator(configuratorAsymmetric).return() + + const a = A() + expect(a.configuratorInitialInput).toBe(undefined) + expectTypeOf(a.configuratorInitialInput).toEqualTypeOf() + + const configuration = {} + type configuration = typeof configuration + const a2 = A(configuration) + expect(a2.configuratorInitialInput).toBe(configuration) + expectTypeOf(a2.configuratorInitialInput).toEqualTypeOf() + }) +}) diff --git a/src/client/properties/extensions/dataType/builder.ts b/src/client/properties/extensions/dataType/builder.ts new file mode 100644 index 000000000..90c4cb768 --- /dev/null +++ b/src/client/properties/extensions/dataType/builder.ts @@ -0,0 +1,198 @@ +import type { WritableDeep } from 'type-fest' +import { Configurator } from '../../../../lib/configurator/configurator.js' +import { createMutableBuilder } from '../../../../lib/mutableBuilder.js' +import { __, type ObjectMergeShallow } from '../../../../lib/prelude.js' +import type { RequestPipeline } from '../../../../requestPipeline/__.js' +import type { Context } from '../../../../types/context.js' +import type { Configuration } from '../../configuration/__.js' +import type { Properties } from '../../properties/__.js' +import { Transport } from '../../transports/dataType.js' +import { type Data, type DataEmpty, dataPropertiesTypeOnly } from './data.js' +import type { DependentExtensionParameters } from './DependentExtensionParameters.js' +import type * as _re_export from './properties.js' + +// ------------------------------------------------------------ +// Creator +// ------------------------------------------------------------ + +export const create: Create = (name) => { + const data: WritableDeep = { + name, + static: {}, + propertiesStatic: {}, + propertiesComputed: [], + ...dataPropertiesTypeOnly, + } + + return createMutableBuilder({ + data, + builder: { + static(properties) { + data.static = properties + }, + transport(transportTypeInput: Transport | Transport.Builder) { + const transport = Transport.$.isBuilder(transportTypeInput) ? transportTypeInput.return() : transportTypeInput + data.transport = transport + }, + requestInterceptor(requestInterceptor: RequestPipeline.BaseInterceptor) { + data.requestInterceptor = requestInterceptor + }, + configurator(configurator: Configurator.DataInput) { + data.configurator = Configurator.$.normalizeDataInput(configurator) + }, + properties(properties) { + if (typeof properties === `function`) { + data.propertiesComputed.push(properties) + } else { + Object.assign(data.propertiesStatic, properties) + } + }, + return() { + return data.configurator + ? (initialInput: Configurator.Configuration) => { + if (initialInput === undefined) return data + return { + ...data, + configuratorInitialInput: initialInput, + } + } + : data + }, + }, + }) as any +} + +type Create = <$Context extends Context, $Name extends string>( + name: $Name, +) => Chain<$Context, DataEmpty<$Name>> + +// ------------------------------------------------------------ +// Chain +// ------------------------------------------------------------ + +// dprint-ignore +export interface Chain< + $Context extends Context, + $Data extends Data, + __$ConfigurationNormalized extends object = + undefined extends $Data['configurator'] + ? Context['configuration'] + : Context['configuration'] & { + [_ in $Data['name']]: Configuration.ConfigurationNamespace> + } +> { + + /** + * todo + */ + configurator: <$Configurator extends Configurator>( + configurator: Configurator.DataInput<$Configurator>, + ) => Chain<$Context, { + readonly [_ in keyof $Data]: _ extends 'configurator' ? $Configurator : $Data[_] + }> + + /** + * TODO 0 + */ + transport: MethodTransport<$Context, $Data, __$ConfigurationNormalized> + + /** + * todo + */ + requestInterceptor: <$RequestInterceptor extends RequestPipeline.BaseInterceptor>( + requestInterceptor: $RequestInterceptor, + ) => Chain<$Context, { + readonly [_ in keyof $Data]: _ extends 'requestInterceptor' ? $RequestInterceptor : $Data[_] + }> + + /** + * todo + */ + properties: <$Properties extends object>( + constructor: $Properties | Properties.PropertiesComputer + ) => Chain<$Context, { + readonly [_ in keyof $Data]: _ extends 'propertiesStatic' ? + $Properties extends Properties.PropertiesComputerTypeFunction + ? $Data['propertiesStatic'] + : ObjectMergeShallow<$Data['propertiesStatic'], $Properties> + : _ extends 'propertiesComputedTypeFunctions$' ? + $Properties extends Properties.PropertiesComputerTypeFunction + ? [$Properties] + : $Data['propertiesComputedTypeFunctions$'] + : $Data[_] + }> + + /** + * todo + */ + static: ( + properties: properties, + ) => Chain<$Context, { + readonly [_ in keyof $Data]: _ extends 'static' ? properties : $Data[_] + }> + + + /** + * Type(s) that show up in request result data which Graffle should NOT + * "simplify" (aka. "expand", "compute"). + * + * So for example, if this type were `Date` and the request result data + * contained a `Date` type, then it would be left-as is rather than have its + * type turned into the appearance of an object literal, all its properties listed, etc. + * + * You can specify multiple types here by using a union. For example: `IntrospectionQuery | Date`. + */ + typeOfNoExpandResultDataType: <$DataType>() => Chain<$Context, { + readonly [_ in keyof $Data]: _ extends 'noExpandResultDataType' ? $DataType : $Data[_] + }> + + /** + * TODO + */ + // todo: extension stores the initialization configuration statically... + return: () => + & ($Data['configurator'] extends Configurator + // ? (...args: Configurator.InferParameters<$Data['configurator']>) => $Data + ? <$Args extends Configurator.InferParameters<$Data['configurator']>>(...args: $Args) => $Data & { + readonly configuratorInitialInput: $Args extends [infer $InitialInput] ? $InitialInput : undefined + } + : $Data + ) + & ($Data['static'] extends object ? $Data['static'] : unknown) +} + +// ------------------------------------------------------------ +// Chain Methods +// ------------------------------------------------------------ + +interface MethodTransport< + $Context extends Context, + $Data extends Data, + $ConfigurationNormalized extends Configurator.Configuration, +> { + /** + * TODO 1 + */ + <$Transport extends Transport>(transport: $Transport | Transport.Builder<$Transport>): Chain< + $Context, + { + readonly [_ in keyof $Data]: _ extends 'transport' ? $Transport : $Data[_] + } + > + /** + * TODO 2 + */ + <$Name extends string, $Transport extends Transport>( + name: $Name, + constructor: ( + parameters: DependentExtensionParameters<$Context, $ConfigurationNormalized> & { + $: Transport.Builder.States.Empty<$Name> + }, + ) => Transport.Builder<$Transport>, + ): Chain< + $Context, + { + readonly [_ in keyof $Data]: _ extends 'transport' ? $Transport : $Data[_] + } + > +} diff --git a/src/client/properties/extensions/dataType/data.ts b/src/client/properties/extensions/dataType/data.ts new file mode 100644 index 000000000..ab71862b7 --- /dev/null +++ b/src/client/properties/extensions/dataType/data.ts @@ -0,0 +1,53 @@ +import type { Configurator } from '../../../../lib/configurator/configurator.js' +import { undefinedAs } from '../../../../lib/prelude.js' +import type { RequestPipeline } from '../../../../requestPipeline/__.js' +import type { Properties } from '../../properties/__.js' +import type { Transport } from '../../transports/dataType.js' +import type * as _re_export from './properties.js' + +export interface Data< + $Name extends string = string, + $Configurator extends undefined | Configurator = undefined | Configurator, + $NoExpandResultDataType = unknown, + $PropertiesStatic extends object = object, + $PropertiesComputersTypeFunctions extends ReadonlyArray = ReadonlyArray< + Properties.PropertiesComputerTypeFunction + >, + $Transport extends Transport | undefined = Transport | undefined, + $Static extends object | undefined = object | undefined, + $ConfiguratorInitialInput = unknown, +> // $TypeHooks extends TypeHooks = TypeHooks, +{ + readonly name: $Name + readonly configurator?: $Configurator + readonly configuratorInitialInput?: $ConfiguratorInitialInput + // constructor?: (parameters: ConstructorParameters) => { + // requestInterceptor?: RequestPipeline.BaseInterceptor + // properties?: object + // } + readonly requestInterceptor?: RequestPipeline.BaseInterceptor + readonly noExpandResultDataType?: $NoExpandResultDataType + readonly propertiesStatic: $PropertiesStatic + readonly propertiesComputed: ReadonlyArray + readonly propertiesComputedTypeFunctions$: $PropertiesComputersTypeFunctions + // todo support for multiple transports in one extension + readonly transport: $Transport + readonly static: $Static + // typeHooks: $TypeHooks +} + +export interface DataEmpty<$Name extends string = string> extends Data<$Name> { + readonly configurator: undefined + readonly configuratorInitialInput: unknown + readonly requestInterceptor: undefined + readonly noExpandResultDataType: undefined + readonly transport: undefined + readonly static: undefined + readonly propertiesStatic: {} + readonly propertiesComputed: readonly [] + readonly propertiesComputedTypeFunctions$: readonly [] +} + +export const dataPropertiesTypeOnly = undefinedAs<{ + propertiesComputedTypeFunctions$: [] +}>() diff --git a/src/client/properties/extensions/dataType/properties.ts b/src/client/properties/extensions/dataType/properties.ts new file mode 100644 index 000000000..f6b0bc3d7 --- /dev/null +++ b/src/client/properties/extensions/dataType/properties.ts @@ -0,0 +1,8 @@ +import type { DependentExtensionParameters } from './DependentExtensionParameters.js' + +export interface PropertiesTypeFunction { + parameters: unknown + return: unknown +} + +export type PropertiesTypeFunctionParameters = DependentExtensionParameters diff --git a/src/client/properties/extensions/extensions.test.ts b/src/client/properties/extensions/extensions.test.ts new file mode 100644 index 000000000..9934080e7 --- /dev/null +++ b/src/client/properties/extensions/extensions.test.ts @@ -0,0 +1,94 @@ +import { describe, expect, expectTypeOf } from 'vitest' +import { ATransport, ATransportBuilder } from '../../../../tests/_/fixtures/transports.js' +import { test } from '../../../../tests/_/helpers.js' +import { parametersComputer, preflightComputer$Func, propertiesStatic1 } from '../properties/properties.test.js' +import { RequestInterceptors } from '../requestInterceptors/__.js' +import { Extension } from './dataType/_namespace.js' + +const aExtension = Extension.create(`aExtension`).return() +type aExtension = typeof aExtension + +test(`using an extension returns a client copy; is registered in context`, ({ g0 }) => { + const g1 = g0.use(aExtension) + expect(g1).not.toBe(g0) + expect(g1._.extensions).toEqual([aExtension]) + expectTypeOf(g1._.extensions).toEqualTypeOf<[aExtension]>() +}) + +describe(`transport`, () => { + test(`can be added (transport type given)`, ({ g0 }) => { + const bExtension = Extension.create(`bExtension`).transport(ATransport).return() + const g1a = g0.use(bExtension) + const g1b = g0.transport(ATransport) + expect(g1a._.transports).toEqual(g1b._.transports) + expectTypeOf(g1a._.transports).toEqualTypeOf(g1b._.transports) + expect(g1a._.requestPipelineDefinition.overloads).toEqual(g1b._.requestPipelineDefinition.overloads) + expectTypeOf(g1a._.requestPipelineDefinition.overloads).toEqualTypeOf(g1b._.requestPipelineDefinition.overloads) + }) + + test(`can be added (transport builder given)`, ({ g0 }) => { + const bExtension = Extension.create(`bExtension`).transport(ATransportBuilder).return() + const g1 = g0.use(bExtension) + const g2 = g0.transport(ATransport) + expect(g1._.transports).toEqual(g2._.transports) + expectTypeOf(g1._.transports).toEqualTypeOf(g2._.transports) + }) +}) + +describe(`properties`, () => { + test(`can be added (static)`, ({ g0 }) => { + const bExtension = Extension.create(`bExtension`).properties(propertiesStatic1).return() + const g1a = g0.use(bExtension) + const g1b = g0.properties(propertiesStatic1) + expect(g1a.foo).toEqual(g1b.foo) + expect(g1a._.properties).toEqual(g1b._.properties) + expectTypeOf(g1a._.properties).toEqualTypeOf(g1b._.properties) + }) + test(`can be added (computed, value level)`, ({ g0 }) => { + const bExtension = Extension.create(`bExtension`).properties(parametersComputer).return() + const g1a = g0.use(bExtension) + const g1b = g0.properties(parametersComputer) + expect(Object.keys(g1a.parameters.configuration)).toEqual(Object.keys(g1b.parameters.configuration)) + expect(g1a.parameters.configuration).toBe(g1b.parameters.configuration) + expect(g1a.parameters.client).toBe(g1a) + expect(g1a.parameters.context.properties).toEqual(g1b.parameters.context.properties) + expectTypeOf(g1a._.properties).toEqualTypeOf(g1b._.properties) + }) + test(`can be added (computed, type level)`, ({ g0 }) => { + const bExtension = Extension.create(`bExtension`).properties(preflightComputer$Func).return() + const g1a = g0.use(bExtension) + const g1b = g0.properties(preflightComputer$Func) + expect(g1a.foo).toEqual(g1b.foo) + expect(g1a._.properties).toEqual(g1b._.properties) + expectTypeOf(g1a._.properties).toEqualTypeOf(g1b._.properties) + }) +}) + +describe(`request interceptor`, () => { + test(`can be added`, ({ g0 }) => { + const i1 = RequestInterceptors.createInterceptor(async ({ pack }) => { + return await pack() + }) + const bExtension = Extension.create(`bExtension`) + .transport(ATransport) + .requestInterceptor(i1) + .return() + const g1a = g0.use(bExtension) + const g1b = g0.anyware(i1) + expect(g1a._.requestPipelineInterceptors).toEqual(g1b._.requestPipelineInterceptors) + expectTypeOf(g1a._.requestPipelineInterceptors).toEqualTypeOf(g1b._.requestPipelineInterceptors) + }) +}) + +// test('using an extension without type hooks leaves them empty', () => { +// const Ex = Extension('test').done() +// expectTypeOf(g0._).toMatchTypeOf<{ +// typeHookOnRequestResult: [] +// typeHookOnRequestDocumentRootType: [] +// }>() +// const g2 = g1.use(Ex()) +// expectTypeOf(g2._).toMatchTypeOf<{ +// typeHookOnRequestResult: [] +// typeHookOnRequestDocumentRootType: [] +// }>() +// }) diff --git a/src/client/properties/extensions/extensions.ts b/src/client/properties/extensions/extensions.ts new file mode 100644 index 000000000..0628f3222 --- /dev/null +++ b/src/client/properties/extensions/extensions.ts @@ -0,0 +1,115 @@ +import type { EmptyObject, Writable } from 'type-fest' +import type { Anyware } from '../../../lib/anyware/_namespace.js' +import { type EmptyArray, emptyArray, emptyObject, type UnknownOrAnyToNever } from '../../../lib/prelude.js' +import { type Context } from '../../../types/context.js' +import type { Client } from '../../client.js' +import { type ContextFragmentAddProperties, contextFragmentPropertiesAdd } from '../properties/properties.js' +import { RequestInterceptors } from '../requestInterceptors/__.js' +import { Transports } from '../transports/__.js' +import type { Transport } from '../transports/dataType.js' +import type { Extension } from './dataType/_namespace.js' + +// ------------------------------------------------------------ +// Method +// ------------------------------------------------------------ + +// dprint-ignore +export interface MethodAdd<$Context extends Context> { + (extension: extension): + Client> +} + +// ------------------------------------------------------------ +// Context Fragment +// ------------------------------------------------------------ + +export interface ContextFragmentExtensions { + readonly extensions: readonly Extension.Data[] + readonly extensionsIndex: { + [extensionName: string]: Extension.Data + } +} + +export interface ContextFragmentExtensionsEmpty extends ContextFragmentExtensions { + extensions: EmptyArray + extensionsIndex: EmptyObject +} + +export const contextFragmentExtensionsEmpty: ContextFragmentExtensionsEmpty = { + extensions: emptyArray, + extensionsIndex: emptyObject, +} + +// todo: type to use multiple to reduce type instantiation +// useful for presets + +// dprint-ignore +export type ContextAddOne< + $Context extends Context, + $Extension extends Extension.Data, +> = { + readonly [_ in keyof $Context]: + _ extends 'properties' ? + ContextFragmentAddProperties<$Context, $Extension['propertiesStatic'], $Extension['propertiesComputedTypeFunctions$']> : + // $Extension['propertiesStatic']: + _ extends 'requestPipelineDefinition' ? + $Extension['transport'] extends Transport ? + Anyware.PipelineDefinition.Updaters.AddOverload< + $Context['requestPipelineDefinition'], + $Extension['transport'] + > + : + $Context['requestPipelineDefinition'] : + _ extends 'extensions' ? + [...$Context['extensions'], $Extension] : + _ extends 'transports' ? + Transports.ContextAddTransportOptional< + $Context['transports'], + $Extension['transport'] + > : + // : _ extends 'typeHookOnRequestResult' + // ? [...$Context['typeHookOnRequestResult'], ...$Extension['typeHooks']['onRequestResult']] + // : _ extends 'typeHookOnRequestDocumentRootType' + // ? [...$Context['typeHookOnRequestDocumentRootType'], ...$Extension['typeHooks']['onRequestDocumentRootType']] + _ extends 'typeHookRequestResultDataTypes' ? + | $Context['typeHookRequestResultDataTypes'] + | UnknownOrAnyToNever<$Extension['noExpandResultDataType']> : + // Skip + $Context[_] + } + +// todo: make return a fragment +export const contextFragmentExtensionsAdd = < + const $Context extends Context, + $Extension extends Extension.Data, +>(context: $Context, extension: $Extension): ContextAddOne<$Context, $Extension> => { + const fragment: Writable = { + ...context, + extensions: Object.freeze([...context.extensions, extension]), + extensionsIndex: Object.freeze({ + ...context.extensionsIndex, + [extension.name]: extension, + }), + } + + if (extension.transport) { + Object.assign(fragment, Transports.contextFragmentAdd(context, extension.transport)) + } + if (extension.requestInterceptor) { + Object.assign( + fragment, + RequestInterceptors.contextFragmentRequestInterceptorsAdd(context, extension.requestInterceptor), + ) + } + if (extension.propertiesStatic || extension.propertiesComputed) { + const propertiesFragment = contextFragmentPropertiesAdd(context, { + static: extension.propertiesStatic, + computed: extension.propertiesComputed, + }) + if (propertiesFragment) { + Object.assign(fragment, propertiesFragment) + } + } + + return fragment as any +} diff --git a/src/client/properties/gql/gql.test-d.ts b/src/client/properties/gql/gql.test-d.ts deleted file mode 100644 index 2eb7d515e..000000000 --- a/src/client/properties/gql/gql.test-d.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { kitchenSink } from '../../../../tests/_/helpers.js' -import { GraffleBare } from '../../../entrypoints/presets/bare.js' -import { GraffleBasic } from '../../../entrypoints/presets/basic.js' -import { GraffleMinimal } from '../../../entrypoints/presets/minimal.js' -import { assertType } from '../../../lib/assert-equal.js' -import type { Grafaid } from '../../../lib/grafaid/__.js' -import type { ClientTransports } from '../../../types/context.js' - -const g = kitchenSink - -type D = { id: 0 } - -const d1 = 0 as any as Grafaid.Document.Typed.Node<{ id: 0 }, {}> - -assertType(await g.gql(d1).send()) -// @ts-expect-error - variables not allowed. -await g.gql(d1).send({}) - -// -// -// - -// Not available if no transports registered -assertType(GraffleBare.create().gql) -// Not available if current transport not ready -assertType>(GraffleMinimal.create().gql) -// ... Reflects name of currently selected transport -assertType>( - GraffleBasic.create().transport(`memory`).gql, -) - -// -// -// - -const d2 = 0 as any as Grafaid.Document.Typed.Node<{ id: 0 }, { x?: 0 }> - -assertType(await g.gql(d2).send()) -assertType(await g.gql(d2).send({})) -assertType(await g.gql(d2).send({ x: 0 })) -assertType(await g.gql(d2).send({ x: 0 })) -// @ts-expect-error - wrong type -await g.gql(d2).send({ filter: `wrong type` }) - -// -// -// - -const d3 = 0 as any as Grafaid.Document.Typed.Node<{ id: 0 }, { x: 0 }> - -assertType(await g.gql(d3).send({ x: 0 })) -// @ts-expect-error - missing argument -assertType(await g.gql(d3).send({})) - -// -// -// - -// dprint-ignore -{ - // Return Type - - assertType(await g.gql >``.send({ x: 1 })) - assertType(await g.gql >``.send()) - assertType(await g.gql >``.send({ x: 1 })) - assertType(await g.gql >``.send()) - assertType(await g.gql>``.send()) - assertType(await g.gql>``.send({ x: 1 })) - assertType(await g.gql>``.send(`abc`, { x: 1 })) - // @ts-expect-error - wrong argument type - await g.gql >``.send({ x: 2 }) - - assertType(await g.gql >``.send({ x: 1 })) - assertType(await g.gql >``.send()) - assertType(await g.gql >``.send({ x: 1 })) - assertType(await g.gql >``.send()) - assertType(await g.gql>``.send()) // eslint-disable-line - assertType(await g.gql>``.send({ x: 1 })) // eslint-disable-line - assertType(await g.gql>``.send(`abc`, { x: 1 })) // eslint-disable-line - // @ts-expect-error - wrong argument type - await g.gql >``.send({ x: 2 }) - - assertType(await g.gql >``.send({ x: 1 })) - assertType(await g.gql >``.send()) - assertType(await g.gql >``.send({ x: 1 })) - assertType(await g.gql >``.send()) - assertType(await g.gql>``.send()) // eslint-disable-line - assertType(await g.gql>``.send({ x: 1 })) // eslint-disable-line - assertType(await g.gql>``.send(`abc`, { x: 1 })) // eslint-disable-line - // @ts-expect-error - wrong argument type - await g.gql >``.send({ x: 2 }) - - - assertType(await g.gql``.send()) - assertType(await g.gql``.send(`foo`)) - assertType(await g.gql``.send(`foo`, { x: 1 })) - assertType(await g.gql``.send({ x: 1 })) - -} diff --git a/src/client/properties/gql/gql.test.ts b/src/client/properties/gql/gql.test.ts deleted file mode 100644 index 7b798a622..000000000 --- a/src/client/properties/gql/gql.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { describe, expect } from 'vitest' -import { test } from '../../../../tests/_/helpers.js' -import { Spy } from '../../../../tests/_/SpyExtension.js' - -// todo test with custom scalars - -describe(`memory transport`, () => { - describe(`operationName`, () => { - test(`undefined by default`, async ({ kitchenSink }) => { - await kitchenSink.use(Spy()).gql`query { id }`.send() - expect(Spy.data.exchange.input).toMatchObject({ request: { operationName: undefined } }) - }) - test(`reflects explicit value`, async ({ kitchenSink }) => { - await kitchenSink.use(Spy()).gql`query foo { id }`.send(`foo`) - expect(Spy.data.exchange.input).toMatchObject({ request: { operationName: `foo` } }) - }) - }) -}) diff --git a/src/client/properties/gql/gql.ts b/src/client/properties/gql/gql.ts deleted file mode 100644 index a5a742043..000000000 --- a/src/client/properties/gql/gql.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Anyware } from '../../../lib/anyware/__.js' -import type { Grafaid } from '../../../lib/grafaid/__.js' -import { getOperationType } from '../../../lib/grafaid/document.js' -import { - isTemplateStringArguments, - joinTemplateStringArrayAndArgs, - type TemplateStringsArguments, -} from '../../../lib/template-string.js' -import type { RequestPipelineBase } from '../../../requestPipeline/RequestPipeline.js' -import { handleOutput } from '../../handleOutput.js' -import { createProperties } from '../../helpers.js' -import { type DocumentController, resolveSendArguments, type sendArgumentsImplementation } from './send.js' - -// dprint-ignore -export interface gqlOverload<$Context> { - <$Document extends Grafaid.Document.Typed.TypedDocumentLike>(document: $Document ): DocumentController<$Context, $Document> - <$Document extends Grafaid.Document.Typed.TypedDocumentLike>(parts: TemplateStringsArray, ...args: unknown[]): DocumentController<$Context, $Document> -} - -type gqlArguments = [Grafaid.Document.Typed.TypedDocumentLike] | TemplateStringsArguments - -const resolveGqlArguments = (args: gqlArguments) => { - const document = isTemplateStringArguments(args) ? joinTemplateStringArrayAndArgs(args) : args[0] - return { - document, - } -} - -export const gqlProperties = createProperties((_, context) => { - return { - gql: (...args: gqlArguments) => { - const { document: query } = resolveGqlArguments(args) - - return { - send: async (...args: sendArgumentsImplementation) => { - if (!context.transports.current) throw new Error(`No transport selected`) - - const { operationName, variables } = resolveSendArguments(args) - const request = { - query, - variables, - operationName, - } - const operationType = getOperationType(request) - if (!operationType) throw new Error(`Could not get operation type`) - - const analyzedRequest = { - operation: operationType, - query, - variables, - operationName, - } - - const initialInput = { - transportType: context.transports.current, - ...context.transports.configurations[context.transports.current], - state: context, - request: analyzedRequest, - } as RequestPipelineBase['input'] - - const requestPipeline = Anyware.Pipeline.create(context.requestPipelineDefinition) - const result = await Anyware.PipelineDefinition.run(requestPipeline, { - initialInput, - // retryingExtension: context.retry as any, - interceptors: context.extensions.filter(_ => _.onRequest !== undefined).map(_ => _.onRequest!) as any, - }) - - return handleOutput(context, result) - }, - } as any - }, - } as any -}) diff --git a/src/client/properties/output/_.test.ts b/src/client/properties/output/_.test.ts new file mode 100644 index 000000000..f32b44bb8 --- /dev/null +++ b/src/client/properties/output/_.test.ts @@ -0,0 +1,183 @@ +/* eslint-disable */ +import { type ExecutionResult } from 'graphql' +import { describe } from 'node:test' +import { expect, expectTypeOf } from 'vitest' +import { Graffle } from '../../../../tests/_/schemas/kitchen-sink/graffle/__.js' +// import { schema } from '../../../../tests/_/schemas/kitchen-sink/schema.js' +import { ATransport } from '../../../../tests/_/fixtures/transports.js' +import { g0, test } from '../../../../tests/_/helpers.js' +import { schema } from '../../../../tests/_/schemas/query-only/schema.js' +import { TransportMemory } from '../../../extensions/TransportMemory/TransportMemory.js' +import type { Anyware } from '../../../lib/anyware/_namespace.js' +import { assertEqual } from '../../../lib/assert-equal.js' +import { type GraphQLExecutionResultError } from '../../../lib/grafaid/graphql.js' +import { create } from '../../client.js' + +const g1 = g0.use(TransportMemory).transport({ schema }) +// const G = Graffle.create + +// const defaultGraffle = Graffle.create({ check: { preflight: false } }) + +test('default is throws errors', async () => { + await expect(g1.gql('').send()).rejects.toThrowErrorMatchingInlineSnapshot( + `[ContextualAggregateError: One or more errors in the execution result.]`, + ) +}) +test('can return errors', async () => { + const g2 = g1.with({ output: { defaults: { errorChannel: 'return' } } }) + const result = await g2.gql('').send() + expect(result).toMatchInlineSnapshot(`[ContextualAggregateError: One or more errors in the execution result.]`) +}) + +// // test('default is errors thrown, no envelope, no schema errors', async () => { +// // const graffle = create({ +// // checkPreflight: false, +// // output: { +// // defaults: { +// // errorChannel: 'throw', +// // }, +// // envelope: { +// // enabled: false, +// // errors: { +// // execution: true, +// // other: false, +// // }, +// // }, +// // errors: { +// // execution: 'default', +// // other: 'default', +// // }, +// // }, +// // }) +// // const result1 = await graffle.query.__typename() +// // const result2 = await defaultGraffle.query.__typename() +// // expectTypeOf(result1).toEqualTypeOf<'Query'>() +// // expectTypeOf(result2).toEqualTypeOf<'Query'>() +// // }) + +// // dprint-ignore +// describe('.envelope', () => { +// type FieldMethodResultDisabled = 'Query' +// type FieldMethodResultEnabled = ExecutionResult<{ __typename: FieldMethodResultDisabled }> + +// // type ResultFieldMethodResultDisabled = { +// // __typename: 'Object1' +// // } | { +// // __typename: 'ErrorOne' +// // } | { +// // __typename: 'ErrorTwo' +// // } +// // type ResultFieldMethodResultEnabled = ExecutionResult<{ resultNonNull: ResultFieldMethodResultDisabled }> + +// // todo reference to Graffle client +// // const fieldMethod = <$Graffle extends {query:{__typename:()=>Promise}}>(g: $Graffle) => g.query.__typename() + +// describe('false disables it ', () => { +// const g = G({ output: { envelope: false }, checkPreflight: false }) + +// test('query.', ({ kitchenSink }) => { +// expectTypeOf(g.query.__typename()).resolves.toEqualTypeOf() +// }) +// // test('query.', () => { +// // expectTypeOf(g.query.resultNonNull(resultFieldSelect)).resolves.toEqualTypeOf() +// // }) +// test('query.$batch', async () => { +// expectTypeOf(await g.query.$batch({ __typename: true, idNonNull: true })).toEqualTypeOf<{ __typename: 'Query'; idNonNull: string } | null>() +// }) +// }) +// describe('true enables it', () => { +// const g = Graffle.create({ output: { envelope: true }, checkPreflight: false }) +// test('query.', () => { +// expectTypeOf(g.query.__typename()).resolves.toMatchTypeOf() +// }) +// // test('query.', async () => { +// // expectTypeOf((await g.query.resultNonNull(resultFieldSelect))).toMatchTypeOf() +// // }) +// test('query.$batch', () => { +// const result = g.query.$batch({ __typename: true, idNonNull: true }) +// assertEqual> +// }) +// }) +// test('object enables it', async () => { +// const graffle = Graffle.create({ output: { envelope: {} }, checkPreflight: false }) +// expectTypeOf(await graffle.query.__typename()).toMatchTypeOf() +// }) +// describe('.enabled', () => { +// test('false disables it', async () => { +// const graffle = Graffle.create({ output: { envelope: { enabled: false } }, checkPreflight: false }) +// expectTypeOf(await graffle.query.__typename()).toEqualTypeOf() +// }) +// test('true enables it', async () => { +// const graffle = Graffle.create({ output: { envelope: { enabled: true } }, checkPreflight: false }) +// expectTypeOf(await graffle.query.__typename()).toMatchTypeOf() +// }) +// }) +// describe('with defaults.errorChannel: "return"', () => { +// describe('.errors', () => { +// test('defaults to execution errors in envelope', () => { +// const g = G({ output: { defaults: { errorChannel: 'return' }, envelope: true }, checkPreflight: false }) +// expectTypeOf(g.query.__typename()).resolves.toMatchTypeOf | Anyware.ResultFailure>() +// }) +// test('.execution:false restores errors to return', async () => { +// const g = G({ +// output: { defaults: { errorChannel: 'return' }, envelope: { errors: { execution: false } } }, +// checkPreflight: false, +// }) +// expectTypeOf(await g.query.__typename()).toEqualTypeOf< +// Omit, 'errors'> | Anyware.ResultFailure | GraphQLExecutionResultError +// >() +// }) +// test('.other:true raises them to envelope', () => { +// const g = G({ +// output: { defaults: { errorChannel: 'return' }, envelope: { errors: { other: true } } }, +// checkPreflight: false, +// }) +// expectTypeOf(g.query.__typename()).resolves.toMatchTypeOf>() +// }) +// }) +// }) +// test('with no errors included, then there are no error fields in the envelope', async () => { +// const g = G({ +// // todo allow this shorthand +// // output: { envelope: false }, +// output: { envelope: { errors: { execution:false, other:false } } }, +// checkPreflight: false, +// }) +// const result = await g.query.__typename() +// expectTypeOf().toEqualTypeOf<'data'|'extensions'> // no errors +// }) +// }) + +// describe('defaults.errorChannel: "return"', () => { +// describe('puts errors into return type', () => { +// const g = G({ output: { defaults: { errorChannel: 'return' } }, checkPreflight: false }) +// test('query.', async () => { +// expectTypeOf(await g.query.__typename()).toEqualTypeOf< +// 'Query' | Anyware.ResultFailure | GraphQLExecutionResultError +// >() +// }) +// }) +// describe('with .errors', () => { +// test('.execution: throw', async () => { +// const g = G({ +// output: { defaults: { errorChannel: 'return' }, errors: { execution: 'throw' } }, +// checkPreflight: false, +// }) +// expectTypeOf(await g.query.__typename()).toEqualTypeOf<'Query' | Anyware.ResultFailure>() +// }) +// test('.other: throw', async () => { +// const g = G({ +// output: { defaults: { errorChannel: 'return' }, errors: { other: 'throw' } }, +// checkPreflight: false, +// }) +// expectTypeOf(await g.query.__typename()).toEqualTypeOf<'Query' | GraphQLExecutionResultError>() +// }) +// test('.*: throw', async () => { +// const g = G({ +// output: { defaults: { errorChannel: 'return' }, errors: { other: 'throw', execution: 'throw' } }, +// checkPreflight: false, +// }) +// expectTypeOf(await g.query.__typename()).toEqualTypeOf<'Query'>() +// }) +// }) +// }) diff --git a/src/client/properties/output/_exports.ts b/src/client/properties/output/_exports.ts new file mode 100644 index 000000000..d573b51a2 --- /dev/null +++ b/src/client/properties/output/_exports.ts @@ -0,0 +1,2 @@ +export * from './configuration.js' +export * from './handle.js' diff --git a/src/client/properties/output/_namespace.ts b/src/client/properties/output/_namespace.ts new file mode 100644 index 000000000..66c8adbdd --- /dev/null +++ b/src/client/properties/output/_namespace.ts @@ -0,0 +1 @@ +export * as Output from './_exports.js' diff --git a/src/client/properties/output/configuration.ts b/src/client/properties/output/configuration.ts new file mode 100644 index 000000000..f646b4d6f --- /dev/null +++ b/src/client/properties/output/configuration.ts @@ -0,0 +1,188 @@ +import type { ConfigManager } from '../../../lib/config-manager/__.js' +import { Configurator as C } from '../../../lib/configurator/configurator.js' + +export type OutputChannel = 'throw' | 'return' + +export type OutputChannelConfig = 'throw' | 'return' | 'default' + +export type ErrorCategory = 'execution' | 'other' + +export interface Input { + /** + * Defaults for certain aspects of output behavior. + */ + defaults?: { + /** + * The default error channel to use. + * + * @defaultValue `'throw'` + */ + errorChannel?: OutputChannel + } + /** + * @defaultValue `false` + */ + envelope?: boolean | ConfigurationInputOutputEnvelopeLonghand + /** + * Granular control of how to output errors by category. + */ + errors?: { + /** + * Execution errors. These are errors you would traditionally see in the GraphQL execution result `'errors'` field. + */ + execution?: OutputChannelConfig + /** + * Other errors include things like network errors thrown by fetch (when using HTTP transport), errors thrown from extensions, etc. + */ + other?: OutputChannelConfig + } +} + +export interface ConfigurationInputOutputEnvelopeLonghand { + /** + * @defaultValue `true` + */ + enabled?: boolean + errors?: { + execution?: boolean + other?: boolean + } +} + +export type Normalized = { + defaults: { + errorChannel: OutputChannel + } + envelope: { + enabled: boolean + errors: { + execution: boolean + other: boolean + } + } + errors: { + execution: OutputChannelConfig + other: OutputChannelConfig + } +} + +const default_ = { + defaults: { + errorChannel: `throw`, + }, + envelope: { + enabled: false, + errors: { + execution: true, + other: false, + }, + }, + errors: { + execution: `default`, + other: `default`, + }, +} satisfies Partial + +type Default_ = typeof default_ + +export const configurator = C() + .input() + .normalized() + .default(default_) + .inputResolver(({ current, input }) => { + const outputEnvelopeLonghand: ConfigurationInputOutputEnvelopeLonghand | undefined = + typeof input.envelope === `object` + ? { enabled: true, ...input.envelope } + : typeof input.envelope === `boolean` + ? { enabled: input.envelope } + : undefined + + return { + defaults: { + errorChannel: input.defaults?.errorChannel ?? current.defaults?.errorChannel, + }, + envelope: { + enabled: outputEnvelopeLonghand?.enabled ?? current.envelope.enabled, + errors: { + execution: outputEnvelopeLonghand?.errors?.execution ?? current.envelope.errors.execution, + other: outputEnvelopeLonghand?.errors?.other ?? current.envelope.errors.other, + // @ts-expect-error + schema: outputEnvelopeLonghand?.errors?.schema ?? current.envelope.errors.schema, + }, + }, + errors: { + execution: input.errors?.execution ?? current.errors.execution, + other: input.errors?.other ?? current.errors.other, + // @ts-expect-error conditional type + schema: input.errors?.schema ?? current.errors.schema, + }, + } + }) + .return() + +export type Configurator = typeof configurator + +export interface InputResolver$Func extends C.InputResolver.$Func { + return: InputResolver +} + +// dprint-ignore +export interface InputResolver< + $Parameters extends C.InputResolver.Parameters, + // Variables + $Input = $Parameters['input'], + _$Current = $Parameters['current'], +> { + // todo: integrate _$Current into logic + defaults: { + errorChannel: ConfigManager.GetAtPathOrDefault<$Input, ['defaults', 'errorChannel'], 'throw'> + } + envelope: { + enabled: + ConfigManager.GetOptional<$Input, ['envelope']> extends boolean ? ConfigManager.GetOptional<$Input, ['envelope']> + : ConfigManager.GetOptional<$Input, ['envelope','enabled']> extends boolean ? ConfigManager.GetOptional<$Input, ['envelope','enabled']> + : ConfigManager.GetOptional<$Input, ['envelope']> extends object ? true + : false + errors: { + execution: ConfigManager.GetAtPathOrDefault<$Input, ['envelope','errors','execution'], true> + other: ConfigManager.GetAtPathOrDefault<$Input, ['envelope','errors','other'], false> + schema: ConfigManager.GetAtPathOrDefault<$Input, ['envelope','errors','schema'], false> + } + } + errors: { + execution: ConfigManager.GetAtPathOrDefault<$Input,['errors', 'execution'], 'default'> + other: ConfigManager.GetAtPathOrDefault<$Input,['errors', 'other'], 'default'> + schema: ConfigManager.GetAtPathOrDefault<$Input,['errors', 'schema'], false> + } +} + +export const isOutputTraditionalGraphQLOutput = (output: Normalized) => { + return output.envelope.enabled && output.envelope.errors.execution + && !output.envelope.errors.other +} +export const readErrorCategoryOutputChannel = ( + output: Normalized, + errorCategory: ErrorCategory, +): OutputChannel | false => { + if (output.errors[errorCategory] === `default`) { + return output.defaults.errorChannel + } + return output.errors[errorCategory] +} + +export const traditionalGraphqlOutput = { + defaults: { errorChannel: `throw` }, + envelope: { enabled: true, errors: { execution: true, other: false } }, + errors: { execution: `default`, other: `default` }, +} satisfies Normalized + +export const traditionalGraphqlOutputThrowing: Normalized = { + ...traditionalGraphqlOutput, + envelope: { + ...traditionalGraphqlOutput.envelope, + errors: { + ...traditionalGraphqlOutput.envelope.errors, + execution: false, + }, + }, +} diff --git a/src/client/handleOutput.ts b/src/client/properties/output/handle.ts similarity index 68% rename from src/client/handleOutput.ts rename to src/client/properties/output/handle.ts index 02c1fff85..f45aeaa18 100644 --- a/src/client/handleOutput.ts +++ b/src/client/properties/output/handle.ts @@ -1,29 +1,28 @@ import type { GraphQLError } from 'graphql' import type { Simplify } from 'type-fest' -import type { Extension } from '../entrypoints/extensionkit.js' -import type { Anyware } from '../lib/anyware/__.js' -import { Errors } from '../lib/errors/__.js' -import type { Grafaid } from '../lib/grafaid/__.js' -import type { SomeObjectData } from '../lib/grafaid/graphql.js' -import type { GraphQLExecutionResultError } from '../lib/grafaid/graphql.js' +import type { Anyware } from '../../../lib/anyware/_namespace.js' +import { Errors } from '../../../lib/errors/__.js' +import type { Grafaid } from '../../../lib/grafaid/__.js' +import type { SomeObjectData } from '../../../lib/grafaid/graphql.js' +import type { GraphQLExecutionResultError } from '../../../lib/grafaid/graphql.js' import { type ExcludeNull, type ExcludeNullAndUndefined, type ExcludeUndefined, type GetOrNever, type Values, -} from '../lib/prelude.js' -import type { RequestPipelineBase } from '../requestPipeline/RequestPipeline.js' -import type { Context } from '../types/context.js' -import type { GlobalRegistry } from '../types/GlobalRegistry/GlobalRegistry.js' -import type { RequestResult } from '../types/RequestResult.ts/__.js' +} from '../../../lib/prelude.js' +import type { RequestPipeline } from '../../../requestPipeline/__.js' +import type { Context } from '../../../types/context.js' +import type { GlobalRegistry } from '../../../types/GlobalRegistry/GlobalRegistry.js' +import type { RequestResult } from '../../../types/RequestResult.ts/__.js' import { type ErrorCategory, isOutputTraditionalGraphQLOutput, + type Normalized, type OutputChannelConfig, - type OutputConfig, readErrorCategoryOutputChannel, -} from './Configuration/Output.js' +} from './configuration.js' export type GraffleExecutionResultEnvelope = { errors?: ReadonlyArray< @@ -36,30 +35,30 @@ export type GraffleExecutionResultEnvelope = { extensions?: ObjMap } -export const handleOutput = ( +export const handle = ( state: Context, - result: Anyware.Result, + result: Anyware.Result, ) => { - if (isOutputTraditionalGraphQLOutput(state.output)) { + const c = state.configuration.output.current + + if (isOutputTraditionalGraphQLOutput(c)) { if (result instanceof Error) throw result return result.value } - const outputConfig = state.output - - const isEnvelope = outputConfig.envelope.enabled + const isEnvelope = c.envelope.enabled - const isThrowOther = readErrorCategoryOutputChannel(outputConfig, `other`) === `throw` - && (!outputConfig.envelope.enabled || !outputConfig.envelope.errors.other) + const isThrowOther = readErrorCategoryOutputChannel(c, `other`) === `throw` + && (!c.envelope.enabled || !c.envelope.errors.other) - const isReturnOther = readErrorCategoryOutputChannel(outputConfig, `other`) === `return` - && (!outputConfig.envelope.enabled || !outputConfig.envelope.errors.other) + const isReturnOther = readErrorCategoryOutputChannel(c, `other`) === `return` + && (!c.envelope.enabled || !c.envelope.errors.other) - const isThrowExecution = readErrorCategoryOutputChannel(outputConfig, `execution`) === `throw` - && (!outputConfig.envelope.enabled || !outputConfig.envelope.errors.execution) + const isThrowExecution = readErrorCategoryOutputChannel(c, `execution`) === `throw` + && (!c.envelope.enabled || !c.envelope.errors.execution) - const isReturnExecution = readErrorCategoryOutputChannel(outputConfig, `execution`) === `return` - && (!outputConfig.envelope.enabled || !outputConfig.envelope.errors.execution) + const isReturnExecution = readErrorCategoryOutputChannel(c, `execution`) === `return` + && (!c.envelope.enabled || !c.envelope.errors.execution) if (result instanceof Error) { if (isThrowOther) throw result @@ -103,29 +102,30 @@ export type HandleOutput< $Context, Envelope< // @ts-expect-error: No $Context constraint to avoid "compare depth limit" - $Context['output'], + $Context['configuration']['output']['current'], RequestResult.Simplify<$Context, $Data> > - > +> type HandleOutput_Extensions< $Context, $Envelope extends GraffleExecutionResultEnvelope, > = HandleOutput_ErrorsReturn< // @ts-expect-error: No $Context constraint to avoid "compare depth limit" - $Context['output'], - // eslint-disable-next-line - // @ts-ignore fixme - Extension.TypeHooks.RunTypeHookOnRequestResult<$Context, { - result: $Envelope - // eslint-disable-next-line - // @ts-ignore fixme - registeredSchema: GlobalRegistry.GetOrDefault<$Context['name']> - }>['result'] -> + $Context['configuration']['output']['current'], + $Envelope +> // todo +// eslint-disable-next-line +// @ts-ignore fixme +// Extension.TypeHooks.RunTypeHookOnRequestResult<$Context, { +// result: $Envelope +// // eslint-disable-next-line +// // @ts-ignore fixme +// registeredSchema: GlobalRegistry.GetOrDefault<$Context['name']> +// }>['result'] type HandleOutput_ErrorsReturn< - $OutputConfig extends OutputConfig, + $OutputConfig extends Normalized, $Envelope extends GraffleExecutionResultEnvelope, > = | IfConfiguredGetOutputErrorReturns<$OutputConfig> @@ -133,7 +133,7 @@ type HandleOutput_ErrorsReturn< // dprint-ignore type HandleOutput_Envelope< - $OutputConfig extends OutputConfig, + $OutputConfig extends Normalized, $Envelope extends GraffleExecutionResultEnvelope, > = $OutputConfig['envelope']['enabled'] extends true @@ -141,13 +141,13 @@ type HandleOutput_Envelope< : ExcludeUndefined<$Envelope['data']> // todo make data field not undefinable // dprint-ignore -type IfConfiguredGetOutputErrorReturns<$OutputConfig extends OutputConfig> = +type IfConfiguredGetOutputErrorReturns<$OutputConfig extends Normalized> = | (ConfigGetOutputError<$OutputConfig, 'execution'> extends 'return' ? GraphQLExecutionResultError : never) | (ConfigGetOutputError<$OutputConfig, 'other'> extends 'return' ? Anyware.ResultFailure : never) // dprint-ignore export type ConfigGetOutputError< - $OutputConfig extends OutputConfig, + $OutputConfig extends Normalized, $ErrorCategory extends ErrorCategory, > = $OutputConfig['envelope']['enabled'] extends true @@ -156,7 +156,7 @@ export type ConfigGetOutputError< // dprint-ignore type ConfigGetOutputEnvelopeErrorChannel< - $OutputConfig extends OutputConfig, + $OutputConfig extends Normalized, $ErrorCategory extends ErrorCategory, > = $OutputConfig['envelope']['errors'][$ErrorCategory] extends true @@ -164,7 +164,7 @@ type ConfigGetOutputEnvelopeErrorChannel< : ConfigResolveOutputErrorChannel<$OutputConfig, $OutputConfig['errors'][$ErrorCategory]> type ConfigResolveOutputErrorChannel< - $OutputConfig extends OutputConfig, + $OutputConfig extends Normalized, $Channel extends OutputChannelConfig | false, > = $Channel extends 'default' ? $OutputConfig['defaults']['errorChannel'] : $Channel extends false ? false @@ -173,7 +173,7 @@ type ConfigResolveOutputErrorChannel< // dprint-ignore // todo use ObjMap for $Data export type Envelope< - $OutputConfig extends OutputConfig, + $OutputConfig extends Normalized, $Data = unknown, $Errors extends ReadonlyArray = ReadonlyArray, > = @@ -199,7 +199,7 @@ type ObjMap = { } // dprint-ignore -type IsEnvelopeWithoutErrors<$OutputConfig extends OutputConfig> = +type IsEnvelopeWithoutErrors<$OutputConfig extends Normalized> = $OutputConfig['envelope']['enabled'] extends true ? Values<$OutputConfig['envelope']['errors']> extends false ? true @@ -221,7 +221,6 @@ export type HandleOutputDocumentBuilderRootField< $RootFieldName extends string, > = HandleOutputDocumentBuilderRootField_Data< - // @ts-expect-error: No $Context constraint to avoid "compare depth limit" ExcludeNull< HandleOutput< $Context, diff --git a/src/client/properties/properties/__.ts b/src/client/properties/properties/__.ts new file mode 100644 index 000000000..61a711c1a --- /dev/null +++ b/src/client/properties/properties/__.ts @@ -0,0 +1 @@ +export * as Properties from './properties.js' diff --git a/src/client/properties/properties/properties.test.ts b/src/client/properties/properties/properties.test.ts new file mode 100644 index 000000000..54242ae18 --- /dev/null +++ b/src/client/properties/properties/properties.test.ts @@ -0,0 +1,81 @@ +import { describe, expect, expectTypeOf } from 'vitest' +import { test } from '../../../../tests/_/helpers.js' +import { Context } from '../../../types/context.js' +import { type Client_justContext } from '../../client.js' +import { type Configuration } from '../configuration/__.js' +import { createPropertiesComputer, type PropertiesComputerTypeFunction } from './properties.js' + +export const propertiesStatic1 = { foo: `bar` } + +export const parametersComputer = createPropertiesComputer()((parameters) => ({ + parameters, +})) + +export const preflightComputer = createPropertiesComputer()((parameters) => ({ + foo: parameters.context.configuration.check.current.preflight ? `bar` : `baz`, +})) + +export const preflightComputer$Func = preflightComputer as any as PreflightComputer$Func + +export interface PreflightComputer$Func extends PropertiesComputerTypeFunction { + return: PreflightComputer +} + +export interface PreflightComputer<$Context extends Context> { + foo: $Context['configuration']['check']['current']['preflight'] extends true ? `bar` : `baz` +} + +test(`initial context is empty`, ({ g0 }) => { + expect(g0._.properties).toEqual(Context.States.empty.properties) + expectTypeOf(g0._.properties).toEqualTypeOf() +}) + +test(`can add static properties`, ({ g0 }) => { + const g1 = g0.properties(propertiesStatic1) + // Context extended + expect(g1._.properties.static).toEqual(propertiesStatic1) + expectTypeOf(g1._.properties.static).toMatchTypeOf() + // Client extended + expect(g1).toMatchObject(propertiesStatic1) + expectTypeOf(g1.foo).toMatchTypeOf() +}) + +describe(`computed properties`, () => { + test(`can be added (value level); receives typed context and client`, ({ g0 }) => { + const g1 = g0.properties(parametersComputer) + // Context extended + expect(g1._.properties.static).toEqual({}) + expect(g1._.properties.computed).toEqual([parametersComputer]) + expectTypeOf(g1._.properties.static).toMatchTypeOf< + { + parameters: { + configuration: Configuration.ContextFragmentConfiguration['configuration'] + context: Context + client: Client_justContext + } + } + >() + expectTypeOf(g1._.properties.$computedTypeFunctions).toEqualTypeOf() + // Client extended + expect(g1.parameters.client).toBe(g1) + expect(g1.parameters.context).toBe(g1._) + expect(g1.parameters.configuration).toBe(g1._.configuration) + }) + test(`Are computed every time the client is copied`, ({ g0 }) => { + const g1 = g0.properties(preflightComputer) + const g2 = g1.with({ check: { preflight: false } }) + const g3 = g2.with({ check: { preflight: true } }) + expect(g1.foo).toEqual(`bar`) + expect(g2.foo).toEqual(`baz`) + expect(g3.foo).toEqual(`bar`) + }) + test(`can be added (type level)`, ({ g0 }) => { + const g1 = g0.properties(preflightComputer$Func) + expectTypeOf(g1._.properties.$computedTypeFunctions).toEqualTypeOf() + expectTypeOf(g1.foo).toEqualTypeOf<`bar`>() + const g2 = g1.with({ check: { preflight: false } }) + expectTypeOf(g2.foo).toEqualTypeOf<`baz`>() + const g3 = g2.with({ check: { preflight: true } }) + expectTypeOf(g3.foo).toEqualTypeOf<`bar`>() + }) +}) diff --git a/src/client/properties/properties/properties.ts b/src/client/properties/properties/properties.ts new file mode 100644 index 000000000..27429b3d7 --- /dev/null +++ b/src/client/properties/properties/properties.ts @@ -0,0 +1,170 @@ +import type { Configurator } from '../../../lib/configurator/configurator.js' +import { + type EmptyArray, + emptyArray, + type EmptyObject, + emptyObject, + isObjectEmpty, + type ObjectMergeShallow, + undefinedAs, +} from '../../../lib/prelude.js' +import type { Context } from '../../../types/context.js' +import type { Client, Client_justContext } from '../../client.js' + +// ------------------------------------------------------------ +// Method +// ------------------------------------------------------------ + +// todo have the client type be passed through too? Using `this` from parent? +export interface AddPropertiesMethod<$Context extends Context> { + <$Properties extends Properties>(properties: $Properties | PropertiesComputer<$Context, $Properties>): Client< + { + [_ in keyof $Context]: _ extends 'properties' ? ContextFragmentAddProperties< + $Context, + $Properties extends PropertiesComputerTypeFunction ? {} : $Properties, + $Properties extends PropertiesComputerTypeFunction ? [$Properties] : [] + > + : $Context[_] + } + > +} + +// ------------------------------------------------------------ +// Helpers +// ------------------------------------------------------------ + +// todo put symbol here to make unique from any possible properties object +export interface PropertiesComputerTypeFunction { + context: Context + return: unknown +} + +// export interface PropertiesComputerTypeFunctionParameters { +// context: Context +// // client: Client +// } + +// todo: $Acc shallow merge +export type RunPropertiesComputers< + $Context extends Context, + $Items extends readonly [...PropertiesComputerTypeFunction[]] = $Context['properties']['$computedTypeFunctions'], + $Acc extends Properties = {}, +> = $Items extends readonly [ + infer $Head extends PropertiesComputerTypeFunction, + ...infer $Tail extends readonly PropertiesComputerTypeFunction[], +] ? RunPropertiesComputers<$Context, $Tail, $Acc & ($Head & { context: $Context })['return']> + : $Acc + +export type PropertiesComputer< + $Context extends Context = Context, + $Properties extends Properties = Properties, + $Configuration extends Configurator.Configuration = $Context['configuration'], +> = ( + parameters: { + configuration: $Configuration + context: $Context + client: Client<$Context> + }, +) => $Properties + +export const createPropertiesComputer = < + $Client extends Client_justContext, +>() => +< + $PropertiesComputer extends ( + parameters: { + configuration: $Client['_']['configuration'] + context: $Client['_'] + client: $Client + }, + ) => Properties, +>( + propertiesComputer: $PropertiesComputer, +) => propertiesComputer + +// ------------------------------------------------------------ +// Context Fragment +// ------------------------------------------------------------ + +export type Properties = object + +export interface ContextFragmentProperties { + readonly properties: { + readonly computed: ReadonlyArray + readonly static: Properties + readonly $computedTypeFunctions: ReadonlyArray + } +} + +export interface ContextFragmentPropertiesEmpty extends ContextFragmentProperties { + readonly properties: { + readonly computed: ReadonlyArray + readonly static: EmptyObject + readonly $computedTypeFunctions: EmptyArray + } +} +const contextFragmentPropertiesTypeLevel = undefinedAs< + Pick +>() + +export const contextFragmentPropertiesEmpty: ContextFragmentPropertiesEmpty = Object.freeze({ + properties: Object.freeze({ + static: emptyObject, + computed: emptyArray, + ...contextFragmentPropertiesTypeLevel, + }), +}) + +export type ContextFragmentAddProperties< + $Context extends Context, + $PropertiesStatic extends Properties, + $PropertiesComputerTypeFunctions extends readonly PropertiesComputerTypeFunction[], + __ = { + static: ObjectMergeShallow<$Context['properties']['static'], $PropertiesStatic> + $computedTypeFunctions: readonly [ + ...$Context['properties']['$computedTypeFunctions'], + ...$PropertiesComputerTypeFunctions, + ] + // passthrough + computed: $Context['properties']['computed'] + }, +> = __ + +// ------------------------------------------------------------ +// ContextReducer +// ------------------------------------------------------------ + +// type MethodArguments = Properties | PropertiesComputer + +export const contextFragmentPropertiesAdd = <$Context extends Context>( + context: $Context, + propertiesInput: { + static?: Properties + computed?: ReadonlyArray + }, +): null | ContextFragmentProperties => { + const isHasStatic = propertiesInput.static && !isObjectEmpty(propertiesInput.static) + const isHasComputed = propertiesInput.computed && propertiesInput.computed.length > 0 + if (!isHasStatic && !isHasComputed) return null + + const static_ = isHasStatic + ? Object.freeze({ + ...context.properties.static, + ...propertiesInput.static, + }) + : context.properties.static + + const computed = isHasComputed + ? [ + ...context.properties.computed, + ...propertiesInput.computed!, + ] + : context.properties.computed + + const properties = { + static: static_, + computed, + ...contextFragmentPropertiesTypeLevel, + } + return { properties } +} diff --git a/src/client/properties/request/request.test-d.ts b/src/client/properties/request/request.test-d.ts new file mode 100644 index 000000000..4eddf9604 --- /dev/null +++ b/src/client/properties/request/request.test-d.ts @@ -0,0 +1,98 @@ +import { + ATransport, + RequiredConfigurationTransportA, + RequiredConfigurationTransportB, +} from '../../../../tests/_/fixtures/transports.js' +import { g0 } from '../../../../tests/_/helpers.js' +import { assertType } from '../../../lib/assert-equal.js' +import type { Grafaid } from '../../../lib/grafaid/__.js' +import { undefinedAs } from '../../../lib/prelude.js' +import type { Configuration } from '../configuration/__.js' + +const g1 = g0.transport(ATransport) +const g2 = g0.transport(RequiredConfigurationTransportA).transport(RequiredConfigurationTransportB) + +type DData = { id: 0 } + +// +// +// + +// Not available if no transports registered +assertType(g0.gql) +// Not available if current transport not ready +assertType>(g2.gql) +// dprint-ignore +// ... Reflects name of currently selected transport +assertType>(g2.transport(RequiredConfigurationTransportB.name).gql) + +// +// +// + +const d2 = undefinedAs>() + +assertType(await g1.gql(d2).send()) +assertType(await g1.gql(d2).send({})) +assertType(await g1.gql(d2).send({ x: 0 })) +assertType(await g1.gql(d2).send({ x: 0 })) +// @ts-expect-error - wrong type +await g1.gql(d2).send({ filter: `wrong type` }) + +// +// +// + +const d3 = undefinedAs>() + +assertType(await g1.gql(d3).send({ x: 0 })) +// @ts-expect-error - missing argument +assertType(await g1.gql(d3).send({})) + +// +// +// + +// dprint-ignore +{ + // Return Type + + assertType(await g1.gql >``.send({ x: 1 })) + assertType(await g1.gql >``.send()) + assertType(await g1.gql >``.send({ x: 1 })) + assertType(await g1.gql >``.send()) + assertType(await g1.gql>``.send()) + assertType(await g1.gql>``.send({ x: 1 })) + assertType(await g1.gql>``.send(`abc`, { x: 1 })) + await g1.gql >`` + // @ts-expect-error - wrong argument type + .send({ x: 2 }) + + assertType(await g1.gql >``.send({ x: 1 })) + assertType(await g1.gql >``.send()) + assertType(await g1.gql >``.send({ x: 1 })) + assertType(await g1.gql >``.send()) + assertType(await g1.gql>``.send()) // eslint-disable-line + assertType(await g1.gql>``.send({ x: 1 })) // eslint-disable-line + assertType(await g1.gql>``.send(`abc`, { x: 1 })) // eslint-disable-line + await g1.gql >`` + // @ts-expect-error - wrong argument type + .send({ x: 2 }) + + assertType(await g1.gql >``.send({ x: 1 })) + assertType(await g1.gql >``.send()) + assertType(await g1.gql >``.send({ x: 1 })) + assertType(await g1.gql >``.send()) + assertType(await g1.gql>``.send()) // eslint-disable-line + assertType(await g1.gql>``.send({ x: 1 })) // eslint-disable-line + assertType(await g1.gql>``.send(`abc`, { x: 1 })) // eslint-disable-line + await g1.gql >`` + // @ts-expect-error - wrong argument type + .send({ x: 2 }) + + assertType(await g1.gql``.send()) + assertType(await g1.gql``.send(`foo`)) + assertType(await g1.gql``.send(`foo`, { x: 1 })) + assertType(await g1.gql``.send({ x: 1 })) + +} diff --git a/src/client/properties/request/request.test.ts b/src/client/properties/request/request.test.ts new file mode 100644 index 000000000..07f3891bf --- /dev/null +++ b/src/client/properties/request/request.test.ts @@ -0,0 +1,39 @@ +import { describe, expectTypeOf } from 'vitest' +import { ATransport } from '../../../../tests/_/fixtures/transports.js' +import { g0, test } from '../../../../tests/_/helpers.js' +// import { Spy } from '../../../../tests/_/SpyExtension.js' +import type { Grafaid } from '../../../lib/grafaid/__.js' +import { as } from '../../../lib/prelude.js' + +// todo test with custom scalars + +// describe(`memory transport`, () => { +// describe(`operationName`, () => { +// test(`undefined by default`, async ({ g0 }) => { +// await g0.use(Spy()).gql`query { id }`.send() +// expect(Spy.data.exchange.input).toMatchObject({ request: { operationName: undefined } }) +// }) +// test(`reflects explicit value`, async ({ g0 }) => { +// await g0.use(Spy()).gql`query foo { id }`.send(`foo`) +// expect(Spy.data.exchange.input).toMatchObject({ request: { operationName: `foo` } }) +// }) +// }) +// }) + +const g1 = g0.with({ output: { envelope: false } }).transport(ATransport) + +type d1ResultData = { id: 0 } + +const d1 = as>(``) + +describe(`given typed document node`, () => { + test(`returns typed result`, async () => { + const result = await g1.gql(d1).send() + expectTypeOf(result).toEqualTypeOf() + }) + test(`accepts no variables if none in TDN`, async () => { + await g1.gql(d1) + // @ts-expect-error + .send({}) + }) +}) diff --git a/src/client/properties/request/request.ts b/src/client/properties/request/request.ts new file mode 100644 index 000000000..920e6f545 --- /dev/null +++ b/src/client/properties/request/request.ts @@ -0,0 +1,24 @@ +import type { Grafaid } from '../../../lib/grafaid/__.js' +import { + isTemplateStringArguments, + joinTemplateStringArrayAndArgs, + type TemplateStringsArguments, +} from '../../../lib/template-string.js' +import { type DocumentController } from './send.js' + +// dprint-ignore +export interface GqlMethod<$Context> { + <$Document extends Grafaid.Document.Typed.TypedDocumentLike>(document: $Document ): DocumentController<$Context, $Document> + <$Document extends Grafaid.Document.Typed.TypedDocumentLike>(parts: TemplateStringsArray, ...args: unknown[]): DocumentController<$Context, $Document> + } + +export namespace GqlMethod { + export type Arguments = [Grafaid.Document.Typed.TypedDocumentLike] | TemplateStringsArguments + + export const normalizeArguments = (args: Arguments) => { + const document = isTemplateStringArguments(args) ? joinTemplateStringArrayAndArgs(args) : args[0] + return { + document, + } + } +} diff --git a/src/client/properties/gql/send.test-d.ts b/src/client/properties/request/send.test-d.ts similarity index 100% rename from src/client/properties/gql/send.test-d.ts rename to src/client/properties/request/send.test-d.ts diff --git a/src/client/properties/gql/send.ts b/src/client/properties/request/send.ts similarity index 84% rename from src/client/properties/gql/send.ts rename to src/client/properties/request/send.ts index 6bbea3615..72899162d 100644 --- a/src/client/properties/gql/send.ts +++ b/src/client/properties/request/send.ts @@ -1,6 +1,6 @@ import type { Grafaid } from '../../../lib/grafaid/__.js' import { isString, type SimplifyNullable } from '../../../lib/prelude.js' -import type { HandleOutput } from '../../handleOutput.js' +import type { HandleOutput } from '../output/handle.js' // dprint-ignore export type SendArguments<$TypedDocument extends string | Grafaid.Document.Typed.TypedDocumentLike> = @@ -63,20 +63,22 @@ export interface DocumentController<$Context, $TypedDocument extends Grafaid.Doc Promise>>> } -export type sendArgumentsImplementation = - | [] - | [string] - | [Grafaid.Document.Typed.Variables] - | [ - string, - Grafaid.Document.Typed.Variables, - ] +export namespace SendMethod { + export type Arguments = + | [] + | [string] + | [Grafaid.Document.Typed.Variables] + | [ + string, + Grafaid.Document.Typed.Variables, + ] -export const resolveSendArguments = (args: sendArgumentsImplementation) => { - const operationName = isString(args[0]) ? args[0] : undefined - const variables = isString(args[0]) ? args[1] : args[0] - return { - operationName, - variables, + export const normalizeArguments = (args: Arguments) => { + const operationName = isString(args[0]) ? args[0] : undefined + const variables = isString(args[0]) ? args[1] : args[0] + return { + operationName, + variables, + } } } diff --git a/src/client/properties/requestInterceptors/__.ts b/src/client/properties/requestInterceptors/__.ts new file mode 100644 index 000000000..8eb8e10d7 --- /dev/null +++ b/src/client/properties/requestInterceptors/__.ts @@ -0,0 +1 @@ +export * as RequestInterceptors from './requestInterceptors.js' diff --git a/src/client/properties/requestInterceptors/requestInterceptors.test.ts b/src/client/properties/requestInterceptors/requestInterceptors.test.ts new file mode 100644 index 000000000..bf667be5f --- /dev/null +++ b/src/client/properties/requestInterceptors/requestInterceptors.test.ts @@ -0,0 +1,89 @@ +import { expect, expectTypeOf } from 'vitest' +import { ATransport, BTransport } from '../../../../tests/_/fixtures/transports.js' +import { g0, test } from '../../../../tests/_/helpers.js' +import { createInterceptor } from './requestInterceptors.js' + +const g1 = g0.transport(ATransport) + +test(`can add a request interceptor`, () => { + const i1 = createInterceptor(async ({ pack }) => { + return pack() + }) + const g2 = g1.anyware(i1) + expect(g2._.requestPipelineInterceptors).toEqual([i1]) + // Does NOT affect context type. + expectTypeOf(g2._.requestPipelineInterceptors).toEqualTypeOf(g1._.requestPipelineInterceptors) +}) + +test(`hook inputs have transportType in interceptor`, async () => { + let transportType + const g2 = g1.anyware(({ pack }) => { + expectTypeOf(pack.input.transportType).toEqualTypeOf() + transportType = pack.input.transportType + return pack() + }) + await g2.gql(`query { foo }`).send() + expect(transportType).toEqual(ATransport.name) +}) + +test(`if two transports, then transportType could be either`, async () => { + let value + const g2 = g1.transport(BTransport).anyware(({ pack }) => { + expectTypeOf(pack.input.transportType).toEqualTypeOf() + value = pack.input.transportType + return pack() + }) + await g2.gql(`query { foo }`).send() + expect(value).toEqual(ATransport.name) + await g2.transport(`BTransport`).gql(`query { foo }`).send() + expect(value).toEqual(BTransport.name) +}) + +// describe(`entrypoint pack`, () => { +// test(`can add header`, async ({ fetch }) => { +// fetch.mockImplementationOnce(async (input) => { +// expect(input.headers.get('x-foo')).toEqual(headers['x-foo']) +// return createResponse({ data: { id: db.id } }) +// }) +// const graffle2 = graffle.anyware(async ({ pack }) => { +// if (pack.input.transportType !== `http`) return pack() +// return pack({ input: { ...pack.input, headers } }) +// }) +// const result = await graffle2.query.id() +// expect(result).toEqual(db.id) +// }) +// test('can chain into exchange', async ({ fetch }) => { +// fetch.mockImplementationOnce(async () => { +// return createResponse({ data: { id: db.id } }) +// }) +// const client2 = graffle.anyware(async ({ pack }) => { +// if (pack.input.transportType !== `http`) return pack() +// const { exchange } = await pack({ input: { ...pack.input, headers } }) +// return exchange({ input: exchange.input }) +// }) +// expect(await client2.query.id()).toEqual(db.id) +// }) +// }) + +// // test('can retry failed request', async ({ fetch }) => { +// // fetch +// // .mockImplementationOnce(async () => { +// // throw oops +// // }) +// // .mockImplementationOnce(async () => { +// // throw oops +// // }) +// // .mockImplementationOnce(async () => { +// // return createResponse({ data: { id: db.id } }) +// // }) +// // const client2 = client.retry(async ({ exchange }) => { +// // let result = await exchange() +// // while (result instanceof Error) { +// // result = await exchange() +// // } +// // return result +// // }) +// // const result = await client2.query.id() +// // expect(result).toEqual(db.id) +// // expect(fetch.mock.calls.length).toEqual(3) +// // }) diff --git a/src/client/properties/requestInterceptors/requestInterceptors.ts b/src/client/properties/requestInterceptors/requestInterceptors.ts new file mode 100644 index 000000000..aebb92dc7 --- /dev/null +++ b/src/client/properties/requestInterceptors/requestInterceptors.ts @@ -0,0 +1,44 @@ +import type { Anyware } from '../../../lib/anyware/_namespace.js' +import { emptyArray } from '../../../lib/prelude.js' +import type { RequestPipeline } from '../../../requestPipeline/RequestPipeline.js' +import type { Context } from '../../../types/context.js' +import type { Client_justContext } from '../../client.js' + +// ------------------------------------------------------------ +// Context Fragment +// ------------------------------------------------------------ + +export interface ContextFragmentRequestInterceptors { + readonly requestPipelineInterceptors: readonly RequestPipeline.BaseInterceptor[] +} + +export interface ContextFragmentRequestInterceptorsEmpty extends ContextFragmentRequestInterceptors { + readonly requestPipelineInterceptors: readonly RequestPipeline.BaseInterceptor[] +} + +export const contextFragmentRequestInterceptorsEmpty: ContextFragmentRequestInterceptorsEmpty = { + requestPipelineInterceptors: emptyArray, +} + +export const contextFragmentRequestInterceptorsAdd = ( + context: Context, + interceptor: RequestPipeline.BaseInterceptor, +): ContextFragmentRequestInterceptors => { + const newContextFragment = { + requestPipelineInterceptors: Object.freeze([ + ...context.requestPipelineInterceptors, + interceptor, + ]), + } + return newContextFragment +} + +// ------------------------------------------------------------ +// Helpers +// ------------------------------------------------------------ + +export const createInterceptor = <$Client extends Client_justContext = Client_justContext>( + interceptor: Anyware.Interceptor.InferFromPipeline< + Anyware.Pipeline.InferFromDefinition<$Client['_']['requestPipelineDefinition']> + >, +) => interceptor diff --git a/src/client/properties/retry.ts b/src/client/properties/retry.ts deleted file mode 100644 index d2b75ae04..000000000 --- a/src/client/properties/retry.ts +++ /dev/null @@ -1,24 +0,0 @@ -// import type { Anyware } from '../../../lib/anyware/__.js' -// import type { Chain } from '../../../lib/chain/__.js' -// import type { RequestPipeline } from '../../../requestPipeline/__.js' -// import { defineProperties, type FnParametersProperty } from '../fluent.js' - -// export interface FnRetry extends Chain.Extension<`retry`> { -// // @ts-expect-error untyped params -// return: Retry -// } - -// export interface Retry<$Args extends FnParametersProperty> { -// /** -// * TODO Retry Docs. -// */ -// (extension: Anyware.Extension2): Chain.IncrementNothing<$Args> -// } - -// export const retryProperties = defineProperties((builder, state) => { -// return { -// retry: (anyware: Anyware.Extension2) => { -// return builder({ ...state, retry: anyware }) -// }, -// } -// }) diff --git a/src/client/properties/scalar.test-d.ts b/src/client/properties/scalar.test-d.ts deleted file mode 100644 index ceff5a8b8..000000000 --- a/src/client/properties/scalar.test-d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { DateScalar, FooScalar } from '../../../tests/_/fixtures/scalars.js' -import { schemaMap } from '../../../tests/_/schemas/kitchen-sink/graffle/__.js' -import { Graffle } from '../../entrypoints/__Graffle.js' -import { assertEqual } from '../../lib/assert-equal.js' -import { _, type SomeFunction } from '../../lib/prelude.js' -import type { TypeErrorMissingSchemaMap } from './scalar.js' - -const g1 = Graffle.create() -assertEqual() - -const g2 = Graffle.create({ schemaMap }) -assertEqual() - -g2._.checkPreflight - -// @ts-expect-error "Foo" is not a scalar name in the schema. -Graffle.create({ schemaMap }).scalar(`Foo`, _) -// @ts-expect-error "Foo" is not a scalar name in the schema. -Graffle.create({ schemaMap }).scalar(FooScalar) -Graffle.create({ schemaMap }).scalar(`Date`, _) -Graffle.create({ schemaMap }).scalar(`Int`, _) -{ - const graffle = Graffle.create({ schemaMap }).scalar(DateScalar) - assertEqual< - typeof graffle._.scalars, - { typesDecoded: Date; typesEncoded: string; map: { Date: typeof DateScalar } } - >() -} diff --git a/src/client/properties/scalar.ts b/src/client/properties/scalar.ts deleted file mode 100644 index 09cca4535..000000000 --- a/src/client/properties/scalar.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { type Context } from '../../types/context.js' -import type { GlobalRegistry } from '../../types/GlobalRegistry/GlobalRegistry.js' -import { Schema } from '../../types/Schema/__.js' -import type { Client } from '../client.js' -import { createProperties } from '../helpers.js' - -export type TypeErrorMissingSchemaMap = - `Error: Your client must have a schemaMap in order to apply registered scalars. Therefore we're providing this static error type message here instead of allowing you continue registering scalars that will never be applied.` - -export type ScalarMethod< - $Context extends Context, - out $Extension extends object, -> // out $ExtensionChainable extends ExtensionChainableRegistry, - = { - /** - * TODO Docs. - */ - < - $Name extends GlobalRegistry.GetOrGeneric<$Context['name']>['schema']['scalarNamesUnion'], - $Decoded, - >( - name: $Name, - $Codec: { - decode: (value: string) => $Decoded - encode: (value: $Decoded) => string - }, - ): Client< - { - [_ in keyof $Context]: _ extends 'scalars' ? { - map: $Context[_]['map'] & { [_ in $Name]: Schema.Scalar<$Name, $Decoded, string> } - typesEncoded: $Context[_]['typesEncoded'] | string - typesDecoded: $Context[_]['typesDecoded'] | $Decoded - } - : $Context[_] - }, - $Extension - > // $ExtensionChainable - - <$Scalar extends Schema.Scalar['schema']['scalarNamesUnion']>>( - scalar: $Scalar, - ): Client< - { - [_ in keyof $Context]: _ extends 'scalars' ? { - map: $Context[_]['map'] & { [_ in $Scalar['name']]: $Scalar } - typesEncoded: $Context[_]['typesEncoded'] | Schema.Scalar.GetEncoded<$Scalar> - typesDecoded: $Context[_]['typesDecoded'] | Schema.Scalar.GetDecoded<$Scalar> - } - : $Context[_] - }, - $Extension - > // $ExtensionChainable -} - -// todo review if really needed for keeping type instance count low v -// We do not use this above to reduce type instance count -export type AddScalar<$Context extends Context, $Scalar extends Schema.Scalar> = { - [_ in keyof $Context]: _ extends 'scalars' ? { - map: $Context[_]['map'] & { [_ in $Scalar['name']]: $Scalar } - typesEncoded: $Context[_]['typesEncoded'] | Schema.Scalar.GetEncoded<$Scalar> - typesDecoded: $Context[_]['typesDecoded'] | Schema.Scalar.GetDecoded<$Scalar> - } - : $Context[_] -} - -type Arguments = [Schema.Scalar] | [string, { decode: (value: string) => any; encode: (value: any) => string }] - -export const scalarProperties = createProperties((builder, state) => { - return { - scalar: (...args: Arguments) => { - const scalar = Schema.Scalar.isScalar(args[0]) - ? args[0] - : Schema.Scalar.create(args[0], args[1]!) - - return builder({ - ...state, - scalars: { - ...state.scalars, - map: { - ...state.scalars.map, - [scalar.name]: scalar, - }, - }, - }) - }, - } as any -}) diff --git a/src/client/properties/scalars/__.ts b/src/client/properties/scalars/__.ts new file mode 100644 index 000000000..d24eaccb1 --- /dev/null +++ b/src/client/properties/scalars/__.ts @@ -0,0 +1 @@ +export * as Scalars from './scalars.js' diff --git a/src/client/properties/scalars/scalars.test.ts b/src/client/properties/scalars/scalars.test.ts new file mode 100644 index 000000000..61ba4ab8b --- /dev/null +++ b/src/client/properties/scalars/scalars.test.ts @@ -0,0 +1,66 @@ +import { expect, expectTypeOf } from 'vitest' +import { AScalar, BScalar } from '../../../../tests/_/fixtures/scalars.js' +import { g0, test } from '../../../../tests/_/helpers.js' +import { Context, type GlobalRegistry } from '../../../entrypoints/utilities-for-generated.js' +import type { Schema } from '../../../types/Schema/__.js' +import type { SchemaDrivenDataMap } from '../../../types/SchemaDrivenDataMap/__.js' +import type { Scalars } from './__.js' + +declare global { + namespace GraffleGlobal { + interface Clients { + TestAddScalar: GlobalRegistry.Client.Define<{ + schema: Schema.Define<{ + scalarNamesUnion: 'A' + scalars: { + A: Schema.Scalar<'A', bigint, string> + } + }> + }> + } + } +} + +const map = {} as SchemaDrivenDataMap + +const g1 = g0.with({ schema: { map, name: `TestAddScalar` } }) + +test(`context scalars begin empty`, ({ g0 }) => { + expect(g0._.scalars).toEqual(Context.States.empty.scalars) +}) + +test(`method not available when no schema map `, ({ g0 }) => { + expectTypeOf(g0.scalar).toEqualTypeOf() +}) + +test(`method is available when there is a schema map `, () => { + expectTypeOf(g1.scalar).toMatchTypeOf>() +}) + +test(`can pass an inline scalar definition`, () => { + const codec = AScalar.codec + const g3 = g1.scalar(`A`, codec) + expect(g3._.scalars.map).toEqual({ A: AScalar }) + expectTypeOf(g3._.scalars).toMatchTypeOf<{ + map: { A: AScalar } + typesDecoded: bigint + typesEncoded: string + }>() +}) + +test(`can pass a scalar definition`, () => { + const g3 = g1.scalar(AScalar) + expect(g3._.scalars.map).toEqual({ A: AScalar }) + expectTypeOf(g3._.scalars).toMatchTypeOf<{ + map: { A: AScalar } + typesDecoded: bigint + typesEncoded: string + }>() +}) + +test(`scalar name must match a scalar from the schema`, () => { + // @ts-expect-error + g1.scalar(`B`, {} as any) + // @ts-expect-error + g1.scalar(BScalar) +}) diff --git a/src/client/properties/scalars/scalars.ts b/src/client/properties/scalars/scalars.ts new file mode 100644 index 000000000..587ff9993 --- /dev/null +++ b/src/client/properties/scalars/scalars.ts @@ -0,0 +1,84 @@ +import { type Context } from '../../../types/context.js' +import type { GlobalRegistry } from '../../../types/GlobalRegistry/GlobalRegistry.js' +import { Schema } from '../../../types/Schema/__.js' +import type { Client } from '../../client.js' + +// ------------------------------------------------------------ +// Method +// ------------------------------------------------------------ + +export interface Method< + $Context extends Context, + // Variables + _Schema extends GlobalRegistry.GetOrGeneric< + $Context['configuration']['schema']['current']['name'] + >['schema'] = GlobalRegistry.GetOrGeneric< + $Context['configuration']['schema']['current']['name'] + >['schema'], +> { + /** + * TODO Docs. + */ + <$Name extends _Schema['scalarNamesUnion'], $Decoded>( + name: $Name, + $Codec: { + decode: (value: string) => $Decoded + encode: (value: $Decoded) => string + }, + ): Client>> + <$Scalar extends Schema.Scalar<_Schema['scalarNamesUnion']>>( + scalar: $Scalar, + ): Client> +} + +export namespace Method { + export type Arguments = [Schema.Scalar] | [string, { decode: (value: string) => any; encode: (value: any) => string }] + export const normalizeArguments = (args: Arguments): Schema.Scalar => { + if (typeof args[0] === `string`) return Schema.Scalar.create(args[0], args[1]!) + return args[0] + } + + export type TypeErrorMissingSchemaMap = + `Error: Your client must have a schemaMap in order to apply registered scalars. Therefore we're providing this static error type message here instead of allowing you continue registering scalars that will never be applied.` +} + +// ------------------------------------------------------------ +// Context Fragment +// ------------------------------------------------------------ + +export interface ContextFragment { + readonly scalars: Schema.Scalar.Registry +} + +export interface ContextFragmentEmpty extends ContextFragment { + readonly scalars: Schema.Scalar.Registry.Empty +} + +export const contextFragmentScalarsEmpty: ContextFragmentEmpty = { + scalars: Schema.Scalar.Registry.empty, +} + +export type ContextAdd< + $Context extends Context, + $Scalar extends Schema.Scalar, + __scalars = { + map: $Context['scalars']['map'] & { [_ in $Scalar['name']]: $Scalar } + typesEncoded: $Context['scalars']['typesEncoded'] | $Scalar['codec']['_typeEncoded'] + typesDecoded: $Context['scalars']['typesDecoded'] | $Scalar['codec']['_typeDecoded'] + }, + __ = { [_ in keyof $Context]: _ extends 'scalars' ? __scalars : $Context[_] }, +> = __ + +export const contextScalarsAdd = (context: Context, scalar: Schema.Scalar): ContextFragment => { + const scalars = Object.freeze({ + ...context.scalars, + map: Object.freeze({ + ...context.scalars.map, + [scalar.name]: scalar, + }), + }) + const fragment = { + scalars, + } + return fragment +} diff --git a/src/client/properties/schema/__.ts b/src/client/properties/schema/__.ts new file mode 100644 index 000000000..f20930835 --- /dev/null +++ b/src/client/properties/schema/__.ts @@ -0,0 +1 @@ +export * as Schema from './schema.js' diff --git a/src/client/properties/schema/configuration.ts b/src/client/properties/schema/configuration.ts new file mode 100644 index 000000000..d88716cbf --- /dev/null +++ b/src/client/properties/schema/configuration.ts @@ -0,0 +1,33 @@ +import { Configurator as C } from '../../../lib/configurator/configurator.js' +import { GlobalRegistry } from '../../../types/GlobalRegistry/GlobalRegistry.js' +import type { SchemaDrivenDataMap } from '../../../types/SchemaDrivenDataMap/__.js' + +/** + * @remarks This input extends base with properties that can be filled with exports from the generated client. + */ +export interface Input { + /** + * The generated client to use. + * + * @defaultValue 'default' + */ + name?: GlobalRegistry.Client['name'] + /** + * todo + */ + map?: SchemaDrivenDataMap +} + +export const configurator = C() + .input() + .normalized<{ + name: GlobalRegistry.Client['name'] + map: SchemaDrivenDataMap | undefined + }>() + .default({ + name: GlobalRegistry.defaultClientName, + map: undefined, + }) + .return() + +export type Configurator = typeof configurator diff --git a/src/client/properties/schema/schema.ts b/src/client/properties/schema/schema.ts new file mode 100644 index 000000000..36026a25c --- /dev/null +++ b/src/client/properties/schema/schema.ts @@ -0,0 +1 @@ +export * from './configuration.js' diff --git a/src/client/properties/transport.ts b/src/client/properties/transport.ts deleted file mode 100644 index 34f6fb798..000000000 --- a/src/client/properties/transport.ts +++ /dev/null @@ -1,149 +0,0 @@ -import type { PartialOrUndefined } from '../../lib/prelude.js' -import type { ClientTransports, ClientTransportsConfiguration } from '../../types/context.js' -import { type Context } from '../../types/context.js' -import type { Client } from '../client.js' -import { createProperties } from '../helpers.js' - -// dprint-ignore -export type TransportMethod< - $Context extends Context, - $Extension extends object -> = - $Context['transports'] extends ClientTransports.States.NonEmpty - ? { - /** - * Configure the current transport. - * TODO - */ - > - (config: config): - Client< - { - [_ in keyof $Context]: - _ extends 'transports' - ? { - registry: $Context['transports']['registry'] - current: $Context['transports']['current'] - configurations: - keyof config extends never - ? $Context['transports']['configurations'] - : { - [configKey in keyof $Context['transports']['configurations']]: - configKey extends $Context['transports']['current'] - // configuration contains a PARTIAL of configuration. - // therefore we have to & the given config, since it may add NEW keys - ? { - [configValueKey in keyof $Context['transports']['configurations'][configKey]]: - configValueKey extends keyof config - ? unknown - : $Context['transports']['configurations'][configKey][configValueKey] - } & config - : $Context['transports']['configurations'][configKey] - } - } - : $Context[_] - }, - $Extension - > - /** - * Set the current Transport, selected from amongst the registered ones, and optionally change its configuration. - * TODO - */ - < - name extends ClientTransports.GetNames<$Context['transports']>, - config extends undefined | $Context['transports']['registry'][name]['config'] = undefined - > - (name: name, config?: config): - Client< - { - [_ in keyof $Context]: - _ extends 'transports' - ? { - registry: $Context['transports']['registry'] - current: name - configurations: keyof config extends never - ? $Context['transports']['configurations'] - : { - [configKey in keyof $Context['transports']['configurations']]: - configKey extends name - ? - { - [configValueKey in keyof $Context['transports']['configurations'][configKey]]: - configValueKey extends keyof config - ? unknown - : $Context['transports']['configurations'][configKey][configValueKey] - } & config - & {debug:config} - : $Context['transports']['configurations'][configKey] - } - } - : $Context[_] - }, - $Extension - > - } - : never - -export const transportProperties = createProperties((builder, state) => { - return { - transport: (...args: [config: object] | [transportName: string, config?: object]) => { - const transportName = typeof args[0] === `string` ? args[0] : state.transports.current - const transportConfig = (typeof args[0] === `string` ? args[1] : args[0]) ?? {} - if (!transportName) { - throw new Error(`No transport is currently set.`) - } - const newContext = reducerTransportConfig(state, transportName, transportConfig) - return builder(newContext) - }, - } as any -}) - -const reducerTransportConfig = ( - state: Context, - transportName: string, - config: ClientTransportsConfiguration, -): Context => { - const newConfiguration = { - ...state.transports.configurations[transportName] ?? {}, - ...config, - } - - // hack: transport need to provide this function - if (transportName === `http`) { - // @ts-expect-error - if (config.headers) { - // @ts-expect-error - newConfiguration.headers = { - // @ts-expect-error - ...state.transports.configurations[transportName]?.headers, - // @ts-expect-error - ...config.headers, - } - } - } - - if (transportName === `memory`) { - // @ts-expect-error - if (config.resolverValues?.context) { - // @ts-expect-error - newConfiguration.resolverValues.context = config.resolverValues.context - } - // @ts-expect-error - if (config.resolverValues?.root) { - // @ts-expect-error - newConfiguration.resolverValues.root = config.resolverValues.root - } - } - - return { - ...state, - transports: { - ...state.transports, - current: transportName, - configurations: { - ...state.transports.configurations, - [transportName]: newConfiguration, - }, - }, - } -} diff --git a/src/client/properties/transports/__.ts b/src/client/properties/transports/__.ts new file mode 100644 index 000000000..fcd241e0a --- /dev/null +++ b/src/client/properties/transports/__.ts @@ -0,0 +1 @@ +export * as Transports from './transports.js' diff --git a/src/client/properties/transports/dataType.ts b/src/client/properties/transports/dataType.ts new file mode 100644 index 000000000..e15a41ffc --- /dev/null +++ b/src/client/properties/transports/dataType.ts @@ -0,0 +1,170 @@ +import type { Anyware } from '../../../lib/anyware/_namespace.js' +import { Configurator } from '../../../lib/configurator/configurator.js' +import type { RequestPipeline } from '../../../requestPipeline/__.js' + +export interface Transport< + $Name extends string = string, + $Configurator extends Configurator = Configurator, + $Pack extends Anyware.StepDefinition<'pack'> = Anyware.StepDefinition<'pack'>, + $Exchange extends Anyware.StepDefinition<'exchange'> = Anyware.StepDefinition<'exchange'>, + $Unpack extends Anyware.StepDefinition<'unpack'> = Anyware.StepDefinition<'unpack'>, +> extends Anyware.Overload.Data { + discriminant: { + name: 'transportType' + value: $Name + } + [TypeSymbol]: true + name: $Name + configurator: $Configurator + configurationMount: 'transport' + steps: { + pack: $Pack + exchange: $Exchange + unpack: $Unpack + } +} +const TypeSymbol = Symbol(`Transport`) + +const BuilderTypeSymbol = Symbol(`TransportBuilder`) + +export const Transport = <$Name extends string>( + name: $Name, +): Transport.Builder.States.Empty<$Name> => { + const transport: Transport = { + [TypeSymbol]: true, + name, + discriminant: { + name: `transportType`, + value: name, + }, + steps: {}, + configurator: Configurator.$.empty, + configurationMount: `transport`, + } as any + return Transport_(transport) as any +} + +export namespace $ { + export const is = (value: any): value is Transport => { + return typeof value === `object` && value !== null && value[TypeSymbol] === true + } + export const isBuilder = (value: any): value is Transport.Builder => { + return typeof value === `object` && value !== null && value[BuilderTypeSymbol] === true + } +} + +Transport.$ = $ + +const Transport_ = ( + transport: Transport, +): Transport.Builder => { + const stepMethod = (name: string) => (step: Transport.Builder.StepMethodParameters) => { + const stepDefinition = { + slots: {}, + name, + ...step, + ...({} as Anyware.StepDefinition.SubsetTypeProperties), + } + const newOverload = { + ...transport, + steps: { + ...transport.steps, + [name]: stepDefinition, + }, + } + return Transport_(newOverload) as any + } + const builder: Transport.Builder = { + [BuilderTypeSymbol]: true, + configurator: (configuratorTypeInput) => { + const newTransport = { + ...transport, + configurator: Configurator.$.normalizeDataInput(configuratorTypeInput as any), + } + return Transport_(newTransport) as any + }, + exchange: stepMethod(`exchange`), + pack: stepMethod(`pack`), + unpack: stepMethod(`unpack`), + return: () => transport, + } + return builder as any +} + +export namespace Transport { + // dprint-ignore + export interface Builder<$TransportProgressive extends Transport> { + [BuilderTypeSymbol]: true + /** + * TODO + */ + configurator: <$Configurator extends Configurator>( + input: Configurator.BuilderProviderCallback<$Configurator> | Configurator.Builder<$Configurator> | $Configurator, + ) => Builder> + /** + * TODO + */ + pack: < + $Input = $TransportProgressive['configurator']['normalized'] & RequestPipeline.PackInput, + $Output = {}, + $Slots extends Anyware.StepDefinition.Slots = {} + >(step: Builder.StepMethodParameters<$Input, $Output, $Slots>) => Builder + >> + /** + * TODO + */ + exchange: < + $Input = $TransportProgressive['configurator']['normalized'] & Awaited<$TransportProgressive['steps']['pack']['output']>, + $Output = {}, + $Slots extends Anyware.StepDefinition.Slots = {} + >(step: Builder.StepMethodParameters<$Input, $Output, $Slots>) => Builder + >> + /** + * TODO + */ + unpack: < + $Input = $TransportProgressive['configurator']['normalized'] & Awaited<$TransportProgressive['steps']['exchange']['output']>, + $Output = {}, + $Slots extends Anyware.StepDefinition.Slots = {} + >(step: Builder.StepMethodParameters<$Input, $Output, $Slots>) => Builder + >> + /** + * TODO + */ + return: () => $TransportProgressive + } + + export namespace Builder { + export type GetTypeSymbol<$Builder extends Builder> = $Builder[typeof BuilderTypeSymbol] + + export interface StepMethodParameters< + $Input = any, + $Output = any, + $Slots extends Anyware.StepDefinition.Slots = {}, + > { + run: ( + input: $Input, + slots: $Slots, + ) => $Output + slots?: $Slots + } + export namespace States { + export type Empty<$Name extends string> = Builder> + } + } +} diff --git a/src/client/properties/transports/transports.test.ts b/src/client/properties/transports/transports.test.ts new file mode 100644 index 000000000..13f964f8a --- /dev/null +++ b/src/client/properties/transports/transports.test.ts @@ -0,0 +1,187 @@ +import { describe, expect, expectTypeOf } from 'vitest' +import { ATransport, ATransportBuilder, BTransport } from '../../../../tests/_/fixtures/transports.js' +import { test } from '../../../../tests/_/helpers.js' +import { Context } from '../../../types/context.js' +import { create } from '../../client.js' +import { type ContextFragmentTransportsEmpty, contextFragmentTransportsEmpty } from './transports.js' + +const g1 = create().transport(ATransport) +const g2 = create().transport(ATransport).transport(BTransport) + +describe(`starting state`, () => { + test(`no transports registered`, ({ g0 }) => { + expectTypeOf(g0._.transports).toMatchTypeOf() + expectTypeOf(g0._.requestPipelineDefinition.overloads).toMatchTypeOf< + Context.States.Empty['requestPipelineDefinition']['overloads'] + >() + expect(g0._.transports).toBe(contextFragmentTransportsEmpty.transports) + expect(g0._.requestPipelineDefinition.overloads).toBe(Context.States.empty.requestPipelineDefinition.overloads) + }) + + // dprint-ignore + test(`no transport method overloads b/c no transports registered`, ({ g0 }) => { + // @ts-expect-error + expect(() => g0.transport(`wrong`)).toThrowErrorMatchingInlineSnapshot(`[Error: Unknown transport: wrong]`) + // @ts-expect-error + expect(() => g0.transport(`wrong`, {})).toThrowErrorMatchingInlineSnapshot(`[Error: Unknown transport: wrong]`) + // @ts-expect-error + expect(() => g0.transport({})).toThrowErrorMatchingInlineSnapshot(`[Error: No transport is currently set.]`) + }) +}) + +describe(`registering first transport`, () => { + test(`by giving a transport`, ({ g0 }) => { + const g1 = g0.transport(ATransportBuilder) + expectTypeOf(g1._.transports).toMatchTypeOf<{ + current: ATransport['name'] + configurations: { + ATransport: ATransport['configurator']['default'] + } + registry: { + ATransport: ATransport + } + }>() + expect(g1._.transports).toEqual({ + current: ATransport[`name`], + configurations: { + ATransport: ATransport[`configurator`][`default`], + }, + registry: { + ATransport: ATransport, + }, + }) + expectTypeOf(g1._.requestPipelineDefinition.overloads).toMatchTypeOf< + readonly [ATransport] + >() + expect(g1._.requestPipelineDefinition.overloads).toEqual([ATransport]) + }) + + test(`by giving a transport builder`, ({ g0 }) => { + // We infer correctness by checking that giving builder matches results of giving transport, + // which was tested above. + const g1a = g0.transport(ATransportBuilder) + const g1b = g0.transport(ATransport) + expectTypeOf(g1a._.transports).toEqualTypeOf(g1b._.transports) + expectTypeOf(g1a._.requestPipelineDefinition.overloads).toEqualTypeOf(g1b._.requestPipelineDefinition.overloads) + expect(g1a._.transports).toEqual(g1b._.transports) + expect(g1a._.requestPipelineDefinition.overloads).toEqual(g1b._.requestPipelineDefinition.overloads) + }) +}) + +describe(`registering second transport`, () => { + test(`does not become current`, () => { + const g3 = g1.transport(BTransport) + expectTypeOf(g3._.transports).toMatchTypeOf<{ + current: ATransport['name'] + configurations: { + ATransport: ATransport['configurator']['default'] + BTransport: BTransport['configurator']['default'] + } + registry: { + ATransport: ATransport + BTransport: BTransport + } + }>() + expect(g3._.transports).toEqual({ + current: ATransport[`name`], + configurations: { + ATransport: ATransport[`configurator`][`default`], + BTransport: BTransport[`configurator`][`default`], + }, + registry: { + ATransport: ATransport, + BTransport: BTransport, + }, + }) + }) + test(`error if name is same as an already registered transport`, ({ g0 }) => { + expect(() => { + // @ts-expect-error + g0.transport(ATransport).transport(ATransport) + }).toThrowErrorMatchingInlineSnapshot( + `[Error: There is already a transport registered with the name "ATransport".]`, + ) + expect(() => { + // @ts-expect-error + g0.transport(ATransportBuilder).transport(ATransportBuilder) + }).toThrowErrorMatchingInlineSnapshot( + `[Error: There is already a transport registered with the name "ATransport".]`, + ) + }) +}) + +describe(`selecting transport`, () => { + describe(`given current`, () => { + describe(`without configuration -> no-op`, () => { + test(`no configuration`, () => { + const g2 = g1.transport(ATransport.name) + expect(g2).toBe(g1) + expectTypeOf(g2._).toEqualTypeOf(g1._) + }) + test(`empty configuration`, () => { + const g2 = g1.transport(ATransport.name, {}) + expect(g2).toBe(g1) + expectTypeOf(g2._).toEqualTypeOf(g1._) + }) + test(`undefined configuration`, () => { + const g2 = g1.transport(ATransport.name, undefined) + expect(g2).toBe(g1) + expectTypeOf(g2._).toEqualTypeOf(g1._) + }) + }) + test(`with configuration configures current`, () => { + const g2 = g1.transport(ATransport.name, { a: 1 }) + expect(g2._.transports.configurations.ATransport).toEqual({ a: 1 }) + expectTypeOf(g2._.transports.configurations.ATransport).toMatchTypeOf<{ a: 1 }>() + }) + }) + describe(`given different`, () => { + test(`without configuration -> changes current without altering its configuration`, () => { + // Sanity check that current is not BTransport to begin with + expect(g2._.transports.current).toBe(ATransport.name) + expectTypeOf(g2._.transports.current).toEqualTypeOf() + // Current is changed to BTransport + const g3 = g2.transport(BTransport.name) + expect(g3._.transports.current).toBe(BTransport.name) + expectTypeOf(g3._.transports.current).toEqualTypeOf() + // Configuration is unchanged + expect(g3._.transports.configurations.ATransport).toEqual(g2._.transports.configurations.ATransport) + }) + test(`with configuration -> changes current + alters configuration`, () => { + // Sanity check that BTransport configuration is not set to begin with + expect(g2._.transports.configurations.BTransport).toEqual({}) + expectTypeOf(g2._.transports.configurations.BTransport).toMatchTypeOf<{}>() + // Current is changed to BTransport + const g3 = g2.transport(BTransport.name, { b: `1` }) + expect(g3._.transports.current).toBe(BTransport.name) + expectTypeOf(g3._.transports.current).toEqualTypeOf() + // Configuration is altered + expect(g3._.transports.configurations.BTransport).toEqual({ b: `1` }) + expectTypeOf(g3._.transports.configurations.BTransport).toMatchTypeOf<{ b: '1' }>() + }) + }) + + test(`name must match a registered transport; configuration must match its configurator input`, () => { + expect(() => + // @ts-expect-error + g1.transport(`wrong`) + ).toThrowErrorMatchingInlineSnapshot(`[Error: Unknown transport: wrong]`) + g1.transport(`ATransport`, { + // @ts-expect-error + wrong: true, + }) + }) +}) + +describe(`configuring current transport`, () => { + test(`given empty -> no-op`, () => { + const g2 = g1.transport({}) + expect(g2).toBe(g1) + expectTypeOf(g2._).toEqualTypeOf(g1._) + }) + test(`given non-empty -> changes configuration`, () => { + const g2 = g1.transport({ a: 99 }) + expect(g2._.transports.configurations.ATransport).toEqual({ a: 99 }) + expectTypeOf(g2._.transports.configurations.ATransport).toMatchTypeOf<{ a: 99 }>() + }) +}) diff --git a/src/client/properties/transports/transports.ts b/src/client/properties/transports/transports.ts new file mode 100644 index 000000000..90cbceabf --- /dev/null +++ b/src/client/properties/transports/transports.ts @@ -0,0 +1,363 @@ +import type { Anyware } from '../../../lib/anyware/_namespace.js' +import type { Configurator } from '../../../lib/configurator/configurator.js' +import { type EmptyObject, emptyObject, isObjectEmpty, type Objekt, type StringKeyof } from '../../../lib/prelude.js' +import type { RequestPipeline } from '../../../requestPipeline/RequestPipeline.js' +import { requestPipelineBaseDefinition } from '../../../requestPipeline/RequestPipeline.js' +import { type Context } from '../../../types/context.js' +import type { Client } from '../../client.js' +import { Transport } from './dataType.js' + +// todo remove the JSDoc comments below. They will not be shown. +// Look for a TS issue about conditional types + JSDoc comments. If none, create one. + +// ------------------------------------------------------------ +// Method +// ------------------------------------------------------------ + +type AlreadyRegisteredError< + $TransportName extends string, +> = `There is already a transport registered with the name "${$TransportName}".` + +// dprint-ignore +export type ParameterGuardTransportAlreadyRegistered<$Context extends Context, $Transport extends Transport> = + $Transport['name'] extends keyof $Context['transports']['registry'] ? + [`Error: ${AlreadyRegisteredError<$Transport['name']>}`] : + [] + +// dprint-ignore +export type TransportMethod< + $Context extends Context, +> = + & ( + ( + transport: transport | Transport.Builder, + ...errors: ParameterGuardTransportAlreadyRegistered<$Context, transport> + ) => Client< + ContextFragmentTransportsAddType<$Context, transport> + > + ) +& ($Context['transports'] extends ContextTransportsNonEmpty + ? { + /** + * Configure the current transport. + * TODO + */ + < + const configurationInput extends $Context['transports']['registry'][$Context['transports']['current']]['configurator']['input'], + _IsChanged extends boolean = + {} extends configurationInput ? false : true + > + (configurationInput: configurationInput): + _IsChanged extends false + ? Client<$Context> // todo: access to current client type? + : Client< + { + [_ in keyof $Context]: + _ extends 'transports' + ? { + registry: $Context['transports']['registry'] + current: $Context['transports']['current'] + configurations: + { + [transportName in keyof $Context['transports']['configurations']]: + transportName extends $Context['transports']['current'] + ? Configurator.ApplyInputResolver$Func< + $Context['transports']['registry'][transportName]['configurator'], + $Context['transports']['configurations'][transportName], + configurationInput + > + : $Context['transports']['configurations'][transportName] + } + } + : $Context[_] + } + > + /** + * Set the current Transport, selected from amongst the registered ones, and optionally change its configuration. + * TODO + */ + < + const name extends ContextTransports.GetNames<$Context['transports']>, + const configurationInput extends undefined | $Context['transports']['registry'][name]['configurator']['input'] = undefined, + _IsChanged extends boolean = + name extends $Context['transports']['current'] ? + undefined extends configurationInput ? false : + {} extends configurationInput ? false : + true : + true + > + (name: name, configurationInput?: configurationInput): + _IsChanged extends false + ? Client<$Context> // todo: access to current client type? + : Client< + { + [_ in keyof $Context]: + _ extends 'transports' + ? { + registry: $Context['transports']['registry'] + current: name + configurations: + configurationInput extends Configurator.Configuration + ? { + [configKeyTransportName in keyof $Context['transports']['configurations']]: + configKeyTransportName extends name + ? Configurator.ApplyInputResolver$Func< + $Context['transports']['registry'][configKeyTransportName]['configurator'], + $Context['transports']['configurations'][configKeyTransportName], + configurationInput + > + : $Context['transports']['configurations'][configKeyTransportName] + } + : $Context['transports']['configurations'] + } + : $Context[_] + } + > + } + : unknown) + +export namespace TransportMethod { + export type Arguments = + | [config: object] + | [name: string, config?: object] + | [Transport] + | [Transport.Builder] + + export type ArgumentsNormalized = + | [typeof overloadCase.configureCurrent, config: object] + | [typeof overloadCase.setCurrent, name: string, config?: object] + | [typeof overloadCase.addType, Transport] + + export const overloadCase = { + setCurrent: 0, + configureCurrent: 1, + addType: 2, + } as const + + export const normalizeArguments = (args: Arguments): ArgumentsNormalized => { + if (typeof args[0] === `string`) { + return [overloadCase.setCurrent, args[0], args[1]] + } + if (Transport.$.isBuilder(args[0])) { + return [overloadCase.addType, args[0].return()] + } + if (Transport.$.is(args[0])) { + return [overloadCase.addType, args[0]] + } + return [overloadCase.configureCurrent, args[0]] + } +} + +// ------------------------------------------------------------ +// Method Helpers +// ------------------------------------------------------------ + +export namespace ContextTransports { + // dprint-ignore + export type GetNames<$ClientTransports extends ContextTransports> = + Objekt.IsEmpty<$ClientTransports['registry']> extends true + ? 'Error: Transport registry is empty. Please add a transport.' + : StringKeyof<$ClientTransports['registry']> +} + +// ------------------------------------------------------------ +// Context Fragment +// ------------------------------------------------------------ + +export interface ContextTransportsEmpty extends ContextTransports { + readonly registry: EmptyObject + readonly configurations: EmptyObject + readonly current: undefined +} + +export const contextTransportsEmpty: ContextTransportsEmpty = Object.freeze({ + registry: emptyObject, + configurations: emptyObject, + current: undefined, +}) + +export interface ContextTransportsNonEmpty { + readonly registry: ContextTransports_Registry + readonly configurations: ContextTransports_Configurations + readonly current: string +} + +export interface ContextTransports { + registry: ContextTransports_Registry + /** + * `undefined` if registry is empty. + */ + current: undefined | string + configurations: ContextTransports_Configurations +} + +export interface ContextTransports_Registry { + [name: string]: Transport +} + +export interface ContextTransports_Configurations { + [name: string]: Configurator.Configuration +} + +export interface ContextFragment { + readonly requestPipelineDefinition: RequestPipeline.BaseDefinition + readonly transports: ContextTransports +} + +export interface ContextFragmentTransportsEmpty extends ContextFragment { + readonly requestPipelineDefinition: RequestPipeline.BaseDefinitionEmpty + readonly transports: ContextTransportsEmpty +} + +export const contextFragmentTransportsEmpty: ContextFragmentTransportsEmpty = Object.freeze({ + requestPipelineDefinition: requestPipelineBaseDefinition, + transports: contextTransportsEmpty, +}) + +export const contextFragmentAdd = (context: Context, transport: Transport): ContextFragment => { + const isFirstTransport = context.transports.current === undefined + const transportName = transport.name + + const isTransportAlreadyRegistered = context.transports.registry[transportName] !== undefined + if (isTransportAlreadyRegistered) { + const errorMessage: AlreadyRegisteredError = + `There is already a transport registered with the name "${transportName}".` + throw new Error(errorMessage) + } + + const transports = Object.freeze({ + current: isFirstTransport ? transportName : context.transports.current, + registry: Object.freeze({ + ...context.transports.registry, + [transportName]: transport, + }), + configurations: Object.freeze({ + ...context.transports.configurations, + [transportName]: transport.configurator.default, + }), + }) + + const requestPipelineDefinition = Object.freeze({ + ...context.requestPipelineDefinition, + overloads: Object.freeze([ + ...context.requestPipelineDefinition.overloads, + transport, + ]), + }) + + const fragment = { + requestPipelineDefinition, + transports, + } + + return fragment +} + +export const contextFragmentSetCurrent = ( + context: Context, + transportName: string, + configurationInput?: Configurator.Configuration, +): null | ContextFragment => { + const transport = context.transports.registry[transportName] + if (!transport) throw new Error(`Unknown transport: ${transportName}`) + + const noChange = (!configurationInput || isObjectEmpty(configurationInput)) + && transportName === context.transports.current + if (noChange) return null + + const transports: ContextFragment['transports'] = { + ...context.transports, + current: transportName, + } + const fragment = { + transports, + // todo: not needed, only changed when adding a transport type. + // the thing is, we don't have concept of partial context fragment. + // one solution is to merge request pipeline definition and transports keys under one new top level key. + requestPipelineDefinition: context.requestPipelineDefinition, + } + + if (configurationInput) { + return contextFragmentConfigure({ ...context, ...fragment }, transportName, configurationInput) + } + + return fragment +} + +export const contextFragmentConfigureCurrent = ( + context: Context, + configurationInput: Configurator.Configuration, +): null | ContextFragment => { + if (!context.transports.current) { + throw new Error(`No transport is currently set.`) + } + return contextFragmentConfigure(context, context.transports.current, configurationInput) +} + +export const contextFragmentConfigure = ( + context: Context, + transportName: string, + configurationInput: Configurator.Configuration, +): null | ContextFragment => { + const transport = context.transports.registry[transportName] + if (!transport) throw new Error(`Unknown transport: ${transportName}`) + + const noChange = isObjectEmpty(configurationInput) + if (noChange) return null + + // todo: Graceful error handling. Clearly track error being from which extension. + const transportConfiguration = transport.configurator.inputResolver({ + current: context.transports.configurations[transport.name]!, + input: configurationInput, + }) + + const transports = { + ...context.transports, + current: transport.name, + configurations: Object.freeze({ + ...context.transports.configurations, + [transport.name]: transportConfiguration, + }), + } + + return { + transports, + requestPipelineDefinition: context.requestPipelineDefinition, + } +} + +export type ContextFragmentTransportsAddType< + $Context extends Context, + $Transport extends Transport, + // dprint-ignore + _NewContext = { + [_ in keyof $Context]: + _ extends 'requestPipelineDefinition' ? + Anyware.PipelineDefinition.Updaters.AddOverload<$Context['requestPipelineDefinition'], $Transport> : + _ extends 'transports' ? + ContextAddTransportOptional<$Context['transports'], $Transport> : + // default + $Context[_] + }, +> = _NewContext + +// dprint-ignore +export type ContextAddTransportOptional< + $ClientTransports extends ContextTransports, + $Transport extends Transport | undefined, +> = + $Transport extends Transport + ? { + configurations: + & Omit<$ClientTransports['configurations'], $Transport['name']> + & { + [_ in $Transport['name']]: $Transport['configurator']['default'] + } + current: $ClientTransports extends ContextTransportsEmpty + ? $Transport['name'] + : $ClientTransports['current'] + registry: $ClientTransports['registry'] & { + [_ in $Transport['name']]: $Transport + } + } + : $ClientTransports diff --git a/src/client/properties/use.test.ts b/src/client/properties/use.test.ts deleted file mode 100644 index aa4f6940a..000000000 --- a/src/client/properties/use.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -import { describe, expect, expectTypeOf } from 'vitest' -import { createResponse, test } from '../../../tests/_/helpers.js' -import { db } from '../../../tests/_/schemas/db.js' -import { Graffle } from '../../../tests/_/schemas/kitchen-sink/graffle/__.js' -import { create } from '../../extension/extension.js' -import { Throws } from '../../extensions/Throws/Throws.js' -// import { oops } from '../../../lib/anyware/specHelpers.js' - -const graffle = Graffle - .create({ output: { defaults: { errorChannel: 'return' } } }) - .transport({ url: 'http://foo' }) -const headers = { 'x-foo': 'bar' } - -test('using an extension without type hooks leaves them empty', () => { - const Ex = create({ - name: 'test', - create: () => { - return {} - }, - }) - const graffle1 = Graffle.create() - expectTypeOf(graffle1._).toMatchTypeOf<{ - typeHookOnRequestResult: [] - typeHookOnRequestDocumentRootType: [] - }>() - const graffle2 = graffle1.use(Ex()) - expectTypeOf(graffle2._).toMatchTypeOf<{ - typeHookOnRequestResult: [] - typeHookOnRequestDocumentRootType: [] - }>() -}) - -test('using an extension returns a copy of the client', () => { - const graffle2 = graffle.use(Throws()) - // @ts-ignore fixme - expect(graffle2 !== graffle).toBe(true) -}) - -describe(`entrypoint pack`, () => { - test(`can add header`, async ({ fetch }) => { - fetch.mockImplementationOnce(async (input) => { - expect(input.headers.get('x-foo')).toEqual(headers['x-foo']) - return createResponse({ data: { id: db.id } }) - }) - const graffle2 = graffle.anyware(async ({ pack }) => { - if (pack.input.transportType !== `http`) return pack() - return pack({ input: { ...pack.input, headers } }) - }) - const result = await graffle2.query.id() - expect(result).toEqual(db.id) - }) - test('can chain into exchange', async ({ fetch }) => { - fetch.mockImplementationOnce(async () => { - return createResponse({ data: { id: db.id } }) - }) - const client2 = graffle.anyware(async ({ pack }) => { - if (pack.input.transportType !== `http`) return pack() - const { exchange } = await pack({ input: { ...pack.input, headers } }) - return exchange({ input: exchange.input }) - }) - expect(await client2.query.id()).toEqual(db.id) - }) -}) - -// test('can retry failed request', async ({ fetch }) => { -// fetch -// .mockImplementationOnce(async () => { -// throw oops -// }) -// .mockImplementationOnce(async () => { -// throw oops -// }) -// .mockImplementationOnce(async () => { -// return createResponse({ data: { id: db.id } }) -// }) -// const client2 = client.retry(async ({ exchange }) => { -// let result = await exchange() -// while (result instanceof Error) { -// result = await exchange() -// } -// return result -// }) -// const result = await client2.query.id() -// expect(result).toEqual(db.id) -// expect(fetch.mock.calls.length).toEqual(3) -// }) diff --git a/src/client/properties/use.ts b/src/client/properties/use.ts deleted file mode 100644 index 90c27a0a7..000000000 --- a/src/client/properties/use.ts +++ /dev/null @@ -1,101 +0,0 @@ -import type { Extension } from '../../extension/__.js' -import type { Anyware } from '../../lib/anyware/__.js' -import type { UnknownOrAnyToNever } from '../../lib/prelude.js' -import { type Context } from '../../types/context.js' -import type { Transport } from '../../types/Transport.js' -import type { Client } from '../client.js' -import { createProperties } from '../helpers.js' - -export type UseMethod< - $Context extends Context, - out $Extension_ extends object, -> = (extension: extension) => Client< - UseOneReducer<$Context, extension>, - $Extension_ -> - -// todo: type to use multiple to reduce type instantiation -// useful for presets - -// dprint-ignore -export type UseOneReducer< - $Context extends Context, - $Extension extends Extension, -> = { - [_ in keyof $Context]: - _ extends 'requestPipelineDefinition' - ? $Extension['transport'] extends Transport - ? Anyware.PipelineDefinition.Updaters.AddOverload< - $Context['requestPipelineDefinition'], - $Extension['transport']['requestPipelineOverload'] - > - : $Context['requestPipelineDefinition'] - : _ extends 'extensions' - ? [...$Context['extensions'], $Extension] - : _ extends 'transports' - ? Context.Updaters.AddTransportOptional< - $Context['transports'], - $Extension['transport'] - > - : _ extends 'typeHookOnRequestResult' - ? [...$Context['typeHookOnRequestResult'], ...$Extension['typeHooks']['onRequestResult']] - : _ extends 'typeHookOnRequestDocumentRootType' - ? [...$Context['typeHookOnRequestDocumentRootType'], ...$Extension['typeHooks']['onRequestDocumentRootType']] - : _ extends 'typeHookRequestResultDataTypes' - ? $Context['typeHookRequestResultDataTypes'] | UnknownOrAnyToNever<$Extension['typeHooks']['requestResultDataTypes']> - : $Context[_] - } - -// todo rename to useOneReducer -export const useReducer = < - const $Context extends Context, - $Extension extends Extension, ->(context: $Context, extension: $Extension): UseOneReducer<$Context, $Extension> => { - const newContext: Context = { - ...context, - extensions: [...context.extensions, extension], - } - - if (extension.transport) { - newContext.requestPipelineDefinition = { - ...context.requestPipelineDefinition, - overloads: [ - ...context.requestPipelineDefinition.overloads, - extension.transport.requestPipelineOverload, - ], - } - newContext.transports = { - current: context.transports.current, - registry: { - ...context.transports.registry, - }, - configurations: { - ...context.transports.configurations, - }, - } - - const isTransportAlreadyRegistered = newContext.transports.registry[extension.transport.name] !== undefined - if (isTransportAlreadyRegistered) { - throw new Error(`Transport "${extension.transport.name}" is already registered.`) - } - const isFirstTransport = newContext.transports.current === null - if (isFirstTransport) { - newContext.transports.current = extension.transport.name - } - newContext.transports.registry[extension.transport.name] = extension.transport - newContext.transports.configurations[extension.transport.name] = { - ...extension.transport.configDefaults, - ...extension.transport.config, - } - } - - return newContext as any -} - -export const useProperties = createProperties((builder, context) => { - return { - use: (extension) => { - return builder(useReducer(context, extension)) as any - }, - } -}) diff --git a/src/client/properties/with.test.ts b/src/client/properties/with.test.ts deleted file mode 100644 index dabca64f3..000000000 --- a/src/client/properties/with.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { expect, expectTypeOf, test } from 'vitest' -import { Graffle } from '../../../tests/_/schemas/kitchen-sink/graffle/__.js' -import { GraffleBare } from '../../entrypoints/presets/bare.js' - -test(`can update preflight check`, () => { - const g1 = GraffleBare.create() - expectTypeOf(g1.gql).toBeString() - const g2 = g1.with({ checkPreflight: false }) - expectTypeOf(g2.gql).toBeFunction() -}) - -test(`can deeply update output`, () => { - const g1 = Graffle.create() - expect(g1._.output).toMatchObject({ - errors: { execution: `default`, other: `default` }, - defaults: { errorChannel: `throw` }, - }) - - const g2 = g1.with({ output: { defaults: { errorChannel: `return` } } }) - expect(g2._.output).toMatchObject({ - errors: { execution: `default`, other: `default` }, - defaults: { errorChannel: `return` }, - }) - - const g3 = g2.with({ output: { errors: { execution: `throw` } } }) - expect(g3._.output).toMatchObject({ - errors: { execution: `throw`, other: `default` }, - defaults: { errorChannel: `return` }, - }) -}) - -test(`can update schema map`, () => { - const g1 = GraffleBare.create() - expect(g1._.schemaMap).toBeNull() - - const g2 = g1.with({ schemaMap: Graffle.schemaMap }) - expect(g2._.schemaMap).toBe(Graffle.schemaMap) - // Did not mutate - expect(g1._.schemaMap).toBeNull() - - const different = {} as any - const g3 = g2.with({ schemaMap: different }) - expect(g3._.schemaMap).toBe(different) - // Did not mutate - expect(g2._.schemaMap).toBe(Graffle.schemaMap) -}) diff --git a/src/client/properties/with.ts b/src/client/properties/with.ts deleted file mode 100644 index ea5e35b54..000000000 --- a/src/client/properties/with.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Context } from '../../types/context.js' -import { type ConfigInit } from '../Configuration/ConfigInit.js' -import { createProperties } from '../helpers.js' - -export const withProperties = createProperties((builder, state) => { - return { - with: (configInit: ConfigInit) => { - return builder(Context.updateContextConfigInit(state, configInit)) - }, - } as any -}) diff --git a/src/entrypoints/_ExtensionExports.ts b/src/entrypoints/_ExtensionExports.ts new file mode 100644 index 000000000..71e361d37 --- /dev/null +++ b/src/entrypoints/_ExtensionExports.ts @@ -0,0 +1,6 @@ +// export { create } from '../extension/extension.js' +// export { createExtension as createGeneratorExtension } from '../generator/extension/create.js' +// // todo: no deep imports, rethink these utilities and/or how they are exported from the graffle package. +// export * from '../extension/__.js' +// export { Errors } from '../lib/errors/__.js' +// export type { Context } from '../types/context.js' diff --git a/src/entrypoints/_Graffle.ts b/src/entrypoints/_Graffle.ts index 8d8235fec..ab9640972 100644 --- a/src/entrypoints/_Graffle.ts +++ b/src/entrypoints/_Graffle.ts @@ -1,2 +1,2 @@ export * as Scalars from './_Scalars.js' -export { create } from './presets/_minimal.js' +export { type Client, create } from './presets/_minimal.js' diff --git a/src/entrypoints/_Preset.ts b/src/entrypoints/_Preset.ts index 912942333..94c2ec575 100644 --- a/src/entrypoints/_Preset.ts +++ b/src/entrypoints/_Preset.ts @@ -1 +1 @@ -export { traditionalGraphqlOutput } from '../client/Configuration/Output.js' +export { traditionalGraphqlOutput } from '../client/properties/output/_exports.js' diff --git a/src/entrypoints/client.ts b/src/entrypoints/client.ts index 04cce5585..ae3f201f9 100644 --- a/src/entrypoints/client.ts +++ b/src/entrypoints/client.ts @@ -1,3 +1,2 @@ export { type Client, create } from '../client/client.js' -export { type ConfigInit } from '../client/Configuration/ConfigInit.js' export { create as createSelect, select } from '../select/select.js' diff --git a/src/entrypoints/extension.ts b/src/entrypoints/extension.ts new file mode 100644 index 000000000..422624b71 --- /dev/null +++ b/src/entrypoints/extension.ts @@ -0,0 +1,3 @@ +export { Extension } from '../client/properties/extensions/dataType/_namespace.js' +export { Transport } from '../client/properties/transports/dataType.js' +export { Configurator } from '../lib/configurator/configurator.js' diff --git a/src/entrypoints/extensionkit.ts b/src/entrypoints/extensionkit.ts deleted file mode 100644 index 5d173a0ee..000000000 --- a/src/entrypoints/extensionkit.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { create } from '../extension/extension.js' -export { createExtension as createGeneratorExtension } from '../generator/extension/create.js' -// todo: no deep imports, rethink these utilities and/or how they are exported from the graffle package. -export * from '../extension/__.js' -export { Errors } from '../lib/errors/__.js' -export type { Context } from '../types/context.js' diff --git a/src/entrypoints/main.ts b/src/entrypoints/main.ts index fd28fcd19..212aab1b7 100644 --- a/src/entrypoints/main.ts +++ b/src/entrypoints/main.ts @@ -1,8 +1,7 @@ -export { type Extension } from '../extension/__.js' export { type TypedDocument } from '../lib/grafaid/typed-document/__.js' // todo figure this export out. Was just put there to resolve a type error about "...cannot be named..." -export * from '../client/Configuration/ConfigInit.js' -export { type OutputConfig } from '../client/Configuration/Output.js' +export { type Normalized } from '../client/properties/output/_exports.js' +export { Transport } from '../client/properties/transports/dataType.js' export * from '../lib/prelude.js' export * from './__Graffle.js' export * as Preset from './_Preset.js' diff --git a/src/entrypoints/presets/_bare.ts b/src/entrypoints/presets/_bare.ts index 8bc0301c7..7230cd07c 100644 --- a/src/entrypoints/presets/_bare.ts +++ b/src/entrypoints/presets/_bare.ts @@ -1,5 +1,4 @@ -import type { Client as BaseClient } from '../../client/client.js' -import type { Context } from '../../types/context.js' +import type { ClientEmpty } from '../../client/client.js' export { create } from '../../client/client.js' -export type Client = BaseClient +export type Client = ClientEmpty diff --git a/src/entrypoints/presets/_basic.ts b/src/entrypoints/presets/_basic.ts index 5b3946792..d788bca37 100644 --- a/src/entrypoints/presets/_basic.ts +++ b/src/entrypoints/presets/_basic.ts @@ -1,5 +1,5 @@ import { type Client as BaseClient, createConstructorWithContext } from '../../client/client.js' -import { useReducer } from '../../client/properties/use.js' +import { contextFragmentExtensionsAdd } from '../../client/properties/extensions/extensions.js' import type { ConfigManager } from '../../lib/config-manager/__.js' import { Context, type Context as BaseContext } from '../../types/context.js' import { DocumentBuilder } from '../extensions/document-builder/runtime.js' @@ -7,8 +7,11 @@ import { TransportHttp } from '../extensions/transport-http/runtime.js' import { TransportMemory } from '../extensions/transport-memory/runtime.js' import type { PartialOrUndefined } from '../main.js' -const context = useReducer( - useReducer(useReducer(Context.States.empty, TransportHttp()), TransportMemory()), +const context = contextFragmentExtensionsAdd( + contextFragmentExtensionsAdd( + contextFragmentExtensionsAdd(Context.States.empty, TransportHttp()), + TransportMemory(), + ), DocumentBuilder(), ) @@ -16,7 +19,7 @@ type BasicClientContext = typeof context export const create = createConstructorWithContext(context) -export type Client = BaseClient +export type Client = BaseClient export namespace Client { export type Context = BasicClientContext @@ -25,7 +28,6 @@ export namespace Client { ConfigManager.SetKeysOptional< BasicClientContext, $ContextNewPartial - >, - {} + > > } diff --git a/src/entrypoints/presets/_minimal.ts b/src/entrypoints/presets/_minimal.ts index 1aee58185..1439be55f 100644 --- a/src/entrypoints/presets/_minimal.ts +++ b/src/entrypoints/presets/_minimal.ts @@ -1,17 +1,17 @@ import { type Client as BaseClient, createConstructorWithContext } from '../../client/client.js' -import { useReducer } from '../../client/properties/use.js' +import { contextFragmentExtensionsAdd } from '../../client/properties/extensions/extensions.js' import type { ConfigManager } from '../../lib/config-manager/__.js' import { Context, type Context as BaseContext } from '../../types/context.js' import { TransportHttp } from '../extensions/transport-http/runtime.js' import type { PartialOrUndefined } from '../main.js' -const context = useReducer(Context.States.empty, TransportHttp()) +const context = contextFragmentExtensionsAdd(Context.States.empty, TransportHttp) export type MinimalClientContext = typeof context export const create = createConstructorWithContext(context) -export type Client = BaseClient +export type Client = BaseClient export namespace Client { export type Context = MinimalClientContext @@ -20,7 +20,6 @@ export namespace Client { ConfigManager.SetKeysOptional< MinimalClientContext, $ContextNewPartial - >, - {} + > > } diff --git a/src/entrypoints/utilities-for-generated.ts b/src/entrypoints/utilities-for-generated.ts index c07e8d866..f35df4042 100644 --- a/src/entrypoints/utilities-for-generated.ts +++ b/src/entrypoints/utilities-for-generated.ts @@ -1,15 +1,15 @@ export type { Simplify } from 'type-fest' export { createConstructorWithContext } from '../client/client.js' +export { contextFragmentExtensionsAdd } from '../client/properties/extensions/extensions.js' export type { ConfigGetOutputError, HandleOutput, HandleOutputDocumentBuilderRootField, -} from '../client/handleOutput.js' -export { useReducer } from '../client/properties/use.js' +} from '../client/properties/output/handle.js' export * from '../extensions/DocumentBuilder/__.js' export { type AssertExtendsObject, type Exact, type ExactNonEmpty, type UnionExpanded } from '../lib/prelude.js' export { TypeFunction } from '../lib/type-function/__.js' -export type { ClientTransports } from '../types/context.js' +export type { ContextTransports } from '../types/context.js' export { Context } from '../types/context.js' export * from '../types/context.js' export { type GlobalRegistry } from '../types/GlobalRegistry/GlobalRegistry.js' diff --git a/src/extension/TypeHooks.ts b/src/extension/TypeHooks.ts deleted file mode 100644 index 8e8d9e3a7..000000000 --- a/src/extension/TypeHooks.ts +++ /dev/null @@ -1,100 +0,0 @@ -import type { GraffleExecutionResultEnvelope } from '../client/handleOutput.js' -import type { DocumentBuilder } from '../extensions/DocumentBuilder/__.js' -import type { TypeFunction } from '../lib/type-function/__.js' -import type { Context } from '../types/context.js' -import type { GlobalRegistry } from '../types/GlobalRegistry/GlobalRegistry.js' - -export interface TypeHooks { - /** - * Manipulate the execution result of a request. - * - * Applies to all requests. - */ - onRequestResult: OnRequestResult[] - /** - * Manipulate the root type in a document in a request. - * - * Applies to all requests with typed documents which is all of them except `gql` method when passed a `string`. - * - * The root type received is the one that the request's operation name pointed to. - * - * Note: There is no way to manipulate the whole document. - */ - onRequestDocumentRootType: OnRequestDocumentRootType[] - /** - * Type(s) that show up in request result data. - * - * The purpose of this type is to stop Graffle from - * "simplifying" (aka. "expanding") whatever type(s) - * is/are here. - * - * So for example, if this type were `Date` and type `Date` - * appeared in the request result data, then it would be left-as is. - * - * Multiple types can be specified with a union, for example: `IntrospectionQuery | Date`. - */ - requestResultDataTypes: unknown -} - -export interface TypeHooksEmpty extends TypeHooks { - onRequestResult: [] - onRequestDocumentRootType: [] - requestResultDataTypes: never -} - -export namespace States { - export type Empty = TypeHooksEmpty -} - -// todo: type-level only, so can be a proxy that allows anything. -export const typeHooksBuilder: TypeHooksBuilder = { - requestResultDataTypes: () => typeHooksBuilder as any, - onRequestResult: () => typeHooksBuilder as any, - onRequestDocumentRootType: () => typeHooksBuilder as any, - type: null as any, -} - -export interface TypeHooksBuilder<$TypeHooks extends TypeHooks = TypeHooksEmpty> { - type: $TypeHooks - requestResultDataTypes: <$RequestResultDataTypes>() => TypeHooksBuilder< - { - requestResultDataTypes: $TypeHooks['requestResultDataTypes'] | $RequestResultDataTypes - onRequestResult: $TypeHooks['onRequestResult'] - onRequestDocumentRootType: $TypeHooks['onRequestDocumentRootType'] - } - > - onRequestResult: <$OnRequestResult extends OnRequestResult>() => TypeHooksBuilder< - { - requestResultDataTypes: $TypeHooks['requestResultDataTypes'] - onRequestResult: [...$TypeHooks['onRequestResult'], $OnRequestResult] - onRequestDocumentRootType: $TypeHooks['onRequestDocumentRootType'] - } - > - onRequestDocumentRootType: <$OnRequestDocumentRootType extends OnRequestDocumentRootType>() => TypeHooksBuilder< - { - requestResultDataTypes: $TypeHooks['requestResultDataTypes'] - onRequestResult: $TypeHooks['onRequestResult'] - onRequestDocumentRootType: [...$TypeHooks['onRequestDocumentRootType'], $OnRequestDocumentRootType] - } - > -} - -export interface OnRequestDocumentRootType extends TypeFunction {} -export namespace OnRequestDocumentRootType { - export interface Params { - selectionRootType: DocumentBuilder.Select.SelectionSet.RootType - } -} - -export interface OnRequestResult extends TypeFunction {} -export namespace OnRequestResult { - export interface Params<$Extensions extends GlobalRegistry.Extensions = GlobalRegistry.Extensions> { - result: GraffleExecutionResultEnvelope - registeredSchema: GlobalRegistry.Client<$Extensions> - } -} - -export type RunTypeHookOnRequestResult< - $Context extends Context, - $Params extends OnRequestResult.Params, -> = TypeFunction.CallPipeline<$Context['typeHookOnRequestResult'], $Params> diff --git a/src/extension/__.ts b/src/extension/__.ts deleted file mode 100644 index 17c8f90a6..000000000 --- a/src/extension/__.ts +++ /dev/null @@ -1,61 +0,0 @@ -import type { RequestPipelineBaseInterceptor } from '../requestPipeline/RequestPipeline.js' -import type { Transport } from '../types/Transport.js' -import type { BuilderExtension } from './builder.js' -import type { TypeHooks } from './TypeHooks.js' - -export * as Extension from './extension.js' - -export interface Extension< - $Name extends string = string, - $Config extends object | undefined = object | undefined, - $BuilderExtension extends BuilderExtension | undefined = BuilderExtension | undefined, - $TypeHooks extends TypeHooks = TypeHooks, - $Transport extends Transport | undefined = Transport | undefined, -> { - /** - * The name of the extension - */ - name: $Name - /** - * TODO - */ - config: $Config - /** - * Anyware executed on every request. - */ - onRequest: undefined | RequestPipelineBaseInterceptor - /** - * Manipulate the builder. - * You can extend the builder with new properties at both runtime AND buildtime (types, TypeScript). - * You can also manipulate existing properties. - * - * ### Runtime - * - * Hook into "get" events on the builder proxy. Useful for adding new methods or manipulating existing ones. - * - * Invoked when a non-record-like-object is reached. For example these: - * - * - graffle.use (property: "use") - * - graffle.query.foo (property: "foo", path: ["query"]) - * - * Return nothing/`undefined` to passthrough. - * - * Anything else returned becomes the result of the proxy "get" event. - * - * When there are multiple extensions with "onBuilderGet" handlers they form a execution stack starting from the first registered extension. - * The first handler to return something short circuits the rest. - * - * ### Types - * - * There is a type parameter you can pass in which will statically extend the builder. - */ - builder: $BuilderExtension - /** - * TODO - */ - transport: $Transport - /** - * TODO - */ - typeHooks: $TypeHooks -} diff --git a/src/extension/builder.ts b/src/extension/builder.ts deleted file mode 100644 index e2fbf041e..000000000 --- a/src/extension/builder.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { ClientEmpty, ExtensionChainable } from '../client/client.js' -import { identity } from '../lib/prelude.js' -import type { Context } from '../types/context.js' - -export type BuilderExtension< - $BuilderExtension extends ExtensionChainable | undefined = ExtensionChainable | undefined, -> = - & BuilderExtension.Create - & { type: $BuilderExtension } - -export namespace BuilderExtension { - export interface CreateCallback { - <$BuilderExtension extends ExtensionChainable>( - propertiesConstructor: Create, - ): BuilderExtension<$BuilderExtension> - } - export const createCallback: CreateCallback = identity as any - - export type Create = ( - parameters: { - client: ClientEmpty - context: Context - }, - ) => object -} diff --git a/src/extension/builderProperties.ts b/src/extension/builderProperties.ts deleted file mode 100644 index 85cd05e8b..000000000 --- a/src/extension/builderProperties.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { ClientGeneric } from '../client/client.js' - -export interface BuilderProperties< - $BuilderProperties extends object | undefined = object | undefined, -> { - type: $BuilderProperties - implementation: BuilderProperties.Interceptor -} - -export namespace BuilderProperties { - export interface Creator { - <$BuilderProperties extends object>( - interceptor: Interceptor, - ): BuilderProperties<$BuilderProperties> - } - - export interface CreatorCallback<$BuilderProperties extends object> { - (creator: Creator): $BuilderProperties - } - - export type Interceptor = ( - input: { - path: string[] - property: string - client: ClientGeneric - }, - ) => unknown -} diff --git a/src/extension/context.ts b/src/extension/context.ts deleted file mode 100644 index 03226953d..000000000 --- a/src/extension/context.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { UnknownOrAnyToNever } from '../lib/prelude.js' -import type { Context, ContextTypeLevel } from '../types/context.js' -import type { Extension } from './__.js' - -export type AddTypeHooksFromExtension< - $Context extends Context, - $Extension extends Extension, -> = AddExtensionTypeHooks<$Context, $Extension['typeHooks']> - -export type AddExtensionTypeHooks< - $Context extends Context, - $ExtensionTypeHooks extends Extension.TypeHooks.TypeHooks, -> = - & Omit<$Context, keyof ContextTypeLevel> - & { - typeHookOnRequestResult: [...$Context['typeHookOnRequestResult'], ...$ExtensionTypeHooks['onRequestResult']] - typeHookOnRequestDocumentRootType: $Context['typeHookOnRequestDocumentRootType'] - typeHookRequestResultDataTypes: - | $Context['typeHookRequestResultDataTypes'] - | UnknownOrAnyToNever<$ExtensionTypeHooks['requestResultDataTypes']> - } diff --git a/src/extension/extension.test.ts b/src/extension/extension.test.ts deleted file mode 100644 index 039877af7..000000000 --- a/src/extension/extension.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { describe, expectTypeOf, test } from 'vitest' -import type { Extension } from './__.js' -import { create } from './extension.js' - -describe(`constructor arguments`, () => { - test(`normalizeConfig undefined -> constructor input forbidden`, () => { - const Ex = create({ - name: `test`, - create: () => { - return {} - }, - }) - Ex() - // @ts-expect-error Arguments forbidden. - Ex({}) - }) - test(`normalizeConfig with optional keys -> constructor input optional`, () => { - const Ex = create({ - name: `test`, - normalizeConfig: (_?: { a?: 1; b?: 2 }) => { - return { a: 11, b: 22 } - }, - create: () => { - return {} - }, - }) - Ex() - Ex({}) - Ex({ a: 1 }) - }) - test(`normalizeConfig with required input (but optional keys) -> constructor input required`, () => { - const Ex = create({ - name: `test`, - normalizeConfig: (_: { a?: 1; b?: 2 }) => { - return { a: 11, b: 22 } - }, - create: () => { - return {} - }, - }) - // @ts-expect-error Arguments required. - Ex() - Ex({}) - Ex({ a: 1 }) - }) - test(`normalizeConfig with required keys -> constructor input required`, () => { - const Ex = create({ - name: `test`, - normalizeConfig: (_: { a: 1; b?: 2 }) => { - return { a: 11, b: 22 } - }, - create: () => { - return {} - }, - }) - // @ts-expect-error Arguments required. - Ex() - // @ts-expect-error Arguments required. - Ex({}) - Ex({ a: 1 }) - }) -}) - -test(`type hooks is empty by default`, () => { - const Ex = create({ - name: `test`, - create: () => { - return {} - }, - }) - expectTypeOf(Ex.info.typeHooks).toEqualTypeOf() - const ex = Ex() - expectTypeOf(ex.typeHooks).toEqualTypeOf() -}) diff --git a/src/extension/extension.ts b/src/extension/extension.ts deleted file mode 100644 index 2d55b6098..000000000 --- a/src/extension/extension.ts +++ /dev/null @@ -1,176 +0,0 @@ -import type { IsNever } from 'type-fest' -import type { ExtensionChainable } from '../client/client.js' -import type { Context } from '../entrypoints/utilities-for-generated.js' -import { Anyware } from '../lib/anyware/__.js' -import { type AssertExtendsString } from '../lib/prelude.js' -import type { TypeFunction } from '../lib/type-function/__.js' -import type { RequestPipelineBaseInterceptor } from '../requestPipeline/RequestPipeline.js' -import type { Transport } from '../types/Transport.js' -import type { Extension } from './__.js' -import { BuilderExtension } from './builder.js' -import { type TypeHooks, type TypeHooksBuilder, typeHooksBuilder, type TypeHooksEmpty } from './TypeHooks.js' - -export * from './context.js' -export * as TypeHooks from './TypeHooks.js' - -export namespace States { - export type WithBuilder = Extension -} - -export type ExtensionInputParameters = - | ExtensionInputParametersNone - | ExtensionInputParametersOptional - | ExtensionInputParametersRequired -export type ExtensionInputParametersNone = [] -export type ExtensionInputParametersOptional = [input?: object] -export type ExtensionInputParametersRequired = [input: object] - -export interface ExtensionDefinition { - name: string - builder?: BuilderExtension // | BuilderExtension.CreatorCallback - onRequest?: RequestPipelineBaseInterceptor - // typeHooks?: () => TypeHooks - transport?: ( - OverloadBuilder: { create: Transport.Builder.Create }, - ) => Anyware.Overload.Builder -} - -// todo: rename to "define" -export const create = < - $Name extends string, - $BuilderExtension extends BuilderExtension | undefined = BuilderExtension | undefined, - $TypeHooks extends TypeHooks = TypeHooksEmpty, - $ConfigInputParameters extends ExtensionInputParameters = ExtensionInputParameters, - $Config extends object = object, - $Custom extends object = object, - $TransportCallbackResult extends undefined | Anyware.Overload.Builder = undefined, ->( - definitionInput: { - name: $Name - normalizeConfig?: (...args: $ConfigInputParameters) => $Config - custom?: $Custom - create: ( - parameters: { config: $Config; builder: BuilderExtension.CreateCallback; typeHooks: TypeHooksBuilder }, - ) => { - builder?: $BuilderExtension - typeHooks?: TypeHooksBuilder<$TypeHooks> - onRequest?: RequestPipelineBaseInterceptor - transport?: ( - OverloadBuilder: Transport.Builder.Create, - ) => $TransportCallbackResult - } - }, -): ExtensionConstructor< - $ConfigInputParameters, - $Config, - $Name, - $BuilderExtension, - $TypeHooks, - $Custom, - $TransportCallbackResult extends Anyware.Overload.Builder ? { - // todo fixme - // Names of transports can only be strings but its wider for anyware overloads - name: AssertExtendsString<$TransportCallbackResult['type']['discriminant'][1]> - config: $TransportCallbackResult['type']['input'] - configInit: $TransportCallbackResult['type']['inputInit'] extends object - ? $TransportCallbackResult['type']['inputInit'] - : {} - configDefaults: $TransportCallbackResult['type']['inputDefaults'] - requestPipelineOverload: $TransportCallbackResult['type'] - } - : undefined -> => { - const extensionConstructor = (input?: object) => { - const config: $Config = ((definitionInput.normalizeConfig as any)?.(input) ?? {}) as any // eslint-disable-line - const extensionBuilder = definitionInput.create({ - config, - builder: BuilderExtension.createCallback, - typeHooks: typeHooksBuilder, - }) - const builder = extensionBuilder.builder - const overload = extensionBuilder.transport?.((name) => - Anyware.Overload.create({ discriminant: [`transportType`, name] }) - )?.type - const transport: Transport | undefined = overload - ? { - name: overload.discriminant[1] as string, - config: overload.input, - configInit: undefined as any, - configDefaults: overload.inputDefaults, - requestPipelineOverload: overload, - } - : undefined - const extension: Extension = { - name: definitionInput.name, - config, - onRequest: extensionBuilder.onRequest, - builder, - transport, - // todo: remove this from runtime, its JUST for types. - typeHooks: { - requestResultDataTypes: null, - onRequestDocumentRootType: [], - onRequestResult: [], - }, - } - return extension - } - extensionConstructor.info = { - name: definitionInput.name, - } - return extensionConstructor as any -} - -// type IsOptionalParameters = [] extends T ? true : false - -export type ExtensionConstructor< - $ConfigInputParameters extends ExtensionInputParameters = ExtensionInputParameters, - $Config extends object = object, - $Name extends string = string, - $BuilderExtension extends BuilderExtension | undefined = BuilderExtension | undefined, - $TypeHooks extends TypeHooks = TypeHooksEmpty, - $Custom extends object = object, - $Transport extends undefined | Transport = undefined, -> = - & { - ( - ...args: - // ExtensionInputParameters extends $ConfigInputParameters ? [] : $ConfigInputParameters - WasNotDefined<$ConfigInputParameters> extends true ? [] : $ConfigInputParameters - ): Extension<$Name, $Config, $BuilderExtension, $TypeHooks, $Transport> - info: { - name: $Name - configInputParameters: $ConfigInputParameters - config: $Config - builder: $BuilderExtension - typeHooks: $TypeHooks - transport: $Transport - } - } - & $Custom - -export type InferExtensionFromConstructor<$ExtensionConstructor extends ExtensionConstructor> = Extension< - $ExtensionConstructor['info']['name'], - $ExtensionConstructor['info']['config'], - $ExtensionConstructor['info']['builder'], - $ExtensionConstructor['info']['typeHooks'] -> - -// When no normalize config input prop provided AT ALL then it falls back to the constraint -type WasNotDefined = IsNever> - -// dprint-ignore -export type ApplyAndMergeBuilderExtensions<$Extensions extends Extension[], $Context extends Context> = - $Extensions extends [infer $ExtensionFirst extends Extension, ...infer $ExtensionRest extends Extension[]] - ? - & ( - $ExtensionFirst['builder'] extends BuilderExtension - ? - TypeFunction.Call< - $ExtensionFirst['builder']['type'], - [$Context] - > - : {} - ) - & ApplyAndMergeBuilderExtensions<$ExtensionRest, $Context> - : {} diff --git a/src/extensions/DocumentBuilder/DocumentBuilder.ts b/src/extensions/DocumentBuilder/DocumentBuilder.ts index bfd5e2368..d72a2b9f1 100644 --- a/src/extensions/DocumentBuilder/DocumentBuilder.ts +++ b/src/extensions/DocumentBuilder/DocumentBuilder.ts @@ -1,53 +1,48 @@ import { OperationTypeNode } from 'graphql' -import type { ExtensionChainable } from '../../client/client.js' -import { type Context, create } from '../../entrypoints/extensionkit.js' -import type { ClientTransports, GlobalRegistry } from '../../entrypoints/utilities-for-generated.js' +import { Extension } from '../../entrypoints/extension.js' +import type { ContextTransports, GlobalRegistry } from '../../entrypoints/utilities-for-generated.js' import type { TypeFunction } from '../../lib/type-function/__.js' import { createMethodDocument, createMethodOperationType } from './_.js' -export const DocumentBuilder = create({ - name: `DocumentBuilder`, - create: ({ builder }) => { +export const DocumentBuilder = Extension + .create(`DocumentBuilder`) + .properties(({ context }) => { return { - builder: builder(({ context }) => { - return { - document: createMethodDocument(context), - query: createMethodOperationType(context, OperationTypeNode.QUERY), - mutation: createMethodOperationType(context, OperationTypeNode.MUTATION), - // todo - // subscription: async () => {}, - } as any - }), - } - }, -}) + document: createMethodDocument(context), + query: createMethodOperationType(context, OperationTypeNode.QUERY), + mutation: createMethodOperationType(context, OperationTypeNode.MUTATION), + // todo + // subscription: async () => {}, + } as any as Properties + }) + .return() -export interface BuilderExtension extends ExtensionChainable { +export interface Properties extends Extension.PropertiesTypeFunction { // @ts-expect-error - return: BuilderExtension_ + return: Properties_ } -type BuilderExtension_<$Context extends Context> = +type Properties_<$Parameters extends Extension.PropertiesTypeFunctionParameters> = // todo // GlobalRegistry.Has<$Context['name']> extends false // eslint-disable-next-line // @ts-ignore passes after generation - GlobalRegistry.Has<$Context['name']> extends false ? {} + GlobalRegistry.Has<$Parameters['context']['name']> extends false ? {} : ( // eslint-disable-next-line // @ts-ignore Passes after generation - & TypeFunction.Call['interfaces']['Root'], $Context> + & TypeFunction.Call['interfaces']['Root'], $Context> & { // eslint-disable-next-line // @ts-ignore Passes after generation - document: ClientTransports.PreflightCheck< - $Context, + document: ContextTransports.PreflightCheck< + $Parameters['context'], TypeFunction.Call< GlobalRegistry.GetOrDefault< // @ts-expect-error - $Context['name'] + $Parameters['context']['name'] >['interfaces']['Document'], - $Context + $Parameters['context'] > > } diff --git a/src/extensions/DocumentBuilder/requestMethods/document.test-d.ts b/src/extensions/DocumentBuilder/requestMethods/document.test-d.ts index ede0fa652..823db9c6f 100644 --- a/src/extensions/DocumentBuilder/requestMethods/document.test-d.ts +++ b/src/extensions/DocumentBuilder/requestMethods/document.test-d.ts @@ -3,7 +3,7 @@ import { Graffle } from '../../../../tests/_/schemas/kitchen-sink/graffle/__.js' import { MutationOnly } from '../../../../tests/_/schemas/mutation-only/graffle/__.js' import { QueryOnly } from '../../../../tests/_/schemas/query-only/graffle/__.js' -const g = Graffle.create({ checkPreflight: false }) +const g = Graffle.create({ check: { preflight: false } }) test(`requires input`, () => { // @ts-expect-error missing input @@ -50,13 +50,13 @@ test(`document with two queries of different root types`, async () => { }) test(`root operation not available if it is not in schema`, () => { - const queryOnly = QueryOnly.create({ checkPreflight: false }) + const queryOnly = QueryOnly.create({ check: { preflight: false } }) queryOnly.document({ query: { foo: { id: true } }, // @ts-expect-error mutation not in schema mutation: { foo: { id: true } }, }) - const mutationOnly = MutationOnly.create({ checkPreflight: false }) + const mutationOnly = MutationOnly.create({ check: { preflight: false } }) mutationOnly.document({ mutation: { bar: { id: true } }, // @ts-expect-error query not in schema diff --git a/src/extensions/DocumentBuilder/requestMethods/document.ts b/src/extensions/DocumentBuilder/requestMethods/document.ts index 063e25899..4c56c344b 100644 --- a/src/extensions/DocumentBuilder/requestMethods/document.ts +++ b/src/extensions/DocumentBuilder/requestMethods/document.ts @@ -1,5 +1,5 @@ import type { UnionToTuple } from 'type-fest' -import type { HandleOutput } from '../../../client/handleOutput.js' +import type { HandleOutput } from '../../../client/properties/output/handle.js' import type { IsTupleMultiple } from '../../../lib/prelude.js' import type { InferResult } from '../InferResult/__.js' import type { Select } from '../Select/__.js' diff --git a/src/extensions/DocumentBuilder/requestMethods/requestMethods.test-d.ts b/src/extensions/DocumentBuilder/requestMethods/requestMethods.test-d.ts index 9dc7b5e73..fa1783f33 100644 --- a/src/extensions/DocumentBuilder/requestMethods/requestMethods.test-d.ts +++ b/src/extensions/DocumentBuilder/requestMethods/requestMethods.test-d.ts @@ -4,7 +4,7 @@ import { DateScalar } from '../../../../tests/_/fixtures/scalars.js' import { Graffle } from '../../../../tests/_/schemas/kitchen-sink/graffle/__.js' import * as Schema from '../../../../tests/_/schemas/kitchen-sink/schema.js' -const g = Graffle.create({ checkPreflight: false }).scalar(DateScalar) +const g = Graffle.create({ check: { preflight: false } }).scalar(DateScalar) // dprint-ignore test(`query`, async () => { diff --git a/src/extensions/DocumentBuilder/requestMethods/requestMethods.ts b/src/extensions/DocumentBuilder/requestMethods/requestMethods.ts index 5f67ba596..d58b090ea 100644 --- a/src/extensions/DocumentBuilder/requestMethods/requestMethods.ts +++ b/src/extensions/DocumentBuilder/requestMethods/requestMethods.ts @@ -1,6 +1,7 @@ import type { OperationTypeNode } from 'graphql' -import { handleOutput } from '../../../client/handleOutput.js' -import { Anyware } from '../../../lib/anyware/__.js' +import { Output } from '../../../client/properties/output/_namespace.js' +import { handle } from '../../../client/properties/output/handle.js' +import { Anyware } from '../../../lib/anyware/_namespace.js' import type { Grafaid } from '../../../lib/grafaid/__.js' import { getOperationDefinition } from '../../../lib/grafaid/document.js' import { isSymbol } from '../../../lib/prelude.js' @@ -96,7 +97,7 @@ const executeDocument = async ( interceptors: state.extensions.filter(_ => _.onRequest !== undefined).map(_ => _.onRequest!) as any, }) - return handleOutput(state, result) + return Output.handle(state, result) } export const graffleMappedResultToRequest = ( diff --git a/src/extensions/Introspection/Introspection.ts b/src/extensions/Introspection/Introspection.ts index 16ece1537..dc41b85a2 100644 --- a/src/extensions/Introspection/Introspection.ts +++ b/src/extensions/Introspection/Introspection.ts @@ -1,9 +1,34 @@ import { getIntrospectionQuery, type IntrospectionQuery } from 'graphql' -import type { ExtensionChainable } from '../../client/client.js' -import type { HandleOutput } from '../../client/handleOutput.js' -import { create } from '../../entrypoints/extensionkit.js' -import type { ClientTransports, Context } from '../../entrypoints/utilities-for-generated.js' -import { type ConfigInput, createConfig } from './config.js' +import type { GraphQLSchema, IntrospectionOptions } from 'graphql' +import type { HandleOutput } from '../../client/properties/output/handle.js' +import type { Properties } from '../../client/properties/properties/__.js' +import type { PropertiesComputer } from '../../client/properties/properties/properties.js' +import { Configurator, Extension } from '../../entrypoints/extension.js' +import type { Context, ContextTransports } from '../../entrypoints/utilities-for-generated.js' +import type { InputIntrospectionOptions } from '../../generator/_.js' + +export type ConfigurationInput = { + /** + * The schema instance or endpoint to introspect. + * By default uses the value the client was constructed with. + */ + schema?: SchemaTarget + /** + * The introspection query options. By default all kinds of information are sought. + * + * Where those options are known to be optional by valid GraphQL servers then they start enabled but are + * progressively disabled upon introspection failure until success or no more known potentially + * unsupported features remain. + */ + options?: InputIntrospectionOptions +} + +export interface ConfigurationNormalized { + schema: SchemaTarget | undefined + options: IntrospectionOptions +} + +type SchemaTarget = string | URL | GraphQLSchema /** * This extension adds a `.introspect` method to the client that will return the introspected schema. @@ -21,61 +46,67 @@ import { type ConfigInput, createConfig } from './config.js' * const data = await graffle.introspect() * ``` */ -export const Introspection = create({ - name: `Introspection`, - normalizeConfig: (input?: ConfigInput) => { - const config = createConfig(input) - return config - }, - create: ({ config, builder, typeHooks }) => { +export const Introspection = Extension(`introspection`) + .configurator( + Configurator() + .input() + .normalized() + .default({ + schema: undefined, + options: { + descriptions: true, + specifiedByUrl: true, + directiveIsRepeatable: true, + schemaDescription: true, + inputValueDeprecation: true, + oneOf: true, + }, + }), + ) + .properties(({ configuration, client }) => { return { - typeHooks: typeHooks.requestResultDataTypes(), - builder: builder(({ client }) => { - return { - introspect: async () => { - const c = client.with({ output: { envelope: false, errors: { execution: `return` } } }) - let introspectionQueryDocument = getIntrospectionQuery(config.options) - // @ts-expect-error fixme - const result = await c.gql(introspectionQueryDocument).send() - const featuresDropped: string[] = [] - const enabledKnownPotentiallyUnsupportedFeatures = knownPotentiallyUnsupportedFeatures.filter(_ => - config.options[_] !== false - ) - - // Try to find a working introspection query. - if (result instanceof Error) { - for (const feature of enabledKnownPotentiallyUnsupportedFeatures) { - featuresDropped.push(feature) - introspectionQueryDocument = getIntrospectionQuery({ - ...config.options, - [feature]: false, - }) - // @ts-expect-error fixme - const result = await c.gql(introspectionQueryDocument).send() - if (!(result instanceof Error)) break - } - } + introspect: async () => { + // todo: fixme: use config.schema!! Currently only looked at in the generator! + const c = client.with({ output: { envelope: false, errors: { execution: `return` } } }) + let introspectionQueryDocument = getIntrospectionQuery(configuration.introspection.current.options) + // @ts-expect-error fixme + const result = await c.gql(introspectionQueryDocument).send() + const featuresDropped: string[] = [] + const enabledKnownPotentiallyUnsupportedFeatures = knownPotentiallyUnsupportedFeatures.filter(_ => + configuration.introspection.current.options[_] !== false + ) - // Send the query again with the host configuration for output. - // TODO rather than having to make this query again expose a way to send a value through the output handler here. - // TODO expose the featuresDropped info on the envelope so that upstream can communicate to users what happened - // finally at runtime. + // Try to find a working introspection query. + if (result instanceof Error) { + for (const feature of enabledKnownPotentiallyUnsupportedFeatures) { + featuresDropped.push(feature) + introspectionQueryDocument = getIntrospectionQuery({ + ...configuration.introspection.current.options, + [feature]: false, + }) // @ts-expect-error fixme - return await client.gql(introspectionQueryDocument).send() - }, + const result = await c.gql(introspectionQueryDocument).send() + if (!(result instanceof Error)) break + } } - }), - } - }, -}) -interface BuilderExtension extends ExtensionChainable { - // @ts-expect-error untyped params - return: BuilderExtension_ -} + // Send the query again with the host configuration for output. + // TODO rather than having to make this query again expose a way to send a value through the output handler here. + // TODO expose the featuresDropped info on the envelope so that upstream can communicate to users what happened + // finally at runtime. + // @ts-expect-error fixme + return await client.gql(introspectionQueryDocument).send() + }, + } as any as Properties + }) + .typeOfNoExpandResultDataType() + .return() -interface BuilderExtension_<$Context extends Context> { - introspect: ClientTransports.PreflightCheck< +interface Properties extends Properties.PropertiesComputerTypeFunction { + return: Properties_ +} +interface Properties_<$Context extends Context> { + introspect: ContextTransports.PreflightCheck< $Context, () => Promise<(null | {}) & HandleOutput<$Context, IntrospectionQuery>> > diff --git a/src/extensions/Introspection/config.ts b/src/extensions/Introspection/config.ts deleted file mode 100644 index d77aadc73..000000000 --- a/src/extensions/Introspection/config.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { GraphQLSchema, IntrospectionOptions } from 'graphql' -import type { InputIntrospectionOptions } from '../../generator/_.js' - -export type ConfigInput = { - /** - * The schema instance or endpoint to introspect. By default uses the value the client was constructed with. - */ - schema?: string | URL | GraphQLSchema - /** - * The introspection query options. By default all kinds of information are sought. - * - * Where those options are known to be optional by valid GraphQL servers then they start enabled but are - * progressively disabled upon introspection failure until success or no more known potentially - * unsupported features remain. - */ - options?: InputIntrospectionOptions -} - -export type Config = { - schema: null | string | URL | GraphQLSchema - options: IntrospectionOptions -} - -export const defaults = { - schema: null, - options: { - descriptions: true, - specifiedByUrl: true, - directiveIsRepeatable: true, - schemaDescription: true, - inputValueDeprecation: true, - oneOf: true, - }, -} satisfies Config - -export const createConfig = (input?: ConfigInput): Config => { - return { - schema: input?.schema ?? defaults.schema, - options: input?.options ?? defaults.options, - } -} diff --git a/src/extensions/Opentelemetry/Opentelemetry.ts b/src/extensions/Opentelemetry/Opentelemetry.ts index 0127f13dd..956c4a48a 100644 --- a/src/extensions/Opentelemetry/Opentelemetry.ts +++ b/src/extensions/Opentelemetry/Opentelemetry.ts @@ -1,28 +1,34 @@ import { trace, type Tracer } from '@opentelemetry/api' -import { create } from '../../extension/extension.js' -import { createConfig } from './config.js' +import { Configurator, Extension } from '../../entrypoints/extension.js' -export const Opentelemetry = create({ - name: `Opentelemetry`, - normalizeConfig: createConfig, - create: ({ config }) => { - const tracer = trace.getTracer(config.tracerName) +export const OpenTelemetry = Extension(`openTelemetry`) + .configurator( + Configurator() + .input<{ + /** + * @defaultValue `"opentelemetry"` + */ + tracerName?: string + }>() + .default({ + tracerName: `graffle`, + }), + ) + .requestInterceptor(({ configuration }) => { + const tracer = trace.getTracer(configuration.openTelemetry.current.tracerName) const startActiveGraffleSpan = startActiveSpan(tracer) - return { - onRequest: async ({ encode }) => { - encode.input - return await startActiveGraffleSpan(`request`, async () => { - const { pack } = await startActiveGraffleSpan(`encode`, encode) - const { exchange } = await startActiveGraffleSpan(`pack`, pack) - const { unpack } = await startActiveGraffleSpan(`exchange`, exchange) - const { decode } = await startActiveGraffleSpan(`unpack`, unpack) - const result = await startActiveGraffleSpan(`decode`, decode) - return result - }) - }, + + return async ({ encode }) => { + return await startActiveGraffleSpan(`request`, async () => { + const { pack } = await startActiveGraffleSpan(`encode`, encode) + const { exchange } = await startActiveGraffleSpan(`pack`, pack) + const { unpack } = await startActiveGraffleSpan(`exchange`, exchange) + const { decode } = await startActiveGraffleSpan(`unpack`, unpack) + const result = await startActiveGraffleSpan(`decode`, decode) + return result + }) } - }, -}) + }) const startActiveSpan = (tracer: Tracer) => (name: string, fn: () => Promise): Promise => { return tracer.startActiveSpan(name, async (span) => { diff --git a/src/extensions/Opentelemetry/config.ts b/src/extensions/Opentelemetry/config.ts deleted file mode 100644 index d1e952d6a..000000000 --- a/src/extensions/Opentelemetry/config.ts +++ /dev/null @@ -1,20 +0,0 @@ -export type Input = { - /** - * @defaultValue `"opentelemetry"` - */ - tracerName?: string -} - -export type Config = { - tracerName: string -} - -export const defaults = { - tracerName: `graffle`, -} satisfies Config - -export const createConfig = (input?: Input): Config => { - return { - tracerName: input?.tracerName ?? defaults.tracerName, - } -} diff --git a/src/extensions/SchemaErrors/gentime.ts b/src/extensions/SchemaErrors/gentime.ts index 192a9eb28..c38a60786 100644 --- a/src/extensions/SchemaErrors/gentime.ts +++ b/src/extensions/SchemaErrors/gentime.ts @@ -1,4 +1,4 @@ -import { createGeneratorExtension } from '../../entrypoints/extensionkit.js' +import { createGeneratorExtension } from '../../entrypoints/extension.js' import type { Config as GeneratorConfig } from '../../generator/config/config.js' import { Code } from '../../lib/Code.js' import { ConfigManager } from '../../lib/config-manager/__.js' diff --git a/src/extensions/SchemaErrors/runtime.ts b/src/extensions/SchemaErrors/runtime.ts index 018570958..1e8198d27 100644 --- a/src/extensions/SchemaErrors/runtime.ts +++ b/src/extensions/SchemaErrors/runtime.ts @@ -1,4 +1,5 @@ -import { Errors, Extension } from '../../entrypoints/extensionkit.js' +import { Extension } from '../../entrypoints/extension.js' +import { Errors } from '../../lib/errors/__.js' import { normalizeRequestToNode } from '../../lib/grafaid/request.js' import { type ExcludeNullAndUndefined, isString } from '../../lib/prelude.js' import { isRecordLikeObject } from '../../lib/prelude.js' @@ -7,28 +8,11 @@ import { SchemaDrivenDataMap } from '../../types/SchemaDrivenDataMap/__.js' import type { GeneratedExtensions } from './global.js' import { injectTypenameOnRootResultFields } from './injectTypenameOnRootResultFields.js' -// todo we can probably remove this explicit type, its not needed, thought it might be, for excess depth error -export interface SchemaErrors extends Extension { - name: `SchemaErrors` - config: undefined - onRequest: RequestPipelineBaseInterceptor - builder: undefined - transport: undefined - typeHooks: { - onRequestDocumentRootType: [OnRequestDocumentRootType_] - onRequestResult: [OnRequestResult_] - requestResultDataTypes: never - } -} - -export const SchemaErrors: () => SchemaErrors = Extension.create({ - name: `SchemaErrors`, - create({ typeHooks }) { +export const SchemaErrors = Extension + .build(`SchemaErrors`) + .constructor(() => { return { - typeHooks: typeHooks - .onRequestDocumentRootType() - .onRequestResult(), - async onRequest({ pack }) { + async requestInterceptor({ pack }) { const state = pack.input.state const sddm = state.schemaMap @@ -86,37 +70,39 @@ export const SchemaErrors: () => SchemaErrors = Extension.create({ return result }, } - }, -}) - -type OnRequestDocumentRootType<$Params extends Extension.TypeHooks.OnRequestDocumentRootType.Params> = - $Params['selectionRootType'] - -// dprint-ignore -interface OnRequestResult<$Arguments extends Extension.TypeHooks.OnRequestResult.Params> - { - result: { - data?: - | null - | { - [$Key in keyof ExcludeNullAndUndefined<$Arguments['result']['data']>]: - Exclude< - ExcludeNullAndUndefined<$Arguments['result']['data']>[$Key], - { __typename: $Arguments['registeredSchema']['schema']['extensions']['SchemaErrors']['objectNames'] } - > - } - } & Omit<$Arguments['result'], 'data'> - registeredSchema: $Arguments['registeredSchema'] - } - -// --------- Boilerplate Types --------- - -interface OnRequestDocumentRootType_ extends Extension.TypeHooks.OnRequestDocumentRootType { - // @ts-expect-error untyped params - return: OnRequestDocumentRootType -} - -interface OnRequestResult_ extends Extension.TypeHooks.OnRequestResult { - // @ts-expect-error untyped params - return: OnRequestResult -} + }) +// todo +// .onRequestDocumentRootType() +// .onRequestResult() + +// type OnRequestDocumentRootType<$Params extends Extension.TypeHooks.OnRequestDocumentRootType.Params> = +// $Params['selectionRootType'] + +// // dprint-ignore +// interface OnRequestResult<$Arguments extends Extension.TypeHooks.OnRequestResult.Params> +// { +// result: { +// data?: +// | null +// | { +// [$Key in keyof ExcludeNullAndUndefined<$Arguments['result']['data']>]: +// Exclude< +// ExcludeNullAndUndefined<$Arguments['result']['data']>[$Key], +// { __typename: $Arguments['registeredSchema']['schema']['extensions']['SchemaErrors']['objectNames'] } +// > +// } +// } & Omit<$Arguments['result'], 'data'> +// registeredSchema: $Arguments['registeredSchema'] +// } + +// // --------- Boilerplate Types --------- + +// interface OnRequestDocumentRootType_ extends Extension.TypeHooks.OnRequestDocumentRootType { +// // @ts-expect-error untyped params +// return: OnRequestDocumentRootType +// } + +// interface OnRequestResult_ extends Extension.TypeHooks.OnRequestResult { +// // @ts-expect-error untyped params +// return: OnRequestResult +// } diff --git a/src/extensions/SchemaErrors/tests/SchemaError.test-d.ts b/src/extensions/SchemaErrors/tests/SchemaError.test-d.ts index 17028cc2e..b393109dc 100644 --- a/src/extensions/SchemaErrors/tests/SchemaError.test-d.ts +++ b/src/extensions/SchemaErrors/tests/SchemaError.test-d.ts @@ -1,19 +1,19 @@ import { describe, expectTypeOf, test } from 'vitest' -import { type Extension } from '../../../extension/__.js' +import { type Extension } from '../../../extension/$.js' import { SchemaErrors } from '../runtime.js' import { GraffleSchemaErrors } from './fixture/graffle/__.js' -const g = GraffleSchemaErrors.create({ checkPreflight: false }).use(SchemaErrors()) +const g = GraffleSchemaErrors.create({ check: { preflight: false } }).use(SchemaErrors()) // todo move test to test suite for .use method -test(`config type is augmented with type hook`, () => { - expectTypeOf().toMatchTypeOf<[Extension.TypeHooks.OnRequestResult]>() -}) +// test(`config type is augmented with type hook`, () => { +// expectTypeOf().toMatchTypeOf<[Extension.TypeHooks.OnRequestResult]>() +// }) -test(`config type is augmented with type hook after "with"`, () => { - const g2 = g.with({ output: { defaults: { errorChannel: `throw` } } }) - expectTypeOf().toMatchTypeOf<[Extension.TypeHooks.OnRequestResult]>() -}) +// test(`config type is augmented with type hook after "with"`, () => { +// const g2 = g.with({ output: { defaults: { errorChannel: `throw` } } }) +// expectTypeOf().toMatchTypeOf<[Extension.TypeHooks.OnRequestResult]>() +// }) const resultFieldSelect = GraffleSchemaErrors.Select.Query({ resultNonNull: { $: { $case: `Object1` }, __typename: true } })[`resultNonNull`] diff --git a/src/extensions/SchemaErrors/tests/fixture/graffle/modules/client.ts b/src/extensions/SchemaErrors/tests/fixture/graffle/modules/client.ts index ec2b94a3c..470211baf 100644 --- a/src/extensions/SchemaErrors/tests/fixture/graffle/modules/client.ts +++ b/src/extensions/SchemaErrors/tests/fixture/graffle/modules/client.ts @@ -5,8 +5,8 @@ import * as $$Data from './data.js' import * as $$Scalar from './scalar.js' import * as $$SchemaDrivenDataMap from './schema-driven-data-map.js' -const context = $$Utilities.useReducer( - $$Utilities.useReducer( +const context = $$Utilities.contextFragmentExtensionsAdd( + $$Utilities.contextFragmentExtensionsAdd( { ...$$Utilities.Context.States.empty, name: $$Data.Name, diff --git a/src/extensions/SchemaErrors/tests/fixture/graffle/modules/methods-root.ts b/src/extensions/SchemaErrors/tests/fixture/graffle/modules/methods-root.ts index 65bfe6502..ecaca986f 100644 --- a/src/extensions/SchemaErrors/tests/fixture/graffle/modules/methods-root.ts +++ b/src/extensions/SchemaErrors/tests/fixture/graffle/modules/methods-root.ts @@ -3,7 +3,7 @@ import * as $$Schema from './schema.js' import * as $$SelectionSets from './selection-sets.js' export interface QueryMethods<$Context extends $$Utilities.Context> { - $batch: $$Utilities.ClientTransports.PreflightCheck< + $batch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query<$Context['scalars']>>, @@ -18,7 +18,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > > - __typename: $$Utilities.ClientTransports.PreflightCheck< + __typename: $$Utilities.ContextTransports.PreflightCheck< $Context, () => Promise< & (null | {}) @@ -30,7 +30,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - InputObjectNested: $$Utilities.ClientTransports.PreflightCheck< + InputObjectNested: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.InputObjectNested<$Context['scalars']>>, @@ -47,7 +47,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - InputObjectNestedNonNull: $$Utilities.ClientTransports.PreflightCheck< + InputObjectNestedNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -69,7 +69,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Query enum field documentation. */ - abcEnum: $$Utilities.ClientTransports.PreflightCheck< + abcEnum: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.abcEnum<$Context['scalars']>>, @@ -86,7 +86,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - argInputObjectCircular: $$Utilities.ClientTransports.PreflightCheck< + argInputObjectCircular: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact< @@ -106,7 +106,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - date: $$Utilities.ClientTransports.PreflightCheck< + date: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.date<$Context['scalars']>>, @@ -123,7 +123,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArg: $$Utilities.ClientTransports.PreflightCheck< + dateArg: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateArg<$Context['scalars']>>, @@ -140,7 +140,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArgInputObject: $$Utilities.ClientTransports.PreflightCheck< + dateArgInputObject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateArgInputObject<$Context['scalars']>>, @@ -157,7 +157,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArgList: $$Utilities.ClientTransports.PreflightCheck< + dateArgList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateArgList<$Context['scalars']>>, @@ -174,7 +174,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArgNonNull: $$Utilities.ClientTransports.PreflightCheck< + dateArgNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateArgNonNull<$Context['scalars']>>, @@ -191,7 +191,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArgNonNullList: $$Utilities.ClientTransports.PreflightCheck< + dateArgNonNullList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateArgNonNullList<$Context['scalars']>>, @@ -208,7 +208,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArgNonNullListNonNull: $$Utilities.ClientTransports.PreflightCheck< + dateArgNonNullListNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -228,7 +228,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateInterface1: $$Utilities.ClientTransports.PreflightCheck< + dateInterface1: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateInterface1<$Context['scalars']>>, @@ -245,7 +245,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateList: $$Utilities.ClientTransports.PreflightCheck< + dateList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateList<$Context['scalars']>>, @@ -262,7 +262,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateListList: $$Utilities.ClientTransports.PreflightCheck< + dateListList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateListList<$Context['scalars']>>, @@ -279,7 +279,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateListNonNull: $$Utilities.ClientTransports.PreflightCheck< + dateListNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateListNonNull<$Context['scalars']>>, @@ -296,7 +296,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateNonNull: $$Utilities.ClientTransports.PreflightCheck< + dateNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateNonNull<$Context['scalars']>>, @@ -313,7 +313,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateObject1: $$Utilities.ClientTransports.PreflightCheck< + dateObject1: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateObject1<$Context['scalars']>>, @@ -330,7 +330,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateUnion: $$Utilities.ClientTransports.PreflightCheck< + dateUnion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateUnion<$Context['scalars']>>, @@ -347,7 +347,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - error: $$Utilities.ClientTransports.PreflightCheck< + error: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.error<$Context['scalars']>>, @@ -364,7 +364,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - id: $$Utilities.ClientTransports.PreflightCheck< + id: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.id<$Context['scalars']>>, @@ -381,7 +381,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - idNonNull: $$Utilities.ClientTransports.PreflightCheck< + idNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.idNonNull<$Context['scalars']>>, @@ -398,7 +398,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interface: $$Utilities.ClientTransports.PreflightCheck< + interface: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.$interface<$Context['scalars']>>, @@ -415,7 +415,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceHierarchyChildA: $$Utilities.ClientTransports.PreflightCheck< + interfaceHierarchyChildA: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -435,7 +435,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceHierarchyChildB: $$Utilities.ClientTransports.PreflightCheck< + interfaceHierarchyChildB: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -455,7 +455,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceHierarchyGrandparents: $$Utilities.ClientTransports.PreflightCheck< + interfaceHierarchyGrandparents: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -475,7 +475,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceHierarchyParents: $$Utilities.ClientTransports.PreflightCheck< + interfaceHierarchyParents: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -495,7 +495,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceNonNull: $$Utilities.ClientTransports.PreflightCheck< + interfaceNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.interfaceNonNull<$Context['scalars']>>, @@ -512,7 +512,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceWithArgs: $$Utilities.ClientTransports.PreflightCheck< + interfaceWithArgs: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.interfaceWithArgs<$Context['scalars']>>, @@ -529,7 +529,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - listInt: $$Utilities.ClientTransports.PreflightCheck< + listInt: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.listInt<$Context['scalars']>>, @@ -546,7 +546,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - listIntNonNull: $$Utilities.ClientTransports.PreflightCheck< + listIntNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.listIntNonNull<$Context['scalars']>>, @@ -563,7 +563,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - listListInt: $$Utilities.ClientTransports.PreflightCheck< + listListInt: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.listListInt<$Context['scalars']>>, @@ -580,7 +580,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - listListIntNonNull: $$Utilities.ClientTransports.PreflightCheck< + listListIntNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.listListIntNonNull<$Context['scalars']>>, @@ -597,7 +597,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - lowerCaseUnion: $$Utilities.ClientTransports.PreflightCheck< + lowerCaseUnion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.lowerCaseUnion<$Context['scalars']>>, @@ -614,7 +614,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - object: $$Utilities.ClientTransports.PreflightCheck< + object: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.$object<$Context['scalars']>>, @@ -631,7 +631,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - objectList: $$Utilities.ClientTransports.PreflightCheck< + objectList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.objectList<$Context['scalars']>>, @@ -648,7 +648,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - objectListNonNull: $$Utilities.ClientTransports.PreflightCheck< + objectListNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.objectListNonNull<$Context['scalars']>>, @@ -665,7 +665,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - objectNested: $$Utilities.ClientTransports.PreflightCheck< + objectNested: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.objectNested<$Context['scalars']>>, @@ -682,7 +682,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - objectNonNull: $$Utilities.ClientTransports.PreflightCheck< + objectNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.objectNonNull<$Context['scalars']>>, @@ -699,7 +699,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - objectWithArgs: $$Utilities.ClientTransports.PreflightCheck< + objectWithArgs: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.objectWithArgs<$Context['scalars']>>, @@ -716,7 +716,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - result: $$Utilities.ClientTransports.PreflightCheck< + result: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.result<$Context['scalars']>>, @@ -733,7 +733,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - resultNonNull: $$Utilities.ClientTransports.PreflightCheck< + resultNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.resultNonNull<$Context['scalars']>>, @@ -750,7 +750,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - string: $$Utilities.ClientTransports.PreflightCheck< + string: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.$string<$Context['scalars']>>, @@ -767,7 +767,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithArgEnum: $$Utilities.ClientTransports.PreflightCheck< + stringWithArgEnum: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.stringWithArgEnum<$Context['scalars']>>, @@ -784,7 +784,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithArgInputObject: $$Utilities.ClientTransports.PreflightCheck< + stringWithArgInputObject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact< @@ -804,7 +804,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithArgInputObjectEnum: $$Utilities.ClientTransports.PreflightCheck< + stringWithArgInputObjectEnum: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -824,7 +824,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithArgInputObjectRequired: $$Utilities.ClientTransports.PreflightCheck< + stringWithArgInputObjectRequired: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -846,7 +846,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * The given arguments are reflected back as a JSON string. */ - stringWithArgs: $$Utilities.ClientTransports.PreflightCheck< + stringWithArgs: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.stringWithArgs<$Context['scalars']>>, @@ -863,7 +863,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithListArg: $$Utilities.ClientTransports.PreflightCheck< + stringWithListArg: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.stringWithListArg<$Context['scalars']>>, @@ -880,7 +880,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithListArgRequired: $$Utilities.ClientTransports.PreflightCheck< + stringWithListArgRequired: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -900,7 +900,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithRequiredArg: $$Utilities.ClientTransports.PreflightCheck< + stringWithRequiredArg: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.stringWithRequiredArg<$Context['scalars']>>, @@ -917,7 +917,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - unionFooBar: $$Utilities.ClientTransports.PreflightCheck< + unionFooBar: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.unionFooBar<$Context['scalars']>>, @@ -934,7 +934,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - unionFooBarNonNull: $$Utilities.ClientTransports.PreflightCheck< + unionFooBarNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.unionFooBarNonNull<$Context['scalars']>>, @@ -951,7 +951,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - unionFooBarWithArgs: $$Utilities.ClientTransports.PreflightCheck< + unionFooBarWithArgs: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.unionFooBarWithArgs<$Context['scalars']>>, @@ -968,7 +968,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - unionObject: $$Utilities.ClientTransports.PreflightCheck< + unionObject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.unionObject<$Context['scalars']>>, @@ -985,7 +985,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - unionObjectNonNull: $$Utilities.ClientTransports.PreflightCheck< + unionObjectNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.unionObjectNonNull<$Context['scalars']>>, @@ -1004,7 +1004,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { } export interface MutationMethods<$Context extends $$Utilities.Context> { - $batch: $$Utilities.ClientTransports.PreflightCheck< + $batch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation<$Context['scalars']>>, @@ -1019,7 +1019,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > > - __typename: $$Utilities.ClientTransports.PreflightCheck< + __typename: $$Utilities.ContextTransports.PreflightCheck< $Context, () => Promise< & (null | {}) @@ -1031,7 +1031,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > - id: $$Utilities.ClientTransports.PreflightCheck< + id: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.id<$Context['scalars']>>, @@ -1048,7 +1048,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > - idNonNull: $$Utilities.ClientTransports.PreflightCheck< + idNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.idNonNull<$Context['scalars']>>, diff --git a/src/extensions/Throws/Throws.ts b/src/extensions/Throws/Throws.ts index 28b43abab..1854b66b1 100644 --- a/src/extensions/Throws/Throws.ts +++ b/src/extensions/Throws/Throws.ts @@ -1,53 +1,39 @@ -import type { Client, ExtensionChainable } from '../../client/client.js' -import { type Context, create } from '../../entrypoints/extensionkit.js' -import { type ConfigInit, type OutputConfig } from '../../entrypoints/main.js' -import type { ConfigManager } from '../../lib/config-manager/__.js' +import type { Client } from '../../client/client.js' +import type { ContextFragmentConfigurationConfigure } from '../../client/properties/configuration/configuration.js' +import type { Properties } from '../../client/properties/properties/__.js' +import { Extension } from '../../entrypoints/extension.js' +// import { type Normalized } from '../../entrypoints/main.js' +// import type { ConfigManager } from '../../lib/config-manager/__.js' +import type { Configurators } from '../../types/configurators/_namespace.js' +import type { Context } from '../../types/context.js' -export const Throws = create({ - name: `Throws`, - create: ({ builder }) => { - return { - builder: builder(({ client, context }) => { - // todo redesign input to allow to force throw always - // todo pull pre-configured config from core - const throwsifiedInput: ConfigInit = { - output: { - envelope: { - enabled: context.output.envelope.enabled, - // @ts-expect-error - errors: { execution: false, other: false, schema: false }, - }, - // @ts-expect-error - errors: { execution: `throw`, other: `throw`, schema: `throw` }, - }, - } - return { - throws: () => client.with(throwsifiedInput), - } - }), +export const Throws = Extension(`throws`) + .properties(({ configuration, client }) => { + // todo redesign input to allow to force throw always + // todo pull pre-configured config from core + const throwsConfiguration: Configurators.Output.Input = { + envelope: { + enabled: configuration.output.current.envelope.enabled, + // @ts-expect-error + errors: { execution: false, other: false, schema: false }, + }, + // @ts-expect-error + errors: { execution: `throw`, other: `throw`, schema: `throw` }, } - }, -}) -interface BuilderExtension extends ExtensionChainable { - // @ts-expect-error - return: BuilderExtension_ -} + const properties: Properties = { + throws: () => client.with({ output: throwsConfiguration }), + } as any + + return properties + }) -interface BuilderExtension_<$Context extends Context> { - // return: BuilderExtension_>> +interface Properties extends Properties.PropertiesComputerTypeFunction { + return: Properties_ +} +// dprint-ignore +interface Properties_<$Context extends Context> { throws: () => Client< - { - [_ in keyof $Context]: _ extends 'output' ? ThrowsifyConfig<$Context['output']> - : $Context[_] - }, - // todo - {} // this['params'][1] + ContextFragmentConfigurationConfigure<$Context, { output: { errors: { execution: 'throw'; other: 'throw' }}}> > } - -type ThrowsifyConfig<$OutputConfig extends OutputConfig> = ConfigManager.SetKey< - $OutputConfig, - 'errors', - { other: 'throw'; execution: 'throw' } -> diff --git a/src/extensions/TransportHttp/TransportHttp.ts b/src/extensions/TransportHttp/TransportHttp.ts index 3414faf2c..14896ecfd 100644 --- a/src/extensions/TransportHttp/TransportHttp.ts +++ b/src/extensions/TransportHttp/TransportHttp.ts @@ -1,28 +1,27 @@ -import { create, type Extension } from '../../entrypoints/extensionkit.js' -import type { TypeHooksEmpty } from '../../extension/TypeHooks.js' -import type { Anyware } from '../../lib/anyware/__.js' -import type { ConfigManager } from '../../lib/config-manager/__.js' +import { Configurator, Extension, Transport } from '../../entrypoints/extension.js' +import type { Anyware } from '../../lib/anyware/_namespace.js' import type { Grafaid } from '../../lib/grafaid/__.js' import { OperationTypeToAccessKind, print } from '../../lib/grafaid/document.js' import { getRequestEncodeSearchParameters, postRequestEncodeBody } from '../../lib/grafaid/http/http.js' import { getRequestHeadersRec, parseExecutionResult, postRequestHeadersRec } from '../../lib/grafaid/http/http.js' import { mergeRequestInit, searchParamsAppendAll } from '../../lib/http.js' import type { httpMethodGet, httpMethodPost } from '../../lib/http.js' -import { _, isString, type MaybePromise, type PartialOrUndefined } from '../../lib/prelude.js' +import { _, isString, type MaybePromise } from '../../lib/prelude.js' import type { RequestPipeline } from '../../requestPipeline/RequestPipeline.js' -export const MethodMode = { - post: `post`, - getReads: `getReads`, -} as const +// ---------------------------- +// Configuration +// ---------------------------- -export type MethodModeGetReads = typeof MethodMode['getReads'] +type TransportHttpConfigurator = Configurator< + ConfigurationInput, + ConfigurationNormalized, + ConfigurationDefault, + Configurator.InputResolver +> -export type MethodModePost = typeof MethodMode['post'] - -export type MethodMode = MethodModePost | MethodModeGetReads - -export type TransportHttpInput = { +export type ConfigurationInput = { + url?: URL | string /** * The HTTP method to use to make the request. * @@ -41,49 +40,64 @@ export type TransportHttpInput = { raw?: RequestInit } -export interface TransportHttpConstructor { - <$ConfigInit extends ConfigInit = ConfigInitEmpty>( - configInit?: $ConfigInit, - ): TransportHttp> -} - -export interface Configuration { - url: URL | string +export interface ConfigurationNormalized { + url: URL methodMode: MethodMode - headers?: HeadersInit + headers?: Headers raw?: RequestInit } -export interface ConfigDefaults { - methodMode: 'post' -} - -export const configDefaults: ConfigDefaults = { +export const configurationDefault = { methodMode: `post`, +} satisfies Partial +export type ConfigurationDefault = typeof configurationDefault + +export interface ConfigurationInputResolver$Func + extends Configurator.InputResolver.$Func +{ + return: ConfigurationInputResolver$Func_ +} +// dprint-ignore +export interface ConfigurationInputResolver$Func_< + $Parameters extends Configurator.InputResolver.Parameters, + _Input = $Parameters['input'], + _Current = $Parameters['current'], +> extends Partial { + url: 'url' extends keyof _Current ? URL : 'url' extends keyof _Input ? URL : undefined + methodMode: 'methodMode' extends keyof _Current ? MethodMode : 'methodMode' extends keyof _Input ? MethodMode : undefined } -export type ConfigInit = PartialOrUndefined +export const MethodMode = { + post: `post`, + getReads: `getReads`, +} as const -export interface ConfigInitEmpty {} +export type MethodModeGetReads = typeof MethodMode['getReads'] -export interface TransportHttp<$Input extends PartialOrUndefined> extends Extension { - name: `TransportHttp` - config: Configuration - transport: { - name: 'http' - config: Configuration - configInit: $Input - configDefaults: PartialOrUndefined - requestPipelineOverload: RequestPipelineOverload - } - typeHooks: TypeHooksEmpty - onRequest: undefined - builder: undefined -} +export type MethodModePost = typeof MethodMode['post'] + +export type MethodMode = MethodModePost | MethodModeGetReads + +const httpTransportConfigurator = Configurator() + .input() + .normalized() + .default(configurationDefault) + .inputResolver(({ current, input }) => { + // todo + input + return current + }) -export interface RequestPipelineOverload extends Anyware.Overload { - discriminant: ['transportType', 'http'] - input: Configuration +// ---------------------------- +// Transport +// ---------------------------- + +export interface RequestPipelineOverload extends Anyware.Overload.Data { + discriminant: { + name: 'transportType' + value: 'http' + } + input: ConfigurationNormalized inputInit: {} steps: { pack: { @@ -150,107 +164,116 @@ type ExchangeGetRequest = Omit & { url: string | URL } -export const TransportHttp: TransportHttpConstructor = create({ - name: `TransportHttp`, - normalizeConfig: (configInit?: ConfigInit) => { - return { - ...configDefaults, - ...configInit, - url: configInit?.url ? new URL(configInit.url) : undefined, - } - }, - create({ config }) { - return { - transport(create) { - return create(`http`) - .config() - .defaults(config) - // .configInit>() - .stepWithExtendedInput<{ headers?: HeadersInit }>()(`pack`, { - slots: { - searchParams: getRequestEncodeSearchParameters, - body: postRequestEncodeBody, - }, - run: (input, slots) => { - const graphqlRequest: Grafaid.HTTP.RequestConfig = { - operationName: input.request.operationName, - variables: input.request.variables, - query: print(input.request.query), - } +// ---------------------------- +// Extension +// ---------------------------- - const operationType = isString(input.request.operation) - ? input.request.operation - : input.request.operation.operation - const methodMode = input.methodMode - const requestMethod = methodMode === MethodMode.post - ? `post` - : OperationTypeToAccessKind[operationType] === `read` - ? `get` - : `post` +export interface TransportHttpConstructor { + (): TransportHttp +} + +export type TransportHttp = Extension.Data< + `TransportHttp`, + undefined, + unknown, + {}, + [], + Transport< + 'http', + TransportHttpConfigurator + > +> + +export const TransportHttp: TransportHttpConstructor = Extension.create(`TransportHttp`) + .transport( + Transport(`http`) + .configurator(httpTransportConfigurator) + // todo currently the configurator data is spread into the input however it should be concentrated into a transport data prop and then + // each step should have the possibility of getting its own configurator too. + // .packInput<{ headers?: HeadersInit }>() + .pack({ + slots: { + searchParams: getRequestEncodeSearchParameters, + body: postRequestEncodeBody, + }, + run: (input, slots) => { + const graphqlRequest: Grafaid.HTTP.RequestConfig = { + operationName: input.request.operationName, + variables: input.request.variables, + query: print(input.request.query), + } - const baseProperties = mergeRequestInit( - mergeRequestInit( - mergeRequestInit( - { - headers: requestMethod === `get` ? getRequestHeadersRec : postRequestHeadersRec, - }, - { - headers: input.headers, - }, - ), - input.raw, - ), + const operationType = isString(input.request.operation) + ? input.request.operation + : input.request.operation.operation + const methodMode = input.methodMode + const requestMethod = methodMode === MethodMode.post + ? `post` + : OperationTypeToAccessKind[operationType] === `read` + ? `get` + : `post` + + const baseProperties = mergeRequestInit( + mergeRequestInit( + mergeRequestInit( + { + headers: requestMethod === `get` ? getRequestHeadersRec : postRequestHeadersRec, + }, { headers: input.headers, }, - ) - const request: ExchangeRequest = requestMethod === `get` - ? { - methodMode: methodMode as MethodModeGetReads, - ...baseProperties, - method: `get`, - url: searchParamsAppendAll(input.url, slots.searchParams(graphqlRequest)), - } - : { - methodMode: methodMode, - ...baseProperties, - method: `post`, - url: input.url, - body: slots.body(graphqlRequest), - } - return { - ...input, - request, - } - }, - }) - .step(`exchange`, { - slots: { - fetch: (request: Request): MaybePromise => fetch(request), - }, - run: async (input, slots) => { - const request = new Request(input.request.url, input.request) - const response = await slots.fetch(request) - return { - ...input, - response, - } + ), + input.raw, + ), + { + headers: input.headers, }, - }) - .step(`unpack`, { - run: async (input) => { - // todo 1 if response is missing header of content length then .json() hangs forever. - // firstly consider a timeout, secondly, if response is malformed, then don't even run .json() - // todo 2 if response is e.g. 404 with no json body, then an error is thrown because json parse cannot work, not gracefully handled here - const json = await input.response.json() as object - const result = parseExecutionResult(json) - return { - ...input, - result, - } - }, - }) - }, - } - }, -}) + ) + const request: ExchangeRequest = requestMethod === `get` + ? { + methodMode: methodMode as MethodModeGetReads, + ...baseProperties, + method: `get`, + url: searchParamsAppendAll(input.url, slots.searchParams(graphqlRequest)), + } + : { + methodMode: methodMode, + ...baseProperties, + method: `post`, + url: input.url, + body: slots.body(graphqlRequest), + } + return { + ...input, + request, + } + }, + }) + .exchange({ + slots: { + fetch: (request: Request): MaybePromise => fetch(request), + }, + run: async (input, slots) => { + const request = new Request(input.request.url, input.request) + const response = await slots.fetch(request) + return { + ...input, + response, + } + }, + }) + .unpack({ + run: async (input) => { + // todo 1 if response is missing header of content length then .json() hangs forever. + // firstly consider a timeout, secondly, if response is malformed, then don't even run .json() + // todo 2 if response is e.g. 404 with no json body, then an error is thrown because json parse cannot work, not gracefully handled here + const json = await input.response.json() as object + const result = parseExecutionResult(json) + return { + ...input, + result, + } + }, + }), + ) + .return() diff --git a/src/extensions/TransportHttp/client.transport-http.test.ts b/src/extensions/TransportHttp/client.transport-http.test.ts index 0ae9a5ecc..ca948fe4d 100644 --- a/src/extensions/TransportHttp/client.transport-http.test.ts +++ b/src/extensions/TransportHttp/client.transport-http.test.ts @@ -36,6 +36,7 @@ const url = new URL(`https://foo.io/api/graphql`) test(`when envelope is used then response property is present even if relying on schema url default`, async () => { const service = await serveSchema({ schema: schemaPokemon }) const pokemon = Pokemon.create({ output: { envelope: true } }) + pokemon._.transports.configurations.http const result = await pokemon.query.pokemons({ name: true }) await service.stop() // @ts-expect-error fixme @@ -89,6 +90,7 @@ describe(`configuration`, () => { test(`can set headers`, async ({ fetch }) => { fetch.mockImplementationOnce(() => Promise.resolve(createResponse({ data: { id: `abc` } }))) const graffle = Graffle.create().transport({ url, headers: { 'x-foo': `bar` } }) + graffle._.transports.configurations.http.headers await graffle.gql`query { id }`.send() const request = fetch.mock.calls[0]?.[0] expect(request?.headers.get(`x-foo`)).toEqual(`bar`) diff --git a/src/extensions/TransportMemory/TransportMemory.ts b/src/extensions/TransportMemory/TransportMemory.ts index de771a691..e89da4b8e 100644 --- a/src/extensions/TransportMemory/TransportMemory.ts +++ b/src/extensions/TransportMemory/TransportMemory.ts @@ -1,20 +1,15 @@ -import type { Extension } from '../../extension/__.js' -import { create } from '../../extension/extension.js' -import type { TypeHooksEmpty } from '../../extension/TypeHooks.js' -import type { Anyware } from '../../lib/anyware/__.js' +import { Configurator, Extension, Transport } from '../../entrypoints/extension.js' +import type { Anyware } from '../../lib/anyware/_namespace.js' import type { Grafaid } from '../../lib/grafaid/__.js' import { print } from '../../lib/grafaid/document.js' import { execute } from '../../lib/grafaid/execute.js' -import type { PartialOrUndefined } from '../../lib/prelude.js' import type { RequestPipeline } from '../../requestPipeline/RequestPipeline.js' -export interface TransportMemoryConstructor { - <$ConfigurationInit extends ConfigurationInit = ConfigurationInitEmpty>( - configurationInit?: $ConfigurationInit, - ): TransportMemory<$ConfigurationInit> -} +// ---------------------------- +// Configuration +// ---------------------------- -export interface Configuration { +export interface ConfigurationNormalized { /** * The schema to execute documents against. */ @@ -35,29 +30,24 @@ export interface Configuration { } } -export type ConfigurationInit = PartialOrUndefined +export type ConfigurationInput = Partial -export interface ConfigurationInitEmpty {} +type TransportMemoryConfigurator = Configurator< + ConfigurationInput, + ConfigurationNormalized, + {} +> -export interface TransportMemory<$ConfigInit extends ConfigurationInit = ConfigurationInitEmpty> extends Extension { - name: `TransportMemory` - config: Configuration - configInit: $ConfigInit - transport: { - name: 'memory' - config: Configuration - configInit: $ConfigInit - configDefaults: PartialOrUndefined - requestPipelineOverload: RequestPipelineOverload - } - typeHooks: TypeHooksEmpty - onRequest: undefined - builder: undefined -} +// ---------------------------- +// Transport +// ---------------------------- -export interface RequestPipelineOverload extends Anyware.Overload { - discriminant: ['transportType', 'memory'] - input: Configuration +export interface RequestPipelineOverload extends Anyware.Overload.Data { + discriminant: { + name: 'transportType' + value: 'memory' + } + input: ConfigurationNormalized inputInit: {} steps: { pack: { @@ -91,48 +81,78 @@ export interface PackOutput extends Omit { export interface ExchangeOutput extends PackOutput {} -export const TransportMemory: TransportMemoryConstructor = create({ - name: `TransportMemory`, - normalizeConfig: (input?: { schema?: Grafaid.Schema.Schema }) => ({ - schema: input?.schema ?? undefined, - }), +// ---------------------------- +// Extension +// ---------------------------- - create({ config }) { - return { - transport(create) { - return create(`memory`) - .config() - .configInit<{}>() - .defaults(config) - .step(`pack`, { - run: (input) => { - const graphqlRequest: Grafaid.HTTP.RequestConfig = { - operationName: input.request.operationName, - variables: input.request.variables, - query: print(input.request.query), - } - return { - ...input, - request: graphqlRequest, - } - }, - }) - .step(`exchange`, { - run: async (input) => { - const result = await execute(input) - return { - ...input, - result, +export type TransportMemory = Extension.Data< + `TransportMemory`, + undefined, + unknown, + {}, + readonly [], + Transport< + 'memory', + TransportMemoryConfigurator + >, + undefined +> + +export const TransportMemory: TransportMemory = Extension + .create(`TransportMemory`) + .transport( + Transport(`memory`) + .configurator( + Configurator() + .input() + .normalized() + .inputResolver(({ current, input }) => { + const next = { + ...current, + } + + if (input?.schema) next.schema = input.schema + + if (input?.resolverValues) { + next.resolverValues = { + ...current?.resolverValues, + ...input.resolverValues, } - }, - }) - // todo remove (need runtime passthrough logic) - .step(`unpack`, { - run: (input) => { - return input - }, + } + + return next + }), + ) + .pack({ + run(input) { + const graphqlRequest: Grafaid.HTTP.RequestConfig = { + operationName: input.request.operationName, + variables: input.request.variables, + query: print(input.request.query), + } + return { + ...input, + request: graphqlRequest, + } + }, + }) + .exchange({ + run: async (input) => { + const result = await execute({ + // todo: should be type safe + schema: input.transport.schema, + request: input.request, }) - }, - } - }, -}) + return { + ...input, + result, + } + }, + }) + .unpack({ + run(input) { + return input + }, + }), + ) + .return() diff --git a/src/extensions/Upload/Upload.test.ts b/src/extensions/Upload/Upload.test.ts index ea2f6b527..c0d4ce013 100644 --- a/src/extensions/Upload/Upload.test.ts +++ b/src/extensions/Upload/Upload.test.ts @@ -10,7 +10,7 @@ import { type SchemaService, serveSchema } from '../../../tests/_/lib/serveSchem import type { GraffleMinimal } from '../../entrypoints/presets/minimal.js' interface Context { - graffle: GraffleMinimal.Client.With<{ checkPreflight: false }> + graffle: GraffleMinimal.Client.With<{ check: { preflight: false } }> schemaServer: SchemaService } @@ -21,7 +21,7 @@ const test = testBase.extend({ await schemaServer.stop() }, graffle: async ({ schemaServer }, use) => { - const graffle = Graffle.create({ checkPreflight: false }).transport({ url: schemaServer.url }).use(Upload()) + const graffle = Graffle.create({ check: { preflight: false } }).transport({ url: schemaServer.url }).use(Upload()) await use(graffle as any) }, }) diff --git a/src/extensions/Upload/Upload.ts b/src/extensions/Upload/Upload.ts index ca6bb36bd..3ec8a243f 100644 --- a/src/extensions/Upload/Upload.ts +++ b/src/extensions/Upload/Upload.ts @@ -1,4 +1,4 @@ -import { Extension } from '../../entrypoints/extensionkit.js' +import { Extension } from '../../entrypoints/extension.js' import type { RequestAnalyzedInput } from '../../lib/grafaid/graphql.js' import { createBody } from './createBody.js' @@ -8,51 +8,45 @@ import { createBody } from './createBody.js' /** * @see https://github.com/jaydenseric/graphql-multipart-request-spec */ -export const Upload = Extension.create({ - name: `Upload`, - create() { - return { - async onRequest({ pack }) { - if (!isUploadRequest(pack.input.request)) return pack() +export const Upload = Extension(`Upload`) + .requestInterceptor(async ({ pack }) => { + if (!isUploadRequest(pack.input.request)) return pack() - // TODO we can probably get file upload working for in-memory schemas too :) - // @ts-expect-error fixme - if (pack.input.transportType !== `http`) { - throw new Error(`Must be using http transport to use "Upload" scalar.`) - } + // TODO we can probably get file upload working for in-memory schemas too :) + // @ts-expect-error fixme + if (pack.input.transportType !== `http`) { + throw new Error(`Must be using http transport to use "Upload" scalar.`) + } - // Remove the content-type header so that fetch sets it automatically upon seeing the body is a FormData instance. - // @see https://muffinman.io/blog/uploading-files-using-fetch-multipart-form-data/ - // @see https://stackoverflow.com/questions/3508338/what-is-the-boundary-in-multipart-form-data - // @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition - return await pack({ - using: { - // @ts-expect-error fixme - body: (input) => { - // TODO we can probably get file upload working for in-memory schemas too :) - // @ts-expect-error fixme - if (pack.input.transportType !== `http`) { - throw new Error(`Must be using http transport to use "Upload" scalar.`) - } + // Remove the content-type header so that fetch sets it automatically upon seeing the body is a FormData instance. + // @see https://muffinman.io/blog/uploading-files-using-fetch-multipart-form-data/ + // @see https://stackoverflow.com/questions/3508338/what-is-the-boundary-in-multipart-form-data + // @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition + return await pack({ + using: { + // @ts-expect-error fixme + body: (input) => { + // TODO we can probably get file upload working for in-memory schemas too :) + // @ts-expect-error fixme + if (pack.input.transportType !== `http`) { + throw new Error(`Must be using http transport to use "Upload" scalar.`) + } - return createBody({ - query: input.query, - variables: input.variables!, - }) - }, - }, - input: { - ...pack.input, - // @ts-expect-error fixme - headers: { - 'content-type': ``, - }, - }, - }) + return createBody({ + query: input.query, + variables: input.variables!, + }) + }, }, - } - }, -}) + input: { + ...pack.input, + // @ts-expect-error fixme + headers: { + 'content-type': ``, + }, + }, + }) + }) const isUploadRequest = (request: RequestAnalyzedInput) => { if (!request.variables) return false diff --git a/src/lib/anyware/Extension/Builder.ts b/src/lib/anyware/Extension/Builder.ts index f9ef2c6a9..f905ce905 100644 --- a/src/lib/anyware/Extension/Builder.ts +++ b/src/lib/anyware/Extension/Builder.ts @@ -1,5 +1,5 @@ -import { Overload } from '../Overload/__.js' -import type { PipelineDefinition } from '../PipelineDef/__.js' +import { Overload } from '../Overload/_namespace.js' +import type { PipelineDefinition } from '../PipelineDefinition/__.js' import type { Extension } from './__.js' type Create = <$Pipeline extends PipelineDefinition>() => Builder<$Pipeline, Extension.States.Empty> @@ -16,7 +16,7 @@ export interface Builder< overloadBuilderCallback: Overload.BuilderCallback<$Pipeline, $OverloadBuilder>, ) => Builder< $Pipeline, - Extension.Updaters.AddOverload<$Extension, $OverloadBuilder['type']> + Extension.Updaters.AddOverload<$Extension, $OverloadBuilder['data']> > } @@ -30,7 +30,7 @@ export namespace Builder { type: extension, overload: (builderCallback) => { const overload = builderCallback({ create: Overload.create }) - extension.overloads.push(overload.type) + extension.overloads.push(overload.data) return builder as any }, } diff --git a/src/lib/anyware/Extension/Updaters.ts b/src/lib/anyware/Extension/Updaters.ts index a279fd65b..aaf57ce4a 100644 --- a/src/lib/anyware/Extension/Updaters.ts +++ b/src/lib/anyware/Extension/Updaters.ts @@ -1,5 +1,5 @@ import type { ConfigManager } from '../../config-manager/__.js' -import type { Overload } from '../Overload/__.js' +import type { Overload } from '../Overload/_namespace.js' import type { Extension } from './__.js' export namespace Updaters { diff --git a/src/lib/anyware/Extension/__.ts b/src/lib/anyware/Extension/__.ts index 2ddc4e5be..29e2b9d99 100644 --- a/src/lib/anyware/Extension/__.ts +++ b/src/lib/anyware/Extension/__.ts @@ -1,4 +1,4 @@ -import type { Overload } from '../Overload/__.js' +import type { Overload } from '../Overload/_namespace.js' export * as Extension from './_.js' diff --git a/src/lib/anyware/Interceptor/Interceptor.test-d.ts b/src/lib/anyware/Interceptor/Interceptor.test-d.ts index 2ae2fbe39..1dc265a28 100644 --- a/src/lib/anyware/Interceptor/Interceptor.test-d.ts +++ b/src/lib/anyware/Interceptor/Interceptor.test-d.ts @@ -1,9 +1,9 @@ import { describe, expectTypeOf, test } from 'vitest' import { _, type ExcludeUndefined } from '../../prelude.js' -import type { Interceptor } from '../_.js' -import { Pipeline, PipelineDefinition } from '../_.js' -import type { initialInput } from '../__.test-helpers.js' -import { results, slots } from '../__.test-helpers.js' +import type { initialInput } from '../_.test-helpers.js' +import { results, slots } from '../_.test-helpers.js' +import type { Interceptor } from '../_exports.js' +import { Pipeline, PipelineDefinition } from '../_exports.js' import type { StepTriggerEnvelope } from '../StepTriggerEnvelope.js' const b0 = PipelineDefinition.create().input() diff --git a/src/lib/anyware/Interceptor/Interceptor.ts b/src/lib/anyware/Interceptor/Interceptor.ts index 9b685941b..bebbb3d3b 100644 --- a/src/lib/anyware/Interceptor/Interceptor.ts +++ b/src/lib/anyware/Interceptor/Interceptor.ts @@ -1,6 +1,6 @@ import type { Simplify } from 'type-fest' import type { Deferred, MaybePromise } from '../../prelude.js' -import type { Pipeline } from '../_.js' +import type { Pipeline } from '../_exports.js' import type { ResultSuccess } from '../Result.js' import type { Step } from '../Step.js' import type { StepTrigger } from '../StepTrigger.js' @@ -11,14 +11,16 @@ export type InterceptorOptions = { } export namespace Interceptor { + // dprint-ignore export interface InferFromPipeline< $Pipeline extends Pipeline = Pipeline, > // $Options extends InterceptorOptions = InterceptorOptions, { - (steps: Simplify>): Promise< - | $Pipeline['output'] - | StepTriggerEnvelope - > + (steps: Simplify>): + Promise< + | $Pipeline['output'] + | StepTriggerEnvelope + > } type InferKeywordArguments< @@ -27,13 +29,12 @@ export namespace Interceptor { $Pipeline['steps'], $Pipeline['output'] > - // dprint-ignore type InferKeywordArguments_< - $Steps extends Step[], + $Steps extends readonly Step[], $PipelineOutput, > = - $Steps extends [infer $NextStep extends Step, ...infer $NextNextSteps extends Step[]] + $Steps extends readonly [infer $NextStep extends Step, ...infer $NextNextSteps extends readonly Step[]] ? & { [_ in $NextStep['name']]: StepTrigger.Infer< diff --git a/src/lib/anyware/Overload/Builder.ts b/src/lib/anyware/Overload/Builder.ts index 8c9e4dab7..7501ceb7f 100644 --- a/src/lib/anyware/Overload/Builder.ts +++ b/src/lib/anyware/Overload/Builder.ts @@ -1,93 +1,90 @@ +import type { Writable } from 'type-fest' import type { ConfigManager } from '../../config-manager/__.js' -import type { Tuple } from '../../prelude.js' -import type { PipelineDefinition } from '../PipelineDef/__.js' +import { Configurator } from '../../configurator/configurator.js' +import { createMutableBuilder } from '../../mutableBuilder.js' +import type { _, Tuple } from '../../prelude.js' +import type { PipelineDefinition } from '../PipelineDefinition/__.js' import type { StepDefinition } from '../StepDefinition.js' -import type { Overload } from './__.js' +import type { Data, DataEmpty } from './Data.js' export const create: Create = (parameters) => { - const overload_: Omit = { + const data: Writable = { discriminant: parameters.discriminant, - inputDefaults: parameters.inputDefaults, + configurator: Configurator.$.empty, steps: {}, } - const overload = overload_ as Overload - - const builder: Builder = { - type: overload, - config: () => builder as any, - defaults: (inputDefaults: object) => { - overload.inputDefaults = inputDefaults - return builder as any - }, - configInit: () => builder as any, - stepWithExtendedInput: () => builder.step as any, - step: (name, spec) => { - overload.steps[name] = { - name, - ...spec, - } as unknown as StepDefinition - return builder as any - }, + const step = (name: string, spec: StepDefinition) => { + data.steps[name] = { + ...spec, + name, + } as unknown as StepDefinition } - - return builder as any + return createMutableBuilder({ + data, + builder: { + configurator(configuratorTypeInput) { + data.configurator = Configurator.$.normalizeDataInput(configuratorTypeInput) + }, + step, + stepWithExtendedInput() { + return step + }, + }, + }) as any } export type Create<$Pipeline extends PipelineDefinition = PipelineDefinition> = < - const $DiscriminantSpec extends Overload['discriminant'], - const $InputDefaults extends object | undefined, + const $DiscriminantSpec extends Data['discriminant'], >( parameters: { discriminant: $DiscriminantSpec - inputDefaults?: $InputDefaults }, ) => Builder< $Pipeline, - { - discriminant: $DiscriminantSpec - inputDefaults: $InputDefaults - input: {} - steps: {} - } + Data< + $DiscriminantSpec, + DataEmpty['configurator'], + DataEmpty['steps'] + > > export interface Builder< $Pipeline extends PipelineDefinition = PipelineDefinition, - $Overload extends Overload = Overload.States.Empty, + $Data extends Data = DataEmpty, > { - type: $Overload + data: $Data /** * TODO */ - step: StepMethod<$Pipeline, $Overload> + configurator: <$Configurator extends Configurator>( + configurator: + | $Configurator + | Configurator.Builder<$Configurator> + | Configurator.BuilderProviderCallback<$Configurator>, + ) => Builder< + $Pipeline, + { + [_ in keyof $Data]: _ extends 'configurator' ? $Configurator + : $Data[_] + } + > /** * TODO */ - config: () => Builder< - $Pipeline, - Overload.Updaters.SetInput<$Overload, inputExtension> - > - defaults: (inputDefaults: inputDefaults) => Builder< - $Pipeline, - Overload.Updaters.SetInputDefaults<$Overload, inputDefaults> - > - configInit: () => Builder< - $Pipeline, - Overload.Updaters.SetInputInit<$Overload, inputExtension> - > + step: MethodStep<$Pipeline, $Data> /** * TODO */ - stepWithExtendedInput: <$InputExtension extends object>() => StepMethod< + stepWithExtendedInput: <$InputExtension extends object>() => MethodStep< $Pipeline, - $Overload, + $Data, $InputExtension > } -interface StepMethod< +interface MethodStep< $Pipeline extends PipelineDefinition, - $Overload extends Overload, + $Data extends Data, $InputExtension extends object = {}, > { < @@ -95,7 +92,7 @@ interface StepMethod< $Slots extends undefined | StepDefinition.Slots = undefined, $Input = & InferStepInput< - $Overload, + $Data, Extract<$Pipeline['steps'][number], { name: $Name }>, Tuple.PreviousItem<$Pipeline['steps'], { name: $Name }> > @@ -109,29 +106,36 @@ interface StepMethod< }, ): Builder< $Pipeline, - Overload.Updaters.AddStep<$Overload, $Name, { - name: $Name - input: $Input - output: Awaited<$Output> - slots: ConfigManager.OrDefault2<$Slots, {}> - }> + { + [_ in keyof $Data]: _ extends 'steps' ? + & $Data['steps'] + & { + [_ in $Name]: { + name: $Name + input: $Input + output: Awaited<$Output> + slots: ConfigManager.OrDefault2<$Slots, {}> + } + } + : $Data[_] + } > } // dprint-ignore type InferStepInput< - $Overload extends Overload, + $Data extends Data, $CurrentStep extends StepDefinition, $PreviousStep extends StepDefinition | undefined, > = $PreviousStep extends StepDefinition - ? $PreviousStep['name'] extends keyof $Overload['steps'] - ? $Overload['steps'][$PreviousStep['name']]['output'] + ? $PreviousStep['name'] extends keyof $Data['steps'] + ? $Data['steps'][$PreviousStep['name']]['output'] : & $CurrentStep['input'] - & $Overload['input'] - & { [_ in $Overload['discriminant'][0]]: $Overload['discriminant'][1] } + & $Data['configurator']['input'] + & { [_ in $Data['discriminant']['name']]: $Data['discriminant']['value'] } : & $CurrentStep['input'] - & $Overload['input'] - & { [_ in $Overload['discriminant'][0]]: $Overload['discriminant'][1] } + & $Data['configurator']['input'] + & { [_ in $Data['discriminant']['name']]: $Data['discriminant']['value'] } diff --git a/src/lib/anyware/Overload/BuilderCallback.ts b/src/lib/anyware/Overload/BuilderCallback.ts index df11aa42d..77014293e 100644 --- a/src/lib/anyware/Overload/BuilderCallback.ts +++ b/src/lib/anyware/Overload/BuilderCallback.ts @@ -1,4 +1,4 @@ -import type { PipelineDefinition } from '../PipelineDef/__.js' +import type { PipelineDefinition } from '../PipelineDefinition/__.js' import type { Create } from './Builder.js' import type { Builder } from './Builder.js' diff --git a/src/lib/anyware/Overload/Data.ts b/src/lib/anyware/Overload/Data.ts new file mode 100644 index 000000000..4e9816949 --- /dev/null +++ b/src/lib/anyware/Overload/Data.ts @@ -0,0 +1,26 @@ +import type { Configurator } from '../../configurator/configurator.js' +import type { DiscriminantPropertyValue } from '../../prelude.js' +import type { StepDefinition } from '../StepDefinition.js' + +export interface Data< + $Discriminant extends Discriminant = Discriminant, + $Configurator extends Configurator = Configurator, + $Steps extends Record = Record, + $ConfigurationMount extends string | undefined = string | undefined, +> { + readonly discriminant: $Discriminant + readonly configurator: $Configurator + readonly configurationMount: $ConfigurationMount + readonly steps: $Steps +} + +export interface Discriminant { + readonly name: string + readonly value: DiscriminantPropertyValue +} + +export interface DataEmpty extends Data { + readonly configurator: Configurator.States.Empty + readonly steps: {} + readonly configurationMount: undefined +} diff --git a/src/lib/anyware/Overload/States.ts b/src/lib/anyware/Overload/States.ts deleted file mode 100644 index 6d76e2fc1..000000000 --- a/src/lib/anyware/Overload/States.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { Overload } from './__.js' - -export namespace States { - export interface Empty extends Overload { - input: {} - steps: {} - } -} diff --git a/src/lib/anyware/Overload/Updaters.ts b/src/lib/anyware/Overload/Updaters.ts deleted file mode 100644 index 0aef65a34..000000000 --- a/src/lib/anyware/Overload/Updaters.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { ConfigManager } from '../../config-manager/__.js' -import type { StepDefinition } from '../StepDefinition.js' -import type { Overload } from './__.js' - -export namespace Updaters { - export type SetInput< - $Overload extends Overload, - $InputExtension extends object, - > = ConfigManager.SetKey<$Overload, 'input', $InputExtension> - - export type SetInputDefaults< - $Overload extends Overload, - $InputDefaults extends object, - > = ConfigManager.SetKey<$Overload, 'inputDefaults', $InputDefaults> - - export type SetInputInit< - $Overload extends Overload, - $InputExtension extends object, - > = ConfigManager.SetKey<$Overload, 'inputInit', $InputExtension> - - export type AddStep< - $Overload extends Overload, - $Name extends string, - $Step extends StepDefinition, - > = ConfigManager.UpdateKeyWithIntersection< - $Overload, - 'steps', - { - [_ in $Name]: $Step - } - > -} diff --git a/src/lib/anyware/Overload/__.ts b/src/lib/anyware/Overload/__.ts deleted file mode 100644 index 41fc9264f..000000000 --- a/src/lib/anyware/Overload/__.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { DiscriminantPropertyValue } from '../../prelude.js' -import type { StepDefinition } from '../StepDefinition.js' - -export * as Overload from './_.js' - -export interface Overload { - discriminant: DiscriminantSpec - input: object - inputInit?: object | undefined - inputDefaults?: object | undefined - steps: Record -} - -type DiscriminantSpec = readonly [string, DiscriminantPropertyValue] diff --git a/src/lib/anyware/Overload/_.ts b/src/lib/anyware/Overload/_exports.ts similarity index 53% rename from src/lib/anyware/Overload/_.ts rename to src/lib/anyware/Overload/_exports.ts index 108520aed..b2e0afee9 100644 --- a/src/lib/anyware/Overload/_.ts +++ b/src/lib/anyware/Overload/_exports.ts @@ -1,4 +1,3 @@ export * from './Builder.js' export * from './BuilderCallback.js' -export * from './States.js' -export * from './Updaters.js' +export * from './Data.js' diff --git a/src/lib/anyware/Overload/_namespace.ts b/src/lib/anyware/Overload/_namespace.ts new file mode 100644 index 000000000..4c73b2253 --- /dev/null +++ b/src/lib/anyware/Overload/_namespace.ts @@ -0,0 +1 @@ +export * as Overload from './_exports.js' diff --git a/src/lib/anyware/Pipeline/Pipeline.test-d.ts b/src/lib/anyware/Pipeline/Pipeline.test-d.ts index 8ea73ef39..983c97afc 100644 --- a/src/lib/anyware/Pipeline/Pipeline.test-d.ts +++ b/src/lib/anyware/Pipeline/Pipeline.test-d.ts @@ -1,8 +1,8 @@ import { expectTypeOf, test } from 'vitest' -import { PipelineDefinition } from '../_.js' -import type { results } from '../__.test-helpers.js' -import { type initialInput, slots, stepA } from '../__.test-helpers.js' -import type { Config } from '../PipelineDef/Config.js' +import type { results } from '../_.test-helpers.js' +import { type initialInput, slots, stepA } from '../_.test-helpers.js' +import { PipelineDefinition } from '../_exports.js' +import type { Config } from '../PipelineDefinition/Config.js' import type { Step } from '../Step.js' import type { StepRunner } from '../StepRunner.js' import { Pipeline } from './Pipeline.js' diff --git a/src/lib/anyware/Pipeline/Pipeline.ts b/src/lib/anyware/Pipeline/Pipeline.ts index 29c6471b5..14a5d70f5 100644 --- a/src/lib/anyware/Pipeline/Pipeline.ts +++ b/src/lib/anyware/Pipeline/Pipeline.ts @@ -1,18 +1,18 @@ import type { IsUnknown, Simplify } from 'type-fest' import type { ExcludeUndefined, Tuple } from '../../prelude.js' -import type { PipelineDefinition } from '../_.js' -import type { Overload } from '../Overload/__.js' -import type { Config } from '../PipelineDef/Config.js' +import type { PipelineDefinition } from '../_exports.js' +import type { Overload } from '../Overload/_namespace.js' +import type { Config } from '../PipelineDefinition/Config.js' import type { Step } from '../Step.js' import type { StepDefinition } from '../StepDefinition.js' import type { StepRunner } from '../StepRunner.js' export interface Pipeline { - config: Config - input: object - steps: Step[] - stepsIndex: StepsIndex - output: any + readonly config: Config + readonly input: object + readonly steps: readonly Step[] + readonly stepsIndex: StepsIndex + readonly output: any } export type StepsIndex< @@ -47,7 +47,7 @@ export namespace Pipeline { run: (...args: Parameters) => { const input = args[0] as Record const stepOverload = stepOverloads.find(stepOverload => { - return input[stepOverload.discriminant[0]] === stepOverload.discriminant[1] + return input[stepOverload.discriminant.name] === stepOverload.discriminant.value }) if (stepOverload) return stepOverload.run(...args) return step.run(...args) @@ -77,97 +77,103 @@ export namespace Pipeline { } // dprint-ignore - export type InferFromDefinition<$PipelineDef extends PipelineDefinition> = - InferFromDefinition_<$PipelineDef, InferSteps<$PipelineDef>> - // dprint-ignore - type InferFromDefinition_< + export type InferFromDefinition< $PipelineDef extends PipelineDefinition, - $Steps extends Step[], + __Steps extends readonly Step[] = InferSteps<$PipelineDef> > = { - config: $PipelineDef['config'] - steps: $Steps - stepsIndex: StepsIndex< + readonly config: $PipelineDef['config'] + readonly steps: __Steps + readonly stepsIndex: StepsIndex< $PipelineDef['steps'][number]['name'], - $Steps[number] + __Steps[number] > - input: $Steps extends Tuple.NonEmpty - ? $Steps[0]['input'] + readonly input: __Steps extends Tuple.NonEmpty + ? __Steps[0]['input'] : $PipelineDef['input'] - output: - $Steps extends Tuple.NonEmpty - ? Awaited['output']> + readonly output: + __Steps extends Tuple.NonEmpty + ? Awaited['output']> : $PipelineDef['input'] } -} -// dprint-ignore -type InferSteps<$PipelineDef extends PipelineDefinition> = - InferSteps_<$PipelineDef['steps'], $PipelineDef> -// dprint-ignore -type InferSteps_< - $StepDefs extends StepDefinition[], - $PipelineDef extends PipelineDefinition, -> = { - [$Index in keyof $StepDefs]: { - name: $StepDefs[$Index]['name'] - input: Simplify< - Tuple.IsEmpty<$PipelineDef['overloads']> extends true - ? $StepDefs[$Index]['input'] - : InferStepInput< - $Index, - $StepDefs[$Index], - $PipelineDef['overloads'][number] - > - > - output: Simplify< - Tuple.IsEmpty<$PipelineDef['overloads']> extends true - ? $StepDefs[$Index]['output'] - : InferStepOutput< - $StepDefs[$Index], - $PipelineDef['overloads'][number] - > - > - slots: Tuple.IsEmpty<$PipelineDef['overloads']> extends true - ? $StepDefs[$Index]['slots'] - : InferStepSlots< + // dprint-ignore + type InferSteps<$PipelineDef extends PipelineDefinition> = + InferSteps_<$PipelineDef['steps'], $PipelineDef> + // dprint-ignore + type InferSteps_< + $StepDefs extends readonly StepDefinition[], + $PipelineDef extends PipelineDefinition, + > = { + readonly [$Index in keyof $StepDefs]: { + readonly name: $StepDefs[$Index]['name'] + readonly input: Simplify< + Tuple.IsEmpty<$PipelineDef['overloads']> extends true + ? $StepDefs[$Index]['input'] + : InferStepInput< + $Index, $StepDefs[$Index], - $PipelineDef['overloads'] + $PipelineDef['overloads'][number] > - run: IsUnknown<$StepDefs[$Index]['run']> extends true - ? StepRunner - : ExcludeUndefined<$StepDefs[$Index]['run']> + > + readonly output: Simplify< + Tuple.IsEmpty<$PipelineDef['overloads']> extends true + ? $StepDefs[$Index]['output'] + : InferStepOutput< + $StepDefs[$Index], + $PipelineDef['overloads'][number] + > + > + readonly slots: Tuple.IsEmpty<$PipelineDef['overloads']> extends true + ? $StepDefs[$Index]['slots'] + : InferStepSlots< + $StepDefs[$Index], + $PipelineDef['overloads'] + > + readonly run: IsUnknown<$StepDefs[$Index]['run']> extends true + ? StepRunner + : ExcludeUndefined<$StepDefs[$Index]['run']> + } } -} -type InferStepSlots<$Step extends StepDefinition, $Overloads extends Overload[]> = - & $Step['slots'] - & InferStepSlots_<$Step, $Overloads> -// dprint-ignore -type InferStepSlots_<$Step extends StepDefinition, $Overloads extends Overload[]> = - Tuple.IntersectItems<{ - [$Index in keyof $Overloads]: - IsUnknown<$Overloads[$Index]['steps'][$Step['name']]> extends true - ? unknown - : $Overloads[$Index]['steps'][$Step['name']]['slots'] - }> + type InferStepSlots< + $Step extends StepDefinition, + $Overloads extends readonly Overload.Data[], + > = + & $Step['slots'] + & InferStepSlots_<$Step, $Overloads> + // todo try putting the helper type below into a type variable above + // dprint-ignore + type InferStepSlots_<$Step extends StepDefinition, $Overloads extends readonly Overload.Data[]> = + Tuple.IntersectItems<{ + [$Index in keyof $Overloads]: + IsUnknown<$Overloads[$Index]['steps'][$Step['name']]> extends true + ? unknown + : $Overloads[$Index]['steps'][$Step['name']]['slots'] + }> -// dprint-ignore -type InferStepOutput<$Step extends StepDefinition, $Overload extends Overload> = $Overload extends never ? never : - & $Step['output'] - & { [_ in $Overload['discriminant'][0]]: $Overload['discriminant'][1] } - & $Overload['steps'][$Step['name']]['output'] + // dprint-ignore + type InferStepOutput<$Step extends StepDefinition, $Overload extends Overload.Data> = $Overload extends never ? never : + & $Step['output'] + & { [_ in $Overload['discriminant']['name']]: $Overload['discriminant']['value'] } + & $Overload['steps'][$Step['name']]['output'] -// dprint-ignore -type InferStepInput< - $StepIndex extends Tuple.IndexKey, - $StepDefinition extends StepDefinition, - $Overload extends Overload, -> = $Overload extends never ? never : - & $StepDefinition['input'] - // Overload Contributions: - // 1. The discriminant: - & { [_ in $Overload['discriminant'][0]]: $Overload['discriminant'][1] } - // 2. This specific step: - & $Overload['steps'][$StepDefinition['name']]['input'] - // 3. If this is the first step, then the pipeline input contributions, if any: - & ($StepIndex extends '0' ? $Overload['input'] : {}) + // dprint-ignore + type InferStepInput< + $StepIndex extends Tuple.IndexKey, + $StepDefinition extends StepDefinition, + $Overload extends Overload.Data, + > = $Overload extends never ? never : + & $StepDefinition['input'] + // Overload Contributions: + // 1. The discriminant: + & { [_ in $Overload['discriminant']['name']]: $Overload['discriminant']['value'] } + // 2. This specific step: + & $Overload['steps'][$StepDefinition['name']]['input'] + // 3. If this is the first step, then the pipeline input contributions, if any: + & ($StepIndex extends '0' + ? $Overload['configurationMount'] extends string + ? { [_ in $Overload['configurationMount']]: $Overload['configurator']['input'] } + : $Overload['configurator']['input'] + : {} + ) +} diff --git a/src/lib/anyware/PipelineDef/__.ts b/src/lib/anyware/PipelineDef/__.ts deleted file mode 100644 index 66f8089d9..000000000 --- a/src/lib/anyware/PipelineDef/__.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { Overload } from '../Overload/__.js' -import type { StepDefinition } from '../StepDefinition.js' -import type { Config } from './Config.js' - -export * as PipelineDefinition from './_.js' - -export interface PipelineDefinition { - config: Config - input: object - steps: StepDefinition[] - overloads: Overload[] -} diff --git a/src/lib/anyware/PipelineDef/Config.ts b/src/lib/anyware/PipelineDefinition/Config.ts similarity index 100% rename from src/lib/anyware/PipelineDef/Config.ts rename to src/lib/anyware/PipelineDefinition/Config.ts diff --git a/src/lib/anyware/PipelineDef/States.ts b/src/lib/anyware/PipelineDefinition/States.ts similarity index 100% rename from src/lib/anyware/PipelineDef/States.ts rename to src/lib/anyware/PipelineDefinition/States.ts diff --git a/src/lib/anyware/PipelineDef/Updaters.ts b/src/lib/anyware/PipelineDefinition/Updaters.ts similarity index 86% rename from src/lib/anyware/PipelineDef/Updaters.ts rename to src/lib/anyware/PipelineDefinition/Updaters.ts index d824decb0..e009f242c 100644 --- a/src/lib/anyware/PipelineDef/Updaters.ts +++ b/src/lib/anyware/PipelineDefinition/Updaters.ts @@ -1,5 +1,5 @@ import type { ConfigManager } from '../../config-manager/__.js' -import type { Overload } from '../Overload/__.js' +import type { Overload } from '../Overload/_namespace.js' import type { StepDefinition } from '../StepDefinition.js' import type { PipelineDefinition } from './__.js' @@ -16,11 +16,11 @@ export namespace Updaters { export type AddOverload< $PipelineDef extends PipelineDefinition, - $Overload extends Overload, + $Overload extends Overload.Data, > = ConfigManager.UpdateKeyWithAppendOne<$PipelineDef, 'overloads', $Overload> export type AddOverloads< $PipelineDef extends PipelineDefinition, - $Overloads extends Overload[], + $Overloads extends Overload.Data[], > = ConfigManager.UpdateKeyWithAppendMany<$PipelineDef, 'overloads', $Overloads> } diff --git a/src/lib/anyware/PipelineDef/Utilities.ts b/src/lib/anyware/PipelineDefinition/Utilities.ts similarity index 100% rename from src/lib/anyware/PipelineDef/Utilities.ts rename to src/lib/anyware/PipelineDefinition/Utilities.ts diff --git a/src/lib/anyware/PipelineDef/_.ts b/src/lib/anyware/PipelineDefinition/_.ts similarity index 84% rename from src/lib/anyware/PipelineDef/_.ts rename to src/lib/anyware/PipelineDefinition/_.ts index 1f91ca8fc..519fdad5b 100644 --- a/src/lib/anyware/PipelineDef/_.ts +++ b/src/lib/anyware/PipelineDefinition/_.ts @@ -1,6 +1,6 @@ export * from '../Pipeline/Pipeline.js' export * from '../PipelineSpecification/createWithSpec.js' -export * from '../PipelineSpecification/Spec.js' +// export * from '../PipelineSpecification/Spec.js' export * from '../Result.js' export * from '../run/run.js' export * from './builder.js' diff --git a/src/lib/anyware/PipelineDefinition/__.ts b/src/lib/anyware/PipelineDefinition/__.ts new file mode 100644 index 000000000..5d6bf3ea6 --- /dev/null +++ b/src/lib/anyware/PipelineDefinition/__.ts @@ -0,0 +1,12 @@ +import type { Overload } from '../Overload/_namespace.js' +import type { StepDefinition } from '../StepDefinition.js' +import type { Config } from './Config.js' + +export * as PipelineDefinition from './_.js' + +export interface PipelineDefinition { + readonly config: Config + readonly input: object + readonly steps: readonly StepDefinition[] + readonly overloads: readonly Overload[] +} diff --git a/src/lib/anyware/PipelineDef/builder.test-d.ts b/src/lib/anyware/PipelineDefinition/builder.test-d.ts similarity index 79% rename from src/lib/anyware/PipelineDef/builder.test-d.ts rename to src/lib/anyware/PipelineDefinition/builder.test-d.ts index d3c35df6d..d11a2791f 100644 --- a/src/lib/anyware/PipelineDef/builder.test-d.ts +++ b/src/lib/anyware/PipelineDefinition/builder.test-d.ts @@ -1,7 +1,8 @@ import { describe, expectTypeOf, test } from 'vitest' +import { Configurator } from '../../configurator/configurator.js' import { _ } from '../../prelude.js' -import type { initialInput } from '../__.test-helpers.js' -import { results, slots, stepA, stepB } from '../__.test-helpers.js' +import type { initialInput } from '../_.test-helpers.js' +import { results, slots, stepA, stepB } from '../_.test-helpers.js' import { PipelineDefinition } from './__.js' import type { Config } from './Config.js' @@ -91,8 +92,8 @@ describe(`overload`, () => { type dName = typeof dName const dValue = 1 type dValue = typeof dValue - const d = [dName, dValue] as const - type d = typeof d + const discriminant = { name: dName, value: dValue } as const + type discriminant = typeof discriminant type dObject = { [_ in dName]: dValue } // constructor @@ -103,8 +104,8 @@ describe(`overload`, () => { b0.overload(o => o.create()) }) test(`overload constructor with discriminant`, () => { - expectTypeOf(b0.overload(o => o.create({ discriminant: d })).type.overloads).toMatchTypeOf< - [{ discriminant: d; input: {}; steps: {} }] + expectTypeOf(b0.overload(o => o.create({ discriminant })).type.overloads[0].discriminant).toMatchTypeOf< + discriminant >() }) }) @@ -112,8 +113,13 @@ describe(`overload`, () => { // overload extends input test(`overload constructor with input and discriminant`, () => { - expectTypeOf(b0.overload(o => o.create({ discriminant: d }).config<{ x: 1 }>()).type.overloads) - .toMatchTypeOf<[{ discriminant: d; input: { x: 1 }; steps: {} }]>() + const configurator = Configurator().input<{ x: 1 }>() + type configurator = ReturnType + expectTypeOf( + b0.overload(o => o.create({ discriminant: discriminant }).configurator(configurator)).type + .overloads, + ) + .toMatchTypeOf<[{ discriminant: discriminant; configurator: configurator; steps: {} }]>() }) // step @@ -121,9 +127,9 @@ describe(`overload`, () => { // TODO: Better DX: Pipeline builder should not allow overloads until steps are defined. test(`overload without pipeline steps cannot overload any step`, () => { // @ts-expect-error - b0.overload(o => o.create({ discriminant: d }).step(`a`, { run: () => {} })) + b0.overload(o => o.create({ discriminant: discriminant }).step(`a`, { run: () => {} })) b0.overload(o => { - expectTypeOf(o.create({ discriminant: d }).step).toMatchTypeOf<((name: never, spec: _) => _)>() + expectTypeOf(o.create({ discriminant: discriminant }).step).toMatchTypeOf<((name: never, spec: _) => _)>() return _ }) }) @@ -132,13 +138,14 @@ describe(`overload`, () => { expectTypeOf( b0.step(`a`).step(stepB).overload(o => o - .create({ discriminant: d }) + .create({ discriminant: discriminant }) .step(`a`, { run: (input) => ({ ...input, ola: 1 as const }) }) ).type.overloads, ) .toMatchTypeOf<[ { - discriminant: d + discriminant: discriminant + configurator: Configurator.States.Empty input: {} steps: { a: { @@ -155,7 +162,7 @@ describe(`overload`, () => { test(`can extend input type`, () => { expectTypeOf( b0.step(`a`).overload(o => - o.create({ discriminant: d }).stepWithExtendedInput<{ ex: 1 }>()(`a`, { + o.create({ discriminant: discriminant }).stepWithExtendedInput<{ ex: 1 }>()(`a`, { run: (input) => { expectTypeOf(input).toEqualTypeOf() }, @@ -164,7 +171,7 @@ describe(`overload`, () => { ) .toMatchTypeOf<[ { - discriminant: d + discriminant: discriminant input: {} steps: { a: { @@ -182,7 +189,7 @@ describe(`overload`, () => { test(`if step has no slots, parameter undefined & context undefined`, () => { const b1o = b1.overload(o => - o.create({ discriminant: d }).step(`a`, { + o.create({ discriminant: discriminant }).step(`a`, { run: (_, slots) => { expectTypeOf(slots).toEqualTypeOf(undefined) }, @@ -193,7 +200,7 @@ describe(`overload`, () => { test(`slots available to run and added to overload context`, () => { const b1o = b1.overload(o => - o.create({ discriminant: d }).step(`a`, { + o.create({ discriminant: discriminant }).step(`a`, { slots: { m: slots.m }, run: (_, slots) => { expectTypeOf(slots).toEqualTypeOf<{ m: slots['m'] }>() @@ -215,7 +222,7 @@ describe(`overload`, () => { test(`parameter steps, first key, run key, parameter input, equals previous step output`, () => { b1.step(`b`).overload(o => o - .create({ discriminant: d }) + .create({ discriminant: discriminant }) .step(`b`, { run: (input) => { expectTypeOf(input).toEqualTypeOf() diff --git a/src/lib/anyware/PipelineDef/builder.ts b/src/lib/anyware/PipelineDefinition/builder.ts similarity index 97% rename from src/lib/anyware/PipelineDef/builder.ts rename to src/lib/anyware/PipelineDefinition/builder.ts index c079620e2..abaee543a 100644 --- a/src/lib/anyware/PipelineDef/builder.ts +++ b/src/lib/anyware/PipelineDefinition/builder.ts @@ -1,7 +1,7 @@ import type { ConfigManager } from '../../config-manager/__.js' import { type Tuple } from '../../prelude.js' import type { Extension } from '../Extension/__.js' -import { Overload } from '../Overload/__.js' +import { Overload } from '../Overload/_namespace.js' import { Pipeline } from '../Pipeline/Pipeline.js' import type { StepDefinition } from '../StepDefinition.js' import type { StepRunner } from '../StepRunner.js' @@ -61,7 +61,7 @@ export interface Builder<$PipelineDef extends PipelineDefinition = PipelineDefin overload: <$OverloadBuilder extends Overload.Builder<$PipelineDef>>( overloadBuilder: Overload.BuilderCallback<$PipelineDef, $OverloadBuilder>, ) => Builder< - PipelineDefinition.Updaters.AddOverload<$PipelineDef, $OverloadBuilder['type']> + PipelineDefinition.Updaters.AddOverload<$PipelineDef, $OverloadBuilder['data']> > /** * TODO @@ -193,7 +193,7 @@ const recreate = <$Pipeline extends PipelineDefinition>(pipeline: $Pipeline): Bu overload: (builderCallback) => { const overload = builderCallback({ create: Overload.create }) // todo why mutating here? stop it. make like use extension. - pipeline.overloads.push(overload.type) + pipeline.overloads.push(overload.data) return recreate(pipeline) as any }, diff --git a/src/lib/anyware/Step.ts b/src/lib/anyware/Step.ts index 65be16eb4..8ab212950 100644 --- a/src/lib/anyware/Step.ts +++ b/src/lib/anyware/Step.ts @@ -2,11 +2,11 @@ import type { StepDefinition } from './StepDefinition.js' import type { StepRunner } from './StepRunner.js' export interface Step { - name: string - slots?: StepDefinition.Slots - input: Step.Input - output: any - run: StepRunner + readonly name: string + readonly slots?: StepDefinition.Slots + readonly input: Step.Input + readonly output: any + readonly run: StepRunner } export namespace Step { diff --git a/src/lib/anyware/StepDefinition.ts b/src/lib/anyware/StepDefinition.ts index fb6185206..38fd58d3d 100644 --- a/src/lib/anyware/StepDefinition.ts +++ b/src/lib/anyware/StepDefinition.ts @@ -3,11 +3,14 @@ import type { StepRunner } from './StepRunner.js' export interface StepDefinition< $Name extends string = string, + $Slots extends StepDefinition.Slots = StepDefinition.Slots, + $Input = any, + $Output = any, > { - name: $Name - slots: StepDefinition.Slots - input: any - output: any + readonly name: $Name + readonly slots: $Slots + readonly input: $Input + readonly output: $Output /** * Tracking the run signature type is useful for deriving the executable step. * @@ -21,10 +24,11 @@ export interface StepDefinition< * * This run signature is NOT used for deriving the specification step. */ - run?: StepRunner + readonly run?: StepRunner } export namespace StepDefinition { + export type SubsetTypeProperties = Pick export interface SpecInput { name: string slots?: StepDefinition.Slots diff --git a/src/lib/anyware/StepTrigger.ts b/src/lib/anyware/StepTrigger.ts index 8c9c0cce3..e91cdabfe 100644 --- a/src/lib/anyware/StepTrigger.ts +++ b/src/lib/anyware/StepTrigger.ts @@ -24,7 +24,7 @@ export namespace StepTrigger { // dprint-ignore export interface Infer< $Step extends Step, - $NextSteps extends Step[], + $NextSteps extends readonly Step[], $PipelineOutput > extends StepTrigger.Properties<$Step['input']> @@ -44,7 +44,7 @@ export namespace StepTrigger { ) > ): Promise< - $NextSteps extends [infer $NextStep extends Step, ...infer $NextNextSteps extends Step[]] + $NextSteps extends [infer $NextStep extends Step, ...infer $NextNextSteps extends readonly Step[]] ? { [_ in $NextStep['name']]: Infer<$NextStep, $NextNextSteps, $PipelineOutput> } diff --git a/src/lib/anyware/__.entrypoint.test.ts b/src/lib/anyware/_.entrypoint.test.ts similarity index 97% rename from src/lib/anyware/__.entrypoint.test.ts rename to src/lib/anyware/_.entrypoint.test.ts index 4a49f492c..9a3f85a24 100644 --- a/src/lib/anyware/__.entrypoint.test.ts +++ b/src/lib/anyware/_.entrypoint.test.ts @@ -3,8 +3,8 @@ import { describe, expect, test } from 'vitest' import type { ContextualAggregateError } from '../errors/ContextualAggregateError.js' import { _ } from '../prelude.js' -import { PipelineDefinition } from './_.js' -import { initialInput, stepA, stepB } from './__.test-helpers.js' +import { initialInput, stepA, stepB } from './_.test-helpers.js' +import { PipelineDefinition } from './_exports.js' const run = async (interceptor: (...args: any[]) => any) => { const pipeline = PipelineDefinition.create().step(stepA).step(stepB).done() diff --git a/src/lib/anyware/__.test-helpers.ts b/src/lib/anyware/_.test-helpers.ts similarity index 97% rename from src/lib/anyware/__.test-helpers.ts rename to src/lib/anyware/_.test-helpers.ts index 2585b1351..e8544db5e 100644 --- a/src/lib/anyware/__.test-helpers.ts +++ b/src/lib/anyware/_.test-helpers.ts @@ -1,8 +1,8 @@ import { beforeEach, vi } from 'vitest' -import { PipelineDefinition } from './_.js' +import { PipelineDefinition } from './_exports.js' import type { Interceptor, NonRetryingInterceptorInput } from './Interceptor/Interceptor.js' import { Pipeline } from './Pipeline/Pipeline.js' -import type { Options } from './PipelineDef/Config.js' +import type { Options } from './PipelineDefinition/Config.js' import { StepDefinition } from './StepDefinition.js' export const initialInput = { x: 1 } as const diff --git a/src/lib/anyware/__.ts b/src/lib/anyware/__.ts deleted file mode 100644 index 77c96cc0f..000000000 --- a/src/lib/anyware/__.ts +++ /dev/null @@ -1 +0,0 @@ -export * as Anyware from './_.js' diff --git a/src/lib/anyware/_.ts b/src/lib/anyware/_exports.ts similarity index 62% rename from src/lib/anyware/_.ts rename to src/lib/anyware/_exports.ts index 4aa693ab7..44d658a28 100644 --- a/src/lib/anyware/_.ts +++ b/src/lib/anyware/_exports.ts @@ -1,8 +1,9 @@ export * from './Extension/__.js' export * from './Interceptor/Interceptor.js' -export * from './Overload/__.js' +export * from './Overload/_namespace.js' export * from './Pipeline/Pipeline.js' -export * from './PipelineDef/__.js' +export * from './PipelineDefinition/__.js' export * from './PipelineSpecification/Spec.js' export * from './Result.js' export * from './run/runner.js' +export { StepDefinition } from './StepDefinition.js' diff --git a/src/lib/anyware/_namespace.ts b/src/lib/anyware/_namespace.ts new file mode 100644 index 000000000..cdbe30ebd --- /dev/null +++ b/src/lib/anyware/_namespace.ts @@ -0,0 +1 @@ +export * as Anyware from './_exports.js' diff --git a/src/lib/anyware/run/run.test-d.ts b/src/lib/anyware/run/run.test-d.ts index 40a6f11ac..e3fa7d8c5 100644 --- a/src/lib/anyware/run/run.test-d.ts +++ b/src/lib/anyware/run/run.test-d.ts @@ -1,7 +1,7 @@ import { expectTypeOf, test } from 'vitest' -import { Pipeline } from '../_.js' -import type { initialInput } from '../__.test-helpers.js' -import { PipelineDefinition } from '../PipelineDef/__.js' +import type { initialInput } from '../_.test-helpers.js' +import { Pipeline } from '../_exports.js' +import { PipelineDefinition } from '../PipelineDefinition/__.js' import type { Result } from '../Result.js' const def = PipelineDefinition.create().input() diff --git a/src/lib/anyware/run/run.test.ts b/src/lib/anyware/run/run.test.ts index f53dfc393..53ae299b5 100644 --- a/src/lib/anyware/run/run.test.ts +++ b/src/lib/anyware/run/run.test.ts @@ -3,7 +3,6 @@ import { describe, expect, test, vi } from 'vitest' import { Errors } from '../../errors/__.js' import type { ContextualError } from '../../errors/ContextualError.js' -import { PipelineDefinition } from '../_.js' import { initialInput2, oops, @@ -12,7 +11,8 @@ import { run, runRetrying, type TestInterceptor, -} from '../__.test-helpers.js' +} from '../_.test-helpers.js' +import { PipelineDefinition } from '../_exports.js' import { Pipeline } from '../Pipeline/Pipeline.js' import { successfulResult } from '../Result.js' import { StepDefinition } from '../StepDefinition.js' @@ -419,6 +419,8 @@ describe('step runner parameter - previous', () => { }) describe('overloads', () => { + const discriminant1 = { name: 'x', value: 1 } as const + const discriminant2 = { name: 'x', value: 2 } as const test('overloaded step runners are run', async () => { const p = PipelineDefinition .create() @@ -427,7 +429,7 @@ describe('overloads', () => { .step('b') .overload(o => o - .create({ discriminant: ['x', 1] }) + .create({ discriminant: discriminant1 }) .step('a', { // todo make it a type error to not propagate the discriminant run: (input) => ({ ...input, value: input.value + '+a' }), @@ -448,13 +450,13 @@ describe('overloads', () => { .step('a') .step('b') .overload(o => - o.create({ discriminant: ['x', 1] }) + o.create({ discriminant: discriminant1 }) .step('a', { run: (input) => ({ ...input, value: input.value + '+a' }) }) .step('b', { run: (input) => ({ value: input.value + '+b' }) }) ) .overload(o => o - .create({ discriminant: ['x', 2] }) + .create({ discriminant: discriminant2 }) .step('a', { run: (input) => ({ ...input, value: input.value + '+a2' }) }) .step('b', { run: (input) => ({ value: input.value + '+b2' }) }) ) diff --git a/src/lib/anyware/run/runner.ts b/src/lib/anyware/run/runner.ts index 71b7da832..043f1adad 100644 --- a/src/lib/anyware/run/runner.ts +++ b/src/lib/anyware/run/runner.ts @@ -8,7 +8,7 @@ import { type NonRetryingInterceptorInput, } from '../Interceptor/Interceptor.js' import type { Pipeline } from '../Pipeline/Pipeline.js' -import type { PipelineDefinition } from '../PipelineDef/__.js' +import type { PipelineDefinition } from '../PipelineDefinition/__.js' import { successfulResult } from '../Result.js' import type { StepDefinition } from '../StepDefinition.js' import type { StepResultErrorExtension } from '../StepResult.js' @@ -18,7 +18,7 @@ import { runPipeline } from './runPipeline.js' export interface Params<$Pipeline extends Pipeline = Pipeline> { initialInput: $Pipeline['input'] - interceptors?: NonRetryingInterceptorInput[] + interceptors?: readonly NonRetryingInterceptorInput[] retryingInterceptor?: NonRetryingInterceptorInput } diff --git a/src/lib/builder/Definition.ts b/src/lib/builder/Definition.ts deleted file mode 100644 index 62d81d970..000000000 --- a/src/lib/builder/Definition.ts +++ /dev/null @@ -1,198 +0,0 @@ -// import type { Simplify } from 'type-fest' -// import type { AssertExtends, Tuple } from '../prelude.js' -// import type { Private } from '../private.js' -// import type { TypeFunction } from '../type-function/__.js' -// import type { Context, Extension } from './Extension.js' - -// /** -// * A builder definition. -// * Technically it is a type level function with additional properties. -// * When called, returns itself with the given extensions attached as a property. -// */ -// export interface Definition_<$Extensions extends [...Extension[]] = [...Extension[]]> extends TypeFunction { -// extensions: $Extensions -// return: Definition_> -// } - -// type InvokeDefinition<$Definition extends Definition_, $Arguments extends [...Extension[]]> = TypeFunction.Call< -// $Definition, -// $Arguments -// > - -// /** -// * A definition literal, empty. Useful for creation of new builders. -// */ -// export type Empty = Definition_<[]> - -// /** -// * Create a new Builder definition. -// */ -// export type Create<$Extensions extends [...Extension[]]> = AddExtensions - -// /** -// * Extend the definition with many extensions. See {@link AddExtension} for details. -// */ -// // dprint-ignore -// export type AddExtensions<$Definition extends Definition_, $Extensions extends [...Extension[]]> = -// $Extensions extends [infer $FirstExtension extends Extension, ...infer $RestExtensions extends Extension[]] -// ? AddExtensions, $RestExtensions> -// : $Definition - -// /** -// * Extend the definition. During materialization the extension can contribute properties -// * that make up the final builder. -// */ -// // dprint-ignore -// export type AddExtension<$definition_ extends Definition_, $Extension_ extends Extension> = -// InvokeDefinition<$definition_, [...$definition_['extensions'], $Extension_]> - -// // -// // Materialize Utilities -// // - -// /** -// * Materialize the definition using each extension's generic context type. -// * -// * Each extension will be invoked with its own generic context type. -// * Then results will be merged to produce the builder object. -// * -// * All extensions' generic context types will be merged to produce -// * the builder object context property. -// */ -// // dprint-ignore -// export type MaterializeGeneric<$Definition extends Definition_> = -// Simplify< -// Private.Add< -// { -// definition: $Definition, -// context: MaterializeGeneric_Context<$Definition> -// }, -// MaterializeGeneric_Extensions<$Definition> -// > -// > - -// // dprint-ignore -// type MaterializeGeneric_Extensions<$Definition extends Definition_> = -// Tuple.IntersectItems< -// MaterializeGeneric_Extensions_< -// $Definition, -// $Definition['extensions'] -// > -// > -// // dprint-ignore -// type MaterializeGeneric_Extensions_< -// $Definition extends Definition_, -// $Extensions extends [...Extension[]] -// > = { -// [$Index in keyof $Extensions]: -// Extension.Invoke<$Extensions[$Index], { -// definition: $Definition, -// context: $Extensions[$Index]['context'], -// }> -// } - -// type MaterializeGeneric_Context<$Definition extends Definition_> = Tuple.IntersectItems< -// MaterializeGeneric_Context_<$Definition['extensions']> -// > -// type MaterializeGeneric_Context_<$Extensions extends [...Extension[]]> = { -// [$Index in keyof $Extensions]: $Extensions[$Index]['context'] -// } - -// // -// // -// // --------------------------------------------------------------------------------------------- -// // -// // - -// /** -// * Materialize the definition using each extension's empty context type. -// * -// * Each extension will be invoked with its own empty context. -// * Then results will be merged to produce the builder object. -// * -// * All extensions' empty context types will be merged to produce -// * the builder object context property. -// */ -// // dprint-ignore -// export type MaterializeEmpty<$Definition extends Definition_> = -// Simplify< -// Private.Add< -// { -// definition: $Definition, -// context: MaterializeEmpty_Context<$Definition>, -// }, -// Tuple.IntersectItems< -// MaterializeEmpty_Extensions<$Definition, $Definition['extensions']> -// > -// > -// > - -// // dprint-ignore -// type MaterializeEmpty_Extensions< -// $Definition extends Definition_, -// $Extensions extends [...Extension[]] -// > = { -// [$Index in keyof $Extensions]: Extension.Invoke<$Extensions[$Index], { -// definition: $Definition, -// context: $Extensions[$Index]['contextEmpty'] -// }> -// } -// // dprint-ignore -// type MaterializeEmpty_Context<$Definition extends Definition_> = -// Tuple.IntersectItems< -// MaterializeEmpty_Context_<$Definition['extensions']> -// > -// // dprint-ignore -// type MaterializeEmpty_Context_<$Extensions extends [...Extension[]]> = { -// [$Index in keyof $Extensions]: $Extensions[$Index]['contextEmpty'] -// } - -// // -// // -// // --------------------------------------------------------------------------------------------- -// // -// // - -// /** -// * Materialize the definition with a new context. -// * -// * Each extension will be invoked with the given context. -// * Then results will be merged to produce the builder object. -// * -// * The given context will be used as-is for the builder object context property. -// */ -// // dprint-ignore -// export type MaterializeWith< -// $Definition extends Definition_, -// $Context extends Context -// > = - -// Private.Add< -// { -// definition: $Definition, -// context: $Context -// }, -// Tuple.IntersectItems< -// MaterializeWith_Extensions< -// $Definition, -// $Definition['extensions'], -// $Context -// > -// > -// > - -// // dprint-ignore -// type MaterializeWith_Extensions< -// $Definition extends Definition_, -// $Extensions extends [...Extension[]], -// $Context extends Context, -// > = { -// [$Index in keyof $Extensions]: -// Extension.Invoke< -// $Extensions[$Index], -// { -// definition: $Definition -// context: $Context -// } -// > -// } diff --git a/src/lib/builder/Extension.ts b/src/lib/builder/Extension.ts deleted file mode 100644 index 79db205d1..000000000 --- a/src/lib/builder/Extension.ts +++ /dev/null @@ -1,131 +0,0 @@ -// import type { TypeFunction } from '../type-function/__.js' -// import type { Definition } from './_.js' -// import type { Definition_ } from './Definition.js' - -// /** -// * Statically known data that extensions can read from/write to. -// */ -// export type Context = object - -// /** -// * A builder extension. -// * -// * A builder extension is a "type function" that upon invocation -// * can contribute properties to the builder instance. -// */ -// export interface Extension extends TypeFunction { -// /** -// * The context that this extension contributes. -// */ -// context: Context -// /** -// * The context in its most empty form. -// * -// * The definition of "most empty" is owned by the extension. -// * -// * For example if context is `{ count: number[] }` then an extension -// * may decide that contextEmpty is `{}` or `{ count: [] }` or just -// * the same (`{ count: number[] }`). -// */ -// contextEmpty: Context -// } - -// export namespace Extension { -// export type Invoke<_ extends Extension, $Arguments extends Parameters> = TypeFunction.Call<_, $Arguments> - -// /** -// * The parameters for an extension invocation (recall: builder extensions are "type functions". -// * -// * If you pass your Extension definition then its context will be used to type -// * the `context` parameter. -// */ -// export type Parameters<$Extension_ extends Extension = Extension> = { -// /** -// * The context type as specified by this extension. -// * -// * Note that the type here could be more specific (subtype) upon later -// * use in the materialized builder context. For example this or other extensions -// * may contribute methods that return the builder with a new context. -// */ -// context: $Extension_['context'] -// // todo rename to definition -// /** -// * The definition of the builder. -// * -// * If you need to reference the builder with a changed (or same) -// * context then you'll need this definition. -// * -// * @example -// * -// * ```ts -// * interface BuilderExtension extends Builder.Extension { -// * context: { value: string } -// * return: BuilderExtension_ -// * } -// * interface BuilderExtension_<$Arguments extends Builder.Extension.Parameters> { -// * passthrough: () => Builder.Definition.MaterializeWith<$Arguments['definition'], $Arguments['context']> -// * append: <$Value>(value: $Value) => -// * Builder.Definition.MaterializeWith< -// * $Arguments['definition'], -// * { value: `${$Arguments['context']['value']}${$Value}` } -// * > -// * } -// * ``` -// */ -// definition: Definition_ -// /** -// * The current builder. -// * -// * After materialization this type becomes the specifically produced builder type. -// * -// * If your extension needs to reference the builder without affecting its context then -// * use this type. For example your extension has a method that returns the builder. -// * -// * If your extension needs to reference the builder **with a changed context** then you must -// * materialize it from the definition. See the {@link Parameters.definition} parameter. -// */ -// // todo so far we couldn't achieve this without hitting infinite instantiation TS limitation. -// // builder: object -// } - -// /** -// * Create a builder extension. -// * -// * The returned object will be merged into the builder. -// * -// * You receive the private state of the builder to work with as you wish. -// * -// * For example use the builder instance to return a new builder with updated state. -// * -// * TODO The state cannot be mutated. -// */ -// export const create = <$Extension extends Extension>( -// implementor: Implementor<$Extension>, -// ): Implementor<$Extension> => { -// return implementor -// } - -// export type Implementor<$Extension extends Extension> = ( -// /** -// * The host builder instance. -// * -// * Invoke with context data to return a new builder copy. -// * -// * TODO this JSDoc does not show up on user side when they pass in an actual function. Ask on StackOverflow how to fix this (need to create a minimal repro therefore (need to create a minimal repro therefore) (need to create a minimal repro therefore) (need to create a minimal repro therefore) (need to create a minimal repro therefore) (need to create a minimal repro therefore) (need to create a minimal repro therefore) (need to create a minimal repro therefore) (need to create a minimal repro therefore)). -// */ -// builder: Builder<$Extension>, -// /** -// * The current state of context. -// * -// * TODO Cannot be mutated. -// */ -// context: $Extension['context'], -// ) => object - -// /** -// * foobar -// */ -// export type Builder<$Extension extends Extension> = ( -// context: $Extension['context'], -// ) => Definition.MaterializeGeneric> -// } diff --git a/src/lib/builder/_.ts b/src/lib/builder/_.ts deleted file mode 100644 index 6c0ea2394..000000000 --- a/src/lib/builder/_.ts +++ /dev/null @@ -1,3 +0,0 @@ -// export * from '../private.js' -// export * as Definition from './Definition.js' -// export * from './Extension.js' diff --git a/src/lib/builder/__.test-d.ts b/src/lib/builder/__.test-d.ts deleted file mode 100644 index 48cc17f8e..000000000 --- a/src/lib/builder/__.test-d.ts +++ /dev/null @@ -1,104 +0,0 @@ -// import { assertEqual, assertExtends } from '../assert-equal.js' -// import type { Private } from '../private.js' -// import type { Builder } from './__.js' - -// // --------------------------------------------------------------------------------------------------------------------- -// { -// interface ex1_ extends Builder.Extension { -// return: { -// a: 1 -// } -// } -// type B = Builder.Definition.AddExtension -// assertEqual() -// type b = Builder.Definition.MaterializeEmpty -// type expectedPrivateState = { -// definition: B -// context: {} -// } -// assertEqual>() -// } -// // --------------------------------------------------------------------------------------------------------------------- -// { -// interface ex1_ extends Builder.Extension { -// return: { -// a: 1 -// } -// } -// type B = Builder.Definition.AddExtensions -// assertEqual() -// type b = Builder.Definition.MaterializeEmpty -// type expectedPrivateState = { -// definition: B -// context: {} -// } -// assertEqual>() -// } -// // --------------------------------------------------------------------------------------------------------------------- -// { -// interface Reflect_ extends Builder.Extension { -// // @ts-expect-error untyped params -// return: Reflect -// } -// type Reflect<$Arguments extends Builder.Extension.Parameters> = { -// arguments: $Arguments -// } -// type B = Builder.Definition.AddExtension -// type b = Builder.Definition.MaterializeEmpty -// type expectedPrivateState = { -// definition: B -// context: {} -// } -// type expectedContext = { -// arguments: { -// context: {} -// definition: B -// } -// } -// assertEqual< -// b, -// Private.Add -// >() -// } -// // --------------------------------------------------------------------------------------------------------------------- -// { -// interface FooContext { -// calls: number[] -// } -// interface FooContextEmpty extends FooContext { -// calls: [] -// } -// interface FooExtension extends Builder.Extension { -// context: FooContext -// contextEmpty: FooContextEmpty -// // @ts-expect-error untyped params -// return: FooExtension_ -// } -// interface FooExtension_<$Args extends Builder.Extension.Parameters> { -// _: $Args['context'] -// foo: ( -// number: $Number, -// ) => Builder.Definition.MaterializeWith< -// $Args['definition'], -// { calls: [...$Args['context']['calls'], $Number] } -// > -// } - -// type bGeneric = Builder.Definition.MaterializeGeneric< -// Builder.Definition.AddExtension -// > -// type bEmpty = Builder.Definition.MaterializeEmpty< -// Builder.Definition.AddExtension -// > - -// assertExtends() - -// const bEmpty: bEmpty = null as any -// type bEmpty_ = typeof bEmpty._ -// assertEqual() - -// const b = bEmpty.foo(1) -// type b = typeof b -// type b_ = typeof b._ -// assertEqual() -// } diff --git a/src/lib/builder/__.ts b/src/lib/builder/__.ts deleted file mode 100644 index bf0f7781e..000000000 --- a/src/lib/builder/__.ts +++ /dev/null @@ -1 +0,0 @@ -// export * as Builder from './_.js' diff --git a/src/lib/configurator/configurator.test.ts b/src/lib/configurator/configurator.test.ts new file mode 100644 index 000000000..fb60a982a --- /dev/null +++ b/src/lib/configurator/configurator.test.ts @@ -0,0 +1,8 @@ +import { expect, test } from 'vitest' +import { Configurator } from './configurator.js' + +test(`if input resolver returns null, reference to current is returned`, () => { + const c = Configurator().input().inputResolver(() => null).return() + const current = {} + expect(c.inputResolver({ current, input: {} })).toBe(current) +}) diff --git a/src/lib/configurator/configurator.ts b/src/lib/configurator/configurator.ts new file mode 100644 index 000000000..3bd06eb22 --- /dev/null +++ b/src/lib/configurator/configurator.ts @@ -0,0 +1,282 @@ +import type { HasRequiredKeys } from 'type-fest' + +// ---------------------------- +// Data Type +// ---------------------------- + +export type ConfiguratorAny = Configurator< + Configurator.Configuration, + Configurator.Configuration, + Configurator.Configuration, + Configurator.InputResolver< + Configurator.InputResolver.$Func< + Configurator.Configuration, + Configurator.Configuration, + Configurator.Configuration + > + > +> + +// dprint-ignore +export interface Configurator< + $Input extends Configurator.Configuration = + Configurator.Configuration, + $Normalized extends $Input = + Required<$Input>, + $Default extends Partial<$Normalized> = + Partial<$Normalized>, + $InputResolver extends Configurator.InputResolver> = + Configurator.InputResolver> +> { + readonly input: $Input + readonly normalized: $Normalized + readonly default: $Default + readonly inputResolver: $InputResolver + // Computed Properties + readonly normalizedIncremental: Configurator.Incrementify<$Normalized, $Default> +} + +type ConfiguratorTypeLevel = Pick + +export const Configurator = (): Configurator.States.BuilderEmpty => { + const state = { ...$.empty } + const builder: Configurator.States.BuilderEmpty = { + [BuilderTypeSymbol]: true, + default(default_) { + state.default = default_ + return builder as any + }, + input() { + return builder as any + }, + normalized() { + return builder as any + }, + inputResolver(inputResolverInit) { + // todo: wrap resolver with object freezer. + state.inputResolver = $.createInputResolver(inputResolverInit) + return builder as any + }, + return() { + return state + }, + } + return builder +} + +namespace $ { + export const createInputResolver: Configurator.InputResolver.Create = (_) => { + const inputResolver = (parameters: any) => { + const result = _(parameters) + if (result === null) return parameters.current + return result + } + return inputResolver as any + } + + export const normalizeDataInput = ( + configuratorTypeInput: configuratorTypeInput, + ): Configurator => { + if (isBuilder(configuratorTypeInput)) { + return configuratorTypeInput.return() + } + if (typeof configuratorTypeInput === `function`) { + return configuratorTypeInput(Configurator()).return() + } + return configuratorTypeInput + } + + export const standardInputResolver_shallowMerge = createInputResolver(({ current, input }) => ({ + ...current, + ...input, + })) + + export const empty: Configurator.States.Empty = { + default: {}, + inputResolver: standardInputResolver_shallowMerge, + // Type Level + ...({} as ConfiguratorTypeLevel), + } + + export const InputResolver$FuncSymbol = Symbol(`InputResolver$Func`) +} + +Configurator.$ = $ + +const BuilderTypeSymbol = Symbol(`Builder`) + +const isBuilder = (value: any): value is Configurator.Builder => + typeof value === `object` && value !== null && BuilderTypeSymbol in value + +export namespace Configurator { + export type InferParameters<$Configurator extends Configurator> = HasRequiredKeys<$Configurator['input']> extends true + ? [configuration: $Configurator['input']] + : [configuration?: $Configurator['input']] + + export type DataInput<$Configurator extends Configurator = Configurator> = + | $Configurator + | Configurator.Builder<$Configurator> + | Configurator.BuilderProviderCallback<$Configurator> + + // export type TypeInput = + // | Configurator + // | Configurator.Builder + // | Configurator.BuilderProviderCallback + // ---------------------------- + // Builder + // ---------------------------- + + export interface BuilderProviderCallback<$ProgressiveConfigurator extends Configurator> { + (builder: States.BuilderEmpty): Builder<$ProgressiveConfigurator> + } + + export namespace States { + export type Empty = Configurator<{}> + export type BuilderEmpty = Builder + } + + // dprint-ignore + export interface Builder<$Configurator extends Configurator> { + [BuilderTypeSymbol]: true + // [$.SymbolBuilderData]: $Configurator + + input: + <$Input extends Configuration>( + ) => Builder, {}>> + + normalized: + <$Normalized extends $Configurator['input']>( + ) => Builder> + + default: + >( + default_: $Default, + ) => Builder> + + inputResolver: + <$Func extends InputResolver.$Func<$Configurator['input'], $Configurator['normalized'], $Configurator['default']> = + InputResolver.Standard_ShallowMerge$Func<$Configurator['input'], $Configurator['normalized'], $Configurator['default']>>( + inputResolver: InputResolver.Init< + $Configurator['input'], + $Configurator['normalized'], + $Configurator['default'] + >, + ) => Builder>> + + return: () => $Configurator + } + + // ---------------------------- + // Input Resolver + // ---------------------------- + export interface InputResolver< + $$Func extends InputResolver.$Func = InputResolver.Standard_ShallowMerge$Func< + Configuration, + Configuration, + Configuration + >, + > { + (parameters: { current: Configuration; input: Configuration }): Configuration + [$.InputResolver$FuncSymbol]: $$Func + } + + export namespace InputResolver { + export interface Standard_ShallowMerge$Func< + $Input extends Configuration, + $Normalized extends $Input, + $Default extends Partial<$Normalized>, + > extends $Func<$Input, $Normalized, $Default> { + return: Standard_ShallowMerge + } + + // dprint-ignore + export type Standard_ShallowMerge<$Parameters extends Parameters> = + & $Parameters['input'] + // Only keep current keys that are NOT in input. + & { + [_ in keyof $Parameters['current'] + as _ extends keyof $Parameters['input'] ? never : _ + ]: + $Parameters['current'][_] + } + + export interface Create { + < + $Input extends Configuration, + $Normalized extends $Input, + $Default extends Partial<$Normalized>, + $InputResolver$Func extends $Func<$Input, $Normalized, $Default> = never, + >(inputResolver: Init<$Input, $Normalized, $Default>): InputResolver<$InputResolver$Func> + } + + export interface Init< + $Input extends Configuration, + $Normalized extends $Input, + $Default extends Partial<$Normalized>, + > { + (parameters: Parameters<$Input, $Normalized, $Default>): null | Partial<$Normalized> + } + + export type $FuncSymbol = typeof $.InputResolver$FuncSymbol + + export interface $Func< + $Input extends Configuration = Configuration, + $Normalized extends $Input = $Input, + $Default extends Partial<$Normalized> = Partial<$Normalized>, + > { + parameters: Parameters<$Input, $Normalized, $Default> + return: object + } + + export interface Parameters< + $Input extends Configuration = Configuration, + $Normalized extends $Input = $Input, + $Default extends Partial<$Normalized> = Partial<$Normalized>, + > { + readonly input: $Input + readonly current: Simplify> + } + } + + // ------------- + // Helpers + // ------------- + + export type ApplyInputResolver$Func< + $Configurator extends Configurator, + $Current extends $Configurator['normalizedIncremental'], + $Input extends $Configurator['input'], + __ = ( + & $Configurator['inputResolver'][InputResolver.$FuncSymbol] + & { + parameters: { + current: $Current + input: $Input + } + } + )['return'], + > = __ + + export type Incrementify< + $Normalized extends Configuration, + $Default extends Configuration, + __Optional = { + [k in keyof $Normalized as k extends keyof $Default ? never : k]?: $Normalized[k] + }, + // If property shows up in $Default, then it can never be undefined. + __Guaranteed = { + [k in keyof $Normalized as k extends keyof $Default ? k : never]: $Normalized[k] + }, + __ = + & __Optional + & __Guaranteed, + > = __ + + export type Configuration = object + + export type Simplify<$Type> = + & { + [_ in keyof $Type]: $Type[_] + } + & {} +} diff --git a/src/lib/http.ts b/src/lib/http.ts index 1296d738f..a2d035039 100644 --- a/src/lib/http.ts +++ b/src/lib/http.ts @@ -8,14 +8,14 @@ export const statusCodes = { success: 200, } -export const mergeHeadersInit = (headers?: HeadersInit, additionalHeaders?: HeadersInit) => { - const base = new Headers(headers) +export const mergeHeadersInitWithStrategySet = (baseHeaders?: HeadersInit, additionalHeaders?: HeadersInit) => { + const base = new Headers(baseHeaders) const additional = new Headers(additionalHeaders) - for (const [key, value] of additional.entries()) { + for (const [key, value] of additional) { if (value === UnsetValue) { base.delete(key) } else { - base.set(key, value) + base.set(key, value) // todo append instead of set? } } return base @@ -46,7 +46,7 @@ export type HttpMethodInput = | 'TRACE' export const mergeRequestInit = (a?: RequestInit, b?: RequestInit): RequestInit => { - const headers = mergeHeadersInit(a?.headers ?? {}, b?.headers ?? {}) + const headers = mergeHeadersInitWithStrategySet(a?.headers ?? {}, b?.headers ?? {}) return { ...a, ...b, diff --git a/src/lib/mutableBuilder.ts b/src/lib/mutableBuilder.ts new file mode 100644 index 000000000..2d6318231 --- /dev/null +++ b/src/lib/mutableBuilder.ts @@ -0,0 +1,19 @@ +import { mapValues } from 'es-toolkit' + +export const createMutableBuilder = ( + parameters: { data: object; builder: Record any> }, +) => { + const builderInputWrapped = mapValues(parameters.builder, (method) => { + return (...args: any[]) => { + const result = method(...args) + if (result === undefined) return builderFinal + return result + } + }) + const builderFinal = { + data: parameters.data, + return: () => parameters.data, + ...builderInputWrapped, + } + return builderFinal +} diff --git a/src/lib/prelude.ts b/src/lib/prelude.ts index 139e6fb61..bc966f8ca 100644 --- a/src/lib/prelude.ts +++ b/src/lib/prelude.ts @@ -1,3 +1,6 @@ +export type Writeable<$Object> = { + -readonly [_ in keyof $Object]: $Object[_] +} import type { HasRequiredKeys, IsAny, IsEmptyObject, IsNever, IsUnknown, Simplify } from 'type-fest' import type { ConfigManager } from './config-manager/__.js' @@ -307,7 +310,7 @@ export namespace Objekt { export namespace Tuple { export type IndexKey = number | `${number}` - export type IsEmpty = T extends [] ? true : false + export type IsEmpty = T extends readonly [] ? true : false // dprint-ignore export type PreviousItem<$Items extends readonly any[], $OfItem> = @@ -689,8 +692,17 @@ export const isDate = (value: unknown): value is Date => { return value instanceof Date } -export const isObjectEmpty = (object: Record) => { - return Object.keys(object).length === 0 +export const isObjectEmpty = (object: object): boolean => { + for (const _ in object) return false + return true +} + +export const hasNonUndefinedKeys = (object: object): boolean => { + const record = object as Record + for (const _ in record) { + if (record[_] !== undefined) return true + } + return false } export const toArray = (value: T | T[]) => Array.isArray(value) ? value : [value] @@ -782,3 +794,23 @@ export type UnknownOrAnyToNever = unknown extends T ? never : T export type MergeAll<$Objects extends object[]> = $Objects extends [infer $First extends object, ...infer $Rest extends object[]] ? $First & MergeAll<$Rest> : {} + +export const emptyArray = Object.freeze([] as const) +export type EmptyArray = typeof emptyArray + +export const emptyObject = Object.freeze({}) +export type EmptyObject = typeof emptyObject + +export type ObjectMergeShallow< + $Object1 extends object, + $Object2 extends object, + __NewObject = + & { + [_ in keyof $Object1 as _ extends keyof $Object2 ? never : _]: $Object1[_] + } + & $Object2, +> = __NewObject + +export const as = <$Type>(value?: unknown): $Type => value as $Type + +export const undefinedAs = <$Type>() => as<$Type>(undefined) diff --git a/src/lib/private.ts b/src/lib/private.ts index a2d1b3704..f734af1b1 100644 --- a/src/lib/private.ts +++ b/src/lib/private.ts @@ -1,7 +1,7 @@ export namespace Private { const privateSymbol = Symbol(`private`) - type privateSymbol = typeof privateSymbol + export type privateSymbol = typeof privateSymbol /** * Some generic private data. @@ -11,7 +11,7 @@ export namespace Private { /** * Some type that has private data. */ - type Type = { + export interface Type { [privateSymbol]: Data } diff --git a/src/requestPipeline/RequestPipeline.ts b/src/requestPipeline/RequestPipeline.ts index 4b1859be6..ad6077532 100644 --- a/src/requestPipeline/RequestPipeline.ts +++ b/src/requestPipeline/RequestPipeline.ts @@ -1,7 +1,7 @@ import type { FormattedExecutionResult } from 'graphql' -import type { GraffleExecutionResultEnvelope } from '../client/handleOutput.js' -import { Anyware } from '../lib/anyware/__.js' -import type { Config } from '../lib/anyware/PipelineDef/Config.js' +import type { GraffleExecutionResultEnvelope } from '../client/properties/output/handle.js' +import { Anyware } from '../lib/anyware/_namespace.js' +import type { Config } from '../lib/anyware/PipelineDefinition/Config.js' import type { Grafaid } from '../lib/grafaid/__.js' import { normalizeRequestToNode } from '../lib/grafaid/request.js' import { isAbortError } from '../lib/prelude.js' @@ -10,6 +10,15 @@ import { decodeResultData } from './CustomScalars/decode.js' import { encodeRequestVariables } from './CustomScalars/encode.js' export namespace RequestPipeline { + export const stepName = { + encode: `encode`, + pack: `pack`, + exchange: `exchange`, + unpack: `unpack`, + decode: `decode`, + } as const + export type StepName = keyof typeof stepName + export interface Input { request: Grafaid.RequestAnalyzedInput state: Context @@ -28,46 +37,34 @@ export namespace RequestPipeline { export type PackInput = EncodeOutput export type Output = GraffleExecutionResultEnvelope -} -export interface RequestPipelineBaseDefinition extends Anyware.PipelineDefinition { - overloads: [] - config: Config - input: { - request: Grafaid.RequestAnalyzedInput - state: Context - transportType: 'none' - transport: {} + export interface BaseDefinition extends Anyware.PipelineDefinition { + readonly config: Config + readonly input: { + request: Grafaid.RequestAnalyzedInput + state: Context + transportType: 'none' + transport: {} + } + readonly steps: [ + Anyware.StepDefinition<'encode', {}, RequestPipeline.Input, RequestPipeline.EncodeOutput>, + Anyware.StepDefinition<'pack', {}, RequestPipeline.PackInput, {}>, + Anyware.StepDefinition<'exchange', {}, {}, {}>, + Anyware.StepDefinition<'unpack', {}, {}, {}>, + Anyware.StepDefinition<'decode', {}, RequestPipeline.DecodeInput, RequestPipeline.Output>, + ] + } + export interface BaseDefinitionEmpty extends BaseDefinition { + readonly overloads: readonly [] } - steps: [{ - name: 'encode' - input: RequestPipeline.Input - output: RequestPipeline.EncodeOutput - slots: {} - }, { - name: 'pack' - input: RequestPipeline.PackInput - output: {} - slots: {} - }, { - name: 'exchange' - input: {} - output: {} - slots: {} - }, { - name: 'unpack' - input: {} - output: {} - slots: {} - }, { - name: 'decode' - input: RequestPipeline.DecodeInput - output: RequestPipeline.Output - slots: {} - }] + + export type Base = Anyware.Pipeline.InferFromDefinition + + export type BaseInterceptor = Anyware.Interceptor.InferFromPipeline } -export const requestPipelineBaseDefinition: RequestPipelineBaseDefinition = Anyware.PipelineDefinition +const { stepName } = RequestPipeline +export const requestPipelineBaseDefinition: RequestPipeline.BaseDefinitionEmpty = Anyware.PipelineDefinition .create({ // If core errors caused by an abort error then raise it as a direct error. // This is an expected possible error. Possible when user cancels a request. @@ -78,10 +75,10 @@ export const requestPipelineBaseDefinition: RequestPipelineBaseDefinition = Anyw return signal.hookName === `exchange` && isAbortError(signal.error) }, }) - .input() - .step(`encode`, { + .input() + .step(stepName.encode, { run: (input) => { - const sddm = input.state.schemaMap + const sddm = input.state.configuration.schema.current.map const scalars = input.state.scalars.map if (sddm) { const request = normalizeRequestToNode(input.request) @@ -94,10 +91,10 @@ export const requestPipelineBaseDefinition: RequestPipelineBaseDefinition = Anyw return input }, }) - .step(`pack`) - .step(`exchange`) - .step(`unpack`) - .step(`decode`, { + .step(stepName.pack) + .step(stepName.exchange) + .step(stepName.unpack) + .step(stepName.decode, { run: ( input: { state: Context @@ -106,13 +103,14 @@ export const requestPipelineBaseDefinition: RequestPipelineBaseDefinition = Anyw _, previous, ) => { + const sddm = input.state.configuration.schema.current.map // If there has been an error and we definitely don't have any data, such as when // giving an operation name that doesn't match any in the document, // then don't attempt to decode. const isError = !input.result.data && (input.result.errors?.length ?? 0) > 0 - if (input.state.schemaMap && !isError) { + if (sddm && !isError) { decodeResultData({ - sddm: input.state.schemaMap, + sddm, request: normalizeRequestToNode(previous.pack.input.request), data: input.result.data, scalars: input.state.scalars.map, @@ -131,7 +129,3 @@ export const requestPipelineBaseDefinition: RequestPipelineBaseDefinition = Anyw }, }) .type - -export type RequestPipelineBase = Anyware.Pipeline.InferFromDefinition - -export type RequestPipelineBaseInterceptor = Anyware.Interceptor.InferFromPipeline diff --git a/src/types/GlobalRegistry/types.ts b/src/types/GlobalRegistry/types.ts index 93c7a2bfd..e5c589a3a 100644 --- a/src/types/GlobalRegistry/types.ts +++ b/src/types/GlobalRegistry/types.ts @@ -25,6 +25,10 @@ export type Extensions< Schema: ConfigManager.OrDefault<$Extensions['Schema'], TypeExtensions> } +export namespace Client { + export type Define<$Type extends Partial> = $Type & Client +} + export interface Client<$Extensions extends Extensions = Extensions> { name: string schema: Schema<$Extensions['Schema']> diff --git a/src/types/RequestResult.ts/Simplify.test-d.ts b/src/types/RequestResult.ts/Simplify.test-d.ts index ee4841a0b..7cee9809c 100644 --- a/src/types/RequestResult.ts/Simplify.test-d.ts +++ b/src/types/RequestResult.ts/Simplify.test-d.ts @@ -1,5 +1,5 @@ -import type { AddScalar } from '../../client/properties/scalar.js' -import type { Extension } from '../../extension/__.js' +import type { ContextAdd } from '../../client/properties/scalars/scalars.js' +import type { Extension } from '../../extension/$.js' import { assertEqual } from '../../lib/assert-equal.js' import type { Context } from '../context.js' import type { Schema } from '../Schema/__.js' @@ -9,23 +9,23 @@ import type { _SimplifyExcept, Simplify, SimplifyWithEmptyContext } from './Simp { type DateScalar = Schema.Scalar<'Date', Date, string> type CEmpty = Context.States.Empty -type CExt = Extension.AddExtensionTypeHooks -type CScalar = AddScalar -type CExtAndScalar = AddScalar +// type CExt = Extension.AddExtensionTypeHooks +type CScalar = ContextAdd +// type CExtAndScalar = AddScalar type _1 = Simplify // @ts-expect-error assertEqual<_1 , {x:Date|null}>() -type _2 = Simplify -assertEqual<_2 , {x:Text|null}>() +// type _2 = Simplify +// assertEqual<_2 , {x:Text|null}>() type _3 = Simplify assertEqual<_3 , {x:Date|null}>() -type _4 = Simplify -assertEqual<_4 , {x:Date|Text|null}>() +// type _4 = Simplify +// assertEqual<_4 , {x:Date|Text|null}>() diff --git a/src/types/Schema/helpers.ts b/src/types/Schema/helpers.ts index a85260f7e..af8c6c122 100644 --- a/src/types/Schema/helpers.ts +++ b/src/types/Schema/helpers.ts @@ -1,4 +1,5 @@ // import type { TSErrorDescriptive } from '../../lib/ts-error.js' +import type { Schema } from './__.js' import type { __typename } from './nodes/__typename.js' import type { List } from './nodes/List.js' import type { Nullable } from './nodes/Nullable.js' @@ -13,3 +14,5 @@ export type GetNamedType<$Type> = $Type // $Type extends NamedTypes ? $Type : // TSErrorDescriptive<'Unwrap', 'Unknown $Type', { $Type: $Type }> + +export type Define<$Type extends Partial> = $Type & Schema diff --git a/src/types/Schema/nodes/Scalar/codec.ts b/src/types/Schema/nodes/Scalar/codec.ts index 47c37d38a..f51461f8b 100644 --- a/src/types/Schema/nodes/Scalar/codec.ts +++ b/src/types/Schema/nodes/Scalar/codec.ts @@ -1,16 +1,18 @@ import type { Grafaid } from '../../../../lib/grafaid/__.js' -export type Codec< +export interface Codec< $Decoded = any, $Encoded extends Grafaid.Schema.StandardScalarRuntimeTypes = Grafaid.Schema.StandardScalarRuntimeTypes, -> = { +> { encode: <$$Decoded extends $Decoded>(value: $$Decoded) => $Encoded decode: <$$Encoded extends $Encoded>(value: $$Encoded) => $Decoded + _typeEncoded: $Encoded + _typeDecoded: $Decoded } export const createCodec = <$Decoded, $Encoded extends Grafaid.Schema.StandardScalarRuntimeTypes>(codec: { encode: (value: $Decoded) => $Encoded decode: (value: $Encoded) => $Decoded -}): Codec<$Decoded, $Encoded> => codec +}): Codec<$Decoded, $Encoded> => codec as any export type Mapper = (value: any) => any diff --git a/src/types/Schema/nodes/Scalar/helpers.ts b/src/types/Schema/nodes/Scalar/helpers.ts index 16c366af1..48ec8f02f 100644 --- a/src/types/Schema/nodes/Scalar/helpers.ts +++ b/src/types/Schema/nodes/Scalar/helpers.ts @@ -1,4 +1,4 @@ -import type { AnyAndUnknownToNever } from '../../../../lib/prelude.js' +import { type AnyAndUnknownToNever, type EmptyObject, emptyObject } from '../../../../lib/prelude.js' import { String } from '../../StandardTypes/scalar.js' import type { Mapper } from './codec.js' import type { Scalar } from './Scalar.js' @@ -26,7 +26,7 @@ export interface Registry< } export interface RegistryEmpty { - map: {} + map: EmptyObject typesEncoded: never typesDecoded: never } @@ -35,7 +35,7 @@ export namespace Registry { export type Empty = RegistryEmpty export const empty = { - map: {}, + map: emptyObject, } as RegistryEmpty export type AddScalar<$Registry extends Registry, $Scalar extends Scalar> = { diff --git a/src/types/Transport.ts b/src/types/Transport.ts deleted file mode 100644 index fefecbb52..000000000 --- a/src/types/Transport.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Anyware } from '../lib/anyware/__.js' -import type { RequestPipelineBaseDefinition } from '../requestPipeline/__.js' - -export interface Transport { - name: string - requestPipelineOverload: Anyware.Overload - config: object - configInit: object - configDefaults: object | undefined -} - -export namespace Transport { - export namespace Builder { - export interface Namespace { - create: Create - } - - export interface Create { - <$Name extends string>(name: $Name): Anyware.Overload.Builder - } - } -} diff --git a/src/types/context.ts b/src/types/context.ts index d9928138f..bb04f030f 100644 --- a/src/types/context.ts +++ b/src/types/context.ts @@ -1,240 +1,76 @@ -import { type ConfigInit, type ConfigInitOutputEnvelopeLonghand } from '../client/Configuration/ConfigInit.js' -import { type OutputConfig, type OutputConfigDefault, outputConfigDefault } from '../client/Configuration/Output.js' -import type { Extension } from '../extension/__.js' -import type { Anyware } from '../lib/anyware/__.js' -import type { Objekt, StringKeyof } from '../lib/prelude.js' -import { - type RequestPipelineBaseDefinition, - requestPipelineBaseDefinition, -} from '../requestPipeline/RequestPipeline.js' -import { GlobalRegistry } from './GlobalRegistry/GlobalRegistry.js' -import { Schema } from './Schema/__.js' -import type { SchemaDrivenDataMap } from './SchemaDrivenDataMap/SchemaDrivenDataMap.js' -import type { Transport } from './Transport.js' - -export interface Context extends ContextTypeLevel, ContextValueLevel {} - -export interface ContextTypeLevel { +import { Configuration } from '../client/properties/configuration/__.js' +import { Extensions } from '../client/properties/extensions/__.js' +import { Properties } from '../client/properties/properties/__.js' +import { RequestInterceptors } from '../client/properties/requestInterceptors/__.js' +import { Scalars } from '../client/properties/scalars/__.js' +import { Transports } from '../client/properties/transports/__.js' +import { type EmptyArray, type ObjectMergeShallow } from '../lib/prelude.js' + +export interface Context + extends + Configuration.ContextFragmentConfiguration, + Transports.ContextFragment, + Properties.ContextFragmentProperties, + RequestInterceptors.ContextFragmentRequestInterceptors, + Extensions.ContextFragmentExtensions, + Scalars.ContextFragment +{ + // Type Level Properties /** * Type level augmentations. * * @remarks Typically added by extensions. Added here upon use for optimized type-level reads later on. */ - typeHookOnRequestResult: Extension.TypeHooks.OnRequestResult[] - typeHookOnRequestDocumentRootType: Extension.TypeHooks.OnRequestDocumentRootType[] + // typeHookOnRequestResult: Extension.TypeHooks.OnRequestResult[] + // typeHookOnRequestDocumentRootType: Extension.TypeHooks.OnRequestDocumentRootType[] typeHookRequestResultDataTypes: unknown } -export interface ContextValueLevel { - name: string - requestPipelineDefinition: Anyware.PipelineDefinition - transports: ClientTransports - /** - * If enabled, this will cause request methods to be statically unavailable if - * a transport is not correctly configured. - * - * @defaultValue `true` - */ - checkPreflight?: boolean - /** - * The initial input that was given to derive the config. - */ - input: ConfigInit - output: OutputConfig - schemaMap: SchemaDrivenDataMap | null - extensions: Extension[] - scalars: Schema.Scalar.Registry -} - -export interface ClientTransports { - registry: ClientTransportsRegistry - /** - * `null` if registry is empty. - */ - current: null | string - configurations: ClientTransportsConfigurations -} - -export interface ClientTransportsRegistry { - [name: string]: Transport -} - -export interface ClientTransportsConfigurations { - [name: string]: ClientTransportsConfiguration -} - -export type ClientTransportsConfiguration = object - -export namespace ClientTransports { - export namespace Errors { - export type PreflightCheckNoTransportsRegistered = - 'Error: You cannot send requests yet. You must setup a transport.' - - export type PreflightCheckNoTransportSelected = - 'Error: You cannot send requests yet. You must select a transport to use.' - - export type PreflightCheckTransportNotReady<$TransportName extends string> = - `Error: You cannot send requests yet. The selected transport "${$TransportName}" is not sufficiently configured.` - } - - // dprint-ignore - export type PreflightCheck< - $Context, - $SuccessValue = true, - > = - // @ts-expect-error context constraint missing to avoid TS compare depth limit - $Context['checkPreflight'] extends false - ? $SuccessValue - // @ts-expect-error context constraint missing to avoid TS compare depth limit - : PreflightCheck_<$Context['transports'], $SuccessValue> - // dprint-ignore - export type PreflightCheck_< - $ClientTransports extends ClientTransports, - $SuccessValue = true, - > = - $ClientTransports extends ClientTransports.States.Empty - ? ClientTransports.Errors.PreflightCheckNoTransportsRegistered - : $ClientTransports['current'] extends string - ? $ClientTransports['current'] extends keyof $ClientTransports['configurations'] - ? $ClientTransports['current'] extends keyof $ClientTransports['registry'] - ? $ClientTransports['configurations'][$ClientTransports['current']] extends $ClientTransports['registry'][$ClientTransports['current']]['config'] - ? $SuccessValue - : ClientTransports.Errors.PreflightCheckTransportNotReady<$ClientTransports['current']> - : never // Should never happen - : never // Should never happen - : ClientTransports.Errors.PreflightCheckNoTransportSelected - - // dprint-ignore - export type GetNames<$ClientTransports extends ClientTransports> = - Objekt.IsEmpty<$ClientTransports['registry']> extends true - ? 'Error: Transport registry is empty. Please add a transport.' - : StringKeyof<$ClientTransports['registry']> - - export namespace States { - export interface Empty { - registry: {} - configurations: {} - current: null - } - export const empty: Empty = { - registry: {}, - configurations: {}, - current: null, - } - - export interface NonEmpty { - registry: ClientTransportsRegistry - configurations: ClientTransportsConfigurations - current: string - } - } -} - -export type DefaultCheckPreflight = true - -export const defaultCheckPreflight: DefaultCheckPreflight = true - -export type DefaultName = GlobalRegistry.DefaultClientName - -export const defaultName = GlobalRegistry.defaultClientName - export namespace Context { - export const updateContextConfigInit = ( - context: Context, - configInit: ConfigInit, - ): Context => { - const outputEnvelopeLonghand: ConfigInitOutputEnvelopeLonghand | undefined = - typeof configInit.output?.envelope === `object` - ? { enabled: true, ...configInit.output.envelope } - : typeof configInit.output?.envelope === `boolean` - ? { enabled: configInit.output.envelope } - : undefined - - const newConfig = { - name: configInit.name ?? context?.name ?? defaultName, - schemaMap: configInit.schemaMap ?? context.schemaMap, - output: { - defaults: { - errorChannel: configInit.output?.defaults?.errorChannel ?? context.output.defaults.errorChannel, - }, - envelope: { - enabled: outputEnvelopeLonghand?.enabled ?? context.output.envelope.enabled, - errors: { - execution: outputEnvelopeLonghand?.errors?.execution ?? context.output.envelope.errors.execution, - other: outputEnvelopeLonghand?.errors?.other ?? context.output.envelope.errors.other, - // @ts-expect-error - schema: outputEnvelopeLonghand?.errors?.schema ?? context.output.envelope.errors.schema, - }, - }, - errors: { - execution: configInit.output?.errors?.execution ?? context.output.errors.execution, - other: configInit.output?.errors?.other ?? context.output.errors.other, - // @ts-expect-error conditional type - schema: configInit.output?.errors?.schema ?? context.output.errors.schema, - }, - }, - } - - return Context.withTypeLevel({ - ...context, - ...newConfig, - }) - } - export const withTypeLevel = (contextValueLevel: ContextValueLevel): Context => contextValueLevel as any - export namespace States { export interface Empty extends Context { - name: DefaultName - scalars: Schema.Scalar.Registry.Empty - extensions: [] - transports: ClientTransports.States.Empty - checkPreflight: DefaultCheckPreflight - schemaMap: null - input: {} - requestPipelineDefinition: RequestPipelineBaseDefinition - output: OutputConfigDefault + readonly properties: Properties.ContextFragmentPropertiesEmpty['properties'] + readonly transports: Transports.ContextFragmentTransportsEmpty['transports'] + readonly requestPipelineDefinition: Transports.ContextFragmentTransportsEmpty['requestPipelineDefinition'] + readonly extensions: Extensions.ContextFragmentExtensionsEmpty['extensions'] + readonly extensionsIndex: Extensions.ContextFragmentExtensionsEmpty['extensionsIndex'] + readonly scalars: Scalars.ContextFragmentEmpty['scalars'] + readonly configuration: Configuration.ContextFragmentConfigurationEmpty['configuration'] // type-level properties // todo merge typehooks empty from extension type here to DRY - typeHookOnRequestDocumentRootType: [] - typeHookOnRequestResult: [] - typeHookRequestResultDataTypes: never + readonly typeHookOnRequestDocumentRootType: EmptyArray + readonly typeHookOnRequestResult: EmptyArray + readonly typeHookRequestResultDataTypes: never } - export const empty: Empty = { - name: defaultName, - requestPipelineDefinition: requestPipelineBaseDefinition, - transports: ClientTransports.States.empty, - checkPreflight: defaultCheckPreflight, - input: {}, - output: outputConfigDefault, - schemaMap: null, - extensions: [], - scalars: Schema.Scalar.Registry.empty, - // type-only properties - // typeHookOnRequestDocumentRootType: [], - // typeHookOnRequestResult: [], - } as Empty - } - export namespace Updaters { - // dprint-ignore - export type AddTransportOptional< - $ClientTransports extends ClientTransports, - $Transport extends Transport | undefined, - > = - $Transport extends Transport - ? { - configurations: - & Omit<$ClientTransports['configurations'], $Transport['name']> - & { - [_ in $Transport['name']]: $Transport['configInit'] - } - current: $ClientTransports extends ClientTransports.States.Empty - ? $Transport['name'] - : $ClientTransports['current'] - registry: $ClientTransports['registry'] & { - [_ in $Transport['name']]: $Transport - } - } - : $ClientTransports + export const empty: Empty = Object.freeze({ + ...Properties.contextFragmentPropertiesEmpty, + ...Transports.contextFragmentTransportsEmpty, + ...RequestInterceptors.contextFragmentRequestInterceptorsEmpty, + ...Extensions.contextFragmentExtensionsEmpty, + ...Scalars.contextFragmentScalarsEmpty, + ...Configuration.contextFragmentConfigurationEmpty, + typeHookOnRequestDocumentRootType: null as any, + typeHookOnRequestResult: null as any, + typeHookRequestResultDataTypes: null as never, + }) } } + +// ------------------------------------------------------------ +// Fragment +// ------------------------------------------------------------ + +export type ContextFragment = Partial + +export const contextMergeFragment = <$Context extends Context, $Fragment extends null | ContextFragment>( + context: $Context, + fragment: $Fragment, +): $Fragment extends null ? $Context : $Fragment extends Context ? ObjectMergeShallow<$Context, $Fragment> : never => { + if (!fragment) return context as any + const newContext = Object.freeze({ + ...context, + ...fragment, + }) as any + return newContext +} diff --git a/tests/_/SpyExtension.ts b/tests/_/SpyExtension.ts index eef80b88d..77680096e 100644 --- a/tests/_/SpyExtension.ts +++ b/tests/_/SpyExtension.ts @@ -1,16 +1,16 @@ import { beforeEach } from 'vitest' -import { Extension } from '../../src/entrypoints/extensionkit.js' -import type { RequestPipelineBaseDefinition } from '../../src/requestPipeline/__.js' +import { Extension } from '../../src/entrypoints/extension.js' +import type { RequestPipeline } from '../../src/requestPipeline/__.js' interface SpyData { encode: { - input: RequestPipelineBaseDefinition['steps']['0']['input'] | null + input: RequestPipeline.BaseDefinition['steps']['0']['input'] | null } pack: { - input: RequestPipelineBaseDefinition['steps']['1']['input'] | null + input: RequestPipeline.BaseDefinition['steps']['1']['input'] | null } exchange: { - input: RequestPipelineBaseDefinition['steps']['2']['input'] | null + input: RequestPipeline.BaseDefinition['steps']['2']['input'] | null } } @@ -26,25 +26,18 @@ const emptySpyData: SpyData = { }, } -export const Spy = Extension.create({ - name: `Spy`, - custom: { - data: emptySpyData, - }, - create: () => { - return { - onRequest: async ({ encode }) => { - Spy.data.encode.input = encode.input - const { pack } = await encode() - Spy.data.pack.input = pack.input - const { exchange } = await pack() - Spy.data.exchange.input = exchange.input - return exchange() - }, - } - }, -}) +export const Spy = Extension(`Spy`) + .requestInterceptor(async ({ encode }) => { + Spy.static.encode.input = encode.input + const { pack } = await encode() + Spy.static.pack.input = pack.input + const { exchange } = await pack() + Spy.static.exchange.input = exchange.input + return exchange() + }) + .static(emptySpyData) + .return() beforeEach(() => { - Spy.data = emptySpyData + Spy.static = emptySpyData }) diff --git a/tests/_/fixtures/extensions.ts b/tests/_/fixtures/extensions.ts new file mode 100644 index 000000000..e69de29bb diff --git a/tests/_/fixtures/scalars.ts b/tests/_/fixtures/scalars.ts index ddc9575c2..26defd511 100644 --- a/tests/_/fixtures/scalars.ts +++ b/tests/_/fixtures/scalars.ts @@ -9,3 +9,15 @@ export const FooScalar = Graffle.Scalars.create(`Foo`, { encode: (value) => String(value), decode: (value) => value, }) + +export const AScalar = Graffle.Scalars.create(`A`, { + decode: (value: string) => BigInt(value), + encode: (value: bigint) => value.toString(), +}) +export type AScalar = typeof AScalar + +export const BScalar = Graffle.Scalars.create(`B`, { + decode: (value: string) => new Date(value), + encode: (value: Date) => value.toISOString(), +}) +export type BScalar = typeof BScalar diff --git a/tests/_/fixtures/transports.ts b/tests/_/fixtures/transports.ts new file mode 100644 index 000000000..974088cee --- /dev/null +++ b/tests/_/fixtures/transports.ts @@ -0,0 +1,65 @@ +import { Transport } from '../../../src/entrypoints/main.js' + +// ---------------------------- +// ATransportBuilder +// ---------------------------- + +export const ATransportBuilder = Transport(`ATransport`) + .configurator($ => $.input<{ a?: number }>().normalized<{ a?: number }>()) + .pack({ run: (input) => input }) + .exchange({ run: (input) => input }) + .unpack({ run: (input) => ({ ...input, result: { data: {} } }) }) + +export type ATransportBuilder = typeof ATransportBuilder + +export const ATransport = ATransportBuilder.return() + +export type ATransport = typeof ATransport + +// ---------------------------- +// BTransportBuilder +// ---------------------------- + +export const BTransportBuilder = Transport(`BTransport`) + .configurator($ => $.input<{ b?: string }>().normalized<{ b?: string }>()) + .pack({ run: (input) => input }) + .exchange({ run: (input) => input }) + .unpack({ run: (input) => ({ ...input, result: { data: {} } }) }) + +export type BTransportBuilder = typeof BTransportBuilder + +export const BTransport = BTransportBuilder.return() + +export type BTransport = typeof BTransport + +// ------------------------------- +// RequiredConfigurationTransport +// ------------------------------- + +export const RequiredConfigurationTransportBuilderA = Transport(`RequiredConfigurationTransportA`) + .configurator($ => $.input<{ a?: string }>()) + .pack({ run: (input) => input }) + .exchange({ run: (input) => input }) + .unpack({ run: (input) => ({ ...input, result: { data: {} } }) }) + +export type RequiredConfigurationTransportBuilderA = typeof RequiredConfigurationTransportBuilderA + +export const RequiredConfigurationTransportA = RequiredConfigurationTransportBuilderA.return() + +export type RequiredConfigurationTransportA = typeof RequiredConfigurationTransportA + +// ------------------------------- +// RequiredConfigurationTransportB +// ------------------------------- + +export const RequiredConfigurationTransportBuilderB = Transport(`RequiredConfigurationTransportB`) + .configurator($ => $.input<{ b?: string }>()) + .pack({ run: (input) => input }) + .exchange({ run: (input) => input }) + .unpack({ run: (input) => ({ ...input, result: { data: {} } }) }) + +export type RequiredConfigurationTransportBuilderB = typeof RequiredConfigurationTransportBuilderB + +export const RequiredConfigurationTransportB = RequiredConfigurationTransportBuilderB.return() + +export type RequiredConfigurationTransportB = typeof RequiredConfigurationTransportB diff --git a/tests/_/helpers.ts b/tests/_/helpers.ts index 2937cd2d3..7034bf86b 100644 --- a/tests/_/helpers.ts +++ b/tests/_/helpers.ts @@ -4,7 +4,9 @@ import type { FSJetpack } from 'fs-jetpack/types.js' import * as Path from 'node:path' import type { Mock } from 'vitest' import { test as testBase, vi } from 'vitest' +import type { ClientEmpty } from '../../src/client/client.js' import { Graffle } from '../../src/entrypoints/main.js' +import { GraffleBare } from '../../src/entrypoints/presets/bare.js' import type { GraffleBasic } from '../../src/entrypoints/presets/basic.js' import type { GraffleMinimal } from '../../src/entrypoints/presets/minimal.js' import type { SchemaDrivenDataMap } from '../../src/entrypoints/utilities-for-generated.js' @@ -28,29 +30,30 @@ interface Project { }> } -export const kitchenSink = KitchenSink - .create({ checkPreflight: false }) - .use(TransportMemory({ - schema: kitchenSinkSchema, - })) - .transport(`memory`) +// export const kitchenSink = KitchenSink +// .create({ check: { preflight: false } }) +// .use(TransportMemory({ +// schema: kitchenSinkSchema, +// })) +// .transport(`memory`) export const createResponse = (body: object) => new Response(JSON.stringify(body), { status: 200, headers: { 'content-type': CONTENT_TYPE_REC } }) interface Fixtures { fetch: Mock<(request: Request) => Promise> + g0: ClientEmpty pokemonService: SchemaService - graffle: GraffleMinimal.Client.With<{ - checkPreflight: false - }> - kitchenSinkHttp: GraffleBasic.Client.With<{ - schemaMap: SchemaDrivenDataMap - checkPreflight: false - }> + // graffle: GraffleMinimal.Client.With<{ + // check: { preflight: false } + // }> + // kitchenSinkHttp: GraffleBasic.Client.With<{ + // schema: { map: SchemaDrivenDataMap } + // check: { preflight: false } + // }> kitchenSink: GraffleBasic.Client.With<{ - schemaMap: SchemaDrivenDataMap - checkPreflight: false + schema: { map: SchemaDrivenDataMap } + check: { preflight: false } transports: ConfigManager.SetKeyUnsafe< GraffleBasic.Client.Context['transports'], `current`, @@ -61,6 +64,8 @@ interface Fixtures { project: Project } +export const g0 = GraffleBare.create() + export const test = testBase.extend({ project: async ({}, use) => { // eslint-disable-line /** @@ -147,33 +152,36 @@ export const test = testBase.extend({ await use(fetchMock) globalThis.fetch = fetch }, + g0: async ({}, use) => { + await use(g0) + }, kitchenSink: async ({ fetch: _ }, use) => { const kitchenSink = KitchenSink.create() - .use(TransportMemory({ schema: kitchenSinkSchema })) - .transport(`memory`) + .use(TransportMemory) + .transport() // kitchenSink.anyware(async ({ encode }) => { // encode({ input: {}}) // }) // @ts-expect-error fixme await use(kitchenSink) }, - kitchenSinkHttp: async ({ fetch: _ }, use) => { - const kitchenSink = KitchenSink - .create() - .transport({ url: `https://foo.io/api/graphql` }) - // @ts-expect-error fixme - await use(kitchenSink) - }, + // kitchenSinkHttp: async ({ fetch: _ }, use) => { + // const kitchenSink = KitchenSink + // .create() + // .transport({ url: `https://foo.io/api/graphql` }) + // // @ts-expect-error fixme + // await use(kitchenSink) + // }, kitchenSinkData: async ({}, use) => { // eslint-disable-line await use(db) }, - graffle: async ({ fetch: _ }, use) => { - const graffle = Graffle - .create() - .transport({ url: new URL(`https://foo.io/api/graphql`) }) - // @ts-expect-error fixme - await use(graffle) - }, + // graffle: async ({ fetch: _ }, use) => { + // const graffle = Graffle + // .create() + // .transport({ url: new URL(`https://foo.io/api/graphql`) }) + // // @ts-expect-error fixme + // await use(graffle) + // }, pokemonService: async ({}, use) => { // eslint-disable-line const pokemonService = await serveSchema({ schema }) await use(pokemonService) diff --git a/tests/_/schemas/kitchen-sink/graffle/modules/client.ts b/tests/_/schemas/kitchen-sink/graffle/modules/client.ts index a5402a554..646372be6 100644 --- a/tests/_/schemas/kitchen-sink/graffle/modules/client.ts +++ b/tests/_/schemas/kitchen-sink/graffle/modules/client.ts @@ -5,19 +5,20 @@ import * as $$Data from './data.js' import * as $$Scalar from './scalar.js' import * as $$SchemaDrivenDataMap from './schema-driven-data-map.js' -const context = $$Utilities.useReducer( - $$Utilities.useReducer( +const context = $$Utilities.contextFragmentExtensionsAdd( + $$Utilities.contextFragmentExtensionsAdd( { ...$$Utilities.Context.States.empty, name: $$Data.Name, schemaMap: $$SchemaDrivenDataMap.schemaDrivenDataMap, scalars: $$Scalar.$registry, }, - TransportHttp({ - url: $$Data.defaultSchemaUrl, - }), + TransportHttp, + // TransportHttp({ + // url: $$Data.defaultSchemaUrl, + // }), ), - DocumentBuilder(), + DocumentBuilder, ) export const create = $$Utilities.createConstructorWithContext( diff --git a/tests/_/schemas/kitchen-sink/graffle/modules/methods-root.ts b/tests/_/schemas/kitchen-sink/graffle/modules/methods-root.ts index 1f9dcc0b0..318132f3c 100644 --- a/tests/_/schemas/kitchen-sink/graffle/modules/methods-root.ts +++ b/tests/_/schemas/kitchen-sink/graffle/modules/methods-root.ts @@ -3,7 +3,7 @@ import * as $$Schema from './schema.js' import * as $$SelectionSets from './selection-sets.js' export interface QueryMethods<$Context extends $$Utilities.Context> { - $batch: $$Utilities.ClientTransports.PreflightCheck< + $batch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query<$Context['scalars']>>, @@ -18,7 +18,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > > - __typename: $$Utilities.ClientTransports.PreflightCheck< + __typename: $$Utilities.ContextTransports.PreflightCheck< $Context, () => Promise< & (null | {}) @@ -30,7 +30,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - InputObjectNested: $$Utilities.ClientTransports.PreflightCheck< + InputObjectNested: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.InputObjectNested<$Context['scalars']>>, @@ -47,7 +47,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - InputObjectNestedNonNull: $$Utilities.ClientTransports.PreflightCheck< + InputObjectNestedNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -69,7 +69,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Query enum field documentation. */ - abcEnum: $$Utilities.ClientTransports.PreflightCheck< + abcEnum: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.abcEnum<$Context['scalars']>>, @@ -86,7 +86,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - argInputObjectCircular: $$Utilities.ClientTransports.PreflightCheck< + argInputObjectCircular: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact< @@ -106,7 +106,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - date: $$Utilities.ClientTransports.PreflightCheck< + date: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.date<$Context['scalars']>>, @@ -123,7 +123,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArg: $$Utilities.ClientTransports.PreflightCheck< + dateArg: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateArg<$Context['scalars']>>, @@ -140,7 +140,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArgInputObject: $$Utilities.ClientTransports.PreflightCheck< + dateArgInputObject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateArgInputObject<$Context['scalars']>>, @@ -157,7 +157,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArgList: $$Utilities.ClientTransports.PreflightCheck< + dateArgList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateArgList<$Context['scalars']>>, @@ -174,7 +174,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArgNonNull: $$Utilities.ClientTransports.PreflightCheck< + dateArgNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateArgNonNull<$Context['scalars']>>, @@ -191,7 +191,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArgNonNullList: $$Utilities.ClientTransports.PreflightCheck< + dateArgNonNullList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateArgNonNullList<$Context['scalars']>>, @@ -208,7 +208,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateArgNonNullListNonNull: $$Utilities.ClientTransports.PreflightCheck< + dateArgNonNullListNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -228,7 +228,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateInterface1: $$Utilities.ClientTransports.PreflightCheck< + dateInterface1: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateInterface1<$Context['scalars']>>, @@ -245,7 +245,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateList: $$Utilities.ClientTransports.PreflightCheck< + dateList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateList<$Context['scalars']>>, @@ -262,7 +262,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateListList: $$Utilities.ClientTransports.PreflightCheck< + dateListList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateListList<$Context['scalars']>>, @@ -279,7 +279,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateListNonNull: $$Utilities.ClientTransports.PreflightCheck< + dateListNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateListNonNull<$Context['scalars']>>, @@ -296,7 +296,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateNonNull: $$Utilities.ClientTransports.PreflightCheck< + dateNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateNonNull<$Context['scalars']>>, @@ -313,7 +313,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateObject1: $$Utilities.ClientTransports.PreflightCheck< + dateObject1: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateObject1<$Context['scalars']>>, @@ -330,7 +330,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - dateUnion: $$Utilities.ClientTransports.PreflightCheck< + dateUnion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.dateUnion<$Context['scalars']>>, @@ -347,7 +347,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - error: $$Utilities.ClientTransports.PreflightCheck< + error: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.error<$Context['scalars']>>, @@ -364,7 +364,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - id: $$Utilities.ClientTransports.PreflightCheck< + id: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.id<$Context['scalars']>>, @@ -381,7 +381,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - idNonNull: $$Utilities.ClientTransports.PreflightCheck< + idNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.idNonNull<$Context['scalars']>>, @@ -398,7 +398,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interface: $$Utilities.ClientTransports.PreflightCheck< + interface: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.$interface<$Context['scalars']>>, @@ -415,7 +415,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceHierarchyChildA: $$Utilities.ClientTransports.PreflightCheck< + interfaceHierarchyChildA: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -435,7 +435,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceHierarchyChildB: $$Utilities.ClientTransports.PreflightCheck< + interfaceHierarchyChildB: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -455,7 +455,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceHierarchyGrandparents: $$Utilities.ClientTransports.PreflightCheck< + interfaceHierarchyGrandparents: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -475,7 +475,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceHierarchyParents: $$Utilities.ClientTransports.PreflightCheck< + interfaceHierarchyParents: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -495,7 +495,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceNonNull: $$Utilities.ClientTransports.PreflightCheck< + interfaceNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.interfaceNonNull<$Context['scalars']>>, @@ -512,7 +512,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - interfaceWithArgs: $$Utilities.ClientTransports.PreflightCheck< + interfaceWithArgs: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.interfaceWithArgs<$Context['scalars']>>, @@ -529,7 +529,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - listInt: $$Utilities.ClientTransports.PreflightCheck< + listInt: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.listInt<$Context['scalars']>>, @@ -546,7 +546,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - listIntNonNull: $$Utilities.ClientTransports.PreflightCheck< + listIntNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.listIntNonNull<$Context['scalars']>>, @@ -563,7 +563,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - listListInt: $$Utilities.ClientTransports.PreflightCheck< + listListInt: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.listListInt<$Context['scalars']>>, @@ -580,7 +580,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - listListIntNonNull: $$Utilities.ClientTransports.PreflightCheck< + listListIntNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.listListIntNonNull<$Context['scalars']>>, @@ -597,7 +597,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - lowerCaseUnion: $$Utilities.ClientTransports.PreflightCheck< + lowerCaseUnion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.lowerCaseUnion<$Context['scalars']>>, @@ -614,7 +614,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - object: $$Utilities.ClientTransports.PreflightCheck< + object: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.$object<$Context['scalars']>>, @@ -631,7 +631,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - objectList: $$Utilities.ClientTransports.PreflightCheck< + objectList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.objectList<$Context['scalars']>>, @@ -648,7 +648,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - objectListNonNull: $$Utilities.ClientTransports.PreflightCheck< + objectListNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.objectListNonNull<$Context['scalars']>>, @@ -665,7 +665,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - objectNested: $$Utilities.ClientTransports.PreflightCheck< + objectNested: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.objectNested<$Context['scalars']>>, @@ -682,7 +682,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - objectNonNull: $$Utilities.ClientTransports.PreflightCheck< + objectNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.objectNonNull<$Context['scalars']>>, @@ -699,7 +699,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - objectWithArgs: $$Utilities.ClientTransports.PreflightCheck< + objectWithArgs: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.objectWithArgs<$Context['scalars']>>, @@ -716,7 +716,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - result: $$Utilities.ClientTransports.PreflightCheck< + result: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.result<$Context['scalars']>>, @@ -733,7 +733,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - resultNonNull: $$Utilities.ClientTransports.PreflightCheck< + resultNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.resultNonNull<$Context['scalars']>>, @@ -750,7 +750,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - string: $$Utilities.ClientTransports.PreflightCheck< + string: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.$string<$Context['scalars']>>, @@ -767,7 +767,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithArgEnum: $$Utilities.ClientTransports.PreflightCheck< + stringWithArgEnum: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.stringWithArgEnum<$Context['scalars']>>, @@ -784,7 +784,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithArgInputObject: $$Utilities.ClientTransports.PreflightCheck< + stringWithArgInputObject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact< @@ -804,7 +804,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithArgInputObjectEnum: $$Utilities.ClientTransports.PreflightCheck< + stringWithArgInputObjectEnum: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -824,7 +824,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithArgInputObjectRequired: $$Utilities.ClientTransports.PreflightCheck< + stringWithArgInputObjectRequired: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -846,7 +846,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * The given arguments are reflected back as a JSON string. */ - stringWithArgs: $$Utilities.ClientTransports.PreflightCheck< + stringWithArgs: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.stringWithArgs<$Context['scalars']>>, @@ -863,7 +863,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithListArg: $$Utilities.ClientTransports.PreflightCheck< + stringWithListArg: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.stringWithListArg<$Context['scalars']>>, @@ -880,7 +880,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithListArgRequired: $$Utilities.ClientTransports.PreflightCheck< + stringWithListArgRequired: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -900,7 +900,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - stringWithRequiredArg: $$Utilities.ClientTransports.PreflightCheck< + stringWithRequiredArg: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.stringWithRequiredArg<$Context['scalars']>>, @@ -917,7 +917,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - unionFooBar: $$Utilities.ClientTransports.PreflightCheck< + unionFooBar: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.unionFooBar<$Context['scalars']>>, @@ -934,7 +934,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - unionFooBarNonNull: $$Utilities.ClientTransports.PreflightCheck< + unionFooBarNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.unionFooBarNonNull<$Context['scalars']>>, @@ -951,7 +951,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - unionFooBarWithArgs: $$Utilities.ClientTransports.PreflightCheck< + unionFooBarWithArgs: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.unionFooBarWithArgs<$Context['scalars']>>, @@ -968,7 +968,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - unionObject: $$Utilities.ClientTransports.PreflightCheck< + unionObject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.unionObject<$Context['scalars']>>, @@ -985,7 +985,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - unionObjectNonNull: $$Utilities.ClientTransports.PreflightCheck< + unionObjectNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.unionObjectNonNull<$Context['scalars']>>, @@ -1004,7 +1004,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { } export interface MutationMethods<$Context extends $$Utilities.Context> { - $batch: $$Utilities.ClientTransports.PreflightCheck< + $batch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation<$Context['scalars']>>, @@ -1019,7 +1019,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > > - __typename: $$Utilities.ClientTransports.PreflightCheck< + __typename: $$Utilities.ContextTransports.PreflightCheck< $Context, () => Promise< & (null | {}) @@ -1031,7 +1031,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > - id: $$Utilities.ClientTransports.PreflightCheck< + id: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.id<$Context['scalars']>>, @@ -1048,7 +1048,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > - idNonNull: $$Utilities.ClientTransports.PreflightCheck< + idNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.idNonNull<$Context['scalars']>>, diff --git a/tests/_/schemas/mutation-only/graffle/modules/client.ts b/tests/_/schemas/mutation-only/graffle/modules/client.ts index a5402a554..917e953c2 100644 --- a/tests/_/schemas/mutation-only/graffle/modules/client.ts +++ b/tests/_/schemas/mutation-only/graffle/modules/client.ts @@ -5,8 +5,8 @@ import * as $$Data from './data.js' import * as $$Scalar from './scalar.js' import * as $$SchemaDrivenDataMap from './schema-driven-data-map.js' -const context = $$Utilities.useReducer( - $$Utilities.useReducer( +const context = $$Utilities.contextFragmentExtensionsAdd( + $$Utilities.contextFragmentExtensionsAdd( { ...$$Utilities.Context.States.empty, name: $$Data.Name, diff --git a/tests/_/schemas/mutation-only/graffle/modules/methods-root.ts b/tests/_/schemas/mutation-only/graffle/modules/methods-root.ts index 3a3e4037c..2ba807436 100644 --- a/tests/_/schemas/mutation-only/graffle/modules/methods-root.ts +++ b/tests/_/schemas/mutation-only/graffle/modules/methods-root.ts @@ -3,7 +3,7 @@ import * as $$Schema from './schema.js' import * as $$SelectionSets from './selection-sets.js' export interface MutationMethods<$Context extends $$Utilities.Context> { - $batch: $$Utilities.ClientTransports.PreflightCheck< + $batch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation<$Context['scalars']>>, @@ -18,7 +18,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > > - __typename: $$Utilities.ClientTransports.PreflightCheck< + __typename: $$Utilities.ContextTransports.PreflightCheck< $Context, () => Promise< & (null | {}) @@ -30,7 +30,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > - id: $$Utilities.ClientTransports.PreflightCheck< + id: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.id<$Context['scalars']>>, @@ -47,7 +47,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > - idNonNull: $$Utilities.ClientTransports.PreflightCheck< + idNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.idNonNull<$Context['scalars']>>, diff --git a/tests/_/schemas/pokemon/graffle/modules/client.ts b/tests/_/schemas/pokemon/graffle/modules/client.ts index a5402a554..917e953c2 100644 --- a/tests/_/schemas/pokemon/graffle/modules/client.ts +++ b/tests/_/schemas/pokemon/graffle/modules/client.ts @@ -5,8 +5,8 @@ import * as $$Data from './data.js' import * as $$Scalar from './scalar.js' import * as $$SchemaDrivenDataMap from './schema-driven-data-map.js' -const context = $$Utilities.useReducer( - $$Utilities.useReducer( +const context = $$Utilities.contextFragmentExtensionsAdd( + $$Utilities.contextFragmentExtensionsAdd( { ...$$Utilities.Context.States.empty, name: $$Data.Name, diff --git a/tests/_/schemas/pokemon/graffle/modules/methods-root.ts b/tests/_/schemas/pokemon/graffle/modules/methods-root.ts index 142afe886..8dea430ff 100644 --- a/tests/_/schemas/pokemon/graffle/modules/methods-root.ts +++ b/tests/_/schemas/pokemon/graffle/modules/methods-root.ts @@ -3,7 +3,7 @@ import * as $$Schema from './schema.js' import * as $$SelectionSets from './selection-sets.js' export interface QueryMethods<$Context extends $$Utilities.Context> { - $batch: $$Utilities.ClientTransports.PreflightCheck< + $batch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query<$Context['scalars']>>, @@ -18,7 +18,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > > - __typename: $$Utilities.ClientTransports.PreflightCheck< + __typename: $$Utilities.ContextTransports.PreflightCheck< $Context, () => Promise< & (null | {}) @@ -30,7 +30,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - battles: $$Utilities.ClientTransports.PreflightCheck< + battles: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.battles<$Context['scalars']>>, @@ -47,7 +47,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - beings: $$Utilities.ClientTransports.PreflightCheck< + beings: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.beings<$Context['scalars']>>, @@ -64,7 +64,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - pokemonByName: $$Utilities.ClientTransports.PreflightCheck< + pokemonByName: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.pokemonByName<$Context['scalars']>>, @@ -81,7 +81,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - pokemons: $$Utilities.ClientTransports.PreflightCheck< + pokemons: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.pokemons<$Context['scalars']>>, @@ -98,7 +98,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - trainerByName: $$Utilities.ClientTransports.PreflightCheck< + trainerByName: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.trainerByName<$Context['scalars']>>, @@ -115,7 +115,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - trainers: $$Utilities.ClientTransports.PreflightCheck< + trainers: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.trainers<$Context['scalars']>>, @@ -134,7 +134,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { } export interface MutationMethods<$Context extends $$Utilities.Context> { - $batch: $$Utilities.ClientTransports.PreflightCheck< + $batch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation<$Context['scalars']>>, @@ -149,7 +149,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > > - __typename: $$Utilities.ClientTransports.PreflightCheck< + __typename: $$Utilities.ContextTransports.PreflightCheck< $Context, () => Promise< & (null | {}) @@ -161,7 +161,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > - addPokemon: $$Utilities.ClientTransports.PreflightCheck< + addPokemon: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.addPokemon<$Context['scalars']>>, diff --git a/tests/_/schemas/query-only/graffle/modules/client.ts b/tests/_/schemas/query-only/graffle/modules/client.ts index a5402a554..917e953c2 100644 --- a/tests/_/schemas/query-only/graffle/modules/client.ts +++ b/tests/_/schemas/query-only/graffle/modules/client.ts @@ -5,8 +5,8 @@ import * as $$Data from './data.js' import * as $$Scalar from './scalar.js' import * as $$SchemaDrivenDataMap from './schema-driven-data-map.js' -const context = $$Utilities.useReducer( - $$Utilities.useReducer( +const context = $$Utilities.contextFragmentExtensionsAdd( + $$Utilities.contextFragmentExtensionsAdd( { ...$$Utilities.Context.States.empty, name: $$Data.Name, diff --git a/tests/_/schemas/query-only/graffle/modules/methods-root.ts b/tests/_/schemas/query-only/graffle/modules/methods-root.ts index 7da8c25ab..c736e73ba 100644 --- a/tests/_/schemas/query-only/graffle/modules/methods-root.ts +++ b/tests/_/schemas/query-only/graffle/modules/methods-root.ts @@ -3,7 +3,7 @@ import * as $$Schema from './schema.js' import * as $$SelectionSets from './selection-sets.js' export interface QueryMethods<$Context extends $$Utilities.Context> { - $batch: $$Utilities.ClientTransports.PreflightCheck< + $batch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query<$Context['scalars']>>, @@ -18,7 +18,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > > - __typename: $$Utilities.ClientTransports.PreflightCheck< + __typename: $$Utilities.ContextTransports.PreflightCheck< $Context, () => Promise< & (null | {}) @@ -30,7 +30,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - id: $$Utilities.ClientTransports.PreflightCheck< + id: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.id<$Context['scalars']>>, @@ -47,7 +47,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > - idNonNull: $$Utilities.ClientTransports.PreflightCheck< + idNonNull: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.idNonNull<$Context['scalars']>>, diff --git a/tests/e2e/github/graffle/modules/client.ts b/tests/e2e/github/graffle/modules/client.ts index 283978af0..c289b3f5d 100644 --- a/tests/e2e/github/graffle/modules/client.ts +++ b/tests/e2e/github/graffle/modules/client.ts @@ -5,8 +5,8 @@ import * as $$Data from './data.js' import * as $$Scalar from './scalar.js' import * as $$SchemaDrivenDataMap from './schema-driven-data-map.js' -const context = $$Utilities.useReducer( - $$Utilities.useReducer( +const context = $$Utilities.contextFragmentExtensionsAdd( + $$Utilities.contextFragmentExtensionsAdd( { ...$$Utilities.Context.States.empty, name: $$Data.Name, diff --git a/tests/e2e/github/graffle/modules/methods-root.ts b/tests/e2e/github/graffle/modules/methods-root.ts index daaa07e63..70028fdd8 100644 --- a/tests/e2e/github/graffle/modules/methods-root.ts +++ b/tests/e2e/github/graffle/modules/methods-root.ts @@ -3,7 +3,7 @@ import * as $$Schema from './schema.js' import * as $$SelectionSets from './selection-sets.js' export interface QueryMethods<$Context extends $$Utilities.Context> { - $batch: $$Utilities.ClientTransports.PreflightCheck< + $batch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query<$Context['scalars']>>, @@ -18,7 +18,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { > > > - __typename: $$Utilities.ClientTransports.PreflightCheck< + __typename: $$Utilities.ContextTransports.PreflightCheck< $Context, () => Promise< & (null | {}) @@ -32,7 +32,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up a code of conduct by its key */ - codeOfConduct: $$Utilities.ClientTransports.PreflightCheck< + codeOfConduct: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.codeOfConduct<$Context['scalars']>>, @@ -51,7 +51,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up a code of conduct by its key */ - codesOfConduct: $$Utilities.ClientTransports.PreflightCheck< + codesOfConduct: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.codesOfConduct<$Context['scalars']>>, @@ -70,7 +70,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up an enterprise by URL slug. */ - enterprise: $$Utilities.ClientTransports.PreflightCheck< + enterprise: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.enterprise<$Context['scalars']>>, @@ -89,7 +89,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up a pending enterprise administrator invitation by invitee, enterprise and role. */ - enterpriseAdministratorInvitation: $$Utilities.ClientTransports.PreflightCheck< + enterpriseAdministratorInvitation: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -111,7 +111,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up a pending enterprise administrator invitation by invitation token. */ - enterpriseAdministratorInvitationByToken: $$Utilities.ClientTransports.PreflightCheck< + enterpriseAdministratorInvitationByToken: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -133,7 +133,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up a pending enterprise unaffiliated member invitation by invitee and enterprise. */ - enterpriseMemberInvitation: $$Utilities.ClientTransports.PreflightCheck< + enterpriseMemberInvitation: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -155,7 +155,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up a pending enterprise unaffiliated member invitation by invitation token. */ - enterpriseMemberInvitationByToken: $$Utilities.ClientTransports.PreflightCheck< + enterpriseMemberInvitationByToken: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -177,7 +177,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * ID of the object. */ - id: $$Utilities.ClientTransports.PreflightCheck< + id: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet?: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.id<$Context['scalars']>>, @@ -196,7 +196,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up an open source license by its key */ - license: $$Utilities.ClientTransports.PreflightCheck< + license: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.license<$Context['scalars']>>, @@ -215,7 +215,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Return a list of known open source licenses */ - licenses: $$Utilities.ClientTransports.PreflightCheck< + licenses: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.licenses<$Context['scalars']>>, @@ -234,7 +234,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Get alphabetically sorted list of Marketplace categories */ - marketplaceCategories: $$Utilities.ClientTransports.PreflightCheck< + marketplaceCategories: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.marketplaceCategories<$Context['scalars']>>, @@ -253,7 +253,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up a Marketplace category by its slug. */ - marketplaceCategory: $$Utilities.ClientTransports.PreflightCheck< + marketplaceCategory: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.marketplaceCategory<$Context['scalars']>>, @@ -272,7 +272,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up a single Marketplace listing */ - marketplaceListing: $$Utilities.ClientTransports.PreflightCheck< + marketplaceListing: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.marketplaceListing<$Context['scalars']>>, @@ -291,7 +291,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up Marketplace listings */ - marketplaceListings: $$Utilities.ClientTransports.PreflightCheck< + marketplaceListings: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.marketplaceListings<$Context['scalars']>>, @@ -310,7 +310,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Return information about the GitHub instance */ - meta: $$Utilities.ClientTransports.PreflightCheck< + meta: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.meta<$Context['scalars']>>, @@ -329,7 +329,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Fetches an object given its ID. */ - node: $$Utilities.ClientTransports.PreflightCheck< + node: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.node<$Context['scalars']>>, @@ -348,7 +348,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Lookup nodes by a list of IDs. */ - nodes: $$Utilities.ClientTransports.PreflightCheck< + nodes: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.nodes<$Context['scalars']>>, @@ -367,7 +367,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Lookup a organization by login. */ - organization: $$Utilities.ClientTransports.PreflightCheck< + organization: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.organization<$Context['scalars']>>, @@ -386,7 +386,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * The client's rate limit information. */ - rateLimit: $$Utilities.ClientTransports.PreflightCheck< + rateLimit: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.rateLimit<$Context['scalars']>>, @@ -406,7 +406,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { * Workaround for re-exposing the root query object. (Refer to * https://github.com/facebook/relay/issues/112 for more information.) */ - relay: $$Utilities.ClientTransports.PreflightCheck< + relay: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.relay<$Context['scalars']>>, @@ -425,7 +425,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Lookup a given repository by the owner and repository name. */ - repository: $$Utilities.ClientTransports.PreflightCheck< + repository: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.repository<$Context['scalars']>>, @@ -444,7 +444,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Lookup a repository owner (ie. either a User or an Organization) by login. */ - repositoryOwner: $$Utilities.ClientTransports.PreflightCheck< + repositoryOwner: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.repositoryOwner<$Context['scalars']>>, @@ -463,7 +463,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Lookup resource by a URL. */ - resource: $$Utilities.ClientTransports.PreflightCheck< + resource: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.resource<$Context['scalars']>>, @@ -482,7 +482,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Perform a search across resources, returning a maximum of 1,000 results. */ - search: $$Utilities.ClientTransports.PreflightCheck< + search: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.search<$Context['scalars']>>, @@ -501,7 +501,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * GitHub Security Advisories */ - securityAdvisories: $$Utilities.ClientTransports.PreflightCheck< + securityAdvisories: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.securityAdvisories<$Context['scalars']>>, @@ -520,7 +520,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Fetch a Security Advisory by its GHSA ID */ - securityAdvisory: $$Utilities.ClientTransports.PreflightCheck< + securityAdvisory: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.securityAdvisory<$Context['scalars']>>, @@ -539,7 +539,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Software Vulnerabilities documented by GitHub Security Advisories */ - securityVulnerabilities: $$Utilities.ClientTransports.PreflightCheck< + securityVulnerabilities: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -561,7 +561,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Users and organizations who can be sponsored via GitHub Sponsors. */ - sponsorables: $$Utilities.ClientTransports.PreflightCheck< + sponsorables: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.sponsorables<$Context['scalars']>>, @@ -580,7 +580,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Look up a topic by name. */ - topic: $$Utilities.ClientTransports.PreflightCheck< + topic: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.topic<$Context['scalars']>>, @@ -599,7 +599,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * Lookup a user by login. */ - user: $$Utilities.ClientTransports.PreflightCheck< + user: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.user<$Context['scalars']>>, @@ -618,7 +618,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { /** * The currently authenticated user. */ - viewer: $$Utilities.ClientTransports.PreflightCheck< + viewer: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Query.viewer<$Context['scalars']>>, @@ -637,7 +637,7 @@ export interface QueryMethods<$Context extends $$Utilities.Context> { } export interface MutationMethods<$Context extends $$Utilities.Context> { - $batch: $$Utilities.ClientTransports.PreflightCheck< + $batch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation<$Context['scalars']>>, @@ -652,7 +652,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { > > > - __typename: $$Utilities.ClientTransports.PreflightCheck< + __typename: $$Utilities.ContextTransports.PreflightCheck< $Context, () => Promise< & (null | {}) @@ -666,7 +666,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Clear all of a customer's queued migrations */ - abortQueuedMigrations: $$Utilities.ClientTransports.PreflightCheck< + abortQueuedMigrations: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -688,7 +688,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Abort a repository migration queued or in progress. */ - abortRepositoryMigration: $$Utilities.ClientTransports.PreflightCheck< + abortRepositoryMigration: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -710,7 +710,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Accepts a pending invitation for a user to become an administrator of an enterprise. */ - acceptEnterpriseAdministratorInvitation: $$Utilities.ClientTransports.PreflightCheck< + acceptEnterpriseAdministratorInvitation: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -732,7 +732,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Accepts a pending invitation for a user to become an unaffiliated member of an enterprise. */ - acceptEnterpriseMemberInvitation: $$Utilities.ClientTransports.PreflightCheck< + acceptEnterpriseMemberInvitation: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -754,7 +754,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Applies a suggested topic to the repository. */ - acceptTopicSuggestion: $$Utilities.ClientTransports.PreflightCheck< + acceptTopicSuggestion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -776,7 +776,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Access user namespace repository for a temporary duration. */ - accessUserNamespaceRepository: $$Utilities.ClientTransports.PreflightCheck< + accessUserNamespaceRepository: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -798,7 +798,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds assignees to an assignable object. */ - addAssigneesToAssignable: $$Utilities.ClientTransports.PreflightCheck< + addAssigneesToAssignable: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -820,7 +820,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a comment to an Issue or Pull Request. */ - addComment: $$Utilities.ClientTransports.PreflightCheck< + addComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.addComment<$Context['scalars']>>, @@ -839,7 +839,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a comment to a Discussion, possibly as a reply to another comment. */ - addDiscussionComment: $$Utilities.ClientTransports.PreflightCheck< + addDiscussionComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -861,7 +861,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Vote for an option in a discussion poll. */ - addDiscussionPollVote: $$Utilities.ClientTransports.PreflightCheck< + addDiscussionPollVote: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -883,7 +883,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds enterprise members to an organization within the enterprise. */ - addEnterpriseOrganizationMember: $$Utilities.ClientTransports.PreflightCheck< + addEnterpriseOrganizationMember: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -905,7 +905,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a support entitlement to an enterprise member. */ - addEnterpriseSupportEntitlement: $$Utilities.ClientTransports.PreflightCheck< + addEnterpriseSupportEntitlement: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -927,7 +927,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds labels to a labelable object. */ - addLabelsToLabelable: $$Utilities.ClientTransports.PreflightCheck< + addLabelsToLabelable: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -949,7 +949,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a card to a ProjectColumn. Either `contentId` or `note` must be provided but **not** both. */ - addProjectCard: $$Utilities.ClientTransports.PreflightCheck< + addProjectCard: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.addProjectCard<$Context['scalars']>>, @@ -968,7 +968,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a column to a Project. */ - addProjectColumn: $$Utilities.ClientTransports.PreflightCheck< + addProjectColumn: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.addProjectColumn<$Context['scalars']>>, @@ -987,7 +987,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new draft issue and add it to a Project. */ - addProjectV2DraftIssue: $$Utilities.ClientTransports.PreflightCheck< + addProjectV2DraftIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1009,7 +1009,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Links an existing content instance to a Project. */ - addProjectV2ItemById: $$Utilities.ClientTransports.PreflightCheck< + addProjectV2ItemById: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1031,7 +1031,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a review to a Pull Request. */ - addPullRequestReview: $$Utilities.ClientTransports.PreflightCheck< + addPullRequestReview: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1053,7 +1053,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a comment to a review. */ - addPullRequestReviewComment: $$Utilities.ClientTransports.PreflightCheck< + addPullRequestReviewComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1075,7 +1075,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a new thread to a pending Pull Request Review. */ - addPullRequestReviewThread: $$Utilities.ClientTransports.PreflightCheck< + addPullRequestReviewThread: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1097,7 +1097,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a reply to an existing Pull Request Review Thread. */ - addPullRequestReviewThreadReply: $$Utilities.ClientTransports.PreflightCheck< + addPullRequestReviewThreadReply: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1119,7 +1119,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a reaction to a subject. */ - addReaction: $$Utilities.ClientTransports.PreflightCheck< + addReaction: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.addReaction<$Context['scalars']>>, @@ -1138,7 +1138,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a star to a Starrable. */ - addStar: $$Utilities.ClientTransports.PreflightCheck< + addStar: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.addStar<$Context['scalars']>>, @@ -1157,7 +1157,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a sub-issue to a given issue */ - addSubIssue: $$Utilities.ClientTransports.PreflightCheck< + addSubIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.addSubIssue<$Context['scalars']>>, @@ -1176,7 +1176,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Add an upvote to a discussion or discussion comment. */ - addUpvote: $$Utilities.ClientTransports.PreflightCheck< + addUpvote: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.addUpvote<$Context['scalars']>>, @@ -1195,7 +1195,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Adds a verifiable domain to an owning account. */ - addVerifiableDomain: $$Utilities.ClientTransports.PreflightCheck< + addVerifiableDomain: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.addVerifiableDomain<$Context['scalars']>>, @@ -1214,7 +1214,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Approve all pending deployments under one or more environments */ - approveDeployments: $$Utilities.ClientTransports.PreflightCheck< + approveDeployments: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.approveDeployments<$Context['scalars']>>, @@ -1233,7 +1233,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Approve a verifiable domain for notification delivery. */ - approveVerifiableDomain: $$Utilities.ClientTransports.PreflightCheck< + approveVerifiableDomain: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1255,7 +1255,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Archives a ProjectV2Item */ - archiveProjectV2Item: $$Utilities.ClientTransports.PreflightCheck< + archiveProjectV2Item: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1277,7 +1277,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Marks a repository as archived. */ - archiveRepository: $$Utilities.ClientTransports.PreflightCheck< + archiveRepository: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.archiveRepository<$Context['scalars']>>, @@ -1296,7 +1296,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Cancels a pending invitation for an administrator to join an enterprise. */ - cancelEnterpriseAdminInvitation: $$Utilities.ClientTransports.PreflightCheck< + cancelEnterpriseAdminInvitation: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1318,7 +1318,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Cancels a pending invitation for an unaffiliated member to join an enterprise. */ - cancelEnterpriseMemberInvitation: $$Utilities.ClientTransports.PreflightCheck< + cancelEnterpriseMemberInvitation: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1340,7 +1340,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Cancel an active sponsorship. */ - cancelSponsorship: $$Utilities.ClientTransports.PreflightCheck< + cancelSponsorship: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.cancelSponsorship<$Context['scalars']>>, @@ -1359,7 +1359,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update your status on GitHub. */ - changeUserStatus: $$Utilities.ClientTransports.PreflightCheck< + changeUserStatus: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.changeUserStatus<$Context['scalars']>>, @@ -1378,7 +1378,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Clears all labels from a labelable object. */ - clearLabelsFromLabelable: $$Utilities.ClientTransports.PreflightCheck< + clearLabelsFromLabelable: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1402,7 +1402,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { * only text, number, date, assignees, labels, single-select, iteration and * milestone fields are supported. */ - clearProjectV2ItemFieldValue: $$Utilities.ClientTransports.PreflightCheck< + clearProjectV2ItemFieldValue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1424,7 +1424,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new project by cloning configuration from an existing project. */ - cloneProject: $$Utilities.ClientTransports.PreflightCheck< + cloneProject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.cloneProject<$Context['scalars']>>, @@ -1443,7 +1443,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a new repository with the same files and directory structure as a template repository. */ - cloneTemplateRepository: $$Utilities.ClientTransports.PreflightCheck< + cloneTemplateRepository: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1465,7 +1465,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Close a discussion. */ - closeDiscussion: $$Utilities.ClientTransports.PreflightCheck< + closeDiscussion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.closeDiscussion<$Context['scalars']>>, @@ -1484,7 +1484,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Close an issue. */ - closeIssue: $$Utilities.ClientTransports.PreflightCheck< + closeIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.closeIssue<$Context['scalars']>>, @@ -1503,7 +1503,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Close a pull request. */ - closePullRequest: $$Utilities.ClientTransports.PreflightCheck< + closePullRequest: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.closePullRequest<$Context['scalars']>>, @@ -1522,7 +1522,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Convert a project note card to one associated with a newly created issue. */ - convertProjectCardNoteToIssue: $$Utilities.ClientTransports.PreflightCheck< + convertProjectCardNoteToIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1544,7 +1544,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Converts a projectV2 draft issue item to an issue. */ - convertProjectV2DraftIssueItemToIssue: $$Utilities.ClientTransports.PreflightCheck< + convertProjectV2DraftIssueItemToIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1566,7 +1566,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Converts a pull request to draft */ - convertPullRequestToDraft: $$Utilities.ClientTransports.PreflightCheck< + convertPullRequestToDraft: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1588,7 +1588,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Copy a project. */ - copyProjectV2: $$Utilities.ClientTransports.PreflightCheck< + copyProjectV2: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.copyProjectV2<$Context['scalars']>>, @@ -1607,7 +1607,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Invites a user to claim reattributable data */ - createAttributionInvitation: $$Utilities.ClientTransports.PreflightCheck< + createAttributionInvitation: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1629,7 +1629,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a new branch protection rule */ - createBranchProtectionRule: $$Utilities.ClientTransports.PreflightCheck< + createBranchProtectionRule: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1651,7 +1651,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a check run. */ - createCheckRun: $$Utilities.ClientTransports.PreflightCheck< + createCheckRun: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createCheckRun<$Context['scalars']>>, @@ -1670,7 +1670,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a check suite */ - createCheckSuite: $$Utilities.ClientTransports.PreflightCheck< + createCheckSuite: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createCheckSuite<$Context['scalars']>>, @@ -1730,7 +1730,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { * Commits made using this mutation are automatically signed by GitHub if * supported and will be marked as verified in the user interface. */ - createCommitOnBranch: $$Utilities.ClientTransports.PreflightCheck< + createCommitOnBranch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1752,7 +1752,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new deployment event. */ - createDeployment: $$Utilities.ClientTransports.PreflightCheck< + createDeployment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createDeployment<$Context['scalars']>>, @@ -1771,7 +1771,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a deployment status. */ - createDeploymentStatus: $$Utilities.ClientTransports.PreflightCheck< + createDeploymentStatus: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1793,7 +1793,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a discussion. */ - createDiscussion: $$Utilities.ClientTransports.PreflightCheck< + createDiscussion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createDiscussion<$Context['scalars']>>, @@ -1817,7 +1817,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { * of such an enterprise, and instead has SAML enabled for it individually, the * token will then require SAML authorization to continue working against that organization. */ - createEnterpriseOrganization: $$Utilities.ClientTransports.PreflightCheck< + createEnterpriseOrganization: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1839,7 +1839,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates an environment or simply returns it if already exists. */ - createEnvironment: $$Utilities.ClientTransports.PreflightCheck< + createEnvironment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createEnvironment<$Context['scalars']>>, @@ -1858,7 +1858,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new IP allow list entry. */ - createIpAllowListEntry: $$Utilities.ClientTransports.PreflightCheck< + createIpAllowListEntry: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1880,7 +1880,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new issue. */ - createIssue: $$Utilities.ClientTransports.PreflightCheck< + createIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createIssue<$Context['scalars']>>, @@ -1899,7 +1899,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new label. */ - createLabel: $$Utilities.ClientTransports.PreflightCheck< + createLabel: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createLabel<$Context['scalars']>>, @@ -1918,7 +1918,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a branch linked to an issue. */ - createLinkedBranch: $$Utilities.ClientTransports.PreflightCheck< + createLinkedBranch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createLinkedBranch<$Context['scalars']>>, @@ -1937,7 +1937,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a GitHub Enterprise Importer (GEI) migration source. */ - createMigrationSource: $$Utilities.ClientTransports.PreflightCheck< + createMigrationSource: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -1959,7 +1959,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new project. */ - createProject: $$Utilities.ClientTransports.PreflightCheck< + createProject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createProject<$Context['scalars']>>, @@ -1978,7 +1978,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new project. */ - createProjectV2: $$Utilities.ClientTransports.PreflightCheck< + createProjectV2: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createProjectV2<$Context['scalars']>>, @@ -1997,7 +1997,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a new project field. */ - createProjectV2Field: $$Utilities.ClientTransports.PreflightCheck< + createProjectV2Field: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2019,7 +2019,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a status update within a Project. */ - createProjectV2StatusUpdate: $$Utilities.ClientTransports.PreflightCheck< + createProjectV2StatusUpdate: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2041,7 +2041,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a new pull request */ - createPullRequest: $$Utilities.ClientTransports.PreflightCheck< + createPullRequest: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createPullRequest<$Context['scalars']>>, @@ -2060,7 +2060,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a new Git Ref. */ - createRef: $$Utilities.ClientTransports.PreflightCheck< + createRef: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createRef<$Context['scalars']>>, @@ -2079,7 +2079,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a new repository. */ - createRepository: $$Utilities.ClientTransports.PreflightCheck< + createRepository: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createRepository<$Context['scalars']>>, @@ -2098,7 +2098,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a repository ruleset */ - createRepositoryRuleset: $$Utilities.ClientTransports.PreflightCheck< + createRepositoryRuleset: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2120,7 +2120,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a GitHub Sponsors profile to allow others to sponsor you or your organization. */ - createSponsorsListing: $$Utilities.ClientTransports.PreflightCheck< + createSponsorsListing: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2142,7 +2142,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a new payment tier for your GitHub Sponsors profile. */ - createSponsorsTier: $$Utilities.ClientTransports.PreflightCheck< + createSponsorsTier: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createSponsorsTier<$Context['scalars']>>, @@ -2161,7 +2161,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Start a new sponsorship of a maintainer in GitHub Sponsors, or reactivate a past sponsorship. */ - createSponsorship: $$Utilities.ClientTransports.PreflightCheck< + createSponsorship: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createSponsorship<$Context['scalars']>>, @@ -2181,7 +2181,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { * Make many sponsorships for different sponsorable users or organizations at * once. Can only sponsor those who have a public GitHub Sponsors profile. */ - createSponsorships: $$Utilities.ClientTransports.PreflightCheck< + createSponsorships: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createSponsorships<$Context['scalars']>>, @@ -2200,7 +2200,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new team discussion. */ - createTeamDiscussion: $$Utilities.ClientTransports.PreflightCheck< + createTeamDiscussion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2222,7 +2222,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new team discussion comment. */ - createTeamDiscussionComment: $$Utilities.ClientTransports.PreflightCheck< + createTeamDiscussionComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2244,7 +2244,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new user list. */ - createUserList: $$Utilities.ClientTransports.PreflightCheck< + createUserList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.createUserList<$Context['scalars']>>, @@ -2263,7 +2263,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Rejects a suggested topic for the repository. */ - declineTopicSuggestion: $$Utilities.ClientTransports.PreflightCheck< + declineTopicSuggestion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2285,7 +2285,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Delete a branch protection rule */ - deleteBranchProtectionRule: $$Utilities.ClientTransports.PreflightCheck< + deleteBranchProtectionRule: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2307,7 +2307,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a deployment. */ - deleteDeployment: $$Utilities.ClientTransports.PreflightCheck< + deleteDeployment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteDeployment<$Context['scalars']>>, @@ -2326,7 +2326,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Delete a discussion and all of its replies. */ - deleteDiscussion: $$Utilities.ClientTransports.PreflightCheck< + deleteDiscussion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteDiscussion<$Context['scalars']>>, @@ -2345,7 +2345,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Delete a discussion comment. If it has replies, wipe it instead. */ - deleteDiscussionComment: $$Utilities.ClientTransports.PreflightCheck< + deleteDiscussionComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2367,7 +2367,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes an environment */ - deleteEnvironment: $$Utilities.ClientTransports.PreflightCheck< + deleteEnvironment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteEnvironment<$Context['scalars']>>, @@ -2386,7 +2386,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes an IP allow list entry. */ - deleteIpAllowListEntry: $$Utilities.ClientTransports.PreflightCheck< + deleteIpAllowListEntry: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2408,7 +2408,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes an Issue object. */ - deleteIssue: $$Utilities.ClientTransports.PreflightCheck< + deleteIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteIssue<$Context['scalars']>>, @@ -2427,7 +2427,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes an IssueComment object. */ - deleteIssueComment: $$Utilities.ClientTransports.PreflightCheck< + deleteIssueComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteIssueComment<$Context['scalars']>>, @@ -2446,7 +2446,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a label. */ - deleteLabel: $$Utilities.ClientTransports.PreflightCheck< + deleteLabel: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteLabel<$Context['scalars']>>, @@ -2465,7 +2465,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unlink a branch from an issue. */ - deleteLinkedBranch: $$Utilities.ClientTransports.PreflightCheck< + deleteLinkedBranch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteLinkedBranch<$Context['scalars']>>, @@ -2484,7 +2484,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Delete a package version. */ - deletePackageVersion: $$Utilities.ClientTransports.PreflightCheck< + deletePackageVersion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2506,7 +2506,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a project. */ - deleteProject: $$Utilities.ClientTransports.PreflightCheck< + deleteProject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteProject<$Context['scalars']>>, @@ -2525,7 +2525,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a project card. */ - deleteProjectCard: $$Utilities.ClientTransports.PreflightCheck< + deleteProjectCard: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteProjectCard<$Context['scalars']>>, @@ -2544,7 +2544,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a project column. */ - deleteProjectColumn: $$Utilities.ClientTransports.PreflightCheck< + deleteProjectColumn: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteProjectColumn<$Context['scalars']>>, @@ -2563,7 +2563,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Delete a project. */ - deleteProjectV2: $$Utilities.ClientTransports.PreflightCheck< + deleteProjectV2: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteProjectV2<$Context['scalars']>>, @@ -2582,7 +2582,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Delete a project field. */ - deleteProjectV2Field: $$Utilities.ClientTransports.PreflightCheck< + deleteProjectV2Field: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2604,7 +2604,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes an item from a Project. */ - deleteProjectV2Item: $$Utilities.ClientTransports.PreflightCheck< + deleteProjectV2Item: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteProjectV2Item<$Context['scalars']>>, @@ -2623,7 +2623,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a project status update. */ - deleteProjectV2StatusUpdate: $$Utilities.ClientTransports.PreflightCheck< + deleteProjectV2StatusUpdate: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2645,7 +2645,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a project workflow. */ - deleteProjectV2Workflow: $$Utilities.ClientTransports.PreflightCheck< + deleteProjectV2Workflow: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2667,7 +2667,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a pull request review. */ - deletePullRequestReview: $$Utilities.ClientTransports.PreflightCheck< + deletePullRequestReview: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2689,7 +2689,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a pull request review comment. */ - deletePullRequestReviewComment: $$Utilities.ClientTransports.PreflightCheck< + deletePullRequestReviewComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2711,7 +2711,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Delete a Git Ref. */ - deleteRef: $$Utilities.ClientTransports.PreflightCheck< + deleteRef: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteRef<$Context['scalars']>>, @@ -2730,7 +2730,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Delete a repository ruleset */ - deleteRepositoryRuleset: $$Utilities.ClientTransports.PreflightCheck< + deleteRepositoryRuleset: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2752,7 +2752,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a team discussion. */ - deleteTeamDiscussion: $$Utilities.ClientTransports.PreflightCheck< + deleteTeamDiscussion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2774,7 +2774,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a team discussion comment. */ - deleteTeamDiscussionComment: $$Utilities.ClientTransports.PreflightCheck< + deleteTeamDiscussionComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2796,7 +2796,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a user list. */ - deleteUserList: $$Utilities.ClientTransports.PreflightCheck< + deleteUserList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.deleteUserList<$Context['scalars']>>, @@ -2815,7 +2815,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a verifiable domain. */ - deleteVerifiableDomain: $$Utilities.ClientTransports.PreflightCheck< + deleteVerifiableDomain: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2837,7 +2837,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Remove a pull request from the merge queue. */ - dequeuePullRequest: $$Utilities.ClientTransports.PreflightCheck< + dequeuePullRequest: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.dequeuePullRequest<$Context['scalars']>>, @@ -2856,7 +2856,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Disable auto merge on the given pull request */ - disablePullRequestAutoMerge: $$Utilities.ClientTransports.PreflightCheck< + disablePullRequestAutoMerge: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2878,7 +2878,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Dismisses an approved or rejected pull request review. */ - dismissPullRequestReview: $$Utilities.ClientTransports.PreflightCheck< + dismissPullRequestReview: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2900,7 +2900,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Dismisses the Dependabot alert. */ - dismissRepositoryVulnerabilityAlert: $$Utilities.ClientTransports.PreflightCheck< + dismissRepositoryVulnerabilityAlert: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2922,7 +2922,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Enable the default auto-merge on a pull request. */ - enablePullRequestAutoMerge: $$Utilities.ClientTransports.PreflightCheck< + enablePullRequestAutoMerge: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -2944,7 +2944,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Add a pull request to the merge queue. */ - enqueuePullRequest: $$Utilities.ClientTransports.PreflightCheck< + enqueuePullRequest: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.enqueuePullRequest<$Context['scalars']>>, @@ -2963,7 +2963,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Follow an organization. */ - followOrganization: $$Utilities.ClientTransports.PreflightCheck< + followOrganization: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.followOrganization<$Context['scalars']>>, @@ -2982,7 +2982,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Follow a user. */ - followUser: $$Utilities.ClientTransports.PreflightCheck< + followUser: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.followUser<$Context['scalars']>>, @@ -3001,7 +3001,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Grant the migrator role to a user for all organizations under an enterprise account. */ - grantEnterpriseOrganizationsMigratorRole: $$Utilities.ClientTransports.PreflightCheck< + grantEnterpriseOrganizationsMigratorRole: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3023,7 +3023,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Grant the migrator role to a user or a team. */ - grantMigratorRole: $$Utilities.ClientTransports.PreflightCheck< + grantMigratorRole: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.grantMigratorRole<$Context['scalars']>>, @@ -3042,7 +3042,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a new project by importing columns and a list of issues/PRs. */ - importProject: $$Utilities.ClientTransports.PreflightCheck< + importProject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.importProject<$Context['scalars']>>, @@ -3061,7 +3061,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Invite someone to become an administrator of the enterprise. */ - inviteEnterpriseAdmin: $$Utilities.ClientTransports.PreflightCheck< + inviteEnterpriseAdmin: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3083,7 +3083,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Invite someone to become an unaffiliated member of the enterprise. */ - inviteEnterpriseMember: $$Utilities.ClientTransports.PreflightCheck< + inviteEnterpriseMember: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3105,7 +3105,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Links a project to a repository. */ - linkProjectV2ToRepository: $$Utilities.ClientTransports.PreflightCheck< + linkProjectV2ToRepository: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3127,7 +3127,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Links a project to a team. */ - linkProjectV2ToTeam: $$Utilities.ClientTransports.PreflightCheck< + linkProjectV2ToTeam: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.linkProjectV2ToTeam<$Context['scalars']>>, @@ -3146,7 +3146,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates a repository link for a project. */ - linkRepositoryToProject: $$Utilities.ClientTransports.PreflightCheck< + linkRepositoryToProject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3168,7 +3168,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Lock a lockable object */ - lockLockable: $$Utilities.ClientTransports.PreflightCheck< + lockLockable: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.lockLockable<$Context['scalars']>>, @@ -3187,7 +3187,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Mark a discussion comment as the chosen answer for discussions in an answerable category. */ - markDiscussionCommentAsAnswer: $$Utilities.ClientTransports.PreflightCheck< + markDiscussionCommentAsAnswer: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3209,7 +3209,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Mark a pull request file as viewed */ - markFileAsViewed: $$Utilities.ClientTransports.PreflightCheck< + markFileAsViewed: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.markFileAsViewed<$Context['scalars']>>, @@ -3228,7 +3228,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Mark a project as a template. Note that only projects which are owned by an Organization can be marked as a template. */ - markProjectV2AsTemplate: $$Utilities.ClientTransports.PreflightCheck< + markProjectV2AsTemplate: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3250,7 +3250,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Marks a pull request ready for review. */ - markPullRequestReadyForReview: $$Utilities.ClientTransports.PreflightCheck< + markPullRequestReadyForReview: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3272,7 +3272,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Merge a head into a branch. */ - mergeBranch: $$Utilities.ClientTransports.PreflightCheck< + mergeBranch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.mergeBranch<$Context['scalars']>>, @@ -3291,7 +3291,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Merge a pull request. */ - mergePullRequest: $$Utilities.ClientTransports.PreflightCheck< + mergePullRequest: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.mergePullRequest<$Context['scalars']>>, @@ -3310,7 +3310,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Minimizes a comment on an Issue, Commit, Pull Request, or Gist */ - minimizeComment: $$Utilities.ClientTransports.PreflightCheck< + minimizeComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.minimizeComment<$Context['scalars']>>, @@ -3329,7 +3329,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Moves a project card to another place. */ - moveProjectCard: $$Utilities.ClientTransports.PreflightCheck< + moveProjectCard: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.moveProjectCard<$Context['scalars']>>, @@ -3348,7 +3348,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Moves a project column to another place. */ - moveProjectColumn: $$Utilities.ClientTransports.PreflightCheck< + moveProjectColumn: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.moveProjectColumn<$Context['scalars']>>, @@ -3367,7 +3367,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Pin an environment to a repository */ - pinEnvironment: $$Utilities.ClientTransports.PreflightCheck< + pinEnvironment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.pinEnvironment<$Context['scalars']>>, @@ -3386,7 +3386,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Pin an issue to a repository */ - pinIssue: $$Utilities.ClientTransports.PreflightCheck< + pinIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.pinIssue<$Context['scalars']>>, @@ -3405,7 +3405,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Publish an existing sponsorship tier that is currently still a draft to a GitHub Sponsors profile. */ - publishSponsorsTier: $$Utilities.ClientTransports.PreflightCheck< + publishSponsorsTier: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.publishSponsorsTier<$Context['scalars']>>, @@ -3424,7 +3424,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Regenerates the identity provider recovery codes for an enterprise */ - regenerateEnterpriseIdentityProviderRecoveryCodes: $$Utilities.ClientTransports.PreflightCheck< + regenerateEnterpriseIdentityProviderRecoveryCodes: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3446,7 +3446,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Regenerates a verifiable domain's verification token. */ - regenerateVerifiableDomainToken: $$Utilities.ClientTransports.PreflightCheck< + regenerateVerifiableDomainToken: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3468,7 +3468,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Reject all pending deployments under one or more environments */ - rejectDeployments: $$Utilities.ClientTransports.PreflightCheck< + rejectDeployments: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.rejectDeployments<$Context['scalars']>>, @@ -3487,7 +3487,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Removes assignees from an assignable object. */ - removeAssigneesFromAssignable: $$Utilities.ClientTransports.PreflightCheck< + removeAssigneesFromAssignable: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3509,7 +3509,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Removes an administrator from the enterprise. */ - removeEnterpriseAdmin: $$Utilities.ClientTransports.PreflightCheck< + removeEnterpriseAdmin: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3532,7 +3532,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { * Removes the identity provider from an enterprise. Owners of enterprises both * with and without Enterprise Managed Users may use this mutation. */ - removeEnterpriseIdentityProvider: $$Utilities.ClientTransports.PreflightCheck< + removeEnterpriseIdentityProvider: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3554,7 +3554,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Removes a user from all organizations within the enterprise */ - removeEnterpriseMember: $$Utilities.ClientTransports.PreflightCheck< + removeEnterpriseMember: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3576,7 +3576,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Removes an organization from the enterprise */ - removeEnterpriseOrganization: $$Utilities.ClientTransports.PreflightCheck< + removeEnterpriseOrganization: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3598,7 +3598,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Removes a support entitlement from an enterprise member. */ - removeEnterpriseSupportEntitlement: $$Utilities.ClientTransports.PreflightCheck< + removeEnterpriseSupportEntitlement: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3620,7 +3620,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Removes labels from a Labelable object. */ - removeLabelsFromLabelable: $$Utilities.ClientTransports.PreflightCheck< + removeLabelsFromLabelable: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3642,7 +3642,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Removes outside collaborator from all repositories in an organization. */ - removeOutsideCollaborator: $$Utilities.ClientTransports.PreflightCheck< + removeOutsideCollaborator: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3664,7 +3664,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Removes a reaction from a subject. */ - removeReaction: $$Utilities.ClientTransports.PreflightCheck< + removeReaction: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.removeReaction<$Context['scalars']>>, @@ -3683,7 +3683,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Removes a star from a Starrable. */ - removeStar: $$Utilities.ClientTransports.PreflightCheck< + removeStar: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.removeStar<$Context['scalars']>>, @@ -3702,7 +3702,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Removes a sub-issue from a given issue */ - removeSubIssue: $$Utilities.ClientTransports.PreflightCheck< + removeSubIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.removeSubIssue<$Context['scalars']>>, @@ -3721,7 +3721,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Remove an upvote to a discussion or discussion comment. */ - removeUpvote: $$Utilities.ClientTransports.PreflightCheck< + removeUpvote: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.removeUpvote<$Context['scalars']>>, @@ -3740,7 +3740,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Reopen a discussion. */ - reopenDiscussion: $$Utilities.ClientTransports.PreflightCheck< + reopenDiscussion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.reopenDiscussion<$Context['scalars']>>, @@ -3759,7 +3759,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Reopen a issue. */ - reopenIssue: $$Utilities.ClientTransports.PreflightCheck< + reopenIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.reopenIssue<$Context['scalars']>>, @@ -3778,7 +3778,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Reopen a pull request. */ - reopenPullRequest: $$Utilities.ClientTransports.PreflightCheck< + reopenPullRequest: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.reopenPullRequest<$Context['scalars']>>, @@ -3797,7 +3797,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Reorder a pinned repository environment */ - reorderEnvironment: $$Utilities.ClientTransports.PreflightCheck< + reorderEnvironment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.reorderEnvironment<$Context['scalars']>>, @@ -3816,7 +3816,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Reprioritizes a sub-issue to a different position in the parent list. */ - reprioritizeSubIssue: $$Utilities.ClientTransports.PreflightCheck< + reprioritizeSubIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3838,7 +3838,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Set review requests on a pull request. */ - requestReviews: $$Utilities.ClientTransports.PreflightCheck< + requestReviews: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.requestReviews<$Context['scalars']>>, @@ -3857,7 +3857,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Rerequests an existing check suite. */ - rerequestCheckSuite: $$Utilities.ClientTransports.PreflightCheck< + rerequestCheckSuite: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.rerequestCheckSuite<$Context['scalars']>>, @@ -3876,7 +3876,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Marks a review thread as resolved. */ - resolveReviewThread: $$Utilities.ClientTransports.PreflightCheck< + resolveReviewThread: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.resolveReviewThread<$Context['scalars']>>, @@ -3895,7 +3895,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Retire a published payment tier from your GitHub Sponsors profile so it cannot be used to start new sponsorships. */ - retireSponsorsTier: $$Utilities.ClientTransports.PreflightCheck< + retireSponsorsTier: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.retireSponsorsTier<$Context['scalars']>>, @@ -3914,7 +3914,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Create a pull request that reverts the changes from a merged pull request. */ - revertPullRequest: $$Utilities.ClientTransports.PreflightCheck< + revertPullRequest: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.revertPullRequest<$Context['scalars']>>, @@ -3933,7 +3933,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Revoke the migrator role to a user for all organizations under an enterprise account. */ - revokeEnterpriseOrganizationsMigratorRole: $$Utilities.ClientTransports.PreflightCheck< + revokeEnterpriseOrganizationsMigratorRole: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3955,7 +3955,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Revoke the migrator role from a user or a team. */ - revokeMigratorRole: $$Utilities.ClientTransports.PreflightCheck< + revokeMigratorRole: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.revokeMigratorRole<$Context['scalars']>>, @@ -3974,7 +3974,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Creates or updates the identity provider for an enterprise. */ - setEnterpriseIdentityProvider: $$Utilities.ClientTransports.PreflightCheck< + setEnterpriseIdentityProvider: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -3996,7 +3996,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Set an organization level interaction limit for an organization's public repositories. */ - setOrganizationInteractionLimit: $$Utilities.ClientTransports.PreflightCheck< + setOrganizationInteractionLimit: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4018,7 +4018,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets an interaction limit setting for a repository. */ - setRepositoryInteractionLimit: $$Utilities.ClientTransports.PreflightCheck< + setRepositoryInteractionLimit: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4040,7 +4040,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Set a user level interaction limit for an user's public repositories. */ - setUserInteractionLimit: $$Utilities.ClientTransports.PreflightCheck< + setUserInteractionLimit: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4062,7 +4062,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Starts a GitHub Enterprise Importer organization migration. */ - startOrganizationMigration: $$Utilities.ClientTransports.PreflightCheck< + startOrganizationMigration: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4084,7 +4084,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Starts a GitHub Enterprise Importer (GEI) repository migration. */ - startRepositoryMigration: $$Utilities.ClientTransports.PreflightCheck< + startRepositoryMigration: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4106,7 +4106,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Submits a pending pull request review. */ - submitPullRequestReview: $$Utilities.ClientTransports.PreflightCheck< + submitPullRequestReview: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4128,7 +4128,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Transfer an organization from one enterprise to another enterprise. */ - transferEnterpriseOrganization: $$Utilities.ClientTransports.PreflightCheck< + transferEnterpriseOrganization: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4150,7 +4150,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Transfer an issue to a different repository */ - transferIssue: $$Utilities.ClientTransports.PreflightCheck< + transferIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.transferIssue<$Context['scalars']>>, @@ -4169,7 +4169,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unarchives a ProjectV2Item */ - unarchiveProjectV2Item: $$Utilities.ClientTransports.PreflightCheck< + unarchiveProjectV2Item: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4191,7 +4191,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unarchives a repository. */ - unarchiveRepository: $$Utilities.ClientTransports.PreflightCheck< + unarchiveRepository: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.unarchiveRepository<$Context['scalars']>>, @@ -4210,7 +4210,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unfollow an organization. */ - unfollowOrganization: $$Utilities.ClientTransports.PreflightCheck< + unfollowOrganization: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4232,7 +4232,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unfollow a user. */ - unfollowUser: $$Utilities.ClientTransports.PreflightCheck< + unfollowUser: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.unfollowUser<$Context['scalars']>>, @@ -4251,7 +4251,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unlinks a project from a repository. */ - unlinkProjectV2FromRepository: $$Utilities.ClientTransports.PreflightCheck< + unlinkProjectV2FromRepository: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4273,7 +4273,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unlinks a project to a team. */ - unlinkProjectV2FromTeam: $$Utilities.ClientTransports.PreflightCheck< + unlinkProjectV2FromTeam: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4295,7 +4295,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Deletes a repository link from a project. */ - unlinkRepositoryFromProject: $$Utilities.ClientTransports.PreflightCheck< + unlinkRepositoryFromProject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4317,7 +4317,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unlock a lockable object */ - unlockLockable: $$Utilities.ClientTransports.PreflightCheck< + unlockLockable: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.unlockLockable<$Context['scalars']>>, @@ -4336,7 +4336,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unmark a discussion comment as the chosen answer for discussions in an answerable category. */ - unmarkDiscussionCommentAsAnswer: $$Utilities.ClientTransports.PreflightCheck< + unmarkDiscussionCommentAsAnswer: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4358,7 +4358,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unmark a pull request file as viewed */ - unmarkFileAsViewed: $$Utilities.ClientTransports.PreflightCheck< + unmarkFileAsViewed: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.unmarkFileAsViewed<$Context['scalars']>>, @@ -4377,7 +4377,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unmark an issue as a duplicate of another issue. */ - unmarkIssueAsDuplicate: $$Utilities.ClientTransports.PreflightCheck< + unmarkIssueAsDuplicate: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4399,7 +4399,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unmark a project as a template. */ - unmarkProjectV2AsTemplate: $$Utilities.ClientTransports.PreflightCheck< + unmarkProjectV2AsTemplate: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4421,7 +4421,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unminimizes a comment on an Issue, Commit, Pull Request, or Gist */ - unminimizeComment: $$Utilities.ClientTransports.PreflightCheck< + unminimizeComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.unminimizeComment<$Context['scalars']>>, @@ -4440,7 +4440,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Unpin a pinned issue from a repository */ - unpinIssue: $$Utilities.ClientTransports.PreflightCheck< + unpinIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.unpinIssue<$Context['scalars']>>, @@ -4459,7 +4459,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Marks a review thread as unresolved. */ - unresolveReviewThread: $$Utilities.ClientTransports.PreflightCheck< + unresolveReviewThread: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4481,7 +4481,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update a branch protection rule */ - updateBranchProtectionRule: $$Utilities.ClientTransports.PreflightCheck< + updateBranchProtectionRule: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4503,7 +4503,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update a check run */ - updateCheckRun: $$Utilities.ClientTransports.PreflightCheck< + updateCheckRun: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateCheckRun<$Context['scalars']>>, @@ -4522,7 +4522,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Modifies the settings of an existing check suite */ - updateCheckSuitePreferences: $$Utilities.ClientTransports.PreflightCheck< + updateCheckSuitePreferences: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4544,7 +4544,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update a discussion */ - updateDiscussion: $$Utilities.ClientTransports.PreflightCheck< + updateDiscussion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateDiscussion<$Context['scalars']>>, @@ -4563,7 +4563,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update the contents of a comment on a Discussion */ - updateDiscussionComment: $$Utilities.ClientTransports.PreflightCheck< + updateDiscussionComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4585,7 +4585,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates the role of an enterprise administrator. */ - updateEnterpriseAdministratorRole: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseAdministratorRole: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4607,7 +4607,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether private repository forks are enabled for an enterprise. */ - updateEnterpriseAllowPrivateRepositoryForkingSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseAllowPrivateRepositoryForkingSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4629,7 +4629,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets the base repository permission for organizations in an enterprise. */ - updateEnterpriseDefaultRepositoryPermissionSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseDefaultRepositoryPermissionSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4651,7 +4651,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether deploy keys are allowed to be created and used for an enterprise. */ - updateEnterpriseDeployKeySetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseDeployKeySetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4673,7 +4673,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether organization members with admin permissions on a repository can change repository visibility. */ - updateEnterpriseMembersCanChangeRepositoryVisibilitySetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseMembersCanChangeRepositoryVisibilitySetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4695,7 +4695,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets the members can create repositories setting for an enterprise. */ - updateEnterpriseMembersCanCreateRepositoriesSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseMembersCanCreateRepositoriesSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4717,7 +4717,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets the members can delete issues setting for an enterprise. */ - updateEnterpriseMembersCanDeleteIssuesSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseMembersCanDeleteIssuesSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4739,7 +4739,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets the members can delete repositories setting for an enterprise. */ - updateEnterpriseMembersCanDeleteRepositoriesSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseMembersCanDeleteRepositoriesSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4761,7 +4761,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether members can invite collaborators are enabled for an enterprise. */ - updateEnterpriseMembersCanInviteCollaboratorsSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseMembersCanInviteCollaboratorsSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4783,7 +4783,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether or not an organization owner can make purchases. */ - updateEnterpriseMembersCanMakePurchasesSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseMembersCanMakePurchasesSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4805,7 +4805,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets the members can update protected branches setting for an enterprise. */ - updateEnterpriseMembersCanUpdateProtectedBranchesSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseMembersCanUpdateProtectedBranchesSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4827,7 +4827,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets the members can view dependency insights for an enterprise. */ - updateEnterpriseMembersCanViewDependencyInsightsSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseMembersCanViewDependencyInsightsSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4849,7 +4849,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether organization projects are enabled for an enterprise. */ - updateEnterpriseOrganizationProjectsSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseOrganizationProjectsSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4871,7 +4871,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates the role of an enterprise owner with an organization. */ - updateEnterpriseOwnerOrganizationRole: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseOwnerOrganizationRole: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4893,7 +4893,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates an enterprise's profile. */ - updateEnterpriseProfile: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseProfile: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4915,7 +4915,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether repository projects are enabled for a enterprise. */ - updateEnterpriseRepositoryProjectsSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseRepositoryProjectsSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4937,7 +4937,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether team discussions are enabled for an enterprise. */ - updateEnterpriseTeamDiscussionsSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseTeamDiscussionsSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4959,7 +4959,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets the two-factor authentication methods that users of an enterprise may not use. */ - updateEnterpriseTwoFactorAuthenticationDisallowedMethodsSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseTwoFactorAuthenticationDisallowedMethodsSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -4981,7 +4981,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether two factor authentication is required for all users in an enterprise. */ - updateEnterpriseTwoFactorAuthenticationRequiredSetting: $$Utilities.ClientTransports.PreflightCheck< + updateEnterpriseTwoFactorAuthenticationRequiredSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5003,7 +5003,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates an environment. */ - updateEnvironment: $$Utilities.ClientTransports.PreflightCheck< + updateEnvironment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateEnvironment<$Context['scalars']>>, @@ -5022,7 +5022,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether an IP allow list is enabled on an owner. */ - updateIpAllowListEnabledSetting: $$Utilities.ClientTransports.PreflightCheck< + updateIpAllowListEnabledSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5044,7 +5044,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates an IP allow list entry. */ - updateIpAllowListEntry: $$Utilities.ClientTransports.PreflightCheck< + updateIpAllowListEntry: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5066,7 +5066,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether IP allow list configuration for installed GitHub Apps is enabled on an owner. */ - updateIpAllowListForInstalledAppsEnabledSetting: $$Utilities.ClientTransports.PreflightCheck< + updateIpAllowListForInstalledAppsEnabledSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5088,7 +5088,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates an Issue. */ - updateIssue: $$Utilities.ClientTransports.PreflightCheck< + updateIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateIssue<$Context['scalars']>>, @@ -5107,7 +5107,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates an IssueComment object. */ - updateIssueComment: $$Utilities.ClientTransports.PreflightCheck< + updateIssueComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateIssueComment<$Context['scalars']>>, @@ -5126,7 +5126,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates an existing label. */ - updateLabel: $$Utilities.ClientTransports.PreflightCheck< + updateLabel: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateLabel<$Context['scalars']>>, @@ -5145,7 +5145,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update the setting to restrict notifications to only verified or approved domains available to an owner. */ - updateNotificationRestrictionSetting: $$Utilities.ClientTransports.PreflightCheck< + updateNotificationRestrictionSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5167,7 +5167,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether private repository forks are enabled for an organization. */ - updateOrganizationAllowPrivateRepositoryForkingSetting: $$Utilities.ClientTransports.PreflightCheck< + updateOrganizationAllowPrivateRepositoryForkingSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5189,7 +5189,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether contributors are required to sign off on web-based commits for repositories in an organization. */ - updateOrganizationWebCommitSignoffSetting: $$Utilities.ClientTransports.PreflightCheck< + updateOrganizationWebCommitSignoffSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5214,7 +5214,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { * Only applicable when you have a GitHub Sponsors profile and have connected * your GitHub account with Patreon. */ - updatePatreonSponsorability: $$Utilities.ClientTransports.PreflightCheck< + updatePatreonSponsorability: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5236,7 +5236,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates an existing project. */ - updateProject: $$Utilities.ClientTransports.PreflightCheck< + updateProject: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateProject<$Context['scalars']>>, @@ -5255,7 +5255,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates an existing project card. */ - updateProjectCard: $$Utilities.ClientTransports.PreflightCheck< + updateProjectCard: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateProjectCard<$Context['scalars']>>, @@ -5274,7 +5274,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates an existing project column. */ - updateProjectColumn: $$Utilities.ClientTransports.PreflightCheck< + updateProjectColumn: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateProjectColumn<$Context['scalars']>>, @@ -5293,7 +5293,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates an existing project. */ - updateProjectV2: $$Utilities.ClientTransports.PreflightCheck< + updateProjectV2: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateProjectV2<$Context['scalars']>>, @@ -5312,7 +5312,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update the collaborators on a team or a project */ - updateProjectV2Collaborators: $$Utilities.ClientTransports.PreflightCheck< + updateProjectV2Collaborators: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5334,7 +5334,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates a draft issue within a Project. */ - updateProjectV2DraftIssue: $$Utilities.ClientTransports.PreflightCheck< + updateProjectV2DraftIssue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5356,7 +5356,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update a project field. */ - updateProjectV2Field: $$Utilities.ClientTransports.PreflightCheck< + updateProjectV2Field: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5379,7 +5379,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { * This mutation updates the value of a field for an item in a Project. Currently * only single-select, text, number, date, and iteration fields are supported. */ - updateProjectV2ItemFieldValue: $$Utilities.ClientTransports.PreflightCheck< + updateProjectV2ItemFieldValue: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5401,7 +5401,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * This mutation updates the position of the item in the project, where the position represents the priority of an item. */ - updateProjectV2ItemPosition: $$Utilities.ClientTransports.PreflightCheck< + updateProjectV2ItemPosition: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5423,7 +5423,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates a status update within a Project. */ - updateProjectV2StatusUpdate: $$Utilities.ClientTransports.PreflightCheck< + updateProjectV2StatusUpdate: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5445,7 +5445,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update a pull request */ - updatePullRequest: $$Utilities.ClientTransports.PreflightCheck< + updatePullRequest: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updatePullRequest<$Context['scalars']>>, @@ -5464,7 +5464,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Merge or Rebase HEAD from upstream branch into pull request branch */ - updatePullRequestBranch: $$Utilities.ClientTransports.PreflightCheck< + updatePullRequestBranch: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5486,7 +5486,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates the body of a pull request review. */ - updatePullRequestReview: $$Utilities.ClientTransports.PreflightCheck< + updatePullRequestReview: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5508,7 +5508,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates a pull request review comment. */ - updatePullRequestReviewComment: $$Utilities.ClientTransports.PreflightCheck< + updatePullRequestReviewComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5530,7 +5530,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update a Git Ref. */ - updateRef: $$Utilities.ClientTransports.PreflightCheck< + updateRef: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateRef<$Context['scalars']>>, @@ -5566,7 +5566,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { * If `RefUpdate.force` is set to `true`, a non-fast-forward updates * for the given reference will be allowed. */ - updateRefs: $$Utilities.ClientTransports.PreflightCheck< + updateRefs: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateRefs<$Context['scalars']>>, @@ -5585,7 +5585,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update information about a repository. */ - updateRepository: $$Utilities.ClientTransports.PreflightCheck< + updateRepository: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateRepository<$Context['scalars']>>, @@ -5604,7 +5604,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update a repository ruleset */ - updateRepositoryRuleset: $$Utilities.ClientTransports.PreflightCheck< + updateRepositoryRuleset: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5626,7 +5626,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Sets whether contributors are required to sign off on web-based commits for a repository. */ - updateRepositoryWebCommitSignoffSetting: $$Utilities.ClientTransports.PreflightCheck< + updateRepositoryWebCommitSignoffSetting: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5648,7 +5648,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Change visibility of your sponsorship and opt in or out of email updates from the maintainer. */ - updateSponsorshipPreferences: $$Utilities.ClientTransports.PreflightCheck< + updateSponsorshipPreferences: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5670,7 +5670,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates the state for subscribable subjects. */ - updateSubscription: $$Utilities.ClientTransports.PreflightCheck< + updateSubscription: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateSubscription<$Context['scalars']>>, @@ -5689,7 +5689,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates a team discussion. */ - updateTeamDiscussion: $$Utilities.ClientTransports.PreflightCheck< + updateTeamDiscussion: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5711,7 +5711,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates a discussion comment. */ - updateTeamDiscussionComment: $$Utilities.ClientTransports.PreflightCheck< + updateTeamDiscussionComment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5733,7 +5733,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates team review assignment. */ - updateTeamReviewAssignment: $$Utilities.ClientTransports.PreflightCheck< + updateTeamReviewAssignment: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5755,7 +5755,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Update team repository. */ - updateTeamsRepository: $$Utilities.ClientTransports.PreflightCheck< + updateTeamsRepository: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5777,7 +5777,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Replaces the repository's topics with the given topics. */ - updateTopics: $$Utilities.ClientTransports.PreflightCheck< + updateTopics: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateTopics<$Context['scalars']>>, @@ -5796,7 +5796,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates an existing user list. */ - updateUserList: $$Utilities.ClientTransports.PreflightCheck< + updateUserList: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact<$SelectionSet, $$SelectionSets.Mutation.updateUserList<$Context['scalars']>>, @@ -5815,7 +5815,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Updates which of the viewer's lists an item belongs to */ - updateUserListsForItem: $$Utilities.ClientTransports.PreflightCheck< + updateUserListsForItem: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< @@ -5837,7 +5837,7 @@ export interface MutationMethods<$Context extends $$Utilities.Context> { /** * Verify that a verifiable domain has the expected DNS record. */ - verifyVerifiableDomain: $$Utilities.ClientTransports.PreflightCheck< + verifyVerifiableDomain: $$Utilities.ContextTransports.PreflightCheck< $Context, <$SelectionSet>( selectionSet: $$Utilities.Exact< diff --git a/tests/e2e/github/test.ts b/tests/e2e/github/test.ts index 6f3ba9587..39d1c05d8 100644 --- a/tests/e2e/github/test.ts +++ b/tests/e2e/github/test.ts @@ -8,7 +8,7 @@ import { Github } from './graffle/__.js' -const github = Github.create({ checkPreflight: false }) +const github = Github.create({ check: { preflight: false } }) const a = await github.query.__typename()