@glubean/graphql 0.1.7 → 0.2.2

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