@btravstack/graphql-server 0.30.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,9 +6,34 @@ A GraphQL Yoga answerer for the protocol-neutral
6
6
  server dependency. `graphql(defineAuth(), { schema })` contributes a
7
7
  `HttpHandler` member. A request-scoped unit and the Node incoming request are
8
8
  available to resolvers.
9
+ Use `GraphqlModule` for a deployment root:
10
+
11
+ ```ts
12
+ import { GraphqlModule, graphql } from "@btravstack/graphql-server";
13
+ import { defineAuth } from "@btravstack/http-server";
14
+ import { createSchema } from "graphql-yoga";
15
+
16
+ const schema = createSchema({
17
+ typeDefs: "type Query { hello: String! }",
18
+ resolvers: { Query: { hello: () => "world" } },
19
+ });
20
+
21
+ export const GatewayApi = GraphqlModule("GatewayApi")({
22
+ answerer: graphql(defineAuth(), { schema }),
23
+ });
24
+ ```
25
+
26
+ The module composes the listener, authenticators and declared request modules.
27
+ It exports the runtime ports and available `Logger` / `HealthChecks` without
28
+ exposing business ports automatically. Its socket options are the HTTP
29
+ runtime's, excluding `cors` and `compression`. Set CORS on `graphql()`; the
30
+ answerer does not apply HTTP compression. Schema, authentication and Yoga
31
+ options stay on `graphql()`.
32
+
9
33
  Pass `units` with `unit` to check each injected port against the module the
10
- selected request kind actually forks. Pass the same `units` record to
11
- `httpServer({ unit: units })` so the runtime can apply unit test overrides.
34
+ selected request kind actually forks. `GraphqlModule` binds that record to
35
+ the runtime automatically; a manually composed root passes the same `units`
36
+ record to `httpServer({ unit: units })`.
12
37
  Yoga plugins and CORS policy are explicit
13
38
  options; the wildcard CORS default and Yoga console logging are disabled, and
14
39
  a masked defect is reported to `Observers` instead. GraphiQL,
package/dist/index.cjs CHANGED
@@ -5,6 +5,7 @@ let _btravstack_core = require("@btravstack/core");
5
5
  let _btravstack_di = require("@btravstack/di");
6
6
  let _btravstack_http_server_internal = require("@btravstack/http-server/internal");
7
7
  let unthrown = require("unthrown");
8
+ let _btravstack_http_server = require("@btravstack/http-server");
8
9
  //#region src/field.ts
9
10
  /**
10
11
  * A resolver's answer from a `Result`, so a modeled failure is never thrown by
@@ -158,8 +159,33 @@ const graphql = (api, options) => {
158
159
  }),
159
160
  onStop: (answerer) => answerer[dispose]()
160
161
  });
161
- return Object.assign(typed, { authenticators: api.providers });
162
+ return Object.assign(typed, {
163
+ authenticators: api.providers,
164
+ units: options.units
165
+ });
166
+ };
167
+ //#endregion
168
+ //#region src/graphql-module.ts
169
+ /** Declare a GraphQL HTTP application without repeating runtime or authenticator wiring. */
170
+ const GraphqlModule = (name) => (options) => {
171
+ const starter = (0, _btravstack_http_server.httpServer)({
172
+ ...options,
173
+ unit: options.answerer.units
174
+ });
175
+ const imports = [...options.imports ?? [], starter];
176
+ const provides = [
177
+ options.answerer,
178
+ ...options.answerer.authenticators,
179
+ ...options.provides ?? []
180
+ ];
181
+ return (0, _btravstack_di.Module)(name)({
182
+ imports,
183
+ provides,
184
+ exports: [...(0, _btravstack_http_server_internal.applicationExports)(imports, provides), ...options.exports ?? []],
185
+ needs: [...options.needs ?? [], _btravstack_config.Env]
186
+ });
162
187
  };
163
188
  //#endregion
189
+ exports.GraphqlModule = GraphqlModule;
164
190
  exports.fieldResult = fieldResult;
165
191
  exports.graphql = graphql;
package/dist/index.d.cts CHANGED
@@ -1,12 +1,13 @@
1
1
  import { GraphQLError, GraphQLSchema } from "graphql";
