@nxgt/graphql-validation 0.8.1 → 0.9.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
@@ -233,6 +233,54 @@ if (!result.success)
233
233
  throw invalidInputError(result.error.issues.map(fieldIssueOf), { translate: t });
234
234
  ```
235
235
 
236
+ For an API that uses `withValidation` or `validated` and answers invalid input
237
+ this way, `invalidInputOf(error, { translate })` converts their
238
+ `BAD_USER_INPUT` refusal (thrown directly, or wrapped by graphql-js with the
239
+ field's location) into the same error, and returns any other error as it is
240
+ (the same object). Each field carries the value the directive declared in
241
+ `params`, under the argument's own key (`{ max }`, `{ exclusiveMin }`, …):
242
+
243
+ ```ts
244
+ import { invalidInputOf } from '@nxgt/graphql-validation';
245
+
246
+ // in a graphql-yoga plugin
247
+ const plugin = {
248
+ onExecute: () => ({
249
+ onExecuteDone: ({ result, setResult }) => {
250
+ if (!('errors' in result) || !result.errors) return;
251
+ setResult({
252
+ ...result,
253
+ errors: result.errors.map((error) => invalidInputOf(error)),
254
+ });
255
+ },
256
+ }),
257
+ };
258
+ ```
259
+
260
+ For `signUp(input: { name: String! @constraint(maxLength: 100) })` sent with a
261
+ 101-character name, the response (without `translate`, so `message` is the
262
+ code) is:
263
+
264
+ ```json
265
+ {
266
+ "data": null,
267
+ "errors": [{
268
+ "message": "validation.errors.invalid-input",
269
+ "path": ["signUp"],
270
+ "extensions": {
271
+ "code": "validation.errors.invalid-input",
272
+ "http": { "status": 400 },
273
+ "fields": [{
274
+ "path": "name",
275
+ "code": "validation.errors.too-long",
276
+ "message": "validation.errors.too-long",
277
+ "params": { "max": 100 }
278
+ }]
279
+ }
280
+ }]
281
+ }
282
+ ```
283
+
236
284
  The codes, and `fieldsError`, are in
237
285
  [Answering invalid input as one error](docs/guide/invalid-input.md).
238
286
 
@@ -349,6 +397,7 @@ the directive declared is this package's. Both at once throw
349
397
  | `fieldsError(code, issues, options?)` | a refusal of your own naming fields, `extensions: { code, params?, http?, fields }`; `options` adds `status` and `params` |
350
398
  | `inputPath(path)` | `['input', 'person', 'firstName']` as `person.firstName`: dotted, the leading `input` argument dropped; a symbol written as `String(key)` |
351
399
  | `fieldIssueOf(issue)` | a Zod issue as a `FieldIssue`: `inputPath(issue.path)` and a code under `validation.errors.` (`too-short`, `too-long`, `out-of-range`, `too-few`, `too-many`, `invalid-format`, `invalid`), no params |
400
+ | `invalidInputOf(error, { translate? })` | a `@constraint` `BAD_USER_INPUT` refusal (direct, or the `originalError` of another error) as `invalidInputError`: fields `{ path, code, params }`, `params` the declared value under the argument's key (`min`, `max`, `exclusiveMin`, `exclusiveMax`, `multipleOf`, `format`; none for `pattern`), `invalid` for an issue with no `constraint`, `originalError` kept; any other error returned as the same object |
352
401
  | `FIELD_CODES` | those codes, keyed `tooShort`, `tooLong`, `outOfRange`, `tooFew`, `tooMany`, `invalidFormat`, `invalid` |
353
402
  | `INVALID_INPUT` | `'validation.errors.invalid-input'` |
354
403
  | `FieldIssue`, `FieldError`, `IssueParams`, `Translate`, `InvalidInputOptions`, `FieldsErrorOptions` | their types: an issue you write, a `fields` entry, its params, your translator, the options |
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export type { FormatName } from './formats/index.js';
5
5
  export type { StringSchema } from './formats/format.js';
6
6
  export type { FormatSchemas, OwnFormats } from './formats/registry.js';
7
7
  export { type FieldError, type FieldIssue, type FieldsErrorOptions, fieldsError, INVALID_INPUT, type InvalidInputOptions, type IssueParams, inputPath, invalidInputError, type Translate, } from './invalid-input.js';
8
+ export { invalidInputOf } from './invalid-input-of.js';
8
9
  export { type MaxDepthOptions, maxDepth } from './limits/max-depth.js';
9
10
  export { type MaxFieldsOptions, maxFields } from './limits/max-fields.js';
10
11
  export { type MaxListCostOptions, maxListCost } from './limits/max-list-cost.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,sBAAsB,EAC3B,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,eAAe,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EACN,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,WAAW,EACX,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,SAAS,EACT,iBAAiB,EACjB,KAAK,SAAS,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,eAAe,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,KAAK,gBAAgB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC9E,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EACN,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,SAAS,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,KAAK,qBAAqB,EAC1B,cAAc,GACd,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,sBAAsB,EAC3B,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,eAAe,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EACN,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,WAAW,EACX,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,SAAS,EACT,iBAAiB,EACjB,KAAK,SAAS,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,KAAK,eAAe,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,KAAK,gBAAgB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC9E,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EACN,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,SAAS,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,KAAK,qBAAqB,EAC1B,cAAc,GACd,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -131,9 +131,54 @@ function codeOf(issue) {
131
131
  return FIELD_CODES.invalid;
132
132
  }
133
133
  }
134
+ // src/invalid-input-of.ts
135
+ import { GraphQLError as GraphQLError3 } from "graphql";
136
+ var KINDS = {
137
+ minLength: { code: FIELD_CODES.tooShort, param: "min" },
138
+ maxLength: { code: FIELD_CODES.tooLong, param: "max" },
139
+ min: { code: FIELD_CODES.outOfRange, param: "min" },
140
+ max: { code: FIELD_CODES.outOfRange, param: "max" },
141
+ exclusiveMin: { code: FIELD_CODES.outOfRange, param: "exclusiveMin" },
142
+ exclusiveMax: { code: FIELD_CODES.outOfRange, param: "exclusiveMax" },
143
+ multipleOf: { code: FIELD_CODES.outOfRange, param: "multipleOf" },
144
+ minItems: { code: FIELD_CODES.tooFew, param: "min" },
145
+ maxItems: { code: FIELD_CODES.tooMany, param: "max" },
146
+ format: { code: FIELD_CODES.invalidFormat, param: "format" },
147
+ pattern: { code: FIELD_CODES.invalidFormat }
148
+ };
149
+ function fieldOf(issue) {
150
+ const kind = issue.constraint ? KINDS[issue.constraint] : undefined;
151
+ const path = inputPath(issue.path);
152
+ if (!kind)
153
+ return { path, code: FIELD_CODES.invalid };
154
+ const params = kind.param && issue.value !== undefined ? { [kind.param]: issue.value } : undefined;
155
+ return { path, code: kind.code, ...params && { params } };
156
+ }
157
+ function issuesOf2(error) {
158
+ const source = error.extensions["code"] === "BAD_USER_INPUT" ? error : error.originalError;
159
+ if (!(source instanceof GraphQLError3))
160
+ return;
161
+ if (source.extensions["code"] !== "BAD_USER_INPUT")
162
+ return;
163
+ const issues = source.extensions["issues"];
164
+ return Array.isArray(issues) ? issues : undefined;
165
+ }
166
+ function invalidInputOf(error, options = {}) {
167
+ const issues = issuesOf2(error);
168
+ if (!issues)
169
+ return error;
170
+ return invalidInputError(issues.map(fieldOf), {
171
+ ...options,
172
+ nodes: error.nodes ?? null,
173
+ source: error.source ?? null,
174
+ positions: error.positions ?? null,
175
+ path: error.path ?? null,
176
+ originalError: error
177
+ });
178
+ }
134
179
  // src/limits/max-depth.ts
135
180
  import {
136
- GraphQLError as GraphQLError3
181
+ GraphQLError as GraphQLError4
137
182
  } from "graphql";
138
183
 
139
184
  // src/limits/describe.ts
@@ -271,7 +316,7 @@ function maxDepth(options) {
271
316
  OperationDefinition(operation) {
272
317
  const depth = depthOf(walk, operation.selectionSet);
273
318
  if (depth > limit) {
274
- context.reportError(new GraphQLError3(`${operationLabel(operation)} is ${depth} levels deep, more than the ${limit} allowed`, {
319
+ context.reportError(new GraphQLError4(`${operationLabel(operation)} is ${depth} levels deep, more than the ${limit} allowed`, {
275
320
  nodes: [operation],
276
321
  extensions: { code: "QUERY_TOO_DEEP", depth, limit }
277
322
  }));
@@ -283,7 +328,7 @@ function maxDepth(options) {
283
328
  }
284
329
  // src/limits/max-fields.ts
285
330
  import {
286
- GraphQLError as GraphQLError4
331
+ GraphQLError as GraphQLError5
287
332
  } from "graphql";
288
333
  function countOf(walk, selectionSet) {
289
334
  let total = 0;
@@ -317,7 +362,7 @@ function maxFields(options) {
317
362
  OperationDefinition(operation) {
318
363
  const fields = countOf(walk, operation.selectionSet);
319
364
  if (fields > limit) {
320
- context.reportError(new GraphQLError4(`${operationLabel(operation)} selects ${fields} fields, more than the ${limit} allowed`, {
365
+ context.reportError(new GraphQLError5(`${operationLabel(operation)} selects ${fields} fields, more than the ${limit} allowed`, {
321
366
  nodes: [operation],
322
367
  extensions: { code: "QUERY_TOO_WIDE", fields, limit }
323
368
  }));
@@ -329,7 +374,7 @@ function maxFields(options) {
329
374
  }
330
375
  // src/limits/max-list-cost.ts
331
376
  import {
332
- GraphQLError as GraphQLError5,
377
+ GraphQLError as GraphQLError6,
333
378
  getNamedType,
334
379
  getNullableType,
335
380
  isListType
@@ -341,7 +386,7 @@ import {
341
386
  isObjectType as isObjectType2
342
387
  } from "graphql";
343
388
  var multiply = (a, b) => Math.min(CEILING, a * b);
344
- function fieldOf(cost, parent, name) {
389
+ function fieldOf2(cost, parent, name) {
345
390
  if (parent === cost.schema.getQueryType() && isIntrospectionRoot(name)) {
346
391
  return introspectionRoot(name);
347
392
  }
@@ -577,7 +622,7 @@ function costOf(cost, selectionSet, parent, pending) {
577
622
  continue;
578
623
  if (isIntrospectionRoot(name) && cost.ignoreIntrospection)
579
624
  continue;
580
- const definition = fieldOf(cost, parent, name);
625
+ const definition = fieldOf2(cost, parent, name);
581
626
  if (!definition)
582
627
  continue;
583
628
  total = add(total, fieldCost(cost, parent, selection, definition, pending));
@@ -619,7 +664,7 @@ function maxListCost(options) {
619
664
  OperationDefinition(operation) {
620
665
  const total = costOf(cost, operation.selectionSet, rootType(schema, operation), undefined);
621
666
  if (total > budget) {
622
- context.reportError(new GraphQLError5(`${operationLabel(operation)} costs ${total}, more than the ${budget} allowed`, {
667
+ context.reportError(new GraphQLError6(`${operationLabel(operation)} costs ${total}, more than the ${budget} allowed`, {
623
668
  nodes: [operation],
624
669
  extensions: {
625
670
  code: "QUERY_TOO_COSTLY",
@@ -707,6 +752,7 @@ export {
707
752
  fieldsError,
708
753
  inputPath,
709
754
  invalidInputError,
755
+ invalidInputOf,
710
756
  maxDepth,
711
757
  maxFields,
712
758
  maxListCost,
@@ -714,5 +760,5 @@ export {
714
760
  withValidation
715
761
  };
716
762
 
717
- //# debugId=B1856E23719B140164756E2164756E21
763
+ //# debugId=272206072C5FB7A264756E2164756E21
718
764
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/bad-user-input.ts", "../src/invalid-input.ts", "../src/field-issue-of.ts", "../src/limits/max-depth.ts", "../src/limits/describe.ts", "../src/limits/fragments.ts", "../src/limits/introspection.ts", "../src/limits/max-fields.ts", "../src/limits/max-list-cost.ts", "../src/limits/cost-context.ts", "../src/limits/list-size.ts", "../src/limits/size-reading.ts", "../src/limits/max-list-cost-options.ts", "../src/limits/pending-size.ts", "../src/validated.ts", "../src/with-validation.ts"],
3
+ "sources": ["../src/bad-user-input.ts", "../src/invalid-input.ts", "../src/field-issue-of.ts", "../src/invalid-input-of.ts", "../src/limits/max-depth.ts", "../src/limits/describe.ts", "../src/limits/fragments.ts", "../src/limits/introspection.ts", "../src/limits/max-fields.ts", "../src/limits/max-list-cost.ts", "../src/limits/cost-context.ts", "../src/limits/list-size.ts", "../src/limits/size-reading.ts", "../src/limits/max-list-cost-options.ts", "../src/limits/pending-size.ts", "../src/validated.ts", "../src/with-validation.ts"],
4
4
  "sourcesContent": [
5
5
  "import { GraphQLError } from 'graphql';\nimport type { z } from 'zod';\nimport type { ConstraintArgument } from './rules';\n\n/** One reason an input was refused, at its path inside the arguments. */\nexport interface ValidationIssue {\n\t/** `['input', 'address', 'zip']`: the argument, then the input fields. */\n\treadonly path: readonly (string | number)[];\n\treadonly message: string;\n\t/** Zod's issue code: `too_small`, `invalid_format`, `custom`, ... */\n\treadonly code: string;\n\t/**\n\t * The `@constraint` argument that refused (`minLength`, `format`), when a\n\t * directive did: stable across Zod versions, unlike `code`. Absent for a\n\t * refusal of `validated()`'s own schema.\n\t */\n\treadonly constraint?: ConstraintArgument;\n\t/**\n\t * What that `@constraint` argument was declared with, exactly as written\n\t * (`100` for `maxLength: 100`, `\"email\"` for `format: \"email\"`), so a\n\t * client can say \"at most 100 characters\" without parsing `message`.\n\t * Present exactly when `constraint` is.\n\t */\n\treadonly value?: ConstraintValue;\n}\n\n/** What a `@constraint` argument is declared with: a number or a string. */\nexport type ConstraintValue = string | number;\n\n/** The `extensions` of the error an invalid input becomes. */\nexport type BadUserInputExtensions = {\n\treadonly code: 'BAD_USER_INPUT';\n\treadonly issues: readonly ValidationIssue[];\n};\n\n/**\n * Names the `@constraint` argument behind an issue, and what it was declared\n * with, when there is one.\n */\nexport type ConstraintOf = (\n\tissue: z.core.$ZodIssue,\n) => { argument: ConstraintArgument; value: ConstraintValue } | undefined;\n\nfunction issuesOf(\n\terror: z.ZodError,\n\tconstraintOf?: ConstraintOf,\n): ValidationIssue[] {\n\treturn error.issues.map((issue) => {\n\t\tconst path = issue.path.map((key) =>\n\t\t\ttypeof key === 'number' ? key : String(key),\n\t\t);\n\t\tconst constraint = constraintOf?.(issue);\n\t\treturn constraint\n\t\t\t? {\n\t\t\t\t\tpath,\n\t\t\t\t\tmessage: issue.message,\n\t\t\t\t\tcode: issue.code,\n\t\t\t\t\tconstraint: constraint.argument,\n\t\t\t\t\tvalue: constraint.value,\n\t\t\t\t}\n\t\t\t: { path, message: issue.message, code: issue.code };\n\t});\n}\n\nfunction errorOf(where: string, issues: ValidationIssue[]): GraphQLError {\n\tconst [first] = issues;\n\tconst reason = first\n\t\t? `${first.path.join('.') || 'arguments'}: ${first.message}`\n\t\t: 'refused';\n\tconst extensions: BadUserInputExtensions = { code: 'BAD_USER_INPUT', issues };\n\treturn new GraphQLError(`Invalid arguments for ${where}. ${reason}`, {\n\t\textensions,\n\t});\n}\n\n/**\n * The one error an invalid input becomes: `extensions.code` is\n * `BAD_USER_INPUT`, the code Apollo and most clients already read, and\n * `extensions.issues` lists every reason with its path, so a form can show\n * each one beside its field. The message names the field and the first\n * reason, for a log line.\n */\nexport function badUserInput(where: string, error: z.ZodError): GraphQLError {\n\treturn errorOf(where, issuesOf(error));\n}\n\n/** The parsed arguments, or the error above, its issues named by `constraintOf`. */\nexport async function parseArgs(\n\tschema: z.ZodType,\n\targs: unknown,\n\twhere: string,\n\tconstraintOf?: ConstraintOf,\n): Promise<unknown> {\n\tconst result = await schema.safeParseAsync(args);\n\tif (!result.success)\n\t\tthrow errorOf(where, issuesOf(result.error, constraintOf));\n\treturn result.data;\n}\n",
