UNPKG

@strapi/generators

Version:

Interactive API generator.

1 lines • 29.9 kB
{"version":3,"file":"extend-plugin-index-files.mjs","sources":["../../../src/plops/utils/extend-plugin-index-files.ts"],"sourcesContent":["import * as jscodeshift from 'jscodeshift';\nimport camelCase from 'lodash/camelCase';\n\nconst j = jscodeshift.withParser('tsx');\n\ntype AppendType = 'content-type' | 'index' | 'routes';\n\ninterface AppendConfig {\n type: AppendType;\n singularName: string;\n}\n\n// Helper to check if a string is a valid JavaScript identifier\nconst isValidIdentifier = (str: string): boolean => {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(str);\n};\n\n// Helper to create the appropriate property based on type\nconst createProperty = (config: AppendConfig) => {\n const { type, singularName } = config;\n const camelCaseName = camelCase(singularName);\n const varName = type === 'content-type' ? `${camelCaseName}Schema` : camelCaseName;\n\n // Use string literal for key only if singularName is not a valid identifier\n const keyNode = isValidIdentifier(singularName)\n ? j.identifier(singularName)\n : j.literal(singularName);\n\n switch (type) {\n case 'content-type':\n return j.objectProperty(\n keyNode,\n j.objectExpression([j.objectProperty(j.identifier('schema'), j.identifier(varName))])\n );\n case 'index':\n return j.objectProperty(keyNode, j.identifier(varName));\n case 'routes':\n return j.spreadElement(j.memberExpression(j.identifier(varName), j.identifier('routes')));\n default:\n throw new Error(`Unknown append type: ${type}`);\n }\n};\n\n// Helper to check if property already exists\nconst hasExistingProperty = (obj: any, config: AppendConfig): boolean => {\n const { type, singularName } = config;\n if (!obj?.properties && !j.ArrayExpression.check(obj)) return false;\n\n const elements = j.ArrayExpression.check(obj) ? obj.elements : obj.properties;\n if (!elements) return false;\n\n if (type === 'routes') {\n // Check for spread elements ...camelCaseName.routes\n const camelCaseName = camelCase(singularName);\n return elements.some(\n (element: any) =>\n j.SpreadElement.check(element) &&\n j.MemberExpression.check(element.argument) &&\n j.Identifier.check(element.argument.object) &&\n element.argument.object.name === camelCaseName &&\n j.Identifier.check(element.argument.property) &&\n element.argument.property.name === 'routes'\n );\n }\n\n // For content-type and index, check for object property (both identifier and literal keys)\n return elements.some(\n (prop: any) =>\n j.ObjectProperty.check(prop) &&\n ((j.Identifier.check(prop.key) && prop.key.name === singularName) ||\n (j.Literal.check(prop.key) && prop.key.value === singularName))\n );\n};\n\n// Helper to add property to object if it doesn't exist\nconst addPropertyToObject = (obj: any, config: AppendConfig) => {\n if (!obj || hasExistingProperty(obj, config)) return;\n\n if (config.type === 'routes' && j.ArrayExpression.check(obj)) {\n obj.elements.push(createRoutesElement(config));\n } else if (obj.properties?.length >= 0) {\n obj.properties.push(createProperty(config));\n }\n};\n\n// Helper to find and add to routes array\nconst handleRoutesArray = (obj: any, config: AppendConfig) => {\n if (!obj?.properties) return false;\n\n const routesProp = obj.properties.find(\n (prop: any) =>\n j.ObjectProperty.check(prop) &&\n ((j.Identifier.check(prop.key) && prop.key.name === 'routes') ||\n (j.Literal.check(prop.key) && prop.key.value === 'routes')) &&\n j.ArrayExpression.check(prop.value)\n );\n\n if (routesProp?.value) {\n const routesArray = routesProp.value;\n if (!hasExistingProperty(routesArray, config)) {\n routesArray.elements = routesArray.elements || [];\n routesArray.elements.push(createRoutesElement(config));\n }\n return true;\n }\n\n return false;\n};\n\n// Helper to create routes array element (always returns SpreadElement for routes)\nconst createRoutesElement = (config: AppendConfig) => {\n const { singularName } = config;\n const camelCaseName = camelCase(singularName);\n return j.spreadElement(j.memberExpression(j.identifier(camelCaseName), j.identifier('routes')));\n};\n\n// Helper to create new export for routes\nconst createRoutesExport = (config: AppendConfig) => {\n return j.arrowFunctionExpression(\n [],\n j.objectExpression([\n j.objectProperty(j.identifier('type'), j.literal('content-api')),\n j.objectProperty(j.identifier('routes'), j.arrayExpression([createRoutesElement(config)])),\n ])\n );\n};\n\n// Unified append function for all types\nexport const appendToFile = (template: string, config: AppendConfig): string => {\n if (!config?.singularName || !config?.type) {\n throw new Error('Invalid config: singularName and type are required');\n }\n\n const normalizedTemplate = template?.trim() || '';\n const root = normalizedTemplate ? j(normalizedTemplate) : j(j.program([]));\n const { type, singularName } = config;\n const isEsm = detectModuleFormat(normalizedTemplate) === 'esm';\n\n const camelCaseName = camelCase(singularName);\n const varName = type === 'content-type' ? `${camelCaseName}Schema` : camelCaseName;\n const source = type === 'content-type' ? `./${singularName}/schema.json` : `./${singularName}`;\n\n addImportIfMissing(root, varName, source, isEsm);\n\n if (isEsm) {\n handleEsmExport(root, config, type);\n } else {\n handleCjsExport(root, config, type);\n }\n\n return root.toSource({ quote: 'single' });\n};\n\n// Helper to detect module format\nconst detectModuleFormat = (template: string): 'esm' | 'cjs' => {\n const hasImport = /^import\\s/.test(template) || template.includes('import ');\n const hasExportDefault = template.includes('export default');\n const hasRequire = template.includes('require(');\n const hasModuleExports = template.includes('module.exports');\n\n if (hasImport || hasExportDefault) return 'esm';\n if (hasRequire || hasModuleExports) return 'cjs';\n return 'esm'; // Default to ESM\n};\n\n// Helper to insert statement at appropriate location\nconst insertStatement = (\n root: jscodeshift.Collection<any>,\n statement: any,\n preferredLocation?: jscodeshift.Collection<any>\n) => {\n if (preferredLocation && preferredLocation.length > 0) {\n preferredLocation.at(-1).insertAfter(statement);\n } else {\n const firstStatement = root.find(j.Statement).at(0);\n if (firstStatement.length > 0) {\n firstStatement.insertBefore(statement);\n } else {\n handleEmptyFile(root, statement);\n }\n }\n};\n\n// Helper to add import/require if missing\nconst addImportIfMissing = (\n root: jscodeshift.Collection<any>,\n varName: string,\n source: string,\n isEsm: boolean\n) => {\n if (isEsm) {\n if (root.find(j.ImportDeclaration, { source: { value: source } }).length === 0) {\n const importDecl = j.importDeclaration(\n [j.importDefaultSpecifier(j.identifier(varName))],\n j.literal(source)\n );\n insertStatement(root, importDecl, root.find(j.ImportDeclaration));\n }\n } else if (\n root.find(j.VariableDeclarator, {\n id: { name: varName },\n init: { type: 'CallExpression', callee: { name: 'require' }, arguments: [{ value: source }] },\n }).length === 0\n ) {\n const requireStmt = j.variableDeclaration('const', [\n j.variableDeclarator(\n j.identifier(varName),\n j.callExpression(j.identifier('require'), [j.literal(source)])\n ),\n ]);\n\n const requires = root\n .find(j.VariableDeclaration)\n .filter((path) =>\n path.value.declarations.some(\n (decl: any) => j.CallExpression.check(decl.init) && decl.init.callee?.name === 'require'\n )\n );\n\n const useStrict = root\n .find(j.ExpressionStatement)\n .filter(\n (path: any) =>\n j.Literal.check(path.value.expression) &&\n /use strict/.test(String(path.value.expression.value))\n );\n\n insertStatement(root, requireStmt, requires.length > 0 ? requires : useStrict);\n }\n};\n\n// Helper to safely handle empty files\nconst handleEmptyFile = (root: jscodeshift.Collection<any>, firstStatement: any) => {\n try {\n // Check if we have any paths in the collection\n const paths = root.paths();\n if (paths.length === 0) {\n // Completely empty collection - create new program\n const newProgram = j.program([firstStatement]);\n // Replace the entire root with new program\n return root.replaceWith(newProgram);\n }\n\n // Get the first path (should be the program)\n const rootPath = paths[0];\n if (!rootPath || !rootPath.value) {\n // Invalid root path - create new program\n const newProgram = j.program([firstStatement]);\n return root.replaceWith(newProgram);\n }\n\n // Check if it's a valid program node\n if (j.Program.check(rootPath.value)) {\n // Ensure body exists and add statement\n if (!rootPath.value.body) {\n rootPath.value.body = [];\n }\n rootPath.value.body.push(firstStatement);\n } else {\n // Not a program node - replace with new program\n const newProgram = j.program([firstStatement]);\n rootPath.replace(newProgram);\n }\n } catch (error: any) {\n // Ultimate fallback - create a minimal working file\n console.warn('Failed to handle empty file, creating new program:', error.message);\n const newProgram = j.program([firstStatement]);\n try {\n root.replaceWith(newProgram);\n } catch (replaceError) {\n // Last resort - throw descriptive error\n throw new Error(\n `Unable to add statement to empty file: ${error.message}. Root collection may be invalid.`\n );\n }\n }\n};\n\n// Helper to find the exported object regardless of export pattern\nconst findExportedObject = (root: jscodeshift.Collection<any>, exportedValue: any): any => {\n // Case 1: Direct object export\n if (j.ObjectExpression.check(exportedValue)) {\n return exportedValue;\n }\n\n // Case 2: Function that returns an object\n if (\n j.FunctionExpression.check(exportedValue) ||\n j.ArrowFunctionExpression.check(exportedValue) ||\n j.FunctionDeclaration.check(exportedValue)\n ) {\n const body = exportedValue.body;\n // Arrow function with object expression body: () => ({...})\n if (j.ObjectExpression.check(body)) {\n return body;\n }\n // Function with return statement in block\n if (j.BlockStatement.check(body)) {\n for (const stmt of body.body) {\n if (j.ReturnStatement.check(stmt) && j.ObjectExpression.check(stmt.argument)) {\n return stmt.argument;\n }\n }\n }\n }\n\n // Case 3: Identifier reference to a variable\n if (j.Identifier.check(exportedValue)) {\n const varName = exportedValue.name;\n\n // Find the variable declaration\n const varDeclaration = root.find(j.VariableDeclarator, {\n id: { name: varName },\n });\n\n if (varDeclaration.length > 0) {\n const init = varDeclaration.get().value.init;\n\n // If it's an object, return it\n if (j.ObjectExpression.check(init)) {\n return init;\n }\n\n // If it's a function, recursively check its return value\n if (j.FunctionExpression.check(init) || j.ArrowFunctionExpression.check(init)) {\n return findExportedObject(root, init);\n }\n }\n }\n\n return null;\n};\n\n// Helper to handle object export (common logic for ESM and CJS)\nconst handleObjectExport = (\n obj: any,\n config: AppendConfig,\n type: AppendType,\n setExport: (newExport: any) => void\n) => {\n if (type === 'routes') {\n if (!handleRoutesArray(obj, config)) {\n setExport(createRoutesExport(config));\n }\n } else {\n addPropertyToObject(obj, config);\n }\n};\n\n// Handle ESM export default\nconst handleEsmExport = (\n root: jscodeshift.Collection<any>,\n config: AppendConfig,\n type: AppendType\n) => {\n const exports = root.find(j.ExportDefaultDeclaration);\n\n if (exports.length === 0) {\n const newExport =\n type === 'routes' ? createRoutesExport(config) : j.objectExpression([createProperty(config)]);\n insertStatement(root, j.exportDefaultDeclaration(newExport), root.find(j.Statement));\n } else {\n exports.forEach((path: any) => {\n const decl = path.value.declaration;\n\n // Find the actual object being exported\n const exportedObject = findExportedObject(root, decl);\n\n if (exportedObject) {\n handleObjectExport(exportedObject, config, type, (newExport) => {\n path.value.declaration = newExport;\n });\n } else {\n // Fallback: replace the entire export\n path.value.declaration =\n type === 'routes'\n ? createRoutesExport(config)\n : j.objectExpression([createProperty(config)]);\n }\n });\n }\n};\n\n// Handle CJS module.exports\nconst handleCjsExport = (\n root: jscodeshift.Collection<any>,\n config: AppendConfig,\n type: AppendType\n) => {\n const exports = root.find(j.AssignmentExpression, {\n left: { type: 'MemberExpression', object: { name: 'module' }, property: { name: 'exports' } },\n });\n\n if (exports.length === 0) {\n const newExport =\n type === 'routes' ? createRoutesExport(config) : j.objectExpression([createProperty(config)]);\n const moduleExportStmt = j.expressionStatement(\n j.assignmentExpression(\n '=',\n j.memberExpression(j.identifier('module'), j.identifier('exports')),\n newExport\n )\n );\n insertStatement(root, moduleExportStmt, root.find(j.Statement));\n } else {\n exports.forEach((path: any) => {\n const right = path.value.right;\n\n // Find the actual object being exported\n const exportedObject = findExportedObject(root, right);\n\n if (exportedObject) {\n handleObjectExport(exportedObject, config, type, (newExport) => {\n path.value.right = newExport;\n });\n } else {\n // Fallback: replace the entire export\n path.value.right =\n type === 'routes'\n ? createRoutesExport(config)\n : j.objectExpression([createProperty(config)]);\n }\n });\n }\n};\n"],"names":["j","jscodeshift","withParser","isValidIdentifier","str","test","createProperty","config","type","singularName","camelCaseName","camelCase","varName","keyNode","identifier","literal","objectProperty","objectExpression","spreadElement","memberExpression","Error","hasExistingProperty","obj","properties","ArrayExpression","check","elements","some","element","SpreadElement","MemberExpression","argument","Identifier","object","name","property","prop","ObjectProperty","key","Literal","value","addPropertyToObject","push","createRoutesElement","length","handleRoutesArray","routesProp","find","routesArray","createRoutesExport","arrowFunctionExpression","arrayExpression","appendToFile","template","normalizedTemplate","trim","root","program","isEsm","detectModuleFormat","source","addImportIfMissing","handleEsmExport","handleCjsExport","toSource","quote","hasImport","includes","hasExportDefault","hasRequire","hasModuleExports","insertStatement","statement","preferredLocation","at","insertAfter","firstStatement","Statement","insertBefore","handleEmptyFile","ImportDeclaration","importDecl","importDeclaration","importDefaultSpecifier","VariableDeclarator","id","init","callee","arguments","requireStmt","variableDeclaration","variableDeclarator","callExpression","requires","VariableDeclaration","filter","path","declarations","decl","CallExpression","useStrict","ExpressionStatement","expression","String","paths","newProgram","replaceWith","rootPath","Program","body","replace","error","console","warn","message","replaceError","findExportedObject","exportedValue","ObjectExpression","FunctionExpression","ArrowFunctionExpression","FunctionDeclaration","BlockStatement","stmt","ReturnStatement","varDeclaration","get","handleObjectExport","setExport","exports","ExportDefaultDeclaration","newExport","exportDefaultDeclaration","forEach","declaration","exportedObject","AssignmentExpression","left","moduleExportStmt","expressionStatement","assignmentExpression","right"],"mappings":";;;AAGA,MAAMA,CAAAA,GAAIC,WAAYC,CAAAA,UAAU,CAAC,KAAA,CAAA;AASjC;AACA,MAAMC,oBAAoB,CAACC,GAAAA,GAAAA;IACzB,OAAO,4BAAA,CAA6BC,IAAI,CAACD,GAAAA,CAAAA;AAC3C,CAAA;AAEA;AACA,MAAME,iBAAiB,CAACC,MAAAA,GAAAA;AACtB,IAAA,MAAM,EAAEC,IAAI,EAAEC,YAAY,EAAE,GAAGF,MAAAA;AAC/B,IAAA,MAAMG,gBAAgBC,SAAUF,CAAAA,YAAAA,CAAAA;AAChC,IAAA,MAAMG,UAAUJ,IAAS,KAAA,cAAA,GAAiB,GAAGE,aAAc,CAAA,MAAM,CAAC,GAAGA,aAAAA;;IAGrE,MAAMG,OAAAA,GAAUV,kBAAkBM,YAC9BT,CAAAA,GAAAA,CAAAA,CAAEc,UAAU,CAACL,YAAAA,CAAAA,GACbT,CAAEe,CAAAA,OAAO,CAACN,YAAAA,CAAAA;IAEd,OAAQD,IAAAA;QACN,KAAK,cAAA;AACH,YAAA,OAAOR,EAAEgB,cAAc,CACrBH,OACAb,EAAAA,CAAAA,CAAEiB,gBAAgB,CAAC;gBAACjB,CAAEgB,CAAAA,cAAc,CAAChB,CAAEc,CAAAA,UAAU,CAAC,QAAWd,CAAAA,EAAAA,CAAAA,CAAEc,UAAU,CAACF,OAAAA,CAAAA;AAAU,aAAA,CAAA,CAAA;QAExF,KAAK,OAAA;AACH,YAAA,OAAOZ,EAAEgB,cAAc,CAACH,OAASb,EAAAA,CAAAA,CAAEc,UAAU,CAACF,OAAAA,CAAAA,CAAAA;QAChD,KAAK,QAAA;AACH,YAAA,OAAOZ,CAAEkB,CAAAA,aAAa,CAAClB,CAAAA,CAAEmB,gBAAgB,CAACnB,CAAEc,CAAAA,UAAU,CAACF,OAAAA,CAAAA,EAAUZ,CAAEc,CAAAA,UAAU,CAAC,QAAA,CAAA,CAAA,CAAA;AAChF,QAAA;AACE,YAAA,MAAM,IAAIM,KAAAA,CAAM,CAAC,qBAAqB,EAAEZ,IAAM,CAAA,CAAA,CAAA;AAClD;AACF,CAAA;AAEA;AACA,MAAMa,mBAAAA,GAAsB,CAACC,GAAUf,EAAAA,MAAAA,GAAAA;AACrC,IAAA,MAAM,EAAEC,IAAI,EAAEC,YAAY,EAAE,GAAGF,MAAAA;IAC/B,IAAI,CAACe,GAAKC,EAAAA,UAAAA,IAAc,CAACvB,CAAAA,CAAEwB,eAAe,CAACC,KAAK,CAACH,GAAAA,CAAAA,EAAM,OAAO,KAAA;IAE9D,MAAMI,QAAAA,GAAW1B,CAAEwB,CAAAA,eAAe,CAACC,KAAK,CAACH,GAAAA,CAAAA,GAAOA,GAAII,CAAAA,QAAQ,GAAGJ,GAAAA,CAAIC,UAAU;IAC7E,IAAI,CAACG,UAAU,OAAO,KAAA;AAEtB,IAAA,IAAIlB,SAAS,QAAU,EAAA;;AAErB,QAAA,MAAME,gBAAgBC,SAAUF,CAAAA,YAAAA,CAAAA;QAChC,OAAOiB,QAAAA,CAASC,IAAI,CAClB,CAACC,OAAAA,GACC5B,EAAE6B,aAAa,CAACJ,KAAK,CAACG,OACtB5B,CAAAA,IAAAA,CAAAA,CAAE8B,gBAAgB,CAACL,KAAK,CAACG,OAAAA,CAAQG,QAAQ,CAAA,IACzC/B,EAAEgC,UAAU,CAACP,KAAK,CAACG,OAAQG,CAAAA,QAAQ,CAACE,MAAM,CAAA,IAC1CL,OAAQG,CAAAA,QAAQ,CAACE,MAAM,CAACC,IAAI,KAAKxB,aACjCV,IAAAA,CAAAA,CAAEgC,UAAU,CAACP,KAAK,CAACG,OAAAA,CAAQG,QAAQ,CAACI,QAAQ,CAAA,IAC5CP,OAAQG,CAAAA,QAAQ,CAACI,QAAQ,CAACD,IAAI,KAAK,QAAA,CAAA;AAEzC;;AAGA,IAAA,OAAOR,SAASC,IAAI,CAClB,CAACS,IACCpC,GAAAA,CAAAA,CAAEqC,cAAc,CAACZ,KAAK,CAACW,IAAAA,CAAAA,KACtB,CAACpC,CAAEgC,UAAU,CAACP,KAAK,CAACW,IAAKE,CAAAA,GAAG,CAAKF,IAAAA,IAAAA,CAAKE,GAAG,CAACJ,IAAI,KAAKzB,YACjDT,IAAAA,CAAAA,CAAEuC,OAAO,CAACd,KAAK,CAACW,IAAAA,CAAKE,GAAG,CAAKF,IAAAA,IAAAA,CAAKE,GAAG,CAACE,KAAK,KAAK/B,YAAY,CAAA,CAAA;AAErE,CAAA;AAEA;AACA,MAAMgC,mBAAAA,GAAsB,CAACnB,GAAUf,EAAAA,MAAAA,GAAAA;AACrC,IAAA,IAAI,CAACe,GAAAA,IAAOD,mBAAoBC,CAAAA,GAAAA,EAAKf,MAAS,CAAA,EAAA;IAE9C,IAAIA,MAAAA,CAAOC,IAAI,KAAK,QAAA,IAAYR,EAAEwB,eAAe,CAACC,KAAK,CAACH,GAAM,CAAA,EAAA;AAC5DA,QAAAA,GAAAA,CAAII,QAAQ,CAACgB,IAAI,CAACC,mBAAoBpC,CAAAA,MAAAA,CAAAA,CAAAA;AACxC,KAAA,MAAO,IAAIe,GAAAA,CAAIC,UAAU,EAAEqB,UAAU,CAAG,EAAA;AACtCtB,QAAAA,GAAAA,CAAIC,UAAU,CAACmB,IAAI,CAACpC,cAAeC,CAAAA,MAAAA,CAAAA,CAAAA;AACrC;AACF,CAAA;AAEA;AACA,MAAMsC,iBAAAA,GAAoB,CAACvB,GAAUf,EAAAA,MAAAA,GAAAA;IACnC,IAAI,CAACe,GAAKC,EAAAA,UAAAA,EAAY,OAAO,KAAA;IAE7B,MAAMuB,UAAAA,GAAaxB,IAAIC,UAAU,CAACwB,IAAI,CACpC,CAACX,IACCpC,GAAAA,CAAAA,CAAEqC,cAAc,CAACZ,KAAK,CAACW,IAAAA,CAAAA,KACrBpC,CAAEgC,CAAAA,UAAU,CAACP,KAAK,CAACW,IAAKE,CAAAA,GAAG,CAAKF,IAAAA,IAAAA,CAAKE,GAAG,CAACJ,IAAI,KAAK,QAAA,IACjDlC,CAAEuC,CAAAA,OAAO,CAACd,KAAK,CAACW,IAAKE,CAAAA,GAAG,CAAKF,IAAAA,IAAAA,CAAKE,GAAG,CAACE,KAAK,KAAK,QAAQ,CAC3DxC,IAAAA,CAAAA,CAAEwB,eAAe,CAACC,KAAK,CAACW,IAAAA,CAAKI,KAAK,CAAA,CAAA;AAGtC,IAAA,IAAIM,YAAYN,KAAO,EAAA;QACrB,MAAMQ,WAAAA,GAAcF,WAAWN,KAAK;QACpC,IAAI,CAACnB,mBAAoB2B,CAAAA,WAAAA,EAAazC,MAAS,CAAA,EAAA;AAC7CyC,YAAAA,WAAAA,CAAYtB,QAAQ,GAAGsB,WAAYtB,CAAAA,QAAQ,IAAI,EAAE;AACjDsB,YAAAA,WAAAA,CAAYtB,QAAQ,CAACgB,IAAI,CAACC,mBAAoBpC,CAAAA,MAAAA,CAAAA,CAAAA;AAChD;QACA,OAAO,IAAA;AACT;IAEA,OAAO,KAAA;AACT,CAAA;AAEA;AACA,MAAMoC,sBAAsB,CAACpC,MAAAA,GAAAA;IAC3B,MAAM,EAAEE,YAAY,EAAE,GAAGF,MAAAA;AACzB,IAAA,MAAMG,gBAAgBC,SAAUF,CAAAA,YAAAA,CAAAA;AAChC,IAAA,OAAOT,CAAEkB,CAAAA,aAAa,CAAClB,CAAAA,CAAEmB,gBAAgB,CAACnB,CAAEc,CAAAA,UAAU,CAACJ,aAAAA,CAAAA,EAAgBV,CAAEc,CAAAA,UAAU,CAAC,QAAA,CAAA,CAAA,CAAA;AACtF,CAAA;AAEA;AACA,MAAMmC,qBAAqB,CAAC1C,MAAAA,GAAAA;AAC1B,IAAA,OAAOP,EAAEkD,uBAAuB,CAC9B,EAAE,EACFlD,CAAAA,CAAEiB,gBAAgB,CAAC;QACjBjB,CAAEgB,CAAAA,cAAc,CAAChB,CAAEc,CAAAA,UAAU,CAAC,MAASd,CAAAA,EAAAA,CAAAA,CAAEe,OAAO,CAAC,aAAA,CAAA,CAAA;QACjDf,CAAEgB,CAAAA,cAAc,CAAChB,CAAEc,CAAAA,UAAU,CAAC,QAAWd,CAAAA,EAAAA,CAAAA,CAAEmD,eAAe,CAAC;YAACR,mBAAoBpC,CAAAA,MAAAA;AAAQ,SAAA,CAAA;AACzF,KAAA,CAAA,CAAA;AAEL,CAAA;AAEA;AACO,MAAM6C,YAAe,GAAA,CAACC,QAAkB9C,EAAAA,MAAAA,GAAAA;AAC7C,IAAA,IAAI,CAACA,MAAAA,EAAQE,YAAgB,IAAA,CAACF,QAAQC,IAAM,EAAA;AAC1C,QAAA,MAAM,IAAIY,KAAM,CAAA,oDAAA,CAAA;AAClB;IAEA,MAAMkC,kBAAAA,GAAqBD,UAAUE,IAAU,EAAA,IAAA,EAAA;IAC/C,MAAMC,IAAAA,GAAOF,qBAAqBtD,CAAEsD,CAAAA,kBAAAA,CAAAA,GAAsBtD,EAAEA,CAAEyD,CAAAA,OAAO,CAAC,EAAE,CAAA,CAAA;AACxE,IAAA,MAAM,EAAEjD,IAAI,EAAEC,YAAY,EAAE,GAAGF,MAAAA;IAC/B,MAAMmD,KAAAA,GAAQC,mBAAmBL,kBAAwB,CAAA,KAAA,KAAA;AAEzD,IAAA,MAAM5C,gBAAgBC,SAAUF,CAAAA,YAAAA,CAAAA;AAChC,IAAA,MAAMG,UAAUJ,IAAS,KAAA,cAAA,GAAiB,GAAGE,aAAc,CAAA,MAAM,CAAC,GAAGA,aAAAA;AACrE,IAAA,MAAMkD,MAASpD,GAAAA,IAAAA,KAAS,cAAiB,GAAA,CAAC,EAAE,EAAEC,YAAa,CAAA,YAAY,CAAC,GAAG,CAAC,EAAE,EAAEA,YAAc,CAAA,CAAA;IAE9FoD,kBAAmBL,CAAAA,IAAAA,EAAM5C,SAASgD,MAAQF,EAAAA,KAAAA,CAAAA;AAE1C,IAAA,IAAIA,KAAO,EAAA;AACTI,QAAAA,eAAAA,CAAgBN,MAAMjD,MAAQC,EAAAA,IAAAA,CAAAA;KACzB,MAAA;AACLuD,QAAAA,eAAAA,CAAgBP,MAAMjD,MAAQC,EAAAA,IAAAA,CAAAA;AAChC;IAEA,OAAOgD,IAAAA,CAAKQ,QAAQ,CAAC;QAAEC,KAAO,EAAA;AAAS,KAAA,CAAA;AACzC;AAEA;AACA,MAAMN,qBAAqB,CAACN,QAAAA,GAAAA;AAC1B,IAAA,MAAMa,YAAY,WAAY7D,CAAAA,IAAI,CAACgD,QAAaA,CAAAA,IAAAA,QAAAA,CAASc,QAAQ,CAAC,SAAA,CAAA;IAClE,MAAMC,gBAAAA,GAAmBf,QAASc,CAAAA,QAAQ,CAAC,gBAAA,CAAA;IAC3C,MAAME,UAAAA,GAAahB,QAASc,CAAAA,QAAQ,CAAC,UAAA,CAAA;IACrC,MAAMG,gBAAAA,GAAmBjB,QAASc,CAAAA,QAAQ,CAAC,gBAAA,CAAA;IAE3C,IAAID,SAAAA,IAAaE,kBAAkB,OAAO,KAAA;IAC1C,IAAIC,UAAAA,IAAcC,kBAAkB,OAAO,KAAA;AAC3C,IAAA,OAAO;AACT,CAAA;AAEA;AACA,MAAMC,eAAAA,GAAkB,CACtBf,IAAAA,EACAgB,SACAC,EAAAA,iBAAAA,GAAAA;AAEA,IAAA,IAAIA,iBAAqBA,IAAAA,iBAAAA,CAAkB7B,MAAM,GAAG,CAAG,EAAA;AACrD6B,QAAAA,iBAAAA,CAAkBC,EAAE,CAAC,CAAC,CAAA,CAAA,CAAGC,WAAW,CAACH,SAAAA,CAAAA;KAChC,MAAA;QACL,MAAMI,cAAAA,GAAiBpB,KAAKT,IAAI,CAAC/C,EAAE6E,SAAS,CAAA,CAAEH,EAAE,CAAC,CAAA,CAAA;QACjD,IAAIE,cAAAA,CAAehC,MAAM,GAAG,CAAG,EAAA;AAC7BgC,YAAAA,cAAAA,CAAeE,YAAY,CAACN,SAAAA,CAAAA;SACvB,MAAA;AACLO,YAAAA,eAAAA,CAAgBvB,IAAMgB,EAAAA,SAAAA,CAAAA;AACxB;AACF;AACF,CAAA;AAEA;AACA,MAAMX,kBAAqB,GAAA,CACzBL,IACA5C,EAAAA,OAAAA,EACAgD,MACAF,EAAAA,KAAAA,GAAAA;AAEA,IAAA,IAAIA,KAAO,EAAA;AACT,QAAA,IAAIF,IAAKT,CAAAA,IAAI,CAAC/C,CAAAA,CAAEgF,iBAAiB,EAAE;YAAEpB,MAAQ,EAAA;gBAAEpB,KAAOoB,EAAAA;AAAO;SAAKhB,CAAAA,CAAAA,MAAM,KAAK,CAAG,EAAA;YAC9E,MAAMqC,UAAAA,GAAajF,CAAEkF,CAAAA,iBAAiB,CACpC;AAAClF,gBAAAA,CAAAA,CAAEmF,sBAAsB,CAACnF,CAAEc,CAAAA,UAAU,CAACF,OAAAA,CAAAA;aAAU,EACjDZ,CAAAA,CAAEe,OAAO,CAAC6C,MAAAA,CAAAA,CAAAA;AAEZW,YAAAA,eAAAA,CAAgBf,MAAMyB,UAAYzB,EAAAA,IAAAA,CAAKT,IAAI,CAAC/C,EAAEgF,iBAAiB,CAAA,CAAA;AACjE;AACF,KAAA,MAAO,IACLxB,IAAKT,CAAAA,IAAI,CAAC/C,CAAAA,CAAEoF,kBAAkB,EAAE;QAC9BC,EAAI,EAAA;YAAEnD,IAAMtB,EAAAA;AAAQ,SAAA;QACpB0E,IAAM,EAAA;YAAE9E,IAAM,EAAA,gBAAA;YAAkB+E,MAAQ,EAAA;gBAAErD,IAAM,EAAA;AAAU,aAAA;YAAGsD,SAAW,EAAA;AAAC,gBAAA;oBAAEhD,KAAOoB,EAAAA;AAAO;AAAE;AAAC;KAC3FhB,CAAAA,CAAAA,MAAM,KAAK,CACd,EAAA;AACA,QAAA,MAAM6C,WAAczF,GAAAA,CAAAA,CAAE0F,mBAAmB,CAAC,OAAS,EAAA;AACjD1F,YAAAA,CAAAA,CAAE2F,kBAAkB,CAClB3F,CAAEc,CAAAA,UAAU,CAACF,OAAAA,CAAAA,EACbZ,CAAE4F,CAAAA,cAAc,CAAC5F,CAAAA,CAAEc,UAAU,CAAC,SAAY,CAAA,EAAA;AAACd,gBAAAA,CAAAA,CAAEe,OAAO,CAAC6C,MAAAA;AAAQ,aAAA,CAAA;AAEhE,SAAA,CAAA;AAED,QAAA,MAAMiC,QAAWrC,GAAAA,IAAAA,CACdT,IAAI,CAAC/C,EAAE8F,mBAAmB,CAAA,CAC1BC,MAAM,CAAC,CAACC,IAAAA,GACPA,IAAKxD,CAAAA,KAAK,CAACyD,YAAY,CAACtE,IAAI,CAC1B,CAACuE,IAAAA,GAAclG,CAAEmG,CAAAA,cAAc,CAAC1E,KAAK,CAACyE,IAAKZ,CAAAA,IAAI,KAAKY,IAAKZ,CAAAA,IAAI,CAACC,MAAM,EAAErD,IAAS,KAAA,SAAA,CAAA,CAAA;AAIrF,QAAA,MAAMkE,SAAY5C,GAAAA,IAAAA,CACfT,IAAI,CAAC/C,CAAEqG,CAAAA,mBAAmB,CAC1BN,CAAAA,MAAM,CACL,CAACC,IACChG,GAAAA,CAAAA,CAAEuC,OAAO,CAACd,KAAK,CAACuE,IAAAA,CAAKxD,KAAK,CAAC8D,UAAU,CAAA,IACrC,YAAajG,CAAAA,IAAI,CAACkG,MAAAA,CAAOP,IAAKxD,CAAAA,KAAK,CAAC8D,UAAU,CAAC9D,KAAK,CAAA,CAAA,CAAA;AAG1D+B,QAAAA,eAAAA,CAAgBf,MAAMiC,WAAaI,EAAAA,QAAAA,CAASjD,MAAM,GAAG,IAAIiD,QAAWO,GAAAA,SAAAA,CAAAA;AACtE;AACF,CAAA;AAEA;AACA,MAAMrB,eAAAA,GAAkB,CAACvB,IAAmCoB,EAAAA,cAAAA,GAAAA;IAC1D,IAAI;;QAEF,MAAM4B,KAAAA,GAAQhD,KAAKgD,KAAK,EAAA;QACxB,IAAIA,KAAAA,CAAM5D,MAAM,KAAK,CAAG,EAAA;;YAEtB,MAAM6D,UAAAA,GAAazG,CAAEyD,CAAAA,OAAO,CAAC;AAACmB,gBAAAA;AAAe,aAAA,CAAA;;YAE7C,OAAOpB,IAAAA,CAAKkD,WAAW,CAACD,UAAAA,CAAAA;AAC1B;;QAGA,MAAME,QAAAA,GAAWH,KAAK,CAAC,CAAE,CAAA;AACzB,QAAA,IAAI,CAACG,QAAAA,IAAY,CAACA,QAAAA,CAASnE,KAAK,EAAE;;YAEhC,MAAMiE,UAAAA,GAAazG,CAAEyD,CAAAA,OAAO,CAAC;AAACmB,gBAAAA;AAAe,aAAA,CAAA;YAC7C,OAAOpB,IAAAA,CAAKkD,WAAW,CAACD,UAAAA,CAAAA;AAC1B;;AAGA,QAAA,IAAIzG,EAAE4G,OAAO,CAACnF,KAAK,CAACkF,QAAAA,CAASnE,KAAK,CAAG,EAAA;;AAEnC,YAAA,IAAI,CAACmE,QAAAA,CAASnE,KAAK,CAACqE,IAAI,EAAE;AACxBF,gBAAAA,QAAAA,CAASnE,KAAK,CAACqE,IAAI,GAAG,EAAE;AAC1B;AACAF,YAAAA,QAAAA,CAASnE,KAAK,CAACqE,IAAI,CAACnE,IAAI,CAACkC,cAAAA,CAAAA;SACpB,MAAA;;YAEL,MAAM6B,UAAAA,GAAazG,CAAEyD,CAAAA,OAAO,CAAC;AAACmB,gBAAAA;AAAe,aAAA,CAAA;AAC7C+B,YAAAA,QAAAA,CAASG,OAAO,CAACL,UAAAA,CAAAA;AACnB;AACF,KAAA,CAAE,OAAOM,KAAY,EAAA;;AAEnBC,QAAAA,OAAAA,CAAQC,IAAI,CAAC,oDAAsDF,EAAAA,KAAAA,CAAMG,OAAO,CAAA;QAChF,MAAMT,UAAAA,GAAazG,CAAEyD,CAAAA,OAAO,CAAC;AAACmB,YAAAA;AAAe,SAAA,CAAA;QAC7C,IAAI;AACFpB,YAAAA,IAAAA,CAAKkD,WAAW,CAACD,UAAAA,CAAAA;AACnB,SAAA,CAAE,OAAOU,YAAc,EAAA;;YAErB,MAAM,IAAI/F,MACR,CAAC,uCAAuC,EAAE2F,KAAMG,CAAAA,OAAO,CAAC,iCAAiC,CAAC,CAAA;AAE9F;AACF;AACF,CAAA;AAEA;AACA,MAAME,kBAAAA,GAAqB,CAAC5D,IAAmC6D,EAAAA,aAAAA,GAAAA;;AAE7D,IAAA,IAAIrH,CAAEsH,CAAAA,gBAAgB,CAAC7F,KAAK,CAAC4F,aAAgB,CAAA,EAAA;QAC3C,OAAOA,aAAAA;AACT;;AAGA,IAAA,IACErH,EAAEuH,kBAAkB,CAAC9F,KAAK,CAAC4F,kBAC3BrH,CAAEwH,CAAAA,uBAAuB,CAAC/F,KAAK,CAAC4F,aAChCrH,CAAAA,IAAAA,CAAAA,CAAEyH,mBAAmB,CAAChG,KAAK,CAAC4F,aAC5B,CAAA,EAAA;QACA,MAAMR,IAAAA,GAAOQ,cAAcR,IAAI;;AAE/B,QAAA,IAAI7G,CAAEsH,CAAAA,gBAAgB,CAAC7F,KAAK,CAACoF,IAAO,CAAA,EAAA;YAClC,OAAOA,IAAAA;AACT;;AAEA,QAAA,IAAI7G,CAAE0H,CAAAA,cAAc,CAACjG,KAAK,CAACoF,IAAO,CAAA,EAAA;AAChC,YAAA,KAAK,MAAMc,IAAAA,IAAQd,IAAKA,CAAAA,IAAI,CAAE;AAC5B,gBAAA,IAAI7G,CAAE4H,CAAAA,eAAe,CAACnG,KAAK,CAACkG,IAAAA,CAAAA,IAAS3H,CAAEsH,CAAAA,gBAAgB,CAAC7F,KAAK,CAACkG,IAAAA,CAAK5F,QAAQ,CAAG,EAAA;AAC5E,oBAAA,OAAO4F,KAAK5F,QAAQ;AACtB;AACF;AACF;AACF;;AAGA,IAAA,IAAI/B,CAAEgC,CAAAA,UAAU,CAACP,KAAK,CAAC4F,aAAgB,CAAA,EAAA;QACrC,MAAMzG,OAAAA,GAAUyG,cAAcnF,IAAI;;AAGlC,QAAA,MAAM2F,iBAAiBrE,IAAKT,CAAAA,IAAI,CAAC/C,CAAAA,CAAEoF,kBAAkB,EAAE;YACrDC,EAAI,EAAA;gBAAEnD,IAAMtB,EAAAA;AAAQ;AACtB,SAAA,CAAA;QAEA,IAAIiH,cAAAA,CAAejF,MAAM,GAAG,CAAG,EAAA;AAC7B,YAAA,MAAM0C,OAAOuC,cAAeC,CAAAA,GAAG,EAAGtF,CAAAA,KAAK,CAAC8C,IAAI;;AAG5C,YAAA,IAAItF,CAAEsH,CAAAA,gBAAgB,CAAC7F,KAAK,CAAC6D,IAAO,CAAA,EAAA;gBAClC,OAAOA,IAAAA;AACT;;YAGA,IAAItF,CAAAA,CAAEuH,kBAAkB,CAAC9F,KAAK,CAAC6D,IAAStF,CAAAA,IAAAA,CAAAA,CAAEwH,uBAAuB,CAAC/F,KAAK,CAAC6D,IAAO,CAAA,EAAA;AAC7E,gBAAA,OAAO8B,mBAAmB5D,IAAM8B,EAAAA,IAAAA,CAAAA;AAClC;AACF;AACF;IAEA,OAAO,IAAA;AACT,CAAA;AAEA;AACA,MAAMyC,kBAAqB,GAAA,CACzBzG,GACAf,EAAAA,MAAAA,EACAC,IACAwH,EAAAA,SAAAA,GAAAA;AAEA,IAAA,IAAIxH,SAAS,QAAU,EAAA;QACrB,IAAI,CAACqC,iBAAkBvB,CAAAA,GAAAA,EAAKf,MAAS,CAAA,EAAA;AACnCyH,YAAAA,SAAAA,CAAU/E,kBAAmB1C,CAAAA,MAAAA,CAAAA,CAAAA;AAC/B;KACK,MAAA;AACLkC,QAAAA,mBAAAA,CAAoBnB,GAAKf,EAAAA,MAAAA,CAAAA;AAC3B;AACF,CAAA;AAEA;AACA,MAAMuD,eAAAA,GAAkB,CACtBN,IAAAA,EACAjD,MACAC,EAAAA,IAAAA,GAAAA;AAEA,IAAA,MAAMyH,OAAUzE,GAAAA,IAAAA,CAAKT,IAAI,CAAC/C,EAAEkI,wBAAwB,CAAA;IAEpD,IAAID,OAAAA,CAAQrF,MAAM,KAAK,CAAG,EAAA;AACxB,QAAA,MAAMuF,YACJ3H,IAAS,KAAA,QAAA,GAAWyC,mBAAmB1C,MAAUP,CAAAA,GAAAA,CAAAA,CAAEiB,gBAAgB,CAAC;YAACX,cAAeC,CAAAA,MAAAA;AAAQ,SAAA,CAAA;QAC9FgE,eAAgBf,CAAAA,IAAAA,EAAMxD,EAAEoI,wBAAwB,CAACD,YAAY3E,IAAKT,CAAAA,IAAI,CAAC/C,CAAAA,CAAE6E,SAAS,CAAA,CAAA;KAC7E,MAAA;QACLoD,OAAQI,CAAAA,OAAO,CAAC,CAACrC,IAAAA,GAAAA;AACf,YAAA,MAAME,IAAOF,GAAAA,IAAAA,CAAKxD,KAAK,CAAC8F,WAAW;;YAGnC,MAAMC,cAAAA,GAAiBnB,mBAAmB5D,IAAM0C,EAAAA,IAAAA,CAAAA;AAEhD,YAAA,IAAIqC,cAAgB,EAAA;gBAClBR,kBAAmBQ,CAAAA,cAAAA,EAAgBhI,MAAQC,EAAAA,IAAAA,EAAM,CAAC2H,SAAAA,GAAAA;oBAChDnC,IAAKxD,CAAAA,KAAK,CAAC8F,WAAW,GAAGH,SAAAA;AAC3B,iBAAA,CAAA;aACK,MAAA;;gBAELnC,IAAKxD,CAAAA,KAAK,CAAC8F,WAAW,GACpB9H,IAAAA,KAAS,WACLyC,kBAAmB1C,CAAAA,MAAAA,CAAAA,GACnBP,CAAEiB,CAAAA,gBAAgB,CAAC;oBAACX,cAAeC,CAAAA,MAAAA;AAAQ,iBAAA,CAAA;AACnD;AACF,SAAA,CAAA;AACF;AACF,CAAA;AAEA;AACA,MAAMwD,eAAAA,GAAkB,CACtBP,IAAAA,EACAjD,MACAC,EAAAA,IAAAA,GAAAA;AAEA,IAAA,MAAMyH,UAAUzE,IAAKT,CAAAA,IAAI,CAAC/C,CAAAA,CAAEwI,oBAAoB,EAAE;QAChDC,IAAM,EAAA;YAAEjI,IAAM,EAAA,kBAAA;YAAoByB,MAAQ,EAAA;gBAAEC,IAAM,EAAA;AAAS,aAAA;YAAGC,QAAU,EAAA;gBAAED,IAAM,EAAA;AAAU;AAAE;AAC9F,KAAA,CAAA;IAEA,IAAI+F,OAAAA,CAAQrF,MAAM,KAAK,CAAG,EAAA;AACxB,QAAA,MAAMuF,YACJ3H,IAAS,KAAA,QAAA,GAAWyC,mBAAmB1C,MAAUP,CAAAA,GAAAA,CAAAA,CAAEiB,gBAAgB,CAAC;YAACX,cAAeC,CAAAA,MAAAA;AAAQ,SAAA,CAAA;AAC9F,QAAA,MAAMmI,mBAAmB1I,CAAE2I,CAAAA,mBAAmB,CAC5C3I,CAAE4I,CAAAA,oBAAoB,CACpB,GACA5I,EAAAA,CAAAA,CAAEmB,gBAAgB,CAACnB,EAAEc,UAAU,CAAC,WAAWd,CAAEc,CAAAA,UAAU,CAAC,SACxDqH,CAAAA,CAAAA,EAAAA,SAAAA,CAAAA,CAAAA;AAGJ5D,QAAAA,eAAAA,CAAgBf,MAAMkF,gBAAkBlF,EAAAA,IAAAA,CAAKT,IAAI,CAAC/C,EAAE6E,SAAS,CAAA,CAAA;KACxD,MAAA;QACLoD,OAAQI,CAAAA,OAAO,CAAC,CAACrC,IAAAA,GAAAA;AACf,YAAA,MAAM6C,KAAQ7C,GAAAA,IAAAA,CAAKxD,KAAK,CAACqG,KAAK;;YAG9B,MAAMN,cAAAA,GAAiBnB,mBAAmB5D,IAAMqF,EAAAA,KAAAA,CAAAA;AAEhD,YAAA,IAAIN,cAAgB,EAAA;gBAClBR,kBAAmBQ,CAAAA,cAAAA,EAAgBhI,MAAQC,EAAAA,IAAAA,EAAM,CAAC2H,SAAAA,GAAAA;oBAChDnC,IAAKxD,CAAAA,KAAK,CAACqG,KAAK,GAAGV,SAAAA;AACrB,iBAAA,CAAA;aACK,MAAA;;gBAELnC,IAAKxD,CAAAA,KAAK,CAACqG,KAAK,GACdrI,IAAAA,KAAS,WACLyC,kBAAmB1C,CAAAA,MAAAA,CAAAA,GACnBP,CAAEiB,CAAAA,gBAAgB,CAAC;oBAACX,cAAeC,CAAAA,MAAAA;AAAQ,iBAAA,CAAA;AACnD;AACF,SAAA,CAAA;AACF;AACF,CAAA;;;;"}