@accelbyte/codegen 1.0.0-beta.6 → 1.0.1-experimental.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"accelbyte-codegen.mjs","sources":["../src/CliParser.ts","../src/templates/template-class.ts","../src/templates/template-jsdoc-file.ts","../src/ParserUtils.ts","../src/Swagger.ts","../src/templates/template-method.ts","../src/templates/template-zod.ts","../src/CodeGenerator.ts","../src/SwaggerDownloader.ts","../src/cli.ts"],"sourcesContent":["/*\n * Copyright (c) 2022-2023 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 { Argv } from 'yargs'\nimport { z } from 'zod'\nimport fs from 'fs'\nimport * as path from 'path'\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 admin: 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 isAdmin = (): boolean => {\n return CliParser.instance().argv.admin\n }\n\n public static getSnippetOutputPath = (): string => {\n return CliParser.instance().argv.snippetOutput\n }\n}\n","/*\n * Copyright (c) 2018-2022 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', 'SdkCache', 'IResponse', 'IResponseWithSync', 'Validate'],\n axios: ['AxiosRequestConfig', 'AxiosResponse'],\n zod: ['z']\n})\n\nconst makeNewImportVarMap = () => ({\n axios: ['AxiosInstance'],\n '@accelbyte/sdk': ['SDKRequestConfig']\n})\n\nconst generateImports = (body: string, importStatements: string[]) => {\n const usedImportVarMap = makeNewImportVarMap()\n const importableVarMap = getImportableVarMap()\n\n for (const [moduleSource, importableVars] of Object.entries(importableVarMap)) {\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\n const generatedImports = Object.keys(usedImportVarMap)\n .sort()\n .map((moduleSource: string) => `import { ${usedImportVarMap[moduleSource].sort().join(', ')} } from '${moduleSource}'`)\n .join('\\n')\n return `${generatedImports}\\n${importStatements.sort().join('\\n')}`\n}\n\nexport const templateClass = (className: string, body: string, importStatements: string[]): string =>\n `/**\n * DON'T EDIT THIS FILE, it is AUTO GENERATED\n */\n${generateImports(body, importStatements)}\n\nexport class ${className} {\n // @ts-ignore\n constructor(private axiosInstance: AxiosInstance, private namespace: string, private cache = false) {}\n ${body}\n}\n `\n","/*\n * Copyright (c) 2018-2022 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nexport const templateJsdocFile = (apiName, body) =>\n `\n\\`\\`\\`\nSDK.getService('${apiName}', authHeader):\n${body}\n\n\\`\\`\\`\n`\n .replace(/, \\)/g, ')')\n .trim()\n","/*\n * Copyright (c) 2018-2023 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 { Endpoint, EndpointParameters } from './Swagger'\nimport { templateClass } from './templates/template-class'\nimport { templateJsdocFile } from './templates/template-jsdoc-file'\nimport { CliParser } from './CliParser'\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 generateClassName = (tag: string) => {\n const className = _.upperFirst(_.camelCase(tag))\n const classGenName = CliParser.isAdmin() ? className + 'Admin$' : className + '$'\n return { className, classGenName }\n }\n\n static parseQueryParamAttributeDefault = (definition: EndpointParameters) => {\n const attrName = definition.name.slice(definition.name.lastIndexOf('.') + 1)\n const defaultValue = definition.type === 'string' ? `'${definition.default}'` : definition.default\n return `${attrName}: ${defaultValue}`\n }\n\n static parseType = (pathParam: EndpointParameters) => {\n if (pathParam.type === 'int' || pathParam.type === 'integer' || pathParam?.schema?.type === 'integer') return 'number'\n if (pathParam.type === 'array') return `${pathParam.items.type ?? 'any'}[]`\n if (pathParam?.schema?.type === 'array') return `${pathParam.schema.items.type ?? 'any'}[]`\n if (pathParam?.schema?.type) return pathParam.schema.type\n return pathParam.type\n }\n\n static parseQueryParamsType = (queryParams: EndpointParameters[]) => {\n return queryParams.map(queryParam => ParserUtils.parseAttributeType(queryParam)).join(',')\n }\n\n static isAnyQueryParamRequired = (queryParams: EndpointParameters[]) => {\n return queryParams.some(queryParam => queryParam.required)\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(ParserUtils.parseRefImport).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 './definitions/${type}'`\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?.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) {\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 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 get2xxResponse(methodEntity: Endpoint['responses']): string {\n const keys = Object.keys(methodEntity)\n let responseClass = null\n keys.forEach(key => {\n if (String(key).startsWith('2')) {\n const sch = methodEntity[key].schema\n const schV3 = methodEntity[key].content && methodEntity[key].content['application/json'].schema\n if (sch?.$ref) {\n responseClass = ParserUtils.parseRefType(sch.$ref)\n } else if (sch?.type === 'array' && sch.items?.$ref) {\n responseClass = ParserUtils.parseRefType(sch.items.$ref)\n responseClass = `${responseClass}Array` // Adds support for z.array() types\n } else if (schV3?.$ref) {\n responseClass = 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 })\n\n return responseClass\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 }) => {\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_ = replaceAll(path_, 'ies/', 'y/') // parties, countries, policies\n path_ = 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) + genPath)\n generatedMethod = replaceAll(generatedMethod, 'Byword', '_By') // lodash remvoes the '_'\n generatedMethod = resolveConflicts(path, generatedMethod, existingMethods)\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 writeJsdocFile(distDir: string, nameArray: string[], apiBuffer: string) {\n const jsdocFile = templateJsdocFile(nameArray[0], apiBuffer)\n fs.writeFileSync(`${distDir}/docs/${nameArray[0]}.md`, jsdocFile)\n }\n\n static writeSnippetFile(distDir: string, name: string, docBuffer: string) {\n fs.writeFileSync(`${distDir}/${name}.json`, 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, isAdminWebSdk: boolean) {\n ParserUtils.mkdirIfNotExist(distDir)\n fs.writeFileSync(path.join(distDir, `all-${isAdminWebSdk ? 'admin' : 'public'}-imports.ts`), ParserUtils.prependCopyrightHeader(buffer))\n }\n\n static writeVersionFile(distDir: string, fileName: string, serviceName: string, apiInfo, buildDate) {\n const ver = apiInfo.version ? `'${apiInfo.version}'` : undefined\n fs.writeFileSync(\n `${distDir}/${fileName}`,\n `export default {\n title: '${serviceName}',\n name: '${apiInfo.title}',\n version: ${ver},\n buildDate: '${buildDate}'\n}\n`\n )\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-web-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\nconst replaceAll = (string, search, replace) => {\n return string.split(search).join(replace)\n}\n\nconst mappedMethod = (httpMethod: string, isForm: boolean) => {\n if (httpMethod === 'get') {\n return 'fetch'\n } else if (httpMethod === 'post' && isForm) {\n return 'post'\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, existingMethods) => {\n // generatedMethod = generatedMethod.replace('Namespaces', '')\n try {\n testConflict(path, generatedMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/namespaces/') >= 0) {\n generatedMethod += '_ByNS'\n }\n }\n\n try {\n testConflict(path, generatedMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/v4/') >= 0) {\n generatedMethod += '_v4'\n }\n }\n\n try {\n testConflict(path, generatedMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/v3/') >= 0) {\n generatedMethod += '_v3'\n }\n }\n\n try {\n testConflict(path, generatedMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/v2/') >= 0) {\n generatedMethod += '_v2'\n }\n }\n\n try {\n testConflict(path, generatedMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/admin/') >= 0) {\n generatedMethod += '_admin'\n }\n }\n\n // Still failed? dump it and fail the code gen build\n testConflict(path, generatedMethod, 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","/*\n * Copyright (c) 2018-2022 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()]).nullish(),\n enum: z.array(z.union([z.boolean(), z.string(), z.number()])).nullish(),\n items: z\n .object({\n type: z.string()\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(),\n content: z\n .object({\n 'application/json': z.object({\n schema: Schema.nullish()\n })\n })\n .nullish()\n })\n .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-2023 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 { EndpointParameters } from './../Swagger'\n\nexport const templateMethod = ({\n classMethod,\n description,\n httpMethod,\n path,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded,\n responseClass\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 responseClass: string\n}) => {\n let methodSignature = ''\n let newPath = `'${path}'`\n let dependencies: string[] = []\n let snippetString = ''\n let snippetMethodSignature = ''\n let snippetCurl = ''\n\n for (const pathParam of pathParams) {\n const type = ParserUtils.parseType(pathParam)\n if (pathParam.name !== 'namespace') {\n methodSignature += pathParam.name + `:${type}` + ', '\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 snippetCurl = `<span class='sn-blue'>curl</span> --location --request <span class='sn-blue'>${httpMethod}</span> '<span class='sn-green'>__DOMAIN__${path}</span>' --header 'accept: application/json'`\n let dataType = null\n if (httpMethod !== 'get') {\n dataType = ParserUtils.parseBodyParamsType(bodyParams)\n dependencies = ParserUtils.parseBodyParamsImports(bodyParams)\n methodSignature += dataType ? `data: ${dataType},` : ''\n // FIXME, remove <span> html code snippet color coding, but rely on code markdown detection\n const snippetParams = bodyParams?.map(ob => {\n return ` <span class='sn-purple'>${ob.name}</span>`\n })\n snippetMethodSignature += snippetParams ? `data: { ${snippetParams} }` : ''\n const curlParams = bodyParams?.map(ob => {\n return ` <span class='sn-purple'>\"${ob.name}\": \"\"</span>`\n })\n snippetCurl += ` --data-raw { ${curlParams}}`\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 SDKRequestConfig`\n : 'const params = {} as SDKRequestConfig'\n\n const isPostPutPatch = ['post', 'put', 'patch'].includes(httpMethod)\n const isDelete = ['delete'].includes(httpMethod)\n let dataPayload = '{params}'\n\n const descriptionText = description\n ? `\n /**\n * ${(description || '').replace(/\\n/g, '\\n * ')} \n */`\n : ''\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 = methodSignature.indexOf('data: {file') > -1\n\n const resolvedResponseClass = responseClass || 'unknown'\n const resolvedResponseClassValidated = responseClass || 'z.unknown()'\n const parameters = (queryParamsType ? `${methodSignature} ${queryParamsType}` : methodSignature).replace(/,\\s*$/, '')\n\n let methodImpl = ''\n const isCacheFetch = ['get'].includes(httpMethod) && resolvedResponseClass !== 'unknown'\n const cachedFetchMethod = classMethod.replace('get', 'fetch')\n const deprecateTag = isCacheFetch\n ? `/**\n * @deprecated Use \"${cachedFetchMethod}()\" instead.\n */`\n : ''\n\n const isGuardInvoked = ['get', 'post', 'put', 'patch', 'delete'].includes(httpMethod)\n const methodName = httpMethod === 'get' ? cachedFetchMethod : ['post', 'put', 'patch', 'delete'].includes(httpMethod) ? classMethod : ''\n const methodGenerics = resolvedResponseClass !== 'unknown' ? `<T = ${resolvedResponseClass}>` : ''\n const responseType = resolvedResponseClass !== 'unknown' ? `T` : 'unknown'\n\n const generateMethodName = () => `${methodName}${methodGenerics}(${parameters}): Promise<${responseSyncType}<${responseType}>>`\n const generateSnippetMethodName = () => `${methodName}(${snippetMethodSignature})`\n\n snippetString += `${generateSnippetMethodName()}`\n\n const responseSyncType =\n httpMethod === 'get' ? 'IResponseWithSync' : ['post', 'put', 'patch', 'delete'].includes(httpMethod) ? 'IResponse' : ''\n methodImpl = `${descriptionText}\n ${generateMethodName()} {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n\n${\n httpMethod === 'get'\n ? ` const res = () => Validate.responseType(() => resultPromise, ${resolvedResponseClassValidated})\n\n if (!this.cache) {\n return SdkCache.withoutCache(res)\n }\n const cacheKey = url + CodeGenUtil.hashCode(JSON.stringify({ params }))\n return SdkCache.withCache(cacheKey, res)`\n : ''\n}${\n ['post', 'put', 'patch', 'delete'].includes(httpMethod)\n ? ` return Validate.responseType(() => resultPromise, ${resolvedResponseClassValidated})`\n : ''\n }\n }\n `\n\n if (!isGuardInvoked) {\n methodImpl = `${descriptionText}\n ${deprecateTag}\n TODO_${classMethod}<T = ${resolvedResponseClass}>(${parameters}): Promise<AxiosResponse<T>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n return this.axiosInstance.${httpMethod}(url, ${dataPayload})\n }\n `\n }\n\n return [methodImpl, dependencies, snippetString, snippetCurl]\n}\n","/*\n * Copyright (c) 2018-2023 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}'\\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 (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 model = this.parseEnumItems(items)\n } else {\n return {\n schemaString: `${schemaAttribute} z.array(z.any())${schemaRequired}`,\n typeString: `${typeAttribute} any[]${typeNullishability}`\n }\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 } else 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 }\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}'\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-2023 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 { ParserUtils } from './ParserUtils'\nimport { Endpoint, OpenApiSpec } from './Swagger'\nimport { templateMethod } from './templates/template-method'\nimport { TemplateZod, TemplateZodArray } from './templates/template-zod'\n\nconst BUILD_DATE = new Date().toISOString()\n\nexport class CodeGenerator {\n //\n static getPatchedDir = () => path.join(CliParser.getSwaggersOutputPath(), 'patched')\n\n static getGeneratedPublicFolder = () => `${CliParser.getOutputPath()}/generated-public`\n\n static getGeneratedAdminFolder = () => `${CliParser.getOutputPath()}/generated-admin`\n static getGeneratedSnippetsFolder = () => `${CliParser.getSnippetOutputPath()}/generated-snippets`\n\n static getServicePrefix = servicePaths => servicePaths[servicePaths.length - 1].split('/')[1]\n\n static iterateApi = async (api: OpenApiSpec) => {\n const apiBufferByTag = {}\n const dependenciesByTag = {}\n const classImports = {}\n let arrayDefinitions = []\n\n const snippetMap = {}\n const mapClassMethods = {}\n const generatedMethods = {} // { path_get: 'fetchSomething' }\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 = CodeGenerator.getServicePrefix(sortedKeys)\n console.log('ServicePrefix', servicePrefix, ', Paths:', sortedKeys)\n\n for (const [path, operation] of sortedPathsByLength) {\n const isAdminEndpoint = path.indexOf('/admin/') > -1\n if (CliParser.isAdmin() && !isAdminEndpoint) {\n continue\n } else if (!CliParser.isAdmin() && isAdminEndpoint) {\n continue\n }\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) {\n continue\n }\n if (endpoint.deprecated) {\n continue\n }\n\n const [tag] = endpoint.tags\n\n mapClassMethods[tag] = mapClassMethods[tag] ? mapClassMethods[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: mapClassMethods[tag]\n })\n mapClassMethods[tag][classMethod] = `${path} ${httpMethod}`\n generatedMethods[`${path} ${httpMethod}`] = `${classMethod}`\n\n snippetMap[path] = snippetMap[path] ? snippetMap[path] : {}\n const description = endpoint.description\n const responseClass = ParserUtils.get2xxResponse(endpoint.responses)\n const { className, classGenName } = ParserUtils.generateClassName(tag)\n classImports[className] = classImports[className] ? classImports[className] : {}\n if (responseClass) {\n const importTypeClass = ParserUtils.parseRefType(responseClass)\n classImports[className][importTypeClass] = `import { ${importTypeClass} } from './definitions/${importTypeClass}'`\n }\n if (responseClass && responseClass.endsWith('Array')) {\n arrayDefinitions.push(responseClass)\n }\n\n const queryParams = ParserUtils.filterQueryParameters(endpoint.parameters)\n const pathWithBase = `${api.basePath ?? ''}${path}`\n const isFormUrlEncoded = ParserUtils.isFormUrlEncoded(httpMethod, endpoint.consumes)\n const pathParams = ParserUtils.filterPathParams(endpoint.parameters)\n let bodyParams = ParserUtils.filterBodyParams(endpoint.parameters)\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 const [generatedMethodString, importStatements, snippetString, snippetCurl] = templateMethod({\n classMethod,\n description,\n httpMethod,\n path: pathWithBase,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded,\n responseClass\n })\n apiBufferByTag[tag] = (apiBufferByTag[tag] || '') + generatedMethodString\n dependenciesByTag[tag] = dependenciesByTag[tag]\n ? [...new Set([...importStatements, ...dependenciesByTag[tag]])]\n : [...new Set(importStatements)]\n\n snippetMap[path][httpMethod] = {\n web: `<span class='sn-blue'>import</span> axios from 'axios'<br/><span class='sn-blue'>import</span> { <span class='sn-purple'>${classGenName}</span> } <span class='sn-blue'>from</span> <span class='sn-green'>'@accelbyte/sdk'</span><br/><br/><span class='sn-blue'>const</span> axios = <span class='sn-blue'>axios</span>.create({<span class='sn-purple'>clientId</span>, <span class='sn-purple'>redirectURI</span>, <span class='sn-purple'>baseURL</span>})<br/><br/><span class='sn-blue'>new</span> ${classGenName}(<span class='sn-purple'>axios</span>, <span class='sn-purple'>namespace</span>).<span class='method-name'>${snippetString}</span>`,\n shell: snippetCurl\n }\n }\n }\n\n arrayDefinitions = [...new Set(arrayDefinitions)]\n return { apiBufferByTag, dependenciesByTag, classImports, arrayDefinitions, snippetMap }\n }\n\n static main = async (nameArray: string[]): Promise<Set<string>> => {\n const serviceName = nameArray[0]\n const swaggerFile = nameArray[2]\n const parser = new SwaggerParser()\n\n const generatedFolder = CliParser.isAdmin() ? CodeGenerator.getGeneratedAdminFolder() : CodeGenerator.getGeneratedPublicFolder()\n\n const DIST_DIR = `${generatedFolder}/${serviceName}`\n const DIST_DEFINITION_DIR = path.join(DIST_DIR, 'definitions')\n\n const swaggerFilePath = `${CliParser.getSwaggersOutputPath()}/${swaggerFile}`\n const swaggerPatchedFilePath = `${CodeGenerator.getPatchedDir()}/${swaggerFile}`\n const swaggerPatchFilePath = `${swaggerFilePath}patch`\n ParserUtils.applyPatchIfExists(swaggerFilePath, swaggerPatchFilePath, swaggerPatchedFilePath, CodeGenerator.getPatchedDir())\n const api = await parser.parse(swaggerPatchedFilePath)\n\n const indexImportsSet: Set<string> = new Set()\n\n console.log('----------\\nGenerating API:', { title: api.info.title, version: api.info.version })\n\n ParserUtils.mkdirIfNotExist(DIST_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DEFINITION_DIR)\n\n ParserUtils.writeVersionFile(DIST_DIR, 'Version.ts', serviceName, api.info, BUILD_DATE)\n\n const { apiBufferByTag, dependenciesByTag, classImports, arrayDefinitions, snippetMap } = await CodeGenerator.iterateApi(api)\n\n if (CliParser.getSnippetOutputPath()) {\n ParserUtils.writeSnippetFile(CodeGenerator.getGeneratedSnippetsFolder(), api.info.title, JSON.stringify(snippetMap, null, 2))\n }\n\n const targetSrcFolder = `${CliParser.getOutputPath()}/`\n\n for (const tag in apiBufferByTag) {\n const { className, classGenName } = ParserUtils.generateClassName(tag)\n const apiBuffer = apiBufferByTag[tag]\n const imports = [...new Set([...dependenciesByTag[tag], ...Object.values(classImports[className])])]\n\n ParserUtils.writeClassFile(DIST_DIR, classGenName, apiBuffer, imports)\n // const jsDocApiBuffer = jsDocApiBufferByTag[tag]\n // ParserUtils.writeJsdocFile(DIST_DIR, nameArray, jsDocApiBuffer)\n\n // For classes, we need to append `$`.\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DIR, `${classGenName}`), targetSrcFolder))\n }\n\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 let fileName = ParserUtils.parseRefType(ref)\n const fileExist = fs.existsSync(path.join(DIST_DEFINITION_DIR, `${fileName}.ts`))\n if (fileExist) {\n fileName = ParserUtils.toCamelCaseWord(ref).replace('.', '').replace('.', '')\n duplicates.set(ref, fileName)\n }\n const { buffer } = new TemplateZod().render(fileName, definition, new Map())\n // Disabled as it creates definitions tree dir structure that is difficult to maintain, instead a flat \"definitions\" dir was used\n // const dir = ParserUtils.parseImportDir(ref)\n // const defPath = path.join(DIST_DEFINITION_DIR, dir)\n ParserUtils.writeDefinitionFile(DIST_DEFINITION_DIR, fileName, buffer)\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DEFINITION_DIR, fileName), targetSrcFolder))\n }\n\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 ParserUtils.writeDefinitionFile(DIST_DEFINITION_DIR, arrayClass, buffer)\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DEFINITION_DIR, arrayClass), targetSrcFolder))\n }\n\n console.log('\\nCOMPLETED\\n----------\\n\\n')\n return indexImportsSet\n }\n}\n","/*\n * Copyright (c) 2018-2023 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 static downloadFile = (targetFileName: string, url: string) => {\n const destFile = SwaggerDownloader.getDestFile(targetFileName)\n const file = fs.createWriteStream(destFile)\n const request = https.get(url, function (response) {\n response.pipe(file)\n file.on('finish', () => {\n file.close()\n console.log(`SwaggerDownload ${url} completed`)\n })\n })\n request.on('error', (err: Error) => {\n console.log(`SwaggerDownloader failed for \"${targetFileName}\" and \"${url}\"`, err)\n })\n }\n\n static main = () => {\n const swaggers = CliParser.getConfigFile()\n for (const ref in swaggers) {\n const targetFileName = swaggers[ref][2]\n const url = swaggers[ref][3]\n SwaggerDownloader.downloadFile(targetFileName, url)\n }\n console.log('\\n----------\\n SwaggerDownloader COMPLETED.\\n----------\\n\\n')\n }\n}\n","/*\n * Copyright (c) 2022 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 { CliOption, CliParser } from './CliParser'\nimport { CodeGenerator } from './CodeGenerator'\nimport path from 'path'\nimport { ParserUtils } from './ParserUtils'\nimport { SwaggerDownloader } from './SwaggerDownloader'\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, swaggersOutput }) => {\n if (!output?.trim()) {\n throw new Error('output is required for generate-code')\n }\n return true\n })\n\n CliParser.createInstance(yargs)\n const arrayOfSets = await Promise.all(CliParser.getConfigFile().map(config => CodeGenerator.main(config)))\n const indexImportsSet = new Set<string>()\n const filenamesSet = new Set<string>()\n\n for (const set of arrayOfSets) {\n set.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 }\n\n const indexImportsArray = Array.from(indexImportsSet)\n const filesToImport = indexImportsArray.map(fileToImport => {\n return `export * from '${fileToImport.replace('\\\\', '/')}'`\n })\n ParserUtils.writeAllImportsFile(CliParser.getOutputPath(), filesToImport.join('\\n'), CliParser.isAdmin())\n })\n .option('config', {\n description: 'Config file providing backend services URL.',\n type: 'string',\n demandOption: true\n })\n .option('swaggersOutput', {\n description: 'Output path for downloaded swaggers JSON files.',\n type: 'string',\n demandOption: true\n })\n .option('output', {\n description: 'Output path for generated code. Required for generate-code',\n type: 'string'\n })\n .option('admin', {\n description: 'Only generate /admin endpoints.',\n type: 'boolean',\n default: false,\n demandOption: false\n })\n .demandCommand(1)\n .help().argv\n"],"names":["fs","path"],"mappings":"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"}
1
+ {"version":3,"file":"accelbyte-codegen.mjs","sources":["../src/CliParser.ts","../src/templates/template-class.ts","../src/templates/template-api-class.ts","../src/ParserUtils.ts","../src/Swagger.ts","../src/templates/template-method.ts","../src/templates/template-zod.ts","../src/templates/template-api-method.ts","../src/templates/template-api-index.ts","../src/templates/template-sdk-snippet.ts","../src/CodeGenerator.ts","../src/SwaggerDownloader.ts","../src/cli.ts"],"sourcesContent":["/*\n * Copyright (c) 2022-2023 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 { Argv } from 'yargs'\nimport { z } from 'zod'\nimport fs from 'fs'\nimport * as path from 'path'\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 admin: 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 isAdmin = (): boolean => {\n return CliParser.instance().argv.admin\n }\n\n public static getSnippetOutputPath = (): string => {\n return CliParser.instance().argv.snippetOutput\n }\n}\n","/*\n * Copyright (c) 2018-2023 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', 'SdkCache', 'IResponse', 'IResponseWithSync', 'Validate'],\n axios: ['AxiosRequestConfig', 'AxiosResponse'],\n zod: ['z']\n})\n\nconst makeNewImportVarMap = () => ({\n axios: ['AxiosInstance'],\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\n const generatedImports = Object.keys(usedImportVarMap)\n .sort()\n .map((moduleSource: string) => `import { ${usedImportVarMap[moduleSource].sort().join(', ')} } from '${moduleSource}'`)\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 constructor(private axiosInstance: AxiosInstance, private namespace: string, private cache = false) {}\n ${body}\n}\n `\n}\n","/*\n * Copyright (c) 2018-2023 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, templateClass } from './template-class'\n\nconst getImportableVarMap = () => ({\n '@accelbyte/sdk': ['CodeGenUtil', 'SdkCache', 'IResponse', 'IResponseWithSync', 'Validate', 'ApiArgs', 'Network', 'AccelbyteSDK']\n})\n\nconst makeNewImportVarMap = () => ({\n '@accelbyte/sdk': ['AccelbyteSDK', 'ApiArgs', 'ApiUtils']\n})\n\nexport const templateApiClass = (className: string, body: string, importStatements: string[], returnMethods: string): string => {\n return `/**\n * AUTO GENERATED\n */\n/* eslint-disable camelcase */\n${generateImports(body, importStatements, makeNewImportVarMap(), getImportableVarMap())}\n\nexport function ${className}(sdk: AccelbyteSDK, args?: ApiArgs) {\n const sdkAssembly = sdk.assembly()\n \n const namespace = args?.namespace ? args?.namespace : sdkAssembly.namespace\n const cache = args?.cache ? args?.cache : sdkAssembly.cache\n const requestConfig = ApiUtils.mergedConfigs(sdkAssembly.config, args)\n ${body}\n \n return {\n ${returnMethods}\n }\n}\n `\n}\n","/*\n * Copyright (c) 2018-2023 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, { readFileSync, writeFileSync } from 'fs'\nimport _ from 'lodash'\nimport path from 'path'\nimport { Endpoint, EndpointParameters } from './Swagger'\nimport { templateClass } from './templates/template-class'\nimport { templateApiClass } from './templates/template-api-class'\nimport { CliParser } from './CliParser'\n\nconst UNDEFINED_SWAGGER_SEMVER = '0.0.0'\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 replaceAll = (string, search, replace) => {\n return string.split(search).join(replace)\n }\n\n static generateClassName = (tag: string) => {\n const className = _.upperFirst(_.camelCase(tag))\n const classGenName = CliParser.isAdmin() ? className + 'Admin$' : className + '$'\n return { className, classGenName }\n }\n\n static generateApiName = (tag: string) => {\n const apiName = _.upperFirst(_.camelCase(tag))\n const apiGenName = CliParser.isAdmin() ? apiName + 'AdminApi' : apiName + 'Api'\n return { apiName, apiGenName }\n }\n\n static parseQueryParamAttributeDefault = (definition: EndpointParameters) => {\n const attrName = definition.name.slice(definition.name.lastIndexOf('.') + 1)\n const defaultValue = definition.type === 'string' ? `'${definition.default}'` : definition.default\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 return queryParams.map(queryParam => ParserUtils.parseAttributeType(queryParam)).join(', ')\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 '../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?.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) {\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 get2xxResponse(methodEntity: Endpoint['responses']): string {\n const keys = Object.keys(methodEntity)\n let responseClass = null\n keys.forEach(key => {\n if (String(key).startsWith('2')) {\n const sch = methodEntity[key].schema\n const schV3 = methodEntity[key].content && methodEntity[key].content['application/json'].schema\n if (sch?.$ref) {\n responseClass = ParserUtils.parseRefType(sch.$ref)\n } else if (sch?.type === 'array' && sch.items?.$ref) {\n responseClass = ParserUtils.parseRefType(sch.items.$ref)\n responseClass = `${responseClass}Array` // Adds support for z.array() types\n } else if (schV3?.$ref) {\n responseClass = 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 })\n\n return responseClass\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 }) => {\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) + genPath)\n generatedMethod = ParserUtils.replaceAll(generatedMethod, 'Byword', '_By') // lodash remvoes the '_'\n generatedMethod = resolveConflicts(path, generatedMethod, existingMethods)\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 writeApiFile(distDir: string, apiName: string, apiBuffer: string, imports: string[], returnMethods: string) {\n const newImports = []\n imports.forEach((el, index) => {\n newImports.push(el.replace('../definitions', './definitions'))\n })\n const fileContent = templateApiClass(apiName, apiBuffer, newImports, returnMethods)\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, isAdminWebSdk: boolean) {\n ParserUtils.mkdirIfNotExist(distDir)\n fs.writeFileSync(path.join(distDir, `all-${isAdminWebSdk ? 'admin' : 'public'}-imports.ts`), ParserUtils.prependCopyrightHeader(buffer))\n }\n\n static syncChangelog(packageVersion) {\n const currDir = process.cwd()\n const pathToChangelog = path.join(currDir, './CHANGELOG.md')\n let fileContent = readFileSync(pathToChangelog, 'utf-8')\n const date = new Date().toISOString().slice(0, 10)\n fileContent = '### ' + packageVersion + ' - ' + date + `\\n\\n- code-generated update\\n\\n` + fileContent.trim()\n fs.writeFileSync(pathToChangelog, fileContent, 'utf-8')\n }\n\n static syncPackageVersion(apiInfo, isAdminWebSdk) {\n if (isAdminWebSdk) {\n return\n }\n const currDir = process.cwd()\n const { packageJSON, pathToPackageJSON } = ParserUtils.getPackageJSONInfo(currDir)\n let swaggerVersion = apiInfo.version ? apiInfo.version : UNDEFINED_SWAGGER_SEMVER\n swaggerVersion = Number(swaggerVersion.replace('.', '').replace('.', ''))\n swaggerVersion = isNaN(swaggerVersion) ? 0 : swaggerVersion\n const semver = packageJSON.version.split('.').map(numStr => Number(numStr))\n const newSemver = [semver[0], swaggerVersion, ++semver[2]]\n packageJSON.version = newSemver[0] + '.' + newSemver[1] + '.' + newSemver[2]\n writeFileSync(pathToPackageJSON, JSON.stringify(packageJSON, null, 2))\n ParserUtils.syncChangelog(packageJSON.version)\n }\n\n static getPackageJSONInfo(dir) {\n const pathToPackageJSON = path.join(dir, './package.json')\n return { packageJSON: JSON.parse(readFileSync(pathToPackageJSON, 'utf-8')), pathToPackageJSON }\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-web-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\nconst mappedMethod = (httpMethod: string, isForm: boolean) => {\n if (httpMethod === 'get') {\n // return 'fetch'\n return 'get'\n } else if (httpMethod === 'post' && isForm) {\n return 'post'\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, existingMethods) => {\n // generatedMethod = generatedMethod.replace('Namespaces', '')\n try {\n testConflict(path, generatedMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/namespaces/') >= 0) {\n generatedMethod += '_ByNS'\n }\n }\n\n try {\n testConflict(path, generatedMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/v4/') >= 0) {\n generatedMethod += '_v4'\n }\n }\n\n try {\n testConflict(path, generatedMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/v3/') >= 0) {\n generatedMethod += '_v3'\n }\n }\n\n try {\n testConflict(path, generatedMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/v2/') >= 0) {\n generatedMethod += '_v2'\n }\n }\n\n try {\n testConflict(path, generatedMethod, existingMethods)\n } catch (e) {\n if (path.indexOf('/admin/') >= 0) {\n generatedMethod += '_admin'\n }\n }\n\n // Still failed? dump it and fail the code gen build\n testConflict(path, generatedMethod, 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) 2018-2023 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()]).nullish(),\n enum: z.array(z.union([z.boolean(), z.string(), z.number()])).nullish(),\n items: z\n .object({\n type: z.string()\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(),\n content: z\n .object({\n 'application/json': z.object({\n schema: Schema.nullish()\n })\n })\n .nullish()\n })\n .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-2023 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 { EndpointParameters } from './../Swagger'\n\nexport const templateMethod = ({\n classMethod,\n description,\n httpMethod,\n path,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded,\n responseClass\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 responseClass: string\n}) => {\n let methodParams = ''\n let methodParamsNoTypes = ''\n let newPath = `'${path}'`\n let importStatements: string[] = []\n\n for (const pathParam of pathParams) {\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 SDKRequestConfig`\n : 'const params = {} as SDKRequestConfig'\n\n const isPostPutPatch = ['post', 'put', 'patch'].includes(httpMethod)\n const isDelete = ['delete'].includes(httpMethod)\n let dataPayload = '{params}'\n\n const descriptionText = description\n ? `\n /**\n * ${description.replace(/\\n/g, '\\n * ')} \n */`\n : ''\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 resolvedResponseClass = responseClass || 'unknown'\n const resolvedResponseClassValidated = responseClass || 'z.unknown()'\n methodParams = (queryParamsType ? `${methodParams} ${queryParamsType}` : methodParams).replace(/,\\s*$/, '')\n methodParamsNoTypes = queryParamsType ? `${methodParamsNoTypes} queryParams` : methodParamsNoTypes\n\n let methodImpl = ''\n const isCacheFetch = ['get'].includes(httpMethod) && resolvedResponseClass !== 'unknown'\n const cachedFetchMethod = classMethod\n const deprecateTag = isCacheFetch\n ? `/**\n * @deprecated Use \"${classMethod}()\" instead.\n */`\n : ''\n\n const isGuardInvoked = ['get', 'post', 'put', 'patch', 'delete'].includes(httpMethod)\n const methodName = httpMethod === 'get' ? cachedFetchMethod : ['post', 'put', 'patch', 'delete'].includes(httpMethod) ? classMethod : ''\n const responseType = resolvedResponseClass !== 'unknown' ? `${resolvedResponseClass}` : 'unknown'\n\n const generateMethodName = () => `${methodName}(${methodParams}): Promise<${responseSyncType}<${responseType}>>`\n\n const responseSyncType =\n httpMethod === 'get' ? 'IResponseWithSync' : ['post', 'put', 'patch', 'delete'].includes(httpMethod) ? 'IResponse' : ''\n methodImpl = `${descriptionText}\n ${generateMethodName()} {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n\n${\n httpMethod === 'get'\n ? ` const res = () => Validate.responseType(() => resultPromise, ${resolvedResponseClassValidated}, '${resolvedResponseClassValidated}')\n\n if (!this.cache) {\n return SdkCache.withoutCache(res)\n }\n const cacheKey = url + CodeGenUtil.hashCode(JSON.stringify({ params }))\n return SdkCache.withCache(cacheKey, res)`\n : ''\n}${\n ['post', 'put', 'patch', 'delete'].includes(httpMethod)\n ? ` return Validate.responseType(() => resultPromise, ${resolvedResponseClassValidated}, '${resolvedResponseClassValidated}')`\n : ''\n }\n }\n `\n\n if (!isGuardInvoked) {\n methodImpl = `${descriptionText}\n ${deprecateTag}\n TODO_${classMethod}(${methodParams}): Promise<AxiosResponse<${resolvedResponseClass}>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n return this.axiosInstance.${httpMethod}(url, ${dataPayload})\n }\n `\n }\n\n const res = {\n methodImpl,\n methodParams,\n methodParamsNoTypes,\n importStatements\n }\n return res\n}\n","/*\n * Copyright (c) 2018-2023 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 (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 } else 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 }\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-2023 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 { EndpointParameters } from './../Swagger'\n\nexport const templateApiMethod = ({\n classMethod,\n description,\n httpMethod,\n path,\n pathParams,\n bodyParams,\n responseClass,\n classGenName,\n methodParams,\n methodParamsNoTypes\n}: {\n classMethod: string\n description: string\n httpMethod: string\n path: string\n pathParams: EndpointParameters[]\n bodyParams: EndpointParameters[]\n responseClass: string\n classGenName: string\n methodParams: string\n methodParamsNoTypes: string\n}) => {\n let methodSignature = ''\n let newPath = `'${path}'`\n let snippetSdk = ''\n let snippetShell = ''\n\n for (const pathParam of pathParams) {\n const type = ParserUtils.parseType(pathParam)\n if (pathParam.name !== 'namespace') {\n methodSignature += pathParam.name + `:${type}` + ', '\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 snippetShell = `curl --location --request \\\\\\n ${httpMethod} '__DOMAIN__${path}' \\\\\\n --header 'accept: application/json'`\n if (httpMethod !== 'get') {\n const curlParams = bodyParams?.map(ob => {\n return ` \"${ob.name}\": \"\"`\n })\n snippetShell += ` \\\\\\n --data-raw '{ ${curlParams}}'`\n }\n\n const descriptionText = description\n ? `\n /**\n * ${description.replace(/\\n/g, '\\n * ')} \n */`\n : ''\n\n const resolvedResponseClass = responseClass || 'unknown'\n const responseType = resolvedResponseClass !== 'unknown' ? `${resolvedResponseClass}` : 'unknown'\n\n const methodImpl = `\n ${descriptionText}\n async function ${classMethod}(${methodParams}): Promise<${responseType}> {\n const $ = new ${classGenName}(Network.create(requestConfig), namespace, cache)\n const resp = await $.${classMethod}(${methodParamsNoTypes})\n if (resp.error) throw resp.error\n return resp.response.data\n }\n `\n const snippetPromiseString = responseType !== 'unknown' ? `Promise<${responseType}>` : 'Promise'\n snippetSdk += `${classMethod}(${methodParams}) \\n // return ${snippetPromiseString}`\n\n return [methodImpl, snippetSdk, snippetShell]\n}\n","/*\n * Copyright (c) 2018-2023 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'\n\nexport const templateApiIndex = (serviceName: string, serviceNameTitle: string, apiList: string[]): string => {\n let imports = ''\n let returnStatement = ''\n for (const cl of apiList) {\n imports += `\\nimport { ${cl} } from './${serviceName}/${cl}.js'`\n returnStatement += `\\n${cl}, `\n }\n\n return `/**\n * AUTO GENERATED\n */\n${imports}\n\nconst apis = {\n${returnStatement}\n}\n\nexport const ${ParserUtils.convertDashesToTitleCase(serviceNameTitle)} = apis\n `\n}\n","/*\n * Copyright (c) 2018-2023 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 = (serviceNameTitle, apiName, methodSnippet) => {\n const methodArr = methodSnippet.split('//')\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 const sdkSnippet = `import { Accelbyte } from '@accelbyte/sdk'\nimport { ${serviceNameTitle} } from '@accelbyte/sdk-${serviceNameTitle.toLowerCase()}'\n\nconst sdk = Accelbyte.SDK({\n baseURL: 'https://demo.accelbyte.io',\n clientId: '77f88506b6174c3ea4d925f5b4096ce8',\n namespace: 'accelbyte',\n redirectURI: 'http://localhost:3030'\n})\n\n${serviceNameTitle}.${apiName}(sdk)\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) 2018-2023 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 { ParserUtils } from './ParserUtils'\nimport { Endpoint, OpenApiSpec } from './Swagger'\nimport { templateMethod } from './templates/template-method'\nimport { TemplateZod, TemplateZodArray } from './templates/template-zod'\nimport { templateApiMethod } from './templates/template-api-method'\nimport { templateApiIndex } from './templates/template-api-index'\nimport { templateSdkSnippet } from './templates/template-sdk-snippet'\n\nconst GIT_URL = 'https://github.com/AccelByte/accelbyte-web-sdk/blob/main/packages'\nexport class CodeGenerator {\n //\n static getPatchedDir = () => path.join(CliParser.getSwaggersOutputPath(), 'patched')\n\n static getGeneratedPublicFolder = () => `${CliParser.getOutputPath()}/generated-public`\n\n static getGeneratedAdminFolder = () => `${CliParser.getOutputPath()}/generated-admin`\n static getGeneratedSnippetsFolder = () => `${CliParser.getSnippetOutputPath()}/generated-snippets`\n\n static getServicePrefix = servicePaths => servicePaths[servicePaths.length - 1].split('/')[1]\n\n static iterateApi = async (api: OpenApiSpec, serviceName: string) => {\n const apiBufferByTag = {}\n const apiArgumentsByTag = {}\n const classBufferByTag = {}\n const dependenciesByTag = {}\n const classImports = {}\n let arrayDefinitions = []\n\n const snippetMap = {}\n const mapClassMethods = {}\n const generatedMethods = {} // { path_get: 'fetchSomething' }\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 = CodeGenerator.getServicePrefix(sortedKeys)\n // console.log('ServicePrefix', servicePrefix, ', Paths:', sortedKeys)\n\n for (const [path, operation] of sortedPathsByLength) {\n const isAdminEndpoint = path.indexOf('/admin/') > -1\n if (CliParser.isAdmin() && !isAdminEndpoint) {\n continue\n } else if (!CliParser.isAdmin() && isAdminEndpoint) {\n continue\n }\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) {\n continue\n }\n if (endpoint.deprecated) {\n continue\n }\n\n const [tag] = endpoint.tags\n\n mapClassMethods[tag] = mapClassMethods[tag] ? mapClassMethods[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: mapClassMethods[tag]\n })\n mapClassMethods[tag][classMethod] = `${path} ${httpMethod}`\n generatedMethods[`${path} ${httpMethod}`] = `${classMethod}`\n\n snippetMap[path] = snippetMap[path] ? snippetMap[path] : {}\n let description = endpoint.description\n description = description || ''\n description = description.replace(/\\s+/g, ' ') // filter [NBSP] no-irregular-whitespace\n const responseClass = ParserUtils.get2xxResponse(endpoint.responses)\n const { className, classGenName } = ParserUtils.generateClassName(tag)\n classImports[className] = classImports[className] ? classImports[className] : {}\n if (responseClass) {\n const importTypeClass = ParserUtils.parseRefType(responseClass)\n classImports[className][importTypeClass] = `import { ${importTypeClass} } from '../definitions/${importTypeClass}.js'`\n }\n if (responseClass && responseClass.endsWith('Array')) {\n arrayDefinitions.push(responseClass)\n }\n\n const queryParams = ParserUtils.filterQueryParameters(endpoint.parameters)\n const pathWithBase = `${api.basePath ?? ''}${path}`\n const isFormUrlEncoded = ParserUtils.isFormUrlEncoded(httpMethod, endpoint.consumes)\n const pathParams = ParserUtils.filterPathParams(endpoint.parameters)\n let bodyParams = ParserUtils.filterBodyParams(endpoint.parameters)\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 responseClass\n })\n classBufferByTag[tag] = (classBufferByTag[tag] || '') + methodImpl\n\n // -- apis\n const [generatedMethodString1, snippetMethod, snippetShell] = templateApiMethod({\n classMethod,\n description,\n httpMethod,\n path: pathWithBase,\n pathParams,\n bodyParams,\n responseClass,\n classGenName,\n methodParams,\n methodParamsNoTypes\n })\n apiBufferByTag[tag] = (apiBufferByTag[tag] || '') + generatedMethodString1\n apiArgumentsByTag[tag] = (apiArgumentsByTag[tag] || '') + classMethod + ','\n\n // -- dependencies\n dependenciesByTag[tag] = dependenciesByTag[tag]\n ? [...new Set([...importStatements, ...dependenciesByTag[tag]])]\n : [...new Set(importStatements)]\n\n const serviceNameTitle = ParserUtils.convertDashesToTitleCase(serviceName)\n const { apiGenName } = ParserUtils.generateApiName(tag)\n const resultSnippet = templateSdkSnippet(serviceNameTitle, apiGenName, snippetMethod)\n // -- snippets\n snippetMap[path][httpMethod] = {\n web: resultSnippet,\n webGit: GIT_URL + `/sdk-${serviceName}/src/generated-public/${serviceName}/${apiGenName}.ts`,\n shell: snippetShell\n }\n }\n }\n\n arrayDefinitions = [...new Set(arrayDefinitions)]\n return {\n apiArgumentsByTag,\n apiBufferByTag,\n classBufferByTag,\n dependenciesByTag,\n classImports,\n arrayDefinitions,\n snippetMap\n }\n }\n\n static main = async (nameArray: string[]): Promise<Set<string>> => {\n const serviceName = nameArray[0]\n const swaggerFile = nameArray[2]\n const parser = new SwaggerParser()\n\n const generatedFolder = CliParser.isAdmin() ? CodeGenerator.getGeneratedAdminFolder() : CodeGenerator.getGeneratedPublicFolder()\n\n const DIST_DIR = `${generatedFolder}/${serviceName}`\n const DIST_ENDPOINTS_DIR = path.join(DIST_DIR, 'endpoints')\n const DIST_DEFINITION_DIR = path.join(DIST_DIR, 'definitions')\n\n const swaggerFilePath = `${CliParser.getSwaggersOutputPath()}/${swaggerFile}`\n const swaggerPatchedFilePath = `${CodeGenerator.getPatchedDir()}/${swaggerFile}`\n const swaggerPatchFilePath = `${swaggerFilePath}patch`\n ParserUtils.applyPatchIfExists(swaggerFilePath, swaggerPatchFilePath, swaggerPatchedFilePath, CodeGenerator.getPatchedDir())\n const api = await parser.parse(swaggerPatchedFilePath)\n\n const indexImportsSet: Set<string> = new Set()\n\n console.log('----------\\nGenerating API:', { title: api.info.title, version: api.info.version })\n\n ParserUtils.mkdirIfNotExist(DIST_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DEFINITION_DIR)\n ParserUtils.mkdirIfNotExist(DIST_ENDPOINTS_DIR)\n\n ParserUtils.syncPackageVersion(api.info, CliParser.isAdmin())\n\n const { apiArgumentsByTag, apiBufferByTag, classBufferByTag, dependenciesByTag, classImports, arrayDefinitions, snippetMap } =\n await CodeGenerator.iterateApi(api, serviceName)\n\n if (CliParser.getSnippetOutputPath()) {\n ParserUtils.writeSnippetFile(CodeGenerator.getGeneratedSnippetsFolder(), api.info.title, JSON.stringify(snippetMap, null, 2))\n }\n\n const targetSrcFolder = `${CliParser.getOutputPath()}/`\n\n const apiList = []\n for (const tag in classBufferByTag) {\n const { className, classGenName } = ParserUtils.generateClassName(tag)\n const classBuffer = classBufferByTag[tag]\n const imports = [...new Set([...dependenciesByTag[tag], ...Object.values(classImports[className])])]\n const apiImports = [...new Set([...dependenciesByTag[tag], ...Object.values(classImports[className])])]\n apiImports.push(`import { ${classGenName} } from './endpoints/${classGenName}.js'`)\n\n ParserUtils.writeClassFile(DIST_ENDPOINTS_DIR, classGenName, classBuffer, imports)\n\n const apiBuffer = apiBufferByTag[tag]\n const { apiGenName } = ParserUtils.generateApiName(tag)\n // ParserUtils.replaceAll(ParserUtils.toTitleCaseWord(serviceName), '-', '') +\n // const apiGenFileName = apiGenName\n ParserUtils.writeApiFile(DIST_DIR, apiGenName, apiBuffer, apiImports, apiArgumentsByTag[tag])\n apiList.push(apiGenName)\n\n // For endpoint classes, we need to append `$`.\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_ENDPOINTS_DIR, `${classGenName}`), targetSrcFolder))\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DIR, `${apiGenName}`), targetSrcFolder))\n }\n const serviceNameTitle = ParserUtils.convertDashesToTitleCase(serviceName)\n const apiIndexBuff = templateApiIndex(serviceName, serviceNameTitle, apiList)\n ParserUtils.writeApiMainFile(generatedFolder, serviceNameTitle, apiIndexBuff)\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(generatedFolder, serviceNameTitle), targetSrcFolder))\n\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 let fileName = ParserUtils.parseRefType(ref)\n const fileExist = fs.existsSync(path.join(DIST_DEFINITION_DIR, `${fileName}.ts`))\n if (fileExist) {\n fileName = ParserUtils.toCamelCaseWord(ref).replace('.', '').replace('.', '')\n duplicates.set(ref, fileName)\n }\n const { buffer } = new TemplateZod().render(fileName, definition, new Map())\n // Disabled as it creates definitions tree dir structure that is difficult to maintain, instead a flat \"definitions\" dir was used\n // const dir = ParserUtils.parseImportDir(ref)\n // const defPath = path.join(DIST_DEFINITION_DIR, dir)\n ParserUtils.writeDefinitionFile(DIST_DEFINITION_DIR, fileName, buffer)\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DEFINITION_DIR, fileName), targetSrcFolder))\n }\n\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 ParserUtils.writeDefinitionFile(DIST_DEFINITION_DIR, arrayClass, buffer)\n indexImportsSet.add(ParserUtils.getRelativePathToWebSdkSrcFolder(path.join(DIST_DEFINITION_DIR, arrayClass), targetSrcFolder))\n }\n\n console.log('\\nCOMPLETED\\n----------\\n\\n')\n return indexImportsSet\n }\n}\n","/*\n * Copyright (c) 2018-2023 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 = (targetFileName: string, url: string) => {\n const destFile = SwaggerDownloader.getDestFile(targetFileName)\n const file = fs.createWriteStream(destFile)\n const request = https.get(url, function (response) {\n response.pipe(file)\n file.on('finish', () => {\n file.close()\n SwaggerDownloader.postSanitizeDownloadedFile(destFile)\n console.log(`SwaggerDownload ${url} completed`)\n })\n })\n request.on('error', (err: Error) => {\n console.log(`SwaggerDownloader failed for \"${targetFileName}\" and \"${url}\"`, err)\n })\n }\n\n static main = () => {\n const swaggers = CliParser.getConfigFile()\n for (const ref in swaggers) {\n const targetFileName = swaggers[ref][2]\n const url = swaggers[ref][3]\n SwaggerDownloader.downloadFile(targetFileName, url)\n }\n console.log('\\n----------\\n SwaggerDownloader COMPLETED.\\n----------\\n\\n')\n }\n}\n","/*\n * Copyright (c) 2022 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 { CliOption, CliParser } from './CliParser'\nimport { CodeGenerator } from './CodeGenerator'\nimport path from 'path'\nimport { ParserUtils } from './ParserUtils'\nimport { SwaggerDownloader } from './SwaggerDownloader'\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, swaggersOutput }) => {\n if (!output?.trim()) {\n throw new Error('output is required for generate-code')\n }\n return true\n })\n\n CliParser.createInstance(yargs)\n const arrayOfSets = await Promise.all(CliParser.getConfigFile().map(config => CodeGenerator.main(config)))\n const indexImportsSet = new Set<string>()\n const filenamesSet = new Set<string>()\n\n for (const set of arrayOfSets) {\n set.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 }\n\n const indexImportsArray = Array.from(indexImportsSet)\n const filesToImport = indexImportsArray.map(fileToImport => {\n return `export * from '${fileToImport.replace('\\\\', '/')}'`\n })\n ParserUtils.writeAllImportsFile(CliParser.getOutputPath(), filesToImport.join('\\n'), CliParser.isAdmin())\n })\n .option('config', {\n description: 'Config file providing backend services URL.',\n type: 'string',\n demandOption: true\n })\n .option('swaggersOutput', {\n description: 'Output path for downloaded swaggers JSON files.',\n type: 'string',\n demandOption: true\n })\n .option('output', {\n description: 'Output path for generated code. Required for generate-code',\n type: 'string'\n })\n .option('admin', {\n description: 'Only generate /admin endpoints.',\n type: 'boolean',\n default: false,\n demandOption: false\n })\n .demandCommand(1)\n .help().argv\n"],"names":["fs","getImportableVarMap","makeNewImportVarMap","path"],"mappings":"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"}