6
6
  "import { GraphQLError, type GraphQLErrorOptions } from 'graphql';\n\n/** The code of the error `invalidInputError` builds, and its default message. */\nexport const INVALID_INPUT = 'validation.errors.invalid-input';\n\n/** Values a message is built from, such as `{ min: 2 }`. */\nexport type IssueParams = Record<string, string | number>;\n\n/** One field at fault: where it is, why, and what the reason's message needs. */\nexport interface FieldIssue {\n\t/** The field inside the input, dotted: `person.firstName`, `tags.1`. */\n\treadonly path: string;\n\t/** A code your client and your translations know: `validation.errors.too-short`. */\n\treadonly code: string;\n\t/** Values the message needs; an object with no key counts as none. */\n\treadonly params?: IssueParams;\n}\n\n/** One entry of `extensions.fields`: a `FieldIssue` with its message. */\nexport interface FieldError {\n\treadonly path: string;\n\treadonly code: string;\n\t/** `translate(code, params)`, or the code itself without a translator. */\n\treadonly message: string;\n\t/** Present only when the issue had params with at least one key. */\n\treadonly params?: IssueParams;\n}\n\n/** Turns a code (and its params) into the text a person reads. */\nexport type Translate = (code: string, params?: IssueParams) => string;\n\n/** The options of `invalidInputError`: GraphQL's own, and a translator. */\nexport type InvalidInputOptions = GraphQLErrorOptions & {\n\treadonly translate?: Translate;\n};\n\n/** The options of `fieldsError`: also an HTTP status and the error's own params. */\nexport type FieldsErrorOptions = InvalidInputOptions & {\n\t/** `extensions.http.status`, for a server that reads it (409, ...). */\n\treadonly status?: number;\n\treadonly params?: IssueParams;\n};\n\n/** `params` itself, or `undefined` when it holds no key: never `{}`. */\nfunction paramsOf(params: IssueParams | undefined): IssueParams | undefined {\n\treturn params && Object.keys(params).length > 0 ? params : undefined;\n}\n\nfunction messageOf(\n\tcode: string,\n\tparams: IssueParams | undefined,\n\ttranslate: Translate | undefined,\n): string {\n\treturn translate?.(code, params) ?? code;\n}\n\nfunction fieldsOf(\n\tissues: readonly FieldIssue[],\n\ttranslate: Translate | undefined,\n): FieldError[] {\n\treturn issues.map(({ path, code, params: given }) => {\n\t\tconst params = paramsOf(given);\n\t\treturn {\n\t\t\tpath,\n\t\t\tcode,\n\t\t\tmessage: messageOf(code, params, translate),\n\t\t\t...(params && { params }),\n\t\t};\n\t});\n}\n\n/**\n * One 400 error listing every field at fault, for an API that answers invalid\n * input this way: `extensions` is `{ code: 'validation.errors.invalid-input',\n * http: { status: 400 }, fields }`, each field with its translated message\n * (the code itself without `translate`), in the order given. GraphQL's\n * options (`originalError`, `path`, `nodes`, ...) are kept; an `extensions`\n * among them is replaced by this one.\n */\nexport function invalidInputError(\n\tissues: readonly FieldIssue[],\n\toptions: InvalidInputOptions = {},\n): GraphQLError {\n\tconst { translate, ...graphql } = options;\n\treturn new GraphQLError(messageOf(INVALID_INPUT, undefined, translate), {\n\t\t...graphql,\n\t\textensions: {\n\t\t\tcode: INVALID_INPUT,\n\t\t\thttp: { status: 400 },\n\t\t\tfields: fieldsOf(issues, translate),\n\t\t},\n\t});\n}\n\n/**\n * A refusal of your own (a 409 conflict, say) that names the fields at\n * fault: `extensions` is `{ code, params?, http?: { status }, fields }`, the\n * fields worded as `invalidInputError` words them, the message\n * `translate(code, params)` or the code. An `extensions` among the options\n * is replaced by this one.\n */\nexport function fieldsError(\n\tcode: string,\n\tissues: readonly FieldIssue[],\n\toptions: FieldsErrorOptions = {},\n): GraphQLError {\n\tconst { translate, status, params: given, ...graphql } = options;\n\tconst params = paramsOf(given);\n\treturn new GraphQLError(messageOf(code, params, translate), {\n\t\t...graphql,\n\t\textensions: {\n\t\t\tcode,\n\t\t\t...(params && { params }),\n\t\t\t...(status && { http: { status } }),\n\t\t\tfields: fieldsOf(issues, translate),\n\t\t},\n\t});\n}\n\n/**\n * A GraphQL or Zod path as a `FieldIssue` path: dotted, without the leading\n * `input` argument when a field follows it, a symbol written as\n * `String(key)`. `['input', 'person', 'firstName']` is `person.firstName`,\n * `['input', 'tags', 1]` is `tags.1`, `['first']` and `['input']` stay as\n * they are.\n */\nexport function inputPath(path: readonly PropertyKey[]): string {\n\tconst [first, ...rest] = path;\n\treturn (first === 'input' && rest.length > 0 ? rest : path)\n\t\t.map((key) => String(key))\n\t\t.join('.');\n}\n",
