@nxgt/janus-graphql 0.5.3 → 0.6.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 +2 -2
- package/dist/errors.d.ts +2 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/index.js +10 -7
- package/dist/index.js.map +4 -4
- package/docs/guide/errors.md +20 -1
- package/docs/guide/step-up.md +5 -2
- package/docs/roadmap.md +6 -0
- package/docs/troubleshooting.md +20 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -203,12 +203,12 @@ every one carries a `code` and the HTTP status Yoga answers with:
|
|
|
203
203
|
| `STEP_UP_REQUIRED` | 403 | A session older than `@fresh(maxAge)` or `requireFresh()` allows: ask for a step-up, then send the request again |
|
|
204
204
|
| `NOT_FOUND` | 404 | A `@permission` denied — its default — or a loader answered `null`; `denial('NOT_FOUND')` |
|
|
205
205
|
| `SERVICE_UNAVAILABLE` | 503 | A store could not answer — `STORE_FAILED`. **Never a denial** |
|
|
206
|
-
| any other `JanusErrorCode` | its [`statusOf`](https://github.com/softistx/nxgt-janus/blob/develop/packages/janus/docs/guide/errors.md) | A `JanusError` a resolver let through: `CREDENTIALS_INVALID` 401, `LOGIN_TAKEN` 409, … |
|
|
206
|
+
| any other `JanusErrorCode` | its [`statusOf`](https://github.com/softistx/nxgt-janus/blob/develop/packages/janus/docs/guide/errors.md) | A `JanusError` a resolver let through: `CREDENTIALS_INVALID` 401, `MAIL_THROTTLED` 429, `LOGIN_TAKEN` 409, … |
|
|
207
207
|
|
|
208
208
|
The status sits in `extensions.http.status`, which Yoga reads to answer the
|
|
209
209
|
HTTP response and strips from the body. `USER_INVALID` adds `issues`,
|
|
210
210
|
`PASSWORD_TOO_SHORT` `minLength`, `CODE_INVALID` `attemptsLeft`, and a
|
|
211
|
-
throttled `CREDENTIALS_INVALID` `retryAfter` — with a `Retry-After` header in
|
|
211
|
+
throttled `CREDENTIALS_INVALID` or `MAIL_THROTTLED` `retryAfter` — with a `Retry-After` header in
|
|
212
212
|
`extensions.http.headers`, which Yoga answers with; nothing
|
|
213
213
|
else — never `reason`, `login`, a hash prefix or a cause. The message is a
|
|
214
214
|
fixed one per status, never the core's: read `code`. Detail, and the status of a
|
package/dist/errors.d.ts
CHANGED
|
@@ -14,7 +14,8 @@ export declare function denial(code: DenialCode, message?: string): GraphQLError
|
|
|
14
14
|
* A `JanusError` as the client may read it: its code and status, and only
|
|
15
15
|
* what the client can act on — `issues`, `minLength`, `attemptsLeft`,
|
|
16
16
|
* `retryAfter`. Never `reason`, `login`, `slot` or a cause: those are for
|
|
17
|
-
* your logs. A throttled sign-in
|
|
17
|
+
* your logs. A throttled sign-in, and a request past its e-mails
|
|
18
|
+
* (`MAIL_THROTTLED`, 429), also carry their `Retry-After` header in
|
|
18
19
|
* `http.headers`, which Yoga answers with.
|
|
19
20
|
*
|
|
20
21
|
* `STORE_FAILED` is `SERVICE_UNAVAILABLE` 503 — **an outage is never a
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAmC,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,mFAAmF;AACnF,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,WAAW,GAAG,WAAW,CAAC;AAEvE,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAKvE;AAaD
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAmC,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,mFAAmF;AACnF,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,WAAW,GAAG,WAAW,CAAC;AAEvE,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAKvE;AAaD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAQjE;AA6DD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAE9C;AAED,kDAAkD;AAClD,MAAM,MAAM,SAAS,GAAG,CACvB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,OAAO,KACX,KAAK,CAAC;AAEX,qCAAqC;AACrC,MAAM,WAAW,qBAAqB;IACrC;;;;;;;;;OASG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC;IACjD,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,cAAc,CAC7B,OAAO,GAAE,qBAAqB,GAAG,SAAc,GAC7C,SAAS,CAqBX"}
|
package/dist/index.js
CHANGED
|
@@ -229,6 +229,8 @@ function messageOf(status) {
|
|
|
229
229
|
return "Not found";
|
|
230
230
|
case 409:
|
|
231
231
|
return "Conflict";
|
|
232
|
+
case 429:
|
|
233
|
+
return "Too many requests, retry later";
|
|
232
234
|
case 503:
|
|
233
235
|
return "The service is unavailable, retry later";
|
|
234
236
|
case 500:
|
|
@@ -248,6 +250,7 @@ function actionable(error) {
|
|
|
248
250
|
case "CODE_INVALID":
|
|
249
251
|
return error.attemptsLeft === undefined ? {} : { attemptsLeft: error.attemptsLeft };
|
|
250
252
|
case "CREDENTIALS_INVALID":
|
|
253
|
+
case "MAIL_THROTTLED":
|
|
251
254
|
return error.retryAfter === undefined ? {} : { retryAfter: error.retryAfter };
|
|
252
255
|
default:
|
|
253
256
|
return {};
|
|
@@ -483,20 +486,20 @@ function readField(schema, field, fieldName, typeName) {
|
|
|
483
486
|
const permission = [];
|
|
484
487
|
for (const { where, onType, node } of locations(schema, field, fieldName, typeName)) {
|
|
485
488
|
for (const args of getDirective(schema, node, "authenticated") ?? []) {
|
|
486
|
-
const types = args
|
|
489
|
+
const types = args["type"];
|
|
487
490
|
authenticated.push({ where, types: types ?? null });
|
|
488
491
|
}
|
|
489
492
|
for (const args of getDirective(schema, node, "fresh") ?? []) {
|
|
490
|
-
fresh.push({ where, maxAge: args
|
|
493
|
+
fresh.push({ where, maxAge: args["maxAge"] });
|
|
491
494
|
}
|
|
492
495
|
for (const args of getDirective(schema, node, "permission") ?? []) {
|
|
493
496
|
permission.push({
|
|
494
497
|
where,
|
|
495
498
|
onType,
|
|
496
|
-
name: args
|
|
497
|
-
type: args
|
|
498
|
-
id: args
|
|
499
|
-
onDeny: args
|
|
499
|
+
name: args["name"],
|
|
500
|
+
type: args["type"],
|
|
501
|
+
id: args["id"] ?? null,
|
|
502
|
+
onDeny: args["onDeny"] === "FORBIDDEN" ? "FORBIDDEN" : "NOT_FOUND"
|
|
500
503
|
});
|
|
501
504
|
}
|
|
502
505
|
}
|
|
@@ -870,5 +873,5 @@ export {
|
|
|
870
873
|
useJanus
|
|
871
874
|
};
|
|
872
875
|
|
|
873
|
-
//# debugId=
|
|
876
|
+
//# debugId=71A9D0C2D2FB488364756E2164756E21
|
|
874
877
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
"/**\n * The credential a graphql-ws connection presents, and the connections\n * `janusConnection().onConnect` accepted: what each operation on one is\n * authenticated from.\n */\n\nimport type { RequestLike } from '@nxgt/janus';\nimport type { ConnectionContext } from './types';\n\n/** Where the upgrade request is, when the transport does not say `extra.request`. */\nexport type Upgrade = (ctx: ConnectionContext) => RequestLike | undefined;\n\n/** The scheme `@nxgt/janus` reads a session token from — any case, as it does. */\nconst BEARER = /^\\s*bearer(?:\\s|$)/i;\n\n/**\n * The connection's credential, as `auth.authenticate` reads one:\n *\n * 1. `connectionParams.authorization`, when it is a `Bearer` token — a\n * non-browser client's `'Bearer <token>'`;\n * 2. otherwise the upgrade request itself, read as any request is —\n * `Authorization`, then `X-Session-Token`, then the session cookie a\n * browser sends with it.\n *\n * **The first present wins, not the first valid one**, as in `@nxgt/janus`:\n * a lapsed token in `connectionParams` beside a live cookie is refused. An\n * `authorization` of another scheme (`Basic`) is not a session credential,\n * as in `@nxgt/janus`, and does not count. `null` when there is nothing to\n * read, or an `authorization` that is not a string — refused, as a\n * client's mistake.\n */\nexport function credentialOf(\n\tctx: ConnectionContext,\n\tupgrade: Upgrade | undefined,\n): RequestLike | null {\n\tconst params = ctx.connectionParams;\n\tif (params !== undefined && Object.hasOwn(params, 'authorization')) {\n\t\tconst { authorization } = params;\n\t\tif (typeof authorization !== 'string') return null;\n\t\t// A record, not `Headers`, which would throw on a value no header may\n\t\t// hold: a client's mistake is a refusal, never a 4500.\n\t\tif (BEARER.test(authorization)) return { authorization };\n\t}\n\tconst request =\n\t\tupgrade === undefined\n\t\t\t? (ctx.extra as { readonly request?: RequestLike } | null)?.request\n\t\t\t: upgrade(ctx);\n\treturn request ?? null;\n}\n\n/**\n * The credential of each connection `onConnect` accepted, by its `extra`:\n * the one object graphql-ws hands every callback of a connection, and that\n * Yoga's recipe spreads into the context it builds. A `WeakMap`, so a\n * closed connection takes its entry with it, and nothing a request carries\n * can name one.\n */\nconst accepted = new WeakMap<object, RequestLike>();\n\n/** Remembers `credential` as the one `ctx`'s connection presented. */\nexport function accept(ctx: ConnectionContext, credential: RequestLike) {\n\tconst { extra } = ctx;\n\tif (typeof extra !== 'object' || extra === null) {\n\t\tthrow new TypeError(\n\t\t\t\"janusConnection(): the connection's extra is not an object — pass the context graphql-ws gave onConnect\",\n\t\t);\n\t}\n\taccepted.set(extra, credential);\n}\n\n/**\n * The credential of the connection a context was built for, or `undefined`\n * for one no `onConnect` accepted — and for every HTTP request.\n */\nexport function acceptedOf(context: unknown): RequestLike | undefined {\n\tconst extra = (context as { readonly extra?: unknown } | null)?.extra;\n\tif (typeof extra !== 'object' || extra === null) return undefined;\n\treturn accepted.get(extra);\n}\n",
|
|
9
9
|
"/**\n * `janusConnection()`: authenticated subscriptions over graphql-ws.\n */\n\nimport { createJanusContext } from '../context';\nimport { checkWiring } from '../options';\nimport type { Auth, JanusContext, UserOfAuth } from '../types';\nimport { accept, acceptedOf, credentialOf } from './credential';\nimport type { JanusConnection, JanusConnectionOptions } from './types';\n\n/**\n * The pieces of graphql-ws's `useServer()` that authenticate a WebSocket\n * connection, for Yoga's recommended setup:\n *\n * ```ts\n * const connection = janusConnection({ auth });\n * useServer({\n * onConnect: connection.onConnect,\n * execute: (args) => args.rootValue.execute(args),\n * subscribe: (args) => args.rootValue.subscribe(args),\n * onSubscribe: async (ctx, _id, params) => { … yoga.getEnveloped({ ...ctx, … }) … },\n * }, wsServer);\n * ```\n *\n * `onConnect` reads the connection's credential — `connectionParams`'\n * `authorization`, else the upgrade request's headers and cookie — and\n * refuses it unless it authenticates, as a user of `type` when it is given.\n * Each operation on the connection then gets a `ctx.janus` of its own from\n * `useJanus()`, authenticated again from that credential when a field asks:\n * `@authenticated`, `@fresh` and `@permission` hold as over HTTP, and a\n * session revoked since the connection opened is refused at the next\n * subscribe.\n *\n * A server without Yoga passes `context` too, and applies the directives\n * with `applyJanusDirectives()`.\n */\nexport function janusConnection<\n\tA extends Auth<{ readonly type: string; readonly id: string }>,\n\tP extends object | undefined = undefined,\n\tconst T extends UserOfAuth<A>['type'] = UserOfAuth<A>['type'],\n>(options: JanusConnectionOptions<A, P, T>): JanusConnection<A, P, T> {\n\tconst { auth, access, type, clock } = options;\n\tcheckWiring('janusConnection()', { auth, access, clock });\n\tif (options.upgrade !== undefined && typeof options.upgrade !== 'function') {\n\t\tthrow new TypeError(\n\t\t\t'janusConnection(): upgrade is not a function — pass (ctx) => the upgrade request, or leave it out to read ctx.extra.request',\n\t\t);\n\t}\n\tconst upgrade = options.upgrade?.bind(options);\n\tconst wiring = {\n\t\tauth,\n\t\taccess: access as { readonly can: unknown } | undefined,\n\t\ttype,\n\t\tclock,\n\t\tcaller: 'janusConnection().context',\n\t};\n\n\treturn {\n\t\tonConnect: async (ctx) => {\n\t\t\tconst credential = credentialOf(ctx, upgrade);\n\t\t\tif (credential === null) return false;\n\t\t\t// An outage rejects here, and graphql-ws closes the socket 4500:\n\t\t\t// never `false`, which a client reads as a refusal.\n\t\t\tconst current = await auth.authenticate(\n\t\t\t\tcredential,\n\t\t\t\ttype === undefined ? undefined : { type },\n\t\t\t);\n\t\t\tif (current === null) return false;\n\t\t\taccept(ctx, credential);\n\t\t\treturn true;\n\t\t},\n\t\t// The one cast at the boundary: the context is built loose, typed here.\n\t\tcontext: (ctx) =>\n\t\t\t({\n\t\t\t\tjanus: createJanusContext(acceptedOf(ctx), wiring),\n\t\t\t}) as unknown as JanusContext<A, P, T>,\n\t};\n}\n",
|
|
10
10
|
"/**\n * The schema transform: every object field a directive guards gets its\n * resolver wrapped, once, when the schema is built.\n */\n\nimport { MapperKind, mapSchema } from '@graphql-tools/utils';\nimport { defaultFieldResolver, type GraphQLSchema } from 'graphql';\nimport { guarded } from './guard';\nimport { readField } from './read';\nimport { type Known, requirementOf } from './validate';\nimport { list, PREFIX } from './words';\n\ntype Entries = {\n\treadonly [type: string]: ((...args: never[]) => unknown) | undefined;\n};\n\n/** What `applyJanusDirectives()` takes. */\nexport interface JanusDirectivesOptions<T extends string = string> {\n\t/** What `janus()` answered: its `types` are the names `type:` may take. */\n\treadonly auth: { readonly types: readonly T[] };\n\t/** `useJanus({ type })`'s: the one user type the schema's users can have. */\n\treadonly type?: NoInfer<T>;\n\t/** What `permissions()` answered: its model is what `@permission` may name. Required once a schema uses it. */\n\treadonly access?: { readonly model: unknown } | undefined;\n\t/** `useJanus({ loaders })`'s. */\n\treadonly loaders?: Entries | undefined;\n\t/** `useJanus({ conditions })`'s. */\n\treadonly conditions?: Entries | undefined;\n}\n\n/**\n * The schema with every field guarded by `@authenticated`, `@fresh` or\n * `@permission` — on the field, on its type, or on an interface the type\n * implements — wrapped so its resolver runs only for a signed-in user, of\n * one of the types `type:` names when it names some, on a session that\n * proved who it is less than `maxAge` seconds ago, holding every permission\n * asked. Every directive that applies must hold.\n *\n * `useJanus()` calls it on every schema it is given. Call it yourself to\n * check a schema without a server: the guards it installs read `ctx.janus`,\n * which only `useJanus()` builds.\n *\n * **Refuses when the schema is built**, with a `TypeError` naming the\n * field: a user type `auth` does not know, a `type: []`, restrictions no\n * user type meets together, a `@fresh` whose `maxAge` is not above zero;\n * for `@permission`, an object type or a permission the model does not\n * declare, a malformed `id:`, an argument the field does not take, and a\n * loader or a condition's `ctx` it needs and was not given.\n */\nexport function applyJanusDirectives<const T extends string>(\n\tschema: GraphQLSchema,\n\toptions: JanusDirectivesOptions<T>,\n): GraphQLSchema {\n\tconst known = knownOf(options);\n\treturn mapSchema(schema, {\n\t\t[MapperKind.OBJECT_FIELD]: (field, fieldName, typeName) => {\n\t\t\tconst requirement = requirementOf(\n\t\t\t\t{\n\t\t\t\t\tname: `${typeName}.${fieldName}`,\n\t\t\t\t\targs: Object.keys(field.args ?? {}),\n\t\t\t\t},\n\t\t\t\treadField(schema, field, fieldName, typeName),\n\t\t\t\tknown,\n\t\t\t\toptions,\n\t\t\t);\n\t\t\tif (requirement === null) return field;\n\t\t\tconst resolve = field.resolve ?? defaultFieldResolver;\n\t\t\tif (field.subscribe === undefined) {\n\t\t\t\treturn { ...field, resolve: guarded(resolve, requirement) };\n\t\t\t}\n\t\t\t// A subscription's freshness is checked when it subscribes: its\n\t\t\t// events keep coming past maxAge, as its session keeps standing.\n\t\t\tconst onEvent = { ...requirement, maxAgeMs: null };\n\t\t\treturn {\n\t\t\t\t...field,\n\t\t\t\tsubscribe: guarded(field.subscribe, requirement),\n\t\t\t\tresolve: guarded(resolve, onEvent),\n\t\t\t};\n\t\t},\n\t});\n}\n\n/** The user types a directive may name — `type` alone when it is given, and one of `auth.types`. */\nfunction knownOf({ auth, type }: JanusDirectivesOptions): Known {\n\tif (type === undefined) return { types: auth.types };\n\tif (!auth.types.includes(type)) {\n\t\tthrow new TypeError(\n\t\t\t`${PREFIX}: type '${type}' is not a user type of auth — it knows ${list(auth.types)}`,\n\t\t);\n\t}\n\treturn { types: [type] };\n}\n",
|
|
11
|
-
"/**\n * Every refusal as a `GraphQLError` whose `extensions` carry a `code` and the\n * HTTP status Yoga answers with: `{ code, http: { status } }`. This package\n * defines no error class of its own — a denial is a `GraphQLError`, and what\n * `@nxgt/janus` throws stays its own until `janusMaskError()` reads it.\n */\n\nimport { JanusError, type JanusErrorStatus, statusOf } from '@nxgt/janus';\nimport { GraphQLError } from 'graphql';\nimport { reporting } from './report';\n\n/** What a guard answers without asking `@nxgt/janus`: no user, or not this one. */\nexport type DenialCode = 'UNAUTHENTICATED' | 'FORBIDDEN' | 'NOT_FOUND';\n\n/** A denial: `UNAUTHENTICATED` 401, `FORBIDDEN` 403 or `NOT_FOUND` 404. */\nexport function denial(code: DenialCode, message?: string): GraphQLError {\n\tconst [status, fallback] = denialOf(code);\n\treturn new GraphQLError(message ?? fallback, {\n\t\textensions: { code, http: { status } },\n\t});\n}\n\nfunction denialOf(code: DenialCode): readonly [number, string] {\n\tswitch (code) {\n\t\tcase 'UNAUTHENTICATED':\n\t\t\treturn [401, 'Not signed in'];\n\t\tcase 'FORBIDDEN':\n\t\t\treturn [403, 'Forbidden'];\n\t\tcase 'NOT_FOUND':\n\t\t\treturn [404, 'Not found'];\n\t}\n}\n\n/**\n * A `JanusError` as the client may read it: its code and status, and only\n * what the client can act on — `issues`, `minLength`, `attemptsLeft`,\n * `retryAfter`. Never `reason`, `login`, `slot` or a cause: those are for\n * your logs. A throttled sign-in
|
|
11
|
+
"/**\n * Every refusal as a `GraphQLError` whose `extensions` carry a `code` and the\n * HTTP status Yoga answers with: `{ code, http: { status } }`. This package\n * defines no error class of its own — a denial is a `GraphQLError`, and what\n * `@nxgt/janus` throws stays its own until `janusMaskError()` reads it.\n */\n\nimport { JanusError, type JanusErrorStatus, statusOf } from '@nxgt/janus';\nimport { GraphQLError } from 'graphql';\nimport { reporting } from './report';\n\n/** What a guard answers without asking `@nxgt/janus`: no user, or not this one. */\nexport type DenialCode = 'UNAUTHENTICATED' | 'FORBIDDEN' | 'NOT_FOUND';\n\n/** A denial: `UNAUTHENTICATED` 401, `FORBIDDEN` 403 or `NOT_FOUND` 404. */\nexport function denial(code: DenialCode, message?: string): GraphQLError {\n\tconst [status, fallback] = denialOf(code);\n\treturn new GraphQLError(message ?? fallback, {\n\t\textensions: { code, http: { status } },\n\t});\n}\n\nfunction denialOf(code: DenialCode): readonly [number, string] {\n\tswitch (code) {\n\t\tcase 'UNAUTHENTICATED':\n\t\t\treturn [401, 'Not signed in'];\n\t\tcase 'FORBIDDEN':\n\t\t\treturn [403, 'Forbidden'];\n\t\tcase 'NOT_FOUND':\n\t\t\treturn [404, 'Not found'];\n\t}\n}\n\n/**\n * A `JanusError` as the client may read it: its code and status, and only\n * what the client can act on — `issues`, `minLength`, `attemptsLeft`,\n * `retryAfter`. Never `reason`, `login`, `slot` or a cause: those are for\n * your logs. A throttled sign-in, and a request past its e-mails\n * (`MAIL_THROTTLED`, 429), also carry their `Retry-After` header in\n * `http.headers`, which Yoga answers with.\n *\n * `STORE_FAILED` is `SERVICE_UNAVAILABLE` 503 — **an outage is never a\n * denial** — and no message of the core's reaches the client.\n */\nexport function janusGraphQLError(error: JanusError): GraphQLError {\n\tconst status = statusOf(error.code);\n\tconst code =\n\t\terror.code === 'STORE_FAILED' ? 'SERVICE_UNAVAILABLE' : error.code;\n\treturn new GraphQLError(messageOf(status), {\n\t\toriginalError: error,\n\t\textensions: { code, http: httpOf(error, status), ...actionable(error) },\n\t});\n}\n\n/**\n * A fixed message per status: the core's own message names a hash prefix or\n * a version, which are for your logs. The client reads `extensions.code`.\n */\nfunction messageOf(status: JanusErrorStatus): string {\n\tswitch (status) {\n\t\tcase 400:\n\t\t\treturn 'Invalid request';\n\t\tcase 401:\n\t\t\treturn 'Invalid credentials';\n\t\tcase 403:\n\t\t\treturn 'Forbidden';\n\t\tcase 404:\n\t\t\treturn 'Not found';\n\t\tcase 409:\n\t\t\treturn 'Conflict';\n\t\tcase 429:\n\t\t\treturn 'Too many requests, retry later';\n\t\tcase 503:\n\t\t\treturn 'The service is unavailable, retry later';\n\t\tcase 500:\n\t\tcase 501:\n\t\t\treturn 'Internal server error';\n\t}\n}\n\n/** The status, and the `Retry-After` of a throttled sign-in or request. */\nfunction httpOf(\n\terror: JanusError,\n\tstatus: JanusErrorStatus,\n): Record<string, unknown> {\n\treturn error.retryAfter === undefined\n\t\t? { status }\n\t\t: { status, headers: { 'Retry-After': String(error.retryAfter) } };\n}\n\n/** The fields of a refusal a client can act on, as `@nxgt/janus-hono`'s `bodyOf`. */\nfunction actionable(error: JanusError): Record<string, unknown> {\n\tswitch (error.code) {\n\t\tcase 'USER_INVALID':\n\t\t\treturn { issues: error.issues ?? [] };\n\t\tcase 'PASSWORD_TOO_SHORT':\n\t\t\treturn error.minLength === undefined\n\t\t\t\t? {}\n\t\t\t\t: { minLength: error.minLength };\n\t\tcase 'CODE_INVALID':\n\t\t\treturn error.attemptsLeft === undefined\n\t\t\t\t? {}\n\t\t\t\t: { attemptsLeft: error.attemptsLeft };\n\t\tcase 'CREDENTIALS_INVALID':\n\t\tcase 'MAIL_THROTTLED':\n\t\t\treturn error.retryAfter === undefined\n\t\t\t\t? {}\n\t\t\t\t: { retryAfter: error.retryAfter };\n\t\tdefault:\n\t\t\treturn {};\n\t}\n}\n\n/**\n * A rejection handler: a `JanusError` becomes its `GraphQLError`, anything\n * else goes on as it is. `.then(undefined, rethrown)`.\n */\nexport function rethrown(error: unknown): never {\n\tthrow error instanceof JanusError ? janusGraphQLError(error) : error;\n}\n\n/** Yoga's and envelop's `maskError` signature. */\nexport type MaskError = (\n\terror: unknown,\n\tmessage: string,\n\tisDev?: boolean,\n) => Error;\n\n/** What `janusMaskError()` takes. */\nexport interface JanusMaskErrorOptions {\n\t/**\n\t * Called once with every `JanusError` answered 5xx — `STORE_FAILED`,\n\t * `UNSUPPORTED`, `PERMISSION_DEPTH` — whichever path it took: a\n\t * directive, `requireUser()`, `can()`, or a resolver that let it through.\n\t * Its `slot`, `operation`, `reason` and cause are for your logs; the\n\t * response never carries them.\n\t *\n\t * **It cannot change the answer**: one that throws, or rejects, is a\n\t * `process.emitWarning`, and the 503 is sent all the same.\n\t */\n\treadonly report?: (error: JanusError) => unknown;\n\t/** Every error that is not a `JanusError`; see `janusMaskError()`. */\n\treadonly fallback?: MaskError;\n}\n\n/**\n * Yoga's `maskedErrors.maskError`: a `JanusError` a resolver let through is\n * answered with its code and status — `STORE_FAILED` as 503, never masked\n * into a 500 and never a denial — and every other error goes to `fallback`.\n *\n * Without a `fallback`, a `GraphQLError` is kept and anything else becomes\n * `message`, with no detail. Pass Yoga's own `maskError` to keep its\n * development-mode details — as the options' `fallback`, or alone, as\n * before `report` existed:\n *\n * ```ts\n * import { createYoga, maskError } from 'graphql-yoga';\n * createYoga({\n * schema,\n * plugins,\n * maskedErrors: {\n * maskError: janusMaskError({ report: (error) => logger.error(error), fallback: maskError }),\n * },\n * });\n * ```\n */\nexport function janusMaskError(\n\toptions: JanusMaskErrorOptions | MaskError = {},\n): MaskError {\n\tconst { report, fallback = masked } =\n\t\ttypeof options === 'function' ? { fallback: options } : options;\n\tconst reported = report === undefined ? undefined : reporting(report);\n\treturn (error, message, isDev) => {\n\t\treported?.(error);\n\t\tconst original =\n\t\t\terror instanceof GraphQLError ? error.originalError : error;\n\t\tif (original instanceof JanusError) {\n\t\t\tconst answer = janusGraphQLError(original);\n\t\t\treturn error instanceof GraphQLError\n\t\t\t\t? new GraphQLError(answer.message, {\n\t\t\t\t\t\tnodes: error.nodes ?? null,\n\t\t\t\t\t\tpath: error.path ?? null,\n\t\t\t\t\t\toriginalError: original,\n\t\t\t\t\t\textensions: answer.extensions,\n\t\t\t\t\t})\n\t\t\t\t: answer;\n\t\t}\n\t\treturn fallback(error, message, isDev);\n\t};\n}\n\n/** The default `fallback`: a `GraphQLError` of our own kept, anything else `message`. */\nfunction masked(error: unknown, message: string): Error {\n\tif (error instanceof GraphQLError) {\n\t\tconst original = error.originalError;\n\t\tif (original === undefined || original instanceof GraphQLError) {\n\t\t\treturn error;\n\t\t}\n\t\treturn new GraphQLError(message, {\n\t\t\tnodes: error.nodes ?? null,\n\t\t\tpath: error.path ?? null,\n\t\t\textensions: { code: 'INTERNAL_SERVER_ERROR' },\n\t\t});\n\t}\n\treturn new GraphQLError(message, {\n\t\textensions: { code: 'INTERNAL_SERVER_ERROR' },\n\t});\n}\n",
|
|
12
12
|
"/**\n * `janusMaskError({ report })`: every `JanusError` answered 5xx, handed to\n * the application's logger before the response goes — the directives' and\n * the helpers' included, which reach the mask already a `GraphQLError`.\n */\n\nimport { JanusError, statusOf } from '@nxgt/janus';\nimport { GraphQLError } from 'graphql';\n\n/**\n * The `JanusError` behind `error`: itself, or the one a chain of\n * `GraphQLError`s carries as `originalError` — a directive's refusal,\n * located again by graphql-js. `null` when there is none.\n */\nexport function janusErrorIn(error: unknown): JanusError | null {\n\tlet current = error;\n\twhile (current instanceof GraphQLError) current = current.originalError;\n\treturn current instanceof JanusError ? current : null;\n}\n\n/**\n * A `report` that sees each failure once — a lazy `authenticate` shared by\n * two guarded fields fails both with one error — and only a 5xx: an outage,\n * `UNSUPPORTED`, `PERMISSION_DEPTH`, the ones the server must fix.\n *\n * **It cannot change the answer**: one that throws, or rejects, is a\n * `process.emitWarning`, and the response is sent all the same.\n */\nexport function reporting(\n\treport: (error: JanusError) => unknown,\n): (error: unknown) => void {\n\tconst seen = new WeakSet<JanusError>();\n\treturn (error) => {\n\t\tconst janusError = janusErrorIn(error);\n\t\tif (janusError === null || seen.has(janusError)) return;\n\t\tif (statusOf(janusError.code) < 500) return;\n\t\tseen.add(janusError);\n\t\tconst warn = (failure: unknown) =>\n\t\t\tprocess.emitWarning(\n\t\t\t\t`janusMaskError: report failed on ${janusError.code}: ${failure instanceof Error ? failure.name : typeof failure}`,\n\t\t\t);\n\t\ttry {\n\t\t\t// A thenable of any make, as a native promise: its rejection warns too.\n\t\t\tPromise.resolve(report(janusError)).then(undefined, warn);\n\t\t} catch (failure) {\n\t\t\twarn(failure);\n\t\t}\n\t};\n}\n",
|
|
13
13
|
"/**\n * Freshness: whether the request's session proved who it is recently enough\n * — the check `@fresh` runs before a field, and `requireFresh()` in a\n * resolver. Both are `@nxgt/janus`'s `assertFresh`, on the clock given to\n * `useJanus({ clock })`.\n */\n\nimport {\n\tassertFresh,\n\ttype Duration,\n\tparseDuration,\n\ttype Session,\n} from '@nxgt/janus';\nimport { clockOf, janusOf } from './context';\nimport { denial, rethrown } from './errors';\n\n/**\n * The request's session, once it proved who it is less than `maxAgeMs` ago\n * — or a denial: `UNAUTHENTICATED` 401 for an anonymous request,\n * `STEP_UP_REQUIRED` 403 for an older session. A store that cannot answer is\n * `SERVICE_UNAVAILABLE` 503, never either of them.\n */\nexport async function freshSession(\n\tjanus: { session(): Promise<Session | null> },\n\tmaxAgeMs: number,\n): Promise<Session> {\n\tconst session = await janus.session().then(undefined, rethrown);\n\tif (session === null) throw denial('UNAUTHENTICATED');\n\ttry {\n\t\tassertFresh(session, maxAgeMs, clockOf(janus));\n\t} catch (error) {\n\t\trethrown(error);\n\t}\n\treturn session;\n}\n\n/**\n * The request's session, once it proved who it is less than `maxAge` ago —\n * signed in, or confirmed since by `auth.stepUp.confirm` — or a denial:\n * `UNAUTHENTICATED` 401 for an anonymous request, `STEP_UP_REQUIRED` 403 for\n * an older session, which tells the client to ask for a step-up.\n *\n * ```ts\n * await requireFresh(ctx, '10m'); // before changing the e-mail\n * ```\n *\n * `maxAge` is a duration with its unit — `'10m'`, `'600s'` — never a bare\n * number, which `@nxgt/janus` reads as milliseconds where `@fresh` reads\n * seconds: a `TypeError`, as any other malformed duration.\n */\nexport async function requireFresh(\n\tctx: {\n\t\treadonly janus: {\n\t\t\tuser(): Promise<unknown>;\n\t\t\tsession(): Promise<Session | null>;\n\t\t};\n\t},\n\tmaxAge: Exclude<Duration, number>,\n): Promise<Session> {\n\tif (typeof maxAge !== 'string') {\n\t\tthrow new TypeError(\n\t\t\t\"requireFresh(): maxAge is a duration with its unit, such as '10m' — a bare number would be milliseconds, where @fresh reads seconds\",\n\t\t);\n\t}\n\tconst maxAgeMs = parseDuration(maxAge, 'requireFresh(): maxAge');\n\treturn freshSession(janusOf(ctx, 'requireFresh()'), maxAgeMs);\n}\n",
|
|
14
14
|
"/**\n * `@permission`'s `id:` — `args.<path>` or `parent.<path>` — parsed when the\n * schema is built, and read from a request's arguments or parent value when a\n * field is resolved.\n */\n\n/** A parsed `id:`. */\nexport interface IdPath {\n\t/** As written: `args.id`, `parent.wardId`, `args.input.ids`. */\n\treadonly text: string;\n\treadonly root: 'args' | 'parent';\n\t/** The names after the root, at least one. */\n\treadonly segments: readonly string[];\n}\n\nconst NAME = /^[_A-Za-z][_0-9A-Za-z]*$/;\n\n/** `text` parsed, or `null` when it is not `args.<name>…` or `parent.<name>…`. */\nexport function parsePath(text: string): IdPath | null {\n\tconst [root, ...segments] = text.split('.');\n\tif (root !== 'args' && root !== 'parent') return null;\n\tif (segments.length === 0 || !segments.every((name) => NAME.test(name))) {\n\t\treturn null;\n\t}\n\treturn { text, root, segments };\n}\n\n/** One object a check is about: its id, and the value that holds it when that value is the object. */\nexport interface Target {\n\treadonly id: string;\n\t/** The value the id was read from, when `id` is its `id` field under `parent`. */\n\treadonly holder: object | null;\n}\n\n/**\n * The objects `path` names in this request: one, or one per element where a\n * step reads a list. `null` when a step reads nothing, or an id is not a\n * string or an integer: the request resolved no object id. An empty list\n * under `parent` is `null` too — the object's data names nothing to check,\n * and its fields are not open to everyone for it; under `args` it is the\n * client asking for nothing, and there is nothing to refuse.\n */\nexport function targetsOf(\n\tpath: IdPath,\n\tparent: unknown,\n\targs: unknown,\n): readonly Target[] | null {\n\tconst containers = walk(\n\t\t[path.root === 'args' ? args : parent],\n\t\tpath.segments.slice(0, -1),\n\t);\n\tif (containers === null) return null;\n\tconst last = path.segments[path.segments.length - 1] as string;\n\tconst held = path.root === 'parent' && last === 'id';\n\tconst targets: Target[] = [];\n\tfor (const container of containers) {\n\t\tfor (const value of spread((container as Record<string, unknown>)[last])) {\n\t\t\tconst id = idOf(value);\n\t\t\tif (id === null) return null;\n\t\t\ttargets.push({ id, holder: held ? (container as object) : null });\n\t\t}\n\t}\n\treturn path.root === 'parent' && targets.length === 0 ? null : targets;\n}\n\n/** The values `segments` reach from `values`, a list read as its elements. */\nfunction walk(\n\tvalues: readonly unknown[],\n\tsegments: readonly string[],\n): readonly unknown[] | null {\n\tlet current = values;\n\tfor (const segment of segments) {\n\t\tconst next: unknown[] = [];\n\t\tfor (const value of current) {\n\t\t\tif (typeof value !== 'object' || value === null) return null;\n\t\t\tnext.push(...spread((value as Record<string, unknown>)[segment]));\n\t\t}\n\t\tcurrent = next;\n\t}\n\treturn current.every((value) => typeof value === 'object' && value !== null)\n\t\t? current\n\t\t: null;\n}\n\nfunction spread(value: unknown): readonly unknown[] {\n\treturn Array.isArray(value) ? value.flat(Number.POSITIVE_INFINITY) : [value];\n}\n\n/** An `ID` as graphql-js coerces one: a string, or an integer serialised. */\nfunction idOf(value: unknown): string | null {\n\tif (typeof value === 'string') return value;\n\tif (typeof value === 'number' && Number.isSafeInteger(value)) {\n\t\treturn String(value);\n\t}\n\treturn null;\n}\n",
|
|
15
15
|
"/**\n * One `@permission`, asked at request time: the objects its `id:` names, each\n * checked with the request's check — memoized per request — and a denial\n * unless every one holds. A failure to answer is never a denial.\n */\n\nimport type { Check } from '../../context';\nimport { denial, rethrown } from '../../errors';\nimport { type Target, targetsOf } from './path';\nimport type { PermissionCheck } from './validate';\n\ntype ObjectLike = { readonly type: string; readonly id: string };\ntype Subject = { readonly type: string; readonly id: string };\n\n/** What the guard has in hand when it asks. */\nexport interface Asking {\n\treadonly check: Check;\n\treadonly user: Subject;\n\treadonly parent: unknown;\n\treadonly args: unknown;\n\t/** The GraphQL context, which `loaders` and `conditions` receive. */\n\treadonly ctx: unknown;\n}\n\n/** Refuses the request unless `user` holds `permission` on every object its `id:` names. */\nexport async function enforcePermission(\n\tpermission: PermissionCheck,\n\tasking: Asking,\n): Promise<void> {\n\tconst targets = targetsOf(permission.path, asking.parent, asking.args);\n\tif (targets === null) {\n\t\twarnNoId(permission);\n\t\tthrow denial('NOT_FOUND');\n\t}\n\tconst objects = await Promise.all(\n\t\ttargets.map((target) => objectOf(permission, target, asking.ctx)),\n\t).then(undefined, rethrown);\n\tconst found = objects.filter(\n\t\t(object): object is ObjectLike => object !== null,\n\t);\n\tif (found.length < objects.length) throw denial('NOT_FOUND');\n\tconst answers = await Promise.all(\n\t\tfound.map((object) => ask(permission, object, asking)),\n\t).then(undefined, rethrown);\n\tif (answers.includes(false)) throw denial(permission.onDeny);\n}\n\nasync function ask(\n\tpermission: PermissionCheck,\n\tobject: ObjectLike,\n\t{ check, user, ctx }: Asking,\n): Promise<boolean> {\n\tconst options =\n\t\tpermission.condition === null\n\t\t\t? undefined\n\t\t\t: { ctx: await permission.condition(object, ctx) };\n\treturn check(user, permission.name, object, options);\n}\n\n/**\n * What no object id can hold, as `@nxgt/janus` reads the notation: `can()`\n * refuses such an id with a `TypeError`, and one sent by a client is no\n * object's. A copy of the core's `RESERVED`, recorded in AGENTS.md's\n * *Deliberate duplications*.\n */\nconst UNNAMEABLE = /^$|[@#()]/;\n\n/**\n * Whether an id sent by a client can name an object: none of the characters\n * above, no NUL and no lone surrogate — which no store keeps, so `can()`\n * holds them for nobody, and the application's loader must never see them.\n * A copy of the core's `isStorable`, recorded beside `UNNAMEABLE`.\n */\nconst isNameable = (id: string): boolean =>\n\t!UNNAMEABLE.test(id) && !id.includes('\\u0000') && id.isWellFormed();\n\n/**\n * The object `can()` is given for one target: the value that holds the id,\n * the loader's answer, or `{ type, id }`. `null` when there is none: the\n * loader found none, or the id could name no object.\n */\nasync function objectOf(\n\tpermission: PermissionCheck,\n\t{ id, holder }: Target,\n\tctx: unknown,\n): Promise<ObjectLike | null> {\n\tconst { type, load } = permission;\n\tif (!isNameable(id)) return null;\n\tif (holder !== null) return view(holder, type, id);\n\tif (load === null) return { type, id };\n\tconst loaded = await load(id, ctx);\n\tif (loaded === null) return null;\n\tif (typeof loaded !== 'object') {\n\t\tthrow new TypeError(\n\t\t\t`${permission.label}: loaders.${type} answered ${typeof loaded} — answer the object, or null when there is none`,\n\t\t);\n\t}\n\treturn view(loaded, type, id);\n}\n\n/**\n * The object as `can()` reads it: `type` added — and `id`, the string read\n * from the path, so an integer id reads as graphql-js serialises it — every\n * other field read from the object itself, so a getter, a\n * class's `#private` state or an ORM document's accessors answer as they do\n * in the resolver. A spread would copy own enumerable fields only. The\n * proxy's target is an empty object rather than `object`, so a frozen\n * object whose own `type` means something else is read without breaking a\n * proxy invariant.\n */\nfunction view(object: object, type: string, id: string): ObjectLike {\n\treturn new Proxy(Object.create(null) as object, {\n\t\tget: (_, key) =>\n\t\t\tkey === 'type' ? type : key === 'id' ? id : Reflect.get(object, key),\n\t\thas: (_, key) => key === 'type' || Reflect.has(object, key),\n\t}) as ObjectLike;\n}\n\nconst warned = new WeakSet<PermissionCheck>();\n\n/** Says once per directive, on the only channel a library has, why a field answers `NOT_FOUND`. */\nfunction warnNoId(permission: PermissionCheck): void {\n\tif (warned.has(permission)) return;\n\twarned.add(permission);\n\tprocess.emitWarning(\n\t\t`${permission.label} resolved no object id from ${permission.path.text} — answered NOT_FOUND`,\n\t\t{ code: 'JANUS_GRAPHQL_NO_OBJECT_ID' },\n\t);\n}\n",
|
|
16
16
|
"/**\n * What runs before a guarded field's resolver, at request time: the user,\n * then the requirement — its user types, the session's freshness, then each\n * `@permission` in order. A\n * denial is a `GraphQLError`; a failure to answer is `SERVICE_UNAVAILABLE`,\n * never a denial.\n */\n\nimport type { GraphQLFieldResolver } from 'graphql';\nimport { checkOf, janusOf } from '../context';\nimport { denial, rethrown } from '../errors';\nimport { freshSession } from '../fresh';\nimport { enforcePermission } from './permission/enforce';\nimport type { Requirement } from './validate';\n\n/** What the field was asked with. */\nexport interface Resolving {\n\treadonly parent: unknown;\n\treadonly args: unknown;\n\treadonly ctx: unknown;\n\t/** A subscription's: its checks skip the request's memo, and see a revoke. */\n\treadonly fresh: boolean;\n}\n\n/** Refuses the request unless it meets `requirement`. */\nexport async function enforce(\n\trequirement: Requirement,\n\t{ parent, args, ctx, fresh }: Resolving,\n): Promise<void> {\n\tconst janus = janusOf(ctx, requirement.label);\n\tconst user = await janus.user().then(undefined, rethrown);\n\tif (user === null) throw denial('UNAUTHENTICATED');\n\tif (requirement.types !== null && !requirement.types.has(user.type)) {\n\t\tthrow denial('FORBIDDEN');\n\t}\n\tif (requirement.maxAgeMs !== null) {\n\t\tawait freshSession(janus, requirement.maxAgeMs);\n\t}\n\tconst [first] = requirement.permissions;\n\tif (first === undefined) return;\n\tconst check = checkOf(janus, fresh);\n\tif (check === null) {\n\t\tthrow new TypeError(\n\t\t\t`${first.label}: ctx.janus.access is not set — pass { access } to useJanus()`,\n\t\t);\n\t}\n\t// In order, one at a time: the first that denies answers, and the ones\n\t// after it are never asked.\n\tfor (const permission of requirement.permissions) {\n\t\tawait enforcePermission(permission, { check, user, parent, args, ctx });\n\t}\n}\n\n/** `resolve`, run only once `requirement` is met. */\nexport function guarded<S, C, A>(\n\tresolve: GraphQLFieldResolver<S, C, A>,\n\trequirement: Requirement,\n): GraphQLFieldResolver<S, C, A> {\n\treturn async (source, args, ctx, info) => {\n\t\tawait enforce(requirement, {\n\t\t\tparent: source,\n\t\t\targs,\n\t\t\tctx,\n\t\t\tfresh: info.operation.operation === 'subscription',\n\t\t});\n\t\treturn resolve(source, args, ctx, info);\n\t};\n}\n",
|
|
17
|
-
"/**\n * Reads the directives that apply to one object field: its own, its object\n * type's, and those of every interface the type implements — on the\n * interface itself and on the interface's field of the same name. Reads, and\n * decides nothing: `validate.ts` decides what they add up to.\n */\n\nimport { getDirective } from '@graphql-tools/utils';\nimport type {\n\tGraphQLFieldConfig,\n\tGraphQLInterfaceType,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n} from 'graphql';\n\n/** One `@authenticated`, and where it was written. */\nexport interface AuthenticatedUse {\n\t/** `Type.field`, `Type`, `Interface.field` or `Interface`. */\n\treadonly where: string;\n\t/** Its `type:` argument, or `null` when it names none: any signed-in user. */\n\treadonly types: readonly string[] | null;\n}\n\n/** One `@fresh`, and where it was written. */\nexport interface FreshUse {\n\t/** `Type.field`, `Type`, `Interface.field` or `Interface`. */\n\treadonly where: string;\n\t/** Its `maxAge:` argument, in seconds, as written: checked by `validate.ts`. */\n\treadonly maxAge: number;\n}\n\n/** One `@permission`, as written, and where. */\nexport interface PermissionUse {\n\t/** `Type.field`, `Type`, `Interface.field` or `Interface`. */\n\treadonly where: string;\n\t/** Written on a type or an interface, rather than on a field. */\n\treadonly onType: boolean;\n\treadonly name: string;\n\treadonly type: string;\n\t/** Its `id:` argument, or `null` when absent. */\n\treadonly id: string | null;\n\treadonly onDeny: 'NOT_FOUND' | 'FORBIDDEN';\n}\n\n/** Everything written on one field's locations. */\nexport interface FieldDirectives {\n\treadonly authenticated: readonly AuthenticatedUse[];\n\treadonly fresh: readonly FreshUse[];\n\t/** In the order they are checked: the type's and interfaces' first, then the field's. */\n\treadonly permission: readonly PermissionUse[];\n}\n\ntype Located = {\n\treadonly where: string;\n\treadonly onType: boolean;\n\treadonly node: Parameters<typeof getDirective>[1];\n};\n\n/**\n * The locations whose directives apply to `typeName.fieldName`, outermost\n * first: the interfaces, the type, the interfaces' fields, the field. A\n * `@permission` on the object a field belongs to is asked before the one on\n * the field, so a field's `FORBIDDEN` never answers for an object its type\n * would have answered `NOT_FOUND` for.\n */\nfunction locations(\n\tschema: GraphQLSchema,\n\tfield: GraphQLFieldConfig<unknown, unknown>,\n\tfieldName: string,\n\ttypeName: string,\n): Located[] {\n\tconst type = schema.getType(typeName) as GraphQLObjectType;\n\tconst faces = type.getInterfaces() as readonly GraphQLInterfaceType[];\n\tconst fields: Located[] = [];\n\tfor (const face of faces) {\n\t\tconst own = face.getFields()[fieldName];\n\t\tif (own !== undefined) {\n\t\t\tfields.push({\n\t\t\t\twhere: `${face.name}.${fieldName}`,\n\t\t\t\tonType: false,\n\t\t\t\tnode: own,\n\t\t\t});\n\t\t}\n\t}\n\treturn [\n\t\t...faces.map((face) => ({ where: face.name, onType: true, node: face })),\n\t\t{ where: typeName, onType: true, node: type },\n\t\t...fields,\n\t\t{ where: `${typeName}.${fieldName}`, onType: false, node: field },\n\t];\n}\n\n/** Every `@authenticated`, `@fresh` and `@permission` that applies to one object field. */\nexport function readField(\n\tschema: GraphQLSchema,\n\tfield: GraphQLFieldConfig<unknown, unknown>,\n\tfieldName: string,\n\ttypeName: string,\n): FieldDirectives {\n\tconst authenticated: AuthenticatedUse[] = [];\n\tconst fresh: FreshUse[] = [];\n\tconst permission: PermissionUse[] = [];\n\tfor (const { where, onType, node } of locations(\n\t\tschema,\n\t\tfield,\n\t\tfieldName,\n\t\ttypeName,\n\t)) {\n\t\tfor (const args of getDirective(schema, node, 'authenticated') ?? []) {\n\t\t\tconst types = args
|
|
17
|
+
"/**\n * Reads the directives that apply to one object field: its own, its object\n * type's, and those of every interface the type implements — on the\n * interface itself and on the interface's field of the same name. Reads, and\n * decides nothing: `validate.ts` decides what they add up to.\n */\n\nimport { getDirective } from '@graphql-tools/utils';\nimport type {\n\tGraphQLFieldConfig,\n\tGraphQLInterfaceType,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n} from 'graphql';\n\n/** One `@authenticated`, and where it was written. */\nexport interface AuthenticatedUse {\n\t/** `Type.field`, `Type`, `Interface.field` or `Interface`. */\n\treadonly where: string;\n\t/** Its `type:` argument, or `null` when it names none: any signed-in user. */\n\treadonly types: readonly string[] | null;\n}\n\n/** One `@fresh`, and where it was written. */\nexport interface FreshUse {\n\t/** `Type.field`, `Type`, `Interface.field` or `Interface`. */\n\treadonly where: string;\n\t/** Its `maxAge:` argument, in seconds, as written: checked by `validate.ts`. */\n\treadonly maxAge: number;\n}\n\n/** One `@permission`, as written, and where. */\nexport interface PermissionUse {\n\t/** `Type.field`, `Type`, `Interface.field` or `Interface`. */\n\treadonly where: string;\n\t/** Written on a type or an interface, rather than on a field. */\n\treadonly onType: boolean;\n\treadonly name: string;\n\treadonly type: string;\n\t/** Its `id:` argument, or `null` when absent. */\n\treadonly id: string | null;\n\treadonly onDeny: 'NOT_FOUND' | 'FORBIDDEN';\n}\n\n/** Everything written on one field's locations. */\nexport interface FieldDirectives {\n\treadonly authenticated: readonly AuthenticatedUse[];\n\treadonly fresh: readonly FreshUse[];\n\t/** In the order they are checked: the type's and interfaces' first, then the field's. */\n\treadonly permission: readonly PermissionUse[];\n}\n\ntype Located = {\n\treadonly where: string;\n\treadonly onType: boolean;\n\treadonly node: Parameters<typeof getDirective>[1];\n};\n\n/**\n * The locations whose directives apply to `typeName.fieldName`, outermost\n * first: the interfaces, the type, the interfaces' fields, the field. A\n * `@permission` on the object a field belongs to is asked before the one on\n * the field, so a field's `FORBIDDEN` never answers for an object its type\n * would have answered `NOT_FOUND` for.\n */\nfunction locations(\n\tschema: GraphQLSchema,\n\tfield: GraphQLFieldConfig<unknown, unknown>,\n\tfieldName: string,\n\ttypeName: string,\n): Located[] {\n\tconst type = schema.getType(typeName) as GraphQLObjectType;\n\tconst faces = type.getInterfaces() as readonly GraphQLInterfaceType[];\n\tconst fields: Located[] = [];\n\tfor (const face of faces) {\n\t\tconst own = face.getFields()[fieldName];\n\t\tif (own !== undefined) {\n\t\t\tfields.push({\n\t\t\t\twhere: `${face.name}.${fieldName}`,\n\t\t\t\tonType: false,\n\t\t\t\tnode: own,\n\t\t\t});\n\t\t}\n\t}\n\treturn [\n\t\t...faces.map((face) => ({ where: face.name, onType: true, node: face })),\n\t\t{ where: typeName, onType: true, node: type },\n\t\t...fields,\n\t\t{ where: `${typeName}.${fieldName}`, onType: false, node: field },\n\t];\n}\n\n/** Every `@authenticated`, `@fresh` and `@permission` that applies to one object field. */\nexport function readField(\n\tschema: GraphQLSchema,\n\tfield: GraphQLFieldConfig<unknown, unknown>,\n\tfieldName: string,\n\ttypeName: string,\n): FieldDirectives {\n\tconst authenticated: AuthenticatedUse[] = [];\n\tconst fresh: FreshUse[] = [];\n\tconst permission: PermissionUse[] = [];\n\tfor (const { where, onType, node } of locations(\n\t\tschema,\n\t\tfield,\n\t\tfieldName,\n\t\ttypeName,\n\t)) {\n\t\tfor (const args of getDirective(schema, node, 'authenticated') ?? []) {\n\t\t\tconst types = args['type'] as readonly string[] | null | undefined;\n\t\t\tauthenticated.push({ where, types: types ?? null });\n\t\t}\n\t\tfor (const args of getDirective(schema, node, 'fresh') ?? []) {\n\t\t\tfresh.push({ where, maxAge: args['maxAge'] as number });\n\t\t}\n\t\tfor (const args of getDirective(schema, node, 'permission') ?? []) {\n\t\t\tpermission.push({\n\t\t\t\twhere,\n\t\t\t\tonType,\n\t\t\t\tname: args['name'] as string,\n\t\t\t\ttype: args['type'] as string,\n\t\t\t\tid: (args['id'] as string | null | undefined) ?? null,\n\t\t\t\tonDeny: args['onDeny'] === 'FORBIDDEN' ? 'FORBIDDEN' : 'NOT_FOUND',\n\t\t\t});\n\t\t}\n\t}\n\treturn { authenticated, fresh, permission };\n}\n",
|
|
18
18
|
"/** The phrases the schema-time refusals share. */\n\nexport const PREFIX = 'applyJanusDirectives()';\n\n/** `Query.me`, or `Record (read by Record.title)` for a type's directive. */\nexport function on(where: string, field: string): string {\n\treturn where === field ? field : `${where} (read by ${field})`;\n}\n\n/** `'a', 'b'`. */\nexport function list(names: readonly string[]): string {\n\treturn names.map((name) => `'${name}'`).join(', ');\n}\n",
|
|
19
19
|
"/**\n * What `@permission` reads of the permission model when the schema is built:\n * the object types, the names each declares, whether one reads a field of\n * its object (`fromField`), and whether a permission reaches a condition\n * (`when`). Read from `access.model`, as `defineModel()` answered it.\n */\n\n/** `access.model`, as this module reads it. */\nexport interface ModelLike {\n\treadonly types: readonly string[];\n\treadonly definition: {\n\t\treadonly types: {\n\t\t\treadonly [type: string]: {\n\t\t\t\treadonly related?: { readonly [name: string]: unknown };\n\t\t\t\treadonly permits?: { readonly [name: string]: readonly unknown[] };\n\t\t\t};\n\t\t};\n\t};\n}\n\n/** `access.model`, or `null` when `access` is not what `permissions()` answered. */\nexport function modelOf(access: unknown): ModelLike | null {\n\tconst model = (access as { readonly model?: Partial<ModelLike> } | undefined)\n\t\t?.model;\n\tif (!Array.isArray(model?.types) || model.definition?.types === undefined) {\n\t\treturn null;\n\t}\n\treturn model as ModelLike;\n}\n\n/** The relations and permissions `type` declares: what `can()` may be asked. */\nexport function namesOf(model: ModelLike, type: string): readonly string[] {\n\tconst def = model.definition.types[type];\n\treturn [\n\t\t...Object.keys(def?.related ?? {}),\n\t\t...Object.keys(def?.permits ?? {}),\n\t];\n}\n\ntype FromFieldLike = {\n\treadonly kind: 'fromField';\n\treadonly field: string;\n\treadonly subject: string;\n};\n\nfunction isFromField(value: unknown): value is FromFieldLike {\n\treturn (value as { readonly kind?: unknown } | null)?.kind === 'fromField';\n}\n\n/** The fields `type`'s `fromField`s read; empty when it has none. */\nexport function fieldsOf(model: ModelLike, type: string): readonly string[] {\n\tconst related = model.definition.types[type]?.related ?? {};\n\treturn Object.values(related)\n\t\t.filter(isFromField)\n\t\t.map((def) => def.field);\n}\n\n/**\n * Whether `can(…, name, { type })` reaches a `when` — through the\n * permission's rules, the permissions they name, and arrows into other types\n * — and so needs a `ctx`. What `CtxOf` computes in the compiler.\n */\nexport function reachesCondition(\n\tmodel: ModelLike,\n\ttype: string,\n\tname: string,\n\tseen: Set<string> = new Set(),\n): boolean {\n\tconst key = `${type}.${name}`;\n\tif (seen.has(key)) return false;\n\tseen.add(key);\n\tconst def = model.definition.types[type];\n\tfor (const rule of def?.permits?.[name] ?? []) {\n\t\tif (typeof rule !== 'string') return true; // a when()\n\t\tconst [relation, target] = rule.split('->');\n\t\tif (target === undefined) {\n\t\t\tif (reachesCondition(model, type, rule, seen)) return true;\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const next of arrowTargets(def?.related?.[relation as string])) {\n\t\t\tif (reachesCondition(model, next, target, seen)) return true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/** The object types an arrow through a relation of this definition reaches. */\nfunction arrowTargets(relation: unknown): readonly string[] {\n\tif (isFromField(relation)) {\n\t\treturn [relation.subject];\n\t}\n\tif (!Array.isArray(relation)) return [];\n\treturn relation\n\t\t.filter((holder): holder is string => typeof holder === 'string')\n\t\t.map((holder) => holder.split('#')[0] as string);\n}\n",
|
|
20
20
|
"/**\n * One `@permission`, checked against the model and the field when the schema\n * is built, and turned into what the guard asks at request time. Everything\n * no request could pass is a `TypeError` naming the field.\n */\n\nimport type { PermissionUse } from '../read';\nimport { list, on, PREFIX } from '../words';\nimport {\n\tfieldsOf,\n\ttype ModelLike,\n\tmodelOf,\n\tnamesOf,\n\treachesCondition,\n} from './model';\nimport { type IdPath, parsePath } from './path';\n\n/** `useJanus({ loaders })`'s entry: the object of a type, by id, or `null`. */\nexport type Loader = (id: string, ctx: unknown) => unknown;\n/** `useJanus({ conditions })`'s entry: the `ctx` a type's conditions test. */\nexport type Condition = (object: unknown, ctx: unknown) => unknown;\n\n/** What `@permission` reads from `useJanus()`'s options. */\nexport interface PermissionWiring {\n\treadonly access?: unknown;\n\treadonly loaders?: { readonly [type: string]: unknown } | undefined;\n\treadonly conditions?: { readonly [type: string]: unknown } | undefined;\n}\n\n/** One `@permission`, as the guard asks it. */\nexport interface PermissionCheck {\n\t/** `@permission on Record (read by Record.title)`, for the messages. */\n\treadonly label: string;\n\treadonly name: string;\n\treadonly type: string;\n\treadonly onDeny: 'NOT_FOUND' | 'FORBIDDEN';\n\treadonly path: IdPath;\n\t/** Loads an object named by id alone; `null` passes `{ type, id }`. */\n\treadonly load: Loader | null;\n\t/** Answers the check's `ctx`; `null` when no condition is reachable. */\n\treadonly condition: Condition | null;\n}\n\n/** The field a directive is read for: `Type.field`, and the arguments it takes. */\nexport interface FieldShape {\n\treadonly name: string;\n\treadonly args: readonly string[];\n}\n\n/** `use`, checked, or a `TypeError` naming the field. */\nexport function permissionCheckOf(\n\tuse: PermissionUse,\n\tfield: FieldShape,\n\twiring: PermissionWiring,\n): PermissionCheck {\n\tconst label = `@permission on ${on(use.where, field.name)}`;\n\tconst refuse = (why: string) => new TypeError(`${PREFIX}: ${label} ${why}`);\n\tconst model = modelOf(wiring.access);\n\tif (model === null) {\n\t\tthrow refuse(\n\t\t\t'needs the permissions() instance — pass useJanus({ auth, access }), with access what permissions() answered',\n\t\t);\n\t}\n\tcheckNames(model, use, refuse);\n\tconst text = use.id ?? (use.onType ? 'parent.id' : 'args.id');\n\tconst path = parsePath(text);\n\tif (path === null) {\n\t\tthrow refuse(\n\t\t\t`reads its id from '${text}', which is not args.<name> or parent.<name>`,\n\t\t);\n\t}\n\tconst [first] = path.segments;\n\tif (path.root === 'args' && !field.args.includes(first as string)) {\n\t\tthrow refuse(\n\t\t\t`reads ${path.root}.${first}, and ${field.name} takes no argument ${first}${\n\t\t\t\tuse.id === null && use.onType === false\n\t\t\t\t\t? ' — name the id with id: \"parent.<field>\" or id: \"args.<name>\"'\n\t\t\t\t\t: ''\n\t\t\t}`,\n\t\t);\n\t}\n\treturn {\n\t\tlabel,\n\t\tname: use.name,\n\t\ttype: use.type,\n\t\tonDeny: use.onDeny,\n\t\tpath,\n\t\tload: loaderOf(model, use.type, path, wiring, refuse),\n\t\tcondition: conditionOf(model, use, wiring, refuse),\n\t};\n}\n\ntype Refuse = (why: string) => TypeError;\n\nfunction checkNames(model: ModelLike, use: PermissionUse, refuse: Refuse) {\n\tif (!model.types.includes(use.type)) {\n\t\tthrow refuse(\n\t\t\t`names the object type '${use.type}', which is not one of ${list(model.types)}`,\n\t\t);\n\t}\n\tconst names = namesOf(model, use.type);\n\tif (!names.includes(use.name)) {\n\t\tthrow refuse(\n\t\t\t`asks '${use.name}', which ${use.type} does not declare — it declares ${list(names)}`,\n\t\t);\n\t}\n}\n\n/** The loader a check needs: its type's, required when the object is named by id alone and reads its own fields. */\nfunction loaderOf(\n\tmodel: ModelLike,\n\ttype: string,\n\tpath: IdPath,\n\twiring: PermissionWiring,\n\trefuse: Refuse,\n): Loader | null {\n\tconst load = wiring.loaders?.[type];\n\tif (load !== undefined && typeof load !== 'function') {\n\t\tthrow refuse(`finds loaders.${type}, which is not a function`);\n\t}\n\tconst held = path.root === 'parent' && path.segments.at(-1) === 'id';\n\tif (held) return null;\n\tif (load !== undefined) return load as Loader;\n\tconst fields = fieldsOf(model, type);\n\tif (fields.length > 0) {\n\t\tthrow refuse(\n\t\t\t`reads the ${type}'s id from ${path.text}, and ${type} reads ${list(fields)} of the object itself (fromField) — pass useJanus({ loaders: { ${type}: (id, ctx) => … } })`,\n\t\t);\n\t}\n\treturn null;\n}\n\n/** The type's `conditions` entry, required when the permission reaches a `when`. */\nfunction conditionOf(\n\tmodel: ModelLike,\n\tuse: PermissionUse,\n\twiring: PermissionWiring,\n\trefuse: Refuse,\n): Condition | null {\n\tif (!reachesCondition(model, use.type, use.name)) return null;\n\tconst condition = wiring.conditions?.[use.type];\n\tif (typeof condition !== 'function') {\n\t\tthrow refuse(\n\t\t\t`asks '${use.name}' of ${use.type}, which reaches a when() — pass useJanus({ conditions: { ${use.type}: (object, ctx) => … } })`,\n\t\t);\n\t}\n\treturn condition as Condition;\n}\n",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"/**\n * `useJanus()`, the envelop plugin — for Yoga, or any server built on\n * envelop.\n */\n\nimport type { Plugin } from '@envelop/core';\nimport type { RequestLike } from '@nxgt/janus';\nimport type { GraphQLSchema } from 'graphql';\nimport { acceptedOf } from './connection/credential';\nimport { createJanusContext } from './context';\nimport { applyJanusDirectives } from './directives/apply';\nimport { checkWiring } from './options';\nimport { resendRenewed, track } from './renewal';\nimport type { Auth, JanusContext, JanusOptions, UserOfAuth } from './types';\n\n/**\n * The plugin that wires `@nxgt/janus` into a GraphQL server:\n *\n * - every request's context gets `ctx.janus` — `user()` and `session()`,\n * authenticated lazily and once, and `access` when it is given;\n * - every schema the server is given has its directives applied, once, by\n * `applyJanusDirectives()`.\n *\n * ```ts\n * createYoga({\n * schema: createSchema({ typeDefs: [janusTypeDefs, typeDefs], resolvers }),\n * plugins: [useJanus({ auth, access })],\n * maskedErrors: { maskError: janusMaskError() },\n * });\n * ```\n *\n * `type` treats a user of any other type as anonymous, as\n * `auth.authenticate(request, { type })` does. `clock` is what `@fresh` and\n * `requireFresh()` read the time from — the one given to `janus()`.\n * `loaders` and `conditions` are what `@permission` needs beside `access`:\n * the objects it checks by id, and the `ctx` of the conditions it reaches.\n *\n * A session `authenticate` renewed for a request that presented it as the\n * session cookie is sent again, `Set-Cookie` on Yoga's response\n * (`onResponse`), so a browser keeps the new expiry. Not to a bearer token or\n * `X-Session-Token`, and never when nothing authenticated.\n *\n * An operation over graphql-ws has no request: its `ctx.janus`\n * authenticates the credential its connection presented, once\n * `janusConnection().onConnect` accepted it — and has no response to carry a\n * renewed cookie.\n */\nexport function useJanus<\n\tA extends Auth<{ readonly type: string; readonly id: string }>,\n\tP extends object | undefined = undefined,\n\tconst T extends UserOfAuth<A>['type'] = UserOfAuth<A>['type'],\n>(\n\toptions: JanusOptions<A, P, T>,\n): Plugin<JanusContext<A, P, T>> & {\n\treadonly onResponse: (payload: {\n\t\treadonly request: Request;\n\t\treadonly response: Response;\n\t}) => Promise<void>;\n} {\n\tconst { auth, access, type, clock, loaders, conditions } = options;\n\tcheckWiring('useJanus()', { auth, access, clock });\n\tconst applied = new WeakSet<GraphQLSchema>();\n\n\treturn {\n\t\tonContextBuilding: ({ context, extendContext }) => {\n\t\t\tconst { request } = context as { readonly request?: RequestLike };\n\t\t\tconst janus = createJanusContext(request ?? acceptedOf(context), {\n\t\t\t\tauth,\n\t\t\t\taccess: access as { readonly can: unknown } | undefined,\n\t\t\t\ttype,\n\t\t\t\tclock,\n\t\t\t});\n\t\t\tif (typeof request === 'object' && request !== null) {\n\t\t\t\ttrack(request, janus);\n\t\t\t}\n\t\t\textendContext({ janus } as unknown as Partial<JanusContext<A, P, T>>);\n\t\t},\n\t\t// `replaceSchema` calls this hook again with the schema it was given:\n\t\t// the one it made is remembered, or it would transform it for ever.\n\t\tonSchemaChange: ({ schema, replaceSchema }) => {\n\t\t\tif (applied.has(schema)) return;\n\t\t\tconst next = applyJanusDirectives(schema, {\n\t\t\t\tauth,\n\t\t\t\t...(type === undefined ? {} : { type }),\n\t\t\t\taccess: access as { readonly model: unknown } | undefined,\n\t\t\t\tloaders,\n\t\t\t\tconditions,\n\t\t\t});\n\t\t\tapplied.add(next);\n\t\t\treplaceSchema(next);\n\t\t},\n\t\t// Yoga's own hook, which envelop ignores: the HTTP response, once made.\n\t\tonResponse: (payload) => resendRenewed(payload, auth.cookie),\n\t};\n}\n",
|
|
25
25
|
"/**\n * The directives and the enum this package reads, as SDL: put it beside your\n * own type definitions. The same text ships as `graphql/janus.graphqls`, for\n * a code generator or an editor that reads files — `sdl.spec.ts` holds that\n * the two are identical.\n *\n * ```ts\n * createSchema({ typeDefs: [janusTypeDefs, typeDefs], resolvers });\n * ```\n */\nexport const janusTypeDefs: string = `\"\"\"\nOnly a signed-in user reaches this field, or every field of this type or\ninterface. With \\`type\\`, only a user of one of these user types: any other is\nanswered FORBIDDEN.\n\"\"\"\ndirective @authenticated(\n\ttype: [String!]\n) on OBJECT | INTERFACE | FIELD_DEFINITION\n\n\"\"\"\nOnly a session that proved who it is less than \\`maxAge\\` seconds ago reaches\nthis field, or every field of this type or interface: signed in, or confirmed\nsince by a step-up. Anonymous is answered UNAUTHENTICATED, an older session\nSTEP_UP_REQUIRED. Where several apply, the smallest \\`maxAge\\` holds.\n\"\"\"\ndirective @fresh(maxAge: Int!) on OBJECT | INTERFACE | FIELD_DEFINITION\n\n\"\"\"\nWhat a denied \\`@permission\\` answers.\n\"\"\"\nenum JanusPermissionDenial {\n\t\"\"\"\n\t404: the object is not told to exist. The default.\n\t\"\"\"\n\tNOT_FOUND\n\t\"\"\"\n\t403: the object exists, and this user may not do this to it.\n\t\"\"\"\n\tFORBIDDEN\n}\n\n\"\"\"\nOnly a user holding permission \\`name\\` on the object of \\`type\\` whose id \\`id\\`\nreads reaches this field, or every field of this type or interface. \\`id\\` is\n\\`args.<path>\\` or \\`parent.<path>\\`: \\`args.id\\` on a field and \\`parent.id\\` on a\ntype or an interface when absent. A list of ids requires the permission on\nevery one. Repeated, every one must hold, in the order written.\n\"\"\"\ndirective @permission(\n\tname: String!\n\ttype: String!\n\tid: String\n\tonDeny: JanusPermissionDenial! = NOT_FOUND\n) repeatable on OBJECT | INTERFACE | FIELD_DEFINITION\n`;\n"
|
|
26
26
|
],
|
|
27
|
-
"mappings": ";AAMA;AAAA;AAAA;;;ACaA,IAAM,WAAW;AAQjB,SAAS,KAAK,CACb,SACA,YACA,QACA,SACgB;AAAA,EAChB,IAAI,YAAY,QAAQ,SAAS,QAAQ;AAAA,IAAW,OAAO;AAAA,EAC3D,IAAI,SAAS,KAAK,OAAO,EAAE,KAAK,SAAS,KAAK,QAAQ,EAAE;AAAA,IAAG,OAAO;AAAA,EAClE,MAAM,MACL,OAAO,QAAQ,aAAa,WAAW,IAAI,QAAQ,aAAa;AAAA,EACjE,OAAO,GAAG,OAAO,QAAQ,OAAO,MAAM,cAAc,QAAQ,QAAQ,QAAQ,KAAK;AAAA;AAS3E,SAAS,QAAQ,CAAC,QAA0C;AAAA,EAClE,MAAM,MAAM,OAAO;AAAA,EACnB,MAAM,UAAU,IAAI;AAAA,EACpB,MAAM,MAAa,OAAO,SAAS,YAAY,QAAQ,YACtD,IAAI,KAAK,QAAQ,SAAS,YAAY,QAAQ,OAAO;AAAA,EACtD,OAAO,CAAC,SAAS,YAAY,QAAQ,YAAY;AAAA,IAChD,MAAM,MAAM,MAAM,SAAS,YAAY,QAAQ,OAAO;AAAA,IACtD,IAAI,QAAQ;AAAA,MAAM,OAAO,IAAI,SAAS,YAAY,QAAQ,OAAO;AAAA,IACjE,MAAM,QAAQ,QAAQ,IAAI,GAAG;AAAA,IAC7B,IAAI,UAAU;AAAA,MAAW,OAAO;AAAA,IAChC,MAAM,SAAS,IAAI,SAAS,YAAY,QAAQ,OAAO;AAAA,IACvD,QAAQ,IAAI,KAAK,MAAM;AAAA,IACvB,OAAO,KAAK,WAAW,MAAM,QAAQ,OAAO,GAAG,CAAC;AAAA,IAChD,OAAO;AAAA;AAAA;;;ADlBT,IAAM,SAAS,IAAI;AAGnB,IAAM,SAAS,IAAI;AAOnB,IAAM,UAAU,IAAI;AAyBb,SAAS,kBAAkB,CACjC,SACA,SACQ;AAAA,EACR,QAAQ,MAAM,QAAQ,MAAM,OAAO,SAAS,iBAAiB;AAAA,EAC7D,IAAI;AAAA,EACJ,IAAI,QAAQ;AAAA,EACZ,MAAM,gBAAgB,MAAM;AAAA,IAC3B,IAAI,CAAC,OAAO;AAAA,MACX,QAAQ;AAAA,MACR,SACC,YAAY,YACT,QAAQ,OACR,IAAI,UACH,GAAG,yKACJ,CACD,IACC,KAAK,aACL,SACA,SAAS,YAAY,YAAY,EAAE,KAAK,CACzC;AAAA,IACJ;AAAA,IACA,OAAO;AAAA;AAAA,EAGR,MAAM,QAAQ,OAAO,OAAO;AAAA,IAC3B,MAAM,MAAM,cAAc,EAAE,KAAK,CAAC,YAAY,SAAS,QAAQ,IAAI;AAAA,IACnE,SAAS,MAAM,cAAc,EAAE,KAAK,CAAC,YAAY,SAAS,WAAW,IAAI;AAAA,OACrE,WAAW,YAAY,CAAC,IAAI,EAAE,OAAO;AAAA,EAC1C,CAAC;AAAA,EACD,IAAI,WAAW,WAAW;AAAA,IACzB,MAAM,MAAM,OAAO;AAAA,IACnB,OAAO,IAAI,OAAO;AAAA,MACjB,MAAM,SAAS,MAAM;AAAA,MACrB,OAAO,IAAI,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC3C,CAAC;AAAA,EACF;AAAA,EACA,IAAI,UAAU;AAAA,IAAW,OAAO,IAAI,OAAO,KAAK;AAAA,EAChD,QAAQ,IAAI,OAAO,MAAO,QAAQ,SAAS,SAAU;AAAA,EACrD,OAAO;AAAA;AAQD,SAAS,QAAQ,CACvB,OACqD;AAAA,EACrD,OAAO,QAAQ,IAAI,KAAK,IAAI;AAAA;AAOtB,SAAS,OAAO,CAAC,OAAsB;AAAA,EAC7C,OAAO,OAAO,IAAI,KAAK,KAAK;AAAA;AAYtB,SAAS,OAAO,CAAC,OAAe,QAAQ,OAAqB;AAAA,EACnE,MAAM,QAAQ,OAAO,IAAI,KAAK;AAAA,EAC9B,IAAI,UAAU;AAAA,IAAW,OAAO,QAAQ,MAAM,QAAQ,MAAM;AAAA,EAC5D,MAAM,SAAU,MACd;AAAA,EACF,OAAO,OAAO,QAAQ,QAAQ,aAAc,OAAO,MAAgB;AAAA;AAO7D,SAAS,OAAO,CAAC,KAAc,QAAuB;AAAA,EAC5D,MAAM,QAAS,KAA2C;AAAA,EAC1D,IAAI,UAAU,aAAa,OAAO,MAAM,SAAS,YAAY;AAAA,IAC5D,MAAM,IAAI,UACT,GAAG,sEACJ;AAAA,EACD;AAAA,EACA,OAAO;AAAA;;;AEpJD,SAAS,WAAW,CAAC,UAAkB,MAAM,QAAQ,SAAiB;AAAA,EAC5E,IACC,OAAQ,MACL,iBAAiB,YACnB;AAAA,IACD,MAAM,IAAI,UACT,GAAG,2DACJ;AAAA,EACD;AAAA,EACA,IACC,WAAW,aACX,OAAQ,QAA8C,QAAQ,YAC7D;AAAA,IACD,MAAM,IAAI,UACT,GAAG,2EACJ;AAAA,EACD;AAAA,EACA,IACC,UAAU,aACV,OAAQ,OAA6C,QAAQ,YAC5D;AAAA,IACD,MAAM,IAAI,UACT,GAAG,sGACJ;AAAA,EACD;AAAA;;;AC5BD,IAAM,SAAS;AAkBR,SAAS,YAAY,CAC3B,KACA,SACqB;AAAA,EACrB,MAAM,SAAS,IAAI;AAAA,EACnB,IAAI,WAAW,aAAa,OAAO,OAAO,QAAQ,eAAe,GAAG;AAAA,IACnE,QAAQ,kBAAkB;AAAA,IAC1B,IAAI,OAAO,kBAAkB;AAAA,MAAU,OAAO;AAAA,IAG9C,IAAI,OAAO,KAAK,aAAa;AAAA,MAAG,OAAO,EAAE,cAAc;AAAA,EACxD;AAAA,EACA,MAAM,UACL,YAAY,YACR,IAAI,OAAqD,UAC1D,QAAQ,GAAG;AAAA,EACf,OAAO,WAAW;AAAA;AAUnB,IAAM,WAAW,IAAI;AAGd,SAAS,MAAM,CAAC,KAAwB,YAAyB;AAAA,EACvE,QAAQ,UAAU;AAAA,EAClB,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAAA,IAChD,MAAM,IAAI,UACT,yGACD;AAAA,EACD;AAAA,EACA,SAAS,IAAI,OAAO,UAAU;AAAA;AAOxB,SAAS,UAAU,CAAC,SAA2C;AAAA,EACrE,MAAM,QAAS,SAAiD;AAAA,EAChE,IAAI,OAAO,UAAU,YAAY,UAAU;AAAA,IAAM;AAAA,EACjD,OAAO,SAAS,IAAI,KAAK;AAAA;;;ACzCnB,SAAS,eAIf,CAAC,SAAoE;AAAA,EACrE,QAAQ,MAAM,QAAQ,MAAM,UAAU;AAAA,EACtC,YAAY,qBAAqB,EAAE,MAAM,QAAQ,MAAM,CAAC;AAAA,EACxD,IAAI,QAAQ,YAAY,aAAa,OAAO,QAAQ,YAAY,YAAY;AAAA,IAC3E,MAAM,IAAI,UACT,6HACD;AAAA,EACD;AAAA,EACA,MAAM,UAAU,QAAQ,SAAS,KAAK,OAAO;AAAA,EAC7C,MAAM,SAAS;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACT;AAAA,EAEA,OAAO;AAAA,IACN,WAAW,OAAO,QAAQ;AAAA,MACzB,MAAM,aAAa,aAAa,KAAK,OAAO;AAAA,MAC5C,IAAI,eAAe;AAAA,QAAM,OAAO;AAAA,MAGhC,MAAM,UAAU,MAAM,KAAK,aAC1B,YACA,SAAS,YAAY,YAAY,EAAE,KAAK,CACzC;AAAA,MACA,IAAI,YAAY;AAAA,QAAM,OAAO;AAAA,MAC7B,OAAO,KAAK,UAAU;AAAA,MACtB,OAAO;AAAA;AAAA,IAGR,SAAS,CAAC,SACR;AAAA,MACA,OAAO,mBAAmB,WAAW,GAAG,GAAG,MAAM;AAAA,IAClD;AAAA,EACF;AAAA;;ACvED;AACA;;;ACCA,uBAAS,yBAAmC;AAC5C,yBAAS;;;ACFT;AACA;AAOO,SAAS,YAAY,CAAC,OAAmC;AAAA,EAC/D,IAAI,UAAU;AAAA,EACd,OAAO,mBAAmB;AAAA,IAAc,UAAU,QAAQ;AAAA,EAC1D,OAAO,mBAAmB,aAAa,UAAU;AAAA;AAW3C,SAAS,SAAS,CACxB,QAC2B;AAAA,EAC3B,MAAM,OAAO,IAAI;AAAA,EACjB,OAAO,CAAC,UAAU;AAAA,IACjB,MAAM,aAAa,aAAa,KAAK;AAAA,IACrC,IAAI,eAAe,QAAQ,KAAK,IAAI,UAAU;AAAA,MAAG;AAAA,IACjD,IAAI,SAAS,WAAW,IAAI,IAAI;AAAA,MAAK;AAAA,IACrC,KAAK,IAAI,UAAU;AAAA,IACnB,MAAM,OAAO,CAAC,YACb,QAAQ,YACP,oCAAoC,WAAW,SAAS,mBAAmB,QAAQ,QAAQ,OAAO,OAAO,SAC1G;AAAA,IACD,IAAI;AAAA,MAEH,QAAQ,QAAQ,OAAO,UAAU,CAAC,EAAE,KAAK,WAAW,IAAI;AAAA,MACvD,OAAO,SAAS;AAAA,MACjB,KAAK,OAAO;AAAA;AAAA;AAAA;;;AD9BR,SAAS,MAAM,CAAC,MAAkB,SAAgC;AAAA,EACxE,OAAO,QAAQ,YAAY,SAAS,IAAI;AAAA,EACxC,OAAO,IAAI,cAAa,WAAW,UAAU;AAAA,IAC5C,YAAY,EAAE,MAAM,MAAM,EAAE,OAAO,EAAE;AAAA,EACtC,CAAC;AAAA;AAGF,SAAS,QAAQ,CAAC,MAA6C;AAAA,EAC9D,QAAQ;AAAA,SACF;AAAA,MACJ,OAAO,CAAC,KAAK,eAAe;AAAA,SACxB;AAAA,MACJ,OAAO,CAAC,KAAK,WAAW;AAAA,SACpB;AAAA,MACJ,OAAO,CAAC,KAAK,WAAW;AAAA;AAAA;AAcpB,SAAS,iBAAiB,CAAC,OAAiC;AAAA,EAClE,MAAM,SAAS,UAAS,MAAM,IAAI;AAAA,EAClC,MAAM,OACL,MAAM,SAAS,iBAAiB,wBAAwB,MAAM;AAAA,EAC/D,OAAO,IAAI,cAAa,UAAU,MAAM,GAAG;AAAA,IAC1C,eAAe;AAAA,IACf,YAAY,EAAE,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,WAAW,KAAK,EAAE;AAAA,EACvE,CAAC;AAAA;AAOF,SAAS,SAAS,CAAC,QAAkC;AAAA,EACpD,QAAQ;AAAA,SACF;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,SACA;AAAA,MACJ,OAAO;AAAA;AAAA;AAKV,SAAS,MAAM,CACd,OACA,QAC0B;AAAA,EAC1B,OAAO,MAAM,eAAe,YACzB,EAAE,OAAO,IACT,EAAE,QAAQ,SAAS,EAAE,eAAe,OAAO,MAAM,UAAU,EAAE,EAAE;AAAA;AAInE,SAAS,UAAU,CAAC,OAA4C;AAAA,EAC/D,QAAQ,MAAM;AAAA,SACR;AAAA,MACJ,OAAO,EAAE,QAAQ,MAAM,UAAU,CAAC,EAAE;AAAA,SAChC;AAAA,MACJ,OAAO,MAAM,cAAc,YACxB,CAAC,IACD,EAAE,WAAW,MAAM,UAAU;AAAA,SAC5B;AAAA,MACJ,OAAO,MAAM,iBAAiB,YAC3B,CAAC,IACD,EAAE,cAAc,MAAM,aAAa;AAAA,SAClC;AAAA,MACJ,OAAO,MAAM,eAAe,YACzB,CAAC,IACD,EAAE,YAAY,MAAM,WAAW;AAAA;AAAA,MAElC,OAAO,CAAC;AAAA;AAAA;AAQJ,SAAS,QAAQ,CAAC,OAAuB;AAAA,EAC/C,MAAM,iBAAiB,cAAa,kBAAkB,KAAK,IAAI;AAAA;AAgDzD,SAAS,cAAc,CAC7B,UAA6C,CAAC,GAClC;AAAA,EACZ,QAAQ,QAAQ,WAAW,WAC1B,OAAO,YAAY,aAAa,EAAE,UAAU,QAAQ,IAAI;AAAA,EACzD,MAAM,WAAW,WAAW,YAAY,YAAY,UAAU,MAAM;AAAA,EACpE,OAAO,CAAC,OAAO,SAAS,UAAU;AAAA,IACjC,WAAW,KAAK;AAAA,IAChB,MAAM,WACL,iBAAiB,gBAAe,MAAM,gBAAgB;AAAA,IACvD,IAAI,oBAAoB,aAAY;AAAA,MACnC,MAAM,SAAS,kBAAkB,QAAQ;AAAA,MACzC,OAAO,iBAAiB,gBACrB,IAAI,cAAa,OAAO,SAAS;AAAA,QACjC,OAAO,MAAM,SAAS;AAAA,QACtB,MAAM,MAAM,QAAQ;AAAA,QACpB,eAAe;AAAA,QACf,YAAY,OAAO;AAAA,MACpB,CAAC,IACA;AAAA,IACJ;AAAA,IACA,OAAO,SAAS,OAAO,SAAS,KAAK;AAAA;AAAA;AAKvC,SAAS,MAAM,CAAC,OAAgB,SAAwB;AAAA,EACvD,IAAI,iBAAiB,eAAc;AAAA,IAClC,MAAM,WAAW,MAAM;AAAA,IACvB,IAAI,aAAa,aAAa,oBAAoB,eAAc;AAAA,MAC/D,OAAO;AAAA,IACR;AAAA,IACA,OAAO,IAAI,cAAa,SAAS;AAAA,MAChC,OAAO,MAAM,SAAS;AAAA,MACtB,MAAM,MAAM,QAAQ;AAAA,MACpB,YAAY,EAAE,MAAM,wBAAwB;AAAA,IAC7C,CAAC;AAAA,EACF;AAAA,EACA,OAAO,IAAI,cAAa,SAAS;AAAA,IAChC,YAAY,EAAE,MAAM,wBAAwB;AAAA,EAC7C,CAAC;AAAA;;;AEnMF;AAAA;AAAA;AAAA;AAeA,eAAsB,YAAY,CACjC,OACA,UACmB;AAAA,EACnB,MAAM,UAAU,MAAM,MAAM,QAAQ,EAAE,KAAK,WAAW,QAAQ;AAAA,EAC9D,IAAI,YAAY;AAAA,IAAM,MAAM,OAAO,iBAAiB;AAAA,EACpD,IAAI;AAAA,IACH,YAAY,SAAS,UAAU,QAAQ,KAAK,CAAC;AAAA,IAC5C,OAAO,OAAO;AAAA,IACf,SAAS,KAAK;AAAA;AAAA,EAEf,OAAO;AAAA;AAiBR,eAAsB,YAAY,CACjC,KAMA,QACmB;AAAA,EACnB,IAAI,OAAO,WAAW,UAAU;AAAA,IAC/B,MAAM,IAAI,UACT,qIACD;AAAA,EACD;AAAA,EACA,MAAM,WAAW,cAAc,QAAQ,wBAAwB;AAAA,EAC/D,OAAO,aAAa,QAAQ,KAAK,gBAAgB,GAAG,QAAQ;AAAA;;;AClD7D,IAAM,OAAO;AAGN,SAAS,SAAS,CAAC,MAA6B;AAAA,EACtD,OAAO,SAAS,YAAY,KAAK,MAAM,GAAG;AAAA,EAC1C,IAAI,SAAS,UAAU,SAAS;AAAA,IAAU,OAAO;AAAA,EACjD,IAAI,SAAS,WAAW,KAAK,CAAC,SAAS,MAAM,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC,GAAG;AAAA,IACxE,OAAO;AAAA,EACR;AAAA,EACA,OAAO,EAAE,MAAM,MAAM,SAAS;AAAA;AAkBxB,SAAS,SAAS,CACxB,MACA,QACA,MAC2B;AAAA,EAC3B,MAAM,aAAa,KAClB,CAAC,KAAK,SAAS,SAAS,OAAO,MAAM,GACrC,KAAK,SAAS,MAAM,GAAG,EAAE,CAC1B;AAAA,EACA,IAAI,eAAe;AAAA,IAAM,OAAO;AAAA,EAChC,MAAM,OAAO,KAAK,SAAS,KAAK,SAAS,SAAS;AAAA,EAClD,MAAM,OAAO,KAAK,SAAS,YAAY,SAAS;AAAA,EAChD,MAAM,UAAoB,CAAC;AAAA,EAC3B,WAAW,aAAa,YAAY;AAAA,IACnC,WAAW,SAAS,OAAQ,UAAsC,KAAK,GAAG;AAAA,MACzE,MAAM,KAAK,KAAK,KAAK;AAAA,MACrB,IAAI,OAAO;AAAA,QAAM,OAAO;AAAA,MACxB,QAAQ,KAAK,EAAE,IAAI,QAAQ,OAAQ,YAAuB,KAAK,CAAC;AAAA,IACjE;AAAA,EACD;AAAA,EACA,OAAO,KAAK,SAAS,YAAY,QAAQ,WAAW,IAAI,OAAO;AAAA;AAIhE,SAAS,IAAI,CACZ,QACA,UAC4B;AAAA,EAC5B,IAAI,UAAU;AAAA,EACd,WAAW,WAAW,UAAU;AAAA,IAC/B,MAAM,OAAkB,CAAC;AAAA,IACzB,WAAW,SAAS,SAAS;AAAA,MAC5B,IAAI,OAAO,UAAU,YAAY,UAAU;AAAA,QAAM,OAAO;AAAA,MACxD,KAAK,KAAK,GAAG,OAAQ,MAAkC,QAAQ,CAAC;AAAA,IACjE;AAAA,IACA,UAAU;AAAA,EACX;AAAA,EACA,OAAO,QAAQ,MAAM,CAAC,UAAU,OAAO,UAAU,YAAY,UAAU,IAAI,IACxE,UACA;AAAA;AAGJ,SAAS,MAAM,CAAC,OAAoC;AAAA,EACnD,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,OAAO,iBAAiB,IAAI,CAAC,KAAK;AAAA;AAI5E,SAAS,IAAI,CAAC,OAA+B;AAAA,EAC5C,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACtC,IAAI,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK,GAAG;AAAA,IAC7D,OAAO,OAAO,KAAK;AAAA,EACpB;AAAA,EACA,OAAO;AAAA;;;ACrER,eAAsB,iBAAiB,CACtC,YACA,QACgB;AAAA,EAChB,MAAM,UAAU,UAAU,WAAW,MAAM,OAAO,QAAQ,OAAO,IAAI;AAAA,EACrE,IAAI,YAAY,MAAM;AAAA,IACrB,SAAS,UAAU;AAAA,IACnB,MAAM,OAAO,WAAW;AAAA,EACzB;AAAA,EACA,MAAM,UAAU,MAAM,QAAQ,IAC7B,QAAQ,IAAI,CAAC,WAAW,SAAS,YAAY,QAAQ,OAAO,GAAG,CAAC,CACjE,EAAE,KAAK,WAAW,QAAQ;AAAA,EAC1B,MAAM,QAAQ,QAAQ,OACrB,CAAC,WAAiC,WAAW,IAC9C;AAAA,EACA,IAAI,MAAM,SAAS,QAAQ;AAAA,IAAQ,MAAM,OAAO,WAAW;AAAA,EAC3D,MAAM,UAAU,MAAM,QAAQ,IAC7B,MAAM,IAAI,CAAC,WAAW,IAAI,YAAY,QAAQ,MAAM,CAAC,CACtD,EAAE,KAAK,WAAW,QAAQ;AAAA,EAC1B,IAAI,QAAQ,SAAS,KAAK;AAAA,IAAG,MAAM,OAAO,WAAW,MAAM;AAAA;AAG5D,eAAe,GAAG,CACjB,YACA,UACE,OAAO,MAAM,OACI;AAAA,EACnB,MAAM,UACL,WAAW,cAAc,OACtB,YACA,EAAE,KAAK,MAAM,WAAW,UAAU,QAAQ,GAAG,EAAE;AAAA,EACnD,OAAO,MAAM,MAAM,WAAW,MAAM,QAAQ,OAAO;AAAA;AASpD,IAAM,aAAa;AAQnB,IAAM,aAAa,CAAC,OACnB,CAAC,WAAW,KAAK,EAAE,KAAK,CAAC,GAAG,SAAS,MAAQ,KAAK,GAAG,aAAa;AAOnE,eAAe,QAAQ,CACtB,cACE,IAAI,UACN,KAC6B;AAAA,EAC7B,QAAQ,MAAM,SAAS;AAAA,EACvB,IAAI,CAAC,WAAW,EAAE;AAAA,IAAG,OAAO;AAAA,EAC5B,IAAI,WAAW;AAAA,IAAM,OAAO,KAAK,QAAQ,MAAM,EAAE;AAAA,EACjD,IAAI,SAAS;AAAA,IAAM,OAAO,EAAE,MAAM,GAAG;AAAA,EACrC,MAAM,SAAS,MAAM,KAAK,IAAI,GAAG;AAAA,EACjC,IAAI,WAAW;AAAA,IAAM,OAAO;AAAA,EAC5B,IAAI,OAAO,WAAW,UAAU;AAAA,IAC/B,MAAM,IAAI,UACT,GAAG,WAAW,kBAAkB,iBAAiB,OAAO,wDACzD;AAAA,EACD;AAAA,EACA,OAAO,KAAK,QAAQ,MAAM,EAAE;AAAA;AAa7B,SAAS,IAAI,CAAC,QAAgB,MAAc,IAAwB;AAAA,EACnE,OAAO,IAAI,MAAM,OAAO,OAAO,IAAI,GAAa;AAAA,IAC/C,KAAK,CAAC,GAAG,QACR,QAAQ,SAAS,OAAO,QAAQ,OAAO,KAAK,QAAQ,IAAI,QAAQ,GAAG;AAAA,IACpE,KAAK,CAAC,GAAG,QAAQ,QAAQ,UAAU,QAAQ,IAAI,QAAQ,GAAG;AAAA,EAC3D,CAAC;AAAA;AAGF,IAAM,SAAS,IAAI;AAGnB,SAAS,QAAQ,CAAC,YAAmC;AAAA,EACpD,IAAI,OAAO,IAAI,UAAU;AAAA,IAAG;AAAA,EAC5B,OAAO,IAAI,UAAU;AAAA,EACrB,QAAQ,YACP,GAAG,WAAW,oCAAoC,WAAW,KAAK,6BAClE,EAAE,MAAM,6BAA6B,CACtC;AAAA;;;ACtGD,eAAsB,OAAO,CAC5B,eACE,QAAQ,MAAM,KAAK,SACL;AAAA,EAChB,MAAM,QAAQ,QAAQ,KAAK,YAAY,KAAK;AAAA,EAC5C,MAAM,OAAO,MAAM,MAAM,KAAK,EAAE,KAAK,WAAW,QAAQ;AAAA,EACxD,IAAI,SAAS;AAAA,IAAM,MAAM,OAAO,iBAAiB;AAAA,EACjD,IAAI,YAAY,UAAU,QAAQ,CAAC,YAAY,MAAM,IAAI,KAAK,IAAI,GAAG;AAAA,IACpE,MAAM,OAAO,WAAW;AAAA,EACzB;AAAA,EACA,IAAI,YAAY,aAAa,MAAM;AAAA,IAClC,MAAM,aAAa,OAAO,YAAY,QAAQ;AAAA,EAC/C;AAAA,EACA,OAAO,SAAS,YAAY;AAAA,EAC5B,IAAI,UAAU;AAAA,IAAW;AAAA,EACzB,MAAM,QAAQ,QAAQ,OAAO,KAAK;AAAA,EAClC,IAAI,UAAU,MAAM;AAAA,IACnB,MAAM,IAAI,UACT,GAAG,MAAM,oEACV;AAAA,EACD;AAAA,EAGA,WAAW,cAAc,YAAY,aAAa;AAAA,IACjD,MAAM,kBAAkB,YAAY,EAAE,OAAO,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,EACvE;AAAA;AAIM,SAAS,OAAgB,CAC/B,SACA,aACgC;AAAA,EAChC,OAAO,OAAO,QAAQ,MAAM,KAAK,SAAS;AAAA,IACzC,MAAM,QAAQ,aAAa;AAAA,MAC1B,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,OAAO,KAAK,UAAU,cAAc;AAAA,IACrC,CAAC;AAAA,IACD,OAAO,QAAQ,QAAQ,MAAM,KAAK,IAAI;AAAA;AAAA;;;AC1DxC;AA0DA,SAAS,SAAS,CACjB,QACA,OACA,WACA,UACY;AAAA,EACZ,MAAM,OAAO,OAAO,QAAQ,QAAQ;AAAA,EACpC,MAAM,QAAQ,KAAK,cAAc;AAAA,EACjC,MAAM,SAAoB,CAAC;AAAA,EAC3B,WAAW,QAAQ,OAAO;AAAA,IACzB,MAAM,MAAM,KAAK,UAAU,EAAE;AAAA,IAC7B,IAAI,QAAQ,WAAW;AAAA,MACtB,OAAO,KAAK;AAAA,QACX,OAAO,GAAG,KAAK,QAAQ;AAAA,QACvB,QAAQ;AAAA,QACR,MAAM;AAAA,MACP,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EACA,OAAO;AAAA,IACN,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,MAAM,QAAQ,MAAM,MAAM,KAAK,EAAE;AAAA,IACvE,EAAE,OAAO,UAAU,QAAQ,MAAM,MAAM,KAAK;AAAA,IAC5C,GAAG;AAAA,IACH,EAAE,OAAO,GAAG,YAAY,aAAa,QAAQ,OAAO,MAAM,MAAM;AAAA,EACjE;AAAA;AAIM,SAAS,SAAS,CACxB,QACA,OACA,WACA,UACkB;AAAA,EAClB,MAAM,gBAAoC,CAAC;AAAA,EAC3C,MAAM,QAAoB,CAAC;AAAA,EAC3B,MAAM,aAA8B,CAAC;AAAA,EACrC,aAAa,OAAO,QAAQ,UAAU,UACrC,QACA,OACA,WACA,QACD,GAAG;AAAA,IACF,WAAW,QAAQ,aAAa,QAAQ,MAAM,eAAe,KAAK,CAAC,GAAG;AAAA,MACrE,MAAM,QAAQ,KAAK;AAAA,MACnB,cAAc,KAAK,EAAE,OAAO,OAAO,SAAS,KAAK,CAAC;AAAA,IACnD;AAAA,IACA,WAAW,QAAQ,aAAa,QAAQ,MAAM,OAAO,KAAK,CAAC,GAAG;AAAA,MAC7D,MAAM,KAAK,EAAE,OAAO,QAAQ,KAAK,OAAiB,CAAC;AAAA,IACpD;AAAA,IACA,WAAW,QAAQ,aAAa,QAAQ,MAAM,YAAY,KAAK,CAAC,GAAG;AAAA,MAClE,WAAW,KAAK;AAAA,QACf;AAAA,QACA;AAAA,QACA,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,IAAK,KAAK,MAAoC;AAAA,QAC9C,QAAQ,KAAK,WAAW,cAAc,cAAc;AAAA,MACrD,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EACA,OAAO,EAAE,eAAe,OAAO,WAAW;AAAA;;;AC5HpC,IAAM,SAAS;AAGf,SAAS,EAAE,CAAC,OAAe,OAAuB;AAAA,EACxD,OAAO,UAAU,QAAQ,QAAQ,GAAG,kBAAkB;AAAA;AAIhD,SAAS,IAAI,CAAC,OAAkC;AAAA,EACtD,OAAO,MAAM,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,KAAK,IAAI;AAAA;;;ACU3C,SAAS,OAAO,CAAC,QAAmC;AAAA,EAC1D,MAAM,QAAS,QACZ;AAAA,EACH,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,KAAK,MAAM,YAAY,UAAU,WAAW;AAAA,IAC1E,OAAO;AAAA,EACR;AAAA,EACA,OAAO;AAAA;AAID,SAAS,OAAO,CAAC,OAAkB,MAAiC;AAAA,EAC1E,MAAM,MAAM,MAAM,WAAW,MAAM;AAAA,EACnC,OAAO;AAAA,IACN,GAAG,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC;AAAA,IACjC,GAAG,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC;AAAA,EAClC;AAAA;AASD,SAAS,WAAW,CAAC,OAAwC;AAAA,EAC5D,OAAQ,OAA8C,SAAS;AAAA;AAIzD,SAAS,QAAQ,CAAC,OAAkB,MAAiC;AAAA,EAC3E,MAAM,UAAU,MAAM,WAAW,MAAM,OAAO,WAAW,CAAC;AAAA,EAC1D,OAAO,OAAO,OAAO,OAAO,EAC1B,OAAO,WAAW,EAClB,IAAI,CAAC,QAAQ,IAAI,KAAK;AAAA;AAQlB,SAAS,gBAAgB,CAC/B,OACA,MACA,MACA,OAAoB,IAAI,KACd;AAAA,EACV,MAAM,MAAM,GAAG,QAAQ;AAAA,EACvB,IAAI,KAAK,IAAI,GAAG;AAAA,IAAG,OAAO;AAAA,EAC1B,KAAK,IAAI,GAAG;AAAA,EACZ,MAAM,MAAM,MAAM,WAAW,MAAM;AAAA,EACnC,WAAW,QAAQ,KAAK,UAAU,SAAS,CAAC,GAAG;AAAA,IAC9C,IAAI,OAAO,SAAS;AAAA,MAAU,OAAO;AAAA,IACrC,OAAO,UAAU,UAAU,KAAK,MAAM,IAAI;AAAA,IAC1C,IAAI,WAAW,WAAW;AAAA,MACzB,IAAI,iBAAiB,OAAO,MAAM,MAAM,IAAI;AAAA,QAAG,OAAO;AAAA,MACtD;AAAA,IACD;AAAA,IACA,WAAW,QAAQ,aAAa,KAAK,UAAU,SAAmB,GAAG;AAAA,MACpE,IAAI,iBAAiB,OAAO,MAAM,QAAQ,IAAI;AAAA,QAAG,OAAO;AAAA,IACzD;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAIR,SAAS,YAAY,CAAC,UAAsC;AAAA,EAC3D,IAAI,YAAY,QAAQ,GAAG;AAAA,IAC1B,OAAO,CAAC,SAAS,OAAO;AAAA,EACzB;AAAA,EACA,IAAI,CAAC,MAAM,QAAQ,QAAQ;AAAA,IAAG,OAAO,CAAC;AAAA,EACtC,OAAO,SACL,OAAO,CAAC,WAA6B,OAAO,WAAW,QAAQ,EAC/D,IAAI,CAAC,WAAW,OAAO,MAAM,GAAG,EAAE,EAAY;AAAA;;;AC5C1C,SAAS,iBAAiB,CAChC,KACA,OACA,QACkB;AAAA,EAClB,MAAM,QAAQ,kBAAkB,GAAG,IAAI,OAAO,MAAM,IAAI;AAAA,EACxD,MAAM,SAAS,CAAC,QAAgB,IAAI,UAAU,GAAG,WAAW,SAAS,KAAK;AAAA,EAC1E,MAAM,QAAQ,QAAQ,OAAO,MAAM;AAAA,EACnC,IAAI,UAAU,MAAM;AAAA,IACnB,MAAM,OACL,6GACD;AAAA,EACD;AAAA,EACA,WAAW,OAAO,KAAK,MAAM;AAAA,EAC7B,MAAM,OAAO,IAAI,OAAO,IAAI,SAAS,cAAc;AAAA,EACnD,MAAM,OAAO,UAAU,IAAI;AAAA,EAC3B,IAAI,SAAS,MAAM;AAAA,IAClB,MAAM,OACL,sBAAsB,kDACvB;AAAA,EACD;AAAA,EACA,OAAO,SAAS,KAAK;AAAA,EACrB,IAAI,KAAK,SAAS,UAAU,CAAC,MAAM,KAAK,SAAS,KAAe,GAAG;AAAA,IAClE,MAAM,OACL,SAAS,KAAK,QAAQ,cAAc,MAAM,0BAA0B,QACnE,IAAI,OAAO,QAAQ,IAAI,WAAW,QAC/B,kEACA,IAEL;AAAA,EACD;AAAA,EACA,OAAO;AAAA,IACN;AAAA,IACA,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,QAAQ,IAAI;AAAA,IACZ;AAAA,IACA,MAAM,SAAS,OAAO,IAAI,MAAM,MAAM,QAAQ,MAAM;AAAA,IACpD,WAAW,YAAY,OAAO,KAAK,QAAQ,MAAM;AAAA,EAClD;AAAA;AAKD,SAAS,UAAU,CAAC,OAAkB,KAAoB,QAAgB;AAAA,EACzE,IAAI,CAAC,MAAM,MAAM,SAAS,IAAI,IAAI,GAAG;AAAA,IACpC,MAAM,OACL,0BAA0B,IAAI,8BAA8B,KAAK,MAAM,KAAK,GAC7E;AAAA,EACD;AAAA,EACA,MAAM,QAAQ,QAAQ,OAAO,IAAI,IAAI;AAAA,EACrC,IAAI,CAAC,MAAM,SAAS,IAAI,IAAI,GAAG;AAAA,IAC9B,MAAM,OACL,SAAS,IAAI,gBAAgB,IAAI,uCAAuC,KAAK,KAAK,GACnF;AAAA,EACD;AAAA;AAID,SAAS,QAAQ,CAChB,OACA,MACA,MACA,QACA,QACgB;AAAA,EAChB,MAAM,OAAO,OAAO,UAAU;AAAA,EAC9B,IAAI,SAAS,aAAa,OAAO,SAAS,YAAY;AAAA,IACrD,MAAM,OAAO,iBAAiB,+BAA+B;AAAA,EAC9D;AAAA,EACA,MAAM,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,GAAG,EAAE,MAAM;AAAA,EAChE,IAAI;AAAA,IAAM,OAAO;AAAA,EACjB,IAAI,SAAS;AAAA,IAAW,OAAO;AAAA,EAC/B,MAAM,SAAS,SAAS,OAAO,IAAI;AAAA,EACnC,IAAI,OAAO,SAAS,GAAG;AAAA,IACtB,MAAM,OACL,aAAa,kBAAkB,KAAK,aAAa,cAAc,KAAK,MAAM,mEAAmE,2BAC9I;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAIR,SAAS,WAAW,CACnB,OACA,KACA,QACA,QACmB;AAAA,EACnB,IAAI,CAAC,iBAAiB,OAAO,IAAI,MAAM,IAAI,IAAI;AAAA,IAAG,OAAO;AAAA,EACzD,MAAM,YAAY,OAAO,aAAa,IAAI;AAAA,EAC1C,IAAI,OAAO,cAAc,YAAY;AAAA,IACpC,MAAM,OACL,SAAS,IAAI,YAAY,IAAI,gEAAgE,IAAI,+BAClG;AAAA,EACD;AAAA,EACA,OAAO;AAAA;;;ACpGD,SAAS,aAAa,CAC5B,OACA,YACA,OACA,QACqB;AAAA,EACrB,QAAQ,eAAe,OAAO,eAAe;AAAA,EAC7C,OAAO,MAAM,SAAS,QAAQ,UAAU;AAAA,EACxC,IAAI,UAAU;AAAA,IAAW,OAAO;AAAA,EAChC,OAAO;AAAA,IACN,OAAO,MAAM;AAAA,IACb,OAAO,GAAG,WAAW,GAAG,MAAM,OAAO,MAAM,IAAI;AAAA,IAC/C,OAAO,QAAQ,MAAM,MAAM,eAAe,KAAK;AAAA,IAC/C,UAAU,SAAS,MAAM,MAAM,KAAK;AAAA,IACpC,aAAa,WAAW,IAAI,CAAC,QAAQ,kBAAkB,KAAK,OAAO,MAAM,CAAC;AAAA,EAC3E;AAAA;AAID,SAAS,OAAO,CACf,OACA,MACA,OAC6B;AAAA,EAC7B,IAAI,QAA4B;AAAA,EAChC,aAAa,OAAO,OAAO,WAAW,MAAM;AAAA,IAC3C,IAAI,UAAU;AAAA,MAAM;AAAA,IACpB,IAAI,MAAM,WAAW,GAAG;AAAA,MACvB,MAAM,IAAI,UACT,GAAG,6BAA6B,GAAG,OAAO,KAAK,oEAChD;AAAA,IACD;AAAA,IACA,WAAW,QAAQ,OAAO;AAAA,MACzB,IAAI,CAAC,MAAM,MAAM,SAAS,IAAI,GAAG;AAAA,QAChC,MAAM,IAAI,UACT,GAAG,6BAA6B,GAAG,OAAO,KAAK,0BAA0B,8BAA8B,KAAK,MAAM,KAAK,GACxH;AAAA,MACD;AAAA,IACD;AAAA,IACA,QACC,UAAU,OACP,IAAI,IAAI,KAAK,IACb,IAAI,IAAI,MAAM,OAAO,CAAC,SAAS,OAAO,IAAI,IAAI,CAAC,CAAC;AAAA,EACrD;AAAA,EACA,IAAI,UAAU,QAAQ,MAAM,SAAS,GAAG;AAAA,IACvC,MAAM,IAAI,UACT,GAAG,iCAAiC,kEACrC;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAIR,SAAS,OAAO;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,GAC8E;AAAA,EAC9E,IAAI,cAAc,SAAS;AAAA,IAAG,OAAO,CAAC,kBAAkB,cAAc,EAAE;AAAA,EACxE,IAAI,MAAM,SAAS;AAAA,IAAG,OAAO,CAAC,UAAU,MAAM,EAAE;AAAA,EAChD,OAAO,CAAC,eAAe,WAAW,EAAE;AAAA;AAIrC,SAAS,QAAQ,CAAC,OAAe,MAA0C;AAAA,EAC1E,IAAI,UAAyB;AAAA,EAC7B,aAAa,OAAO,YAAY,MAAM;AAAA,IACrC,IAAI,CAAC,OAAO,cAAc,MAAM,KAAK,UAAU,GAAG;AAAA,MACjD,MAAM,IAAI,UACT,GAAG,qBAAqB,GAAG,OAAO,KAAK,kBAAkB,oFAC1D;AAAA,IACD;AAAA,IACA,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,SAAS,MAAM;AAAA,EAC/D;AAAA,EACA,OAAO,YAAY,OAAO,OAAO,UAAU;AAAA;;;AXvErC,SAAS,oBAA4C,CAC3D,QACA,SACgB;AAAA,EAChB,MAAM,QAAQ,QAAQ,OAAO;AAAA,EAC7B,OAAO,UAAU,QAAQ;AAAA,KACvB,WAAW,eAAe,CAAC,OAAO,WAAW,aAAa;AAAA,MAC1D,MAAM,cAAc,cACnB;AAAA,QACC,MAAM,GAAG,YAAY;AAAA,QACrB,MAAM,OAAO,KAAK,MAAM,QAAQ,CAAC,CAAC;AAAA,MACnC,GACA,UAAU,QAAQ,OAAO,WAAW,QAAQ,GAC5C,OACA,OACD;AAAA,MACA,IAAI,gBAAgB;AAAA,QAAM,OAAO;AAAA,MACjC,MAAM,UAAU,MAAM,WAAW;AAAA,MACjC,IAAI,MAAM,cAAc,WAAW;AAAA,QAClC,OAAO,KAAK,OAAO,SAAS,QAAQ,SAAS,WAAW,EAAE;AAAA,MAC3D;AAAA,MAGA,MAAM,UAAU,KAAK,aAAa,UAAU,KAAK;AAAA,MACjD,OAAO;AAAA,WACH;AAAA,QACH,WAAW,QAAQ,MAAM,WAAW,WAAW;AAAA,QAC/C,SAAS,QAAQ,SAAS,OAAO;AAAA,MAClC;AAAA;AAAA,EAEF,CAAC;AAAA;AAIF,SAAS,OAAO,GAAG,MAAM,QAAuC;AAAA,EAC/D,IAAI,SAAS;AAAA,IAAW,OAAO,EAAE,OAAO,KAAK,MAAM;AAAA,EACnD,IAAI,CAAC,KAAK,MAAM,SAAS,IAAI,GAAG;AAAA,IAC/B,MAAM,IAAI,UACT,GAAG,iBAAiB,+CAA+C,KAAK,KAAK,KAAK,GACnF;AAAA,EACD;AAAA,EACA,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;AAAA;;AYtDxB,eAAsB,WAGrB,CACA,KACA,UAAiC,CAAC,GACU;AAAA,EAC5C,QAAQ,SAAS;AAAA,EACjB,MAAM,UACL,OAAO,SAAS,WAAW,CAAC,IAAI,IAAI;AAAA,EACrC,IAAI,SAAS,WAAW,GAAG;AAAA,IAC1B,MAAM,IAAI,UACT,iHACD;AAAA,EACD;AAAA,EACA,MAAM,OAAO,MAAM,QAAQ,KAAK,eAAe,EAC7C,KAAK,EACL,KAAK,WAAW,QAAQ;AAAA,EAC1B,IAAI,SAAS;AAAA,IAAM,MAAM,OAAO,iBAAiB;AAAA,EACjD,IAAI,YAAY,aAAa,CAAC,QAAQ,SAAS,KAAK,IAAI,GAAG;AAAA,IAC1D,MAAM,OAAO,WAAW;AAAA,EACzB;AAAA,EACA,OAAO;AAAA;AAgBR,eAAsB,GAIrB,CACA,KAMA,YACA,WACG,SACgB;AAAA,EACnB,MAAM,QAAQ,QAAQ,KAAK,OAAO;AAAA,EAClC,MAAM,QAAQ,QAAQ,KAAK;AAAA,EAC3B,IAAI,UAAU,MAAM;AAAA,IACnB,MAAM,IAAI,UACT,oEACD;AAAA,EACD;AAAA,EACA,MAAM,UAAU,MAAM,MAAM,KAAK,EAAE,KAAK,WAAW,QAAQ;AAAA,EAC3D,OAAO,MAAM,SAAS,YAAY,QAAQ,QAAQ,EAAE,EAAE,KACrD,WACA,QACD;AAAA;;AC1ED,IAAM,WAAW,IAAI;AAGd,SAAS,KAAK,CAAC,SAAiB,OAAqB;AAAA,EAC3D,MAAM,QAAQ,SAAS,IAAI,OAAO;AAAA,EAClC,IAAI,UAAU;AAAA,IAAW,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC;AAAA,EACjD;AAAA,UAAM,KAAK,KAAK;AAAA;AAatB,eAAsB,aAAa,GAChC,SAAS,YACX,QACgB;AAAA,EAChB,MAAM,QAAQ,SAAS,IAAI,OAAO;AAAA,EAClC,IAAI,WAAW,aAAa,UAAU;AAAA,IAAW;AAAA,EACjD,WAAW,SAAS,OAAO;AAAA,IAC1B,MAAM,UAAU,MAAM,SAAS,KAAK,GAAG,KACtC,CAAC,WAAW,QACZ,MAAM,IACP;AAAA,IACA,IACC,SAAS,YAAY,QACrB,SAAS,SAAS,OAAO,IAAI,MAAM,QAAQ,SAC3C,CAAC,KAAK,UAAU,OAAO,IAAI,GAC1B;AAAA,MACD,SAAS,QAAQ,OAChB,cACA,OAAO,UAAU,QAAQ,OAAO,QAAQ,OAAO,CAChD;AAAA,IACD;AAAA,EACD;AAAA;AAID,SAAS,QAAQ,CAAC,SAAkB,MAA6B;AAAA,EAChE,MAAM,SAAS,QAAQ,QAAQ,IAAI,QAAQ;AAAA,EAC3C,IAAI,WAAW;AAAA,IAAM,OAAO;AAAA,EAC5B,WAAW,QAAQ,OAAO,MAAM,GAAG,GAAG;AAAA,IACrC,MAAM,KAAK,KAAK,QAAQ,GAAG;AAAA,IAC3B,IAAI,OAAO,MAAM,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,MAAM,MAAM;AAAA,MACnD,OAAO,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK;AAAA,IAChC;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAIR,SAAS,IAAI,CAAC,UAAoB,MAAuB;AAAA,EACxD,OAAO,SAAS,QACd,aAAa,EACb,KAAK,CAAC,UAAU,MAAM,WAAW,GAAG,OAAO,CAAC;AAAA;;;ACvCxC,SAAS,QAIf,CACA,SAMC;AAAA,EACD,QAAQ,MAAM,QAAQ,MAAM,OAAO,SAAS,eAAe;AAAA,EAC3D,YAAY,cAAc,EAAE,MAAM,QAAQ,MAAM,CAAC;AAAA,EACjD,MAAM,UAAU,IAAI;AAAA,EAEpB,OAAO;AAAA,IACN,mBAAmB,GAAG,SAAS,oBAAoB;AAAA,MAClD,QAAQ,YAAY;AAAA,MACpB,MAAM,QAAQ,mBAAmB,WAAW,WAAW,OAAO,GAAG;AAAA,QAChE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AAAA,MACD,IAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AAAA,QACpD,MAAM,SAAS,KAAK;AAAA,MACrB;AAAA,MACA,cAAc,EAAE,MAAM,CAA8C;AAAA;AAAA,IAIrE,gBAAgB,GAAG,QAAQ,oBAAoB;AAAA,MAC9C,IAAI,QAAQ,IAAI,MAAM;AAAA,QAAG;AAAA,MACzB,MAAM,OAAO,qBAAqB,QAAQ;AAAA,QACzC;AAAA,WACI,SAAS,YAAY,CAAC,IAAI,EAAE,KAAK;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AAAA,MACD,QAAQ,IAAI,IAAI;AAAA,MAChB,cAAc,IAAI;AAAA;AAAA,IAGnB,YAAY,CAAC,YAAY,cAAc,SAAS,KAAK,MAAM;AAAA,EAC5D;AAAA;;ACnFM,IAAM,gBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
28
|
-
"debugId": "
|
|
27
|
+
"mappings": "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",
|
|
28
|
+
"debugId": "71A9D0C2D2FB488364756E2164756E21",
|
|
29
29
|
"names": []
|
|
30
30
|
}
|
package/docs/guide/errors.md
CHANGED
|
@@ -44,7 +44,7 @@ the table `@nxgt/janus-hono` answers with too.
|
|
|
44
44
|
What a refusal carries beyond `code` is only what the client can act on:
|
|
45
45
|
`issues` for `USER_INVALID`, `minLength` for `PASSWORD_TOO_SHORT`,
|
|
46
46
|
`attemptsLeft` for `CODE_INVALID`, `retryAfter` for a throttled
|
|
47
|
-
`CREDENTIALS_INVALID` — with its `Retry-After` header. **Never** `reason`, `login`, `slot`,
|
|
47
|
+
`CREDENTIALS_INVALID` or `MAIL_THROTTLED` — with its `Retry-After` header. **Never** `reason`, `login`, `slot`,
|
|
48
48
|
`operation`, a hash prefix or a cause — those are for your logs. **The
|
|
49
49
|
message is never the core's**: `@nxgt/janus`'s messages name a hash prefix or
|
|
50
50
|
a record's versions, so every `JanusError` gets the fixed message of its
|
|
@@ -168,6 +168,25 @@ body. `retryAfter` is the seconds until the login's next window.
|
|
|
168
168
|
`janus({ signIn: { throttle } })` changes the limit
|
|
169
169
|
([passwords](https://github.com/softistx/nxgt-janus/blob/develop/packages/janus/docs/guide/passwords.md#password-guessing-is-throttled)).
|
|
170
170
|
|
|
171
|
+
**The requests that send an e-mail are throttled too.** Past five requests
|
|
172
|
+
for one address (one user, for `verifyEmail.send` and an e-mailed
|
|
173
|
+
`stepUp.request`) in a 10-minute window, `@nxgt/janus` throws `MAIL_THROTTLED`
|
|
174
|
+
and sends nothing; a refused request spends and rotates nothing, so the last
|
|
175
|
+
link or code sent still works. Tell the visitor to use the last e-mail they
|
|
176
|
+
received, or to wait `retryAfter` seconds. `janusGraphQLError()` answers it with the fixed message
|
|
177
|
+
`Too many requests, retry later`:
|
|
178
|
+
|
|
179
|
+
```json
|
|
180
|
+
{
|
|
181
|
+
"errors": [{ "message": "Too many requests, retry later", "extensions": { "code": "MAIL_THROTTLED", "retryAfter": 840 } }]
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
with a 429 and a `Retry-After: 840` header, as above. `janus({ mail: { throttle } })`
|
|
186
|
+
changes the limit; keep its `window` no longer than the shortest `tokens.*`
|
|
187
|
+
lifetime you use. `@nxgt/janus` never sees IP addresses: add a per-IP ceiling
|
|
188
|
+
with `@nxgt/redis` rate limits.
|
|
189
|
+
|
|
171
190
|
What the throttle does not see is one password tried against many logins:
|
|
172
191
|
limit a sign-in mutation **per client address** as well, in the resolver,
|
|
173
192
|
with the limiter you already run:
|
package/docs/guide/step-up.md
CHANGED
|
@@ -110,8 +110,11 @@ Yoga answers it as a 500.
|
|
|
110
110
|
user, and `NOT_FOUND`, 404, for a user with no e-mail to send a code to
|
|
111
111
|
— an optional e-mail left empty.
|
|
112
112
|
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
**`@nxgt/janus` throttles an e-mailed `stepUp.request` per user** (five in 10
|
|
114
|
+
minutes by default): past that it throws `MAIL_THROTTLED`, answered 429 with a
|
|
115
|
+
`Retry-After` header, and sends nothing; the code last sent still works, so tell
|
|
116
|
+
the user to use the last e-mail they received, or to wait. Limiting per client
|
|
117
|
+
address stays yours (`@nxgt/redis` rate limits fit).
|
|
115
118
|
|
|
116
119
|
## In a resolver: `requireFresh(ctx, maxAge)`
|
|
117
120
|
|
package/docs/roadmap.md
CHANGED
|
@@ -40,6 +40,12 @@ Nothing yet.
|
|
|
40
40
|
|
|
41
41
|
Newest first; from the first release on, the package's CHANGELOG holds every one.
|
|
42
42
|
|
|
43
|
+
- **A throttled e-mail request's `retryAfter`, v0.6.0.**
|
|
44
|
+
`janusGraphQLError()` answers `@nxgt/janus`'s `MAIL_THROTTLED` with 429,
|
|
45
|
+
`retryAfter` in `extensions`, a `Retry-After` header in
|
|
46
|
+
`extensions.http.headers` and the message `Too many requests, retry later`.
|
|
47
|
+
Needs `@nxgt/janus` 0.18.0.
|
|
48
|
+
|
|
43
49
|
- **A throttled sign-in's `retryAfter`, v0.5.0.** `janusGraphQLError()`
|
|
44
50
|
answers `@nxgt/janus`'s throttled `CREDENTIALS_INVALID` with `retryAfter`
|
|
45
51
|
in `extensions` and a `Retry-After` header in `extensions.http.headers`,
|
package/docs/troubleshooting.md
CHANGED
|
@@ -41,6 +41,7 @@ for what causes each.
|
|
|
41
41
|
|
|
42
42
|
**In a response**
|
|
43
43
|
- [`UNAUTHENTICATED` for a signed-in user](#unauthenticated-for-a-signed-in-user)
|
|
44
|
+
- [`MAIL_THROTTLED`, 429, `Too many requests, retry later`](#mail_throttled-429-too-many-requests-retry-later)
|
|
44
45
|
- [`CREDENTIALS_INVALID` with `retryAfter`, 401, for the right password](#credentials_invalid-with-retryafter-401-for-the-right-password)
|
|
45
46
|
- [`FORBIDDEN` where the user should be allowed](#forbidden-where-the-user-should-be-allowed)
|
|
46
47
|
- [`STEP_UP_REQUIRED`, 403](#step_up_required-403)
|
|
@@ -369,6 +370,25 @@ was revoked; or `useJanus({ type })` treats this user's type as anonymous.
|
|
|
369
370
|
**Fix:** send `Authorization: Bearer <token>`, `X-Session-Token`, or the
|
|
370
371
|
session cookie; check `useJanus()`'s `type`.
|
|
371
372
|
|
|
373
|
+
### `MAIL_THROTTLED`, 429, `Too many requests, retry later`
|
|
374
|
+
|
|
375
|
+
With `extensions.retryAfter` and a `Retry-After` header.
|
|
376
|
+
|
|
377
|
+
**Why:** `@nxgt/janus` throttles the requests that hand out something to
|
|
378
|
+
e-mail, on by default: past five for one address (one user, for
|
|
379
|
+
`verifyEmail.send` and an e-mailed `stepUp.request`) in a 10-minute window it
|
|
380
|
+
throws `MAIL_THROTTLED` and issues nothing: a refused request spends and
|
|
381
|
+
rotates nothing, and the last link or code sent still works. An unknown address is counted and
|
|
382
|
+
refused alike. `retryAfter` is the seconds until the window ends.
|
|
383
|
+
|
|
384
|
+
**Fix:** read `extensions.retryAfter` in the client and tell the visitor to use
|
|
385
|
+
the last e-mail they received (it still works), or to wait that many seconds.
|
|
386
|
+
`@nxgt/janus` never sees IP addresses: add a per-IP ceiling with `@nxgt/redis`
|
|
387
|
+
rate limits. To change
|
|
388
|
+
the limit, `janus({ mail: { throttle: { attempts, window } } })`; in a test
|
|
389
|
+
over a `fixedClock`, advance the clock past `retryAfter`, or wire
|
|
390
|
+
`mail: { throttle: false }`.
|
|
391
|
+
|
|
372
392
|
### `CREDENTIALS_INVALID` with `retryAfter`, 401, for the right password
|
|
373
393
|
|
|
374
394
|
With `extensions.retryAfter` and a `Retry-After` header.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nxgt/janus-graphql",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "GraphQL for @nxgt/janus: an envelop plugin with the signed-in user on the context, fields guarded by @authenticated, @fresh and @permission, and every error with the status it deserves",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@envelop/core": "^5.6.1",
|
|
57
57
|
"@graphql-tools/utils": "^12.0.1",
|
|
58
|
-
"@nxgt/janus": "^0.
|
|
58
|
+
"@nxgt/janus": "^0.18.0",
|
|
59
59
|
"@types/bun": "^1.4.2",
|
|
60
60
|
"@types/ws": "^8.18.1",
|
|
61
61
|
"graphql": "^17.0.2",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"peerDependencies": {
|
|
68
68
|
"@envelop/core": "^5.0.0",
|
|
69
69
|
"@graphql-tools/utils": ">=10.0.0 <13",
|
|
70
|
-
"@nxgt/janus": "^0.
|
|
70
|
+
"@nxgt/janus": "^0.18.0",
|
|
71
71
|
"graphql": "^16.9.0 || ^17.0.0",
|
|
72
72
|
"graphql-ws": "^6.0.0",
|
|
73
73
|
"typescript": "^6.0.3"
|