graphql-gene
Version:
Generates automatically an executable schema out of your ORM models
1 lines • 30.6 kB
Source Map (JSON)
{"version":3,"file":"schema.cjs","sources":["../src/schema.html?raw","../src/schema.ts"],"sourcesContent":["export default \"<!doctype html>\\n<html lang=\\\"en\\\" class=\\\"hljs\\\">\\n <head>\\n <meta charset=\\\"UTF-8\\\" />\\n <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\" />\\n <title>GraphQL Schema</title>\\n\\n <link rel=\\\"stylesheet\\\" href=\\\"https://unpkg.com/initialize-css@1.2.0/dist/initialize.min.css\\\" />\\n <link\\n rel=\\\"stylesheet\\\"\\n href=\\\"https://unpkg.com/@highlightjs/cdn-assets@11.9.0/styles/atom-one-dark-reasonable.css\\\"\\n />\\n </head>\\n <body>\\n <pre><code class=\\\"language-graphql lineHeightNormal\\\"><%= code %></code></pre>\\n\\n <script src=\\\"https://unpkg.com/@highlightjs/cdn-assets@11.9.0/highlight.min.js\\\"></script>\\n <script>\\n hljs.highlightAll()\\n </script>\\n </body>\\n</html>\\n\"","import {\n parse,\n buildSchema,\n extendSchema,\n GraphQLSchema,\n GraphQLObjectType,\n parseType,\n isScalarType,\n} from 'graphql'\nimport type { DocumentNode } from 'graphql'\nimport { type GeneConfig, type GeneConfigTypes, type GeneDirectiveConfig } from './defineConfig'\nimport type { AnyObject, Mutable } from './types/typeUtils'\nimport {\n getGraphqlType,\n lookDeepInSchema,\n parseSchemaOption,\n printSchemaWithDirectives,\n isUsingDefaultResolver,\n normalizeFieldConfig,\n isListType,\n isArrayFieldConfig,\n isObjectFieldConfig,\n getDefaultTypeDefLinesObject,\n getDefaultFieldLinesObject,\n getGeneConfigFromOptions,\n isFieldIncluded,\n isObject,\n getGloballyExtendedTypes,\n getReturnTypeName,\n getFieldDefinition,\n setGeneConfigByType,\n} from './utils'\nimport { addResolversToSchema } from './resolvers'\nimport SCHEMA_TEMPLATE_HTML from './schema.html?raw'\nimport type {\n BasicGraphqlType,\n DirectiveDefs,\n GenePlugin,\n Resolvers,\n ResolversOrScalars,\n TypeDefLines,\n} from './types'\nimport {\n generateDefaultQueryFilterTypeDefs,\n populateArgsDefForDefaultResolver,\n} from './defaultResolver'\n\nexport function generateSchema<\n SchemaTypes extends AnyObject,\n DataTypes extends AnyObject,\n>(options: {\n schema?: GraphQLSchema | DocumentNode | string\n resolvers?: ResolversOrScalars\n plugins?: GenePlugin[]\n types: SchemaTypes\n dataTypeMap?: DataTypes\n}) {\n const providedScalars = options.resolvers\n ? Object.values(options.resolvers)\n .filter(typeConfig => isScalarType(typeConfig))\n .map(({ name }) => name)\n : []\n\n const initialSchema = parseSchemaOption(options.schema, providedScalars)\n const { typeDefsString, typeDefLines } = generateGeneTypeDefs({\n ...options,\n schema: initialSchema,\n })\n\n const schema = initialSchema\n ? extendSchema(initialSchema, parse(typeDefsString))\n : buildSchema(typeDefsString)\n\n const queryType = schema.getType('Query')\n const mutationType = schema.getType('Mutation')\n\n if (!queryType) {\n throw new Error('Query root type must be provided.')\n }\n if (!(queryType instanceof GraphQLObjectType)) {\n throw new Error('Query type is not a GraphQLObjectType.')\n }\n const schemaOptions: Mutable<ConstructorParameters<typeof GraphQLSchema>[0]> = {\n query: queryType,\n }\n const schemaTypeMap = schema.getTypeMap()\n\n if (mutationType) {\n if (!(mutationType instanceof GraphQLObjectType)) {\n throw new Error('Mutation type is not a GraphQLObjectType.')\n }\n schemaOptions.mutation = mutationType\n }\n\n if (options.resolvers) {\n Object.entries(options.resolvers).forEach(([parentType, typeConfig]) => {\n if (isScalarType(typeConfig)) {\n Object.assign(schemaTypeMap[parentType], typeConfig)\n return\n }\n Object.entries(typeConfig).forEach(([field, resolver]) => {\n const fieldDef = getFieldDefinition({ schema, parent: parentType, field })\n if (fieldDef) fieldDef.resolve = resolver\n else throw new Error(`No field definition found for \"${field}\" of type \"${parentType}.`)\n })\n })\n }\n\n let executableSchema = new GraphQLSchema({\n ...schema.toConfig(),\n ...schemaOptions,\n types: Object.values(schemaTypeMap),\n })\n\n executableSchema = addResolversToSchema({\n typeDefLines,\n schema: executableSchema,\n plugins: options.plugins || [],\n types: options.types,\n })\n\n return {\n schema: executableSchema,\n\n get schemaString() {\n return printSchemaWithDirectives(executableSchema)\n },\n get typeDefs() {\n return parse(this.schemaString)\n },\n get resolvers() {\n const resolvers: Resolvers = {}\n\n lookDeepInSchema({\n schema: executableSchema,\n each({ field, fieldDef, parentType }) {\n if (!fieldDef.resolve) return\n\n resolvers[parentType] = resolvers[parentType] || {}\n resolvers[parentType][field] = fieldDef.resolve\n },\n })\n return resolvers\n },\n get schemaHtml() {\n return SCHEMA_TEMPLATE_HTML.replace('<%= code %>', this.schemaString)\n },\n }\n}\n\nfunction generateGeneTypeDefs<SchemaTypes extends AnyObject, DataTypes extends AnyObject>(options: {\n schema?: GraphQLSchema\n resolvers?: ResolversOrScalars\n plugins?: GenePlugin[]\n types: SchemaTypes\n dataTypeMap?: DataTypes\n}) {\n const directiveDefs: DirectiveDefs = {}\n const typeDefLines: TypeDefLines = {}\n const afterTypeDefHooks: (() => void)[] = []\n\n Object.entries(options.types).forEach(([graphqlType, fieldConfigs]) => {\n let hasUsedPlugin = false\n\n for (const plugin of options.plugins || []) {\n const isMatching = plugin.isMatching(fieldConfigs)\n if (!isMatching) continue\n\n const { afterTypeDefHooks: hooks } = forEachModel({\n directiveDefs,\n typeDefLines,\n types: options.types,\n schema: options.schema,\n resolvers: options.resolvers,\n plugin,\n modelKey: graphqlType,\n model: fieldConfigs,\n dataTypeMap: options.dataTypeMap,\n })\n afterTypeDefHooks.push(...hooks)\n\n forEachModelOnTypeDefCompleted({\n typeDefLines,\n modelKey: graphqlType,\n model: fieldConfigs,\n })\n\n hasUsedPlugin = true\n break\n }\n\n if (!hasUsedPlugin && (isArrayFieldConfig(fieldConfigs) || isObjectFieldConfig(fieldConfigs))) {\n generateTypeDefLines({\n directiveDefs,\n typeDefLines,\n graphqlType,\n fieldConfigs: fieldConfigs,\n })\n }\n })\n const globallyExtendedTypes = getGloballyExtendedTypes()\n\n Object.entries(globallyExtendedTypes.config).forEach(([graphqlType, fieldConfigs]) => {\n generateTypeDefLines({\n directiveDefs,\n typeDefLines,\n graphqlType,\n fieldConfigs: fieldConfigs as GeneConfigTypes,\n })\n\n Object.entries(fieldConfigs).forEach(([fieldKey, fieldConfig]) => {\n const normalizedFieldConfig = normalizeFieldConfig(fieldConfig)\n if (!isUsingDefaultResolver(normalizedFieldConfig)) return\n\n generateDefaultQueryFilterTypeDefs({\n typeDefLines,\n graphqlType,\n fieldKey,\n fieldType: getReturnTypeName(normalizedFieldConfig.returnType),\n })\n })\n })\n\n afterTypeDefHooks.forEach(hook => hook())\n\n const typeDefs: string[] = []\n let sortedTypeDefLines = typeDefLines\n\n // Put type Query at the top\n if ('Query' in typeDefLines) {\n const { Query, ...restTypeDefLines } = typeDefLines\n sortedTypeDefLines = { Query, ...restTypeDefLines }\n }\n\n Object.entries(sortedTypeDefLines).forEach(([type, fieldLines]) => {\n const line = stringifyFieldLines(type, fieldLines)\n if (line) typeDefs.push(line)\n })\n let typeDefsString = typeDefs.join('\\n\\n')\n\n Object.entries(directiveDefs).forEach(([directiveName, directiveConfig]) => {\n let directiveDef = `directive @${directiveName}`\n\n const rawArgsDefEntries = Object.entries(directiveConfig.argsDef)\n const argsDefEntries = rawArgsDefEntries.filter(([, types]) => [...types].some(t => t !== null))\n\n const printTypes = (types: Set<string | string[] | null>) => {\n const typeDefs = [...types]\n return [\n typeDefs.filter(t => t !== null),\n types.has(null) || typeDefs.some(type => /^\\[/.test(String(type))) ? '' : '!',\n ].join('')\n }\n\n if (argsDefEntries.length) {\n directiveDef += '(\\n'\n directiveDef += argsDefEntries.map(([k, types]) => ` ${k}: ${printTypes(types)}`).join('\\n')\n directiveDef += '\\n)'\n }\n directiveDef += ' on OBJECT | FIELD_DEFINITION'\n\n typeDefsString = `${directiveDef}\\n\\n${typeDefsString}`\n })\n\n return { typeDefsString, typeDefLines }\n}\n\nfunction forEachModel<M, SchemaTypes extends AnyObject>(options: {\n directiveDefs: DirectiveDefs\n typeDefLines: TypeDefLines\n types: SchemaTypes\n schema?: GraphQLSchema\n resolvers?: ResolversOrScalars\n plugin: GenePlugin<M>\n modelKey: string\n model: M\n dataTypeMap?: { [k: string | symbol]: BasicGraphqlType }\n}) {\n const afterTypeDefHooks: (() => void)[] = []\n\n const { afterTypeDefHooks: hooks } = generateTypeDefs(options)\n afterTypeDefHooks.push(...hooks)\n\n generateAdditionalTypeDefs(options)\n\n const geneConfig = getGeneConfigFromOptions(options)\n\n Object.entries(geneConfig?.aliases || {}).forEach(([aliasKey, geneConfig]) => {\n const { afterTypeDefHooks: hooks } = generateTypeDefs({\n ...options,\n geneConfig,\n modelKey: aliasKey,\n })\n afterTypeDefHooks.push(...hooks)\n\n generateAdditionalTypeDefs({ ...options, geneConfig })\n })\n return { afterTypeDefHooks }\n}\n\nfunction forEachModelOnTypeDefCompleted<M>(options: {\n typeDefLines: TypeDefLines\n modelKey: string\n model: M\n}) {\n generateQueryFilterTypeDefs(options)\n\n const geneConfig = getGeneConfigFromOptions(options)\n if (!geneConfig?.types) return\n\n Object.entries(geneConfig?.aliases || {}).forEach(([, geneConfig]) => {\n generateQueryFilterTypeDefs({ ...options, geneConfig })\n })\n}\n\nfunction generateTypeDefs<M, SchemaTypes extends AnyObject>(options: {\n directiveDefs: DirectiveDefs\n typeDefLines: TypeDefLines\n types: SchemaTypes\n schema?: GraphQLSchema\n resolvers?: ResolversOrScalars\n modelKey: string\n model: M\n plugin: GenePlugin<M>\n geneConfig?: GeneConfig<M>\n dataTypeMap?: { [k: string | symbol]: BasicGraphqlType }\n}) {\n const geneConfig = getGeneConfigFromOptions(options)\n const afterTypeDefHooks: (() => void)[] = []\n\n setGeneConfigByType(options.modelKey, geneConfig)\n\n const optionsForPopulateTypeDefs = {\n typeDefLines: options.typeDefLines,\n model: options.model,\n typeName: options.modelKey,\n isFieldIncluded: (fieldKey: string) => isFieldIncluded(geneConfig, fieldKey),\n schemaOptions: options,\n }\n\n if (options.plugin.populateTypeDefs) {\n const { afterTypeDefHooks: hooks } = options.plugin.populateTypeDefs(optionsForPopulateTypeDefs)\n afterTypeDefHooks.push(...hooks)\n } else {\n const typeDef = options.plugin.getTypeDef(optionsForPopulateTypeDefs)\n options.typeDefLines[options.modelKey] = typeDef\n }\n\n registerDirectives({\n // @ts-expect-error Fix type issue raised by incompatible TSource\n configs: geneConfig?.directives,\n defs: options.directiveDefs,\n each: ({ directiveDef }) => {\n options.typeDefLines[options.modelKey].directives.add(directiveDef)\n },\n })\n return { afterTypeDefHooks }\n}\n\n/**\n * Generate type definition object from `geneConfig.types`\n */\nfunction generateAdditionalTypeDefs<M>(options: {\n directiveDefs: DirectiveDefs\n typeDefLines: TypeDefLines\n modelKey: string\n model: M\n geneConfig?: GeneConfig<M>\n}) {\n const geneConfig = getGeneConfigFromOptions(options)\n if (!geneConfig?.types) return\n\n Object.entries(geneConfig.types).forEach(([graphqlType, fieldConfigs]) => {\n generateTypeDefLines({ ...options, graphqlType, fieldConfigs: fieldConfigs as GeneConfigTypes })\n })\n}\n\nfunction generateTypeDefLines(options: {\n directiveDefs: DirectiveDefs\n typeDefLines: TypeDefLines\n graphqlType: string\n fieldConfigs: GeneConfigTypes\n}) {\n let objFieldConfigs = options.fieldConfigs\n\n options.typeDefLines[options.graphqlType] = {\n ...getDefaultTypeDefLinesObject(),\n ...options.typeDefLines[options.graphqlType],\n }\n\n if (\n isObject(objFieldConfigs) &&\n 'geneConfig' in objFieldConfigs &&\n objFieldConfigs.geneConfig?.varType\n ) {\n const varType = objFieldConfigs.geneConfig.varType\n options.typeDefLines[options.graphqlType].varType = varType\n\n if (varType === 'union') {\n const objConfigs: Record<string, ''> = {}\n\n Object.keys(objFieldConfigs)\n .filter(field => field !== 'geneConfig')\n .forEach(field => (objConfigs[field] = ''))\n\n objFieldConfigs = objConfigs\n }\n }\n\n // If options.fieldConfigs is an array, we should treat it as an enum\n if (isArrayFieldConfig(options.fieldConfigs)) {\n options.typeDefLines[options.graphqlType].varType = 'enum'\n\n const objConfigs: Record<string, ''> = {}\n options.fieldConfigs.forEach(field => (objConfigs[field] = ''))\n\n objFieldConfigs = objConfigs\n } else {\n const geneConfig = options.fieldConfigs.geneConfig\n if (geneConfig?.varType) options.typeDefLines[options.graphqlType].varType = geneConfig.varType\n }\n\n Object.entries(objFieldConfigs).forEach(([fieldKey, fieldConfig]) => {\n if (fieldKey === 'geneConfig') return\n\n const normalizedFieldConfig = normalizeFieldConfig(fieldConfig)\n\n options.typeDefLines[options.graphqlType].lines[fieldKey] = {\n ...getDefaultFieldLinesObject(),\n ...options.typeDefLines[options.graphqlType].lines[fieldKey],\n }\n\n const fieldLineConfig = options.typeDefLines[options.graphqlType].lines[fieldKey]\n\n if (normalizedFieldConfig.returnType) {\n fieldLineConfig.typeDef = normalizedFieldConfig.returnType\n }\n\n if (isUsingDefaultResolver(normalizedFieldConfig)) {\n populateArgsDefForDefaultResolver({\n fieldLineConfig,\n graphqlType: options.graphqlType,\n fieldKey,\n isList: isListType(parseType(fieldLineConfig.typeDef)),\n })\n } else if (normalizedFieldConfig.args) {\n Object.entries(normalizedFieldConfig.args).forEach(([argKey, argDef]) => {\n if (typeof argDef !== 'string') return\n\n fieldLineConfig.argsDef[argKey] = fieldLineConfig.argsDef[argKey] || new Set<string>([])\n fieldLineConfig.argsDef[argKey].add(argDef)\n })\n }\n if (normalizedFieldConfig.directives) {\n registerDirectives({\n configs: normalizedFieldConfig.directives,\n defs: options.directiveDefs,\n each: ({ directiveDef }) => {\n options.typeDefLines[options.graphqlType].lines[fieldKey].directives.add(directiveDef)\n },\n })\n }\n })\n}\n\nfunction generateQueryFilterTypeDefs<M>(options: {\n typeDefLines: TypeDefLines\n // modelKey: string\n model?: M\n geneConfig?: GeneConfig<M>\n extendedTypes?: GeneConfigTypes\n}) {\n const model = options.model\n const geneConfig = model ? getGeneConfigFromOptions({ model, ...options }) : undefined\n if (!geneConfig?.types) return\n\n Object.entries(geneConfig.types).forEach(([graphqlType, fieldConfigs]) => {\n Object.entries(fieldConfigs).forEach(([fieldKey, fieldConfig]) => {\n const normalizedFieldConfig = normalizeFieldConfig(fieldConfig)\n if (!isUsingDefaultResolver(normalizedFieldConfig)) return\n\n generateDefaultQueryFilterTypeDefs({\n typeDefLines: options.typeDefLines,\n graphqlType,\n fieldKey,\n fieldType: getReturnTypeName(normalizedFieldConfig.returnType),\n })\n })\n })\n}\n\nfunction registerDirectives(options: {\n defs: DirectiveDefs\n configs: GeneDirectiveConfig[] | undefined\n each: (details: { directiveDef: string; directive: GeneDirectiveConfig }) => void\n}) {\n options.configs?.forEach(directive => {\n // Define or extend the directive in the schema\n options.defs[directive.name] = options.defs[directive.name] || { argsDef: {} }\n\n if (directive.args) {\n Object.entries(directive.args).forEach(([key, value]) => {\n if (Array.isArray(value) && !value.length) return\n\n options.defs[directive.name].argsDef = options.defs[directive.name].argsDef || {}\n\n options.defs[directive.name].argsDef[key] =\n options.defs[directive.name].argsDef[key] || new Set([])\n\n options.defs[directive.name].argsDef[key].add(\n value === null ? null : Array.isArray(value) && !value.length ? [] : getGraphqlType(value)\n )\n })\n }\n\n const directiveDef = stringifyDirectiveConfig(directive)\n options.each({ directiveDef, directive })\n })\n}\n\nfunction stringifyFieldLines(typeKey: string, fieldLines: TypeDefLines[0]) {\n const printDirectives = (directives: Set<string>) =>\n directives.size ? ` ${[...directives].join(' ')}` : ''\n\n const fieldLinesArray = Object.entries(fieldLines.lines).map(([attr, type]) => {\n let argsDef = ''\n const argsDefEntries = Object.entries(type.argsDef)\n // Add the parentheses if the field has arguments\n if (argsDefEntries.length) {\n argsDef += '('\n argsDef += argsDefEntries.map(([k, v]) => `${k}: ${[...v].join(' | ')}`).join(', ')\n argsDef += ')'\n }\n let line = `${attr}${argsDef}`\n if (type.typeDef) line += `: ${type.typeDef}${printDirectives(type.directives)}`\n\n return line\n })\n if (!fieldLinesArray.length) return ''\n\n const getVarDef = (indent = ' ', join = '\\n') =>\n fieldLinesArray.map(line => `${indent}${line}`).join(join)\n\n if (fieldLines.varType === 'union') {\n return `union ${typeKey} = ${getVarDef('', ' | ')}`\n }\n\n return [\n `${fieldLines.varType} ${typeKey}${printDirectives(fieldLines.directives)} {`,\n getVarDef(),\n `}`,\n ].join('\\n')\n}\n\nfunction stringifyDirectiveConfig(directive: GeneDirectiveConfig) {\n let directiveDef = `@${directive.name}`\n\n if (directive.args) {\n // Null is not valid in GraphQL Language so we remove it from the possible argument types\n const entries = Object.entries(directive.args).filter(([, value]) => {\n return Array.isArray(value) ? !!value.length : value !== null\n })\n\n // Add the parentheses only if the directive has possible argument types\n if (entries.length) {\n directiveDef += '('\n directiveDef += entries\n .map(([argKey, value]) => {\n const formatted = Array.isArray(value)\n ? `[${value\n .filter(v => v !== null)\n .map(v => JSON.stringify(v))\n .join(', ')}]`\n : JSON.stringify(value)\n\n return `${argKey}: ${formatted}`\n })\n .join(', ')\n directiveDef += ')'\n }\n }\n return directiveDef\n}\n"],"names":["SCHEMA_TEMPLATE_HTML","generateSchema","options","providedScalars","typeConfig","isScalarType","name","initialSchema","parseSchemaOption","typeDefsString","typeDefLines","generateGeneTypeDefs","schema","extendSchema","parse","buildSchema","queryType","mutationType","GraphQLObjectType","schemaOptions","schemaTypeMap","parentType","field","resolver","fieldDef","getFieldDefinition","executableSchema","GraphQLSchema","addResolversToSchema","printSchemaWithDirectives","resolvers","lookDeepInSchema","directiveDefs","afterTypeDefHooks","graphqlType","fieldConfigs","hasUsedPlugin","plugin","hooks","forEachModel","forEachModelOnTypeDefCompleted","isArrayFieldConfig","isObjectFieldConfig","generateTypeDefLines","globallyExtendedTypes","getGloballyExtendedTypes","fieldKey","fieldConfig","normalizedFieldConfig","normalizeFieldConfig","isUsingDefaultResolver","generateDefaultQueryFilterTypeDefs","getReturnTypeName","hook","typeDefs","sortedTypeDefLines","Query","restTypeDefLines","type","fieldLines","line","stringifyFieldLines","directiveName","directiveConfig","directiveDef","argsDefEntries","types","t","printTypes","k","generateTypeDefs","generateAdditionalTypeDefs","geneConfig","getGeneConfigFromOptions","aliasKey","generateQueryFilterTypeDefs","setGeneConfigByType","optionsForPopulateTypeDefs","isFieldIncluded","typeDef","registerDirectives","objFieldConfigs","getDefaultTypeDefLinesObject","isObject","varType","objConfigs","getDefaultFieldLinesObject","fieldLineConfig","populateArgsDefForDefaultResolver","isListType","parseType","argKey","argDef","model","directive","key","value","getGraphqlType","stringifyDirectiveConfig","typeKey","printDirectives","directives","fieldLinesArray","attr","argsDef","v","getVarDef","indent","join","entries","formatted"],"mappings":"0MAAAA,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EC+CR,SAASC,EAGdC,EAMC,CACD,MAAMC,EAAkBD,EAAQ,UAC5B,OAAO,OAAOA,EAAQ,SAAS,EAC5B,OAAOE,GAAcC,EAAAA,aAAaD,CAAU,CAAC,EAC7C,IAAI,CAAC,CAAE,KAAAE,CAAA,IAAWA,CAAI,EACzB,CAAA,EAEEC,EAAgBC,EAAAA,kBAAkBN,EAAQ,OAAQC,CAAe,EACjE,CAAE,eAAAM,EAAgB,aAAAC,CAAA,EAAiBC,EAAqB,CAC5D,GAAGT,EACH,OAAQK,CAAA,CACT,EAEKK,EAASL,EACXM,EAAAA,aAAaN,EAAeO,EAAAA,MAAML,CAAc,CAAC,EACjDM,EAAAA,YAAYN,CAAc,EAExBO,EAAYJ,EAAO,QAAQ,OAAO,EAClCK,EAAeL,EAAO,QAAQ,UAAU,EAE9C,GAAI,CAACI,EACH,MAAM,IAAI,MAAM,mCAAmC,EAErD,GAAI,EAAEA,aAAqBE,EAAAA,mBACzB,MAAM,IAAI,MAAM,wCAAwC,EAE1D,MAAMC,EAAyE,CAC7E,MAAOH,CAAA,EAEHI,EAAgBR,EAAO,WAAA,EAE7B,GAAIK,EAAc,CAChB,GAAI,EAAEA,aAAwBC,EAAAA,mBAC5B,MAAM,IAAI,MAAM,2CAA2C,EAE7DC,EAAc,SAAWF,CAC3B,CAEIf,EAAQ,WACV,OAAO,QAAQA,EAAQ,SAAS,EAAE,QAAQ,CAAC,CAACmB,EAAYjB,CAAU,IAAM,CACtE,GAAIC,EAAAA,aAAaD,CAAU,EAAG,CAC5B,OAAO,OAAOgB,EAAcC,CAAU,EAAGjB,CAAU,EACnD,MACF,CACA,OAAO,QAAQA,CAAU,EAAE,QAAQ,CAAC,CAACkB,EAAOC,CAAQ,IAAM,CACxD,MAAMC,EAAWC,EAAAA,mBAAmB,CAAE,OAAAb,EAAQ,OAAQS,EAAY,MAAAC,EAAO,EACzE,GAAIE,IAAmB,QAAUD,aACtB,IAAI,MAAM,kCAAkCD,CAAK,cAAcD,CAAU,GAAG,CACzF,CAAC,CACH,CAAC,EAGH,IAAIK,EAAmB,IAAIC,gBAAc,CACvC,GAAGf,EAAO,SAAA,EACV,GAAGO,EACH,MAAO,OAAO,OAAOC,CAAa,CAAA,CACnC,EAED,OAAAM,EAAmBE,EAAAA,qBAAqB,CACtC,aAAAlB,EACA,OAAQgB,EACR,QAASxB,EAAQ,SAAW,CAAA,EAC5B,MAAOA,EAAQ,KAAA,CAChB,EAEM,CACL,OAAQwB,EAER,IAAI,cAAe,CACjB,OAAOG,EAAAA,0BAA0BH,CAAgB,CACnD,EACA,IAAI,UAAW,CACb,OAAOZ,EAAAA,MAAM,KAAK,YAAY,CAChC,EACA,IAAI,WAAY,CACd,MAAMgB,EAAuB,CAAA,EAE7BC,OAAAA,mBAAiB,CACf,OAAQL,EACR,KAAK,CAAE,MAAAJ,EAAO,SAAAE,EAAU,WAAAH,GAAc,CAC/BG,EAAS,UAEdM,EAAUT,CAAU,EAAIS,EAAUT,CAAU,GAAK,CAAA,EACjDS,EAAUT,CAAU,EAAEC,CAAK,EAAIE,EAAS,QAC1C,CAAA,CACD,EACMM,CACT,EACA,IAAI,YAAa,CACf,OAAO9B,EAAqB,QAAQ,cAAe,KAAK,YAAY,CACtE,CAAA,CAEJ,CAEA,SAASW,EAAiFT,EAMvF,CACD,MAAM8B,EAA+B,CAAA,EAC/BtB,EAA6B,CAAA,EAC7BuB,EAAoC,CAAA,EAE1C,OAAO,QAAQ/B,EAAQ,KAAK,EAAE,QAAQ,CAAC,CAACgC,EAAaC,CAAY,IAAM,CACrE,IAAIC,EAAgB,GAEpB,UAAWC,KAAUnC,EAAQ,SAAW,CAAA,EAAI,CAE1C,GAAI,CADemC,EAAO,WAAWF,CAAY,EAChC,SAEjB,KAAM,CAAE,kBAAmBG,CAAA,EAAUC,EAAa,CAChD,cAAAP,EACA,aAAAtB,EACA,MAAOR,EAAQ,MACf,OAAQA,EAAQ,OAChB,UAAWA,EAAQ,UACnB,OAAAmC,EACA,SAAUH,EACV,MAAOC,EACP,YAAajC,EAAQ,WAAA,CACtB,EACD+B,EAAkB,KAAK,GAAGK,CAAK,EAE/BE,EAA+B,CAC7B,aAAA9B,EACA,SAAUwB,EACV,MAAOC,CAAA,CACR,EAEDC,EAAgB,GAChB,KACF,CAEI,CAACA,IAAkBK,qBAAmBN,CAAY,GAAKO,EAAAA,oBAAoBP,CAAY,IACzFQ,EAAqB,CACnB,cAAAX,EACA,aAAAtB,EACA,YAAAwB,EACA,aAAAC,CAAA,CACD,CAEL,CAAC,EACD,MAAMS,EAAwBC,EAAAA,yBAAA,EAE9B,OAAO,QAAQD,EAAsB,MAAM,EAAE,QAAQ,CAAC,CAACV,EAAaC,CAAY,IAAM,CACpFQ,EAAqB,CACnB,cAAAX,EACA,aAAAtB,EACA,YAAAwB,EACA,aAAAC,CAAA,CACD,EAED,OAAO,QAAQA,CAAY,EAAE,QAAQ,CAAC,CAACW,EAAUC,CAAW,IAAM,CAChE,MAAMC,EAAwBC,EAAAA,qBAAqBF,CAAW,EACzDG,EAAAA,uBAAuBF,CAAqB,GAEjDG,qCAAmC,CACjC,aAAAzC,EACA,YAAAwB,EACA,SAAAY,EACA,UAAWM,EAAAA,kBAAkBJ,EAAsB,UAAU,CAAA,CAC9D,CACH,CAAC,CACH,CAAC,EAEDf,EAAkB,QAAQoB,GAAQA,EAAA,CAAM,EAExC,MAAMC,EAAqB,CAAA,EAC3B,IAAIC,EAAqB7C,EAGzB,GAAI,UAAWA,EAAc,CAC3B,KAAM,CAAE,MAAA8C,EAAO,GAAGC,CAAA,EAAqB/C,EACvC6C,EAAqB,CAAE,MAAAC,EAAO,GAAGC,CAAA,CACnC,CAEA,OAAO,QAAQF,CAAkB,EAAE,QAAQ,CAAC,CAACG,EAAMC,CAAU,IAAM,CACjE,MAAMC,EAAOC,EAAoBH,EAAMC,CAAU,EAC7CC,GAAMN,EAAS,KAAKM,CAAI,CAC9B,CAAC,EACD,IAAInD,EAAiB6C,EAAS,KAAK;AAAA;AAAA,CAAM,EAEzC,cAAO,QAAQtB,CAAa,EAAE,QAAQ,CAAC,CAAC8B,EAAeC,CAAe,IAAM,CAC1E,IAAIC,EAAe,cAAcF,CAAa,GAG9C,MAAMG,EADoB,OAAO,QAAQF,EAAgB,OAAO,EACvB,OAAO,CAAC,CAAA,CAAGG,CAAK,IAAM,CAAC,GAAGA,CAAK,EAAE,KAAKC,GAAKA,IAAM,IAAI,CAAC,EAEzFC,EAAcF,GAAyC,CAC3D,MAAMZ,EAAW,CAAC,GAAGY,CAAK,EAC1B,MAAO,CACLZ,EAAS,OAAOa,GAAKA,IAAM,IAAI,EAC/BD,EAAM,IAAI,IAAI,GAAKZ,EAAS,KAAKI,GAAQ,MAAM,KAAK,OAAOA,CAAI,CAAC,CAAC,EAAI,GAAK,GAAA,EAC1E,KAAK,EAAE,CACX,EAEIO,EAAe,SACjBD,GAAgB;AAAA,EAChBA,GAAgBC,EAAe,IAAI,CAAC,CAACI,EAAGH,CAAK,IAAM,KAAKG,CAAC,KAAKD,EAAWF,CAAK,CAAC,EAAE,EAAE,KAAK;AAAA,CAAI,EAC5FF,GAAgB;AAAA,IAElBA,GAAgB,gCAEhBvD,EAAiB,GAAGuD,CAAY;AAAA;AAAA,EAAOvD,CAAc,EACvD,CAAC,EAEM,CAAE,eAAAA,EAAgB,aAAAC,CAAA,CAC3B,CAEA,SAAS6B,EAA+CrC,EAUrD,CACD,MAAM+B,EAAoC,CAAA,EAEpC,CAAE,kBAAmBK,GAAUgC,EAAiBpE,CAAO,EAC7D+B,EAAkB,KAAK,GAAGK,CAAK,EAE/BiC,EAA2BrE,CAAO,EAElC,MAAMsE,EAAaC,EAAAA,yBAAyBvE,CAAO,EAEnD,cAAO,QAAQsE,GAAY,SAAW,CAAA,CAAE,EAAE,QAAQ,CAAC,CAACE,EAAUF,CAAU,IAAM,CAC5E,KAAM,CAAE,kBAAmBlC,CAAAA,EAAUgC,EAAiB,CACpD,GAAGpE,EACH,WAAAsE,EACA,SAAUE,CAAA,CACX,EACDzC,EAAkB,KAAK,GAAGK,CAAK,EAE/BiC,EAA2B,CAAE,GAAGrE,EAAS,WAAAsE,EAAY,CACvD,CAAC,EACM,CAAE,kBAAAvC,CAAA,CACX,CAEA,SAASO,EAAkCtC,EAIxC,CACDyE,EAA4BzE,CAAO,EAEnC,MAAMsE,EAAaC,EAAAA,yBAAyBvE,CAAO,EAC9CsE,GAAY,OAEjB,OAAO,QAAQA,GAAY,SAAW,CAAA,CAAE,EAAE,QAAQ,CAAC,CAAA,CAAGA,CAAU,IAAM,CACpEG,EAA4B,CAAE,GAAGzE,EAAS,WAAAsE,EAAY,CACxD,CAAC,CACH,CAEA,SAASF,EAAmDpE,EAWzD,CACD,MAAMsE,EAAaC,EAAAA,yBAAyBvE,CAAO,EAC7C+B,EAAoC,CAAA,EAE1C2C,sBAAoB1E,EAAQ,SAAUsE,CAAU,EAEhD,MAAMK,EAA6B,CACjC,aAAc3E,EAAQ,aACtB,MAAOA,EAAQ,MACf,SAAUA,EAAQ,SAClB,gBAAkB4C,GAAqBgC,kBAAgBN,EAAY1B,CAAQ,EAC3E,cAAe5C,CAAA,EAGjB,GAAIA,EAAQ,OAAO,iBAAkB,CACnC,KAAM,CAAE,kBAAmBoC,CAAA,EAAUpC,EAAQ,OAAO,iBAAiB2E,CAA0B,EAC/F5C,EAAkB,KAAK,GAAGK,CAAK,CACjC,KAAO,CACL,MAAMyC,EAAU7E,EAAQ,OAAO,WAAW2E,CAA0B,EACpE3E,EAAQ,aAAaA,EAAQ,QAAQ,EAAI6E,CAC3C,CAEA,OAAAC,EAAmB,CAEjB,QAASR,GAAY,WACrB,KAAMtE,EAAQ,cACd,KAAM,CAAC,CAAE,aAAA8D,KAAmB,CAC1B9D,EAAQ,aAAaA,EAAQ,QAAQ,EAAE,WAAW,IAAI8D,CAAY,CACpE,CAAA,CACD,EACM,CAAE,kBAAA/B,CAAA,CACX,CAKA,SAASsC,EAA8BrE,EAMpC,CACD,MAAMsE,EAAaC,EAAAA,yBAAyBvE,CAAO,EAC9CsE,GAAY,OAEjB,OAAO,QAAQA,EAAW,KAAK,EAAE,QAAQ,CAAC,CAACtC,EAAaC,CAAY,IAAM,CACxEQ,EAAqB,CAAE,GAAGzC,EAAS,YAAAgC,EAAa,aAAAC,EAA+C,CACjG,CAAC,CACH,CAEA,SAASQ,EAAqBzC,EAK3B,CACD,IAAI+E,EAAkB/E,EAAQ,aAO9B,GALAA,EAAQ,aAAaA,EAAQ,WAAW,EAAI,CAC1C,GAAGgF,+BAAA,EACH,GAAGhF,EAAQ,aAAaA,EAAQ,WAAW,CAAA,EAI3CiF,EAAAA,SAASF,CAAe,GACxB,eAAgBA,GAChBA,EAAgB,YAAY,QAC5B,CACA,MAAMG,EAAUH,EAAgB,WAAW,QAG3C,GAFA/E,EAAQ,aAAaA,EAAQ,WAAW,EAAE,QAAUkF,EAEhDA,IAAY,QAAS,CACvB,MAAMC,EAAiC,CAAA,EAEvC,OAAO,KAAKJ,CAAe,EACxB,OAAO3D,GAASA,IAAU,YAAY,EACtC,QAAQA,GAAU+D,EAAW/D,CAAK,EAAI,EAAG,EAE5C2D,EAAkBI,CACpB,CACF,CAGA,GAAI5C,EAAAA,mBAAmBvC,EAAQ,YAAY,EAAG,CAC5CA,EAAQ,aAAaA,EAAQ,WAAW,EAAE,QAAU,OAEpD,MAAMmF,EAAiC,CAAA,EACvCnF,EAAQ,aAAa,QAAQoB,GAAU+D,EAAW/D,CAAK,EAAI,EAAG,EAE9D2D,EAAkBI,CACpB,KAAO,CACL,MAAMb,EAAatE,EAAQ,aAAa,WACpCsE,GAAY,UAAStE,EAAQ,aAAaA,EAAQ,WAAW,EAAE,QAAUsE,EAAW,QAC1F,CAEA,OAAO,QAAQS,CAAe,EAAE,QAAQ,CAAC,CAACnC,EAAUC,CAAW,IAAM,CACnE,GAAID,IAAa,aAAc,OAE/B,MAAME,EAAwBC,EAAAA,qBAAqBF,CAAW,EAE9D7C,EAAQ,aAAaA,EAAQ,WAAW,EAAE,MAAM4C,CAAQ,EAAI,CAC1D,GAAGwC,6BAAA,EACH,GAAGpF,EAAQ,aAAaA,EAAQ,WAAW,EAAE,MAAM4C,CAAQ,CAAA,EAG7D,MAAMyC,EAAkBrF,EAAQ,aAAaA,EAAQ,WAAW,EAAE,MAAM4C,CAAQ,EAE5EE,EAAsB,aACxBuC,EAAgB,QAAUvC,EAAsB,YAG9CE,EAAAA,uBAAuBF,CAAqB,EAC9CwC,oCAAkC,CAChC,gBAAAD,EACA,YAAarF,EAAQ,YACrB,SAAA4C,EACA,OAAQ2C,EAAAA,WAAWC,YAAUH,EAAgB,OAAO,CAAC,CAAA,CACtD,EACQvC,EAAsB,MAC/B,OAAO,QAAQA,EAAsB,IAAI,EAAE,QAAQ,CAAC,CAAC2C,EAAQC,CAAM,IAAM,CACnE,OAAOA,GAAW,WAEtBL,EAAgB,QAAQI,CAAM,EAAIJ,EAAgB,QAAQI,CAAM,GAAK,IAAI,IAAY,EAAE,EACvFJ,EAAgB,QAAQI,CAAM,EAAE,IAAIC,CAAM,EAC5C,CAAC,EAEC5C,EAAsB,YACxBgC,EAAmB,CACjB,QAAShC,EAAsB,WAC/B,KAAM9C,EAAQ,cACd,KAAM,CAAC,CAAE,aAAA8D,KAAmB,CAC1B9D,EAAQ,aAAaA,EAAQ,WAAW,EAAE,MAAM4C,CAAQ,EAAE,WAAW,IAAIkB,CAAY,CACvF,CAAA,CACD,CAEL,CAAC,CACH,CAEA,SAASW,EAA+BzE,EAMrC,CACD,MAAM2F,EAAQ3F,EAAQ,MAChBsE,EAAaqB,EAAQpB,EAAAA,yBAAyB,CAAE,MAAAoB,EAAO,GAAG3F,CAAA,CAAS,EAAI,OACxEsE,GAAY,OAEjB,OAAO,QAAQA,EAAW,KAAK,EAAE,QAAQ,CAAC,CAACtC,EAAaC,CAAY,IAAM,CACxE,OAAO,QAAQA,CAAY,EAAE,QAAQ,CAAC,CAACW,EAAUC,CAAW,IAAM,CAChE,MAAMC,EAAwBC,EAAAA,qBAAqBF,CAAW,EACzDG,EAAAA,uBAAuBF,CAAqB,GAEjDG,qCAAmC,CACjC,aAAcjD,EAAQ,aACtB,YAAAgC,EACA,SAAAY,EACA,UAAWM,EAAAA,kBAAkBJ,EAAsB,UAAU,CAAA,CAC9D,CACH,CAAC,CACH,CAAC,CACH,CAEA,SAASgC,EAAmB9E,EAIzB,CACDA,EAAQ,SAAS,QAAQ4F,GAAa,CAEpC5F,EAAQ,KAAK4F,EAAU,IAAI,EAAI5F,EAAQ,KAAK4F,EAAU,IAAI,GAAK,CAAE,QAAS,CAAA,CAAC,EAEvEA,EAAU,MACZ,OAAO,QAAQA,EAAU,IAAI,EAAE,QAAQ,CAAC,CAACC,EAAKC,CAAK,IAAM,CACnD,MAAM,QAAQA,CAAK,GAAK,CAACA,EAAM,SAEnC9F,EAAQ,KAAK4F,EAAU,IAAI,EAAE,QAAU5F,EAAQ,KAAK4F,EAAU,IAAI,EAAE,SAAW,CAAA,EAE/E5F,EAAQ,KAAK4F,EAAU,IAAI,EAAE,QAAQC,CAAG,EACtC7F,EAAQ,KAAK4F,EAAU,IAAI,EAAE,QAAQC,CAAG,GAAK,IAAI,IAAI,EAAE,EAEzD7F,EAAQ,KAAK4F,EAAU,IAAI,EAAE,QAAQC,CAAG,EAAE,IACxCC,IAAU,KAAO,KAAO,MAAM,QAAQA,CAAK,GAAK,CAACA,EAAM,OAAS,CAAA,EAAKC,EAAAA,eAAeD,CAAK,CAAA,EAE7F,CAAC,EAGH,MAAMhC,EAAekC,EAAyBJ,CAAS,EACvD5F,EAAQ,KAAK,CAAE,aAAA8D,EAAc,UAAA8B,CAAA,CAAW,CAC1C,CAAC,CACH,CAEA,SAASjC,EAAoBsC,EAAiBxC,EAA6B,CACzE,MAAMyC,EAAmBC,GACvBA,EAAW,KAAO,IAAI,CAAC,GAAGA,CAAU,EAAE,KAAK,GAAG,CAAC,GAAK,GAEhDC,EAAkB,OAAO,QAAQ3C,EAAW,KAAK,EAAE,IAAI,CAAC,CAAC4C,EAAM7C,CAAI,IAAM,CAC7E,IAAI8C,EAAU,GACd,MAAMvC,EAAiB,OAAO,QAAQP,EAAK,OAAO,EAE9CO,EAAe,SACjBuC,GAAW,IACXA,GAAWvC,EAAe,IAAI,CAAC,CAACI,EAAGoC,CAAC,IAAM,GAAGpC,CAAC,KAAK,CAAC,GAAGoC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,EAClFD,GAAW,KAEb,IAAI5C,EAAO,GAAG2C,CAAI,GAAGC,CAAO,GAC5B,OAAI9C,EAAK,UAASE,GAAQ,KAAKF,EAAK,OAAO,GAAG0C,EAAgB1C,EAAK,UAAU,CAAC,IAEvEE,CACT,CAAC,EACD,GAAI,CAAC0C,EAAgB,OAAQ,MAAO,GAEpC,MAAMI,EAAY,CAACC,EAAS,KAAMC,EAAO;AAAA,IACvCN,EAAgB,IAAI1C,GAAQ,GAAG+C,CAAM,GAAG/C,CAAI,EAAE,EAAE,KAAKgD,CAAI,EAE3D,OAAIjD,EAAW,UAAY,QAClB,SAASwC,CAAO,MAAMO,EAAU,GAAI,KAAK,CAAC,GAG5C,CACL,GAAG/C,EAAW,OAAO,IAAIwC,CAAO,GAAGC,EAAgBzC,EAAW,UAAU,CAAC,KACzE+C,EAAA,EACA,GAAA,EACA,KAAK;AAAA,CAAI,CACb,CAEA,SAASR,EAAyBJ,EAAgC,CAChE,IAAI9B,EAAe,IAAI8B,EAAU,IAAI,GAErC,GAAIA,EAAU,KAAM,CAElB,MAAMe,EAAU,OAAO,QAAQf,EAAU,IAAI,EAAE,OAAO,CAAC,CAAA,CAAGE,CAAK,IACtD,MAAM,QAAQA,CAAK,EAAI,CAAC,CAACA,EAAM,OAASA,IAAU,IAC1D,EAGGa,EAAQ,SACV7C,GAAgB,IAChBA,GAAgB6C,EACb,IAAI,CAAC,CAAClB,EAAQK,CAAK,IAAM,CACxB,MAAMc,EAAY,MAAM,QAAQd,CAAK,EACjC,IAAIA,EACD,OAAOS,GAAKA,IAAM,IAAI,EACtB,IAAIA,GAAK,KAAK,UAAUA,CAAC,CAAC,EAC1B,KAAK,IAAI,CAAC,IACb,KAAK,UAAUT,CAAK,EAExB,MAAO,GAAGL,CAAM,KAAKmB,CAAS,EAChC,CAAC,EACA,KAAK,IAAI,EACZ9C,GAAgB,IAEpB,CACA,OAAOA,CACT"}