2
2
  import { AsyncResult, Result } from "unthrown";
3
3
  import { IncomingMessage } from "node:http";
4
- import { ConfigInvalid, EnvReading } from "@btravstack/config";
4
+ import { ConfigInvalid, Env, EnvReading } from "@btravstack/config";
5
5
  import { OneScheme, Requirements } from "@btravstack/contract";
6
6
  import { Observers } from "@btravstack/core";
7
- import { AnyPort, Provider, Scope } from "@btravstack/di";
8
- import { Authenticators, HttpAuth, HttpConfig, HttpHandler, HttpUnit, KindOf, Kinds, Principal, RequiresGate, SchemePortsOf, SchemesFrom, SchemesOf, UnitFor, UnitsNeedsOf, UnitsOf } from "@btravstack/http-server/internal";
7
+ import { AnyModule, AnyPort, AnyProvider, Exportable, Module, NeedsGate, Provider, Scope } from "@btravstack/di";
8
+ import { AnyUnitModule, Authenticators, CookieSchemes, HttpAuth, HttpConfig, HttpHandler, HttpServerEnv, HttpUnit, KindOf, Kinds, Principal, RequiresGate, SchemePortsOf, SchemesFrom, SchemesOf, UnitFor, UnitsNeedsOf, UnitsOf } from "@btravstack/http-server/internal";
9
9
  import { Plugin, YogaInitialContext, YogaServerOptions } from "graphql-yoga";
10
+ import { HttpConfig as HttpConfig$1, HttpHandler as HttpHandler$1, HttpOptions, HttpRuntime } from "@btravstack/http-server";
10
11
  //#region src/field.d.ts
