@glubean/graphql 0.1.7 → 0.2.1

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.
@@ -0,0 +1,543 @@
1
+ /**
2
+ * Built-in GraphQL contract adapter for @glubean/graphql 0.2.0.
3
+ *
4
+ * Shipped alongside the transport plugin in @glubean/graphql (single-package
5
+ * model — "contract is a first-class citizen"). Registered via
6
+ * `contract.register("graphql", graphqlAdapter)` on import — see ./index.ts.
7
+ *
8
+ * Responsibilities (same interface as HTTP / gRPC adapters):
9
+ * - execute: setup → call → expect → verify → teardown
10
+ * - executeCaseInFlow: deep-merge resolvedInputs, run case in flow mode
11
+ * - validateCaseForFlow: reject function-valued variables / headers
12
+ * - project: runtime ContractProjection<GraphqlPayloadSchemas>
13
+ * - normalize: runtime → JSON-safe ExtractedContractProjection
14
+ * - classifyFailure: 3-layer (transport / payload errors / data shape)
15
+ * - renderTarget: operationName (parsed from query if needed)
16
+ * - toMarkdown: case list with operation + query snippet
17
+ * - describePayload: high-level summary for index views
18
+ *
19
+ * Phase 1 scope: query + mutation only. Subscription deferred to Phase 2.
20
+ */
21
+ import { parseOperationName } from "../index.js";
22
+ // =============================================================================
23
+ // Helpers
24
+ // =============================================================================
25
+ /** Convert a SchemaLike to a JSON Schema fragment if possible (best-effort). */
26
+ export function schemaToJsonSchema(schema) {
27
+ if (!schema || typeof schema !== "object")
28
+ return null;
29
+ const maybe = schema.toJSONSchema;
30
+ if (typeof maybe === "function") {
31
+ try {
32
+ const out = maybe.call(schema);
33
+ if (out && typeof out === "object")
34
+ return out;
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ return null;
41
+ }
42
+ /** Deep-merge two plain objects (right wins). Handles nested objects; skips arrays. */
43
+ function deepMerge(base, override) {
44
+ if (!base && !override)
45
+ return {};
46
+ if (!base)
47
+ return { ...override };
48
+ if (!override)
49
+ return { ...base };
50
+ const out = { ...base };
51
+ for (const [k, v] of Object.entries(override)) {
52
+ const baseVal = base[k];
53
+ if (v != null &&
54
+ typeof v === "object" &&
55
+ !Array.isArray(v) &&
56
+ baseVal != null &&
57
+ typeof baseVal === "object" &&
58
+ !Array.isArray(baseVal)) {
59
+ out[k] = deepMerge(baseVal, v);
60
+ }
61
+ else {
62
+ out[k] = v;
63
+ }
64
+ }
65
+ return out;
66
+ }
67
+ /** Resolve the effective GraphQL client with case > spec fallback. */
68
+ function resolveClient(caseSpec, spec) {
69
+ const client = caseSpec.client ?? spec.client;
70
+ if (!client) {
71
+ throw new Error(`No GraphQL client provided for case. Set "client" on the case or contract spec (e.g. via contract.graphql.with("name", { client: gqlPlugin })).`);
72
+ }
73
+ return client;
74
+ }
75
+ /** Merge headers: contract defaults < case. */
76
+ function resolveHeaders(spec, caseSpec, state) {
77
+ const caseHeaders = typeof caseSpec.headers === "function"
78
+ ? caseSpec.headers(state)
79
+ : caseSpec.headers;
80
+ const specHeaders = spec.defaultHeaders;
81
+ if (!caseHeaders && !specHeaders)
82
+ return undefined;
83
+ return { ...(specHeaders ?? {}), ...(caseHeaders ?? {}) };
84
+ }
85
+ /** Resolve variables with deep-merge: spec.defaultVariables < case.variables. */
86
+ function resolveVariables(spec, caseSpec, state) {
87
+ const caseVars = typeof caseSpec.variables === "function"
88
+ ? caseSpec.variables(state)
89
+ : caseSpec.variables;
90
+ return deepMerge(spec.defaultVariables, caseVars);
91
+ }
92
+ /** Resolve effective operation type: case > spec default > "query". */
93
+ function resolveOperation(spec, caseSpec) {
94
+ return caseSpec.operation ?? spec.defaultOperation ?? "query";
95
+ }
96
+ /** Resolve display operationName: case.operationName > parsed from query > "anonymous". */
97
+ function resolveOperationName(caseSpec) {
98
+ return (caseSpec.operationName ?? parseOperationName(caseSpec.query) ?? "anonymous");
99
+ }
100
+ /**
101
+ * Call the GraphQL client for a case. Returns the full GraphQLResult envelope
102
+ * plus the resolved operation + operationName + duration.
103
+ */
104
+ async function callGraphql(client, caseSpec, spec, variables, headers) {
105
+ const operation = resolveOperation(spec, caseSpec);
106
+ const operationName = resolveOperationName(caseSpec);
107
+ const start = Date.now();
108
+ const callFn = operation === "mutation" ? client.mutate : client.query;
109
+ const res = await callFn.call(client, caseSpec.query, {
110
+ variables,
111
+ ...(headers ? { headers } : {}),
112
+ operationName: operationName !== "anonymous" ? operationName : undefined,
113
+ });
114
+ const duration = Date.now() - start;
115
+ return {
116
+ data: res.data,
117
+ errors: res.errors,
118
+ extensions: res.extensions,
119
+ httpStatus: res.httpStatus,
120
+ headers: res.headers,
121
+ rawBody: res.rawBody,
122
+ operationName,
123
+ duration,
124
+ };
125
+ }
126
+ /**
127
+ * 3-layer assertion: transport → payload errors → data shape.
128
+ * Uses `ctx.assert` / `ctx.expect` / `ctx.validate` for structured failures.
129
+ */
130
+ function assertResult(ctx, result, caseSpec) {
131
+ const expect = caseSpec.expect ?? {};
132
+ const expectedStatus = expect.httpStatus ?? 200;
133
+ // Layer 1: transport (HTTP status)
134
+ if (result.httpStatus !== expectedStatus) {
135
+ ctx.assert(false, `Expected HTTP status ${expectedStatus} but got ${result.httpStatus}`, { actual: result.httpStatus, expected: expectedStatus });
136
+ }
137
+ // Layer 2: payload errors (GraphQL `errors` array)
138
+ assertErrors(ctx, result.errors, expect.errors ?? "absent");
139
+ // Layer 3: data shape (only when transport succeeded and errors absent OR
140
+ // `data` partial expect is declared — schema always runs if provided)
141
+ if (expect.schema) {
142
+ ctx.validate(result.data, expect.schema, `response data`);
143
+ }
144
+ if (expect.data) {
145
+ if (result.data == null) {
146
+ ctx.assert(false, `Expected data shape to match but response.data was null`, { actual: null, expected: expect.data });
147
+ }
148
+ else {
149
+ ctx.expect(result.data).toMatchObject(expect.data);
150
+ }
151
+ }
152
+ // Response headers assertions
153
+ if (expect.headersMatch) {
154
+ ctx.expect(result.headers).toMatchObject(expect.headersMatch);
155
+ }
156
+ if (expect.headers) {
157
+ ctx.validate(result.headers, expect.headers, `response headers`);
158
+ }
159
+ }
160
+ /**
161
+ * Assert the `errors` layer against a sentinel or partial array.
162
+ */
163
+ function assertErrors(ctx, actual, expected) {
164
+ const errs = actual ?? [];
165
+ if (expected === "absent") {
166
+ if (errs.length > 0) {
167
+ ctx.assert(false, `Expected no GraphQL errors but got ${errs.length}: ${errs.map((e) => e.message).join("; ")}`, { actual: errs, expected: [] });
168
+ }
169
+ return;
170
+ }
171
+ if (expected === "any") {
172
+ return; // accept whatever shows up
173
+ }
174
+ // Array of partial GraphQLError — match by position (each entry partial-matches)
175
+ if (errs.length < expected.length) {
176
+ ctx.assert(false, `Expected ${expected.length} GraphQL errors but got ${errs.length}`, { actual: errs, expected });
177
+ return;
178
+ }
179
+ for (let i = 0; i < expected.length; i++) {
180
+ const want = expected[i];
181
+ const got = errs[i];
182
+ // Partial match on top-level keys (message, extensions.code, etc.)
183
+ for (const [k, v] of Object.entries(want)) {
184
+ if (k === "extensions" && v && typeof v === "object") {
185
+ ctx.expect((got.extensions ?? {})).toMatchObject(v);
186
+ }
187
+ else {
188
+ ctx.expect(got[k]).toEqual(v);
189
+ }
190
+ }
191
+ }
192
+ }
193
+ // =============================================================================
194
+ // executeCase — standard (non-flow) case execution
195
+ // =============================================================================
196
+ async function executeCase(ctx, caseSpec, spec) {
197
+ if (!caseSpec.query || typeof caseSpec.query !== "string") {
198
+ throw new Error(`GraphQL contract case: "query" is required and must be a string.`);
199
+ }
200
+ const state = caseSpec.setup
201
+ ? await caseSpec.setup(ctx)
202
+ : undefined;
203
+ try {
204
+ const client = resolveClient(caseSpec, spec);
205
+ const variables = resolveVariables(spec, caseSpec, state);
206
+ const headers = resolveHeaders(spec, caseSpec, state);
207
+ const result = await callGraphql(client, caseSpec, spec, variables, headers);
208
+ assertResult(ctx, result, caseSpec);
209
+ if (caseSpec.verify) {
210
+ await caseSpec.verify(ctx, result);
211
+ }
212
+ }
213
+ finally {
214
+ if (caseSpec.teardown) {
215
+ await caseSpec.teardown(ctx, state);
216
+ }
217
+ }
218
+ }
219
+ // =============================================================================
220
+ // project — runtime ContractProjection
221
+ // =============================================================================
222
+ function projectGraphql(spec) {
223
+ const meta = {
224
+ endpoint: spec.endpoint,
225
+ defaultOperation: spec.defaultOperation,
226
+ defaultHeaders: spec.defaultHeaders,
227
+ types: spec.types,
228
+ };
229
+ const cases = Object.entries(spec.cases).map(([key, c]) => {
230
+ const casted = c;
231
+ const lifecycle = casted.deprecated
232
+ ? "deprecated"
233
+ : casted.deferred
234
+ ? "deferred"
235
+ : "active";
236
+ const operation = resolveOperation(spec, casted);
237
+ const operationName = resolveOperationName(casted);
238
+ const schemas = {
239
+ query: casted.query,
240
+ operation,
241
+ operationName,
242
+ variables: spec.variablesSchema,
243
+ response: casted.expect?.schema ?? spec.responseSchema,
244
+ headers: casted.expect?.headers,
245
+ };
246
+ return {
247
+ key,
248
+ description: casted.description,
249
+ lifecycle,
250
+ severity: casted.severity ?? "warning",
251
+ deferredReason: casted.deferred,
252
+ deprecatedReason: casted.deprecated,
253
+ schemas,
254
+ tags: casted.tags,
255
+ extensions: casted.extensions,
256
+ requires: casted.requires,
257
+ defaultRun: casted.defaultRun,
258
+ };
259
+ });
260
+ return {
261
+ protocol: "graphql",
262
+ target: spec.endpoint ?? "",
263
+ description: spec.description,
264
+ feature: spec.feature,
265
+ tags: spec.tags,
266
+ extensions: spec.extensions,
267
+ deprecated: spec.deprecated,
268
+ cases,
269
+ schemas: {},
270
+ meta,
271
+ };
272
+ }
273
+ // =============================================================================
274
+ // normalize — runtime → JSON-safe Extracted
275
+ // =============================================================================
276
+ function normalizeGraphql(projection) {
277
+ const safeCases = projection.cases.map((c) => {
278
+ const s = c.schemas ?? {};
279
+ const safe = {
280
+ query: s.query,
281
+ operation: s.operation,
282
+ operationName: s.operationName,
283
+ variables: schemaToJsonSchema(s.variables) ?? undefined,
284
+ response: schemaToJsonSchema(s.response) ?? undefined,
285
+ headers: schemaToJsonSchema(s.headers) ?? undefined,
286
+ variablesExample: s.variablesExample,
287
+ variablesExamples: s.variablesExamples,
288
+ };
289
+ return { ...c, schemas: safe };
290
+ });
291
+ return {
292
+ id: projection.id,
293
+ protocol: projection.protocol,
294
+ target: projection.target,
295
+ description: projection.description,
296
+ feature: projection.feature,
297
+ instanceName: projection.instanceName,
298
+ tags: projection.tags,
299
+ extensions: projection.extensions,
300
+ deprecated: projection.deprecated,
301
+ cases: safeCases,
302
+ schemas: {},
303
+ meta: projection.meta,
304
+ };
305
+ }
306
+ // =============================================================================
307
+ // executeCaseInFlow — flow-mode execution
308
+ // =============================================================================
309
+ async function executeCaseInFlowGraphql(input) {
310
+ const { ctx, contract: c, caseKey, resolvedInputs } = input;
311
+ const spec = c._spec;
312
+ const caseSpec = spec.cases[caseKey];
313
+ if (!caseSpec) {
314
+ throw new Error(`GraphQL contract: unknown case key "${caseKey}".`);
315
+ }
316
+ if (!caseSpec.query || typeof caseSpec.query !== "string") {
317
+ throw new Error(`GraphQL contract case "${caseKey}": "query" is required and must be a string.`);
318
+ }
319
+ const state = caseSpec.setup
320
+ ? (await caseSpec.setup(ctx))
321
+ : undefined;
322
+ try {
323
+ const client = resolveClient(caseSpec, spec);
324
+ const staticVars = typeof caseSpec.variables === "function"
325
+ ? undefined
326
+ : caseSpec.variables;
327
+ const staticHeaders = typeof caseSpec.headers === "function"
328
+ ? undefined
329
+ : caseSpec.headers;
330
+ const lensInput = (resolvedInputs ?? {});
331
+ // Deep-merge lens variables over case static + spec default
332
+ const mergedVariables = deepMerge(deepMerge(spec.defaultVariables, staticVars), lensInput.variables);
333
+ const mergedHeaders = {
334
+ ...(spec.defaultHeaders ?? {}),
335
+ ...(staticHeaders ?? {}),
336
+ ...(lensInput.headers ?? {}),
337
+ };
338
+ const result = await callGraphql(client, caseSpec, spec, mergedVariables, Object.keys(mergedHeaders).length > 0 ? mergedHeaders : undefined);
339
+ assertResult(ctx, result, caseSpec);
340
+ if (caseSpec.verify) {
341
+ await caseSpec.verify(ctx, result);
342
+ }
343
+ return result;
344
+ }
345
+ finally {
346
+ if (caseSpec.teardown) {
347
+ await caseSpec.teardown(ctx, state);
348
+ }
349
+ }
350
+ }
351
+ // =============================================================================
352
+ // validateCaseForFlow — reject function-valued fields in flow mode
353
+ // =============================================================================
354
+ export function validateGraphqlCaseForFlow(spec, caseKey, contractId) {
355
+ const caseSpec = spec.cases[caseKey];
356
+ if (!caseSpec) {
357
+ throw new Error(`contract.graphql(${JSON.stringify(contractId)}).case(${JSON.stringify(caseKey)}): case not found.`);
358
+ }
359
+ const functionFields = [];
360
+ if (typeof caseSpec.variables === "function")
361
+ functionFields.push("variables");
362
+ if (typeof caseSpec.headers === "function")
363
+ functionFields.push("headers");
364
+ if (functionFields.length > 0) {
365
+ throw new Error(`contract.graphql(${JSON.stringify(contractId)}).case(${JSON.stringify(caseKey)}): ` +
366
+ `cannot use function-valued ${functionFields.join(" / ")} in a flow step — ` +
367
+ `these fields depend on case-local setup state which isn't available in flow mode. ` +
368
+ `Move the value into flow state and use step.in lens instead.`);
369
+ }
370
+ }
371
+ // =============================================================================
372
+ // classifyFailure — 3-layer (transport / payload / data shape)
373
+ // =============================================================================
374
+ /**
375
+ * Classify failures based on:
376
+ * 1. Transport: HTTP status from the underlying POST
377
+ * 2. Payload: GraphQL `errors` array with optional `extensions.code`
378
+ * 3. Error shape (network / timeout) when no response was parsed
379
+ *
380
+ * Emitted events inspected: `graphql_response` (if adapter/transport emits
381
+ * it), else falls back to generic error shape.
382
+ */
383
+ function classifyGraphqlFailure(input) {
384
+ const gqlEvent = input.events.find((e) => e.type === "graphql_response");
385
+ if (gqlEvent) {
386
+ const httpStatus = typeof gqlEvent.data?.httpStatus === "number"
387
+ ? gqlEvent.data.httpStatus
388
+ : undefined;
389
+ const errors = Array.isArray(gqlEvent.data?.errors)
390
+ ? gqlEvent.data.errors
391
+ : undefined;
392
+ const transport = statusToClassification(httpStatus);
393
+ if (transport)
394
+ return transport;
395
+ const payload = payloadErrorsToClassification(errors);
396
+ if (payload)
397
+ return payload;
398
+ return undefined;
399
+ }
400
+ // Fall back to HTTP event emitted by the underlying transport
401
+ const httpEvent = input.events.find((e) => e.type === "http_response");
402
+ if (httpEvent) {
403
+ const status = typeof httpEvent.data?.status === "number"
404
+ ? httpEvent.data.status
405
+ : undefined;
406
+ const transport = statusToClassification(status);
407
+ if (transport)
408
+ return transport;
409
+ }
410
+ // Error shape fallback
411
+ if (input.error instanceof Error) {
412
+ const name = input.error.name;
413
+ if (name === "TimeoutError" || name === "AbortError") {
414
+ return { kind: "transient", source: "trace", retryable: true, message: input.error.message };
415
+ }
416
+ if (name === "GraphQLResponseError") {
417
+ return { kind: "semantic", source: "trace", message: input.error.message };
418
+ }
419
+ return { kind: "server", source: "trace", message: input.error.message };
420
+ }
421
+ return undefined;
422
+ }
423
+ function statusToClassification(status) {
424
+ if (status === undefined)
425
+ return undefined;
426
+ if (status >= 200 && status < 300)
427
+ return undefined;
428
+ if (status === 401 || status === 403) {
429
+ return { kind: "auth", source: "trace", message: `HTTP ${status}` };
430
+ }
431
+ if (status === 408 || status === 429) {
432
+ return { kind: "transient", source: "trace", retryable: true, message: `HTTP ${status}` };
433
+ }
434
+ if (status >= 400 && status < 500) {
435
+ return { kind: "client", source: "trace", message: `HTTP ${status}` };
436
+ }
437
+ if (status === 502 || status === 503 || status === 504) {
438
+ return { kind: "transient", source: "trace", retryable: true, message: `HTTP ${status}` };
439
+ }
440
+ if (status >= 500) {
441
+ return { kind: "server", source: "trace", message: `HTTP ${status}` };
442
+ }
443
+ return undefined;
444
+ }
445
+ /**
446
+ * Interpret GraphQL `errors[].extensions.code` when present.
447
+ *
448
+ * Common codes: UNAUTHENTICATED, FORBIDDEN, BAD_USER_INPUT, NOT_FOUND,
449
+ * INTERNAL_SERVER_ERROR. Unknown or missing codes → semantic.
450
+ */
451
+ function payloadErrorsToClassification(errors) {
452
+ if (!errors || errors.length === 0)
453
+ return undefined;
454
+ const first = errors[0];
455
+ const code = first.extensions?.code;
456
+ const codeStr = typeof code === "string" ? code.toUpperCase() : "";
457
+ if (codeStr === "UNAUTHENTICATED" || codeStr === "FORBIDDEN") {
458
+ return { kind: "auth", source: "trace", message: first.message };
459
+ }
460
+ if (codeStr === "BAD_USER_INPUT" || codeStr === "GRAPHQL_VALIDATION_FAILED" || codeStr === "GRAPHQL_PARSE_FAILED") {
461
+ return { kind: "client", source: "trace", message: first.message };
462
+ }
463
+ if (codeStr === "INTERNAL_SERVER_ERROR") {
464
+ return { kind: "server", source: "trace", message: first.message };
465
+ }
466
+ return { kind: "semantic", source: "trace", message: first.message };
467
+ }
468
+ // =============================================================================
469
+ // renderTarget — display operationName (or endpoint if none)
470
+ // =============================================================================
471
+ function renderGraphqlTarget(target) {
472
+ // `target` here is `spec.endpoint` per projectGraphql. Display as-is;
473
+ // per-case operationName is surfaced in toMarkdown, not here.
474
+ return target || "(graphql)";
475
+ }
476
+ // =============================================================================
477
+ // toMarkdown — case list with operation + short query snippet
478
+ // =============================================================================
479
+ function summarizeQuery(query, limit = 80) {
480
+ const flat = query.replace(/\s+/g, " ").trim();
481
+ return flat.length <= limit ? flat : `${flat.slice(0, limit - 1)}…`;
482
+ }
483
+ function toMarkdownGraphql(projection) {
484
+ const lines = [];
485
+ const endpoint = projection.target || "(no endpoint)";
486
+ lines.push(`### ${projection.id} — GraphQL \`${endpoint}\``);
487
+ if (projection.description)
488
+ lines.push(`\n${projection.description}`);
489
+ if (projection.deprecated)
490
+ lines.push(`\n**Deprecated:** ${projection.deprecated}`);
491
+ if (projection.cases.length === 0) {
492
+ lines.push("\n_(no cases)_");
493
+ return lines.join("\n");
494
+ }
495
+ lines.push("\n**Cases:**\n");
496
+ for (const c of projection.cases) {
497
+ const marker = c.lifecycle === "deprecated"
498
+ ? " ⚠ deprecated"
499
+ : c.lifecycle === "deferred"
500
+ ? " ⏸ deferred"
501
+ : "";
502
+ const op = c.schemas?.operation ?? "query";
503
+ const opName = c.schemas?.operationName ?? "anonymous";
504
+ lines.push(`- \`${c.key}\`${marker} — ${op} \`${opName}\` — ${c.description ?? ""}`);
505
+ if (c.schemas?.query) {
506
+ lines.push(` - \`${summarizeQuery(c.schemas.query)}\``);
507
+ }
508
+ if (c.deprecatedReason)
509
+ lines.push(` - deprecated: ${c.deprecatedReason}`);
510
+ if (c.deferredReason)
511
+ lines.push(` - deferred: ${c.deferredReason}`);
512
+ }
513
+ return lines.join("\n");
514
+ }
515
+ // =============================================================================
516
+ // describePayload — high-level summary for index views
517
+ // =============================================================================
518
+ function describeGraphqlPayload(schemas) {
519
+ const hasRequest = schemas.query !== undefined || schemas.variables !== undefined;
520
+ const hasResponse = schemas.response !== undefined;
521
+ return {
522
+ hasRequest,
523
+ hasResponse,
524
+ protocol: "graphql",
525
+ };
526
+ }
527
+ // =============================================================================
528
+ // Exported adapter
529
+ // =============================================================================
530
+ export const graphqlAdapter = {
531
+ async execute(ctx, caseSpec, contractSpec) {
532
+ await executeCase(ctx, caseSpec, contractSpec);
533
+ },
534
+ project: projectGraphql,
535
+ normalize: normalizeGraphql,
536
+ executeCaseInFlow: executeCaseInFlowGraphql,
537
+ validateCaseForFlow: validateGraphqlCaseForFlow,
538
+ classifyFailure: classifyGraphqlFailure,
539
+ renderTarget: renderGraphqlTarget,
540
+ toMarkdown: toMarkdownGraphql,
541
+ describePayload: describeGraphqlPayload,
542
+ };
543
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/contract/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * contract.graphql factory — scoped-defaults pattern.
3
+ *
4
+ * Root `contract.graphql` exposes only `.with(name, defaults)`. Calling
5
+ * `contract.graphql("id", spec)` directly is forbidden — client injection
6
+ * via scoped instances is the canonical authoring pattern (same as HTTP
7
+ * and gRPC).
8
+ *
9
+ * The factory wraps the generic dispatcher attached to `contract.graphql`
10
+ * by `contract.register("graphql", graphqlAdapter)`. Calls flow through:
11
+ * user code
12
+ * → scoped factory(id, spec)
13
+ * → merge instance defaults into spec
14
+ * → dispatcher(id, mergedSpec) [generic register() output]
15
+ * → adapter.project + per-case registerTest + Test[] with
16
+ * _projection/_spec
17
+ */
18
+ import type { ProtocolContract } from "@glubean/sdk";
19
+ import type { GraphqlContractCase, GraphqlContractDefaults, GraphqlContractFactory, GraphqlContractMeta, GraphqlContractRoot, GraphqlContractSpec, GraphqlPayloadSchemas } from "./types.js";
20
+ type InternalDefaults = GraphqlContractDefaults & {
21
+ _name?: string;
22
+ };
23
+ type GraphqlDispatch = <Vars extends Record<string, unknown>, Res, Cases extends Record<string, GraphqlContractCase<Vars, Res, any>>>(id: string, spec: GraphqlContractSpec<Vars, Res, Cases>) => ProtocolContract<GraphqlContractSpec, GraphqlPayloadSchemas, GraphqlContractMeta>;
24
+ /**
25
+ * Build a scoped GraphQL factory. `dispatch` is `contract.graphql` attached
26
+ * by the core's register() call — we wrap it to inject instance defaults.
27
+ */
28
+ export declare function createGraphqlFactory(dispatch: GraphqlDispatch, defaults?: InternalDefaults): GraphqlContractFactory;
29
+ /**
30
+ * Root factory — `.with()` only, direct call throws.
31
+ */
32
+ export declare function createGraphqlRoot(dispatch: GraphqlDispatch): GraphqlContractRoot;
33
+ export {};
34
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/contract/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAc,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,KAAK,gBAAgB,GAAG,uBAAuB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,KAAK,eAAe,GAAG,CACrB,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,GAAG,EACH,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAEjE,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,KACxC,gBAAgB,CAAC,mBAAmB,EAAE,qBAAqB,EAAE,mBAAmB,CAAC,CAAC;AA+CvF;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,sBAAsB,CA4CxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,mBAAmB,CAEhF"}