@znight/graphql 0.2.1 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/decorators.ts","../src/validate-args.ts"],"sourcesContent":["/**\n * Marker decorators of `@znight/graphql` (RFC 0005 §5.14). Like every Znight decorator they do\n * nothing at runtime: the compiler extension (`@znight/graphql/compiler`) reads them from the source\n * code, derives the schema from the TypeScript types they reach and generates\n * `metadata.extensions.graphql`. Arguments marked _static_ must be statically evaluable (literals,\n * `const` references); _value_ arguments may also be references to exported bindings (schemas,\n * guard classes). See docs/internals/architecture.md §4.6.\n *\n * Also here: `scalar<T>()`, the scalar aliases (`ID`, `Int`, `Float`, `JSONValue`) and `Loader<L>`,\n * which shares its name with the `@Loader()` decorator (one identity, `@znight/graphql#Loader`, for\n * the parameter decorator and the parameter type).\n */\nimport type { ClassMarker, MethodMarker, ParameterMarker, Scope } from '@znight/core'\nimport type { StandardSchemaV1 } from '@znight/http'\nimport type { GraphQLScalarType } from 'graphql'\nimport type { BatchLoad, BatchLoader, GraphQLGuardClass, LoaderKey, LoaderValue, ScalarDefinition } from './types.ts'\n\nfunction marker(): void {\n // intentionally empty: decorators are compile-time markers\n}\n\nconst classMarker: ClassMarker = marker\nconst methodMarker: MethodMarker = marker\nconst parameterMarker: ParameterMarker = marker\nconst classOrMethodMarker: ClassMarker & MethodMarker = marker\n\n/** GraphQL `ID`: a string on the wire and in TypeScript. Recognised by the compiler through the alias. */\nexport type ID = string\n\n/** GraphQL `Int` (32-bit signed integer). A `number` in TypeScript; plain `number` maps to `Float`. */\nexport type Int = number\n\n/** GraphQL `Float`. Same as `number`, for symmetry with {@link Int}. */\nexport type Float = number\n\n/** Any JSON value: the `JSON` scalar. */\nexport type JSONValue = string | number | boolean | null | readonly JSONValue[] | { readonly [key: string]: JSONValue }\n\n/**\n * The DataLoader of the current execution for the loader provider `L`, injected with `@Loader()`:\n * created on first use, cached for the operation (or for one subscription event), then dropped.\n *\n * ```ts\n * @ResolveField()\n * author(@Parent() book: Book, @Loader() authors: Loader<AuthorsById>): Promise<Author> {\n * return authors.load(book.authorId)\n * }\n * ```\n */\nexport type Loader<L extends BatchLoad<unknown, unknown>> = BatchLoader<LoaderKey<L>, LoaderValue<L>>\n\n/** Options of {@link Resolver} (static). */\nexport interface ResolverOptions {\n /** Provider scope. Default: `singleton`; `request` creates one resolver per operation. */\n readonly scope?: Scope\n}\n\n/**\n * Declares a resolver: a provider (singleton by default) whose `@Query`, `@Mutation`,\n * `@Subscription` and `@ResolveField` methods are fields of the schema. Route decorators of\n * `@znight/http` (`createRouteDecorator`) on the class are the default decisions of its fields.\n *\n * Schema-first (RFC 0007): `@Resolver('Event')` names the SDL object type its `@ResolveField`\n * methods resolve fields of (`@Resolver('Event', { scope })` with options). Code-first rejects a\n * type name (ZNIGHT005): the type is the one of the `@Parent()` parameter.\n *\n * ```ts\n * @Resolver()\n * export class BookResolver {\n * constructor(private readonly catalog: CatalogService) {}\n *\n * @Query()\n * book(@Args('id') id: ID): Promise<Book | null> {\n * return this.catalog.find(id)\n * }\n * }\n * ```\n *\n * @param typeOrOptions static: the SDL type name (schema-first), or `{ scope? }`.\n * @param options static: `{ scope? }`, after a type name.\n */\nexport function Resolver(_typeOrOptions?: string | ResolverOptions, _options?: ResolverOptions): ClassMarker {\n return classMarker\n}\n\n/**\n * A field of the `Query` root type. The method's declared return type is the field type\n * (`Promise<T>` unwrapped), its `@Args` the arguments, its JSDoc the description.\n *\n * @param name static: field name. Default: the method name.\n */\nexport function Query(_name?: string): MethodMarker {\n return methodMarker\n}\n\n/**\n * A field of the `Mutation` root type.\n *\n * @param name static: field name. Default: the method name.\n */\nexport function Mutation(_name?: string): MethodMarker {\n return methodMarker\n}\n\n/**\n * A field of the `Subscription` root type. The method returns an `AsyncIterable<T>` (an async\n * generator, or `pubsub.subscribe(...)`), each value being the field value of one event.\n *\n * @param name static: field name. Default: the method name.\n */\nexport function Subscription(_name?: string): MethodMarker {\n return methodMarker\n}\n\n/**\n * A field resolver: adds a field to the type of the `@Parent()` parameter (mandatory), or replaces\n * the property field of the same name. Schema-first (RFC 0007): resolves the field of the type named\n * by `@Resolver('Type')`, `@Parent()` optional.\n *\n * @param name static: field name. Default: the method name.\n */\nexport function ResolveField(_name?: string): MethodMarker {\n return methodMarker\n}\n\n/**\n * Field arguments. Without a name, the properties of the parameter type become arguments\n * (`@Args() filter: BookFilter`); with a name, one argument (`@Args('id') id: ID`). With a Standard\n * Schema, the value is validated (and transformed) after GraphQL coerced it; a failure is a\n * `BAD_USER_INPUT` error listing the issues.\n *\n * @param name static: argument name.\n * @param schema value: a Standard Schema validating the value (its output is injected).\n */\nexport function Args(): ParameterMarker\nexport function Args(name: string, schema?: StandardSchemaV1): ParameterMarker\nexport function Args(schema: StandardSchemaV1): ParameterMarker\nexport function Args(_nameOrSchema?: string | StandardSchemaV1, _schema?: StandardSchemaV1): ParameterMarker {\n return parameterMarker\n}\n\n/** The parent object of a field resolver (`@ResolveField` only; its type is the parent type). */\nexport function Parent(): ParameterMarker {\n return parameterMarker\n}\n\n/** The `GraphQLContext` of the operation. */\nexport function Ctx(): ParameterMarker {\n return parameterMarker\n}\n\n/** The graphql-js `GraphQLResolveInfo` of the call (escape hatch). */\nexport function Info(): ParameterMarker {\n return parameterMarker\n}\n\n/** The DataLoader of the current execution for the `Loader<L>` parameter type (see {@link Loader}). */\nexport function Loader(): ParameterMarker {\n return parameterMarker\n}\n\n/**\n * Guards of the fields of a resolver class or of one field, run after the global guards (class\n * guards, then method guards). Guards are providers implementing `GraphQLGuard`.\n *\n * @param guards value: guard classes.\n */\nexport function UseGuard(..._guards: [GraphQLGuardClass, ...GraphQLGuardClass[]]): ClassMarker & MethodMarker {\n return classOrMethodMarker\n}\n\n/**\n * Maps the TypeScript type `T` to the GraphQL scalar `name` wherever it appears. `name` is static;\n * the returned definition must be exported (`export const`): the generated module imports it.\n * Returns `definition` unchanged.\n *\n * ```ts\n * export type EmailAddress = string & { readonly __brand: 'EmailAddress' }\n *\n * export const EmailAddressScalar = scalar<EmailAddress>('EmailAddress', {\n * serialize: value => value,\n * parseValue: value => {\n * if (typeof value !== 'string' || !value.includes('@')) throw new TypeError('Expected an e-mail address')\n * return value.toLowerCase() as EmailAddress\n * },\n * })\n *\n * export const UrlScalar = scalar<URL>('URL', GraphQLURL) // a graphql-js GraphQLScalarType\n * ```\n *\n * @param name static: the GraphQL name of the scalar.\n * @param definition value: a {@link ScalarDefinition} or a graphql-js `GraphQLScalarType` (whose\n * name must be `name`, ZNIGHT066 at boot otherwise).\n */\nexport function scalar<T>(name: string, definition: ScalarDefinition<T>): ScalarDefinition<T>\nexport function scalar<T>(name: string, definition: GraphQLScalarType): GraphQLScalarType<T>\nexport function scalar<T>(\n _name: string,\n definition: ScalarDefinition<T> | GraphQLScalarType,\n): ScalarDefinition<T> | GraphQLScalarType {\n return definition\n}\n","/**\n * `validateArgs()`: Standard Schema validation of resolver arguments (RFC 0005 §5.4, §7.3), called\n * by the generated `invoke` functions (README, \"Compiler contract\").\n */\nimport type { InferSchemaOutput, StandardSchemaV1, StandardSchemaV1Result } from '@znight/http'\n\nimport { isThenable, toIssueDetail } from '@znight/http'\n\nimport { GraphQLErrorCode, GraphQLException } from './errors.ts'\n\n/**\n * Validates an argument value (after GraphQL coercion) with a [Standard Schema](https://standardschema.dev)\n * (Zod, Valibot, ArkType...) and returns the schema **output** (transforms run, defaults applied).\n *\n * Synchronous when the schema validates synchronously (no promise, no microtask), a promise\n * otherwise: generated code `await`s the result, which is free for a plain value.\n *\n * @param label what is validated, for the message: the argument name (`'input'`), or `'arguments'`\n * for `@Args(Schema)` without name.\n * @throws GraphQLException `BAD_USER_INPUT`, `extensions.issues: [{ path, message }]`, when the\n * value is invalid.\n * @throws TypeError when `schema` is not a Standard Schema v1 (a programming error, masked).\n */\nexport function validateArgs<S extends StandardSchemaV1>(\n schema: S,\n value: unknown,\n label: string,\n): InferSchemaOutput<S> | Promise<InferSchemaOutput<S>> {\n const props =\n schema !== null && (typeof schema === 'object' || typeof schema === 'function')\n ? (schema as { readonly '~standard'?: { readonly version?: unknown; readonly validate?: unknown } })['~standard']\n : undefined\n if (props === null || typeof props !== 'object' || props.version !== 1 || typeof props.validate !== 'function') {\n throw new TypeError(`The schema of ${label} is not a Standard Schema v1 (missing \"~standard.validate\")`)\n }\n const result = (props.validate as (value: unknown) => StandardSchemaV1Result<InferSchemaOutput<S>>)(value)\n // sync fast path: most schemas validate synchronously\n if (isThenable(result)) return Promise.resolve(result).then(settled => unwrap(settled, label))\n return unwrap(result, label)\n}\n\nfunction unwrap<T>(result: StandardSchemaV1Result<T>, label: string): T {\n if (result.issues === undefined) return result.value\n throw new GraphQLException(`Invalid ${label}`, {\n code: GraphQLErrorCode.BadUserInput,\n extensions: { issues: result.issues.map(toIssueDetail) },\n })\n}\n"],"mappings":";;;;AAiBA,SAAS,SAAe,CAExB;AAEA,MAAM,cAA2B;AACjC,MAAM,eAA6B;AACnC,MAAM,kBAAmC;AACzC,MAAM,sBAAkD;;;;;;;;;;;;;;;;;;;;;;;;;AAyDxD,SAAgB,SAAS,gBAA2C,UAAyC;CAC3G,OAAO;AACT;;;;;;;AAQA,SAAgB,MAAM,OAA8B;CAClD,OAAO;AACT;;;;;;AAOA,SAAgB,SAAS,OAA8B;CACrD,OAAO;AACT;;;;;;;AAQA,SAAgB,aAAa,OAA8B;CACzD,OAAO;AACT;;;;;;;;AASA,SAAgB,aAAa,OAA8B;CACzD,OAAO;AACT;AAcA,SAAgB,KAAK,eAA2C,SAA6C;CAC3G,OAAO;AACT;;AAGA,SAAgB,SAA0B;CACxC,OAAO;AACT;;AAGA,SAAgB,MAAuB;CACrC,OAAO;AACT;;AAGA,SAAgB,OAAwB;CACtC,OAAO;AACT;;AAGA,SAAgB,SAA0B;CACxC,OAAO;AACT;;;;;;;AAQA,SAAgB,SAAS,GAAG,SAAkF;CAC5G,OAAO;AACT;AA2BA,SAAgB,OACd,OACA,YACyC;CACzC,OAAO;AACT;;;;;;;;;;;;;;;AClLA,SAAgB,aACd,QACA,OACA,OACsD;CACtD,MAAM,QACJ,WAAW,SAAS,OAAO,WAAW,YAAY,OAAO,WAAW,cAC/D,OAAkG,eACnG,KAAA;CACN,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,YAAY,KAAK,OAAO,MAAM,aAAa,YAClG,MAAM,IAAI,UAAU,iBAAiB,MAAM,4DAA4D;CAEzG,MAAM,SAAU,MAAM,SAA8E,KAAK;CAEzG,IAAI,WAAW,MAAM,GAAG,OAAO,QAAQ,QAAQ,MAAM,CAAC,CAAC,MAAK,YAAW,OAAO,SAAS,KAAK,CAAC;CAC7F,OAAO,OAAO,QAAQ,KAAK;AAC7B;AAEA,SAAS,OAAU,QAAmC,OAAkB;CACtE,IAAI,OAAO,WAAW,KAAA,GAAW,OAAO,OAAO;CAC/C,MAAM,IAAI,iBAAiB,WAAW,SAAS;EAC7C,MAAM,iBAAiB;EACvB,YAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,aAAa,EAAE;CACzD,CAAC;AACH"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/decorators.ts","../src/validate-args.ts"],"sourcesContent":["/**\n * Marker decorators of `@znight/graphql` (RFC 0005 §5.14). Like every Znight decorator they do\n * nothing at runtime: the compiler extension (`@znight/graphql/compiler`) reads them from the source\n * code, derives the schema from the TypeScript types they reach and generates\n * `metadata.extensions.graphql`. Arguments marked _static_ must be statically evaluable (literals,\n * `const` references); _value_ arguments may also be references to exported bindings (schemas,\n * guard classes). See docs/internals/architecture.md §4.6.\n *\n * Also here: `scalar<T>()`, the scalar aliases (`ID`, `Int`, `Float`, `JSONValue`) and `Loader<L>`,\n * which shares its name with the `@Loader()` decorator (one identity, `@znight/graphql#Loader`, for\n * the parameter decorator and the parameter type).\n */\nimport type { ClassMarker, MethodMarker, ParameterMarker, Scope } from '@znight/core'\nimport type { StandardSchemaV1 } from '@znight/http'\nimport type { GraphQLScalarType } from 'graphql'\nimport type { BatchLoad, BatchLoader, GraphQLGuardClass, LoaderKey, LoaderValue, ScalarDefinition } from './types.ts'\n\nfunction marker(): void {\n // intentionally empty: decorators are compile-time markers\n}\n\nconst classMarker: ClassMarker = marker\nconst methodMarker: MethodMarker = marker\nconst parameterMarker: ParameterMarker = marker\nconst classOrMethodMarker: ClassMarker & MethodMarker = marker\n\n/** GraphQL `ID`: a string on the wire and in TypeScript. Recognised by the compiler through the alias. */\nexport type ID = string\n\n/** GraphQL `Int` (32-bit signed integer). A `number` in TypeScript; plain `number` maps to `Float`. */\nexport type Int = number\n\n/** GraphQL `Float`. Same as `number`, for symmetry with {@link Int}. */\nexport type Float = number\n\n/** Any JSON value: the `JSON` scalar. */\nexport type JSONValue = string | number | boolean | null | readonly JSONValue[] | { readonly [key: string]: JSONValue }\n\n/**\n * The DataLoader of the current execution for the loader provider `L`, injected with `@Loader()`:\n * created on first use, cached for the operation (or for one subscription event), then dropped.\n *\n * ```ts\n * @ResolveField()\n * author(@Parent() book: Book, @Loader() authors: Loader<AuthorsById>): Promise<Author> {\n * return authors.load(book.authorId)\n * }\n * ```\n */\nexport type Loader<L extends BatchLoad<unknown, unknown>> = BatchLoader<LoaderKey<L>, LoaderValue<L>>\n\n/** Options of {@link Resolver} (static). */\nexport interface ResolverOptions {\n /** Provider scope. Default: `singleton`; `request` creates one resolver per operation. */\n readonly scope?: Scope\n}\n\n/**\n * Declares a resolver: a provider (singleton by default) whose `@Query`, `@Mutation`,\n * `@Subscription` and `@ResolveField` methods are fields of the schema. Route decorators of\n * `@znight/http` (`createRouteDecorator`) on the class are the default decisions of its fields.\n *\n * Schema-first (RFC 0007): `@Resolver('Event')` names the SDL object type its `@ResolveField`\n * methods resolve fields of (`@Resolver('Event', { scope })` with options). Code-first rejects a\n * type name (ZNIGHT005): the type is the one of the `@Parent()` parameter.\n *\n * ```ts\n * @Resolver()\n * export class BookResolver {\n * constructor(private readonly catalog: CatalogService) {}\n *\n * @Query()\n * book(@Args('id') id: ID): Promise<Book | null> {\n * return this.catalog.find(id)\n * }\n * }\n * ```\n *\n * @param typeOrOptions static: the SDL type name (schema-first), or `{ scope? }`.\n * @param options static: `{ scope? }`, after a type name.\n */\nexport function Resolver(_typeOrOptions?: string | ResolverOptions, _options?: ResolverOptions): ClassMarker {\n return classMarker\n}\n\n/**\n * A field of the `Query` root type. The method's declared return type is the field type\n * (`Promise<T>` unwrapped), its `@Args` the arguments, its JSDoc the description.\n *\n * @param name static: field name. Default: the method name.\n */\nexport function Query(_name?: string): MethodMarker {\n return methodMarker\n}\n\n/**\n * A field of the `Mutation` root type.\n *\n * @param name static: field name. Default: the method name.\n */\nexport function Mutation(_name?: string): MethodMarker {\n return methodMarker\n}\n\n/**\n * A field of the `Subscription` root type. The method returns an `AsyncIterable<T>` (an async\n * generator, or `pubsub.subscribe(...)`), each value being the field value of one event.\n *\n * @param name static: field name. Default: the method name.\n */\nexport function Subscription(_name?: string): MethodMarker {\n return methodMarker\n}\n\n/**\n * A field resolver: adds a field to the type of the `@Parent()` parameter (mandatory), or replaces\n * the property field of the same name. Schema-first (RFC 0007): resolves the field of the type named\n * by `@Resolver('Type')`, `@Parent()` optional.\n *\n * @param name static: field name. Default: the method name.\n */\nexport function ResolveField(_name?: string): MethodMarker {\n return methodMarker\n}\n\n/**\n * Field arguments. Without a name, the properties of the parameter type become arguments\n * (`@Args() filter: BookFilter`); with a name, one argument (`@Args('id') id: ID`). With a Standard\n * Schema, the value is validated (and transformed) after GraphQL coerced it; a failure is a\n * `BAD_USER_INPUT` error listing the issues.\n *\n * @param name static: argument name.\n * @param schema value: a Standard Schema validating the value (its output is injected).\n */\nexport function Args(): ParameterMarker\nexport function Args(name: string, schema?: StandardSchemaV1): ParameterMarker\nexport function Args(schema: StandardSchemaV1): ParameterMarker\nexport function Args(_nameOrSchema?: string | StandardSchemaV1, _schema?: StandardSchemaV1): ParameterMarker {\n return parameterMarker\n}\n\n/** The parent object of a field resolver (`@ResolveField` only; its type is the parent type). */\nexport function Parent(): ParameterMarker {\n return parameterMarker\n}\n\n/** The `GraphQLContext` of the operation. */\nexport function Ctx(): ParameterMarker {\n return parameterMarker\n}\n\n/** The graphql-js `GraphQLResolveInfo` of the call (escape hatch). */\nexport function Info(): ParameterMarker {\n return parameterMarker\n}\n\n/** The DataLoader of the current execution for the `Loader<L>` parameter type (see {@link Loader}). */\nexport function Loader(): ParameterMarker {\n return parameterMarker\n}\n\n/**\n * Guards of the fields of a resolver class or of one field, run after the global guards (class\n * guards, then method guards). Guards are providers implementing `GraphQLGuard`.\n *\n * @param guards value: guard classes.\n */\nexport function UseGuard(..._guards: [GraphQLGuardClass, ...GraphQLGuardClass[]]): ClassMarker & MethodMarker {\n return classOrMethodMarker\n}\n\n/**\n * Maps the TypeScript type `T` to the GraphQL scalar `name` wherever it appears. `name` is static;\n * the returned definition must be exported (`export const`): the generated module imports it.\n * Returns `definition` unchanged.\n *\n * ```ts\n * export type EmailAddress = string & { readonly __brand: 'EmailAddress' }\n *\n * export const EmailAddressScalar = scalar<EmailAddress>('EmailAddress', {\n * serialize: value => value,\n * parseValue: value => {\n * if (typeof value !== 'string' || !value.includes('@')) throw new TypeError('Expected an e-mail address')\n * return value.toLowerCase() as EmailAddress\n * },\n * })\n *\n * export const UrlScalar = scalar<URL>('URL', GraphQLURL) // a graphql-js GraphQLScalarType\n * ```\n *\n * @param name static: the GraphQL name of the scalar.\n * @param definition value: a {@link ScalarDefinition} or a graphql-js `GraphQLScalarType` (whose\n * name must be `name`, ZNIGHT066 at boot otherwise).\n */\nexport function scalar<T>(name: string, definition: ScalarDefinition<T>): ScalarDefinition<T>\nexport function scalar<T>(name: string, definition: GraphQLScalarType): GraphQLScalarType<T>\nexport function scalar<T>(\n _name: string,\n definition: ScalarDefinition<T> | GraphQLScalarType,\n): ScalarDefinition<T> | GraphQLScalarType {\n return definition\n}\n","/**\n * `validateArgs()`: Standard Schema validation of resolver arguments (RFC 0005 §5.4, §7.3), called\n * by the generated `invoke` functions (README, \"Compiler contract\").\n */\nimport type { InferSchemaOutput, StandardSchemaV1, StandardSchemaV1Result } from '@znight/http'\n\nimport { isThenable, toIssueDetail } from '@znight/http'\n\nimport { GraphQLErrorCode, GraphQLException } from './errors.ts'\n\n/**\n * Validates an argument value (after GraphQL coercion) with a [Standard Schema](https://standardschema.dev)\n * (Zod, Valibot, ArkType...) and returns the schema **output** (transforms run, defaults applied).\n *\n * Synchronous when the schema validates synchronously (no promise, no microtask), a promise\n * otherwise: generated code `await`s the result, which is free for a plain value.\n *\n * @param label what is validated, for the message: the argument name (`'input'`), or `'arguments'`\n * for `@Args(Schema)` without name.\n * @throws GraphQLException `BAD_USER_INPUT`, `extensions.issues: [{ path, message }]`, when the\n * value is invalid.\n * @throws TypeError when `schema` is not a Standard Schema v1 (a programming error, masked).\n */\nexport function validateArgs<S extends StandardSchemaV1>(\n schema: S,\n value: unknown,\n label: string,\n): InferSchemaOutput<S> | Promise<InferSchemaOutput<S>> {\n const props =\n schema !== null && (typeof schema === 'object' || typeof schema === 'function')\n ? (schema as { readonly '~standard'?: { readonly version?: unknown; readonly validate?: unknown } })['~standard']\n : undefined\n if (props === null || typeof props !== 'object' || props.version !== 1 || typeof props.validate !== 'function') {\n throw new TypeError(`The schema of ${label} is not a Standard Schema v1 (missing \"~standard.validate\")`)\n }\n const result = (props.validate as (value: unknown) => StandardSchemaV1Result<InferSchemaOutput<S>>)(value)\n // sync fast path: most schemas validate synchronously\n if (isThenable(result)) return Promise.resolve(result).then(settled => unwrap(settled, label))\n return unwrap(result, label)\n}\n\nfunction unwrap<T>(result: StandardSchemaV1Result<T>, label: string): T {\n if (result.issues === undefined) return result.value\n throw new GraphQLException(`Invalid ${label}`, {\n code: GraphQLErrorCode.BadUserInput,\n extensions: { issues: result.issues.map(toIssueDetail) },\n })\n}\n"],"mappings":";;;;;AAiBA,SAAS,SAAe,CAExB;AAEA,MAAM,cAA2B;AACjC,MAAM,eAA6B;AACnC,MAAM,kBAAmC;AACzC,MAAM,sBAAkD;;;;;;;;;;;;;;;;;;;;;;;;;AAyDxD,SAAgB,SAAS,gBAA2C,UAAyC;CAC3G,OAAO;AACT;;;;;;;AAQA,SAAgB,MAAM,OAA8B;CAClD,OAAO;AACT;;;;;;AAOA,SAAgB,SAAS,OAA8B;CACrD,OAAO;AACT;;;;;;;AAQA,SAAgB,aAAa,OAA8B;CACzD,OAAO;AACT;;;;;;;;AASA,SAAgB,aAAa,OAA8B;CACzD,OAAO;AACT;AAcA,SAAgB,KAAK,eAA2C,SAA6C;CAC3G,OAAO;AACT;;AAGA,SAAgB,SAA0B;CACxC,OAAO;AACT;;AAGA,SAAgB,MAAuB;CACrC,OAAO;AACT;;AAGA,SAAgB,OAAwB;CACtC,OAAO;AACT;;AAGA,SAAgB,SAA0B;CACxC,OAAO;AACT;;;;;;;AAQA,SAAgB,SAAS,GAAG,SAAkF;CAC5G,OAAO;AACT;AA2BA,SAAgB,OACd,OACA,YACyC;CACzC,OAAO;AACT;;;;;;;;;;;;;;;AClLA,SAAgB,aACd,QACA,OACA,OACsD;CACtD,MAAM,QACJ,WAAW,SAAS,OAAO,WAAW,YAAY,OAAO,WAAW,cAC/D,OAAkG,eACnG,KAAA;CACN,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,YAAY,KAAK,OAAO,MAAM,aAAa,YAClG,MAAM,IAAI,UAAU,iBAAiB,MAAM,4DAA4D;CAEzG,MAAM,SAAU,MAAM,SAA8E,KAAK;CAEzG,IAAI,WAAW,MAAM,GAAG,OAAO,QAAQ,QAAQ,MAAM,CAAC,CAAC,MAAK,YAAW,OAAO,SAAS,KAAK,CAAC;CAC7F,OAAO,OAAO,QAAQ,KAAK;AAC7B;AAEA,SAAS,OAAU,QAAmC,OAAkB;CACtE,IAAI,OAAO,WAAW,KAAA,GAAW,OAAO,OAAO;CAC/C,MAAM,IAAI,iBAAiB,WAAW,SAAS;EAC7C,MAAM,iBAAiB;EACvB,YAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,aAAa,EAAE;CACzD,CAAC;AACH"}