7
7
  "import type { z } from 'zod';\nimport { type FieldIssue, inputPath } from './invalid-input';\n\n/**\n * The codes `fieldIssueOf` gives, each under `validation.errors.`: a string's\n * length (`too-short`, `too-long`), a number's or bigint's bound or multiple\n * (`out-of-range`), a list's or set's size (`too-few`, `too-many`), a named\n * format or a pattern (`invalid-format`), anything else (`invalid`).\n */\nexport const FIELD_CODES = {\n\ttooShort: 'validation.errors.too-short',\n\ttooLong: 'validation.errors.too-long',\n\toutOfRange: 'validation.errors.out-of-range',\n\ttooFew: 'validation.errors.too-few',\n\ttooMany: 'validation.errors.too-many',\n\tinvalidFormat: 'validation.errors.invalid-format',\n\tinvalid: 'validation.errors.invalid',\n} as const;\n\n/** The string checks Zod reports as `invalid_format` that are not a format. */\nconst TEXT_CHECKS: ReadonlySet<string> = new Set([\n\t'starts_with',\n\t'ends_with',\n\t'includes',\n]);\n\n/**\n * A Zod issue as a `FieldIssue`, for `invalidInputError`: its path through\n * `inputPath` (dotted, a leading `input` dropped) and one of `FIELD_CODES`,\n * without params. `too-short` / `too-long` for a string's length,\n * `out-of-range` for a number's or bigint's bound or a multiple, `too-few` /\n * `too-many` for a list's or set's size, `invalid-format` for a named format\n * or a pattern, `invalid` for anything else (a prefix, a suffix or a\n * substring included).\n */\nexport function fieldIssueOf(issue: z.core.$ZodIssue): FieldIssue {\n\treturn { path: inputPath(issue.path), code: codeOf(issue) };\n}\n\nfunction codeOf(issue: z.core.$ZodIssue): string {\n\tswitch (issue.code) {\n\t\tcase 'too_small':\n\t\tcase 'too_big': {\n\t\t\tconst small = issue.code === 'too_small';\n\t\t\tswitch (issue.origin) {\n\t\t\t\tcase 'string':\n\t\t\t\t\treturn small ? FIELD_CODES.tooShort : FIELD_CODES.tooLong;\n\t\t\t\tcase 'number':\n\t\t\t\tcase 'bigint':\n\t\t\t\t\treturn FIELD_CODES.outOfRange;\n\t\t\t\tcase 'array':\n\t\t\t\tcase 'set':\n\t\t\t\t\treturn small ? FIELD_CODES.tooFew : FIELD_CODES.tooMany;\n\t\t\t\tdefault:\n\t\t\t\t\treturn FIELD_CODES.invalid;\n\t\t\t}\n\t\t}\n\t\tcase 'not_multiple_of':\n\t\t\treturn FIELD_CODES.outOfRange;\n\t\tcase 'invalid_format':\n\t\t\t// A prefix, a suffix or a substring is not a format: only a named\n\t\t\t// format (`email`, `uuid`, …) or a pattern is.\n\t\t\treturn TEXT_CHECKS.has(issue.format)\n\t\t\t\t? FIELD_CODES.invalid\n\t\t\t\t: FIELD_CODES.invalidFormat;\n\t\tdefault:\n\t\t\treturn FIELD_CODES.invalid;\n\t}\n}\n",