11
12
  /**
12
13
  * A resolver's answer from a `Result`, so a modeled failure is never thrown by
@@ -90,6 +91,31 @@ type GraphqlOptions<A extends Authenticators, Units extends UnitsOf<A>, R extend
90
91
  };
91
92
  export declare const graphql: <A extends Authenticators, Units extends UnitsOf<A> = Record<never, never>, const R extends Requirements & { readonly [I in keyof R]: OneScheme<R[I]>; } = never, U extends Readonly<Record<string, AnyPort>> = Record<never, never>, const PS extends readonly unknown[] = []>(api: HttpAuth<A>, options: GraphqlOptions<A, Units, R, U, PS>) => Provider<HttpHandler, ConfigInvalid, HttpConfig | HttpUnit | Observers | Scope | SchemePortsOf<R> | UnitsNeedsOf<Units> | EnvReading<never, "GRAPHQL_DEVELOPER_TOOLS" | "GRAPHQL_MAX_TOKENS">> & {
92
93
  authenticators: readonly import("@btravstack/http-server/internal").SchemeProviders<A>[];
94
+ units: (Units & { readonly [K in Exclude<keyof Units, Kinds<A>>]: never; }) | undefined;
93
95
  };
94
96
  //#endregion
97
+ //#region src/graphql-module.d.ts
98
+ type AnyAnswerer = Provider<InstanceType<typeof HttpHandler$1>, unknown, unknown> & {
99
+ readonly authenticators: readonly AnyProvider[];
100
+ readonly units: Readonly<Record<string, AnyUnitModule>> | undefined;
101
+ };
102
+ type UnitsOf$1<A> = A extends {
103
+ readonly units: infer U;
104
+ } ? U : never;
105
+ type AuthOf<A> = A extends {
106
+ readonly authenticators: readonly (infer P)[];
107
+ } ? P : never;
108
+ type HttpStarter<Units> = Module<HttpRuntime | HttpConfig$1 | InstanceType<typeof HttpHandler$1> | HttpUnit | CookieSchemes | Observers, ConfigInvalid, HttpServerEnv | UnitsNeedsOf<Units>>;
109
+ type Imports<I extends readonly AnyModule[], A> = readonly [...I, HttpStarter<UnitsOf$1<A>>];
110
+ type Provides<P extends readonly AnyProvider[], A> = readonly (A | AuthOf<A> | P[number])[];
111
+ type EnvAnd<N extends readonly AnyPort[]> = readonly [...N, typeof Env];
112
+ /** Declare a GraphQL HTTP application without repeating runtime or authenticator wiring. */
113
+ export declare const GraphqlModule: <const Name extends string>(name: Name) => <A extends AnyAnswerer, const I extends readonly AnyModule[] = [], const P extends readonly AnyProvider[] = [], const X extends readonly Exportable<Imports<I, A>, Provides<P, A>>[] = [], const N extends readonly AnyPort[] = []>(options: Omit<HttpOptions, "unit" | "cors" | "compression"> & {
114
+ readonly answerer: A;
115
+ readonly imports?: I;
116
+ readonly provides?: P;
117
+ readonly exports?: X;
118
+ readonly needs?: N;
119
+ } & NeedsGate<Imports<I, A>, Provides<P, A>, EnvAnd<N>>) => Module<(Extract<(readonly [...(typeof HttpHandler$1 | typeof HttpRuntime | (import("@btravstack/core").HealthChecks extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").HealthChecks : never) | (import("@btravstack/core").Logger extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").Logger : never))[], ...X])[number], AnyModule> extends (infer T_3) ? T_3 extends Extract<(readonly [...(typeof HttpHandler$1 | typeof HttpRuntime | (import("@btravstack/core").HealthChecks extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").HealthChecks : never) | (import("@btravstack/core").Logger extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").Logger : never))[], ...X])[number], AnyModule> ? T_3 extends Module<infer X_3, infer E, infer N_1> ? readonly [X_3, E, N_1] : never : never : never)[0] | ((readonly [...(typeof HttpHandler$1 | typeof HttpRuntime | (import("@btravstack/core").HealthChecks extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").HealthChecks : never) | (import("@btravstack/core").Logger extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").Logger : never))[], ...X])[number] extends (infer E_1) ? E_1 extends AnyPort ? InstanceType<E_1> : E_1 extends AnyProvider ? InstanceType<E_1["port"]> : never : never), ((A extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never) | (P[number] extends (infer T_4) ? T_4 extends P[number] ? T_4 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never) | (AuthOf<A> extends (infer T_5) ? T_5 extends AuthOf<A> ? T_5 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never))[1] | ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T_6) ? T_6 extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T_6 extends Module<infer X_3, infer E, infer N_1> ? readonly [X_3, E, N_1] : never : never : never)[1], Exclude<((A extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never) | (P[number] extends (infer T_7) ? T_7 extends P[number] ? T_7 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never) | (AuthOf<A> extends (infer T_8) ? T_8 extends AuthOf<A> ? T_8 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never))[2], ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T_9) ? T_9 extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T_9 extends Module<infer X_3, infer E, infer N_1> ? readonly [X_3, E, N_1] : never : never : never)[0] | ((A extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never) | (P[number] extends (infer T_7) ? T_7 extends P[number] ? T_7 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never) | (AuthOf<A> extends (infer T_8) ? T_8 extends AuthOf<A> ? T_8 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never))[0]> | Exclude<((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T_9) ? T_9 extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T_9 extends Module<infer X_3, infer E, infer N_1> ? readonly [X_3, E, N_1] : never : never : never)[2], ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T_9) ? T_9 extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T_9 extends Module<infer X_3, infer E, infer N_1> ? readonly [X_3, E, N_1] : never : never : never)[0] | ((A extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never) | (P[number] extends (infer T_7) ? T_7 extends P[number] ? T_7 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never) | (AuthOf<A> extends (infer T_8) ? T_8 extends AuthOf<A> ? T_8 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never))[0]>>;
120
+ //#endregion
95
121
  export type { GraphqlContext, GraphqlOptions };
package/dist/index.d.mts CHANGED
@@ -1,9 +1,10 @@
1
1
  import { Plugin, YogaInitialContext, YogaServerOptions } from "graphql-yoga";
2
- import { ConfigInvalid, EnvReading } from "@btravstack/config";
2
+ import { ConfigInvalid, Env, EnvReading } from "@btravstack/config";
3
3
  import { Observers } from "@btravstack/core";
