@accelbyte/codegen 4.0.2 → 4.1.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,"sources":["../src/cli.ts","../src/CliParser.ts","../src/CodeGenerator.ts","../src/ParserUtils.ts","../src/helpers/utils.ts","../src/templates/template-class.ts","../src/templates/template-api-class.ts","../src/ParserQueryUtils.ts","../src/templates/template-query.ts","../src/Swagger.ts","../src/templates/template-api-method.ts","../src/templates/template-method.ts","../src/templates/template-query-method.ts","../src/templates/template-sdk-snippet.ts","../src/helpers/SwaggerReaderHelpers.ts","../src/templates/template-api-index.ts","../src/templates/template-zod.ts","../src/SwaggerDownloader.ts"],"sourcesContent":["/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport yargs from 'yargs'\nimport path from 'path'\nimport { CliOption, CliParser } from './CliParser'\nimport { CodeGenerator } from './CodeGenerator'\nimport { ParserUtils } from './ParserUtils'\nimport { SwaggerDownloader } from './SwaggerDownloader'\n\nconst generateSdk = async () => {\n const arrayOfSets = await Promise.all(CliParser.getConfigFile().map(config => CodeGenerator.main(config)))\n\n if (CliParser.isGenerateSnippetOnly()) {\n return\n }\n \n const indexImportsSet = new Set<string>()\n const queryImportsSet = new Set<string>()\n const filenamesSet = new Set<string>()\n\n for (const set of arrayOfSets) {\n set.indexImports.forEach(value => {\n const fileName = path.basename(value)\n\n if (!filenamesSet.has(fileName)) {\n indexImportsSet.add(value)\n filenamesSet.add(fileName)\n }\n })\n set.queryImports.forEach(value => {\n const fileName = path.basename(value)\n\n if (!filenamesSet.has(fileName)) {\n queryImportsSet.add(value)\n }\n })\n }\n\n const indexImportsArray = Array.from(indexImportsSet).sort()\n const queryImportsArray = Array.from(queryImportsSet).sort()\n const filesToImport = indexImportsArray.map(fileToImport => {\n return `export * from '${fileToImport.replace('\\\\', '/')}.js'`\n })\n const queryFilesToImport = queryImportsArray.map(fileToImport => {\n return `export * from '${fileToImport.replace('\\\\', '/')}.js'`\n })\n ParserUtils.writeAllImportsFile(CliParser.getOutputPath(), filesToImport.join('\\n'))\n ParserUtils.writeAllQueryImportsFile(CliParser.getOutputPath(), queryFilesToImport.join('\\n'))\n}\n\n// eslint-disable-next-line no-unused-expressions\nyargs\n .command('download-swaggers', 'Download swaggers JSON files', (yargs: CliOption) => {\n CliParser.createInstance(yargs)\n SwaggerDownloader.main()\n })\n .command('generate-code', 'Generate code based on downloaded swagger files', async (yargs: CliOption) => {\n // validate options\n yargs.check(({ output, snippetOnly, snippetOutput }) => {\n if (!output?.trim() && !snippetOnly) {\n throw new Error('output is required for generate-code')\n }\n \n if(snippetOnly && !snippetOutput) {\n throw new Error('snippetOutput is required when generating snippets.')\n }\n\n return true\n })\n\n CliParser.createInstance(yargs)\n\n await generateSdk()\n })\n .option('config', {\n description: 'Path to the config file with backend service URLs.',\n type: 'string',\n demandOption: true\n })\n .option('swaggersOutput', {\n description: 'Directory to save the downloaded Swagger JSON files.',\n type: 'string',\n demandOption: true\n })\n .option('output', {\n description: 'Directory for the generated code. Required when using the generate-code command.',\n type: 'string'\n })\n .option('skipReactQuery', {\n description: 'Disable React Query code generation.',\n type: 'boolean'\n })\n .option('snippetOnly', {\n description: 'Generate only code snippets.',\n type: 'boolean'\n })\n .option('snippetOutput', {\n description: 'Directory for the generated code snippets. Required when generating snippets.',\n type: 'string'\n })\n .demandCommand(1)\n .help().argv\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport fs from 'fs'\nimport * as path from 'path'\nimport { Argv } from 'yargs'\nimport { z } from 'zod'\n\nconst SwaggersConfig = z.array(z.array(z.string()))\ntype SwaggersConfig = z.TypeOf<typeof SwaggersConfig>\n\nexport interface CliOption\n extends Argv<{\n config: string\n swaggersOutput: string\n output: string\n snippetOnly?: boolean\n snippetOutput?: string\n skipReactQuery?: boolean\n }> {}\n\nexport class CliParser {\n private static _instance: CliParser\n public argv\n constructor(yargs: CliOption) {\n this.argv = yargs.parse()\n }\n\n public static createInstance = (yargs: CliOption) => {\n CliParser._instance = new CliParser(yargs)\n return CliParser._instance\n }\n\n private static instance = (yargs?: CliOption) => {\n if (!CliParser._instance && yargs) {\n return CliParser.createInstance(yargs)\n }\n return CliParser._instance\n }\n\n public static getConfigPath = (): string => {\n return CliParser.instance().argv.config\n }\n\n public static getConfigFile = (): SwaggersConfig => {\n const configPath = CliParser.getConfigPath()\n if (!configPath) throw new Error('Missing config file')\n const config = JSON.parse(fs.readFileSync(configPath, 'utf8'))\n if (!SwaggersConfig.safeParse(config).success) {\n throw new Error('Wrong config file format')\n }\n return config\n }\n\n public static getOutputPath = (): string => {\n return CliParser.instance().argv.output\n }\n\n public static getSwaggersOutputPath = (): string => {\n return CliParser.instance().argv.swaggersOutput\n }\n\n public static getResolvedSwaggersOutputPath = (): string => {\n return path.resolve(CliParser.getSwaggersOutputPath())\n }\n\n public static getSnippetOutputPath = (): string => {\n return CliParser.instance().argv.snippetOutput\n }\n\n public static skipReactQuery = (): boolean => {\n return CliParser.instance().argv.skipReactQuery\n }\n \n public static isGenerateSnippetOnly = (): boolean => {\n return CliParser.instance().argv.snippetOnly\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport SwaggerParser from '@apidevtools/swagger-parser'\nimport fs from 'fs'\nimport path from 'path'\nimport { CliParser } from './CliParser'\nimport { SwaggerReaderHelpers } from './helpers/SwaggerReaderHelpers'\nimport { ParserUtils } from './ParserUtils'\nimport { templateApiIndex } from './templates/template-api-index'\nimport { TemplateZod, TemplateZodArray } from './templates/template-zod'\n\n// Patching is done in https://bitbucket.org/accelbyte/justice-codegen-sdk-spec\n\nexport class CodeGenerator {\n static srcFolder = () => CliParser.getOutputPath()\n\n static getGeneratedFolder = (isAdmin: boolean) =>\n isAdmin ? `${CodeGenerator.srcFolder()}/generated-admin` : `${CodeGenerator.srcFolder()}/generated-public`\n\n static getGeneratedSnippetsFolder = () => `${CliParser.getSnippetOutputPath()}/generated-snippets`\n\n static prepareDirs = (DIST_DEFINITION_DIR, DIST_DIR, DIST_DIR_ENDPOINTS, DIST_DIR_QUERIES) => {\n ParserUtils.mkdirIfNotExist(DIST_DEFINITION_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DIR(true))\n ParserUtils.mkdirIfNotExist(DIST_DIR(false))\n ParserUtils.mkdirIfNotExist(DIST_DIR_ENDPOINTS(true))\n ParserUtils.mkdirIfNotExist(DIST_DIR_ENDPOINTS(false))\n ParserUtils.mkdirIfNotExist(DIST_DIR_QUERIES(true))\n }\n\n static main = async (nameArray: string[]): Promise<{ indexImports: Set<string>; queryImports: Set<string> }> => {\n const serviceName = nameArray[0]\n const sdkName = nameArray[1]\n const swaggerFile = nameArray[2]\n const parser = new SwaggerParser()\n const swaggerFilePath = `${CliParser.getSwaggersOutputPath()}/${swaggerFile}`\n const api = await parser.parse(swaggerFilePath)\n const serviceNameTitle = ParserUtils.convertDashesToTitleCase(serviceName)\n\n const indexImportsSet: Set<string> = new Set()\n const queryImportsSet = new Set<string>()\n const apiInfo = { ...api.info, 'x-version': api['x-version']?.version }\n console.log('----------\\nGenerating API:', { title: apiInfo.title, version: apiInfo.version })\n \n if(!CliParser.isGenerateSnippetOnly()) {\n ParserUtils.writeXVersion(CodeGenerator.srcFolder(), api['x-version'], api.info)\n }\n\n const parsedInformation = await SwaggerReaderHelpers.parseAllEndpoints({ api, sdkName, serviceName })\n\n if (CliParser.getSnippetOutputPath()) {\n try {\n ParserUtils.mkdirIfNotExist(CodeGenerator.getGeneratedSnippetsFolder())\n ParserUtils.writeSnippetFile(\n CodeGenerator.getGeneratedSnippetsFolder(),\n api.info.title,\n JSON.stringify(\n {\n ...parsedInformation.public.snippetMap,\n ...parsedInformation.admin.snippetMap\n },\n null,\n 2\n )\n )\n } catch (err) {\n console.error('Error generating snippets', err)\n }\n }\n\n if(CliParser.isGenerateSnippetOnly()) {\n console.log('\\nSuccessfully generate SDK snippets only\\n----------\\n\\n')\n return\n }\n\n const DIST_DIR = (isAdmin: boolean) => `${CodeGenerator.getGeneratedFolder(isAdmin)}`\n const DIST_DIR_ENDPOINTS = (isAdmin: boolean) => path.join(DIST_DIR(isAdmin), 'endpoints')\n const DIST_DIR_QUERIES = (isAdmin: boolean) => path.join(DIST_DIR(isAdmin), 'queries')\n const DIST_DEFINITION_DIR = path.join(CodeGenerator.srcFolder(), 'generated-definitions')\n const targetSrcFolder = `${CodeGenerator.srcFolder()}/`\n CodeGenerator.prepareDirs(DIST_DEFINITION_DIR, DIST_DIR, DIST_DIR_ENDPOINTS, DIST_DIR_QUERIES)\n\n const mainApiList = []\n const generatedDefinitions = []\n // ----\n const generatePublicOrAdmin = isAdmin => {\n const parsedInformationByType = isAdmin ? parsedInformation.admin : parsedInformation.public\n const {\n arrayDefinitions,\n tagToClassImportsRecord,\n tagToEndpointClassesRecord,\n tagToSdkClientRecord,\n tagToSdkFunctionNamesRecord,\n tagToSdkImportsRecord,\n tagToEndpointQueryRecord,\n tagToSdkFunctionDescription\n } = parsedInformationByType\n\n // creates Api And Endpoint classes\n const writeApiEndpointFiles = (isAdminEndpoint: boolean) => {\n const apiList = []\n for (const tag in tagToEndpointClassesRecord) {\n const { className, classGenName } = ParserUtils.generateClassName(tag, isAdminEndpoint)\n const classBuffer = tagToEndpointClassesRecord[tag]\n const imports = [...new Set([...tagToSdkImportsRecord[tag], ...Object.values(tagToClassImportsRecord[className])])]\n const apiImports = [...new Set([...tagToSdkImportsRecord[tag], ...Object.values(tagToClassImportsRecord[className])])]\n apiImports.push(`import { ${classGenName} } from './endpoints/${classGenName}.js'`)\n\n ParserUtils.writeClassFile(DIST_DIR_ENDPOINTS(isAdminEndpoint), classGenName, classBuffer, imports)\n const { apiGenName } = ParserUtils.generateApiName(tag, isAdminEndpoint)\n const queryBuffer = tagToEndpointQueryRecord[tag]\n\n // If react query skipped, do not write query files\n const queryFileName =\n !CliParser.skipReactQuery() &&\n ParserUtils.writeQueryFile(\n DIST_DIR_QUERIES(isAdminEndpoint),\n apiGenName,\n queryBuffer,\n apiImports,\n serviceNameTitle,\n tagToSdkFunctionNamesRecord[tag],\n imports,\n sdkName\n )\n\n const apiBuffer = tagToSdkClientRecord[tag]\n\n ParserUtils.writeApiFile(DIST_DIR(isAdminEndpoint), apiGenName, apiBuffer, imports, tagToSdkFunctionDescription[tag])\n apiList.push(apiGenName)\n\n // For endpoint classes, we need to append `$`.\n indexImportsSet.add(\n ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DIR_ENDPOINTS(isAdminEndpoint), `${classGenName}`), targetSrcFolder)\n )\n indexImportsSet.add(\n ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DIR(isAdminEndpoint), `${apiGenName}`), targetSrcFolder)\n )\n\n queryFileName &&\n queryImportsSet.add(\n ParserUtils.getRelativePathToWebSdkSrcFolder(\n path.join(DIST_DIR(isAdminEndpoint), 'queries', `${queryFileName}`),\n targetSrcFolder\n )\n )\n }\n mainApiList.push(...apiList)\n indexImportsSet.add(\n ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(CodeGenerator.srcFolder(), serviceNameTitle), targetSrcFolder)\n )\n } // end of writeApiEndpointFiles\n\n // creates the definition files\n const writeDefinitions = api => {\n const duplicates = new Map<string, string>()\n const definitions = api?.components?.schemas || api.definitions\n for (const ref in definitions) {\n const definition = definitions[ref]\n const fileName = ParserUtils.parseRefType(ref)\n const fileExist = fs.existsSync(path.join(DIST_DEFINITION_DIR, `${fileName}.ts`))\n if (fileExist) {\n const duplicateName = ParserUtils.toCamelCaseWord(ref).replace('.', '').replace('.', '')\n duplicates.set(ref, duplicateName)\n }\n const { buffer } = new TemplateZod().render(fileName, definition, new Map())\n generatedDefinitions.push(fileName)\n ParserUtils.writeDefinitionFile(DIST_DEFINITION_DIR, fileName, buffer)\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DEFINITION_DIR, fileName), targetSrcFolder))\n }\n\n // TODO BROKEN DEFINITION, this pefix dups with Model<Name>.js causing NOT FOUND, commented out\n // rerun, find duplicates and write again the fixed dup name\n // for (const ref in definitions) {\n // const definition = definitions[ref]\n // const fileName = ParserUtils.parseRefType(ref)\n // const { buffer, duplicateFound } = new TemplateZod().render(fileName, definition, duplicates)\n // if (duplicateFound) {\n // ParserUtils.writeDefinitionFile(DIST_DEFINITION_DIR, fileName, buffer)\n // indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DEFINITION_DIR, fileName), targetSrcFolder))\n // }\n // }\n\n for (const arrayClass of arrayDefinitions) {\n const buffer = new TemplateZodArray().render(arrayClass)\n generatedDefinitions.push(arrayClass)\n ParserUtils.writeDefinitionFile(DIST_DEFINITION_DIR, arrayClass, buffer)\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DEFINITION_DIR, arrayClass), targetSrcFolder))\n }\n } // end of writeDefinitions\n\n writeApiEndpointFiles(isAdmin)\n writeDefinitions(api)\n }\n\n generatePublicOrAdmin(true) // create Admin classes\n generatePublicOrAdmin(false) // create Public classes\n\n const apiIndexBuff = templateApiIndex(serviceNameTitle, mainApiList)\n ParserUtils.writeApiMainFile(CodeGenerator.srcFolder(), serviceNameTitle, apiIndexBuff)\n\n console.log('\\nCOMPLETED\\n----------\\n\\n')\n return { indexImports: indexImportsSet, queryImports: queryImportsSet }\n } // end of main\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { applyPatch, Operation } from 'fast-json-patch'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport path from 'path'\nimport { PermissionType, removeAdminPrefix } from './helpers/utils'\nimport { Endpoint, EndpointParameters } from './Swagger'\nimport { templateApiClass } from './templates/template-api-class'\nimport { templateClass } from './templates/template-class'\nimport { templateQuery } from './templates/template-query'\n\nconst REMOVED_KEYWORDS = [\n '/admin/',\n '/public/',\n '/v1/',\n '/v2/',\n '/v3/',\n '/v4/',\n '/v5/',\n '/namespace/' /* Note, it's not plural */,\n '/namespaces/',\n '/{namespace}/'\n]\n\nexport class ParserUtils {\n static getVersionSuffixFromPath(path: string) {\n const version2_3_4_etc = path.match(/\\/v([2-9]|[1-9]\\d+)\\/+/)\n const methodSuffix = version2_3_4_etc ? `_v${version2_3_4_etc[1]}` : ''\n return methodSuffix\n }\n\n static replaceAll = (text, search, replace) => {\n return text.split(search).join(replace)\n }\n\n static generateClassName = (tag: string, isAdmin: boolean) => {\n const className = _.upperFirst(_.camelCase(tag))\n const formattedApiName = removeAdminPrefix(className)\n const classGenName = isAdmin ? formattedApiName + 'Admin$' : formattedApiName + '$'\n return { className: formattedApiName, classGenName }\n }\n\n static generateApiName = (tag: string, isAdmin: boolean) => {\n const apiName = _.upperFirst(_.camelCase(tag))\n const formattedApiName = removeAdminPrefix(apiName)\n const apiGenName = isAdmin ? formattedApiName + 'AdminApi' : formattedApiName + 'Api'\n return { apiName, apiGenName }\n }\n\n static parseQueryParamAttributeDefault = (definition: EndpointParameters) => {\n const attrName = definition.name.slice(definition.name.lastIndexOf('.') + 1)\n let defaultValue = definition.default\n\n if (definition.type === 'array' && Array.isArray(definition.default)) {\n const mappedDefaultValue = definition.default.map(defaultValue =>\n typeof defaultValue === 'string' ? `'${defaultValue}'` : defaultValue\n )\n defaultValue = `[${mappedDefaultValue.join(', ')}]`\n }\n\n if (definition.type === 'string') {\n defaultValue = `'${definition.default}'`\n }\n return `${attrName}: ${defaultValue}`\n }\n\n static parseType = (pathParam: EndpointParameters) => {\n if (isSwaggerIntegerType(pathParam.type || pathParam?.schema?.type)) return 'number'\n if (pathParam.type === 'array') {\n if (isSwaggerIntegerType(pathParam.items.type)) return 'number[]'\n return `${pathParam.items.type ?? 'any'}[]`\n }\n if (pathParam?.schema?.type === 'array') {\n if (isSwaggerIntegerType(pathParam.schema.items.type)) return 'number[]'\n return `${pathParam.schema.items.type ?? 'any'}[]`\n }\n if (pathParam?.schema?.type) return pathParam.schema.type\n return pathParam.type\n }\n\n static parseQueryParamsType = (queryParams: EndpointParameters[]) => {\n const result = queryParams.map(queryParam => ParserUtils.parseAttributeType(queryParam)).join(', ')\n return result\n }\n\n static isAnyQueryParamRequired = (queryParams: EndpointParameters[]) => {\n return queryParams.some(queryParam => queryParam.required)\n }\n\n static convertDashesToTitleCase = str => {\n const result = str\n .split('-') // split the string at the hyphen\n .map((word, index) => {\n // capitalize the first letter of each word\n if (index === 0) {\n return word.charAt(0).toUpperCase() + word.slice(1)\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join('') // join the words together without a separator\n return result\n }\n\n static parseQueryParamsDefault = (queryParams: EndpointParameters[]) => {\n const result = queryParams\n .filter(queryParam => !!queryParam.default && !queryParam.required)\n .map(ParserUtils.parseQueryParamAttributeDefault)\n .join(',')\n return result ? `${result},` : ''\n }\n\n static parseBodyParamsImports = (bodyParams: EndpointParameters[]) => {\n return bodyParams.map(bodyParams => ParserUtils.parseRefImport(bodyParams)).filter(Boolean)\n }\n\n static parseImportDir = ($ref: string) => {\n let ref = $ref.replace('.', '/')\n if (ref[ref.length - 1] === '.' || ref[ref.length - 1] === '/') {\n ref = ref.slice(0, -1)\n }\n if (!ref.includes('/')) {\n return ''\n } else {\n return ref.slice(0, ref.lastIndexOf('/')).replace('#', '.')\n }\n }\n\n static parseRefImport = (bodyParam: EndpointParameters) => {\n const $ref = bodyParam?.schema?.$ref || bodyParam?.schema?.items?.$ref\n if (!$ref) {\n return null\n }\n const type = ParserUtils.parseRefType($ref)\n return `import { ${type} } from '../../generated-definitions/${type}.js'`\n }\n\n static parseRefType = ($ref: string) => {\n let ref = $ref.replace('.', '/')\n if (ref[ref.length - 1] === '.' || ref[ref.length - 1] === '/') {\n ref = ref.slice(0, -1)\n }\n const val = ref.slice(ref.lastIndexOf('/') + 1)\n // Converting it to TitleCase breaks schema refs. E.g. UserDataURL schema is converted to UserDataUrl breaking refs\n return _.upperFirst(_.camelCase(val)).replace(/( \\w)/g, group => group.replace(' ', '').toUpperCase())\n }\n\n static parseAttributeType = (definition: EndpointParameters) => {\n const required = definition.required ? '' : '?'\n\n const attrName = definition.name.slice(definition.name.lastIndexOf('.') + 1)\n\n if (definition.enum) {\n const enums = definition.enum.map(enm => (definition.type === 'string' ? `'${enm}'` : enm)).join(' | ')\n return `${attrName}${required}: ${enums}`\n }\n\n if (definition.type && ParserUtils.parseType(definition) === 'number') {\n return `${attrName}${required}: number`\n }\n\n if (definition.type && ParserUtils.parseType(definition) === 'number[]') {\n return `${attrName}${required}: number[]`\n }\n\n if (definition?.schema?.type && ParserUtils.parseType(definition) === 'number') {\n return `${attrName}${required}: number`\n }\n\n if (definition.type && definition.type === 'array') {\n return `${attrName}${required}: ${definition.items.type ?? 'any'}[]`\n }\n\n if (definition?.schema?.type && definition.schema.type === 'array') {\n return `${attrName}${required}: ${definition.schema.items.type ?? 'any'}[]`\n }\n\n if (definition.type && definition.type === 'file') {\n return `${attrName}${required}: File`\n }\n\n if (definition?.schema?.type && definition.schema.type === 'file') {\n return `${attrName}${required}: File`\n }\n\n if (definition.type && definition.type) {\n return `${attrName}${required}: ${definition.type} | null`\n }\n\n if (definition?.schema?.type && definition.schema.type) {\n return `${attrName}${required}: ${definition.schema.type} | null`\n }\n\n return `${attrName}${required}: any`\n }\n\n static parseBodyParamsType = (bodyParams: EndpointParameters[]): string => {\n const [bodyParam] = bodyParams\n\n if (!bodyParam) return null\n\n if (bodyParams.length > 0 && bodyParam?.name !== 'body' && !bodyParam?.schema) {\n let retBodyParams = `{${bodyParams.map(bodyParam => ParserUtils.parseAttributeType(bodyParam)).join(',')}}`\n retBodyParams = retBodyParams.replace('file?: file', 'file?: File') // fixed TS type File\n return retBodyParams\n }\n\n if (bodyParam?.schema?.type === 'array' && !bodyParam?.schema?.items?.$ref) {\n if (isSwaggerIntegerType(bodyParam.schema.items.type)) return 'number[]'\n return `${bodyParam.schema.items.type ?? 'any'}[]`\n }\n\n if (bodyParam?.schema?.type === 'array' && bodyParam?.schema?.items?.$ref) {\n return `${ParserUtils.parseRefType(bodyParam.schema.items.$ref)}[]`\n }\n\n if (bodyParam?.schema?.$ref) {\n return ParserUtils.parseRefType(bodyParam.schema.$ref)\n }\n\n if (bodyParam?.schema?.additionalProperties?.type === 'object') {\n return 'any'\n }\n\n return null\n }\n\n static get2xxResponses(methodEntity: Endpoint['responses']): string[] {\n const keys = Object.keys(methodEntity)\n const responseClasses = []\n const statusCodes = keys.filter(key => String(key).startsWith('2'))\n\n statusCodes.forEach(key => {\n const sch = methodEntity[key].schema\n const schV3 = methodEntity[key].content && methodEntity[key].content['application/json'].schema\n if (sch?.$ref) {\n responseClasses.push(ParserUtils.parseRefType(sch.$ref))\n } else if (sch?.type === 'array' && sch.items?.$ref) {\n responseClasses.push(`${ParserUtils.parseRefType(sch.items.$ref)}Array`) // Adds support for z.array() types\n } else if (schV3?.$ref) {\n responseClasses.push(ParserUtils.parseRefType(schV3.$ref))\n } else {\n // TODO add support for non $ref types. E.g. { type: 'array', items: { type: 'string', enum: [ 'WALLET', 'XSOLLA', .. ] } }\n }\n })\n return responseClasses\n }\n\n static isFormUrlEncoded(httpMethod: string, contentTypes: string[]): boolean {\n if (!contentTypes || contentTypes.length < 1) {\n return false\n }\n if (!['post', 'put', 'patch'].includes(httpMethod)) {\n return false\n }\n return contentTypes.includes('application/x-www-form-urlencoded')\n }\n\n static filterPathParams(parameters?: EndpointParameters[]): EndpointParameters[] {\n if (!parameters) {\n return []\n }\n return parameters.filter(parameter => parameter.in === 'path')\n }\n\n /**\n * This method converts this\n * POST `/gdpr/public/namespaces/{namespace}/users/{userId}/requests/{requestDate}/generate`\n *\n * to this\n * `createGenerateByRequestIdByUserId`\n */\n static generateNaturalLangMethod = ({ servicePrefix, path, httpMethod, isForm, existingMethods, permissionType }) => {\n let path_ = path\n path_ = path_.replace(`/${servicePrefix}/`, '/')\n REMOVED_KEYWORDS.forEach(prefix => {\n path_ = path_.replace(prefix, '/')\n })\n path_ = path_.substring(1) // remove first '/'\n\n // Example GET /xxx/yyy/{id}/items is \"fetchItems\" PLURAL\n // Example GET /xxx/yyy/{id}/items/{itemId} is \"fetchItem\" SINGULAR\n const isPlural = httpMethod === 'get' && !(path.slice(-1) === '}') // last char is '}'\n if (!isPlural) {\n path_ = ParserUtils.replaceAll(path_, 'ies/', 'y/') // parties, countries, policies\n path_ = ParserUtils.replaceAll(path_, 's/', '/')\n if (path_.indexOf('status') < 0) {\n path_ = path_.replace(/ies$/, 'y')\n path_ = path_.replace(/s$/, '')\n } // remove all tail end \"s\" -> /profiles, /users except /status\n } // make it non plural\n\n const arrLastWords = path_.split('}/')\n let lastWords = arrLastWords[arrLastWords.length - 1]\n\n const extractLastWord = lastWords_ => {\n let res = lastWords_\n res = res.split('/{')[0]\n return res\n }\n // convert \"/dlcs/latest/byGameAppId/{appId\" to \"/dlcs/latest/byGameAppId\" by dropping \"{appId\"\n lastWords = extractLastWord(lastWords)\n if (lastWords.indexOf('{') >= 0 && arrLastWords.length > 1) {\n lastWords = arrLastWords[arrLastWords.length - 2]\n lastWords = extractLastWord(lastWords)\n }\n\n const listBeforeLastWords = []\n let foundParam = false\n const listByParams = []\n\n // reverse iterate retrieving last words of the endpoint\n const pathElements = path_.split('/')\n pathElements\n .slice()\n .reverse()\n .forEach(item => {\n if (item.indexOf('}') >= 0) {\n foundParam = true\n let param = item.replace('{', '')\n param = param.replace('}', '')\n param = 'Byword' + _.upperFirst(param) + ''\n listByParams.push(param)\n } else if (!foundParam) {\n if (lastWords.indexOf(item) === -1) {\n listBeforeLastWords.push(item)\n }\n } else {\n foundParam = false\n }\n })\n\n const genPath = _.upperFirst(lastWords) + '/' + listBeforeLastWords.join('/') + listByParams.reverse().join('/')\n let generatedMethod = _.camelCase(mappedMethod(httpMethod, isForm, permissionType) + genPath)\n generatedMethod = ParserUtils.replaceAll(generatedMethod, 'Byword', '_By') // lodash removes the '_'\n const testedGeneratedMethod = generatedMethod + ParserUtils.getVersionSuffixFromPath(path)\n generatedMethod = resolveConflicts({ path, generatedMethod, testedGeneratedMethod, existingMethods })\n generatedMethod = generatedMethod + ParserUtils.getVersionSuffixFromPath(path)\n return generatedMethod\n }\n\n static filterBodyParams(parameters?: EndpointParameters[]) {\n if (Array.isArray(parameters) && parameters.length > 0) {\n return parameters.filter(parameter => parameter.in === 'body' || parameter.in === 'formData')\n }\n return []\n }\n\n static filterQueryParameters(parameters?: EndpointParameters[]): EndpointParameters[] {\n if (!parameters) {\n return []\n }\n return parameters.filter(parameter => parameter.in === 'query')\n }\n\n static mkdirIfNotExist(dirToCreate: string) {\n if (!fs.existsSync(dirToCreate)) {\n fs.mkdirSync(dirToCreate, { recursive: true })\n }\n }\n\n static writeClassFile(distDir: string, apiName: string, apiBuffer: string, imports?: string[]) {\n const fileContent = templateClass(apiName, apiBuffer, imports)\n fs.writeFileSync(`${distDir}/${apiName}.ts`, ParserUtils.prependCopyrightHeader(fileContent))\n }\n\n static writeAtomFile(distDir: string, apiName: string, fileContent: string) {\n ParserUtils.mkdirIfNotExist(distDir)\n fs.writeFileSync(`${distDir}/${apiName}.atom.ts`, ParserUtils.prependCopyrightHeader(fileContent))\n }\n\n static writeQueryFile(\n distDir: string,\n apiName: string,\n apiBuffer: string,\n imports: string[],\n serviceNameTitle: string,\n returnMethods: string,\n paramImports: string[],\n sdkName: string\n ) {\n if (apiBuffer.length < 1) {\n return null\n }\n const queryFileName = `${apiName.replace('Api', '')}.query`\n ParserUtils.mkdirIfNotExist(distDir)\n const fileContent = templateQuery(apiName, apiBuffer, imports, serviceNameTitle, returnMethods, paramImports, sdkName)\n fs.writeFileSync(`${distDir}/${queryFileName}.ts`, ParserUtils.prependCopyrightHeader(fileContent))\n\n return queryFileName\n }\n\n static writeXVersion(distDir: string, xversionJson: string, apiInfo) {\n if (xversionJson) {\n console.log('x-version:', xversionJson)\n fs.writeFileSync(`${distDir}/version.json`, JSON.stringify(xversionJson, null, 2))\n } else {\n const customVersion = {\n ...apiInfo,\n gitHash: apiInfo.version\n }\n console.error(`!!!! Missing x-version for ${distDir} ${customVersion}`)\n fs.writeFileSync(`${distDir}/version.json`, JSON.stringify(customVersion, null, 2))\n }\n }\n\n static writeApiFile(\n distDir: string,\n apiName: string,\n apiBuffer: string,\n imports: string[],\n returnMethodsDescription: Record<string, string>\n ) {\n const newImports = []\n imports.forEach(el => {\n newImports.push(el.replace('../../generated-definitions', '../generated-definitions'))\n })\n const fileContent = templateApiClass(apiName, apiBuffer, newImports, returnMethodsDescription)\n fs.writeFileSync(`${distDir}/${apiName}.ts`, ParserUtils.prependCopyrightHeader(fileContent))\n }\n\n static writeApiMainFile(distDir: string, serviceName: string, fileContent: string) {\n fs.writeFileSync(`${distDir}/${serviceName}.ts`, ParserUtils.prependCopyrightHeader(fileContent))\n }\n\n static writeSnippetFile(distDir: string, name: string, docBuffer: string) {\n let snippetFileName = ParserUtils.replaceAll(name, ' ', '-').toLowerCase()\n snippetFileName = snippetFileName.replace('justice-', '')\n snippetFileName = 'snippet-' + snippetFileName + '.json'\n fs.writeFileSync(`${distDir}/${snippetFileName}`, docBuffer)\n }\n\n static writeDefinitionFile(distDir: string, name: string, buffer: string) {\n ParserUtils.mkdirIfNotExist(distDir)\n fs.writeFileSync(path.join(distDir, `${name}.ts`), ParserUtils.prependCopyrightHeader(buffer))\n }\n\n static writeAllImportsFile(distDir: string, buffer: string) {\n ParserUtils.mkdirIfNotExist(distDir)\n fs.writeFileSync(path.join(distDir, 'all-imports.ts'), ParserUtils.prependCopyrightHeader(buffer))\n }\n\n static writeAllQueryImportsFile(distDir: string, buffer: string) {\n ParserUtils.mkdirIfNotExist(distDir)\n fs.writeFileSync(path.join(distDir, 'all-query-imports.ts'), ParserUtils.prependCopyrightHeader(buffer))\n }\n\n static toCamelCase(str: string) {\n return str\n .split('/')\n .map(function (word, index) {\n // If it is the first word make sure to lowercase all the chars.\n if (index === 0) {\n return word.toLowerCase()\n }\n // If it is not the first word only upper case the first char\n return ParserUtils.toCamelCaseWord(word)\n })\n .join('')\n }\n\n static toCamelCaseWord(word: string) {\n if (!word) {\n return ''\n }\n // convert hyphen separated case to camel case\n word = word.replace(/(-\\w)/g, m => m[1].toUpperCase())\n // capitalize first letter\n return word.charAt(0).toUpperCase() + word.slice(1)\n }\n\n static toTitleCaseWord(word: string) {\n if (!word) {\n return ''\n }\n return word.replace(/\\w\\S*/g, txt => {\n return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase()\n })\n }\n\n static applyPatchIfExists(\n swaggerFilePath: string,\n possibleSwaggerPatchFilePath: string,\n swaggerPatchedFilePath: string,\n swaggerPatchedDir: string\n ) {\n if (!fs.existsSync(swaggerPatchedDir)) {\n fs.mkdirSync(swaggerPatchedDir, { recursive: true })\n }\n\n if (!fs.existsSync(possibleSwaggerPatchFilePath)) {\n fs.copyFileSync(swaggerFilePath, swaggerPatchedFilePath)\n return\n }\n const swaggerContent = JSON.parse(fs.readFileSync(swaggerFilePath, 'utf8'))\n const swaggerPatchFileContent: Operation[] = JSON.parse(fs.readFileSync(possibleSwaggerPatchFilePath, 'utf8'))\n\n // Check out the existence of the paths listed in the Swagger JSON patch.\n for (const patchEntry of swaggerPatchFileContent) {\n // Trim out empty string array elements.\n const segments = patchEntry.path.split('/').filter(Boolean)\n let currentNode = swaggerContent\n // This `aggregatedPath` is to pinpoint the erroring path, so that we can display the exact path where it errors\n // and not the entire `patchEntry.path`.\n let aggregatedPath = ''\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n aggregatedPath += `/${segment}`\n\n // Replace the JSON pointers.\n // More on this: https://jsonpatch.com/#json-pointer.\n const effectiveSegment = segment.replace(/(~1)/g, '/').replace(/(~0)/g, '~')\n\n if (!currentNode[effectiveSegment]) {\n if (i + 1 === segments.length && patchEntry.op === 'add') {\n // Only allow missing node when we're adding a node and we're at the end of the segment array.\n // No-op.\n } else {\n // If it's not leaf node yet, then throw error.\n // If it's leaf node and the mode isn't \"add\", then throw error.\n throw new Error(\n [\n `JSON patch error: operation \"${patchEntry.op}\" on path \"${aggregatedPath}\" fails because the path doesn't exist in ${swaggerFilePath}. This may be caused by:\\n`,\n '1. The related service has patched the service, so patch is no longer needed.',\n '2. There is a breaking change on the service that causes the path to change.\\n',\n `In any case, revisit this file: \"${possibleSwaggerPatchFilePath}\", then try again.\\n`\n ].join('\\n')\n )\n }\n }\n\n currentNode = currentNode[effectiveSegment]\n }\n }\n\n const { newDocument } = applyPatch(swaggerContent, swaggerPatchFileContent)\n fs.writeFileSync(swaggerPatchedFilePath, JSON.stringify(newDocument, null, 2))\n }\n\n static getRelativePathToWebSdkSrcFolder(srcFolder: string, targetSrcFolder: string) {\n // For example:\n // Input: ../../accelbyte-typescript-sdk/packages/sdk/src/generated/...\n // Output: ./generated/...\n // Need to replace for Windows as `/` becomes `\\`.\n const replaced = srcFolder.replace(/\\\\/g, '/')\n return replaced.replace(/\\\\/g, '/').replace(targetSrcFolder, './')\n }\n\n static prependCopyrightHeader = (content: string): string => {\n const currentYear = new Date().getFullYear()\n return `/* \n * Copyright (c) 2022${currentYear > 2022 ? `-${currentYear}` : ''} AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n${content}`\n }\n\n static sortPathParamsByPath = (pathParams: EndpointParameters[], path: string) => {\n const params = path.match(/{\\w*}/g) || []\n const cleanParams = params.map(param => param.replace('{', '').replace('}', ''))\n return pathParams.sort((a, b) => cleanParams.indexOf(a.name) - cleanParams.indexOf(b.name))\n }\n}\n\nconst mappedMethod = (httpMethod: string, isForm: boolean, permissionType?: PermissionType) => {\n if (httpMethod === 'get') {\n // return 'fetch'\n return 'get'\n } else if (httpMethod === 'post' && isForm) {\n return 'post'\n } else if (httpMethod === 'post' && permissionType === 'READ') {\n return 'fetch'\n } else if (httpMethod === 'post' && permissionType === 'UPDATE') {\n return 'update'\n } else if (httpMethod === 'post') {\n return 'create'\n } else if (httpMethod === 'put') {\n return 'update'\n } else if (httpMethod === 'patch') {\n return 'patch'\n } else if (httpMethod === 'delete') {\n return 'delete'\n }\n}\n\nconst resolveConflicts = ({ path, generatedMethod, testedGeneratedMethod, existingMethods }) => {\n let _testedGenMethod = testedGeneratedMethod\n try {\n testConflict(path, _testedGenMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/namespaces/') >= 0) {\n generatedMethod += '_ByNS'\n // below avoids adding double suffix _ByNS_admin\n _testedGenMethod += '_ByNS'\n }\n }\n\n try {\n testConflict(path, _testedGenMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/admin/') >= 0) {\n generatedMethod += '_admin'\n _testedGenMethod += '_admin'\n }\n }\n\n // Still failed? dump it and fail the code gen build\n testConflict(path, _testedGenMethod, existingMethods)\n\n return generatedMethod\n}\n\nconst testConflict = (path, generatedMethod, existingMethods) => {\n if (existingMethods[generatedMethod]) {\n const conflictingMethod = { path, generatedMethod }\n throw Error(\n `Duplicate method conflict in ${JSON.stringify(conflictingMethod)},\\n existingMethods: ${JSON.stringify(existingMethods, null, 2)}`\n )\n }\n}\n\nconst isSwaggerIntegerType = (type: string) => {\n return type === 'integer' || type === 'int'\n}\n","/*\n * Copyright (c) 2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport fs from 'fs'\nimport path from 'path'\nimport { Endpoint } from '../Swagger'\n\nexport const capitalize = (string: string): string => {\n return string.charAt(0).toUpperCase() + string.slice(1)\n}\n\nexport function isObject(o) {\n return o instanceof Object && o.constructor === Object\n}\n\nexport const getPermission = (endpoint: Endpoint) => {\n const xSecurity = endpoint['x-security'] as Array<{ userPermissions?: string; groupPermissions?: string }> | { userPermission?: string }\n let xSecurityPerm: string = undefined\n\n if (Array.isArray(xSecurity)) {\n for (const obj of xSecurity) {\n if (obj?.userPermissions) {\n xSecurityPerm = obj.userPermissions\n }\n\n if (obj?.groupPermissions) {\n xSecurityPerm = obj.groupPermissions\n }\n }\n } else if (isObject(xSecurity)) {\n xSecurityPerm = xSecurity?.userPermission\n }\n\n return xSecurityPerm\n}\n\nexport type PermissionType = 'READ' | 'CREATE' | 'DELETE' | 'UPDATE' | null\n\nconst PermissionRegex = /\\[(\\w+)\\]/\n\nexport const getPermissionType = (permission?: string | string[]): PermissionType => {\n if (!permission) return null\n\n if (Array.isArray(permission)) {\n const perm = permission?.[0]\n if (!perm) return null\n\n const [_, type] = perm?.match(PermissionRegex)\n\n return (type || null) as PermissionType\n }\n\n const [_, type] = permission?.match(PermissionRegex)\n\n return (type || null) as PermissionType\n}\n\n/**\n * Append data to a file in the root directory.\n *\n * @param {string} data - The data to append to the file.\n * @param {string} fileName - The name of the file in the root directory.\n */\nexport const appendToRootFile = (data: string, fileName: string) => {\n // Calculate the path to the root directory file\n const rootFilePath = path.resolve(__dirname, '../../../../', fileName)\n\n try {\n // Append the data to the file in the root directory\n fs.appendFileSync(rootFilePath, data, 'utf8')\n console.log(`Data appended to ${rootFilePath} successfully.`)\n } catch (err) {\n console.error(`Failed to append data: ${err}`)\n }\n}\n\nexport const removeAdminPrefix = (name: string) => (name.startsWith('Admin') && name !== 'Admin' ? name.replace(/^Admin/, '') : name)\n\nexport const escapeComment = (string: string) => string.replace(/\\*\\//g, '*\\\\/').replace(/\\n/g, '\\n * ')\n\nconst generateJsDoc = ({ indentation = 4, lines }: { indentation: number; lines: string[] }): string => {\n const indent = ' '.repeat(indentation)\n\n const formattedLines = lines\n .filter(Boolean)\n .map(line => `${indent} * ${line}`)\n .join('\\n')\n\n return `${indent}/**\\n${formattedLines}\\n${indent} */`\n}\n\nexport const extractDescription = (\n description: string,\n options?: { isDeprecated?: boolean; responseClasses?: string[]; other?: string[]; indentation?: number }\n) => {\n const { indentation = 2, responseClasses, other, isDeprecated } = options\n return description\n ? generateJsDoc({\n lines: [\n isDeprecated ? '@deprecated' : '',\n escapeComment(description),\n ...(responseClasses.length > 1 ? [' ', '#### Response type:', ...responseClasses.map(val => `- \\`${val}\\``)] : ''),\n ...(options?.other ? other : '')\n ],\n indentation\n })\n : ''\n}\n\nexport const getResponseType = ({\n responseClasses,\n defaultType = 'unknown'\n}: {\n responseClasses: string[]\n defaultType?: string\n}): { responseType: string; responseTypeInAxiosResponse: string; responseTypeInResponse: string } => {\n const responseClass = responseClasses.length === 1 ? responseClasses?.[0] : 'unknown'\n const responseType = responseClass !== 'unknown' ? responseClasses?.[0] : defaultType\n return {\n responseType,\n responseTypeInAxiosResponse: `Promise<AxiosResponse<${responseType}>>`,\n responseTypeInResponse: `Promise<Response<${responseType}>>`\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nconst getImportableVarMap = () => ({\n '@accelbyte/sdk': ['CodeGenUtil', 'Response', 'Validate', 'SdkSetConfigParam'],\n axios: ['AxiosResponse'],\n zod: ['z']\n})\n\nconst makeNewImportVarMap = () => ({\n axios: ['AxiosInstance', 'AxiosRequestConfig'],\n '@accelbyte/sdk': ['SDKRequestConfig']\n})\n\nexport const generateImports = (body: string, importStatements: string[], makeNewImportVarMap, getImportableVarMap) => {\n const usedImportVarMap = makeNewImportVarMap\n const importableVarMap = getImportableVarMap\n\n for (const [moduleSource, importableVars] of Object.entries(importableVarMap)) {\n // @ts-ignore\n for (const importableVar of importableVars) {\n const importVarRegex = new RegExp(`(?<![\\\\d\\\\w_])${importableVar}(?![\\\\d\\\\w_])`)\n if (body.match(importVarRegex)) {\n usedImportVarMap[moduleSource] = [...(usedImportVarMap[moduleSource] || []), importableVar]\n }\n }\n }\n const generatedImports = Object.keys(usedImportVarMap)\n .sort()\n .map((moduleSource: string) => {\n return `import { ${usedImportVarMap[moduleSource].sort().join(', ')} } from '${moduleSource}'`\n })\n .join('\\n')\n return `${generatedImports}\\n${importStatements.sort().join('\\n')}`\n}\n\nexport const templateClass = (className: string, body: string, importStatements: string[]): string => {\n return `/**\n * AUTO GENERATED\n */\n${generateImports(body, importStatements, makeNewImportVarMap(), getImportableVarMap())}\n\nexport class ${className} {\n // @ts-ignore\n // prettier-ignore\n constructor(private axiosInstance: AxiosInstance, private namespace: string, private useSchemaValidation = true) {}\n ${body}\n}\n `\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { generateImports } from './template-class'\n\nconst getImportableVarMap = () => ({\n '@accelbyte/sdk': ['CodeGenUtil', 'Response', 'Validate', 'SdkSetConfigParam', 'Network', 'AccelByteSDK'],\n axios: ['AxiosDefaults', 'HeadersDefaults']\n})\n\nconst makeNewImportVarMap = () => ({\n '@accelbyte/sdk': ['AccelByteSDK', 'SdkSetConfigParam', 'ApiUtils', 'Network'],\n axios: ['AxiosRequestConfig', 'AxiosResponse']\n})\n\nexport const templateApiClass = (\n className: string,\n body: string,\n importStatements: string[],\n returnMethods: Record<string, string>\n): string => {\n const returnsMethodsWithDescription = Object.keys(returnMethods).reduce((acc, key) => {\n acc += `\n ${returnMethods[key]}\\n${key},`\n return acc\n }, '')\n const $className = className.replace(/Api$/, '$')\n return `/**\n * AUTO GENERATED\n */\n/* eslint-disable camelcase */\n// @ts-ignore -> ts-expect-error TS6133\n${generateImports(body, importStatements, makeNewImportVarMap(), getImportableVarMap())}\n${`import { ${$className} } from './endpoints/${$className}.js'\\n`}\n\nexport function ${className}(sdk: AccelByteSDK, args?: SdkSetConfigParam) {\n const sdkAssembly = sdk.assembly()\n \n const namespace = args?.coreConfig?.namespace ?? sdkAssembly.coreConfig.namespace\n const useSchemaValidation = args?.coreConfig?.useSchemaValidation ?? sdkAssembly.coreConfig.useSchemaValidation\n \n let axiosInstance = sdkAssembly.axiosInstance\n const requestConfigOverrides = args?.axiosConfig?.request\n const baseURLOverride = args?.coreConfig?.baseURL\n const interceptorsOverride = args?.axiosConfig?.interceptors ?? []\n\n if (requestConfigOverrides || baseURLOverride || interceptorsOverride.length > 0) {\n const requestConfig = ApiUtils.mergeAxiosConfigs(sdkAssembly.axiosInstance.defaults as AxiosRequestConfig, {\n ...(baseURLOverride ? { baseURL: baseURLOverride } : {}),\n ...requestConfigOverrides\n })\n axiosInstance = Network.create(requestConfig)\n\n for (const interceptor of interceptorsOverride) {\n if (interceptor.type === 'request') {\n axiosInstance.interceptors.request.use(interceptor.onRequest, interceptor.onError)\n }\n\n if (interceptor.type === 'response') {\n axiosInstance.interceptors.response.use(interceptor.onSuccess, interceptor.onError)\n }\n }\n }\n\n ${body}\n \n return {\n ${returnsMethodsWithDescription}\n }\n}\n `\n}\n","/*\n * Copyright (c) 2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport { capitalize } from './helpers/utils'\n\nexport class ParserQueryUtils {\n /**\n * convert csv 'aa,bb' into \"aa='aa', bb='bb'\"\n */\n static createQueryKeys(classNameWithoutApi, csvMethodNames: string, sdkName: string): string {\n const keys = csvMethodNames.split(',')\n const processedKeys = new Set<string>()\n\n const enumString = keys.reduce((acc, key, index) => {\n const trimmedKey = key.trim()\n if (trimmedKey) {\n // Remove known prefixes and any leading underscores or spaces\n const cleanedKey = trimmedKey.replace(/^(get|update|create|patch|delete|post|fetch)[_]?/, '')\n\n // Create the enum value only if it's not already added\n if (!processedKeys.has(cleanedKey)) {\n processedKeys.add(cleanedKey)\n acc += `${cleanedKey} = '${capitalize(sdkName)}.${classNameWithoutApi}.${cleanedKey}'`\n if (index < keys.length - 1) {\n acc += ',\\n'\n }\n }\n }\n return acc\n }, '')\n\n return enumString\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { ParserQueryUtils } from '../ParserQueryUtils'\n\nexport const generateImports = (body: string, className: string) => {\n const generatedImports =\n '' +\n \"import { AccelByteSDK, SdkSetConfigParam, ApiError } from '@accelbyte/sdk'\\n\" +\n \"import { AxiosError, AxiosResponse } from 'axios'\\n\" +\n '// @ts-ignore\\n' +\n \"import { useQuery, UseQueryOptions, UseQueryResult, useMutation, UseMutationOptions, UseMutationResult } from '@tanstack/react-query'\\n\" +\n `import { ${className} } from \"../${className}.js\"\\n`\n\n return generatedImports\n}\n\nexport const templateQuery = (\n className: string,\n body: string,\n importStatements: string[],\n serviceNameTitle: string,\n returnMethods: string,\n paramImports: string[],\n sdkName: string\n): string => {\n const classNameWithoutApi = className.replace('Api', '')\n const queryKeys = ParserQueryUtils.createQueryKeys(classNameWithoutApi, returnMethods, sdkName)\n const generatedImports = generateImports(body, className)\n\n return `/**\n * AUTO GENERATED\n */\n/* eslint-disable camelcase */\n${generatedImports}\n${filterUsedImports(paramImports, body)}\n\nexport enum Key_${classNameWithoutApi} {\n ${queryKeys}\n}\n\n ${body}\n `\n}\n\nfunction filterUsedImports(importArr, body) {\n return (\n importArr\n .filter(path => {\n const start = path.indexOf('{') + 1\n const end = path.indexOf('}')\n if (start > 0 && end > start) {\n const importName = path.slice(start, end).trim()\n // Check if the extracted className is used in the body\n return body.includes(importName)\n }\n return false\n })\n .map(path => path) // Direct mapping as there's no transformation needed\n .join('\\n') + '\\n'\n ) // Join the remaining imports with newlines\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { z } from 'zod'\n\nconst Schema = z.object({\n $ref: z.string().nullish(),\n type: z\n .union([z.literal('array'), z.literal('object'), z.literal('file'), z.literal('string'), z.literal('boolean'), z.literal('integer')])\n .nullish(),\n items: z\n .object({\n $ref: z.string().nullish(),\n type: z.string().nullish()\n })\n .nullish(),\n properties: z.union([z.array(z.string()).nullish(), z.record(z.object({ type: z.string() })).nullish()]),\n description: z.string().nullish(),\n additionalProperties: z\n .object({\n type: z.string().nullish()\n })\n .nullish()\n})\n\nexport type Schema = z.TypeOf<typeof Schema>\n\nexport const Definition = z.object({\n required: z.array(z.string()).nullish(),\n properties: z\n .record(\n z.object({\n type: z.string()\n })\n )\n .nullish()\n})\n\nexport type Definition = z.TypeOf<typeof Definition>\n\nexport const Definitions = z.record(Definition)\n\nexport type Definitions = z.TypeOf<typeof Definitions>\n\nconst EndpointParametersType = z.enum(['apiKey', 'boolean', 'int', 'integer', 'number', 'string', 'array', 'file'])\nconst EndpointParametersIn = z.enum(['body', 'formData', 'header', 'path', 'query'])\n\nconst EndpointParameters = z.object({\n type: EndpointParametersType.nullish(),\n description: z.string().nullish(),\n name: z.string(),\n in: EndpointParametersIn,\n required: z.boolean().nullish(),\n schema: Schema.nullish(),\n default: z.union([z.boolean(), z.string(), z.number(), z.array(z.any())]).nullish(),\n enum: z.array(z.union([z.boolean(), z.string(), z.number()])).nullish(),\n items: z\n .object({\n type: z.string(),\n enum: z.array(z.any()).nullish()\n })\n .nullish()\n})\n\nexport type EndpointParameters = z.TypeOf<typeof EndpointParameters>\n\nexport const Endpoint = z.object({\n description: z.string().nullish(),\n consumes: z.array(z.string()).nullish(),\n produces: z.array(z.string()).nullish(),\n tags: z.array(z.string()).nullish(),\n summary: z.string().nullish(),\n operationId: z.string(),\n deprecated: z.boolean().nullish(),\n responses: z.record(\n z.object({\n description: z.string().nullish(),\n schema: Schema.nullish(),\n content: z\n .object({\n 'application/json': z.object({\n schema: Schema.nullish()\n })\n })\n .nullish()\n })\n ),\n parameters: z.array(EndpointParameters).nullish(),\n requestBody: z\n .object({\n required: z.boolean().nullish(),\n content: z\n .object({\n 'application/json': z\n .object({\n schema: Schema.nullish()\n })\n .nullish()\n })\n .nullish()\n })\n .nullish(),\n // The proper type is z.array(z.record(z.array(z.string()))).nullish() but somehow there are endpoints with\n // an object type instead of an array type, so, yeah.\n //\n // Services with this error: sdk-iam, sdk-ugc.\n 'x-security': z.any().nullish()\n})\nexport type Endpoint = z.TypeOf<typeof Endpoint>\n\nconst Operation = z.object({\n get: Endpoint.nullish(),\n post: Endpoint.nullish(),\n patch: Endpoint.nullish(),\n delete: Endpoint.nullish(),\n put: Endpoint.nullish()\n})\nexport type Operation = z.TypeOf<typeof Operation>\nexport type HttpMethod = keyof Operation\n\nexport const Paths = z.record(Operation)\n\nexport const OpenApiSpec = z.object({\n paths: Paths,\n definitions: Definitions,\n basePath: z.string(),\n info: z.object({\n description: z.string(),\n title: z.string(),\n contact: z.object({\n name: z.string(),\n url: z.string(),\n email: z.string()\n }),\n version: z.string()\n }),\n schemes: z.array(z.string()).nullish(),\n components: z\n .object({\n schemas: Definitions\n })\n .nullish()\n})\n\nexport type OpenApiSpec = z.TypeOf<typeof OpenApiSpec>\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { extractDescription, getResponseType } from '../helpers/utils'\nimport { ParserUtils } from '../ParserUtils'\nimport { EndpointParameters } from '../Swagger'\n\nexport const templateApiMethod = ({\n classMethod,\n httpMethod,\n path,\n pathParams,\n bodyParams,\n responseClasses,\n classGenName,\n methodParams,\n methodParamsNoTypes,\n xSecurity\n}: {\n classMethod: string\n httpMethod: string\n path: string\n pathParams: EndpointParameters[]\n bodyParams: EndpointParameters[]\n responseClasses: string[]\n classGenName: string\n methodParams: string\n methodParamsNoTypes: string\n // Reference: https://accelbyte.atlassian.net/wiki/spaces/CW/pages/2991423677/Draft+Swagger+validation+for+API+explorer+content+proposal.\n // Endpoint with `x-security` means it requires authentication.\n xSecurity: Array<Record<string, string[]>> | undefined\n}) => {\n let newPath = `'${path}'`\n let snippetMethod = ''\n\n for (const pathParam of pathParams) {\n const type = ParserUtils.parseType(pathParam)\n const pName = pathParam.name === 'namespace' ? 'this.namespace' : pathParam.name\n if (path.match(`{${pathParam.name}}`)) {\n if (type === 'string') {\n newPath = `${newPath}.replace('{${pathParam.name}}', ${pName})`\n } else {\n newPath = `${newPath}.replace('{${pathParam.name}}', String(${pName}))`\n }\n }\n }\n\n const snippetShellArgs: string[] = ['--location --request', `${httpMethod} '__DOMAIN__${path}'`, \"--header 'accept: application/json'\"]\n const snippetApiArgs: string[] = []\n\n // Admin paths _usually_ always require authentication.\n // If it's public, then it can't be helped, we need to rely on `x-security` that's provided from the domain service teams.\n if (xSecurity !== undefined || path.includes('/admin')) {\n snippetShellArgs.push(\"--header 'Authorization: Bearer {access_token}'\")\n snippetApiArgs.push(\"{ axiosConfig: { request: { headers: { Authorization: 'Bearer {access_token}' } } } }\".trim())\n }\n\n if (httpMethod !== 'get') {\n const curlParams = bodyParams?.map(ob => {\n return ` \"${ob.name}\": \"\"`\n })\n\n // Prevent sending `--data-raw` in case of `DELETE` method without body.\n if (curlParams.length > 0) {\n snippetShellArgs.push(`--data-raw '{ ${curlParams}}'`)\n }\n }\n\n const snippetShell = `curl ${snippetShellArgs.join(' \\\\\\n ')}`\n\n const { responseType, responseTypeInAxiosResponse } = getResponseType({ responseClasses })\n\n const methodImpl = `\n async function ${classMethod}(${methodParams}): ${responseTypeInAxiosResponse} {\n const $ = new ${classGenName}(axiosInstance, namespace, useSchemaValidation)\n const resp = await $.${classMethod}(${methodParamsNoTypes})\n if (resp.error) throw resp.error\n return resp.response\n }\n `\n const snippetPromiseString = responseType !== 'unknown' ? `Promise<${responseType}>` : 'Promise'\n snippetMethod += `${classMethod}(${methodParams}) \\n // return ${snippetPromiseString}`\n\n return {\n generatedMethodString: methodImpl,\n snippetApiArgs,\n snippetMethod,\n snippetShell\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { extractDescription, getResponseType } from '../helpers/utils'\nimport { ParserUtils } from '../ParserUtils'\nimport { EndpointParameters } from '../Swagger'\n\nexport const templateMethod = ({\n classMethod,\n description,\n httpMethod,\n path,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded,\n responseClasses,\n deprecated\n}: {\n classMethod: string\n description: string\n httpMethod: string\n path: string\n pathParams: EndpointParameters[]\n bodyParams: EndpointParameters[]\n queryParams: EndpointParameters[]\n isFormUrlEncoded: boolean\n responseClasses: string[]\n deprecated: boolean\n}) => {\n let methodParams = ''\n let methodParamsNoTypes = ''\n let newPath = `'${path}'`\n let importStatements: string[] = []\n\n const sortedPathParams = ParserUtils.sortPathParamsByPath(pathParams, path)\n for (const pathParam of sortedPathParams) {\n const type = ParserUtils.parseType(pathParam)\n if (pathParam.name !== 'namespace') {\n methodParams += pathParam.name + `:${type}` + ', '\n methodParamsNoTypes += pathParam.name + ', '\n }\n const pName = pathParam.name === 'namespace' ? 'this.namespace' : pathParam.name\n if (path.match(`{${pathParam.name}}`)) {\n if (type === 'string') {\n newPath = `${newPath}.replace('{${pathParam.name}}', ${pName})`\n } else {\n newPath = `${newPath}.replace('{${pathParam.name}}', String(${pName}))`\n }\n }\n }\n\n let dataType = null\n if (httpMethod !== 'get') {\n dataType = ParserUtils.parseBodyParamsType(bodyParams)\n importStatements = ParserUtils.parseBodyParamsImports(bodyParams)\n methodParams += dataType ? `data: ${dataType},` : ''\n methodParamsNoTypes += dataType ? `data,` : ''\n }\n\n const isAnyRequired = ParserUtils.isAnyQueryParamRequired(queryParams)\n const queryParamsType = queryParams.length\n ? `queryParams${isAnyRequired ? '' : '?'}: {${ParserUtils.parseQueryParamsType(queryParams)}}`\n : ''\n\n const queryParamsDefault = queryParams.length\n ? `const params = {${ParserUtils.parseQueryParamsDefault(queryParams)} ...queryParams} as AxiosRequestConfig`\n : 'const params = {} as AxiosRequestConfig'\n\n const isPostPutPatch = ['post', 'put', 'patch'].includes(httpMethod)\n const isDelete = ['delete'].includes(httpMethod)\n let dataPayload = '{params}'\n\n const descriptionText = extractDescription(description, { isDeprecated: deprecated, responseClasses })\n\n let formPayloadString = ''\n if (isFormUrlEncoded) {\n formPayloadString = ``\n const params = \"{ ...params, headers: { ...params.headers, 'content-type': 'application/x-www-form-urlencoded' } }\"\n\n dataPayload = dataType ? `CodeGenUtil.getFormUrlEncodedData(data), ${params}` : `null, ${params}`\n } else if (isPostPutPatch) {\n dataPayload = dataType ? `data, {params}` : 'null, {params}'\n } else if (isDelete) {\n dataPayload = dataType ? `{data, params}` : '{params}'\n }\n const isFileUpload = methodParams.indexOf('data: {file') > -1\n\n const { responseType, responseTypeInResponse } = getResponseType({ responseClasses })\n const resolvedResponseClassValidated = responseType !== 'unknown' ? `${responseType}` : 'z.unknown()'\n methodParams = (queryParamsType ? `${methodParams} ${queryParamsType}` : methodParams).replace(/,\\s*$/, '')\n methodParamsNoTypes = queryParamsType ? `${methodParamsNoTypes} queryParams` : methodParamsNoTypes\n\n const isGuardInvoked = ['get', 'post', 'put', 'patch', 'delete'].includes(httpMethod)\n\n const generatedMethodName = `${classMethod}(${methodParams}): ${responseTypeInResponse}`\n\n let methodImpl = `${descriptionText}\n ${generatedMethodName} {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n\n${` return Validate.validateOrReturnResponse(this.useSchemaValidation, () => resultPromise, ${resolvedResponseClassValidated}, '${resolvedResponseClassValidated}')`}\n }\n `\n\n if (!isGuardInvoked) {\n methodImpl = ``\n }\n\n const res = {\n methodImpl,\n methodParams,\n methodParamsNoTypes,\n importStatements\n }\n return res\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { capitalize, extractDescription, getResponseType } from '../helpers/utils'\nimport { ParserUtils } from '../ParserUtils'\nimport { EndpointParameters } from '../Swagger'\n\n/* Table query doesn't have permission, will revisit later */\nconst POST_FETCH_INCLUDES_PATH = ['/table-query/']\n\nexport const templateQueryMethod = ({\n classMethod,\n httpMethod,\n path,\n pathParams,\n responseClasses,\n methodParams,\n apiGenName,\n description,\n deprecated\n}: {\n classMethod: string\n httpMethod: string\n path: string\n pathParams: EndpointParameters[]\n responseClasses: string[]\n methodParams: string\n apiGenName: string\n description: string\n deprecated: boolean\n}) => {\n const isPostFetch = httpMethod === 'post' && (POST_FETCH_INCLUDES_PATH.some(p => path.includes(p)) || path.endsWith('/list'))\n\n const isFetch = classMethod.startsWith('fetch')\n const isGet = httpMethod === 'get' || isPostFetch || isFetch\n\n const queryMethod = isGet ? 'useQuery' : 'useMutation'\n let mParams = ''\n let mParamsNoTypes = ''\n let newPath = `'${path}'`\n\n const sortedPathParams = ParserUtils.sortPathParamsByPath(pathParams, path)\n for (const pathParam of sortedPathParams) {\n const type = ParserUtils.parseType(pathParam)\n if (pathParam.name !== 'namespace') {\n mParams += pathParam.name + `:${type}` + ', '\n mParamsNoTypes += pathParam.name + ', '\n }\n const pName = pathParam.name === 'namespace' ? 'this.namespace' : pathParam.name\n if (path.match(`{${pathParam.name}}`)) {\n if (type === 'string') {\n newPath = `${newPath}.replace('{${pathParam.name}}', ${pName})`\n } else {\n newPath = `${newPath}.replace('{${pathParam.name}}', String(${pName}))`\n }\n }\n }\n\n const { responseType } = getResponseType({ responseClasses })\n let _methodName = convertMethodNameToHook({ classMethod, apiGenName, isGet })\n const _methodParams = methodParams && methodParams.length > 0 ? `& { ${methodParams} }` : ''\n const _methodParamsImpl = convertToMethodImplArgs(methodParams)\n const queryKey = createQueryKey(apiGenName, classMethod)\n const descriptionText = extractDescription(description, {\n isDeprecated: deprecated,\n responseClasses,\n other: [' ', '#### Default Query Options', 'The default options include:', '```', '{', ` queryKey: [${queryKey}, input]`, '}', '```']\n })\n\n const queryMethodImpl = `\\n\n${descriptionText}\nexport const ${_methodName} = (\n sdk: AccelByteSDK,\n input: SdkSetConfigParam ${_methodParams},\n options?: Omit<UseQueryOptions<${responseType}, AxiosError<ApiError>>, 'queryKey'>,\n callback?: (data: AxiosResponse<${responseType}>) => void\n ): UseQueryResult<${responseType}, AxiosError<ApiError>> => { \n \n const queryFn = (\n sdk: AccelByteSDK, \n input: Parameters<typeof ${_methodName}>[1]\n ) => async () => {\n const response = \n (await ${apiGenName}(sdk, { coreConfig: input.coreConfig, axiosConfig: input.axiosConfig }).\n ${classMethod}(${_methodParamsImpl}))\n callback && callback(response)\n return response.data\n }\n \n return ${queryMethod}<${responseType}, AxiosError<ApiError>>({\n queryKey: [${queryKey}, input],\n queryFn: queryFn(sdk, input),\n ...options\n })\n}\\n \n `\n\n const mutationMethodImpl = `\\n\n ${descriptionText}\nexport const ${_methodName} = (\n sdk: AccelByteSDK,\n options?: Omit<UseMutationOptions<${responseType}, AxiosError<ApiError>, SdkSetConfigParam ${_methodParams}>, 'mutationKey'>,\n callback?: (data: ${responseType}) => void\n ): UseMutationResult<${responseType}, AxiosError<ApiError>, SdkSetConfigParam ${_methodParams}> => { \n \n const mutationFn = async (input: SdkSetConfigParam ${_methodParams}) => {\n const response = \n (await ${apiGenName}(sdk, { coreConfig: input.coreConfig, axiosConfig: input.axiosConfig }).\n ${classMethod}(${_methodParamsImpl}))\n callback && callback(response.data)\n return response.data\n }\n \n return useMutation({\n mutationKey: [${queryKey}],\n mutationFn,\n ...options\n })\n}\\n \n `\n\n return isGet ? queryMethodImpl : mutationMethodImpl\n}\n\nfunction versionMutationSuffixMethodName(baseMethodName: string): string {\n // Use regex to split the method name at the last occurrence of a version pattern\n const parts = baseMethodName.split(/(_v\\d+)$/)\n const name = parts[0] // The base name without the version\n const versionSuffix = parts[1] || '' // The version suffix or empty if not present\n\n // Insert the version suffix after \"Mutation\" correctly, even if it's deeply embedded\n const res = `${name}Mutation${versionSuffix}`\n return res\n}\n\n/*\n * Converts \"SomethingApi.get|post|etcWhatever\" to \"Something.Whatever\"\n */\nfunction createQueryKey(className, methodName) {\n const prefixRegex = /^(get|create|update|delete|patch|post|fetch)[_]?/i\n const cleanedMethodName = methodName.replace(prefixRegex, '').trim()\n const finalMethodName = cleanedMethodName.charAt(0).toUpperCase() + cleanedMethodName.slice(1)\n return `Key_${className.replace('Api', '')}.${finalMethodName}`\n}\n\nconst prefixMappings = {\n get: 'use',\n create: 'useCreate',\n patch: 'usePatch',\n update: 'useUpdate',\n delete: 'useDelete',\n post: 'usePost',\n fetch: 'useFetch'\n} as const\n\nfunction convertMethodNameToHook({ classMethod, apiGenName, isGet }: { classMethod: string; apiGenName: string; isGet: boolean }) {\n for (const [originalPrefix] of Object.entries(prefixMappings)) {\n if (classMethod.startsWith(originalPrefix)) {\n const methodName = !isGet ? versionMutationSuffixMethodName(classMethod) : classMethod\n return `use${apiGenName}_${capitalize(methodName)}`\n }\n }\n return classMethod\n}\n\n/**\n * Converts \"data: UpgradeHeadlessAccountV3Request, queryParams?: etc\"\n * To: \"input.data, input.queryParams\"\n */\nfunction convertToMethodImplArgs(methodArgs) {\n // Split the input string on commas to separate each property\n const properties = methodArgs\n .split(/,\\s*(?![^{}]*\\})/)\n .map(prop => prop.trim())\n .filter(Boolean)\n\n // Initialize an array to hold the formatted properties\n const formattedProperties = []\n\n // Process each property\n properties.forEach(prop => {\n // Check if the property includes an object (detecting a colon followed by a curly brace)\n if (prop.includes(': {')) {\n // Extract the property name, considering optional '?'\n const propertyName = prop.split(': {')[0].replace('?', '').trim()\n formattedProperties.push(`input.${propertyName}`)\n } else {\n // Regular property (no object)\n const colonIndex = prop.indexOf(':')\n const propertyName = prop.substring(0, colonIndex).replace('?', '').trim()\n formattedProperties.push(`input.${propertyName}`)\n }\n })\n\n // Join the formatted property names with ', '\n return formattedProperties.join(', ')\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { ParserUtils } from '../ParserUtils'\n\nexport const templateSdkSnippet = ({\n serviceNameTitle,\n apiName,\n snippetMethod,\n snippetApiArgs: snippetApiArgsParam\n}: {\n serviceNameTitle: string\n apiName: string\n snippetMethod: string\n snippetApiArgs: string[]\n}) => {\n const methodArr = snippetMethod.split('//')\n const snippetApiArgs = ['sdk', ...snippetApiArgsParam]\n\n let normMethod = normalizeMethodSnippet(methodArr[0].trim(), 'data:')\n normMethod = normalizeMethodSnippet(normMethod, 'queryParams:')\n normMethod = normalizeMethodSnippet(normMethod, 'queryParams?:')\n normMethod += '\\n\\n//' + methodArr[1]\n\n const sdkSnippet = `import { AccelByte } from '@accelbyte/sdk'\nimport { ${serviceNameTitle} } from '@accelbyte/sdk-${serviceNameTitle.toLowerCase()}'\n\nconst sdk = AccelByte.SDK({\n coreConfig: {\n baseURL: '__DOMAIN__',\n clientId: '77f88506b6174c3ea4d925f5b4096ce8',\n namespace: 'accelbyte',\n redirectURI: 'http://localhost:3030'\n }\n})\n\n${serviceNameTitle}.${apiName}(${snippetApiArgs.join(', ')})\n .${normMethod}`\n return sdkSnippet\n}\n\nconst normalizeMethodSnippet = (methodInput: any, splitWord: string) => {\n const split1 = methodInput.split(splitWord)\n if (!split1[1]) {\n return methodInput\n }\n let split2 = split1[1].trim()\n split2 = ParserUtils.replaceAll(split2, '{', '')\n split2 = ParserUtils.replaceAll(split2, '})', '')\n split2 = split2.split(',')\n let params = ''\n split2.forEach(p => {\n params += '\\n ' + ParserUtils.replaceAll(p.trim(), ')', '') + ','\n })\n params = params.slice(0, -1) // remove last , char\n\n const result = split1[0] + splitWord + ' {' + params + '\\n })'\n return result\n}\n","/*\n * Copyright (c) 2023-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport { ParserUtils } from '../ParserUtils'\nimport { Endpoint, OpenApiSpec } from '../Swagger'\nimport { templateApiMethod } from '../templates/template-api-method'\nimport { templateMethod } from '../templates/template-method'\nimport { templateQueryMethod } from '../templates/template-query-method'\nimport { templateSdkSnippet } from '../templates/template-sdk-snippet'\nimport { extractDescription, getPermission, getPermissionType } from './utils'\n\nconst GIT_URL = 'https://github.com/AccelByte/accelbyte-typescript-sdk/blob/main/packages'\n\nexport type Methods = 'get' | 'post' | 'put' | 'delete' | 'patch'\ntype SnippetMap = {\n [K in Methods]?: {\n web?: string\n webGit?: string\n shell?: string\n }\n}\n\ninterface Result {\n // 'Users V4': 'createUserInvite,createUser,patchUserMe,createTestUser,updateUserMeEmail,deleteUserMeMfaDevice,getUsersMeMfaFactor,postUserMeMfaFactor,getUsersMeMfaBackupCode,createUserMeMfaBackupCode,createUserMeMfaEmailCode,createUserMeHeadlesVerify,postUserMeMfaEmailEnable,createUserMeMfaEmailDisable,createUserInvite_ByInvitationId,createUserMeHeadlesCodeVerify,createUserMeMfaAuthenticatorKey,createUserMeMfaBackupCodeEnable,deleteUserMeMfaBackupCodeDisable,getUsersMeMfaBackupCodeDownload,postUserMeMfaAuthenticatorEnable,deleteUserMeMfaAuthenticatorDisable,'\n tagToSdkFunctionNamesRecord: Record<string, string>\n // 'Users V4': '\\n' +\n // ' \\n' +\n // ' /**\\n' +\n // ' * This endpoint is used to invite a game studio admin user with new namespace in multi tenant mode. It will return error if the service multi tenant mode is set to false. Request body details: - emailAddress: email address of the user to be invited - namespace: new namespace of the user to be created - namespaceDisplayName: display name of the new namespace The invited users will also be assigned with &#34;User&#34; role by default. \\n' +\n // ' */\\n' +\n // ' async function createUserInvite(data: PublicInviteUserRequestV4): Promise<InviteUserResponseV3> {\\n' +\n // ' const $ = new UsersV4$(Network.create(requestConfig), namespace, useSchemaValidation)\\n' +\n // ' const resp = await $.createUserInvite(data,)\\n' +\n // ' if (resp.error) throw resp.error\\n' +\n // ' return resp.response.data\\n' +\n // ' }\\n' +\n // ' \\n' +\n // ' \\n' +\n // ' /**\\n' +\n tagToSdkClientRecord: Record<string, string>\n // 'Users V4': '\\n' +\n // ' /**\\n' +\n // ' * This endpoint is used to invite a game studio admin user with new namespace in multi tenant mode. It will return error if the service multi tenant mode is set to false. Request body details: - emailAddress: email address of the user to be invited - namespace: new namespace of the user to be created - namespaceDisplayName: display name of the new namespace The invited users will also be assigned with &#34;User&#34; role by default. \\n' +\n // ' */\\n' +\n // ' createUserInvite(data: PublicInviteUserRequestV4): Promise<IResponse<InviteUserResponseV3>> {\\n' +\n // ' const params = {} as SDKRequestConfig\\n' +\n // \" const url = '/iam/v4/public/users/invite' \\n\" +\n // ' const resultPromise = this.axiosInstance.post(url, data, {params})\\n' +\n // '\\n' +\n // \" return Validate.responseType(() => resultPromise, InviteUserResponseV3, 'InviteUserResponseV3')\\n\" +\n // ' }\\n' +\n // ' \\n' +\n // ' /**\\n'\n tagToEndpointClassesRecord: Record<string, string>\n // For example:\n // 'Users V4': [\n // \"import { UpgradeHeadlessAccountWithVerificationCodeRequestV4 } from '../definitions/UpgradeHeadlessAccountWithVerificationCodeRequestV4.js'\",\n // \"import { UserCreateFromInvitationRequestV4 } from '../definitions/UserCreateFromInvitationRequestV4.js'\",\n // \"import { UpgradeHeadlessAccountRequestV4 } from '../definitions/UpgradeHeadlessAccountRequestV4.js'\",\n // \"import { EmailUpdateRequestV4 } from '../definitions/EmailUpdateRequestV4.js'\",\n // \"import { CreateTestUserRequestV4 } from '../definitions/CreateTestUserRequestV4.js'\",\n // \"import { UserUpdateRequestV3 } from '../definitions/UserUpdateRequestV3.js'\",\n // \"import { CreateUserRequestV4 } from '../definitions/CreateUserRequestV4.js'\",\n // \"import { PublicInviteUserRequestV4 } from '../definitions/PublicInviteUserRequestV4.js'\"\n // ]\n tagToSdkImportsRecord: Record<string, string[]>\n // UsersV4: {\n // InviteUserResponseV3: \"import { InviteUserResponseV3 } from '../definitions/InviteUserResponseV3.js'\",\n // CreateUserResponseV4: \"import { CreateUserResponseV4 } from '../definitions/CreateUserResponseV4.js'\",\n // UserResponseV3: \"import { UserResponseV3 } from '../definitions/UserResponseV3.js'\",\n // EnabledFactorsResponseV4: \"import { EnabledFactorsResponseV4 } from '../definitions/EnabledFactorsResponseV4.js'\",\n // BackupCodesResponseV4: \"import { BackupCodesResponseV4 } from '../definitions/BackupCodesResponseV4.js'\",\n // UserResponseV4: \"import { UserResponseV4 } from '../definitions/UserResponseV4.js'\",\n // AuthenticatorKeyResponseV4: \"import { AuthenticatorKeyResponseV4 } from '../definitions/AuthenticatorKeyResponseV4.js'\"\n // }\n tagToClassImportsRecord: Record<string, Record<string, string>>\n // [ 'PublicThirdPartyPlatformInfoArray', 'GetUserMappingV3Array' ].\n arrayDefinitions: string[]\n // {\n // '/some/path': {\n // web: '',\n // shell: '',\n // webGit: ''\n // }\n // }\n snippetMap: Record<string, SnippetMap>\n tagToEndpointQueryRecord: Record<string, string>\n /**\n * \"Users V4\": {\n * \"createUserInvite\": \"/** description here\"\n * }\n */\n tagToSdkFunctionDescription: Record<string, Record<string, string>>\n}\n\nexport class SwaggerReaderHelpers {\n private static getServicePrefix = (servicePaths: string[]) => servicePaths[servicePaths.length - 1].split('/')[1]\n\n static parseAllEndpoints = async ({\n api,\n sdkName,\n serviceName\n }: {\n api: OpenApiSpec\n sdkName: string\n serviceName: string\n }): Promise<{\n admin: Result\n public: Result\n }> => {\n const result: {\n admin: Result\n public: Result\n } = {\n admin: {\n arrayDefinitions: [],\n snippetMap: {},\n tagToClassImportsRecord: {},\n tagToEndpointClassesRecord: {},\n tagToSdkClientRecord: {},\n tagToSdkFunctionNamesRecord: {},\n tagToSdkImportsRecord: {},\n tagToEndpointQueryRecord: {},\n tagToSdkFunctionDescription: {}\n },\n public: {\n arrayDefinitions: [],\n snippetMap: {},\n tagToClassImportsRecord: {},\n tagToEndpointClassesRecord: {},\n tagToSdkClientRecord: {},\n tagToSdkFunctionNamesRecord: {},\n tagToSdkImportsRecord: {},\n tagToEndpointQueryRecord: {},\n tagToSdkFunctionDescription: {}\n }\n }\n const sortedPathsByLength = new Map(\n Object.entries(api.paths).sort((a, b) => {\n if (a[0].length === b[0].length) {\n return a[0].localeCompare(b[0])\n } else {\n return a[0].length - b[0].length\n }\n })\n )\n const sortedKeys = Array.from(sortedPathsByLength.keys())\n const servicePrefix = SwaggerReaderHelpers.getServicePrefix(sortedKeys)\n // This is to detect multiple naming conflicts, so we can append it with something else.\n const tagToClassMethodsMap: {\n admin: Record<string, Record<string, string>>\n public: Record<string, Record<string, string>>\n } = {\n admin: {},\n public: {}\n }\n\n for (const [path, operation] of sortedPathsByLength) {\n if (path.indexOf('/healthz') >= 0) {\n continue\n }\n\n const isAdminEndpoint = path.indexOf('/admin/') > -1\n\n const picked = isAdminEndpoint ? result.admin : result.public\n const {\n arrayDefinitions,\n snippetMap,\n tagToClassImportsRecord,\n tagToEndpointClassesRecord,\n tagToSdkClientRecord,\n tagToSdkFunctionNamesRecord,\n tagToSdkImportsRecord,\n tagToEndpointQueryRecord,\n tagToSdkFunctionDescription\n } = picked\n\n const tagToClassMethodsMapByType = isAdminEndpoint ? tagToClassMethodsMap.admin : tagToClassMethodsMap.public\n const generatedMethods = {} // { path_get: 'fetchSomething' }\n\n const httpMethods = Object.keys(operation)\n for (const httpMethod of httpMethods) {\n const endpoint = await Endpoint.parseAsync(operation[httpMethod]).catch(error => {\n console.error(JSON.stringify({ path, httpMethod }, null, 2))\n throw error\n })\n if (!endpoint.tags) continue\n\n const [tag] = endpoint.tags\n const pathWithBase = `${api.basePath ?? ''}${path}`\n const permissionType = getPermissionType(getPermission(endpoint))\n\n tagToClassMethodsMapByType[tag] = tagToClassMethodsMapByType[tag] ? tagToClassMethodsMapByType[tag] : {}\n const isForm = endpoint.consumes && endpoint.consumes[0] === 'application/x-www-form-urlencoded'\n const classMethod = ParserUtils.generateNaturalLangMethod({\n servicePrefix,\n path,\n httpMethod,\n isForm,\n existingMethods: tagToClassMethodsMapByType[tag],\n permissionType\n })\n\n tagToClassMethodsMapByType[tag][classMethod] = `${path} ${httpMethod}`\n generatedMethods[`${path} ${httpMethod}`] = `${classMethod}`\n\n if (!snippetMap[pathWithBase]) {\n // Initialize, if undefined.\n snippetMap[pathWithBase] = {}\n }\n\n const description = endpoint.description?.replace(/\\s+/g, ' ') || ''\n\n const responseClasses = ParserUtils.get2xxResponses(endpoint.responses)\n const responseClass = responseClasses.length > 1 ? null : responseClasses?.[0]\n const { className, classGenName } = ParserUtils.generateClassName(tag, isAdminEndpoint)\n tagToClassImportsRecord[className] = tagToClassImportsRecord[className] ? tagToClassImportsRecord[className] : {}\n if (responseClass) {\n tagToClassImportsRecord[className][responseClass] =\n `import { ${responseClass} } from '../../generated-definitions/${responseClass}.js'`\n }\n if (responseClass && responseClass.endsWith('Array')) {\n arrayDefinitions.push(responseClass)\n }\n\n const queryParams = ParserUtils.filterQueryParameters(endpoint.parameters)\n const isFormUrlEncoded = ParserUtils.isFormUrlEncoded(httpMethod, endpoint.consumes)\n const pathParams = ParserUtils.filterPathParams(endpoint.parameters)\n let bodyParams = ParserUtils.filterBodyParams(endpoint.parameters)\n const deprecated = !!endpoint.deprecated\n\n // Handling requestBody in swagger v3 `templateMethod` expect `bodyParams` to be array, so for now we convert\n // requestBody format to array params\n if (endpoint.requestBody) {\n bodyParams = [\n {\n name: 'body',\n in: 'body',\n schema: endpoint.requestBody.content['application/json']?.schema\n }\n ]\n }\n\n // -- classes\n const { methodImpl, methodParams, methodParamsNoTypes, importStatements } = templateMethod({\n classMethod,\n description,\n httpMethod,\n path: pathWithBase,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded,\n responseClasses,\n deprecated\n })\n\n tagToEndpointClassesRecord[tag] = (tagToEndpointClassesRecord[tag] || '') + methodImpl\n const { apiGenName } = ParserUtils.generateApiName(tag, isAdminEndpoint)\n const queryMethodImpl = templateQueryMethod({\n classMethod,\n httpMethod,\n path: pathWithBase,\n pathParams,\n responseClasses,\n methodParams,\n apiGenName,\n deprecated,\n description\n })\n tagToEndpointQueryRecord[tag] = (tagToEndpointQueryRecord[tag] || '') + queryMethodImpl\n\n const fnDescription = extractDescription(description, { isDeprecated: deprecated, responseClasses })\n const tagFnDescriptions = tagToSdkFunctionDescription[tag]\n tagToSdkFunctionDescription[tag] = {\n ...tagFnDescriptions,\n [classMethod]: fnDescription\n }\n\n // -- apis\n const { generatedMethodString, snippetApiArgs, snippetMethod, snippetShell } = templateApiMethod({\n classMethod,\n httpMethod,\n path: pathWithBase,\n pathParams,\n bodyParams,\n responseClasses,\n classGenName,\n methodParams,\n methodParamsNoTypes,\n xSecurity: endpoint['x-security']\n })\n tagToSdkClientRecord[tag] = (tagToSdkClientRecord[tag] || '') + generatedMethodString\n tagToSdkFunctionNamesRecord[tag] = (tagToSdkFunctionNamesRecord[tag] || '') + classMethod + ','\n\n // -- dependencies\n tagToSdkImportsRecord[tag] = tagToSdkImportsRecord[tag]\n ? [...new Set([...importStatements, ...tagToSdkImportsRecord[tag]])]\n : [...new Set(importStatements)]\n\n const serviceNameTitle = ParserUtils.convertDashesToTitleCase(serviceName)\n const resultSnippet = templateSdkSnippet({\n serviceNameTitle,\n apiName: apiGenName,\n snippetMethod,\n snippetApiArgs\n })\n\n // -- snippets\n const currentSnippetMap: SnippetMap[Methods] = {}\n snippetMap[pathWithBase][httpMethod as Methods] = currentSnippetMap\n currentSnippetMap.web = resultSnippet\n const generatedDirName = isAdminEndpoint ? 'generated-admin' : 'generated-public'\n currentSnippetMap.webGit = GIT_URL + `/sdk-${sdkName}/src/${generatedDirName}/${apiGenName}.ts`\n // Put this last to preserve the previous order.\n currentSnippetMap.shell = snippetShell\n }\n }\n\n for (const key in result) {\n // De-duplicate.\n result[key as keyof typeof result].arrayDefinitions = Array.from(new Set(result[key as keyof typeof result].arrayDefinitions))\n }\n\n return result\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nexport const templateApiIndex = (serviceNameTitle: string, apiList: string[]): string => {\n let imports = ''\n let returnStatement = ''\n for (const cl of apiList) {\n // We have to exclude AdminApi as it was the title of the section\n // in swagger, but it has public/admin version of the endpoint too\n const dir = cl.toLowerCase().includes('admin') && cl !== 'AdminApi' ? 'generated-admin' : 'generated-public'\n imports += `\\nimport { ${cl} } from './${dir}/${cl}.js'`\n returnStatement += `\\n${cl}, `\n }\n\n return `/**\n * AUTO GENERATED\n */\n${imports}\nimport { author, name, version } from '../package.json'\n\nconsole.log(\\`\\${name}@\\${version}\\`)\n\nconst apis = {\n${returnStatement}\n version: () => console.log({\n version,\n name,\n author\n })\n}\n\nexport const ${serviceNameTitle} = apis\n `\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { ParserUtils } from '../ParserUtils'\nimport { Definition } from '../Swagger'\n\n// The expected output that we return from most of the functions below.\n// Normally, we will mostly use `schemaString`. In some unique cases\n// where there are recursive types, we cannot infer type. Hence, we need\n// to store the TypeScript syntax so we can write them manually.\ninterface ResultType {\n schemaString: string\n typeString: string\n}\n\nexport class TemplateZod {\n duplicates: Map<string, string>\n duplicateFound = false\n //\n private importClasses = new Set()\n\n // --\n render = (fileName: string, definition: Definition, duplicates: Map<string, string>) => {\n this.duplicates = duplicates\n const content = this.parseToZodSchema(definition, definition.required || [])\n\n // Prevent self-importing and handle recursive types.\n const containsRecursiveType = this.importClasses.has(fileName)\n if (containsRecursiveType) {\n this.importClasses.delete(fileName)\n }\n\n let imports = ''\n for (const cl of Array.from(this.importClasses).sort()) {\n imports += `import { ${cl} } from './${cl}.js'\\n`\n }\n\n // Modify export variable string, based on existence of recursive types.\n // Reference: https://github.com/colinhacks/zod#recursive-types.\n let exportedVariableString: string\n let exportedTypeString: string\n\n if (containsRecursiveType) {\n // If it contains recursive type, then we need to modify the exported variable in a way,\n // so that there are no TypeScript errors.\n exportedVariableString = `\nexport const ${fileName}: z.ZodType<${fileName}> = z.lazy(() =>\n ${content.schemaString}\n )\n `\n exportedTypeString = `\nexport interface ${fileName} {\n ${content.typeString}\n}\n`\n } else {\n // Export normally by writing the `z.ZodObject` and type inferring with `z.TypeOf`.\n exportedVariableString = `export const ${fileName} = ${content.schemaString}`\n exportedTypeString = `export interface ${fileName} extends z.TypeOf<typeof ${fileName}> {}`\n }\n\n const template = `import { z } from 'zod'\n${imports}\n\n${exportedVariableString}\n\n${exportedTypeString}\n `\n return { buffer: template, duplicateFound: this.duplicateFound }\n }\n\n // --\n parseToZodSchema = (definition, requiredAttrs): ResultType => {\n if (definition.additionalProperties) {\n return this.parseToZodAttribute('', definition, [])\n }\n\n let properties: [string, any]\n if (definition.properties) {\n properties = Object.entries(definition.properties) as [string, any]\n } else if (definition.items?.properties) {\n properties = Object.entries(definition.items.properties) as [string, any]\n } else {\n return {\n schemaString: 'z.any()',\n typeString: 'any'\n }\n }\n\n const schemaFields: string[] = []\n const typeFields: string[] = []\n\n for (const property of properties) {\n const [name, definition] = property\n const result = this.parseToZodAttribute(name, definition, requiredAttrs)\n\n schemaFields.push(result.schemaString)\n typeFields.push(result.typeString)\n }\n\n if (definition?.type === 'array') {\n return {\n schemaString: `z.array(z.object({${schemaFields.join(',')}}))`,\n typeString: typeFields.join(';')\n }\n }\n\n return {\n schemaString: `z.object({${schemaFields.join(',')}})`,\n typeString: typeFields.join(';')\n }\n }\n\n // --\n parseToZodAttribute = (name, definition, requiredAttrs): ResultType => {\n // Required field syntax.\n // Empty name check is required for fields with type records.\n const isRequired = requiredAttrs.includes(name) || name === ''\n const schemaRequired = isRequired ? '' : '.nullish()'\n const typeRequired = isRequired ? '' : '?'\n const typeNullishability = isRequired ? '' : ' | null | undefined'\n // Field name syntax.\n const schemaAttribute = name ? `'${name}':` : ''\n const typeAttribute = name ? `'${name}'${typeRequired}:` : ''\n\n const type = definition?.type\n\n if (definition.properties) {\n const result = this.parseToZodSchema(definition, requiredAttrs)\n return {\n schemaString: `${schemaAttribute} ${result.schemaString}${schemaRequired}`,\n typeString: `${typeAttribute} ${result.typeString}${typeNullishability}`\n }\n } else if (type) {\n if (type === 'object' && definition.additionalProperties) {\n const zodAttribute = this.parseToZodAttribute('', definition.additionalProperties, [''])\n return {\n schemaString: `${schemaAttribute} z.record(${zodAttribute.schemaString})${schemaRequired}`,\n typeString: `${typeAttribute} Record<string, ${zodAttribute.typeString}>${typeNullishability}`\n }\n }\n\n if (type === 'object' && !definition.additionalProperties && !name) {\n return {\n schemaString: `z.any()`,\n typeString: 'any'\n }\n }\n\n if (type === 'object' && !definition.additionalProperties) {\n return {\n schemaString: `${schemaAttribute} z.record(z.any())${schemaRequired}`,\n typeString: `${typeAttribute} Record<string, any>${typeNullishability}`\n }\n }\n\n if (type === 'integer' || type === 'number') {\n const effectiveType = getZodNumberType(type)\n return {\n schemaString: `${schemaAttribute} z.${effectiveType.schemaString}()${schemaRequired}`,\n typeString: `${typeAttribute} ${effectiveType.typeString}${typeNullishability}`\n }\n }\n\n if (type === 'array') {\n const items = definition.items\n const ref = items?.$ref\n let model: ResultType\n if (ref) {\n const refType = ParserUtils.parseRefType(ref)\n this.importClasses.add(refType)\n\n model = {\n schemaString: refType,\n typeString: refType\n }\n } else if (items) {\n if (items.type === 'array') {\n const ref = items.items?.$ref\n if (ref) {\n const refType = ParserUtils.parseRefType(ref)\n this.importClasses.add(refType)\n\n model = {\n schemaString: refType,\n typeString: refType\n }\n } else if (items.items) {\n model = this.parseEnumItems(items.items)\n }\n return {\n schemaString: `${schemaAttribute} z.array(z.array(${model.schemaString}))${schemaRequired}`,\n typeString: `${typeAttribute} ${model.typeString}[]${typeNullishability}`\n }\n } else {\n model = this.parseEnumItems(items)\n }\n } else {\n return {\n schemaString: `${schemaAttribute} z.array(z.any())${schemaRequired}`,\n typeString: `${typeAttribute} any[]${typeNullishability}`\n }\n }\n return {\n schemaString: `${schemaAttribute} z.array(${model.schemaString})${schemaRequired}`,\n typeString: `${typeAttribute} ${model.typeString}[]${typeNullishability}`\n }\n }\n\n if (type !== 'object') {\n const result = extractEnumObject(type, isRequired, definition.enum)\n return {\n schemaString: `${schemaAttribute} ${result.schemaString}`,\n typeString: `${typeAttribute} ${result.typeString}`\n }\n }\n }\n\n const ref = definition.$ref\n let model = `z.record(z.any())`\n\n if (ref) {\n model = ParserUtils.parseRefType(ref)\n\n const fullModelName = ref.replace('#/definitions/', '')\n this.duplicateFound = this.duplicates.has(fullModelName)\n if (this.duplicateFound) {\n model = this.duplicates.get(fullModelName)\n }\n this.importClasses.add(model)\n model = `${model}`\n }\n\n return {\n schemaString: `${schemaAttribute} ${model}${schemaRequired}`,\n typeString: `${typeAttribute} ${model}${typeNullishability}`\n }\n }\n\n parseEnumItems = (items): ResultType => {\n if (items.enum) {\n const enumStr = items.enum.map(e => {\n return `\"${e}\"`\n })\n return {\n schemaString: `z.enum([${enumStr}])`,\n typeString: `(${enumStr.join(' | ')})`\n }\n }\n\n if (items.type === 'object') {\n return this.parseToZodSchema(items, items.required)\n }\n\n let effectiveType: ResultType\n if (items.type === 'integer' || items.type === 'number') {\n effectiveType = getZodNumberType(items.type)\n } else {\n effectiveType = { typeString: items.type, schemaString: items.type }\n }\n\n return {\n schemaString: `z.${effectiveType.schemaString}()`,\n typeString: effectiveType.typeString\n }\n }\n}\n\nexport class TemplateZodArray {\n //\n render = name => {\n const cls = name.replace('Array', '')\n const template = `import { z } from 'zod'\nimport { ${cls} } from './${cls}.js'\n \nexport const ${name} = z.array(${cls})\n\nexport interface ${name} extends z.TypeOf<typeof ${name}> {}\n `\n return template\n }\n}\n\nconst getZodNumberType = (type: string) => {\n // In Swagger, integer and number are different types.\n // As such, we need to map them separately.\n // Example how to use:\n //\n // if (type === 'integer' || type === 'number') return getZodNumberType(type);\n //\n // Reference 1: https://swagger.io/docs/specification/data-models/data-types/.\n // Reference 2: https://github.com/colinhacks/zod#numbers.\n if (type === 'integer') {\n return {\n schemaString: 'number().int',\n typeString: 'number'\n }\n }\n\n return {\n schemaString: type,\n typeString: type\n }\n}\n\nconst extractEnumObject = (type: string, isRequired: boolean, enumArr?: string[]): ResultType => {\n const schemaRequired = isRequired ? '' : '.nullish()'\n const typeNullishability = isRequired ? '' : ' | null | undefined'\n if (enumArr) {\n const enumStr = enumArr.map(e => {\n return `\"${e}\"`\n })\n return {\n schemaString: `z.enum([${enumStr}])${schemaRequired}`,\n typeString: `(${enumStr.join(' | ')}${typeNullishability})`\n }\n }\n return {\n schemaString: `z.${type}()${schemaRequired}`,\n typeString: `${type}${typeNullishability}`\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport * as https from 'https'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { CliParser } from './CliParser'\n\n/**\n * This file iterates over intended API configs and downloads the swagger files to target location from --swaggersOutput argument\n *\n * e.g\n * /packages\n * /od-config\n * /codegen\n * /swaggers\n * serviceName.json --> example \"iam.json\"\n */\nexport class SwaggerDownloader {\n static getDestFile = (targetFileName: string) => {\n const destPath = CliParser.getResolvedSwaggersOutputPath()\n const destFile = path.join(destPath, targetFileName)\n if (fs.existsSync(destFile)) return destFile\n if (!fs.existsSync(destPath)) fs.mkdirSync(destPath)\n fs.writeFileSync(destFile, '')\n return destFile\n }\n\n // session-api.json contains illegal URL encoded character that breaks the codegen\n // e.g. \"$ref\": \"#/definitions/map%5Bstring%5Dinterface%20%7B%7D\"\n static postSanitizeDownloadedFile = filePath => {\n const searchStr = ['%5B', '%5D', '%20', '%7B', '%7D'] // url encoded\n fs.readFile(filePath, 'utf8', (err, data) => {\n if (err) throw err\n // Replace all occurrences of the search string with the replace string\n let result = data\n searchStr.forEach(s => {\n result = result.replace(new RegExp(s, 'g'), ' ')\n })\n // Write the updated contents to the file\n fs.writeFile(filePath, result, 'utf8', err => {\n if (err) throw err\n console.log('File updated successfully.')\n })\n })\n }\n\n static downloadFile = async (targetFileName: string, url: string) => {\n const destFile = SwaggerDownloader.getDestFile(targetFileName)\n let data = ''\n\n return new Promise(resolve => {\n const request = https.get(url, function (response) {\n response.on('data', chunk => {\n data += chunk\n })\n response.on('end', () => {\n if (response.statusCode !== 200) {\n console.log(`SwaggerDownload error with status code: ${response.statusCode}`)\n } else {\n fs.writeFileSync(destFile, JSON.stringify(JSON.parse(data), null, 2), 'utf-8')\n SwaggerDownloader.postSanitizeDownloadedFile(destFile)\n console.log(`SwaggerDownload ${url} completed with status code: ${response.statusCode}`)\n }\n\n resolve(undefined)\n })\n })\n request.on('error', (err: Error) => {\n console.log(`SwaggerDownloader failed for \"${targetFileName}\" and \"${url}\"`, err)\n })\n })\n }\n\n static main = async () => {\n const swaggers = CliParser.getConfigFile()\n for (const ref in swaggers) {\n const targetFileName = swaggers[ref][2]\n const url = swaggers[ref][3]\n await SwaggerDownloader.downloadFile(targetFileName, url)\n }\n }\n}\n"],"mappings":"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","names":["import_path","yargs","fs","import_fs","import_path","import_fs","import_path","import_fs","_","type","makeNewImportVarMap","getImportableVarMap","getImportableVarMap","makeNewImportVarMap","generateImports","path","path","_","defaultValue","bodyParams","bodyParam","fs","import_zod","Operation","path","path","path","path","definition","ref","model","SwaggerParser","path","api","fs","fs","path","err","resolve","path","yargs"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/CliParser.ts","../src/CodeGenerator.ts","../src/ParserUtils.ts","../src/helpers/utils.ts","../src/templates/template-class.ts","../src/templates/template-api-class.ts","../src/ParserQueryUtils.ts","../src/templates/template-query.ts","../src/Swagger.ts","../src/templates/template-api-method.ts","../src/templates/template-method.ts","../src/templates/template-query-method.ts","../src/templates/template-sdk-snippet.ts","../src/helpers/SwaggerReaderHelpers.ts","../src/templates/template-api-index.ts","../src/templates/template-zod.ts","../src/SwaggerDownloader.ts","../src/WebsocketGenerator.ts","../src/templates/template-ws-class.ts","../src/templates/template-ws-defintions.ts"],"sourcesContent":["/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport path from 'path'\nimport yargs from 'yargs'\nimport { CliOption, CliParser } from './CliParser'\nimport { CodeGenerator } from './CodeGenerator'\nimport { ParserUtils } from './ParserUtils'\nimport { SwaggerDownloader } from './SwaggerDownloader'\nimport { WebsocketGenerator } from './WebsocketGenerator'\n\nconst generateSdk = async () => {\n const arrayOfSets = await Promise.all(CliParser.getConfigFile().map(config => CodeGenerator.main(config)))\n\n if (CliParser.isGenerateSnippetOnly()) {\n return\n }\n\n if (CliParser.isGenerateWebSocket()) {\n WebsocketGenerator.main()\n }\n\n const indexImportsSet = new Set<string>()\n const queryImportsSet = new Set<string>()\n const filenamesSet = new Set<string>()\n\n for (const set of arrayOfSets) {\n set.indexImports.forEach(value => {\n const fileName = path.basename(value)\n\n if (!filenamesSet.has(fileName)) {\n indexImportsSet.add(value)\n filenamesSet.add(fileName)\n }\n })\n set.queryImports.forEach(value => {\n const fileName = path.basename(value)\n\n if (!filenamesSet.has(fileName)) {\n queryImportsSet.add(value)\n }\n })\n }\n\n const indexImportsArray = Array.from(indexImportsSet).sort()\n const queryImportsArray = Array.from(queryImportsSet).sort()\n const filesToImport = indexImportsArray.map(fileToImport => {\n return `export * from '${fileToImport.replace('\\\\', '/')}.js'`\n })\n const queryFilesToImport = queryImportsArray.map(fileToImport => {\n return `export * from '${fileToImport.replace('\\\\', '/')}.js'`\n })\n ParserUtils.writeAllImportsFile(CliParser.getOutputPath(), filesToImport.join('\\n'))\n ParserUtils.writeAllQueryImportsFile(CliParser.getOutputPath(), queryFilesToImport.join('\\n'))\n}\n\n// eslint-disable-next-line no-unused-expressions\nyargs\n .command('download-swaggers', 'Download swaggers JSON files', (yargs: CliOption) => {\n CliParser.createInstance(yargs)\n SwaggerDownloader.main()\n })\n .command('generate-code', 'Generate code based on downloaded swagger files', async (yargs: CliOption) => {\n // validate options\n yargs.check(({ output, snippetOnly, snippetOutput }) => {\n if (!output?.trim() && !snippetOnly) {\n throw new Error('output is required for generate-code')\n }\n\n if (snippetOnly && !snippetOutput) {\n throw new Error('snippetOutput is required when generating snippets.')\n }\n\n return true\n })\n\n CliParser.createInstance(yargs)\n\n await generateSdk()\n })\n .option('config', {\n description: 'Path to the config file with backend service URLs.',\n type: 'string',\n demandOption: true\n })\n .option('swaggersOutput', {\n description: 'Directory to save the downloaded Swagger JSON files.',\n type: 'string',\n demandOption: true\n })\n .option('output', {\n description: 'Directory for the generated code. Required when using the generate-code command.',\n type: 'string'\n })\n .option('skipReactQuery', {\n description: 'Disable React Query code generation.',\n type: 'boolean'\n })\n .option('snippetOnly', {\n description: 'Generate only code snippets.',\n type: 'boolean'\n })\n .option('snippetOutput', {\n description: 'Directory for the generated code snippets. Required when generating snippets.',\n type: 'string'\n })\n .option('webSocketSchema', {\n description: 'Path to the WebSocket schema file (schema.json). If provided, WebSocket methods will be generated based on the schema.',\n type: 'string'\n })\n .demandCommand(1)\n .help().argv\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport fs from 'fs'\nimport * as path from 'path'\nimport { Arguments, Argv } from 'yargs'\nimport { z } from 'zod'\n\nconst SwaggersConfig = z.array(z.array(z.string()))\ntype SwaggersConfig = z.TypeOf<typeof SwaggersConfig>\n\ntype CLIOptions = {\n config: string\n swaggersOutput: string\n output: string\n snippetOnly?: boolean\n snippetOutput?: string\n skipReactQuery?: boolean\n webSocketSchema?: string\n}\n\nexport interface CliOption extends Argv<CLIOptions> {}\n\nexport class CliParser {\n private static _instance: CliParser\n public argv: CLIOptions\n\n constructor(yargs: CliOption) {\n this.argv = yargs.parse() as Arguments<CLIOptions>\n }\n\n public static createInstance = (yargs: CliOption) => {\n CliParser._instance = new CliParser(yargs)\n return CliParser._instance\n }\n\n private static instance = (yargs?: CliOption) => {\n if (!CliParser._instance && yargs) {\n return CliParser.createInstance(yargs)\n }\n return CliParser._instance\n }\n\n public static getConfigPath = () => {\n return CliParser.instance().argv.config\n }\n\n public static getConfigFile = (): SwaggersConfig => {\n const configPath = CliParser.getConfigPath()\n if (!configPath) throw new Error('Missing config file')\n const config = JSON.parse(fs.readFileSync(configPath, 'utf8'))\n if (!SwaggersConfig.safeParse(config).success) {\n throw new Error('Wrong config file format')\n }\n return config\n }\n\n public static getOutputPath = () => {\n return CliParser.instance().argv.output\n }\n\n public static getSwaggersOutputPath = () => {\n return CliParser.instance().argv.swaggersOutput\n }\n\n public static getResolvedSwaggersOutputPath = () => {\n return path.resolve(CliParser.getSwaggersOutputPath())\n }\n\n public static getSnippetOutputPath = () => {\n return CliParser.instance().argv.snippetOutput\n }\n\n public static skipReactQuery = () => {\n return CliParser.instance().argv.skipReactQuery\n }\n\n public static isGenerateSnippetOnly = () => {\n return CliParser.instance().argv.snippetOnly\n }\n\n public static getWebSocketSchemaPath = () => {\n return CliParser.instance().argv.webSocketSchema\n }\n\n public static isGenerateWebSocket = () => {\n return !!CliParser.getWebSocketSchemaPath()\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport SwaggerParser from '@apidevtools/swagger-parser'\nimport fs from 'fs'\nimport path from 'path'\nimport { CliParser } from './CliParser'\nimport { SwaggerReaderHelpers } from './helpers/SwaggerReaderHelpers'\nimport { ParserUtils } from './ParserUtils'\nimport { templateApiIndex } from './templates/template-api-index'\nimport { TemplateZod, TemplateZodArray } from './templates/template-zod'\n\n// Patching is done in https://bitbucket.org/accelbyte/justice-codegen-sdk-spec\n\nexport class CodeGenerator {\n static srcFolder = () => CliParser.getOutputPath()\n\n static getGeneratedFolder = (isAdmin: boolean) =>\n isAdmin ? `${CodeGenerator.srcFolder()}/generated-admin` : `${CodeGenerator.srcFolder()}/generated-public`\n\n static getGeneratedSnippetsFolder = () => `${CliParser.getSnippetOutputPath()}/generated-snippets`\n\n static prepareDirs = (DIST_DEFINITION_DIR, DIST_DIR, DIST_DIR_ENDPOINTS, DIST_DIR_QUERIES) => {\n ParserUtils.mkdirIfNotExist(DIST_DEFINITION_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DIR(true))\n ParserUtils.mkdirIfNotExist(DIST_DIR(false))\n ParserUtils.mkdirIfNotExist(DIST_DIR_ENDPOINTS(true))\n ParserUtils.mkdirIfNotExist(DIST_DIR_ENDPOINTS(false))\n ParserUtils.mkdirIfNotExist(DIST_DIR_QUERIES(true))\n }\n\n static main = async (nameArray: string[]): Promise<{ indexImports: Set<string>; queryImports: Set<string> }> => {\n const serviceName = nameArray[0]\n const sdkName = nameArray[1]\n const swaggerFile = nameArray[2]\n const parser = new SwaggerParser()\n const swaggerFilePath = `${CliParser.getSwaggersOutputPath()}/${swaggerFile}`\n const api = await parser.parse(swaggerFilePath)\n const serviceNameTitle = ParserUtils.convertDashesToTitleCase(serviceName)\n\n const indexImportsSet: Set<string> = new Set()\n const queryImportsSet = new Set<string>()\n const apiInfo = { ...api.info, 'x-version': api['x-version']?.version }\n console.log('----------\\nGenerating API:', { title: apiInfo.title, version: apiInfo.version })\n \n if(!CliParser.isGenerateSnippetOnly()) {\n ParserUtils.writeXVersion(CodeGenerator.srcFolder(), api['x-version'], api.info)\n }\n\n const parsedInformation = await SwaggerReaderHelpers.parseAllEndpoints({ api, sdkName, serviceName })\n\n if (CliParser.getSnippetOutputPath()) {\n try {\n ParserUtils.mkdirIfNotExist(CodeGenerator.getGeneratedSnippetsFolder())\n ParserUtils.writeSnippetFile(\n CodeGenerator.getGeneratedSnippetsFolder(),\n api.info.title,\n JSON.stringify(\n {\n ...parsedInformation.public.snippetMap,\n ...parsedInformation.admin.snippetMap\n },\n null,\n 2\n )\n )\n } catch (err) {\n console.error('Error generating snippets', err)\n }\n }\n\n if (CliParser.isGenerateSnippetOnly()) {\n console.log('\\nSuccessfully generate SDK snippets only\\n----------\\n\\n')\n return\n }\n\n const DIST_DIR = (isAdmin: boolean) => `${CodeGenerator.getGeneratedFolder(isAdmin)}`\n const DIST_DIR_ENDPOINTS = (isAdmin: boolean) => path.join(DIST_DIR(isAdmin), 'endpoints')\n const DIST_DIR_QUERIES = (isAdmin: boolean) => path.join(DIST_DIR(isAdmin), 'queries')\n const DIST_DEFINITION_DIR = path.join(CodeGenerator.srcFolder(), 'generated-definitions')\n const targetSrcFolder = `${CodeGenerator.srcFolder()}/`\n CodeGenerator.prepareDirs(DIST_DEFINITION_DIR, DIST_DIR, DIST_DIR_ENDPOINTS, DIST_DIR_QUERIES)\n\n const mainApiList = []\n const generatedDefinitions = []\n // ----\n const generatePublicOrAdmin = isAdmin => {\n const parsedInformationByType = isAdmin ? parsedInformation.admin : parsedInformation.public\n const {\n arrayDefinitions,\n tagToClassImportsRecord,\n tagToEndpointClassesRecord,\n tagToSdkClientRecord,\n tagToSdkFunctionNamesRecord,\n tagToSdkImportsRecord,\n tagToEndpointQueryRecord,\n tagToSdkFunctionDescription\n } = parsedInformationByType\n\n // creates Api And Endpoint classes\n const writeApiEndpointFiles = (isAdminEndpoint: boolean) => {\n const apiList = []\n for (const tag in tagToEndpointClassesRecord) {\n const { className, classGenName } = ParserUtils.generateClassName(tag, isAdminEndpoint)\n const classBuffer = tagToEndpointClassesRecord[tag]\n const imports = [...new Set([...tagToSdkImportsRecord[tag], ...Object.values(tagToClassImportsRecord[className])])]\n const apiImports = [...new Set([...tagToSdkImportsRecord[tag], ...Object.values(tagToClassImportsRecord[className])])]\n apiImports.push(`import { ${classGenName} } from './endpoints/${classGenName}.js'`)\n\n ParserUtils.writeClassFile(DIST_DIR_ENDPOINTS(isAdminEndpoint), classGenName, classBuffer, imports)\n const { apiGenName } = ParserUtils.generateApiName(tag, isAdminEndpoint)\n const queryBuffer = tagToEndpointQueryRecord[tag]\n\n // If react query skipped, do not write query files\n const queryFileName =\n !CliParser.skipReactQuery() &&\n ParserUtils.writeQueryFile(\n DIST_DIR_QUERIES(isAdminEndpoint),\n apiGenName,\n queryBuffer,\n apiImports,\n serviceNameTitle,\n tagToSdkFunctionNamesRecord[tag],\n imports,\n sdkName\n )\n\n const apiBuffer = tagToSdkClientRecord[tag]\n\n ParserUtils.writeApiFile(DIST_DIR(isAdminEndpoint), apiGenName, apiBuffer, imports, tagToSdkFunctionDescription[tag])\n apiList.push(apiGenName)\n\n // For endpoint classes, we need to append `$`.\n indexImportsSet.add(\n ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DIR_ENDPOINTS(isAdminEndpoint), `${classGenName}`), targetSrcFolder)\n )\n indexImportsSet.add(\n ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DIR(isAdminEndpoint), `${apiGenName}`), targetSrcFolder)\n )\n\n queryFileName &&\n queryImportsSet.add(\n ParserUtils.getRelativePathToWebSdkSrcFolder(\n path.join(DIST_DIR(isAdminEndpoint), 'queries', `${queryFileName}`),\n targetSrcFolder\n )\n )\n }\n mainApiList.push(...apiList)\n indexImportsSet.add(\n ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(CodeGenerator.srcFolder(), serviceNameTitle), targetSrcFolder)\n )\n } // end of writeApiEndpointFiles\n\n // creates the definition files\n const writeDefinitions = api => {\n const duplicates = new Map<string, string>()\n const definitions = api?.components?.schemas || api.definitions\n for (const ref in definitions) {\n const definition = definitions[ref]\n const fileName = ParserUtils.parseRefType(ref)\n const fileExist = fs.existsSync(path.join(DIST_DEFINITION_DIR, `${fileName}.ts`))\n if (fileExist) {\n const duplicateName = ParserUtils.toCamelCaseWord(ref).replace('.', '').replace('.', '')\n duplicates.set(ref, duplicateName)\n }\n const { buffer } = new TemplateZod().render(fileName, definition, new Map())\n generatedDefinitions.push(fileName)\n ParserUtils.writeDefinitionFile(DIST_DEFINITION_DIR, fileName, buffer)\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DEFINITION_DIR, fileName), targetSrcFolder))\n }\n\n // TODO BROKEN DEFINITION, this pefix dups with Model<Name>.js causing NOT FOUND, commented out\n // rerun, find duplicates and write again the fixed dup name\n // for (const ref in definitions) {\n // const definition = definitions[ref]\n // const fileName = ParserUtils.parseRefType(ref)\n // const { buffer, duplicateFound } = new TemplateZod().render(fileName, definition, duplicates)\n // if (duplicateFound) {\n // ParserUtils.writeDefinitionFile(DIST_DEFINITION_DIR, fileName, buffer)\n // indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DEFINITION_DIR, fileName), targetSrcFolder))\n // }\n // }\n\n for (const arrayClass of arrayDefinitions) {\n const buffer = new TemplateZodArray().render(arrayClass)\n generatedDefinitions.push(arrayClass)\n ParserUtils.writeDefinitionFile(DIST_DEFINITION_DIR, arrayClass, buffer)\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DEFINITION_DIR, arrayClass), targetSrcFolder))\n }\n } // end of writeDefinitions\n\n writeApiEndpointFiles(isAdmin)\n writeDefinitions(api)\n }\n\n generatePublicOrAdmin(true) // create Admin classes\n generatePublicOrAdmin(false) // create Public classes\n\n const isGenerateWebSocket = CliParser.isGenerateWebSocket()\n const apiIndexBuff = templateApiIndex(serviceNameTitle, mainApiList, isGenerateWebSocket)\n ParserUtils.writeApiMainFile(CodeGenerator.srcFolder(), serviceNameTitle, apiIndexBuff)\n\n console.log('\\nCOMPLETED\\n----------\\n\\n')\n return { indexImports: indexImportsSet, queryImports: queryImportsSet }\n } // end of main\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { applyPatch, Operation } from 'fast-json-patch'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport path from 'path'\nimport { PermissionType, removeAdminPrefix } from './helpers/utils'\nimport { Endpoint, EndpointParameters } from './Swagger'\nimport { templateApiClass } from './templates/template-api-class'\nimport { templateClass } from './templates/template-class'\nimport { templateQuery } from './templates/template-query'\n\nconst REMOVED_KEYWORDS = [\n '/admin/',\n '/public/',\n '/v1/',\n '/v2/',\n '/v3/',\n '/v4/',\n '/v5/',\n '/namespace/' /* Note, it's not plural */,\n '/namespaces/',\n '/{namespace}/'\n]\n\nexport class ParserUtils {\n static getVersionSuffixFromPath(path: string) {\n const version2_3_4_etc = path.match(/\\/v([2-9]|[1-9]\\d+)\\/+/)\n const methodSuffix = version2_3_4_etc ? `_v${version2_3_4_etc[1]}` : ''\n return methodSuffix\n }\n\n static replaceAll = (text, search, replace) => {\n return text.split(search).join(replace)\n }\n\n static generateClassName = (tag: string, isAdmin: boolean) => {\n const className = _.upperFirst(_.camelCase(tag))\n const formattedApiName = removeAdminPrefix(className)\n const classGenName = isAdmin ? formattedApiName + 'Admin$' : formattedApiName + '$'\n return { className: formattedApiName, classGenName }\n }\n\n static generateApiName = (tag: string, isAdmin: boolean) => {\n const apiName = _.upperFirst(_.camelCase(tag))\n const formattedApiName = removeAdminPrefix(apiName)\n const apiGenName = isAdmin ? formattedApiName + 'AdminApi' : formattedApiName + 'Api'\n return { apiName, apiGenName }\n }\n\n static parseQueryParamAttributeDefault = (definition: EndpointParameters) => {\n const attrName = definition.name.slice(definition.name.lastIndexOf('.') + 1)\n let defaultValue = definition.default\n\n if (definition.type === 'array' && Array.isArray(definition.default)) {\n const mappedDefaultValue = definition.default.map(defaultValue =>\n typeof defaultValue === 'string' ? `'${defaultValue}'` : defaultValue\n )\n defaultValue = `[${mappedDefaultValue.join(', ')}]`\n }\n\n if (definition.type === 'string') {\n defaultValue = `'${definition.default}'`\n }\n return `${attrName}: ${defaultValue}`\n }\n\n static parseType = (pathParam: EndpointParameters) => {\n if (isSwaggerIntegerType(pathParam.type || pathParam?.schema?.type)) return 'number'\n if (pathParam.type === 'array') {\n if (isSwaggerIntegerType(pathParam.items.type)) return 'number[]'\n return `${pathParam.items.type ?? 'any'}[]`\n }\n if (pathParam?.schema?.type === 'array') {\n if (isSwaggerIntegerType(pathParam.schema.items.type)) return 'number[]'\n return `${pathParam.schema.items.type ?? 'any'}[]`\n }\n if (pathParam?.schema?.type) return pathParam.schema.type\n return pathParam.type\n }\n\n static parseQueryParamsType = (queryParams: EndpointParameters[]) => {\n const result = queryParams.map(queryParam => ParserUtils.parseAttributeType(queryParam)).join(', ')\n return result\n }\n\n static isAnyQueryParamRequired = (queryParams: EndpointParameters[]) => {\n return queryParams.some(queryParam => queryParam.required)\n }\n\n static convertDashesToTitleCase = str => {\n const result = str\n .split('-') // split the string at the hyphen\n .map((word, index) => {\n // capitalize the first letter of each word\n if (index === 0) {\n return word.charAt(0).toUpperCase() + word.slice(1)\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join('') // join the words together without a separator\n return result\n }\n\n static parseQueryParamsDefault = (queryParams: EndpointParameters[]) => {\n const result = queryParams\n .filter(queryParam => !!queryParam.default && !queryParam.required)\n .map(ParserUtils.parseQueryParamAttributeDefault)\n .join(',')\n return result ? `${result},` : ''\n }\n\n static parseBodyParamsImports = (bodyParams: EndpointParameters[]) => {\n return bodyParams.map(bodyParams => ParserUtils.parseRefImport(bodyParams)).filter(Boolean)\n }\n\n static parseImportDir = ($ref: string) => {\n let ref = $ref.replace('.', '/')\n if (ref[ref.length - 1] === '.' || ref[ref.length - 1] === '/') {\n ref = ref.slice(0, -1)\n }\n if (!ref.includes('/')) {\n return ''\n } else {\n return ref.slice(0, ref.lastIndexOf('/')).replace('#', '.')\n }\n }\n\n static parseRefImport = (bodyParam: EndpointParameters) => {\n const $ref = bodyParam?.schema?.$ref || bodyParam?.schema?.items?.$ref\n if (!$ref) {\n return null\n }\n const type = ParserUtils.parseRefType($ref)\n return `import { ${type} } from '../../generated-definitions/${type}.js'`\n }\n\n static parseRefType = ($ref: string) => {\n let ref = $ref.replace('.', '/')\n if (ref[ref.length - 1] === '.' || ref[ref.length - 1] === '/') {\n ref = ref.slice(0, -1)\n }\n const val = ref.slice(ref.lastIndexOf('/') + 1)\n // Converting it to TitleCase breaks schema refs. E.g. UserDataURL schema is converted to UserDataUrl breaking refs\n return _.upperFirst(_.camelCase(val)).replace(/( \\w)/g, group => group.replace(' ', '').toUpperCase())\n }\n\n static parseAttributeType = (definition: EndpointParameters) => {\n const required = definition.required ? '' : '?'\n\n const attrName = definition.name.slice(definition.name.lastIndexOf('.') + 1)\n\n if (definition.enum) {\n const enums = definition.enum.map(enm => (definition.type === 'string' ? `'${enm}'` : enm)).join(' | ')\n return `${attrName}${required}: ${enums}`\n }\n\n if (definition.type && ParserUtils.parseType(definition) === 'number') {\n return `${attrName}${required}: number`\n }\n\n if (definition.type && ParserUtils.parseType(definition) === 'number[]') {\n return `${attrName}${required}: number[]`\n }\n\n if (definition?.schema?.type && ParserUtils.parseType(definition) === 'number') {\n return `${attrName}${required}: number`\n }\n\n if (definition.type && definition.type === 'array') {\n return `${attrName}${required}: ${definition.items.type ?? 'any'}[]`\n }\n\n if (definition?.schema?.type && definition.schema.type === 'array') {\n return `${attrName}${required}: ${definition.schema.items.type ?? 'any'}[]`\n }\n\n if (definition.type && definition.type === 'file') {\n return `${attrName}${required}: File`\n }\n\n if (definition?.schema?.type && definition.schema.type === 'file') {\n return `${attrName}${required}: File`\n }\n\n if (definition.type && definition.type) {\n return `${attrName}${required}: ${definition.type} | null`\n }\n\n if (definition?.schema?.type && definition.schema.type) {\n return `${attrName}${required}: ${definition.schema.type} | null`\n }\n\n return `${attrName}${required}: any`\n }\n\n static parseBodyParamsType = (bodyParams: EndpointParameters[]): string => {\n const [bodyParam] = bodyParams\n\n if (!bodyParam) return null\n\n if (bodyParams.length > 0 && bodyParam?.name !== 'body' && !bodyParam?.schema) {\n let retBodyParams = `{${bodyParams.map(bodyParam => ParserUtils.parseAttributeType(bodyParam)).join(',')}}`\n retBodyParams = retBodyParams.replace('file?: file', 'file?: File') // fixed TS type File\n return retBodyParams\n }\n\n if (bodyParam?.schema?.type === 'array' && !bodyParam?.schema?.items?.$ref) {\n if (isSwaggerIntegerType(bodyParam.schema.items.type)) return 'number[]'\n return `${bodyParam.schema.items.type ?? 'any'}[]`\n }\n\n if (bodyParam?.schema?.type === 'array' && bodyParam?.schema?.items?.$ref) {\n return `${ParserUtils.parseRefType(bodyParam.schema.items.$ref)}[]`\n }\n\n if (bodyParam?.schema?.$ref) {\n return ParserUtils.parseRefType(bodyParam.schema.$ref)\n }\n\n if (bodyParam?.schema?.additionalProperties?.type === 'object') {\n return 'any'\n }\n\n return null\n }\n\n static get2xxResponses(methodEntity: Endpoint['responses']): string[] {\n const keys = Object.keys(methodEntity)\n const responseClasses = []\n const statusCodes = keys.filter(key => String(key).startsWith('2'))\n\n statusCodes.forEach(key => {\n const sch = methodEntity[key].schema\n const schV3 = methodEntity[key].content && methodEntity[key].content['application/json'].schema\n if (sch?.$ref) {\n responseClasses.push(ParserUtils.parseRefType(sch.$ref))\n } else if (sch?.type === 'array' && sch.items?.$ref) {\n responseClasses.push(`${ParserUtils.parseRefType(sch.items.$ref)}Array`) // Adds support for z.array() types\n } else if (schV3?.$ref) {\n responseClasses.push(ParserUtils.parseRefType(schV3.$ref))\n } else {\n // TODO add support for non $ref types. E.g. { type: 'array', items: { type: 'string', enum: [ 'WALLET', 'XSOLLA', .. ] } }\n }\n })\n return responseClasses\n }\n\n static isFormUrlEncoded(httpMethod: string, contentTypes: string[]): boolean {\n if (!contentTypes || contentTypes.length < 1) {\n return false\n }\n if (!['post', 'put', 'patch'].includes(httpMethod)) {\n return false\n }\n return contentTypes.includes('application/x-www-form-urlencoded')\n }\n\n static filterPathParams(parameters?: EndpointParameters[]): EndpointParameters[] {\n if (!parameters) {\n return []\n }\n return parameters.filter(parameter => parameter.in === 'path')\n }\n\n /**\n * This method converts this\n * POST `/gdpr/public/namespaces/{namespace}/users/{userId}/requests/{requestDate}/generate`\n *\n * to this\n * `createGenerateByRequestIdByUserId`\n */\n static generateNaturalLangMethod = ({ servicePrefix, path, httpMethod, isForm, existingMethods, permissionType }) => {\n let path_ = path\n path_ = path_.replace(`/${servicePrefix}/`, '/')\n REMOVED_KEYWORDS.forEach(prefix => {\n path_ = path_.replace(prefix, '/')\n })\n path_ = path_.substring(1) // remove first '/'\n\n // Example GET /xxx/yyy/{id}/items is \"fetchItems\" PLURAL\n // Example GET /xxx/yyy/{id}/items/{itemId} is \"fetchItem\" SINGULAR\n const isPlural = httpMethod === 'get' && !(path.slice(-1) === '}') // last char is '}'\n if (!isPlural) {\n path_ = ParserUtils.replaceAll(path_, 'ies/', 'y/') // parties, countries, policies\n path_ = ParserUtils.replaceAll(path_, 's/', '/')\n if (path_.indexOf('status') < 0) {\n path_ = path_.replace(/ies$/, 'y')\n path_ = path_.replace(/s$/, '')\n } // remove all tail end \"s\" -> /profiles, /users except /status\n } // make it non plural\n\n const arrLastWords = path_.split('}/')\n let lastWords = arrLastWords[arrLastWords.length - 1]\n\n const extractLastWord = lastWords_ => {\n let res = lastWords_\n res = res.split('/{')[0]\n return res\n }\n // convert \"/dlcs/latest/byGameAppId/{appId\" to \"/dlcs/latest/byGameAppId\" by dropping \"{appId\"\n lastWords = extractLastWord(lastWords)\n if (lastWords.indexOf('{') >= 0 && arrLastWords.length > 1) {\n lastWords = arrLastWords[arrLastWords.length - 2]\n lastWords = extractLastWord(lastWords)\n }\n\n const listBeforeLastWords = []\n let foundParam = false\n const listByParams = []\n\n // reverse iterate retrieving last words of the endpoint\n const pathElements = path_.split('/')\n pathElements\n .slice()\n .reverse()\n .forEach(item => {\n if (item.indexOf('}') >= 0) {\n foundParam = true\n let param = item.replace('{', '')\n param = param.replace('}', '')\n param = 'Byword' + _.upperFirst(param) + ''\n listByParams.push(param)\n } else if (!foundParam) {\n if (lastWords.indexOf(item) === -1) {\n listBeforeLastWords.push(item)\n }\n } else {\n foundParam = false\n }\n })\n\n const genPath = _.upperFirst(lastWords) + '/' + listBeforeLastWords.join('/') + listByParams.reverse().join('/')\n let generatedMethod = _.camelCase(mappedMethod(httpMethod, isForm, permissionType) + genPath)\n generatedMethod = ParserUtils.replaceAll(generatedMethod, 'Byword', '_By') // lodash removes the '_'\n const testedGeneratedMethod = generatedMethod + ParserUtils.getVersionSuffixFromPath(path)\n generatedMethod = resolveConflicts({ path, generatedMethod, testedGeneratedMethod, existingMethods })\n generatedMethod = generatedMethod + ParserUtils.getVersionSuffixFromPath(path)\n return generatedMethod\n }\n\n static filterBodyParams(parameters?: EndpointParameters[]) {\n if (Array.isArray(parameters) && parameters.length > 0) {\n return parameters.filter(parameter => parameter.in === 'body' || parameter.in === 'formData')\n }\n return []\n }\n\n static filterQueryParameters(parameters?: EndpointParameters[]): EndpointParameters[] {\n if (!parameters) {\n return []\n }\n return parameters.filter(parameter => parameter.in === 'query')\n }\n\n static mkdirIfNotExist(dirToCreate: string) {\n if (!fs.existsSync(dirToCreate)) {\n fs.mkdirSync(dirToCreate, { recursive: true })\n }\n }\n\n static writeClassFile(distDir: string, apiName: string, apiBuffer: string, imports?: string[]) {\n const fileContent = templateClass(apiName, apiBuffer, imports)\n fs.writeFileSync(`${distDir}/${apiName}.ts`, ParserUtils.prependCopyrightHeader(fileContent))\n }\n\n static writeAtomFile(distDir: string, apiName: string, fileContent: string) {\n ParserUtils.mkdirIfNotExist(distDir)\n fs.writeFileSync(`${distDir}/${apiName}.atom.ts`, ParserUtils.prependCopyrightHeader(fileContent))\n }\n\n static writeQueryFile(\n distDir: string,\n apiName: string,\n apiBuffer: string,\n imports: string[],\n serviceNameTitle: string,\n returnMethods: string,\n paramImports: string[],\n sdkName: string\n ) {\n if (apiBuffer.length < 1) {\n return null\n }\n const queryFileName = `${apiName.replace('Api', '')}.query`\n ParserUtils.mkdirIfNotExist(distDir)\n const fileContent = templateQuery(apiName, apiBuffer, imports, serviceNameTitle, returnMethods, paramImports, sdkName)\n fs.writeFileSync(`${distDir}/${queryFileName}.ts`, ParserUtils.prependCopyrightHeader(fileContent))\n\n return queryFileName\n }\n\n static writeXVersion(distDir: string, xversionJson: string, apiInfo) {\n if (xversionJson) {\n console.log('x-version:', xversionJson)\n fs.writeFileSync(`${distDir}/version.json`, JSON.stringify(xversionJson, null, 2))\n } else {\n const customVersion = {\n ...apiInfo,\n gitHash: apiInfo.version\n }\n console.error(`!!!! Missing x-version for ${distDir} ${customVersion}`)\n fs.writeFileSync(`${distDir}/version.json`, JSON.stringify(customVersion, null, 2))\n }\n }\n\n static writeApiFile(\n distDir: string,\n apiName: string,\n apiBuffer: string,\n imports: string[],\n returnMethodsDescription: Record<string, string>\n ) {\n const newImports = []\n imports.forEach(el => {\n newImports.push(el.replace('../../generated-definitions', '../generated-definitions'))\n })\n const fileContent = templateApiClass(apiName, apiBuffer, newImports, returnMethodsDescription)\n fs.writeFileSync(`${distDir}/${apiName}.ts`, ParserUtils.prependCopyrightHeader(fileContent))\n }\n\n static writeApiMainFile(distDir: string, serviceName: string, fileContent: string) {\n fs.writeFileSync(`${distDir}/${serviceName}.ts`, ParserUtils.prependCopyrightHeader(fileContent))\n }\n\n static writeSnippetFile(distDir: string, name: string, docBuffer: string) {\n let snippetFileName = ParserUtils.replaceAll(name, ' ', '-').toLowerCase()\n snippetFileName = snippetFileName.replace('justice-', '')\n snippetFileName = 'snippet-' + snippetFileName + '.json'\n fs.writeFileSync(`${distDir}/${snippetFileName}`, docBuffer)\n }\n\n static writeDefinitionFile(distDir: string, name: string, buffer: string) {\n ParserUtils.mkdirIfNotExist(distDir)\n fs.writeFileSync(path.join(distDir, `${name}.ts`), ParserUtils.prependCopyrightHeader(buffer))\n }\n\n static writeAllImportsFile(distDir: string, buffer: string) {\n ParserUtils.mkdirIfNotExist(distDir)\n fs.writeFileSync(path.join(distDir, 'all-imports.ts'), ParserUtils.prependCopyrightHeader(buffer))\n }\n\n static writeAllQueryImportsFile(distDir: string, buffer: string) {\n ParserUtils.mkdirIfNotExist(distDir)\n fs.writeFileSync(path.join(distDir, 'all-query-imports.ts'), ParserUtils.prependCopyrightHeader(buffer))\n }\n\n static toCamelCase(str: string) {\n return str\n .split('/')\n .map(function (word, index) {\n // If it is the first word make sure to lowercase all the chars.\n if (index === 0) {\n return word.toLowerCase()\n }\n // If it is not the first word only upper case the first char\n return ParserUtils.toCamelCaseWord(word)\n })\n .join('')\n }\n\n static toCamelCaseWord(word: string) {\n if (!word) {\n return ''\n }\n // convert hyphen separated case to camel case\n word = word.replace(/(-\\w)/g, m => m[1].toUpperCase())\n // capitalize first letter\n return word.charAt(0).toUpperCase() + word.slice(1)\n }\n\n static toTitleCaseWord(word: string) {\n if (!word) {\n return ''\n }\n return word.replace(/\\w\\S*/g, txt => {\n return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase()\n })\n }\n\n static applyPatchIfExists(\n swaggerFilePath: string,\n possibleSwaggerPatchFilePath: string,\n swaggerPatchedFilePath: string,\n swaggerPatchedDir: string\n ) {\n if (!fs.existsSync(swaggerPatchedDir)) {\n fs.mkdirSync(swaggerPatchedDir, { recursive: true })\n }\n\n if (!fs.existsSync(possibleSwaggerPatchFilePath)) {\n fs.copyFileSync(swaggerFilePath, swaggerPatchedFilePath)\n return\n }\n const swaggerContent = JSON.parse(fs.readFileSync(swaggerFilePath, 'utf8'))\n const swaggerPatchFileContent: Operation[] = JSON.parse(fs.readFileSync(possibleSwaggerPatchFilePath, 'utf8'))\n\n // Check out the existence of the paths listed in the Swagger JSON patch.\n for (const patchEntry of swaggerPatchFileContent) {\n // Trim out empty string array elements.\n const segments = patchEntry.path.split('/').filter(Boolean)\n let currentNode = swaggerContent\n // This `aggregatedPath` is to pinpoint the erroring path, so that we can display the exact path where it errors\n // and not the entire `patchEntry.path`.\n let aggregatedPath = ''\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n aggregatedPath += `/${segment}`\n\n // Replace the JSON pointers.\n // More on this: https://jsonpatch.com/#json-pointer.\n const effectiveSegment = segment.replace(/(~1)/g, '/').replace(/(~0)/g, '~')\n\n if (!currentNode[effectiveSegment]) {\n if (i + 1 === segments.length && patchEntry.op === 'add') {\n // Only allow missing node when we're adding a node and we're at the end of the segment array.\n // No-op.\n } else {\n // If it's not leaf node yet, then throw error.\n // If it's leaf node and the mode isn't \"add\", then throw error.\n throw new Error(\n [\n `JSON patch error: operation \"${patchEntry.op}\" on path \"${aggregatedPath}\" fails because the path doesn't exist in ${swaggerFilePath}. This may be caused by:\\n`,\n '1. The related service has patched the service, so patch is no longer needed.',\n '2. There is a breaking change on the service that causes the path to change.\\n',\n `In any case, revisit this file: \"${possibleSwaggerPatchFilePath}\", then try again.\\n`\n ].join('\\n')\n )\n }\n }\n\n currentNode = currentNode[effectiveSegment]\n }\n }\n\n const { newDocument } = applyPatch(swaggerContent, swaggerPatchFileContent)\n fs.writeFileSync(swaggerPatchedFilePath, JSON.stringify(newDocument, null, 2))\n }\n\n static getRelativePathToWebSdkSrcFolder(srcFolder: string, targetSrcFolder: string) {\n // For example:\n // Input: ../../accelbyte-typescript-sdk/packages/sdk/src/generated/...\n // Output: ./generated/...\n // Need to replace for Windows as `/` becomes `\\`.\n const replaced = srcFolder.replace(/\\\\/g, '/')\n return replaced.replace(/\\\\/g, '/').replace(targetSrcFolder, './')\n }\n\n static prependCopyrightHeader = (content: string): string => {\n const currentYear = new Date().getFullYear()\n return `/* \n * Copyright (c) 2022${currentYear > 2022 ? `-${currentYear}` : ''} AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n${content}`\n }\n\n static sortPathParamsByPath = (pathParams: EndpointParameters[], path: string) => {\n const params = path.match(/{\\w*}/g) || []\n const cleanParams = params.map(param => param.replace('{', '').replace('}', ''))\n return pathParams.sort((a, b) => cleanParams.indexOf(a.name) - cleanParams.indexOf(b.name))\n }\n}\n\nconst mappedMethod = (httpMethod: string, isForm: boolean, permissionType?: PermissionType) => {\n if (httpMethod === 'get') {\n // return 'fetch'\n return 'get'\n } else if (httpMethod === 'post' && isForm) {\n return 'post'\n } else if (httpMethod === 'post' && permissionType === 'READ') {\n return 'fetch'\n } else if (httpMethod === 'post' && permissionType === 'UPDATE') {\n return 'update'\n } else if (httpMethod === 'post') {\n return 'create'\n } else if (httpMethod === 'put') {\n return 'update'\n } else if (httpMethod === 'patch') {\n return 'patch'\n } else if (httpMethod === 'delete') {\n return 'delete'\n }\n}\n\nconst resolveConflicts = ({ path, generatedMethod, testedGeneratedMethod, existingMethods }) => {\n let _testedGenMethod = testedGeneratedMethod\n try {\n testConflict(path, _testedGenMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/namespaces/') >= 0) {\n generatedMethod += '_ByNS'\n // below avoids adding double suffix _ByNS_admin\n _testedGenMethod += '_ByNS'\n }\n }\n\n try {\n testConflict(path, _testedGenMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/admin/') >= 0) {\n generatedMethod += '_admin'\n _testedGenMethod += '_admin'\n }\n }\n\n // Still failed? dump it and fail the code gen build\n testConflict(path, _testedGenMethod, existingMethods)\n\n return generatedMethod\n}\n\nconst testConflict = (path, generatedMethod, existingMethods) => {\n if (existingMethods[generatedMethod]) {\n const conflictingMethod = { path, generatedMethod }\n throw Error(\n `Duplicate method conflict in ${JSON.stringify(conflictingMethod)},\\n existingMethods: ${JSON.stringify(existingMethods, null, 2)}`\n )\n }\n}\n\nconst isSwaggerIntegerType = (type: string) => {\n return type === 'integer' || type === 'int'\n}\n","/*\n * Copyright (c) 2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport fs from 'fs'\nimport path from 'path'\nimport { Endpoint } from '../Swagger'\n\nexport const capitalize = (string: string): string => {\n return string.charAt(0).toUpperCase() + string.slice(1)\n}\n\nexport function isObject(o) {\n return o instanceof Object && o.constructor === Object\n}\n\nexport const getPermission = (endpoint: Endpoint) => {\n const xSecurity = endpoint['x-security'] as Array<{ userPermissions?: string; groupPermissions?: string }> | { userPermission?: string }\n let xSecurityPerm: string = undefined\n\n if (Array.isArray(xSecurity)) {\n for (const obj of xSecurity) {\n if (obj?.userPermissions) {\n xSecurityPerm = obj.userPermissions\n }\n\n if (obj?.groupPermissions) {\n xSecurityPerm = obj.groupPermissions\n }\n }\n } else if (isObject(xSecurity)) {\n xSecurityPerm = xSecurity?.userPermission\n }\n\n return xSecurityPerm\n}\n\nexport type PermissionType = 'READ' | 'CREATE' | 'DELETE' | 'UPDATE' | null\n\nconst PermissionRegex = /\\[(\\w+)\\]/\n\nexport const getPermissionType = (permission?: string | string[]): PermissionType => {\n if (!permission) return null\n\n if (Array.isArray(permission)) {\n const perm = permission?.[0]\n if (!perm) return null\n\n const [_, type] = perm?.match(PermissionRegex)\n\n return (type || null) as PermissionType\n }\n\n const [_, type] = permission?.match(PermissionRegex)\n\n return (type || null) as PermissionType\n}\n\n/**\n * Append data to a file in the root directory.\n *\n * @param {string} data - The data to append to the file.\n * @param {string} fileName - The name of the file in the root directory.\n */\nexport const appendToRootFile = (data: string, fileName: string) => {\n // Calculate the path to the root directory file\n const rootFilePath = path.resolve(__dirname, '../../../../', fileName)\n\n try {\n // Append the data to the file in the root directory\n fs.appendFileSync(rootFilePath, data, 'utf8')\n console.log(`Data appended to ${rootFilePath} successfully.`)\n } catch (err) {\n console.error(`Failed to append data: ${err}`)\n }\n}\n\nexport const removeAdminPrefix = (name: string) => (name.startsWith('Admin') && name !== 'Admin' ? name.replace(/^Admin/, '') : name)\n\nexport const escapeComment = (string: string) => string.replace(/\\*\\//g, '*\\\\/').replace(/\\n/g, '\\n * ')\n\nconst generateJsDoc = ({ indentation = 4, lines }: { indentation: number; lines: string[] }): string => {\n const indent = ' '.repeat(indentation)\n\n const formattedLines = lines\n .filter(Boolean)\n .map(line => `${indent} * ${line}`)\n .join('\\n')\n\n return `${indent}/**\\n${formattedLines}\\n${indent} */`\n}\n\nexport const extractDescription = (\n description: string,\n options?: { isDeprecated?: boolean; responseClasses?: string[]; other?: string[]; indentation?: number }\n) => {\n const { indentation = 2, responseClasses, other, isDeprecated } = options\n return description\n ? generateJsDoc({\n lines: [\n isDeprecated ? '@deprecated' : '',\n escapeComment(description),\n ...(responseClasses.length > 1 ? [' ', '#### Response type:', ...responseClasses.map(val => `- \\`${val}\\``)] : ''),\n ...(options?.other ? other : '')\n ],\n indentation\n })\n : ''\n}\n\nexport const getResponseType = ({\n responseClasses,\n defaultType = 'unknown'\n}: {\n responseClasses: string[]\n defaultType?: string\n}): { responseType: string; responseTypeInAxiosResponse: string; responseTypeInResponse: string } => {\n const responseClass = responseClasses.length === 1 ? responseClasses?.[0] : 'unknown'\n const responseType = responseClass !== 'unknown' ? responseClasses?.[0] : defaultType\n return {\n responseType,\n responseTypeInAxiosResponse: `Promise<AxiosResponse<${responseType}>>`,\n responseTypeInResponse: `Promise<Response<${responseType}>>`\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nconst getImportableVarMap = () => ({\n '@accelbyte/sdk': ['CodeGenUtil', 'Response', 'Validate', 'SdkSetConfigParam'],\n axios: ['AxiosResponse'],\n zod: ['z']\n})\n\nconst makeNewImportVarMap = () => ({\n axios: ['AxiosInstance', 'AxiosRequestConfig'],\n '@accelbyte/sdk': ['SDKRequestConfig']\n})\n\nexport const generateImports = (body: string, importStatements: string[], makeNewImportVarMap, getImportableVarMap) => {\n const usedImportVarMap = makeNewImportVarMap\n const importableVarMap = getImportableVarMap\n\n for (const [moduleSource, importableVars] of Object.entries(importableVarMap)) {\n // @ts-ignore\n for (const importableVar of importableVars) {\n const importVarRegex = new RegExp(`(?<![\\\\d\\\\w_])${importableVar}(?![\\\\d\\\\w_])`)\n if (body.match(importVarRegex)) {\n usedImportVarMap[moduleSource] = [...(usedImportVarMap[moduleSource] || []), importableVar]\n }\n }\n }\n const generatedImports = Object.keys(usedImportVarMap)\n .sort()\n .map((moduleSource: string) => {\n return `import { ${usedImportVarMap[moduleSource].sort().join(', ')} } from '${moduleSource}'`\n })\n .join('\\n')\n return `${generatedImports}\\n${importStatements.sort().join('\\n')}`\n}\n\nexport const templateClass = (className: string, body: string, importStatements: string[]): string => {\n return `/**\n * AUTO GENERATED\n */\n${generateImports(body, importStatements, makeNewImportVarMap(), getImportableVarMap())}\n\nexport class ${className} {\n // @ts-ignore\n // prettier-ignore\n constructor(private axiosInstance: AxiosInstance, private namespace: string, private useSchemaValidation = true) {}\n ${body}\n}\n `\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { generateImports } from './template-class'\n\nconst getImportableVarMap = () => ({\n '@accelbyte/sdk': ['CodeGenUtil', 'Response', 'Validate', 'SdkSetConfigParam', 'Network', 'AccelByteSDK'],\n axios: ['AxiosDefaults', 'HeadersDefaults']\n})\n\nconst makeNewImportVarMap = () => ({\n '@accelbyte/sdk': ['AccelByteSDK', 'SdkSetConfigParam', 'ApiUtils', 'Network'],\n axios: ['AxiosRequestConfig', 'AxiosResponse']\n})\n\nexport const templateApiClass = (\n className: string,\n body: string,\n importStatements: string[],\n returnMethods: Record<string, string>\n): string => {\n const returnsMethodsWithDescription = Object.keys(returnMethods).reduce((acc, key) => {\n acc += `\n ${returnMethods[key]}\\n${key},`\n return acc\n }, '')\n const $className = className.replace(/Api$/, '$')\n return `/**\n * AUTO GENERATED\n */\n/* eslint-disable camelcase */\n// @ts-ignore -> ts-expect-error TS6133\n${generateImports(body, importStatements, makeNewImportVarMap(), getImportableVarMap())}\n${`import { ${$className} } from './endpoints/${$className}.js'\\n`}\n\nexport function ${className}(sdk: AccelByteSDK, args?: SdkSetConfigParam) {\n const sdkAssembly = sdk.assembly()\n \n const namespace = args?.coreConfig?.namespace ?? sdkAssembly.coreConfig.namespace\n const useSchemaValidation = args?.coreConfig?.useSchemaValidation ?? sdkAssembly.coreConfig.useSchemaValidation\n \n let axiosInstance = sdkAssembly.axiosInstance\n const requestConfigOverrides = args?.axiosConfig?.request\n const baseURLOverride = args?.coreConfig?.baseURL\n const interceptorsOverride = args?.axiosConfig?.interceptors ?? []\n\n if (requestConfigOverrides || baseURLOverride || interceptorsOverride.length > 0) {\n const requestConfig = ApiUtils.mergeAxiosConfigs(sdkAssembly.axiosInstance.defaults as AxiosRequestConfig, {\n ...(baseURLOverride ? { baseURL: baseURLOverride } : {}),\n ...requestConfigOverrides\n })\n axiosInstance = Network.create(requestConfig)\n\n for (const interceptor of interceptorsOverride) {\n if (interceptor.type === 'request') {\n axiosInstance.interceptors.request.use(interceptor.onRequest, interceptor.onError)\n }\n\n if (interceptor.type === 'response') {\n axiosInstance.interceptors.response.use(interceptor.onSuccess, interceptor.onError)\n }\n }\n }\n\n ${body}\n \n return {\n ${returnsMethodsWithDescription}\n }\n}\n `\n}\n","/*\n * Copyright (c) 2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport { capitalize } from './helpers/utils'\n\nexport class ParserQueryUtils {\n /**\n * convert csv 'aa,bb' into \"aa='aa', bb='bb'\"\n */\n static createQueryKeys(classNameWithoutApi, csvMethodNames: string, sdkName: string): string {\n const keys = csvMethodNames.split(',')\n const processedKeys = new Set<string>()\n\n const enumString = keys.reduce((acc, key, index) => {\n const trimmedKey = key.trim()\n if (trimmedKey) {\n // Remove known prefixes and any leading underscores or spaces\n const cleanedKey = trimmedKey.replace(/^(get|update|create|patch|delete|post|fetch)[_]?/, '')\n\n // Create the enum value only if it's not already added\n if (!processedKeys.has(cleanedKey)) {\n processedKeys.add(cleanedKey)\n acc += `${cleanedKey} = '${capitalize(sdkName)}.${classNameWithoutApi}.${cleanedKey}'`\n if (index < keys.length - 1) {\n acc += ',\\n'\n }\n }\n }\n return acc\n }, '')\n\n return enumString\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { ParserQueryUtils } from '../ParserQueryUtils'\n\nexport const generateImports = (body: string, className: string) => {\n const generatedImports =\n '' +\n \"import { AccelByteSDK, SdkSetConfigParam, ApiError } from '@accelbyte/sdk'\\n\" +\n \"import { AxiosError, AxiosResponse } from 'axios'\\n\" +\n '// @ts-ignore\\n' +\n \"import { useQuery, UseQueryOptions, UseQueryResult, useMutation, UseMutationOptions, UseMutationResult } from '@tanstack/react-query'\\n\" +\n `import { ${className} } from \"../${className}.js\"\\n`\n\n return generatedImports\n}\n\nexport const templateQuery = (\n className: string,\n body: string,\n importStatements: string[],\n serviceNameTitle: string,\n returnMethods: string,\n paramImports: string[],\n sdkName: string\n): string => {\n const classNameWithoutApi = className.replace('Api', '')\n const queryKeys = ParserQueryUtils.createQueryKeys(classNameWithoutApi, returnMethods, sdkName)\n const generatedImports = generateImports(body, className)\n\n return `/**\n * AUTO GENERATED\n */\n/* eslint-disable camelcase */\n${generatedImports}\n${filterUsedImports(paramImports, body)}\n\nexport enum Key_${classNameWithoutApi} {\n ${queryKeys}\n}\n\n ${body}\n `\n}\n\nfunction filterUsedImports(importArr, body) {\n return (\n importArr\n .filter(path => {\n const start = path.indexOf('{') + 1\n const end = path.indexOf('}')\n if (start > 0 && end > start) {\n const importName = path.slice(start, end).trim()\n // Check if the extracted className is used in the body\n return body.includes(importName)\n }\n return false\n })\n .map(path => path) // Direct mapping as there's no transformation needed\n .join('\\n') + '\\n'\n ) // Join the remaining imports with newlines\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { z } from 'zod'\n\nconst Schema = z.object({\n $ref: z.string().nullish(),\n type: z\n .union([z.literal('array'), z.literal('object'), z.literal('file'), z.literal('string'), z.literal('boolean'), z.literal('integer')])\n .nullish(),\n items: z\n .object({\n $ref: z.string().nullish(),\n type: z.string().nullish()\n })\n .nullish(),\n properties: z.union([z.array(z.string()).nullish(), z.record(z.object({ type: z.string() })).nullish()]),\n description: z.string().nullish(),\n additionalProperties: z\n .object({\n type: z.string().nullish()\n })\n .nullish()\n})\n\nexport type Schema = z.TypeOf<typeof Schema>\n\nexport const Definition = z.object({\n required: z.array(z.string()).nullish(),\n properties: z\n .record(\n z.object({\n type: z.string()\n })\n )\n .nullish()\n})\n\nexport type Definition = z.TypeOf<typeof Definition>\n\nexport const Definitions = z.record(Definition)\n\nexport type Definitions = z.TypeOf<typeof Definitions>\n\nconst EndpointParametersType = z.enum(['apiKey', 'boolean', 'int', 'integer', 'number', 'string', 'array', 'file'])\nconst EndpointParametersIn = z.enum(['body', 'formData', 'header', 'path', 'query'])\n\nconst EndpointParameters = z.object({\n type: EndpointParametersType.nullish(),\n description: z.string().nullish(),\n name: z.string(),\n in: EndpointParametersIn,\n required: z.boolean().nullish(),\n schema: Schema.nullish(),\n default: z.union([z.boolean(), z.string(), z.number(), z.array(z.any())]).nullish(),\n enum: z.array(z.union([z.boolean(), z.string(), z.number()])).nullish(),\n items: z\n .object({\n type: z.string(),\n enum: z.array(z.any()).nullish()\n })\n .nullish()\n})\n\nexport type EndpointParameters = z.TypeOf<typeof EndpointParameters>\n\nexport const Endpoint = z.object({\n description: z.string().nullish(),\n consumes: z.array(z.string()).nullish(),\n produces: z.array(z.string()).nullish(),\n tags: z.array(z.string()).nullish(),\n summary: z.string().nullish(),\n operationId: z.string(),\n deprecated: z.boolean().nullish(),\n responses: z.record(\n z.object({\n description: z.string().nullish(),\n schema: Schema.nullish(),\n content: z\n .object({\n 'application/json': z.object({\n schema: Schema.nullish()\n })\n })\n .nullish()\n })\n ),\n parameters: z.array(EndpointParameters).nullish(),\n requestBody: z\n .object({\n required: z.boolean().nullish(),\n content: z\n .object({\n 'application/json': z\n .object({\n schema: Schema.nullish()\n })\n .nullish()\n })\n .nullish()\n })\n .nullish(),\n // The proper type is z.array(z.record(z.array(z.string()))).nullish() but somehow there are endpoints with\n // an object type instead of an array type, so, yeah.\n //\n // Services with this error: sdk-iam, sdk-ugc.\n 'x-security': z.any().nullish()\n})\nexport type Endpoint = z.TypeOf<typeof Endpoint>\n\nconst Operation = z.object({\n get: Endpoint.nullish(),\n post: Endpoint.nullish(),\n patch: Endpoint.nullish(),\n delete: Endpoint.nullish(),\n put: Endpoint.nullish()\n})\nexport type Operation = z.TypeOf<typeof Operation>\nexport type HttpMethod = keyof Operation\n\nexport const Paths = z.record(Operation)\n\nexport const OpenApiSpec = z.object({\n paths: Paths,\n definitions: Definitions,\n basePath: z.string(),\n info: z.object({\n description: z.string(),\n title: z.string(),\n contact: z.object({\n name: z.string(),\n url: z.string(),\n email: z.string()\n }),\n version: z.string()\n }),\n schemes: z.array(z.string()).nullish(),\n components: z\n .object({\n schemas: Definitions\n })\n .nullish()\n})\n\nexport type OpenApiSpec = z.TypeOf<typeof OpenApiSpec>\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { extractDescription, getResponseType } from '../helpers/utils'\nimport { ParserUtils } from '../ParserUtils'\nimport { EndpointParameters } from '../Swagger'\n\nexport const templateApiMethod = ({\n classMethod,\n httpMethod,\n path,\n pathParams,\n bodyParams,\n responseClasses,\n classGenName,\n methodParams,\n methodParamsNoTypes,\n xSecurity\n}: {\n classMethod: string\n httpMethod: string\n path: string\n pathParams: EndpointParameters[]\n bodyParams: EndpointParameters[]\n responseClasses: string[]\n classGenName: string\n methodParams: string\n methodParamsNoTypes: string\n // Reference: https://accelbyte.atlassian.net/wiki/spaces/CW/pages/2991423677/Draft+Swagger+validation+for+API+explorer+content+proposal.\n // Endpoint with `x-security` means it requires authentication.\n xSecurity: Array<Record<string, string[]>> | undefined\n}) => {\n let newPath = `'${path}'`\n let snippetMethod = ''\n\n for (const pathParam of pathParams) {\n const type = ParserUtils.parseType(pathParam)\n const pName = pathParam.name === 'namespace' ? 'this.namespace' : pathParam.name\n if (path.match(`{${pathParam.name}}`)) {\n if (type === 'string') {\n newPath = `${newPath}.replace('{${pathParam.name}}', ${pName})`\n } else {\n newPath = `${newPath}.replace('{${pathParam.name}}', String(${pName}))`\n }\n }\n }\n\n const snippetShellArgs: string[] = ['--location --request', `${httpMethod} '__DOMAIN__${path}'`, \"--header 'accept: application/json'\"]\n const snippetApiArgs: string[] = []\n\n // Admin paths _usually_ always require authentication.\n // If it's public, then it can't be helped, we need to rely on `x-security` that's provided from the domain service teams.\n if (xSecurity !== undefined || path.includes('/admin')) {\n snippetShellArgs.push(\"--header 'Authorization: Bearer {access_token}'\")\n snippetApiArgs.push(\"{ axiosConfig: { request: { headers: { Authorization: 'Bearer {access_token}' } } } }\".trim())\n }\n\n if (httpMethod !== 'get') {\n const curlParams = bodyParams?.map(ob => {\n return ` \"${ob.name}\": \"\"`\n })\n\n // Prevent sending `--data-raw` in case of `DELETE` method without body.\n if (curlParams.length > 0) {\n snippetShellArgs.push(`--data-raw '{ ${curlParams}}'`)\n }\n }\n\n const snippetShell = `curl ${snippetShellArgs.join(' \\\\\\n ')}`\n\n const { responseType, responseTypeInAxiosResponse } = getResponseType({ responseClasses })\n\n const methodImpl = `\n async function ${classMethod}(${methodParams}): ${responseTypeInAxiosResponse} {\n const $ = new ${classGenName}(axiosInstance, namespace, useSchemaValidation)\n const resp = await $.${classMethod}(${methodParamsNoTypes})\n if (resp.error) throw resp.error\n return resp.response\n }\n `\n const snippetPromiseString = responseType !== 'unknown' ? `Promise<${responseType}>` : 'Promise'\n snippetMethod += `${classMethod}(${methodParams}) \\n // return ${snippetPromiseString}`\n\n return {\n generatedMethodString: methodImpl,\n snippetApiArgs,\n snippetMethod,\n snippetShell\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { extractDescription, getResponseType } from '../helpers/utils'\nimport { ParserUtils } from '../ParserUtils'\nimport { EndpointParameters } from '../Swagger'\n\nexport const templateMethod = ({\n classMethod,\n description,\n httpMethod,\n path,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded,\n responseClasses,\n deprecated\n}: {\n classMethod: string\n description: string\n httpMethod: string\n path: string\n pathParams: EndpointParameters[]\n bodyParams: EndpointParameters[]\n queryParams: EndpointParameters[]\n isFormUrlEncoded: boolean\n responseClasses: string[]\n deprecated: boolean\n}) => {\n let methodParams = ''\n let methodParamsNoTypes = ''\n let newPath = `'${path}'`\n let importStatements: string[] = []\n\n const sortedPathParams = ParserUtils.sortPathParamsByPath(pathParams, path)\n for (const pathParam of sortedPathParams) {\n const type = ParserUtils.parseType(pathParam)\n if (pathParam.name !== 'namespace') {\n methodParams += pathParam.name + `:${type}` + ', '\n methodParamsNoTypes += pathParam.name + ', '\n }\n const pName = pathParam.name === 'namespace' ? 'this.namespace' : pathParam.name\n if (path.match(`{${pathParam.name}}`)) {\n if (type === 'string') {\n newPath = `${newPath}.replace('{${pathParam.name}}', ${pName})`\n } else {\n newPath = `${newPath}.replace('{${pathParam.name}}', String(${pName}))`\n }\n }\n }\n\n let dataType = null\n if (httpMethod !== 'get') {\n dataType = ParserUtils.parseBodyParamsType(bodyParams)\n importStatements = ParserUtils.parseBodyParamsImports(bodyParams)\n methodParams += dataType ? `data: ${dataType},` : ''\n methodParamsNoTypes += dataType ? `data,` : ''\n }\n\n const isAnyRequired = ParserUtils.isAnyQueryParamRequired(queryParams)\n const queryParamsType = queryParams.length\n ? `queryParams${isAnyRequired ? '' : '?'}: {${ParserUtils.parseQueryParamsType(queryParams)}}`\n : ''\n\n const queryParamsDefault = queryParams.length\n ? `const params = {${ParserUtils.parseQueryParamsDefault(queryParams)} ...queryParams} as AxiosRequestConfig`\n : 'const params = {} as AxiosRequestConfig'\n\n const isPostPutPatch = ['post', 'put', 'patch'].includes(httpMethod)\n const isDelete = ['delete'].includes(httpMethod)\n let dataPayload = '{params}'\n\n const descriptionText = extractDescription(description, { isDeprecated: deprecated, responseClasses })\n\n let formPayloadString = ''\n if (isFormUrlEncoded) {\n formPayloadString = ``\n const params = \"{ ...params, headers: { ...params.headers, 'content-type': 'application/x-www-form-urlencoded' } }\"\n\n dataPayload = dataType ? `CodeGenUtil.getFormUrlEncodedData(data), ${params}` : `null, ${params}`\n } else if (isPostPutPatch) {\n dataPayload = dataType ? `data, {params}` : 'null, {params}'\n } else if (isDelete) {\n dataPayload = dataType ? `{data, params}` : '{params}'\n }\n const isFileUpload = methodParams.indexOf('data: {file') > -1\n\n const { responseType, responseTypeInResponse } = getResponseType({ responseClasses })\n const resolvedResponseClassValidated = responseType !== 'unknown' ? `${responseType}` : 'z.unknown()'\n methodParams = (queryParamsType ? `${methodParams} ${queryParamsType}` : methodParams).replace(/,\\s*$/, '')\n methodParamsNoTypes = queryParamsType ? `${methodParamsNoTypes} queryParams` : methodParamsNoTypes\n\n const isGuardInvoked = ['get', 'post', 'put', 'patch', 'delete'].includes(httpMethod)\n\n const generatedMethodName = `${classMethod}(${methodParams}): ${responseTypeInResponse}`\n\n let methodImpl = `${descriptionText}\n ${generatedMethodName} {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n\n${` return Validate.validateOrReturnResponse(this.useSchemaValidation, () => resultPromise, ${resolvedResponseClassValidated}, '${resolvedResponseClassValidated}')`}\n }\n `\n\n if (!isGuardInvoked) {\n methodImpl = ``\n }\n\n const res = {\n methodImpl,\n methodParams,\n methodParamsNoTypes,\n importStatements\n }\n return res\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { capitalize, extractDescription, getResponseType } from '../helpers/utils'\nimport { ParserUtils } from '../ParserUtils'\nimport { EndpointParameters } from '../Swagger'\n\n/* Table query doesn't have permission, will revisit later */\nconst POST_FETCH_INCLUDES_PATH = ['/table-query/']\n\nexport const templateQueryMethod = ({\n classMethod,\n httpMethod,\n path,\n pathParams,\n responseClasses,\n methodParams,\n apiGenName,\n description,\n deprecated\n}: {\n classMethod: string\n httpMethod: string\n path: string\n pathParams: EndpointParameters[]\n responseClasses: string[]\n methodParams: string\n apiGenName: string\n description: string\n deprecated: boolean\n}) => {\n const isPostFetch = httpMethod === 'post' && (POST_FETCH_INCLUDES_PATH.some(p => path.includes(p)) || path.endsWith('/list'))\n\n const isFetch = classMethod.startsWith('fetch')\n const isGet = httpMethod === 'get' || isPostFetch || isFetch\n\n const queryMethod = isGet ? 'useQuery' : 'useMutation'\n let mParams = ''\n let mParamsNoTypes = ''\n let newPath = `'${path}'`\n\n const sortedPathParams = ParserUtils.sortPathParamsByPath(pathParams, path)\n for (const pathParam of sortedPathParams) {\n const type = ParserUtils.parseType(pathParam)\n if (pathParam.name !== 'namespace') {\n mParams += pathParam.name + `:${type}` + ', '\n mParamsNoTypes += pathParam.name + ', '\n }\n const pName = pathParam.name === 'namespace' ? 'this.namespace' : pathParam.name\n if (path.match(`{${pathParam.name}}`)) {\n if (type === 'string') {\n newPath = `${newPath}.replace('{${pathParam.name}}', ${pName})`\n } else {\n newPath = `${newPath}.replace('{${pathParam.name}}', String(${pName}))`\n }\n }\n }\n\n const { responseType } = getResponseType({ responseClasses })\n let _methodName = convertMethodNameToHook({ classMethod, apiGenName, isGet })\n const _methodParams = methodParams && methodParams.length > 0 ? `& { ${methodParams} }` : ''\n const _methodParamsImpl = convertToMethodImplArgs(methodParams)\n const queryKey = createQueryKey(apiGenName, classMethod)\n const descriptionText = extractDescription(description, {\n isDeprecated: deprecated,\n responseClasses,\n other: [' ', '#### Default Query Options', 'The default options include:', '```', '{', ` queryKey: [${queryKey}, input]`, '}', '```']\n })\n\n const queryMethodImpl = `\\n\n${descriptionText}\nexport const ${_methodName} = (\n sdk: AccelByteSDK,\n input: SdkSetConfigParam ${_methodParams},\n options?: Omit<UseQueryOptions<${responseType}, AxiosError<ApiError>>, 'queryKey'>,\n callback?: (data: AxiosResponse<${responseType}>) => void\n ): UseQueryResult<${responseType}, AxiosError<ApiError>> => { \n \n const queryFn = (\n sdk: AccelByteSDK, \n input: Parameters<typeof ${_methodName}>[1]\n ) => async () => {\n const response = \n (await ${apiGenName}(sdk, { coreConfig: input.coreConfig, axiosConfig: input.axiosConfig }).\n ${classMethod}(${_methodParamsImpl}))\n callback && callback(response)\n return response.data\n }\n \n return ${queryMethod}<${responseType}, AxiosError<ApiError>>({\n queryKey: [${queryKey}, input],\n queryFn: queryFn(sdk, input),\n ...options\n })\n}\\n \n `\n\n const mutationMethodImpl = `\\n\n ${descriptionText}\nexport const ${_methodName} = (\n sdk: AccelByteSDK,\n options?: Omit<UseMutationOptions<${responseType}, AxiosError<ApiError>, SdkSetConfigParam ${_methodParams}>, 'mutationKey'>,\n callback?: (data: ${responseType}) => void\n ): UseMutationResult<${responseType}, AxiosError<ApiError>, SdkSetConfigParam ${_methodParams}> => { \n \n const mutationFn = async (input: SdkSetConfigParam ${_methodParams}) => {\n const response = \n (await ${apiGenName}(sdk, { coreConfig: input.coreConfig, axiosConfig: input.axiosConfig }).\n ${classMethod}(${_methodParamsImpl}))\n callback && callback(response.data)\n return response.data\n }\n \n return useMutation({\n mutationKey: [${queryKey}],\n mutationFn,\n ...options\n })\n}\\n \n `\n\n return isGet ? queryMethodImpl : mutationMethodImpl\n}\n\nfunction versionMutationSuffixMethodName(baseMethodName: string): string {\n // Use regex to split the method name at the last occurrence of a version pattern\n const parts = baseMethodName.split(/(_v\\d+)$/)\n const name = parts[0] // The base name without the version\n const versionSuffix = parts[1] || '' // The version suffix or empty if not present\n\n // Insert the version suffix after \"Mutation\" correctly, even if it's deeply embedded\n const res = `${name}Mutation${versionSuffix}`\n return res\n}\n\n/*\n * Converts \"SomethingApi.get|post|etcWhatever\" to \"Something.Whatever\"\n */\nfunction createQueryKey(className, methodName) {\n const prefixRegex = /^(get|create|update|delete|patch|post|fetch)[_]?/i\n const cleanedMethodName = methodName.replace(prefixRegex, '').trim()\n const finalMethodName = cleanedMethodName.charAt(0).toUpperCase() + cleanedMethodName.slice(1)\n return `Key_${className.replace('Api', '')}.${finalMethodName}`\n}\n\nconst prefixMappings = {\n get: 'use',\n create: 'useCreate',\n patch: 'usePatch',\n update: 'useUpdate',\n delete: 'useDelete',\n post: 'usePost',\n fetch: 'useFetch'\n} as const\n\nfunction convertMethodNameToHook({ classMethod, apiGenName, isGet }: { classMethod: string; apiGenName: string; isGet: boolean }) {\n for (const [originalPrefix] of Object.entries(prefixMappings)) {\n if (classMethod.startsWith(originalPrefix)) {\n const methodName = !isGet ? versionMutationSuffixMethodName(classMethod) : classMethod\n return `use${apiGenName}_${capitalize(methodName)}`\n }\n }\n return classMethod\n}\n\n/**\n * Converts \"data: UpgradeHeadlessAccountV3Request, queryParams?: etc\"\n * To: \"input.data, input.queryParams\"\n */\nfunction convertToMethodImplArgs(methodArgs) {\n // Split the input string on commas to separate each property\n const properties = methodArgs\n .split(/,\\s*(?![^{}]*\\})/)\n .map(prop => prop.trim())\n .filter(Boolean)\n\n // Initialize an array to hold the formatted properties\n const formattedProperties = []\n\n // Process each property\n properties.forEach(prop => {\n // Check if the property includes an object (detecting a colon followed by a curly brace)\n if (prop.includes(': {')) {\n // Extract the property name, considering optional '?'\n const propertyName = prop.split(': {')[0].replace('?', '').trim()\n formattedProperties.push(`input.${propertyName}`)\n } else {\n // Regular property (no object)\n const colonIndex = prop.indexOf(':')\n const propertyName = prop.substring(0, colonIndex).replace('?', '').trim()\n formattedProperties.push(`input.${propertyName}`)\n }\n })\n\n // Join the formatted property names with ', '\n return formattedProperties.join(', ')\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { ParserUtils } from '../ParserUtils'\n\nexport const templateSdkSnippet = ({\n serviceNameTitle,\n apiName,\n snippetMethod,\n snippetApiArgs: snippetApiArgsParam\n}: {\n serviceNameTitle: string\n apiName: string\n snippetMethod: string\n snippetApiArgs: string[]\n}) => {\n const methodArr = snippetMethod.split('//')\n const snippetApiArgs = ['sdk', ...snippetApiArgsParam]\n\n let normMethod = normalizeMethodSnippet(methodArr[0].trim(), 'data:')\n normMethod = normalizeMethodSnippet(normMethod, 'queryParams:')\n normMethod = normalizeMethodSnippet(normMethod, 'queryParams?:')\n normMethod += '\\n\\n//' + methodArr[1]\n\n const sdkSnippet = `import { AccelByte } from '@accelbyte/sdk'\nimport { ${serviceNameTitle} } from '@accelbyte/sdk-${serviceNameTitle.toLowerCase()}'\n\nconst sdk = AccelByte.SDK({\n coreConfig: {\n baseURL: '__DOMAIN__',\n clientId: '77f88506b6174c3ea4d925f5b4096ce8',\n namespace: 'accelbyte',\n redirectURI: 'http://localhost:3030'\n }\n})\n\n${serviceNameTitle}.${apiName}(${snippetApiArgs.join(', ')})\n .${normMethod}`\n return sdkSnippet\n}\n\nconst normalizeMethodSnippet = (methodInput: any, splitWord: string) => {\n const split1 = methodInput.split(splitWord)\n if (!split1[1]) {\n return methodInput\n }\n let split2 = split1[1].trim()\n split2 = ParserUtils.replaceAll(split2, '{', '')\n split2 = ParserUtils.replaceAll(split2, '})', '')\n split2 = split2.split(',')\n let params = ''\n split2.forEach(p => {\n params += '\\n ' + ParserUtils.replaceAll(p.trim(), ')', '') + ','\n })\n params = params.slice(0, -1) // remove last , char\n\n const result = split1[0] + splitWord + ' {' + params + '\\n })'\n return result\n}\n","/*\n * Copyright (c) 2023-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport { ParserUtils } from '../ParserUtils'\nimport { Endpoint, OpenApiSpec } from '../Swagger'\nimport { templateApiMethod } from '../templates/template-api-method'\nimport { templateMethod } from '../templates/template-method'\nimport { templateQueryMethod } from '../templates/template-query-method'\nimport { templateSdkSnippet } from '../templates/template-sdk-snippet'\nimport { extractDescription, getPermission, getPermissionType } from './utils'\n\nconst GIT_URL = 'https://github.com/AccelByte/accelbyte-typescript-sdk/blob/main/packages'\n\nexport type Methods = 'get' | 'post' | 'put' | 'delete' | 'patch'\ntype SnippetMap = {\n [K in Methods]?: {\n web?: string\n webGit?: string\n shell?: string\n }\n}\n\ninterface Result {\n // 'Users V4': 'createUserInvite,createUser,patchUserMe,createTestUser,updateUserMeEmail,deleteUserMeMfaDevice,getUsersMeMfaFactor,postUserMeMfaFactor,getUsersMeMfaBackupCode,createUserMeMfaBackupCode,createUserMeMfaEmailCode,createUserMeHeadlesVerify,postUserMeMfaEmailEnable,createUserMeMfaEmailDisable,createUserInvite_ByInvitationId,createUserMeHeadlesCodeVerify,createUserMeMfaAuthenticatorKey,createUserMeMfaBackupCodeEnable,deleteUserMeMfaBackupCodeDisable,getUsersMeMfaBackupCodeDownload,postUserMeMfaAuthenticatorEnable,deleteUserMeMfaAuthenticatorDisable,'\n tagToSdkFunctionNamesRecord: Record<string, string>\n // 'Users V4': '\\n' +\n // ' \\n' +\n // ' /**\\n' +\n // ' * This endpoint is used to invite a game studio admin user with new namespace in multi tenant mode. It will return error if the service multi tenant mode is set to false. Request body details: - emailAddress: email address of the user to be invited - namespace: new namespace of the user to be created - namespaceDisplayName: display name of the new namespace The invited users will also be assigned with &#34;User&#34; role by default. \\n' +\n // ' */\\n' +\n // ' async function createUserInvite(data: PublicInviteUserRequestV4): Promise<InviteUserResponseV3> {\\n' +\n // ' const $ = new UsersV4$(Network.create(requestConfig), namespace, useSchemaValidation)\\n' +\n // ' const resp = await $.createUserInvite(data,)\\n' +\n // ' if (resp.error) throw resp.error\\n' +\n // ' return resp.response.data\\n' +\n // ' }\\n' +\n // ' \\n' +\n // ' \\n' +\n // ' /**\\n' +\n tagToSdkClientRecord: Record<string, string>\n // 'Users V4': '\\n' +\n // ' /**\\n' +\n // ' * This endpoint is used to invite a game studio admin user with new namespace in multi tenant mode. It will return error if the service multi tenant mode is set to false. Request body details: - emailAddress: email address of the user to be invited - namespace: new namespace of the user to be created - namespaceDisplayName: display name of the new namespace The invited users will also be assigned with &#34;User&#34; role by default. \\n' +\n // ' */\\n' +\n // ' createUserInvite(data: PublicInviteUserRequestV4): Promise<IResponse<InviteUserResponseV3>> {\\n' +\n // ' const params = {} as SDKRequestConfig\\n' +\n // \" const url = '/iam/v4/public/users/invite' \\n\" +\n // ' const resultPromise = this.axiosInstance.post(url, data, {params})\\n' +\n // '\\n' +\n // \" return Validate.responseType(() => resultPromise, InviteUserResponseV3, 'InviteUserResponseV3')\\n\" +\n // ' }\\n' +\n // ' \\n' +\n // ' /**\\n'\n tagToEndpointClassesRecord: Record<string, string>\n // For example:\n // 'Users V4': [\n // \"import { UpgradeHeadlessAccountWithVerificationCodeRequestV4 } from '../definitions/UpgradeHeadlessAccountWithVerificationCodeRequestV4.js'\",\n // \"import { UserCreateFromInvitationRequestV4 } from '../definitions/UserCreateFromInvitationRequestV4.js'\",\n // \"import { UpgradeHeadlessAccountRequestV4 } from '../definitions/UpgradeHeadlessAccountRequestV4.js'\",\n // \"import { EmailUpdateRequestV4 } from '../definitions/EmailUpdateRequestV4.js'\",\n // \"import { CreateTestUserRequestV4 } from '../definitions/CreateTestUserRequestV4.js'\",\n // \"import { UserUpdateRequestV3 } from '../definitions/UserUpdateRequestV3.js'\",\n // \"import { CreateUserRequestV4 } from '../definitions/CreateUserRequestV4.js'\",\n // \"import { PublicInviteUserRequestV4 } from '../definitions/PublicInviteUserRequestV4.js'\"\n // ]\n tagToSdkImportsRecord: Record<string, string[]>\n // UsersV4: {\n // InviteUserResponseV3: \"import { InviteUserResponseV3 } from '../definitions/InviteUserResponseV3.js'\",\n // CreateUserResponseV4: \"import { CreateUserResponseV4 } from '../definitions/CreateUserResponseV4.js'\",\n // UserResponseV3: \"import { UserResponseV3 } from '../definitions/UserResponseV3.js'\",\n // EnabledFactorsResponseV4: \"import { EnabledFactorsResponseV4 } from '../definitions/EnabledFactorsResponseV4.js'\",\n // BackupCodesResponseV4: \"import { BackupCodesResponseV4 } from '../definitions/BackupCodesResponseV4.js'\",\n // UserResponseV4: \"import { UserResponseV4 } from '../definitions/UserResponseV4.js'\",\n // AuthenticatorKeyResponseV4: \"import { AuthenticatorKeyResponseV4 } from '../definitions/AuthenticatorKeyResponseV4.js'\"\n // }\n tagToClassImportsRecord: Record<string, Record<string, string>>\n // [ 'PublicThirdPartyPlatformInfoArray', 'GetUserMappingV3Array' ].\n arrayDefinitions: string[]\n // {\n // '/some/path': {\n // web: '',\n // shell: '',\n // webGit: ''\n // }\n // }\n snippetMap: Record<string, SnippetMap>\n tagToEndpointQueryRecord: Record<string, string>\n /**\n * \"Users V4\": {\n * \"createUserInvite\": \"/** description here\"\n * }\n */\n tagToSdkFunctionDescription: Record<string, Record<string, string>>\n}\n\nexport class SwaggerReaderHelpers {\n private static getServicePrefix = (servicePaths: string[]) => servicePaths[servicePaths.length - 1].split('/')[1]\n\n static parseAllEndpoints = async ({\n api,\n sdkName,\n serviceName\n }: {\n api: OpenApiSpec\n sdkName: string\n serviceName: string\n }): Promise<{\n admin: Result\n public: Result\n }> => {\n const result: {\n admin: Result\n public: Result\n } = {\n admin: {\n arrayDefinitions: [],\n snippetMap: {},\n tagToClassImportsRecord: {},\n tagToEndpointClassesRecord: {},\n tagToSdkClientRecord: {},\n tagToSdkFunctionNamesRecord: {},\n tagToSdkImportsRecord: {},\n tagToEndpointQueryRecord: {},\n tagToSdkFunctionDescription: {}\n },\n public: {\n arrayDefinitions: [],\n snippetMap: {},\n tagToClassImportsRecord: {},\n tagToEndpointClassesRecord: {},\n tagToSdkClientRecord: {},\n tagToSdkFunctionNamesRecord: {},\n tagToSdkImportsRecord: {},\n tagToEndpointQueryRecord: {},\n tagToSdkFunctionDescription: {}\n }\n }\n const sortedPathsByLength = new Map(\n Object.entries(api.paths).sort((a, b) => {\n if (a[0].length === b[0].length) {\n return a[0].localeCompare(b[0])\n } else {\n return a[0].length - b[0].length\n }\n })\n )\n const sortedKeys = Array.from(sortedPathsByLength.keys())\n const servicePrefix = SwaggerReaderHelpers.getServicePrefix(sortedKeys)\n // This is to detect multiple naming conflicts, so we can append it with something else.\n const tagToClassMethodsMap: {\n admin: Record<string, Record<string, string>>\n public: Record<string, Record<string, string>>\n } = {\n admin: {},\n public: {}\n }\n\n for (const [path, operation] of sortedPathsByLength) {\n if (path.indexOf('/healthz') >= 0) {\n continue\n }\n\n const isAdminEndpoint = path.indexOf('/admin/') > -1\n\n const picked = isAdminEndpoint ? result.admin : result.public\n const {\n arrayDefinitions,\n snippetMap,\n tagToClassImportsRecord,\n tagToEndpointClassesRecord,\n tagToSdkClientRecord,\n tagToSdkFunctionNamesRecord,\n tagToSdkImportsRecord,\n tagToEndpointQueryRecord,\n tagToSdkFunctionDescription\n } = picked\n\n const tagToClassMethodsMapByType = isAdminEndpoint ? tagToClassMethodsMap.admin : tagToClassMethodsMap.public\n const generatedMethods = {} // { path_get: 'fetchSomething' }\n\n const httpMethods = Object.keys(operation)\n for (const httpMethod of httpMethods) {\n const endpoint = await Endpoint.parseAsync(operation[httpMethod]).catch(error => {\n console.error(JSON.stringify({ path, httpMethod }, null, 2))\n throw error\n })\n if (!endpoint.tags) continue\n\n const [tag] = endpoint.tags\n const pathWithBase = `${api.basePath ?? ''}${path}`\n const permissionType = getPermissionType(getPermission(endpoint))\n\n tagToClassMethodsMapByType[tag] = tagToClassMethodsMapByType[tag] ? tagToClassMethodsMapByType[tag] : {}\n const isForm = endpoint.consumes && endpoint.consumes[0] === 'application/x-www-form-urlencoded'\n const classMethod = ParserUtils.generateNaturalLangMethod({\n servicePrefix,\n path,\n httpMethod,\n isForm,\n existingMethods: tagToClassMethodsMapByType[tag],\n permissionType\n })\n\n tagToClassMethodsMapByType[tag][classMethod] = `${path} ${httpMethod}`\n generatedMethods[`${path} ${httpMethod}`] = `${classMethod}`\n\n if (!snippetMap[pathWithBase]) {\n // Initialize, if undefined.\n snippetMap[pathWithBase] = {}\n }\n\n const description = endpoint.description?.replace(/\\s+/g, ' ') || ''\n\n const responseClasses = ParserUtils.get2xxResponses(endpoint.responses)\n const responseClass = responseClasses.length > 1 ? null : responseClasses?.[0]\n const { className, classGenName } = ParserUtils.generateClassName(tag, isAdminEndpoint)\n tagToClassImportsRecord[className] = tagToClassImportsRecord[className] ? tagToClassImportsRecord[className] : {}\n if (responseClass) {\n tagToClassImportsRecord[className][responseClass] =\n `import { ${responseClass} } from '../../generated-definitions/${responseClass}.js'`\n }\n if (responseClass && responseClass.endsWith('Array')) {\n arrayDefinitions.push(responseClass)\n }\n\n const queryParams = ParserUtils.filterQueryParameters(endpoint.parameters)\n const isFormUrlEncoded = ParserUtils.isFormUrlEncoded(httpMethod, endpoint.consumes)\n const pathParams = ParserUtils.filterPathParams(endpoint.parameters)\n let bodyParams = ParserUtils.filterBodyParams(endpoint.parameters)\n const deprecated = !!endpoint.deprecated\n\n // Handling requestBody in swagger v3 `templateMethod` expect `bodyParams` to be array, so for now we convert\n // requestBody format to array params\n if (endpoint.requestBody) {\n bodyParams = [\n {\n name: 'body',\n in: 'body',\n schema: endpoint.requestBody.content['application/json']?.schema\n }\n ]\n }\n\n // -- classes\n const { methodImpl, methodParams, methodParamsNoTypes, importStatements } = templateMethod({\n classMethod,\n description,\n httpMethod,\n path: pathWithBase,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded,\n responseClasses,\n deprecated\n })\n\n tagToEndpointClassesRecord[tag] = (tagToEndpointClassesRecord[tag] || '') + methodImpl\n const { apiGenName } = ParserUtils.generateApiName(tag, isAdminEndpoint)\n const queryMethodImpl = templateQueryMethod({\n classMethod,\n httpMethod,\n path: pathWithBase,\n pathParams,\n responseClasses,\n methodParams,\n apiGenName,\n deprecated,\n description\n })\n tagToEndpointQueryRecord[tag] = (tagToEndpointQueryRecord[tag] || '') + queryMethodImpl\n\n const fnDescription = extractDescription(description, { isDeprecated: deprecated, responseClasses })\n const tagFnDescriptions = tagToSdkFunctionDescription[tag]\n tagToSdkFunctionDescription[tag] = {\n ...tagFnDescriptions,\n [classMethod]: fnDescription\n }\n\n // -- apis\n const { generatedMethodString, snippetApiArgs, snippetMethod, snippetShell } = templateApiMethod({\n classMethod,\n httpMethod,\n path: pathWithBase,\n pathParams,\n bodyParams,\n responseClasses,\n classGenName,\n methodParams,\n methodParamsNoTypes,\n xSecurity: endpoint['x-security']\n })\n tagToSdkClientRecord[tag] = (tagToSdkClientRecord[tag] || '') + generatedMethodString\n tagToSdkFunctionNamesRecord[tag] = (tagToSdkFunctionNamesRecord[tag] || '') + classMethod + ','\n\n // -- dependencies\n tagToSdkImportsRecord[tag] = tagToSdkImportsRecord[tag]\n ? [...new Set([...importStatements, ...tagToSdkImportsRecord[tag]])]\n : [...new Set(importStatements)]\n\n const serviceNameTitle = ParserUtils.convertDashesToTitleCase(serviceName)\n const resultSnippet = templateSdkSnippet({\n serviceNameTitle,\n apiName: apiGenName,\n snippetMethod,\n snippetApiArgs\n })\n\n // -- snippets\n const currentSnippetMap: SnippetMap[Methods] = {}\n snippetMap[pathWithBase][httpMethod as Methods] = currentSnippetMap\n currentSnippetMap.web = resultSnippet\n const generatedDirName = isAdminEndpoint ? 'generated-admin' : 'generated-public'\n currentSnippetMap.webGit = GIT_URL + `/sdk-${sdkName}/src/${generatedDirName}/${apiGenName}.ts`\n // Put this last to preserve the previous order.\n currentSnippetMap.shell = snippetShell\n }\n }\n\n for (const key in result) {\n // De-duplicate.\n result[key as keyof typeof result].arrayDefinitions = Array.from(new Set(result[key as keyof typeof result].arrayDefinitions))\n }\n\n return result\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nexport const templateApiIndex = (serviceNameTitle: string, apiList: string[], isGenerateWebSocket: boolean = false): string => {\n let imports = ''\n let returnStatement = ''\n for (const cl of apiList) {\n // We have to exclude AdminApi as it was the title of the section\n // in swagger, but it has public/admin version of the endpoint too\n const dir = cl.toLowerCase().includes('admin') && cl !== 'AdminApi' ? 'generated-admin' : 'generated-public'\n imports += `\\nimport { ${cl} } from './${dir}/${cl}.js'`\n returnStatement += `\\n${cl}, `\n }\n\n if (isGenerateWebSocket) {\n imports += `\\nimport { WebSocketClass } from './generated-websocket/WebSocketClass.js'`\n returnStatement += `\\nWebSocket: WebSocketClass, `\n }\n\n return `/**\n * AUTO GENERATED\n */\n${imports}\nimport { author, name, version } from '../package.json'\n\nconsole.log(\\`\\${name}@\\${version}\\`)\n\nconst apis = {\n${returnStatement}\n version: () => console.log({\n version,\n name,\n author\n })\n}\n\nexport const ${serviceNameTitle} = apis\n `\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { ParserUtils } from '../ParserUtils'\nimport { Definition } from '../Swagger'\n\n// The expected output that we return from most of the functions below.\n// Normally, we will mostly use `schemaString`. In some unique cases\n// where there are recursive types, we cannot infer type. Hence, we need\n// to store the TypeScript syntax so we can write them manually.\ninterface ResultType {\n schemaString: string\n typeString: string\n}\n\nexport class TemplateZod {\n duplicates: Map<string, string>\n duplicateFound = false\n //\n private importClasses = new Set()\n\n // --\n render = (fileName: string, definition: Definition, duplicates: Map<string, string>) => {\n this.duplicates = duplicates\n const content = this.parseToZodSchema(definition, definition.required || [])\n\n // Prevent self-importing and handle recursive types.\n const containsRecursiveType = this.importClasses.has(fileName)\n if (containsRecursiveType) {\n this.importClasses.delete(fileName)\n }\n\n let imports = ''\n for (const cl of Array.from(this.importClasses).sort()) {\n imports += `import { ${cl} } from './${cl}.js'\\n`\n }\n\n // Modify export variable string, based on existence of recursive types.\n // Reference: https://github.com/colinhacks/zod#recursive-types.\n let exportedVariableString: string\n let exportedTypeString: string\n\n if (containsRecursiveType) {\n // If it contains recursive type, then we need to modify the exported variable in a way,\n // so that there are no TypeScript errors.\n exportedVariableString = `\nexport const ${fileName}: z.ZodType<${fileName}> = z.lazy(() =>\n ${content.schemaString}\n )\n `\n exportedTypeString = `\nexport interface ${fileName} {\n ${content.typeString}\n}\n`\n } else {\n // Export normally by writing the `z.ZodObject` and type inferring with `z.TypeOf`.\n exportedVariableString = `export const ${fileName} = ${content.schemaString}`\n exportedTypeString = `export interface ${fileName} extends z.TypeOf<typeof ${fileName}> {}`\n }\n\n const template = `import { z } from 'zod'\n${imports}\n\n${exportedVariableString}\n\n${exportedTypeString}\n `\n return { buffer: template, duplicateFound: this.duplicateFound }\n }\n\n // --\n parseToZodSchema = (definition, requiredAttrs): ResultType => {\n if (definition.additionalProperties) {\n return this.parseToZodAttribute('', definition, [])\n }\n\n let properties: [string, any]\n if (definition.properties) {\n properties = Object.entries(definition.properties) as [string, any]\n } else if (definition.items?.properties) {\n properties = Object.entries(definition.items.properties) as [string, any]\n } else {\n return {\n schemaString: 'z.any()',\n typeString: 'any'\n }\n }\n\n const schemaFields: string[] = []\n const typeFields: string[] = []\n\n for (const property of properties) {\n const [name, definition] = property\n const result = this.parseToZodAttribute(name, definition, requiredAttrs)\n\n schemaFields.push(result.schemaString)\n typeFields.push(result.typeString)\n }\n\n if (definition?.type === 'array') {\n return {\n schemaString: `z.array(z.object({${schemaFields.join(',')}}))`,\n typeString: typeFields.join(';')\n }\n }\n\n return {\n schemaString: `z.object({${schemaFields.join(',')}})`,\n typeString: typeFields.join(';')\n }\n }\n\n // --\n parseToZodAttribute = (name, definition, requiredAttrs): ResultType => {\n // Required field syntax.\n // Empty name check is required for fields with type records.\n const isRequired = requiredAttrs.includes(name) || name === ''\n const schemaRequired = isRequired ? '' : '.nullish()'\n const typeRequired = isRequired ? '' : '?'\n const typeNullishability = isRequired ? '' : ' | null | undefined'\n // Field name syntax.\n const schemaAttribute = name ? `'${name}':` : ''\n const typeAttribute = name ? `'${name}'${typeRequired}:` : ''\n\n const type = definition?.type\n\n if (definition.properties) {\n const result = this.parseToZodSchema(definition, requiredAttrs)\n return {\n schemaString: `${schemaAttribute} ${result.schemaString}${schemaRequired}`,\n typeString: `${typeAttribute} ${result.typeString}${typeNullishability}`\n }\n } else if (type) {\n if (type === 'object' && definition.additionalProperties) {\n const zodAttribute = this.parseToZodAttribute('', definition.additionalProperties, [''])\n return {\n schemaString: `${schemaAttribute} z.record(${zodAttribute.schemaString})${schemaRequired}`,\n typeString: `${typeAttribute} Record<string, ${zodAttribute.typeString}>${typeNullishability}`\n }\n }\n\n if (type === 'object' && !definition.additionalProperties && !name) {\n return {\n schemaString: `z.any()`,\n typeString: 'any'\n }\n }\n\n if (type === 'object' && !definition.additionalProperties) {\n return {\n schemaString: `${schemaAttribute} z.record(z.any())${schemaRequired}`,\n typeString: `${typeAttribute} Record<string, any>${typeNullishability}`\n }\n }\n\n if (type === 'integer' || type === 'number') {\n const effectiveType = getZodNumberType(type)\n return {\n schemaString: `${schemaAttribute} z.${effectiveType.schemaString}()${schemaRequired}`,\n typeString: `${typeAttribute} ${effectiveType.typeString}${typeNullishability}`\n }\n }\n\n if (type === 'array') {\n const items = definition.items\n const ref = items?.$ref\n let model: ResultType\n if (ref) {\n const refType = ParserUtils.parseRefType(ref)\n this.importClasses.add(refType)\n\n model = {\n schemaString: refType,\n typeString: refType\n }\n } else if (items) {\n if (items.type === 'array') {\n const ref = items.items?.$ref\n if (ref) {\n const refType = ParserUtils.parseRefType(ref)\n this.importClasses.add(refType)\n\n model = {\n schemaString: refType,\n typeString: refType\n }\n } else if (items.items) {\n model = this.parseEnumItems(items.items)\n }\n return {\n schemaString: `${schemaAttribute} z.array(z.array(${model.schemaString}))${schemaRequired}`,\n typeString: `${typeAttribute} ${model.typeString}[]${typeNullishability}`\n }\n } else {\n model = this.parseEnumItems(items)\n }\n } else {\n return {\n schemaString: `${schemaAttribute} z.array(z.any())${schemaRequired}`,\n typeString: `${typeAttribute} any[]${typeNullishability}`\n }\n }\n return {\n schemaString: `${schemaAttribute} z.array(${model.schemaString})${schemaRequired}`,\n typeString: `${typeAttribute} ${model.typeString}[]${typeNullishability}`\n }\n }\n\n if (type !== 'object') {\n const result = extractEnumObject(type, isRequired, definition.enum)\n return {\n schemaString: `${schemaAttribute} ${result.schemaString}`,\n typeString: `${typeAttribute} ${result.typeString}`\n }\n }\n }\n\n const ref = definition.$ref\n let model = `z.record(z.any())`\n\n if (ref) {\n model = ParserUtils.parseRefType(ref)\n\n const fullModelName = ref.replace('#/definitions/', '')\n this.duplicateFound = this.duplicates.has(fullModelName)\n if (this.duplicateFound) {\n model = this.duplicates.get(fullModelName)\n }\n this.importClasses.add(model)\n model = `${model}`\n }\n\n return {\n schemaString: `${schemaAttribute} ${model}${schemaRequired}`,\n typeString: `${typeAttribute} ${model}${typeNullishability}`\n }\n }\n\n parseEnumItems = (items): ResultType => {\n if (items.enum) {\n const enumStr = items.enum.map(e => {\n return `\"${e}\"`\n })\n return {\n schemaString: `z.enum([${enumStr}])`,\n typeString: `(${enumStr.join(' | ')})`\n }\n }\n\n if (items.type === 'object') {\n return this.parseToZodSchema(items, items.required)\n }\n\n let effectiveType: ResultType\n if (items.type === 'integer' || items.type === 'number') {\n effectiveType = getZodNumberType(items.type)\n } else {\n effectiveType = { typeString: items.type, schemaString: items.type }\n }\n\n return {\n schemaString: `z.${effectiveType.schemaString}()`,\n typeString: effectiveType.typeString\n }\n }\n}\n\nexport class TemplateZodArray {\n //\n render = name => {\n const cls = name.replace('Array', '')\n const template = `import { z } from 'zod'\nimport { ${cls} } from './${cls}.js'\n \nexport const ${name} = z.array(${cls})\n\nexport interface ${name} extends z.TypeOf<typeof ${name}> {}\n `\n return template\n }\n}\n\nconst getZodNumberType = (type: string) => {\n // In Swagger, integer and number are different types.\n // As such, we need to map them separately.\n // Example how to use:\n //\n // if (type === 'integer' || type === 'number') return getZodNumberType(type);\n //\n // Reference 1: https://swagger.io/docs/specification/data-models/data-types/.\n // Reference 2: https://github.com/colinhacks/zod#numbers.\n if (type === 'integer') {\n return {\n schemaString: 'number().int',\n typeString: 'number'\n }\n }\n\n return {\n schemaString: type,\n typeString: type\n }\n}\n\nconst extractEnumObject = (type: string, isRequired: boolean, enumArr?: string[]): ResultType => {\n const schemaRequired = isRequired ? '' : '.nullish()'\n const typeNullishability = isRequired ? '' : ' | null | undefined'\n if (enumArr) {\n const enumStr = enumArr.map(e => {\n return `\"${e}\"`\n })\n return {\n schemaString: `z.enum([${enumStr}])${schemaRequired}`,\n typeString: `(${enumStr.join(' | ')}${typeNullishability})`\n }\n }\n return {\n schemaString: `z.${type}()${schemaRequired}`,\n typeString: `${type}${typeNullishability}`\n }\n}\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport * as https from 'https'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { CliParser } from './CliParser'\n\n/**\n * This file iterates over intended API configs and downloads the swagger files to target location from --swaggersOutput argument\n *\n * e.g\n * /packages\n * /od-config\n * /codegen\n * /swaggers\n * serviceName.json --> example \"iam.json\"\n */\nexport class SwaggerDownloader {\n static getDestFile = (targetFileName: string) => {\n const destPath = CliParser.getResolvedSwaggersOutputPath()\n const destFile = path.join(destPath, targetFileName)\n if (fs.existsSync(destFile)) return destFile\n if (!fs.existsSync(destPath)) fs.mkdirSync(destPath)\n fs.writeFileSync(destFile, '')\n return destFile\n }\n\n // session-api.json contains illegal URL encoded character that breaks the codegen\n // e.g. \"$ref\": \"#/definitions/map%5Bstring%5Dinterface%20%7B%7D\"\n static postSanitizeDownloadedFile = filePath => {\n const searchStr = ['%5B', '%5D', '%20', '%7B', '%7D'] // url encoded\n fs.readFile(filePath, 'utf8', (err, data) => {\n if (err) throw err\n // Replace all occurrences of the search string with the replace string\n let result = data\n searchStr.forEach(s => {\n result = result.replace(new RegExp(s, 'g'), ' ')\n })\n // Write the updated contents to the file\n fs.writeFile(filePath, result, 'utf8', err => {\n if (err) throw err\n console.log('File updated successfully.')\n })\n })\n }\n\n static downloadFile = async (targetFileName: string, url: string) => {\n const destFile = SwaggerDownloader.getDestFile(targetFileName)\n let data = ''\n\n return new Promise(resolve => {\n const request = https.get(url, function (response) {\n response.on('data', chunk => {\n data += chunk\n })\n response.on('end', () => {\n if (response.statusCode !== 200) {\n console.log(`SwaggerDownload error with status code: ${response.statusCode}`)\n } else {\n fs.writeFileSync(destFile, JSON.stringify(JSON.parse(data), null, 2), 'utf-8')\n SwaggerDownloader.postSanitizeDownloadedFile(destFile)\n console.log(`SwaggerDownload ${url} completed with status code: ${response.statusCode}`)\n }\n\n resolve(undefined)\n })\n })\n request.on('error', (err: Error) => {\n console.log(`SwaggerDownloader failed for \"${targetFileName}\" and \"${url}\"`, err)\n })\n })\n }\n\n static main = async () => {\n const swaggers = CliParser.getConfigFile()\n for (const ref in swaggers) {\n const targetFileName = swaggers[ref][2]\n const url = swaggers[ref][3]\n await SwaggerDownloader.downloadFile(targetFileName, url)\n }\n }\n}\n","import fs from 'fs'\nimport path from 'path'\nimport { CliParser } from './CliParser'\nimport { ParserUtils } from './ParserUtils'\nimport { templateWebsocketClass } from './templates/template-ws-class'\nimport { Schema, templateWebsocketDefinitions } from './templates/template-ws-defintions'\n\nexport class WebsocketGenerator {\n static srcFolder = () => CliParser.getOutputPath()\n\n static outputFolder = () => path.join(this.srcFolder(), 'generated-websocket')\n\n static schemaContent = () => {\n const fileContent: Schema = JSON.parse(fs.readFileSync(CliParser.getWebSocketSchemaPath(), 'utf8'))\n return fileContent\n }\n\n static prepareDirs = () => {\n ParserUtils.mkdirIfNotExist(this.outputFolder())\n }\n\n static main = () => {\n const { name, path: wsPath, definitions } = this.schemaContent()\n const templateDefinitions = templateWebsocketDefinitions(definitions)\n\n this.prepareDirs()\n\n const filePath = path.join(this.outputFolder(), 'WebSocketDefinitions.ts')\n fs.writeFileSync(filePath, templateDefinitions, 'utf8')\n\n const templateClass = templateWebsocketClass(name, wsPath, definitions)\n\n const filePathClass = path.join(this.outputFolder(), 'WebSocketClass.ts')\n fs.writeFileSync(filePathClass, templateClass, 'utf8')\n }\n}\n","import { capitalize } from '../helpers/utils'\nimport { Definition, Schema } from './template-ws-defintions'\n\nconst definitionToFunctionName = (type: string) => {\n if (type.endsWith('Request')) {\n return 'send' + capitalize(type.slice(0, type.length - 7))\n }\n return type\n}\n\nconst renderSendFunction = (name: string, definition: Definition) => {\n const functionName = definitionToFunctionName(name)\n\n return `const ${functionName} = (data: Omit<Definitions.${capitalize(name)}, 'type'>) => {\n send({ type: '${name}', ...data })\n }`\n}\n\nexport const templateWebsocketClass = (name: string, path: string, definitions: Schema['definitions']) => {\n const requestDefinitions = Object.keys(definitions)\n .filter(key => {\n const val = definitions[key]\n return val['x-type'] == 'request'\n })\n .map(key => [key, definitions[key]] as const)\n\n return `/* eslint-disable camelcase */\n/* eslint-disable no-inner-declarations */\n// @ts-ignore -> ts-expect-error TS6133\nimport { AccelByteSDK, RefreshToken, SdkSetConfigParam } from '@accelbyte/sdk'\nimport * as Definitions from './WebSocketDefinitions'\n\nconst messageParser = (data: string) => {\n const toVal = (str?: string) => {\n if (str) {\n if (str.startsWith('[') && str.endsWith(']')) {\n return str\n .slice(1, str.length - 1)\n .split(',')\n .filter(v => v !== '')\n }\n }\n return str\n }\n\n const entries = data.split('\\\\n')\n .filter(line => line !== '')\n .map(line => {\n const [key, valStr] = line.split(': ')\n return [key, toVal(valStr)]\n })\n\n return Object.fromEntries(entries)\n}\n\nconst messageSerializer = (data: Record<string, any>) => {\n return Object.keys(data)\n .map(key => {\n const toStr = (val: any) => {\n // array\n if (Array.isArray(val)) {\n return \\`[\\${String(val)}]\\`\n }\n // null, undefined\n if (!val) {\n return ''\n }\n return String(val)\n }\n const val = data[key]\n const valStr = toStr(val)\n\n return \\`\\${key}: \\${valStr}\\`\n })\n .join('\\\\n')\n}\n\nexport function WebSocketClass(sdk: AccelByteSDK, args?: SdkSetConfigParam) {\n const sdkAssembly = sdk.assembly()\n const baseURL = (args?.coreConfig?.baseURL ?? sdkAssembly.coreConfig.baseURL).replace('http', 'ws')\n const path = '${path}'\n const url = baseURL + path\n let ws: WebSocket | null = null\n let isDisconnectManually = false\n const allowReconnect = sdkAssembly.webSocketConfig.allowReconnect ?? true\n const maxReconnectAttempts = sdkAssembly.webSocketConfig.maxReconnectAttempts ?? 0\n let reconnectAttempts = maxReconnectAttempts\n\n const connect = () => {\n const token = sdk.getToken()\n\n if (!token.accessToken) {\n console.warn('No access token, please login first')\n return\n }\n\n if (!ws) {\n ws = new WebSocket(url, token.accessToken)\n }\n }\n\n const refreshToken = async () => {\n const { refreshToken } = sdk.getToken()\n if (refreshToken) {\n const refresh = new RefreshToken({\n config: {\n axiosConfig: sdkAssembly.axiosConfig.request,\n clientId: sdkAssembly.coreConfig.clientId,\n refreshToken\n }\n })\n const result = await refresh.runWithLock()\n if (result) {\n sdk.setToken({\n accessToken: result.access_token,\n refreshToken: result.refresh_token\n })\n return true\n }\n }\n return false\n }\n\n const handleReconnect = async (ev: CloseEvent) => {\n if (!allowReconnect || isDisconnectManually || !sdk.getToken().accessToken) return\n // token revoked\n if (ev.code === 4020) {\n await refreshToken()\n reconnectAttempts--\n connect()\n } else if (ev.code >= 1001 && ev.code <= 2999) {\n // Only reconnect if codes in range 1001-2999\n if (!ws || ws.readyState !== ws.OPEN) return\n\n if (maxReconnectAttempts === 0) {\n setTimeout(() => {\n connect()\n }, 1000)\n } else if (reconnectAttempts !== 0) {\n setTimeout(() => {\n reconnectAttempts--\n connect()\n }, 1000)\n }\n }\n }\n\n const disconnect = (code?: number, reason?: string) => {\n if (ws) {\n ws.close(code, reason)\n isDisconnectManually = true\n ws = null\n }\n }\n\n const send = (message: Definitions.WebSocketRequest) => {\n if (ws) {\n ws.send(messageSerializer(message))\n }\n }\n\n const sendRaw = (rawMessage: string) => {\n if (ws) {\n ws.send(rawMessage)\n }\n }\n\n const onOpen = (cb: () => any) => {\n if (ws) {\n function listener(this: WebSocket, _ev: Event) {\n isDisconnectManually = false\n reconnectAttempts = maxReconnectAttempts\n cb()\n }\n ws.addEventListener('open', listener)\n return {\n removeEventListener: () => ws?.removeEventListener('open', listener)\n }\n }\n return {}\n }\n\n const onClose = (cb: (ev: CloseEvent) => any) => {\n if (ws) {\n function listener(this: WebSocket, ev: CloseEvent) {\n handleReconnect(ev)\n cb(ev)\n }\n ws.addEventListener('close', listener)\n return {\n removeEventListener: () => ws?.removeEventListener('close', listener)\n }\n }\n return {}\n }\n\n const onMessage = (cb: (message: Definitions.WebSocketResponseOrNotification | string) => any, raw: boolean = false) => {\n if (ws) {\n function listener(this: WebSocket, ev: MessageEvent<any>) {\n if (raw) {\n cb(ev.data)\n } else {\n const result = Definitions.WebSocketResponseOrNotification.parse(messageParser(ev.data))\n cb(result)\n }\n }\n ws.addEventListener('message', listener)\n return {\n removeEventListener: () => ws?.removeEventListener('message', listener)\n }\n }\n return {}\n }\n\n const onError = (cb: (err: any) => any) => {\n if (ws) {\n function listener(this: WebSocket, err: any) {\n cb(err)\n }\n ws.addEventListener('error', listener)\n return {\n removeEventListener: () => ws?.removeEventListener('error', listener)\n }\n }\n return {}\n }\n\n ${requestDefinitions.map(([name, definition]) => renderSendFunction(name, definition)).join(`\\n\\n `)}\n\n return {\n instance: ws,\n connect,\n disconnect,\n send,\n sendRaw,\n onOpen,\n onClose,\n onMessage,\n onError,\n ${requestDefinitions.map(([name, _]) => definitionToFunctionName(name)).join(',\\n ')}\n }\n}\n\n`\n}\n","import { capitalize } from '../helpers/utils'\n\nexport type Property =\n | { type: 'boolean' }\n | { type: 'string'; format?: 'date-time' }\n | { type: 'integer' }\n | { type: 'array'; items: Property }\n | { type: 'object'; additionalProperties: Property }\n\nexport type Definition = {\n properties?: Record<string, Property>\n required?: string[]\n type: 'object'\n 'x-pair': string\n 'x-tag': string\n 'x-type': 'request' | 'response' | 'notification'\n}\n\nexport type Schema = {\n name: string\n path: string\n definitions: Record<string, Definition>\n}\n\nconst renderZod = (property: Property) => {\n switch (property.type) {\n case 'string':\n return `z.coerce.string()`\n\n case 'integer':\n return `z.coerce.number()`\n\n case 'boolean':\n return `z.boolean()`\n\n case 'array':\n return `z.array(${renderZod(property.items)})`\n\n default:\n return `z.any()`\n }\n}\n\nconst renderProperty = (name: string, type: Definition['x-type'], property: Property, required?: string[]) => {\n const isRequired = required && required.includes(name)\n\n return `${name}: ${renderZod(property)}${isRequired || type != 'request' ? '' : '.optional()'}`\n}\n\nconst renderDefinition = (name: string, definition: Definition) => {\n const capitalizedName = capitalize(name)\n\n if (definition.properties) {\n const properties = Object.entries(definition.properties)\n\n return `export const ${capitalizedName} = z.object({\n type: z.literal(\"${name}\"),\n ${properties.map(([name, property]) => renderProperty(name, definition['x-type'], property, definition.required)).join(',\\n ')}\n})\n\nexport type ${capitalizedName} = z.infer<typeof ${capitalizedName}>\n`\n }\n return ''\n}\n\nconst renderAllDefinitions = (definitions: Schema['definitions']) => {\n if (definitions) {\n const definitionEntries = Object.entries(definitions)\n\n return definitionEntries.map(([name, definition]) => renderDefinition(name, definition)).join('\\n\\n')\n }\n return ''\n}\n\nconst renderUnion = (type: Definition['x-type'] | Definition['x-type'][], definitions: Schema['definitions']) => {\n if (definitions) {\n let capitalizedType = ''\n if (typeof type === 'string') {\n capitalizedType = capitalize(type)\n } else {\n capitalizedType = type.map(t => capitalize(t)).join('Or')\n }\n\n const filteredDefinitions = Object.entries(definitions)\n .filter(([_, def]) => {\n if (typeof type === 'string') {\n return def['x-type'] === type\n } else {\n return type.includes(def['x-type'])\n }\n })\n .map(([name, _]) => capitalize(name))\n\n return `export const WebSocket${capitalizedType} = z.discriminatedUnion(\"type\", [\n ${filteredDefinitions.join(',\\n ')}\n])\n \nexport type WebSocket${capitalizedType} = z.infer<typeof WebSocket${capitalizedType}>`\n }\n return ''\n}\n\nexport const templateWebsocketDefinitions = (definitions: Schema['definitions']) => {\n return `/**\n * AUTO GENERATED\n */\n\nimport { z } from 'zod'\n\n${renderAllDefinitions(definitions)}\n\n${renderUnion('request', definitions)}\n\n${renderUnion(['response', 'notification'], definitions)}\n`\n}\n"],"mappings":"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","names":["import_path","yargs","fs","import_fs","import_path","import_fs","import_path","import_fs","_","type","makeNewImportVarMap","getImportableVarMap","getImportableVarMap","makeNewImportVarMap","generateImports","path","path","_","defaultValue","bodyParams","bodyParam","fs","import_zod","Operation","path","path","path","path","definition","ref","model","SwaggerParser","path","api","fs","fs","path","err","resolve","import_fs","import_path","path","name","_","name","_","path","fs","templateClass","path","yargs"]}