8
+ "import { GraphQLError } from 'graphql';\nimport type { ValidationIssue } from './bad-user-input';\nimport { FIELD_CODES } from './field-issue-of';\nimport {\n\ttype FieldIssue,\n\ttype InvalidInputOptions,\n\ttype IssueParams,\n\tinputPath,\n\tinvalidInputError,\n} from './invalid-input';\nimport type { ConstraintArgument } from './rules';\n\ninterface Kind {\n\treadonly code: string;\n\t/** The param the declared value is passed on as, when there is one. */\n\treadonly param?: string;\n}\n\n/** The code and the param of each `@constraint` argument; `pattern` has none, so a regex never reaches a client. */\nconst KINDS = {\n\tminLength: { code: FIELD_CODES.tooShort, param: 'min' },\n\tmaxLength: { code: FIELD_CODES.tooLong, param: 'max' },\n\tmin: { code: FIELD_CODES.outOfRange, param: 'min' },\n\tmax: { code: FIELD_CODES.outOfRange, param: 'max' },\n\texclusiveMin: { code: FIELD_CODES.outOfRange, param: 'exclusiveMin' },\n\texclusiveMax: { code: FIELD_CODES.outOfRange, param: 'exclusiveMax' },\n\tmultipleOf: { code: FIELD_CODES.outOfRange, param: 'multipleOf' },\n\tminItems: { code: FIELD_CODES.tooFew, param: 'min' },\n\tmaxItems: { code: FIELD_CODES.tooMany, param: 'max' },\n\tformat: { code: FIELD_CODES.invalidFormat, param: 'format' },\n\tpattern: { code: FIELD_CODES.invalidFormat },\n} as const satisfies Partial<Record<ConstraintArgument, Kind>>;\n\nfunction fieldOf(issue: ValidationIssue): FieldIssue {\n\tconst kind: Kind | undefined = issue.constraint\n\t\t? (KINDS as Partial<Record<string, Kind>>)[issue.constraint]\n\t\t: undefined;\n\tconst path = inputPath(issue.path);\n\tif (!kind) return { path, code: FIELD_CODES.invalid };\n\tconst params: IssueParams | undefined =\n\t\tkind.param && issue.value !== undefined\n\t\t\t? { [kind.param]: issue.value }\n\t\t\t: undefined;\n\treturn { path, code: kind.code, ...(params && { params }) };\n}\n\n/** The issues of a `BAD_USER_INPUT` error, direct or wrapped by graphql-js. */\nfunction issuesOf(error: GraphQLError): readonly ValidationIssue[] | undefined {\n\tconst source =\n\t\terror.extensions['code'] === 'BAD_USER_INPUT' ? error : error.originalError;\n\tif (!(source instanceof GraphQLError)) return undefined;\n\tif (source.extensions['code'] !== 'BAD_USER_INPUT') return undefined;\n\tconst issues = source.extensions['issues'];\n\treturn Array.isArray(issues) ? issues : undefined;\n}\n\n/**\n * The `invalidInputError` of a `@constraint` refusal: a `BAD_USER_INPUT`\n * error as `withValidation` / `validated` throw it, or one whose\n * `originalError` is (graphql-js wraps it with the field's location). Each\n * issue becomes a field `{ path, code, params }`: `too-short` / `too-long`\n * (`minLength`, `maxLength`), `out-of-range` (`min`, `max`, `exclusiveMin`,\n * `exclusiveMax`, `multipleOf`), `too-few` / `too-many` (`minItems`,\n * `maxItems`), `invalid-format` (`format`, `pattern`), `invalid` for the rest,\n * an issue with no `constraint` included. `params` is the declared value\n * under the argument's own key (`{ min }`, `{ max }`, `{ exclusiveMin }`,\n * `{ exclusiveMax }`, `{ multipleOf }`, `{ format }`), none for `pattern`.\n * The location (`nodes`, `source`, `positions`, `path`) is kept and\n * `originalError` is the error given. Any other error is returned as it is\n * (the same object).\n */\nexport function invalidInputOf(\n\terror: GraphQLError,\n\toptions: Pick<InvalidInputOptions, 'translate'> = {},\n): GraphQLError {\n\tconst issues = issuesOf(error);\n\tif (!issues) return error;\n\treturn invalidInputError(issues.map(fieldOf), {\n\t\t...options,\n\t\tnodes: error.nodes ?? null,\n\t\tsource: error.source ?? null,\n\t\tpositions: error.positions ?? null,\n\t\tpath: error.path ?? null,\n\t\toriginalError: error,\n\t});\n}\n",
8
9
  "import {\n\tGraphQLError,\n\ttype SelectionSetNode,\n\ttype ValidationContext,\n\ttype ValidationRule,\n} from 'graphql';\nimport { assertInteger, operationLabel } from './describe';\nimport {\n\ttype FragmentWalk,\n\tfragmentValue,\n\tNO_KEY,\n\tnewFragmentWalk,\n} from './fragments';\nimport { isIntrospectionRoot } from './introspection';\n\n/** Options of {@link maxDepth}. */\nexport interface MaxDepthOptions {\n\t/** The deepest nesting of field selections an operation may have (at least 1). */\n\tdepth: number;\n\t/**\n\t * Do not count `__schema` and `__type` (default `false`). Only where\n\t * introspection is disabled or the client is trusted, e.g. GraphiQL in\n\t * development: the standard introspection query (`getIntrospectionQuery()`) is 15 levels deep.\n\t */\n\tignoreIntrospection?: boolean;\n}\n\n/** What a walk of one document needs: the options, and what it has measured so far. */\ninterface DepthContext extends FragmentWalk {\n\tignoreIntrospection: boolean;\n}\n\n/** The depth of `selectionSet`: 0 when it selects no field. */\nfunction depthOf(depth: DepthContext, selectionSet: SelectionSetNode): number {\n\tlet deepest = 0;\n\tfor (const selection of selectionSet.selections) {\n\t\tlet here = 0;\n\t\tif (selection.kind === 'Field') {\n\t\t\tconst name = selection.name.value;\n\t\t\tif (name === '__typename') continue;\n\t\t\tif (depth.ignoreIntrospection && isIntrospectionRoot(name)) continue;\n\t\t\there =\n\t\t\t\t1 +\n\t\t\t\t(selection.selectionSet ? depthOf(depth, selection.selectionSet) : 0);\n\t\t} else if (selection.kind === 'InlineFragment') {\n\t\t\there = depthOf(depth, selection.selectionSet);\n\t\t} else {\n\t\t\there = fragmentDepth(depth, selection.name.value);\n\t\t}\n\t\tif (here > deepest) deepest = here;\n\t}\n\treturn deepest;\n}\n\n/** The depth of the named fragment, measured once. */\nfunction fragmentDepth(depth: DepthContext, name: string): number {\n\treturn fragmentValue(depth, name, NO_KEY, (fragment) =>\n\t\tdepthOf(depth, fragment.selectionSet),\n\t);\n}\n\n/**\n * A graphql-js validation rule refusing an operation nested deeper than\n * `depth` fields: a top-level field is depth 1.\n *\n * Named fragments are followed (each measured once), inline fragments add no\n * depth, and `__typename` does not count. One `GraphQLError` per\n * operation, with `extensions: { code: 'QUERY_TOO_DEEP', depth, limit }`,\n * `depth` being the operation's real depth.\n *\n * ```ts\n * validate(schema, document, [...specifiedRules, maxDepth({ depth: 8 })]);\n * // graphql-yoga: onValidate: ({ addValidationRule }) => addValidationRule(maxDepth({ depth: 8 }))\n * ```\n */\nexport function maxDepth(options: MaxDepthOptions): ValidationRule {\n\tconst limit = options.depth;\n\tassertInteger('maxDepth: depth', limit, 1);\n\treturn (context: ValidationContext) => {\n\t\tconst walk: DepthContext = {\n\t\t\t...newFragmentWalk((name) => context.getFragment(name)),\n\t\t\tignoreIntrospection: options.ignoreIntrospection ?? false,\n\t\t};\n\t\treturn {\n\t\t\tOperationDefinition(operation) {\n\t\t\t\tconst depth = depthOf(walk, operation.selectionSet);\n\t\t\t\tif (depth > limit) {\n\t\t\t\t\tcontext.reportError(\n\t\t\t\t\t\tnew GraphQLError(\n\t\t\t\t\t\t\t`${operationLabel(operation)} is ${depth} levels deep, more than the ${limit} allowed`,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnodes: [operation],\n\t\t\t\t\t\t\t\textensions: { code: 'QUERY_TOO_DEEP', depth, limit },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t};\n\t};\n}\n",