4
- import { AnyPort, Provider, Scope } from "@btravstack/di";
5
- import { Authenticators, HttpAuth, HttpConfig, HttpHandler, HttpUnit, KindOf, Kinds, Principal, RequiresGate, SchemePortsOf, SchemesFrom, SchemesOf, UnitFor, UnitsNeedsOf, UnitsOf } from "@btravstack/http-server/internal";
4
+ import { AnyModule, AnyPort, AnyProvider, Exportable, Module, NeedsGate, Provider, Scope } from "@btravstack/di";
5
+ import { AnyUnitModule, Authenticators, CookieSchemes, HttpAuth, HttpConfig, HttpHandler, HttpServerEnv, HttpUnit, KindOf, Kinds, Principal, RequiresGate, SchemePortsOf, SchemesFrom, SchemesOf, UnitFor, UnitsNeedsOf, UnitsOf } from "@btravstack/http-server/internal";
6
6
  import { AsyncResult, Result } from "unthrown";
7
+ import { HttpConfig as HttpConfig$1, HttpHandler as HttpHandler$1, HttpOptions, HttpRuntime } from "@btravstack/http-server";
7
8
  import { GraphQLError, GraphQLSchema } from "graphql";
8
9
  import { IncomingMessage } from "node:http";
9
10
  import { OneScheme, Requirements } from "@btravstack/contract";
@@ -90,6 +91,31 @@ type GraphqlOptions<A extends Authenticators, Units extends UnitsOf<A>, R extend
90
91
  };
91
92
  export declare const graphql: <A extends Authenticators, Units extends UnitsOf<A> = Record<never, never>, const R extends Requirements & { readonly [I in keyof R]: OneScheme<R[I]>; } = never, U extends Readonly<Record<string, AnyPort>> = Record<never, never>, const PS extends readonly unknown[] = []>(api: HttpAuth<A>, options: GraphqlOptions<A, Units, R, U, PS>) => Provider<HttpHandler, ConfigInvalid, HttpConfig | HttpUnit | Observers | Scope | SchemePortsOf<R> | UnitsNeedsOf<Units> | EnvReading<never, "GRAPHQL_DEVELOPER_TOOLS" | "GRAPHQL_MAX_TOKENS">> & {
92
93
  authenticators: readonly import("@btravstack/http-server/internal").SchemeProviders<A>[];
94
+ units: (Units & { readonly [K in Exclude<keyof Units, Kinds<A>>]: never; }) | undefined;
93
95
  };
94
96
  //#endregion