9
10
  "import type { OperationDefinitionNode } from 'graphql';\n\n/** Costs and counts are plain numbers, held below this so a hostile query never reaches `Infinity`. */\nexport const CEILING = Number.MAX_SAFE_INTEGER;\n\n/** `a + b`, clamped where a number stops being exact. */\nexport const add = (a: number, b: number) => Math.min(CEILING, a + b);\n\n/** `Operation \"Name\"`, or `Operation` for an anonymous one. */\nexport function operationLabel(operation: OperationDefinitionNode): string {\n\treturn operation.name ? `Operation \"${operation.name.value}\"` : 'Operation';\n}\n\n/**\n * Throws a `RangeError` unless `value` is an integer from `min` up to, and\n * excluding, `max` (default: `Number.MAX_SAFE_INTEGER`, where a cost is clamped).\n */\nexport function assertInteger(\n\toption: string,\n\tvalue: number,\n\tmin: number,\n\tmax = CEILING,\n): void {\n\tif (!Number.isInteger(value) || value < min || value >= max) {\n\t\tthrow new RangeError(\n\t\t\t`${option} must be an integer from ${min} to ${max - 1}.`,\n\t\t);\n\t}\n}\n",
10
11
  "import type { FragmentDefinitionNode } from 'graphql';\n\n/** The key of a fragment whose value does not depend on anything but its name. */\nexport const NO_KEY = -1;\n\n/** What the fragment walk of one document keeps: the fragments, and what each was worth. */\nexport interface FragmentWalk {\n\tgetFragment: (name: string) => FragmentDefinitionNode | null | undefined;\n\tvalues: Map<string, Map<number, number>>;\n\tvisiting: Set<string>;\n}\n\n/** An empty walk over the fragments of one document. */\nexport function newFragmentWalk(\n\tgetFragment: FragmentWalk['getFragment'],\n): FragmentWalk {\n\treturn { getFragment, values: new Map(), visiting: new Set() };\n}\n\n/**\n * The value of the named fragment under `key`, computed once. `key` is a number,\n * or a function of what is already known for this fragment (`maxListCost` rounds\n * its pending size by it). A fragment reached while it is being computed is a\n * cycle, NoFragmentCyclesRule's to report: its back-edge adds nothing (0).\n */\nexport function fragmentValue(\n\twalk: FragmentWalk,\n\tname: string,\n\tkey: number | ((known: ReadonlyMap<number, number>) => number),\n\tcompute: (fragment: FragmentDefinitionNode, key: number) => number,\n): number {\n\tlet known = walk.values.get(name);\n\tif (!known) {\n\t\tknown = new Map();\n\t\twalk.values.set(name, known);\n\t}\n\tconst at = typeof key === 'number' ? key : key(known);\n\tconst memo = known.get(at);\n\tif (memo !== undefined) return memo;\n\tconst fragment = walk.getFragment(name);\n\tif (!fragment || walk.visiting.has(name)) return 0;\n\twalk.visiting.add(name);\n\tconst result = compute(fragment, at);\n\twalk.visiting.delete(name);\n\tknown.set(at, result);\n\treturn result;\n}\n",
@@ -19,7 +20,7 @@
19
20
  "import type { GraphQLFieldResolver, GraphQLResolveInfo } from 'graphql';\nimport { z } from 'zod';\nimport { parseArgs } from './bad-user-input';\n\n/** An object schema of the arguments, or its shape. */\nexport type ArgsSchema = z.ZodType<Record<string, unknown>> | z.ZodRawShape;\n\n/** The schema `ArgsSchema` stands for. */\nexport type SchemaOf<S extends ArgsSchema> = S extends z.ZodType\n\t? S\n\t: S extends z.ZodRawShape\n\t\t? // Mapped, not `S & z.ZodRawShape`: the intersection's index signature\n\t\t\t// would type every argument `unknown`.\n\t\t\tz.ZodObject<{ [K in keyof S]: S[K] }>\n\t\t: never;\n\n/**\n * What `validated` takes: the schema, or a function that builds it for each\n * call from the request's context and the field's `info`, for checks that\n * need them (a uniqueness query in the request's database, a rule that\n * depends on the viewer).\n */\nexport type ArgsSchemaFor<S extends ArgsSchema, TContext = unknown> =\n\t| S\n\t| SchemaFactory<S, TContext>;\n\ntype SchemaFactory<S extends ArgsSchema, TContext> = (\n\tcontext: TContext,\n\tinfo: GraphQLResolveInfo,\n) => S | Promise<S>;\n\n/**\n * A resolver whose arguments are checked by `schema` before it runs, for what\n * a `@constraint` cannot say: a rule across arguments, a business refinement,\n * an async check. It receives the parsed arguments (`z.output`), defaults and\n * transforms applied; an invalid input is the same `BAD_USER_INPUT` error as\n * the directives'.\n *\n * ```ts\n * signUp: validated(\n * z.object({ input: signUpSchema }).refine(({ input }) => input.password !== input.email),\n * (_, { input }) => users.create(input),\n * )\n * ```\n *\n * A check that needs the request takes a function in place of the schema:\n * it is called on each call, with the context and `info`, and returns the\n * schema (or a promise of it). What it throws reaches the client as it is,\n * not as `BAD_USER_INPUT`.\n *\n * ```ts\n * rename: validated(\n * (ctx: Context) => ({\n * name: z.string().refine(async (name) => !(await ctx.db.users.exists({ name })), 'taken'),\n * }),\n * (_, { name }, ctx) => ctx.db.users.rename(ctx.viewer, name),\n * )\n * ```\n */\nexport function validated<\n\tS extends ArgsSchema,\n\tTSource = unknown,\n\tTContext = unknown,\n\tTResult = unknown,\n>(\n\tschema: SchemaFactory<S, TContext>,\n\tresolve: (\n\t\tsource: TSource,\n\t\targs: z.output<SchemaOf<S>>,\n\t\tcontext: TContext,\n\t\tinfo: GraphQLResolveInfo,\n\t) => TResult,\n): GraphQLFieldResolver<\n\tTSource,\n\tTContext,\n\tz.input<SchemaOf<S>>,\n\tPromise<Awaited<TResult>>\n>;\nexport function validated<\n\tS extends ArgsSchema,\n\tTSource = unknown,\n\tTContext = unknown,\n\tTResult = unknown,\n>(\n\tschema: S,\n\tresolve: (\n\t\tsource: TSource,\n\t\targs: z.output<SchemaOf<S>>,\n\t\tcontext: TContext,\n\t\tinfo: GraphQLResolveInfo,\n\t) => TResult,\n): GraphQLFieldResolver<\n\tTSource,\n\tTContext,\n\tz.input<SchemaOf<S>>,\n\tPromise<Awaited<TResult>>\n>;\nexport function validated<\n\tS extends ArgsSchema,\n\tTSource = unknown,\n\tTContext = unknown,\n\tTResult = unknown,\n>(\n\tschema: ArgsSchemaFor<S, TContext>,\n\tresolve: (\n\t\tsource: TSource,\n\t\targs: z.output<SchemaOf<S>>,\n\t\tcontext: TContext,\n\t\tinfo: GraphQLResolveInfo,\n\t) => TResult,\n): GraphQLFieldResolver<\n\tTSource,\n\tTContext,\n\tz.input<SchemaOf<S>>,\n\tPromise<Awaited<TResult>>\n>;\nexport function validated<\n\tS extends ArgsSchema,\n\tTSource = unknown,\n\tTContext = unknown,\n\tTResult = unknown,\n>(\n\tschema: ArgsSchemaFor<S, TContext>,\n\tresolve: (\n\t\tsource: TSource,\n\t\targs: z.output<SchemaOf<S>>,\n\t\tcontext: TContext,\n\t\tinfo: GraphQLResolveInfo,\n\t) => TResult,\n): GraphQLFieldResolver<\n\tTSource,\n\tTContext,\n\tz.input<SchemaOf<S>>,\n\tPromise<Awaited<TResult>>\n> {\n\tconst fixed = typeof schema === 'function' ? undefined : zodOf(schema);\n\treturn async (source, args, context, info): Promise<Awaited<TResult>> => {\n\t\tconst where = `${info.parentType.name}.${info.fieldName}`;\n\t\tconst checked =\n\t\t\tfixed ??\n\t\t\tzodOf(await (schema as SchemaFactory<S, TContext>)(context, info));\n\t\tconst parsed = (await parseArgs(checked, args, where)) as z.output<\n\t\t\tSchemaOf<S>\n\t\t>;\n\t\treturn await resolve(source, parsed, context, info);\n\t};\n}\n\n/** The schema itself, or the object schema of a shape. */\nfunction zodOf(schema: ArgsSchema): z.ZodType {\n\t// `_zod`, not `instanceof`: a schema from another copy of zod is still one.\n\treturn (\n\t\t'_zod' in schema ? schema : z.object(schema as z.ZodRawShape)\n\t) as z.ZodType;\n}\n",