97
+ //#region src/graphql-module.d.ts
98
+ type AnyAnswerer = Provider<InstanceType<typeof HttpHandler$1>, unknown, unknown> & {
99
+ readonly authenticators: readonly AnyProvider[];
100
+ readonly units: Readonly<Record<string, AnyUnitModule>> | undefined;
101
+ };
102
+ type UnitsOf$1<A> = A extends {
103
+ readonly units: infer U;
104
+ } ? U : never;
105
+ type AuthOf<A> = A extends {
106
+ readonly authenticators: readonly (infer P)[];
107
+ } ? P : never;
108
+ type HttpStarter<Units> = Module<HttpRuntime | HttpConfig$1 | InstanceType<typeof HttpHandler$1> | HttpUnit | CookieSchemes | Observers, ConfigInvalid, HttpServerEnv | UnitsNeedsOf<Units>>;
109
+ type Imports<I extends readonly AnyModule[], A> = readonly [...I, HttpStarter<UnitsOf$1<A>>];
110
+ type Provides<P extends readonly AnyProvider[], A> = readonly (A | AuthOf<A> | P[number])[];
111
+ type EnvAnd<N extends readonly AnyPort[]> = readonly [...N, typeof Env];
112
+ /** Declare a GraphQL HTTP application without repeating runtime or authenticator wiring. */
113
+ export declare const GraphqlModule: <const Name extends string>(name: Name) => <A extends AnyAnswerer, const I extends readonly AnyModule[] = [], const P extends readonly AnyProvider[] = [], const X extends readonly Exportable<Imports<I, A>, Provides<P, A>>[] = [], const N extends readonly AnyPort[] = []>(options: Omit<HttpOptions, "unit" | "cors" | "compression"> & {
114
+ readonly answerer: A;
115
+ readonly imports?: I;
116
+ readonly provides?: P;
117
+ readonly exports?: X;
118
+ readonly needs?: N;
119
+ } & NeedsGate<Imports<I, A>, Provides<P, A>, EnvAnd<N>>) => Module<(Extract<(readonly [...(typeof HttpHandler$1 | typeof HttpRuntime | (import("@btravstack/core").HealthChecks extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").HealthChecks : never) | (import("@btravstack/core").Logger extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").Logger : never))[], ...X])[number], AnyModule> extends (infer T_3) ? T_3 extends Extract<(readonly [...(typeof HttpHandler$1 | typeof HttpRuntime | (import("@btravstack/core").HealthChecks extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").HealthChecks : never) | (import("@btravstack/core").Logger extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").Logger : never))[], ...X])[number], AnyModule> ? T_3 extends Module<infer X_3, infer E, infer N_1> ? readonly [X_3, E, N_1] : never : never : never)[0] | ((readonly [...(typeof HttpHandler$1 | typeof HttpRuntime | (import("@btravstack/core").HealthChecks extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").HealthChecks : never) | (import("@btravstack/core").Logger extends ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T) ? T extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T extends Module<infer X_1, infer _E, infer _N> ? X_1 : never : never : never) | (A extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never) | (P[number] extends (infer T_1) ? T_1 extends P[number] ? T_1 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) | (AuthOf<A> extends (infer T_2) ? T_2 extends AuthOf<A> ? T_2 extends Provider<infer X_2, infer _E_1, infer _N_1> ? X_2 : never : never : never) ? typeof import("@btravstack/core").Logger : never))[], ...X])[number] extends (infer E_1) ? E_1 extends AnyPort ? InstanceType<E_1> : E_1 extends AnyProvider ? InstanceType<E_1["port"]> : never : never), ((A extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never) | (P[number] extends (infer T_4) ? T_4 extends P[number] ? T_4 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never) | (AuthOf<A> extends (infer T_5) ? T_5 extends AuthOf<A> ? T_5 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never))[1] | ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T_6) ? T_6 extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T_6 extends Module<infer X_3, infer E, infer N_1> ? readonly [X_3, E, N_1] : never : never : never)[1], Exclude<((A extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never) | (P[number] extends (infer T_7) ? T_7 extends P[number] ? T_7 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never) | (AuthOf<A> extends (infer T_8) ? T_8 extends AuthOf<A> ? T_8 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never))[2], ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T_9) ? T_9 extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T_9 extends Module<infer X_3, infer E, infer N_1> ? readonly [X_3, E, N_1] : never : never : never)[0] | ((A extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never) | (P[number] extends (infer T_7) ? T_7 extends P[number] ? T_7 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never) | (AuthOf<A> extends (infer T_8) ? T_8 extends AuthOf<A> ? T_8 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never))[0]> | Exclude<((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T_9) ? T_9 extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T_9 extends Module<infer X_3, infer E, infer N_1> ? readonly [X_3, E, N_1] : never : never : never)[2], ((readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] extends (infer T_9) ? T_9 extends (readonly [...I, HttpStarter<UnitsOf$1<A>>])[number] ? T_9 extends Module<infer X_3, infer E, infer N_1> ? readonly [X_3, E, N_1] : never : never : never)[0] | ((A extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never) | (P[number] extends (infer T_7) ? T_7 extends P[number] ? T_7 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never) | (AuthOf<A> extends (infer T_8) ? T_8 extends AuthOf<A> ? T_8 extends Provider<infer P_1, infer E_2, infer N_2> ? readonly [P_1, E_2, N_2] : never : never : never))[0]>>;
120
+ //#endregion
95
121
  export type { GraphqlContext, GraphqlOptions };
package/dist/index.mjs CHANGED
@@ -1,9 +1,10 @@
1
1
  import { createGraphQLError, createYoga, handleStreamOrSingleExecutionResult, maskError } from "graphql-yoga";
2
2
  import { Config, Env } from "@btravstack/config";
3
3
  import { Observers, observe } from "@btravstack/core";
4
- import { Provider } from "@btravstack/di";
5
- import { HttpConfig, HttpHandler, HttpUnit, forkUnit, principalOf, resolveScheme, schemeDeps, schemeServices } from "@btravstack/http-server/internal";
4
+ import { Module, Provider } from "@btravstack/di";
5
+ import { HttpConfig, HttpHandler, HttpUnit, applicationExports, forkUnit, principalOf, resolveScheme, schemeDeps, schemeServices } from "@btravstack/http-server/internal";
6
6
  import { P } from "unthrown";
7
+ import { httpServer } from "@btravstack/http-server";
7
8
  //#region src/field.ts
8
9
  /**
9
10
  * A resolver's answer from a `Result`, so a modeled failure is never thrown by
@@ -157,7 +158,31 @@ const graphql = (api, options) => {
157
158
  }),
158
159
  onStop: (answerer) => answerer[dispose]()
159
160
  });
160
- return Object.assign(typed, { authenticators: api.providers });
161
+ return Object.assign(typed, {
162
+ authenticators: api.providers,
163
+ units: options.units
164
+ });
165
+ };
166
+ //#endregion
167
+ //#region src/graphql-module.ts
168
+ /** Declare a GraphQL HTTP application without repeating runtime or authenticator wiring. */
169
+ const GraphqlModule = (name) => (options) => {
170
+ const starter = httpServer({
171
+ ...options,
172
+ unit: options.answerer.units
173
+ });
174
+ const imports = [...options.imports ?? [], starter];
175
+ const provides = [
176
+ options.answerer,
177
+ ...options.answerer.authenticators,
178
+ ...options.provides ?? []
179
+ ];
180
+ return Module(name)({
181
+ imports,
182
+ provides,
183
+ exports: [...applicationExports(imports, provides), ...options.exports ?? []],
184
+ needs: [...options.needs ?? [], Env]
185
+ });
161
186
  };
162
187
  //#endregion
163
- export { fieldResult, graphql };
188
+ export { GraphqlModule, fieldResult, graphql };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@btravstack/graphql-server",
3
- "version": "0.30.0",
3
+ "version": "0.31.0",
4
4
  "description": "The GraphQL Yoga answerer for @btravstack/http-server",
5
5
  "keywords": [
6
6
  "graphql",
@@ -41,29 +41,29 @@
41
41
  "./package.json": "./package.json"
42
42
  },
43
43
  "devDependencies": {
44
- "@btravstack/config": "0.30.0",
45
- "@btravstack/contract": "0.30.0",
46
- "@btravstack/core": "0.30.0",
47
- "@btravstack/di": "0.30.0",
48
- "@btravstack/http-server": "0.30.0",
44
+ "@btravstack/config": "0.31.0",
45
+ "@btravstack/contract": "0.31.0",
46
+ "@btravstack/core": "0.31.0",
47
+ "@btravstack/di": "0.31.0",
48
+ "@btravstack/http-server": "0.31.0",
49
49
  "@btravstack/tsconfig": "0.4.0",
50
50
  "@types/node": "26.6.4",
51
- "@unthrown/vitest": "5.12.0",
51
+ "@unthrown/vitest": "5.12.1",
52
52
  "@vitest/coverage-v8": "5.0.3",
53
53
  "graphql": "17.0.2",
54
54
  "graphql-yoga": "5.24.1",
55
55
  "tsdown": "0.23.0",
56
56
  "typescript": "7.0.2",
57
57
  "typescript-consumer": "npm:typescript@5.9.3",
58
- "unthrown": "5.12.0",
58
+ "unthrown": "5.12.1",
59
59
  "vitest": "5.0.3"
60
60
  },
61
61
  "peerDependencies": {
62
- "@btravstack/config": "^0.30.0",
63
- "@btravstack/contract": "^0.30.0",
64
- "@btravstack/core": "^0.30.0",
65
- "@btravstack/di": "^0.30.0",
66
- "@btravstack/http-server": "^0.30.0",
62
+ "@btravstack/config": "^0.31.0",
63
+ "@btravstack/contract": "^0.31.0",
64
+ "@btravstack/core": "^0.31.0",
65
+ "@btravstack/di": "^0.31.0",
66
+ "@btravstack/http-server": "^0.31.0",
67
67
  "graphql": "^16.6.0 || ^17.0.0",
68
68
  "graphql-yoga": "^5.24.1",
69
69
  "unthrown": "^5.7.0"