20
21
  "import {\n\tdefaultFieldResolver,\n\ttype GraphQLField,\n\ttype GraphQLFieldResolver,\n\ttype GraphQLSchema,\n} from 'graphql';\nimport type { z } from 'zod';\nimport { type ConstraintOf, parseArgs } from './bad-user-input';\nimport { checkConstraints } from './builder/check-constraints';\nimport type { FormatSchemas, OwnFormats } from './formats/registry';\nimport { constraintOf } from './rules';\n\n// Symbol.for: two copies of the package in one tree still wrap a field once.\nconst wrapped = Symbol.for('@nxgt/graphql-validation/wrapped');\n// The formats a schema was wrapped with, kept on the schema itself.\nconst wrappedWith = Symbol.for('@nxgt/graphql-validation/formats');\n\n/** What `withValidation` takes besides the schema. */\nexport interface WithValidationOptions<\n\tF extends FormatSchemas = FormatSchemas,\n> {\n\t/**\n\t * The application's own formats, which `@constraint(format: \"...\")` may\n\t * name beside the built-in ones: one Zod string schema each, keyed by its\n\t * name (lowercase letters, digits and hyphens). A built-in name is a type\n\t * error, and refused at startup.\n\t */\n\treadonly formats?: OwnFormats<F>;\n}\n\ntype Resolver = GraphQLFieldResolver<unknown, unknown> & { [wrapped]?: true };\n\nfunction checking(\n\tschema: z.ZodType,\n\twhere: string,\n\tresolve: Resolver,\n\tconstraintOf: ConstraintOf,\n): Resolver {\n\tconst check: Resolver = async (source, args, context, info) =>\n\t\tawait resolve(\n\t\t\tsource,\n\t\t\tawait parseArgs(schema, args, where, constraintOf),\n\t\t\tcontext,\n\t\t\tinfo,\n\t\t);\n\tcheck[wrapped] = true;\n\treturn check;\n}\n\n/**\n * Wraps a field once. A subscription field is checked in `subscribe`, which\n * runs once per subscription — graphql's default one when the field has none\n * — and its `resolve` runs once per event, with the same arguments, already\n * checked.\n */\nfunction wrap(\n\tfield: GraphQLField<unknown, unknown>,\n\targs: z.ZodType,\n\twhere: string,\n\tsubscription: boolean,\n\tconstraintOf: ConstraintOf,\n): void {\n\tconst subscribe = (field.subscribe ??\n\t\t(subscription ? defaultFieldResolver : undefined)) as Resolver | undefined;\n\tif (subscribe) {\n\t\tif (!subscribe[wrapped])\n\t\t\tfield.subscribe = checking(args, where, subscribe, constraintOf);\n\t\treturn;\n\t}\n\tconst resolve = (field.resolve ?? defaultFieldResolver) as Resolver;\n\tif (!resolve[wrapped])\n\t\tfield.resolve = checking(args, where, resolve, constraintOf);\n}\n\n/**\n * Checks every `@constraint` of `schema` before the resolvers run. Each\n * field with a constrained argument — directly, or anywhere inside an input\n * type it takes — gets its resolver (and its `subscribe`) wrapped: the\n * arguments are parsed by the Zod schema the directives describe, the\n * resolver receives the parsed value, and an invalid input becomes one\n * `BAD_USER_INPUT` error. Fields with nothing to check are left untouched.\n *\n * The schema is built here, once: a constraint that cannot apply (a\n * `minLength` on an `Int`, an unknown format, a bad pattern) throws now, not\n * on the first request. The resolvers are wrapped in place and the same\n * schema is returned, so it goes wherever it went before; calling it twice\n * wraps nothing twice. Call it last, once every resolver is attached: a\n * resolver set on a field afterwards replaces the check.\n *\n * A `@constraint` on an interface's argument must be repeated on each\n * object's field, which is the one that resolves; a field that drops it\n * fails here.\n *\n * The directives are read from the SDL (`astNode`), so a schema built from\n * type definitions — `buildSchema`, `makeExecutableSchema`, Yoga, Apollo —\n * is checked; a code-first schema with no SDL has no `@constraint` to read.\n *\n * `options.formats` adds the application's own formats; wrapping a schema\n * again throws unless the record has the same names, each the very same\n * schema (no formats after some, or some after none, throws too), since its\n * fields are already checked against the first ones.\n */\nexport function withValidation<\n\tS extends GraphQLSchema,\n\t// biome-ignore lint/complexity/noBannedTypes: no formats of its own by default\n\tconst F extends FormatSchemas = {},\n>(schema: S, options: WithValidationOptions<F> = {}): S {\n\tconst formats: FormatSchemas = options.formats ?? {};\n\tconst holder = schema as unknown as { [wrappedWith]?: FormatSchemas };\n\tconst before = holder[wrappedWith];\n\tif (before && !sameFormats(before, formats)) {\n\t\tthrow new Error(\n\t\t\t'withValidation: this schema is already wrapped with other formats. Call withValidation once, with every format.',\n\t\t);\n\t}\n\tconst directive = checkConstraints(\n\t\tschema,\n\t\t(type, field, args, declared) => {\n\t\t\tconst subscription = type === schema.getSubscriptionType();\n\t\t\t// The rule that refused, with the value this field's SDL declares at the path.\n\t\t\tconst named: ConstraintOf = (issue) => {\n\t\t\t\tconst argument = constraintOf(issue);\n\t\t\t\tif (!argument) return undefined;\n\t\t\t\t// Found: the SDL carries the constraints (interfaces repeat theirs,\n\t\t\t\t// assertInterfaceConstraintsKept), so a miss drops `constraint` by design.\n\t\t\t\tconst found = declared(issue.path).find(\n\t\t\t\t\t({ rule }) => rule.argument === argument,\n\t\t\t\t);\n\t\t\t\treturn found && { argument, value: found.value };\n\t\t\t};\n\t\t\twrap(field, args, `${type.name}.${field.name}`, subscription, named);\n\t\t},\n\t\tformats,\n\t);\n\tif (!directive) {\n\t\tthrow new Error(\n\t\t\t'withValidation: this schema declares no @constraint directive. Add constraintTypeDefs to its type definitions.',\n\t\t);\n\t}\n\tif (!before) Object.defineProperty(schema, wrappedWith, { value: formats });\n\treturn schema;\n}\n\n/** The same names, each the very same schema. */\nfunction sameFormats(a: FormatSchemas, b: FormatSchemas): boolean {\n\tconst names = Object.keys(a);\n\treturn (\n\t\tnames.length === Object.keys(b).length &&\n\t\tnames.every((name) => Object.hasOwn(b, name) && a[name] === b[name])\n\t);\n}\n"
21
22
  ],
22
- "mappings": "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",
23
- "debugId": "B1856E23719B140164756E2164756E21",
23
+ "mappings": "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",
24
+ "debugId": "272206072C5FB7A264756E2164756E21",
24
25
  "names": []
25
26
  }
@@ -0,0 +1,19 @@
1
+ import { GraphQLError } from 'graphql';
2
+ import { type InvalidInputOptions } from './invalid-input.js';
3
+ /**
4
+ * The `invalidInputError` of a `@constraint` refusal: a `BAD_USER_INPUT`
5
+ * error as `withValidation` / `validated` throw it, or one whose
6
+ * `originalError` is (graphql-js wraps it with the field's location). Each
7
+ * issue becomes a field `{ path, code, params }`: `too-short` / `too-long`
8
+ * (`minLength`, `maxLength`), `out-of-range` (`min`, `max`, `exclusiveMin`,
9
+ * `exclusiveMax`, `multipleOf`), `too-few` / `too-many` (`minItems`,
10
+ * `maxItems`), `invalid-format` (`format`, `pattern`), `invalid` for the rest,
11
+ * an issue with no `constraint` included. `params` is the declared value
12
+ * under the argument's own key (`{ min }`, `{ max }`, `{ exclusiveMin }`,
13
+ * `{ exclusiveMax }`, `{ multipleOf }`, `{ format }`), none for `pattern`.
14
+ * The location (`nodes`, `source`, `positions`, `path`) is kept and
15
+ * `originalError` is the error given. Any other error is returned as it is
16
+ * (the same object).
17
+ */
18
+ export declare function invalidInputOf(error: GraphQLError, options?: Pick<InvalidInputOptions, 'translate'>): GraphQLError;
19
+ //# sourceMappingURL=invalid-input-of.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalid-input-of.d.ts","sourceRoot":"","sources":["../src/invalid-input-of.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAEN,KAAK,mBAAmB,EAIxB,MAAM,iBAAiB,CAAC;AA+CzB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC7B,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAM,GAClD,YAAY,CAWd"}
package/docs/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  | Page | Read it when |
6
6
  | --- | --- |
7
7
  | [Constraints](guide/constraints.md) | you write `@constraint` in your schema: setup with `withValidation`, every argument and its Zod equivalent, the formats and your own, lists and nested inputs |
8
- | [Answering invalid input as one error](guide/invalid-input.md) | your API answers invalid input as one 400 error with a list of fields (`invalidInputError`, `fieldIssueOf` for a Zod parse), or a refusal such as a 409 names the fields at fault (`fieldsError`) |
8
+ | [Answering invalid input as one error](guide/invalid-input.md) | your API answers invalid input as one 400 error with a list of fields (`invalidInputError`, `fieldIssueOf` for a Zod parse, `invalidInputOf` for a `@constraint` refusal), or a refusal such as a 409 names the fields at fault (`fieldsError`) |
9
9
  | [Limiting the depth and cost of a query](guide/query-limits.md) | a schema has list cycles and you want to refuse a query nested too deep, too costly or too wide (`maxDepth`, `maxListCost`, `maxFields`), with graphql-js `validate` or graphql-yoga |
10
10
  | [Errors](guide/errors.md) | you handle the `BAD_USER_INPUT` error in a client, build it yourself with `badUserInput`, or add rules a directive cannot say with `validated` |
11
11
 
@@ -146,6 +146,50 @@ const issueOf = (issue: z.core.$ZodIssue): FieldIssue =>
146
146
  : fieldIssueOf(issue);
147
147
  ```
148
148
 
149
+ ## From a `@constraint` refusal
150
+
151
+ `invalidInputOf(error, { translate })` turns the `BAD_USER_INPUT`
152
+ error of `withValidation` / `validated`, thrown directly or wrapped by
153
+ graphql-js (its `originalError`), into `invalidInputError`'s shape, so a
154
+ server answers one error whatever raised it. Any other error comes back as
155
+ it is, and the given error becomes the new one's `originalError`; the
156
+ location (`nodes`, `source`, `positions`, `path`) is kept.
157
+
158
+ | `@constraint` argument | `code` (under `validation.errors.`) | `params` |
159
+ | --- | --- | --- |
160
+ | `minLength` / `maxLength` | `too-short` / `too-long` | `{ min }` / `{ max }` |
161
+ | `min` / `max` | `out-of-range` | `{ min }` / `{ max }` |
162
+ | `exclusiveMin` / `exclusiveMax` | `out-of-range` | `{ exclusiveMin }` / `{ exclusiveMax }` |
163
+ | `multipleOf` | `out-of-range` | `{ multipleOf }` |
164
+ | `minItems` / `maxItems` | `too-few` / `too-many` | `{ min }` / `{ max }` |
165
+ | `format` | `invalid-format` | `{ format }` (`'email'`) |
166
+ | `pattern` | `invalid-format` | none, the regex never reaches a client |
167
+ | `startsWith`, `endsWith`, `contains`, `notContains`, or an issue with no `constraint` | `invalid` | none |
168
+
169
+ The exclusive bounds keep their own keys, so a message can say "more than
170
+ {exclusiveMin}" rather than "at least {min}" for a refused `0`.
171
+
172
+ ```ts
173
+ import { invalidInputOf } from '@nxgt/graphql-validation';
174
+
175
+ const plugin = {
176
+ onExecute: () => ({
177
+ onExecuteDone: ({ result, setResult }) => {
178
+ if (!('errors' in result) || !result.errors) return;
179
+ setResult({
180
+ ...result,
181
+ errors: result.errors.map((error) =>
182
+ invalidInputOf(error, { translate: t }),
183
+ ),
184
+ });
185
+ },
186
+ }),
187
+ };
188
+ // maxLength: 100 refused:
189
+ // fields: [{ path: 'person.name', code: 'validation.errors.too-long',
190
+ // message: '…', params: { max: 100 } }]
191
+ ```
192
+
149
193
  `inputPath` turns a GraphQL or Zod path into a dotted one, dropping the
150
194
  leading `input` argument: `inputPath(['input', 'person', 'firstName'])` is
151
195
  `person.firstName`, `['input', 'tags', 1]` is `tags.1`; a path that does not
@@ -216,6 +260,12 @@ interface FieldError {
216
260
 
217
261
  type Translate = (code: string, params?: IssueParams) => string;
218
262
 
263
+ /** A `@constraint` refusal as `invalidInputError`; any other error as it is. */
264
+ declare function invalidInputOf(
265
+ error: GraphQLError,
266
+ options?: { readonly translate?: Translate },
267
+ ): GraphQLError;
268
+
219
269
  type InvalidInputOptions = GraphQLErrorOptions & { readonly translate?: Translate };
220
270
  type FieldsErrorOptions = InvalidInputOptions & {
221
271
  readonly status?: number;
package/docs/roadmap.md CHANGED
@@ -14,10 +14,14 @@ Nothing planned yet.
14
14
 
15
15
  - **Emit the invalid-input shape directly.** An option for `withValidation`
16
16
  and `validated` to raise the `invalidInputError` shape in place of
17
- `BAD_USER_INPUT`, so an API using it needs no mapping of its own.
17
+ `BAD_USER_INPUT`, so an API using it needs no mapping of its own. Today
18
+ `invalidInputOf` converts the refusal after the fact.
18
19
 
19
20
  ## Shipped
20
21
 
22
+ - **Constraint refusals as invalid input** — `invalidInputOf` converts a
23
+ `@constraint` `BAD_USER_INPUT` refusal into `invalidInputError`, with the
24
+ declared value as `params`.
21
25
  - **Relay connection sizing** — `maxListCost` sizes the `edges` and `nodes` of
22
26
  a connection from the connection field's size argument (`items(first: 100)
23
27
  { edges { … } }`), not `defaultFirst`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxgt/graphql-validation",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
4
  "description": "Validate GraphQL arguments and input fields with @constraint directives, checked by Zod schemas, for graphql 16 and 17",
5
5
  "license": "MIT",
6
6
  "type": "module",