@accelbyte/codegen 1.0.0-alpha.2 → 1.0.0-alpha.3

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.
@@ -516,7 +516,7 @@ const templateMethod = (classMethod, description, httpMethod, path, pathParams,
516
516
  return SdkCache.withoutCache(res)
517
517
  }
518
518
  const cacheKey = url + CodeGenUtil.hashCode(JSON.stringify({ params }))
519
- return SdkCache.withCache(key, cacheKey)
519
+ return SdkCache.withCache(cacheKey, res)
520
520
  }
521
521
  `;
522
522
  isGuardInvoked = true;
@@ -1 +1 @@
1
- {"version":3,"file":"accelbyte-codegen.js","sources":["../src/CliParser.ts","../src/templates/template-class.ts","../src/templates/template-jsdoc-file.ts","../src/ParserUtils.ts","../src/templates/template-jsdoc-method.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 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","/*\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\n export 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-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 { applyPatch } from 'fast-json-patch'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport path from 'path'\nimport { templateClass } from './templates/template-class'\nimport { templateJsdocFile } from './templates/template-jsdoc-file'\n\nexport class ParserUtils {\n static parseQueryParamAttributeDefault = (name, definition) => {\n const attrName = name.slice(name.lastIndexOf('.') + 1)\n const defaultValue = definition.type === 'string' ? `'${definition.default}'` : definition.default\n return `${attrName}: ${defaultValue}`\n }\n\n static parseType = type => {\n if (type === 'integer') return 'number'\n if (type === 'array') return 'any[]'\n return type\n }\n\n static parseQueryParamsType = (queryParams: any[]) => {\n return queryParams.map(p => ParserUtils.parseAttributeType(p.name, p)).join(',')\n }\n\n static isAnyQueryParamRequired = (queryParams: any[]) => {\n queryParams.forEach(p => {\n if (p.required) {\n return true\n }\n })\n return false\n }\n\n static parseQueryParamsDefault = (queryParams: any[]) => {\n const result = queryParams\n .filter(p => !!p.default)\n .map(p => ParserUtils.parseQueryParamAttributeDefault(p.name, p))\n .join(',')\n return result ? `${result},` : ''\n }\n\n static parseBodyParamsImports = (bodyParams: any[]) => {\n const ret = bodyParams\n .map(p => {\n if (p?.schema?.$ref) return ParserUtils.parseRefImport(p.schema.$ref, p)\n if (p?.schema?.items?.$ref) return ParserUtils.parseRefImport(p.schema.items.$ref, p)\n if (p?.$ref) return ParserUtils.parseRefImport(p.$ref, p)\n return null\n })\n .filter(p => !!p)\n return ret\n }\n\n static parseImportDir = $ref => {\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 = ($ref, p) => {\n // const dir = ParserUtils.parseImportDir($ref)\n const type = ParserUtils.parseRefType($ref)\n // return `import {${type}} from '${dir}/${type}'`\n return `import { ${type} } from './definitions/${type}'`\n }\n\n static parseRefType = $ref => {\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))\n }\n\n static parseAttributeType = (name, definition) => {\n const required = definition.required ? '' : '?'\n\n const attrName = name.slice(name.lastIndexOf('.') + 1)\n\n if (definition.enums) {\n const enums = definition.enums.map(enm => (definition.type === 'string' ? `'${enm}'` : enm)).join(' | ')\n return `${attrName}${required}: ${enums}`\n }\n\n if (definition.type && definition.type === 'integer') {\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.type && definition.type) {\n return `${attrName}${required}: ${definition.type} | null`\n }\n\n return `${attrName}${required}: any`\n }\n\n static parseBodyParamsType = (bodyParams: any[]) => {\n const [p] = bodyParams\n\n if (!p) return null\n\n if (bodyParams.length > 0 && p?.name !== 'body' && !p?.schema) {\n let retBodyParams = `{${bodyParams.map(p => ParserUtils.parseAttributeType(p.name, p)).join(',')}}`\n retBodyParams = retBodyParams.replace('file?: file', 'file?: File') // fixed TS type File\n return retBodyParams\n }\n\n if (p?.schema?.type === 'array' && !p?.schema?.items?.$ref) {\n return `${p.schema.items.type ?? 'any'}[]`\n }\n\n if (p?.schema?.type === 'array' && p?.schema?.items?.$ref) {\n return `${ParserUtils.parseRefType(p.schema.items.$ref)}[]`\n }\n\n if (p?.schema.$ref) {\n return ParserUtils.parseRefType(p.schema.$ref)\n }\n\n if (p?.schema?.additionalProperties?.type === 'object') {\n return 'any'\n }\n\n return null\n }\n\n static get2xxResponse(methodEntity: any, path?: string): string {\n const keys = Object.keys(methodEntity) as []\n let responseClass = null\n keys.forEach(key => {\n if (String(key).startsWith('2')) {\n const sch = methodEntity[key].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 {\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 getPathParams(parametersArray: any) {\n if (!parametersArray) {\n return []\n }\n const res = []\n for (const p of parametersArray) {\n if (p.in === 'path') {\n res.push(p)\n }\n }\n return res\n }\n\n static generateClassMethod(path: string, parametersArray: any, httpMethod: string, className: string) {\n let replacedIdsPath = path\n if (parametersArray) {\n for (const p of parametersArray) {\n if (p.in === 'path') {\n replacedIdsPath = replacedIdsPath.replace('{' + p.name + '}', 'By' + ParserUtils.toTitleCaseWord(p.name))\n // remove bellow prefixes as they unnecessarily pollute method names getIamV30, etc ..\n replacedIdsPath = replacedIdsPath.replace('/iam', '')\n replacedIdsPath = replacedIdsPath.replace('/odin-config', '')\n }\n }\n }\n let classMethod = httpMethod + '/' + replacedIdsPath\n classMethod = _.camelCase(classMethod)\n\n // Replace long verbose methods with shorter names. e.g.\n // getPublicNamespacesByNamespaceBySomething -> getSomething\n // getAdminNamespacesByNamespaceBySomething -> getAdminSomething\n classMethod = classMethod.replace('PublicNamespacesByNamespace', '')\n classMethod = classMethod.replace('AdminNamespacesByNamespace', 'Admin')\n\n const searchWord = 'NamespacesByNamespace'\n const nsExistInsideMethod =\n classMethod.indexOf(searchWord) > 0 && classMethod.indexOf(searchWord) + searchWord.length < classMethod.length\n const excludedClasses = ['Policies'] // Policies replacement corrupts the file with duplicate methods, skip replacement\n if (nsExistInsideMethod && !excludedClasses.includes(className)) {\n classMethod = classMethod.replace(searchWord, '')\n }\n return classMethod\n }\n\n static getBodyParams(parametersArray: any) {\n if (!parametersArray) return []\n if (!_.isArray(parametersArray) && parametersArray) return [parametersArray].filter(p => p.in === 'body' || p.in === 'formData')\n return parametersArray.filter(p => p.in === 'body' || p.in === 'formData')\n }\n\n static getQueryParameters(parametersArray: any) {\n if (!parametersArray) {\n return []\n }\n const res = []\n for (const p of parametersArray) {\n if (p.in === 'query') {\n res.push(p)\n }\n }\n return res\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 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 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 = JSON.parse(fs.readFileSync(possibleSwaggerPatchFilePath, 'utf8'))\n const { newDocument } = applyPatch(swaggerContent, swaggerPatchFileContent)\n fs.writeFileSync(swaggerPatchedFilePath, JSON.stringify(newDocument, null, 2))\n }\n\n static mapKeys(map_: Map<string, string>) {\n const methods_ = []\n for (const m in map_) {\n methods_.push(m)\n }\n return methods_\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","/*\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 templateJsdocMethod = (classMethod, httpMethod, path, pathParams, bodyParams, queryParams) => {\n let jsdoc = ''\n let methodSignature = ''\n let newPath = path\n for (const p of pathParams) {\n methodSignature += p.name + ', '\n newPath = newPath.replace('{' + p.name + '}', `' + ${p.name} + '`)\n jsdoc += `\n * @pathParam '${p.name}${p.required ? '' : '?'}' - ${p.description}`\n }\n\n let payloads = ''\n for (const p of bodyParams) {\n methodSignature += p.name + ', '\n payloads += p.name\n jsdoc += `\n * @payload '${p.name}${p.required ? '' : '?'}' - ${p.description} ${\n p?.schema?.properties ? '=> ' + JSON.stringify(p.schema.properties) : ''\n }`\n }\n\n for (const p of queryParams) {\n const optionalMark = p.required ? '' : '?'\n methodSignature += p.name + optionalMark + ', '\n jsdoc += `\n * @queryParam '${p.name}${p.required ? '' : '?'}' - ${p.description}`\n }\n\n let queryString = ''\n for (const p of queryParams) {\n queryString += `${p.name}=__&`\n }\n queryString = queryString.length > 0 ? '?' + queryString : ''\n\n return `\n /**\n * ${httpMethod.toUpperCase()} '${newPath}${queryString}' ${payloads ? \"payload: '\" + payloads + \"'\" : ''}\n * ${jsdoc}\n */\n ${classMethod}(${methodSignature}): Promise\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 { ParserUtils } from '../ParserUtils'\n\nexport const templateMethod = (\n classMethod,\n description,\n httpMethod,\n path,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded: boolean,\n responseClass\n) => {\n let methodSignature = ''\n let newPath = `'${path}'`\n let dependencies = []\n\n for (const p of pathParams) {\n const type = ParserUtils.parseType(p.type)\n if (p.name !== 'namespace') {\n methodSignature += p.name + `:${type}` + ', '\n }\n const pName = p.name === 'namespace' ? 'this.namespace' : p.name\n if (path.match(`{${p.name}}`)) {\n if (type === 'string') {\n newPath = `${newPath}.replace('{${p.name}}', ${pName})`\n } else {\n newPath = `${newPath}.replace('{${p.name}}', String(${pName}))`\n }\n }\n }\n\n let dataType = null\n if (httpMethod !== 'get') {\n dataType = ParserUtils.parseBodyParamsType(bodyParams)\n dependencies = ParserUtils.parseBodyParamsImports(bodyParams)\n methodSignature += dataType ? `data: ${dataType},` : ''\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 isCacheFetchUnknown = ['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 let isGuardInvoked = false\n\n if (isCacheFetch) {\n methodImpl = `${descriptionText}\n ${cachedFetchMethod}<T = ${resolvedResponseClass}>(${parameters}): Promise<IResponseWithSync<T>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \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 isGuardInvoked = true\n }\n\n if (isCacheFetchUnknown) {\n methodImpl = `${descriptionText}\n ${cachedFetchMethod}(${parameters}): Promise<IResponseWithSync<unknown>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n const res = () => Validate.responseType(() => resultPromise, z.unknown())\n\n if (!this.cache) {\n return SdkCache.withoutCache(res)\n }\n const cacheKey = url + CodeGenUtil.hashCode(JSON.stringify({ params }))\n return SdkCache.withCache(key, cacheKey)\n }\n `\n isGuardInvoked = true\n }\n\n const withTypeGuard = ['post', 'put', 'patch', 'delete'].includes(httpMethod) && resolvedResponseClass !== 'unknown'\n\n if (withTypeGuard) {\n methodImpl = `${descriptionText}\n ${classMethod}<T = ${resolvedResponseClass}>(${parameters}): Promise<IResponse<T>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n return Validate.responseType(() => resultPromise, ${resolvedResponseClassValidated}) \n }\n `\n isGuardInvoked = true\n }\n\n const withTypeGuardUnknown = ['post', 'put', 'patch', 'delete'].includes(httpMethod) && resolvedResponseClass === 'unknown'\n if (withTypeGuardUnknown) {\n methodImpl = `${descriptionText}\n ${classMethod}(${parameters}): Promise<IResponse<unknown>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n return Validate.responseType(() => resultPromise, z.unknown()) \n }\n `\n isGuardInvoked = true\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]\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 { ParserUtils } from '../ParserUtils'\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\n duplicateFound = false\n //\n private importClasses = new Set()\n\n // --\n render = (name, definition, duplicates) => {\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(name)\n if (containsRecursiveType) {\n this.importClasses.delete(name)\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 = `\n export const ${name}: z.ZodType<${name}> = z.lazy(() =>\n ${content.schemaString}\n )\n `\n exportedTypeString = `\n export type ${name} = {\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 ${name} = ${content.schemaString}`\n exportedTypeString = `export type ${name} = z.TypeOf<typeof ${name}>`\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 if (!definition.properties) {\n return {\n schemaString: 'z.any()',\n typeString: 'any'\n }\n }\n\n const properties = Object.entries(definition.properties) as [string, any]\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 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 ref = definition.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 {\n const items = definition.items\n model = this.parseEnumItems(items)\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'\n import { ${cls} } from './${cls}'\n \n export const ${name} = z.array(${cls})\n\n export type ${name} = 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-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 SwaggerParser from '@apidevtools/swagger-parser'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport path from 'path'\nimport { ParserUtils } from './ParserUtils'\nimport { templateJsdocMethod } from './templates/template-jsdoc-method'\nimport { templateMethod } from './templates/template-method'\nimport { TemplateZod, TemplateZodArray } from './templates/template-zod'\nimport { CliParser } from './CliParser'\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\n static iterateApi = api => {\n const apiBufferByTag = {}\n const jsDocApiBufferByTag = {}\n const dependenciesByTag = {}\n const classImports = {}\n let arrayDefinitions = []\n\n for (const path in api.paths) {\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 entity = api.paths[path]\n\n const methods = ParserUtils.mapKeys(entity)\n for (const httpMethod of methods) {\n const e = entity[httpMethod]\n const [tag] = e.tags\n const description = e.description\n const isDeprecated = e.deprecated\n const responseClass = ParserUtils.get2xxResponse(e.responses, path)\n const className = _.upperFirst(_.camelCase(tag))\n classImports[className] = classImports[className] ? classImports[className] : {}\n\n if (!isDeprecated) {\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 isFormUrlEncoded = ParserUtils.isFormUrlEncoded(httpMethod, e.consumes)\n const queryParams = ParserUtils.getQueryParameters(e.parameters)\n const pathParams = ParserUtils.getPathParams(e.parameters)\n const bodyParams = ParserUtils.getBodyParams(e.parameters)\n const classMethod = ParserUtils.generateClassMethod(path, e.parameters, httpMethod, className)\n\n const baseAndPath = `${api.basePath ?? ''}${path}`\n\n const [generatedMethodString, importStatements] = templateMethod(\n classMethod,\n description,\n httpMethod,\n baseAndPath,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded,\n responseClass\n )\n apiBufferByTag[tag] = (apiBufferByTag[tag] || '') + generatedMethodString\n jsDocApiBufferByTag[tag] =\n (jsDocApiBufferByTag[tag] || '') + templateJsdocMethod(classMethod, httpMethod, path, pathParams, bodyParams, queryParams)\n dependenciesByTag[tag] = dependenciesByTag[tag]\n ? [...new Set([...importStatements, ...dependenciesByTag[tag]])]\n : [...new Set(importStatements)]\n }\n }\n }\n\n arrayDefinitions = [...new Set(arrayDefinitions)]\n return { apiBufferByTag, jsDocApiBufferByTag, dependenciesByTag, classImports, arrayDefinitions }\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_DOCS_DIR = path.join(DIST_DIR, 'docs')\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: any = await parser.parse(swaggerPatchedFilePath)\n\n const indexImportsSet: Set<string> = new Set()\n\n console.log('\\n----------\\n API name: %s, Version: %s schemes %s', api, api.info.title, api.info.version, api.schemes)\n\n ParserUtils.mkdirIfNotExist(DIST_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DOCS_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DEFINITION_DIR)\n\n const { apiBufferByTag, dependenciesByTag, classImports, arrayDefinitions /* jsDocApiBufferByTag, */ } = CodeGenerator.iterateApi(api)\n\n const targetSrcFolder = `${CliParser.getOutputPath()}/`\n\n for (const tag in apiBufferByTag) {\n const className = _.upperFirst(_.camelCase(tag))\n const apiBuffer = apiBufferByTag[tag]\n const imports = [...new Set([...dependenciesByTag[tag], ...Object.values(classImports[className])])]\n\n const classGenName = CliParser.isAdmin() ? className + 'Admin$' : 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()\n for (const ref in api.definitions) {\n const definition = api.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 api.definitions) {\n const definition = api.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('\\n----------\\nCOMPLETED.\\n----------\\n\\n')\n return indexImportsSet\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 * 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 dl 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":["z","fs","path","_","applyPatch","SwaggerParser","https","yargs"],"mappings":"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"}
1
+ {"version":3,"file":"accelbyte-codegen.js","sources":["../src/CliParser.ts","../src/templates/template-class.ts","../src/templates/template-jsdoc-file.ts","../src/ParserUtils.ts","../src/templates/template-jsdoc-method.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 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","/*\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\n export 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-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 { applyPatch } from 'fast-json-patch'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport path from 'path'\nimport { templateClass } from './templates/template-class'\nimport { templateJsdocFile } from './templates/template-jsdoc-file'\n\nexport class ParserUtils {\n static parseQueryParamAttributeDefault = (name, definition) => {\n const attrName = name.slice(name.lastIndexOf('.') + 1)\n const defaultValue = definition.type === 'string' ? `'${definition.default}'` : definition.default\n return `${attrName}: ${defaultValue}`\n }\n\n static parseType = type => {\n if (type === 'integer') return 'number'\n if (type === 'array') return 'any[]'\n return type\n }\n\n static parseQueryParamsType = (queryParams: any[]) => {\n return queryParams.map(p => ParserUtils.parseAttributeType(p.name, p)).join(',')\n }\n\n static isAnyQueryParamRequired = (queryParams: any[]) => {\n queryParams.forEach(p => {\n if (p.required) {\n return true\n }\n })\n return false\n }\n\n static parseQueryParamsDefault = (queryParams: any[]) => {\n const result = queryParams\n .filter(p => !!p.default)\n .map(p => ParserUtils.parseQueryParamAttributeDefault(p.name, p))\n .join(',')\n return result ? `${result},` : ''\n }\n\n static parseBodyParamsImports = (bodyParams: any[]) => {\n const ret = bodyParams\n .map(p => {\n if (p?.schema?.$ref) return ParserUtils.parseRefImport(p.schema.$ref, p)\n if (p?.schema?.items?.$ref) return ParserUtils.parseRefImport(p.schema.items.$ref, p)\n if (p?.$ref) return ParserUtils.parseRefImport(p.$ref, p)\n return null\n })\n .filter(p => !!p)\n return ret\n }\n\n static parseImportDir = $ref => {\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 = ($ref, p) => {\n // const dir = ParserUtils.parseImportDir($ref)\n const type = ParserUtils.parseRefType($ref)\n // return `import {${type}} from '${dir}/${type}'`\n return `import { ${type} } from './definitions/${type}'`\n }\n\n static parseRefType = $ref => {\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))\n }\n\n static parseAttributeType = (name, definition) => {\n const required = definition.required ? '' : '?'\n\n const attrName = name.slice(name.lastIndexOf('.') + 1)\n\n if (definition.enums) {\n const enums = definition.enums.map(enm => (definition.type === 'string' ? `'${enm}'` : enm)).join(' | ')\n return `${attrName}${required}: ${enums}`\n }\n\n if (definition.type && definition.type === 'integer') {\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.type && definition.type) {\n return `${attrName}${required}: ${definition.type} | null`\n }\n\n return `${attrName}${required}: any`\n }\n\n static parseBodyParamsType = (bodyParams: any[]) => {\n const [p] = bodyParams\n\n if (!p) return null\n\n if (bodyParams.length > 0 && p?.name !== 'body' && !p?.schema) {\n let retBodyParams = `{${bodyParams.map(p => ParserUtils.parseAttributeType(p.name, p)).join(',')}}`\n retBodyParams = retBodyParams.replace('file?: file', 'file?: File') // fixed TS type File\n return retBodyParams\n }\n\n if (p?.schema?.type === 'array' && !p?.schema?.items?.$ref) {\n return `${p.schema.items.type ?? 'any'}[]`\n }\n\n if (p?.schema?.type === 'array' && p?.schema?.items?.$ref) {\n return `${ParserUtils.parseRefType(p.schema.items.$ref)}[]`\n }\n\n if (p?.schema.$ref) {\n return ParserUtils.parseRefType(p.schema.$ref)\n }\n\n if (p?.schema?.additionalProperties?.type === 'object') {\n return 'any'\n }\n\n return null\n }\n\n static get2xxResponse(methodEntity: any, path?: string): string {\n const keys = Object.keys(methodEntity) as []\n let responseClass = null\n keys.forEach(key => {\n if (String(key).startsWith('2')) {\n const sch = methodEntity[key].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 {\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 getPathParams(parametersArray: any) {\n if (!parametersArray) {\n return []\n }\n const res = []\n for (const p of parametersArray) {\n if (p.in === 'path') {\n res.push(p)\n }\n }\n return res\n }\n\n static generateClassMethod(path: string, parametersArray: any, httpMethod: string, className: string) {\n let replacedIdsPath = path\n if (parametersArray) {\n for (const p of parametersArray) {\n if (p.in === 'path') {\n replacedIdsPath = replacedIdsPath.replace('{' + p.name + '}', 'By' + ParserUtils.toTitleCaseWord(p.name))\n // remove bellow prefixes as they unnecessarily pollute method names getIamV30, etc ..\n replacedIdsPath = replacedIdsPath.replace('/iam', '')\n replacedIdsPath = replacedIdsPath.replace('/odin-config', '')\n }\n }\n }\n let classMethod = httpMethod + '/' + replacedIdsPath\n classMethod = _.camelCase(classMethod)\n\n // Replace long verbose methods with shorter names. e.g.\n // getPublicNamespacesByNamespaceBySomething -> getSomething\n // getAdminNamespacesByNamespaceBySomething -> getAdminSomething\n classMethod = classMethod.replace('PublicNamespacesByNamespace', '')\n classMethod = classMethod.replace('AdminNamespacesByNamespace', 'Admin')\n\n const searchWord = 'NamespacesByNamespace'\n const nsExistInsideMethod =\n classMethod.indexOf(searchWord) > 0 && classMethod.indexOf(searchWord) + searchWord.length < classMethod.length\n const excludedClasses = ['Policies'] // Policies replacement corrupts the file with duplicate methods, skip replacement\n if (nsExistInsideMethod && !excludedClasses.includes(className)) {\n classMethod = classMethod.replace(searchWord, '')\n }\n return classMethod\n }\n\n static getBodyParams(parametersArray: any) {\n if (!parametersArray) return []\n if (!_.isArray(parametersArray) && parametersArray) return [parametersArray].filter(p => p.in === 'body' || p.in === 'formData')\n return parametersArray.filter(p => p.in === 'body' || p.in === 'formData')\n }\n\n static getQueryParameters(parametersArray: any) {\n if (!parametersArray) {\n return []\n }\n const res = []\n for (const p of parametersArray) {\n if (p.in === 'query') {\n res.push(p)\n }\n }\n return res\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 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 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 = JSON.parse(fs.readFileSync(possibleSwaggerPatchFilePath, 'utf8'))\n const { newDocument } = applyPatch(swaggerContent, swaggerPatchFileContent)\n fs.writeFileSync(swaggerPatchedFilePath, JSON.stringify(newDocument, null, 2))\n }\n\n static mapKeys(map_: Map<string, string>) {\n const methods_ = []\n for (const m in map_) {\n methods_.push(m)\n }\n return methods_\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","/*\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 templateJsdocMethod = (classMethod, httpMethod, path, pathParams, bodyParams, queryParams) => {\n let jsdoc = ''\n let methodSignature = ''\n let newPath = path\n for (const p of pathParams) {\n methodSignature += p.name + ', '\n newPath = newPath.replace('{' + p.name + '}', `' + ${p.name} + '`)\n jsdoc += `\n * @pathParam '${p.name}${p.required ? '' : '?'}' - ${p.description}`\n }\n\n let payloads = ''\n for (const p of bodyParams) {\n methodSignature += p.name + ', '\n payloads += p.name\n jsdoc += `\n * @payload '${p.name}${p.required ? '' : '?'}' - ${p.description} ${\n p?.schema?.properties ? '=> ' + JSON.stringify(p.schema.properties) : ''\n }`\n }\n\n for (const p of queryParams) {\n const optionalMark = p.required ? '' : '?'\n methodSignature += p.name + optionalMark + ', '\n jsdoc += `\n * @queryParam '${p.name}${p.required ? '' : '?'}' - ${p.description}`\n }\n\n let queryString = ''\n for (const p of queryParams) {\n queryString += `${p.name}=__&`\n }\n queryString = queryString.length > 0 ? '?' + queryString : ''\n\n return `\n /**\n * ${httpMethod.toUpperCase()} '${newPath}${queryString}' ${payloads ? \"payload: '\" + payloads + \"'\" : ''}\n * ${jsdoc}\n */\n ${classMethod}(${methodSignature}): Promise\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 { ParserUtils } from '../ParserUtils'\n\nexport const templateMethod = (\n classMethod,\n description,\n httpMethod,\n path,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded: boolean,\n responseClass\n) => {\n let methodSignature = ''\n let newPath = `'${path}'`\n let dependencies = []\n\n for (const p of pathParams) {\n const type = ParserUtils.parseType(p.type)\n if (p.name !== 'namespace') {\n methodSignature += p.name + `:${type}` + ', '\n }\n const pName = p.name === 'namespace' ? 'this.namespace' : p.name\n if (path.match(`{${p.name}}`)) {\n if (type === 'string') {\n newPath = `${newPath}.replace('{${p.name}}', ${pName})`\n } else {\n newPath = `${newPath}.replace('{${p.name}}', String(${pName}))`\n }\n }\n }\n\n let dataType = null\n if (httpMethod !== 'get') {\n dataType = ParserUtils.parseBodyParamsType(bodyParams)\n dependencies = ParserUtils.parseBodyParamsImports(bodyParams)\n methodSignature += dataType ? `data: ${dataType},` : ''\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 isCacheFetchUnknown = ['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 let isGuardInvoked = false\n\n if (isCacheFetch) {\n methodImpl = `${descriptionText}\n ${cachedFetchMethod}<T = ${resolvedResponseClass}>(${parameters}): Promise<IResponseWithSync<T>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \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 isGuardInvoked = true\n }\n\n if (isCacheFetchUnknown) {\n methodImpl = `${descriptionText}\n ${cachedFetchMethod}(${parameters}): Promise<IResponseWithSync<unknown>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n const res = () => Validate.responseType(() => resultPromise, z.unknown())\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 isGuardInvoked = true\n }\n\n const withTypeGuard = ['post', 'put', 'patch', 'delete'].includes(httpMethod) && resolvedResponseClass !== 'unknown'\n\n if (withTypeGuard) {\n methodImpl = `${descriptionText}\n ${classMethod}<T = ${resolvedResponseClass}>(${parameters}): Promise<IResponse<T>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n return Validate.responseType(() => resultPromise, ${resolvedResponseClassValidated}) \n }\n `\n isGuardInvoked = true\n }\n\n const withTypeGuardUnknown = ['post', 'put', 'patch', 'delete'].includes(httpMethod) && resolvedResponseClass === 'unknown'\n if (withTypeGuardUnknown) {\n methodImpl = `${descriptionText}\n ${classMethod}(${parameters}): Promise<IResponse<unknown>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n return Validate.responseType(() => resultPromise, z.unknown()) \n }\n `\n isGuardInvoked = true\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]\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 { ParserUtils } from '../ParserUtils'\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\n duplicateFound = false\n //\n private importClasses = new Set()\n\n // --\n render = (name, definition, duplicates) => {\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(name)\n if (containsRecursiveType) {\n this.importClasses.delete(name)\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 = `\n export const ${name}: z.ZodType<${name}> = z.lazy(() =>\n ${content.schemaString}\n )\n `\n exportedTypeString = `\n export type ${name} = {\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 ${name} = ${content.schemaString}`\n exportedTypeString = `export type ${name} = z.TypeOf<typeof ${name}>`\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 if (!definition.properties) {\n return {\n schemaString: 'z.any()',\n typeString: 'any'\n }\n }\n\n const properties = Object.entries(definition.properties) as [string, any]\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 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 ref = definition.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 {\n const items = definition.items\n model = this.parseEnumItems(items)\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'\n import { ${cls} } from './${cls}'\n \n export const ${name} = z.array(${cls})\n\n export type ${name} = 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-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 SwaggerParser from '@apidevtools/swagger-parser'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport path from 'path'\nimport { ParserUtils } from './ParserUtils'\nimport { templateJsdocMethod } from './templates/template-jsdoc-method'\nimport { templateMethod } from './templates/template-method'\nimport { TemplateZod, TemplateZodArray } from './templates/template-zod'\nimport { CliParser } from './CliParser'\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\n static iterateApi = api => {\n const apiBufferByTag = {}\n const jsDocApiBufferByTag = {}\n const dependenciesByTag = {}\n const classImports = {}\n let arrayDefinitions = []\n\n for (const path in api.paths) {\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 entity = api.paths[path]\n\n const methods = ParserUtils.mapKeys(entity)\n for (const httpMethod of methods) {\n const e = entity[httpMethod]\n const [tag] = e.tags\n const description = e.description\n const isDeprecated = e.deprecated\n const responseClass = ParserUtils.get2xxResponse(e.responses, path)\n const className = _.upperFirst(_.camelCase(tag))\n classImports[className] = classImports[className] ? classImports[className] : {}\n\n if (!isDeprecated) {\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 isFormUrlEncoded = ParserUtils.isFormUrlEncoded(httpMethod, e.consumes)\n const queryParams = ParserUtils.getQueryParameters(e.parameters)\n const pathParams = ParserUtils.getPathParams(e.parameters)\n const bodyParams = ParserUtils.getBodyParams(e.parameters)\n const classMethod = ParserUtils.generateClassMethod(path, e.parameters, httpMethod, className)\n\n const baseAndPath = `${api.basePath ?? ''}${path}`\n\n const [generatedMethodString, importStatements] = templateMethod(\n classMethod,\n description,\n httpMethod,\n baseAndPath,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded,\n responseClass\n )\n apiBufferByTag[tag] = (apiBufferByTag[tag] || '') + generatedMethodString\n jsDocApiBufferByTag[tag] =\n (jsDocApiBufferByTag[tag] || '') + templateJsdocMethod(classMethod, httpMethod, path, pathParams, bodyParams, queryParams)\n dependenciesByTag[tag] = dependenciesByTag[tag]\n ? [...new Set([...importStatements, ...dependenciesByTag[tag]])]\n : [...new Set(importStatements)]\n }\n }\n }\n\n arrayDefinitions = [...new Set(arrayDefinitions)]\n return { apiBufferByTag, jsDocApiBufferByTag, dependenciesByTag, classImports, arrayDefinitions }\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_DOCS_DIR = path.join(DIST_DIR, 'docs')\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: any = await parser.parse(swaggerPatchedFilePath)\n\n const indexImportsSet: Set<string> = new Set()\n\n console.log('\\n----------\\n API name: %s, Version: %s schemes %s', api, api.info.title, api.info.version, api.schemes)\n\n ParserUtils.mkdirIfNotExist(DIST_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DOCS_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DEFINITION_DIR)\n\n const { apiBufferByTag, dependenciesByTag, classImports, arrayDefinitions /* jsDocApiBufferByTag, */ } = CodeGenerator.iterateApi(api)\n\n const targetSrcFolder = `${CliParser.getOutputPath()}/`\n\n for (const tag in apiBufferByTag) {\n const className = _.upperFirst(_.camelCase(tag))\n const apiBuffer = apiBufferByTag[tag]\n const imports = [...new Set([...dependenciesByTag[tag], ...Object.values(classImports[className])])]\n\n const classGenName = CliParser.isAdmin() ? className + 'Admin$' : 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()\n for (const ref in api.definitions) {\n const definition = api.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 api.definitions) {\n const definition = api.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('\\n----------\\nCOMPLETED.\\n----------\\n\\n')\n return indexImportsSet\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 * 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 dl 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":["z","fs","path","_","applyPatch","SwaggerParser","https","yargs"],"mappings":"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"}
@@ -483,7 +483,7 @@ const templateMethod = (classMethod, description, httpMethod, path, pathParams,
483
483
  return SdkCache.withoutCache(res)
484
484
  }
485
485
  const cacheKey = url + CodeGenUtil.hashCode(JSON.stringify({ params }))
486
- return SdkCache.withCache(key, cacheKey)
486
+ return SdkCache.withCache(cacheKey, res)
487
487
  }
488
488
  `;
489
489
  isGuardInvoked = true;
@@ -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/templates/template-jsdoc-method.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 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","/*\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\n export 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-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 { applyPatch } from 'fast-json-patch'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport path from 'path'\nimport { templateClass } from './templates/template-class'\nimport { templateJsdocFile } from './templates/template-jsdoc-file'\n\nexport class ParserUtils {\n static parseQueryParamAttributeDefault = (name, definition) => {\n const attrName = name.slice(name.lastIndexOf('.') + 1)\n const defaultValue = definition.type === 'string' ? `'${definition.default}'` : definition.default\n return `${attrName}: ${defaultValue}`\n }\n\n static parseType = type => {\n if (type === 'integer') return 'number'\n if (type === 'array') return 'any[]'\n return type\n }\n\n static parseQueryParamsType = (queryParams: any[]) => {\n return queryParams.map(p => ParserUtils.parseAttributeType(p.name, p)).join(',')\n }\n\n static isAnyQueryParamRequired = (queryParams: any[]) => {\n queryParams.forEach(p => {\n if (p.required) {\n return true\n }\n })\n return false\n }\n\n static parseQueryParamsDefault = (queryParams: any[]) => {\n const result = queryParams\n .filter(p => !!p.default)\n .map(p => ParserUtils.parseQueryParamAttributeDefault(p.name, p))\n .join(',')\n return result ? `${result},` : ''\n }\n\n static parseBodyParamsImports = (bodyParams: any[]) => {\n const ret = bodyParams\n .map(p => {\n if (p?.schema?.$ref) return ParserUtils.parseRefImport(p.schema.$ref, p)\n if (p?.schema?.items?.$ref) return ParserUtils.parseRefImport(p.schema.items.$ref, p)\n if (p?.$ref) return ParserUtils.parseRefImport(p.$ref, p)\n return null\n })\n .filter(p => !!p)\n return ret\n }\n\n static parseImportDir = $ref => {\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 = ($ref, p) => {\n // const dir = ParserUtils.parseImportDir($ref)\n const type = ParserUtils.parseRefType($ref)\n // return `import {${type}} from '${dir}/${type}'`\n return `import { ${type} } from './definitions/${type}'`\n }\n\n static parseRefType = $ref => {\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))\n }\n\n static parseAttributeType = (name, definition) => {\n const required = definition.required ? '' : '?'\n\n const attrName = name.slice(name.lastIndexOf('.') + 1)\n\n if (definition.enums) {\n const enums = definition.enums.map(enm => (definition.type === 'string' ? `'${enm}'` : enm)).join(' | ')\n return `${attrName}${required}: ${enums}`\n }\n\n if (definition.type && definition.type === 'integer') {\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.type && definition.type) {\n return `${attrName}${required}: ${definition.type} | null`\n }\n\n return `${attrName}${required}: any`\n }\n\n static parseBodyParamsType = (bodyParams: any[]) => {\n const [p] = bodyParams\n\n if (!p) return null\n\n if (bodyParams.length > 0 && p?.name !== 'body' && !p?.schema) {\n let retBodyParams = `{${bodyParams.map(p => ParserUtils.parseAttributeType(p.name, p)).join(',')}}`\n retBodyParams = retBodyParams.replace('file?: file', 'file?: File') // fixed TS type File\n return retBodyParams\n }\n\n if (p?.schema?.type === 'array' && !p?.schema?.items?.$ref) {\n return `${p.schema.items.type ?? 'any'}[]`\n }\n\n if (p?.schema?.type === 'array' && p?.schema?.items?.$ref) {\n return `${ParserUtils.parseRefType(p.schema.items.$ref)}[]`\n }\n\n if (p?.schema.$ref) {\n return ParserUtils.parseRefType(p.schema.$ref)\n }\n\n if (p?.schema?.additionalProperties?.type === 'object') {\n return 'any'\n }\n\n return null\n }\n\n static get2xxResponse(methodEntity: any, path?: string): string {\n const keys = Object.keys(methodEntity) as []\n let responseClass = null\n keys.forEach(key => {\n if (String(key).startsWith('2')) {\n const sch = methodEntity[key].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 {\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 getPathParams(parametersArray: any) {\n if (!parametersArray) {\n return []\n }\n const res = []\n for (const p of parametersArray) {\n if (p.in === 'path') {\n res.push(p)\n }\n }\n return res\n }\n\n static generateClassMethod(path: string, parametersArray: any, httpMethod: string, className: string) {\n let replacedIdsPath = path\n if (parametersArray) {\n for (const p of parametersArray) {\n if (p.in === 'path') {\n replacedIdsPath = replacedIdsPath.replace('{' + p.name + '}', 'By' + ParserUtils.toTitleCaseWord(p.name))\n // remove bellow prefixes as they unnecessarily pollute method names getIamV30, etc ..\n replacedIdsPath = replacedIdsPath.replace('/iam', '')\n replacedIdsPath = replacedIdsPath.replace('/odin-config', '')\n }\n }\n }\n let classMethod = httpMethod + '/' + replacedIdsPath\n classMethod = _.camelCase(classMethod)\n\n // Replace long verbose methods with shorter names. e.g.\n // getPublicNamespacesByNamespaceBySomething -> getSomething\n // getAdminNamespacesByNamespaceBySomething -> getAdminSomething\n classMethod = classMethod.replace('PublicNamespacesByNamespace', '')\n classMethod = classMethod.replace('AdminNamespacesByNamespace', 'Admin')\n\n const searchWord = 'NamespacesByNamespace'\n const nsExistInsideMethod =\n classMethod.indexOf(searchWord) > 0 && classMethod.indexOf(searchWord) + searchWord.length < classMethod.length\n const excludedClasses = ['Policies'] // Policies replacement corrupts the file with duplicate methods, skip replacement\n if (nsExistInsideMethod && !excludedClasses.includes(className)) {\n classMethod = classMethod.replace(searchWord, '')\n }\n return classMethod\n }\n\n static getBodyParams(parametersArray: any) {\n if (!parametersArray) return []\n if (!_.isArray(parametersArray) && parametersArray) return [parametersArray].filter(p => p.in === 'body' || p.in === 'formData')\n return parametersArray.filter(p => p.in === 'body' || p.in === 'formData')\n }\n\n static getQueryParameters(parametersArray: any) {\n if (!parametersArray) {\n return []\n }\n const res = []\n for (const p of parametersArray) {\n if (p.in === 'query') {\n res.push(p)\n }\n }\n return res\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 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 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 = JSON.parse(fs.readFileSync(possibleSwaggerPatchFilePath, 'utf8'))\n const { newDocument } = applyPatch(swaggerContent, swaggerPatchFileContent)\n fs.writeFileSync(swaggerPatchedFilePath, JSON.stringify(newDocument, null, 2))\n }\n\n static mapKeys(map_: Map<string, string>) {\n const methods_ = []\n for (const m in map_) {\n methods_.push(m)\n }\n return methods_\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","/*\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 templateJsdocMethod = (classMethod, httpMethod, path, pathParams, bodyParams, queryParams) => {\n let jsdoc = ''\n let methodSignature = ''\n let newPath = path\n for (const p of pathParams) {\n methodSignature += p.name + ', '\n newPath = newPath.replace('{' + p.name + '}', `' + ${p.name} + '`)\n jsdoc += `\n * @pathParam '${p.name}${p.required ? '' : '?'}' - ${p.description}`\n }\n\n let payloads = ''\n for (const p of bodyParams) {\n methodSignature += p.name + ', '\n payloads += p.name\n jsdoc += `\n * @payload '${p.name}${p.required ? '' : '?'}' - ${p.description} ${\n p?.schema?.properties ? '=> ' + JSON.stringify(p.schema.properties) : ''\n }`\n }\n\n for (const p of queryParams) {\n const optionalMark = p.required ? '' : '?'\n methodSignature += p.name + optionalMark + ', '\n jsdoc += `\n * @queryParam '${p.name}${p.required ? '' : '?'}' - ${p.description}`\n }\n\n let queryString = ''\n for (const p of queryParams) {\n queryString += `${p.name}=__&`\n }\n queryString = queryString.length > 0 ? '?' + queryString : ''\n\n return `\n /**\n * ${httpMethod.toUpperCase()} '${newPath}${queryString}' ${payloads ? \"payload: '\" + payloads + \"'\" : ''}\n * ${jsdoc}\n */\n ${classMethod}(${methodSignature}): Promise\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 { ParserUtils } from '../ParserUtils'\n\nexport const templateMethod = (\n classMethod,\n description,\n httpMethod,\n path,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded: boolean,\n responseClass\n) => {\n let methodSignature = ''\n let newPath = `'${path}'`\n let dependencies = []\n\n for (const p of pathParams) {\n const type = ParserUtils.parseType(p.type)\n if (p.name !== 'namespace') {\n methodSignature += p.name + `:${type}` + ', '\n }\n const pName = p.name === 'namespace' ? 'this.namespace' : p.name\n if (path.match(`{${p.name}}`)) {\n if (type === 'string') {\n newPath = `${newPath}.replace('{${p.name}}', ${pName})`\n } else {\n newPath = `${newPath}.replace('{${p.name}}', String(${pName}))`\n }\n }\n }\n\n let dataType = null\n if (httpMethod !== 'get') {\n dataType = ParserUtils.parseBodyParamsType(bodyParams)\n dependencies = ParserUtils.parseBodyParamsImports(bodyParams)\n methodSignature += dataType ? `data: ${dataType},` : ''\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 isCacheFetchUnknown = ['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 let isGuardInvoked = false\n\n if (isCacheFetch) {\n methodImpl = `${descriptionText}\n ${cachedFetchMethod}<T = ${resolvedResponseClass}>(${parameters}): Promise<IResponseWithSync<T>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \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 isGuardInvoked = true\n }\n\n if (isCacheFetchUnknown) {\n methodImpl = `${descriptionText}\n ${cachedFetchMethod}(${parameters}): Promise<IResponseWithSync<unknown>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n const res = () => Validate.responseType(() => resultPromise, z.unknown())\n\n if (!this.cache) {\n return SdkCache.withoutCache(res)\n }\n const cacheKey = url + CodeGenUtil.hashCode(JSON.stringify({ params }))\n return SdkCache.withCache(key, cacheKey)\n }\n `\n isGuardInvoked = true\n }\n\n const withTypeGuard = ['post', 'put', 'patch', 'delete'].includes(httpMethod) && resolvedResponseClass !== 'unknown'\n\n if (withTypeGuard) {\n methodImpl = `${descriptionText}\n ${classMethod}<T = ${resolvedResponseClass}>(${parameters}): Promise<IResponse<T>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n return Validate.responseType(() => resultPromise, ${resolvedResponseClassValidated}) \n }\n `\n isGuardInvoked = true\n }\n\n const withTypeGuardUnknown = ['post', 'put', 'patch', 'delete'].includes(httpMethod) && resolvedResponseClass === 'unknown'\n if (withTypeGuardUnknown) {\n methodImpl = `${descriptionText}\n ${classMethod}(${parameters}): Promise<IResponse<unknown>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n return Validate.responseType(() => resultPromise, z.unknown()) \n }\n `\n isGuardInvoked = true\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]\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 { ParserUtils } from '../ParserUtils'\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\n duplicateFound = false\n //\n private importClasses = new Set()\n\n // --\n render = (name, definition, duplicates) => {\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(name)\n if (containsRecursiveType) {\n this.importClasses.delete(name)\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 = `\n export const ${name}: z.ZodType<${name}> = z.lazy(() =>\n ${content.schemaString}\n )\n `\n exportedTypeString = `\n export type ${name} = {\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 ${name} = ${content.schemaString}`\n exportedTypeString = `export type ${name} = z.TypeOf<typeof ${name}>`\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 if (!definition.properties) {\n return {\n schemaString: 'z.any()',\n typeString: 'any'\n }\n }\n\n const properties = Object.entries(definition.properties) as [string, any]\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 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 ref = definition.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 {\n const items = definition.items\n model = this.parseEnumItems(items)\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'\n import { ${cls} } from './${cls}'\n \n export const ${name} = z.array(${cls})\n\n export type ${name} = 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-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 SwaggerParser from '@apidevtools/swagger-parser'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport path from 'path'\nimport { ParserUtils } from './ParserUtils'\nimport { templateJsdocMethod } from './templates/template-jsdoc-method'\nimport { templateMethod } from './templates/template-method'\nimport { TemplateZod, TemplateZodArray } from './templates/template-zod'\nimport { CliParser } from './CliParser'\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\n static iterateApi = api => {\n const apiBufferByTag = {}\n const jsDocApiBufferByTag = {}\n const dependenciesByTag = {}\n const classImports = {}\n let arrayDefinitions = []\n\n for (const path in api.paths) {\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 entity = api.paths[path]\n\n const methods = ParserUtils.mapKeys(entity)\n for (const httpMethod of methods) {\n const e = entity[httpMethod]\n const [tag] = e.tags\n const description = e.description\n const isDeprecated = e.deprecated\n const responseClass = ParserUtils.get2xxResponse(e.responses, path)\n const className = _.upperFirst(_.camelCase(tag))\n classImports[className] = classImports[className] ? classImports[className] : {}\n\n if (!isDeprecated) {\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 isFormUrlEncoded = ParserUtils.isFormUrlEncoded(httpMethod, e.consumes)\n const queryParams = ParserUtils.getQueryParameters(e.parameters)\n const pathParams = ParserUtils.getPathParams(e.parameters)\n const bodyParams = ParserUtils.getBodyParams(e.parameters)\n const classMethod = ParserUtils.generateClassMethod(path, e.parameters, httpMethod, className)\n\n const baseAndPath = `${api.basePath ?? ''}${path}`\n\n const [generatedMethodString, importStatements] = templateMethod(\n classMethod,\n description,\n httpMethod,\n baseAndPath,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded,\n responseClass\n )\n apiBufferByTag[tag] = (apiBufferByTag[tag] || '') + generatedMethodString\n jsDocApiBufferByTag[tag] =\n (jsDocApiBufferByTag[tag] || '') + templateJsdocMethod(classMethod, httpMethod, path, pathParams, bodyParams, queryParams)\n dependenciesByTag[tag] = dependenciesByTag[tag]\n ? [...new Set([...importStatements, ...dependenciesByTag[tag]])]\n : [...new Set(importStatements)]\n }\n }\n }\n\n arrayDefinitions = [...new Set(arrayDefinitions)]\n return { apiBufferByTag, jsDocApiBufferByTag, dependenciesByTag, classImports, arrayDefinitions }\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_DOCS_DIR = path.join(DIST_DIR, 'docs')\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: any = await parser.parse(swaggerPatchedFilePath)\n\n const indexImportsSet: Set<string> = new Set()\n\n console.log('\\n----------\\n API name: %s, Version: %s schemes %s', api, api.info.title, api.info.version, api.schemes)\n\n ParserUtils.mkdirIfNotExist(DIST_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DOCS_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DEFINITION_DIR)\n\n const { apiBufferByTag, dependenciesByTag, classImports, arrayDefinitions /* jsDocApiBufferByTag, */ } = CodeGenerator.iterateApi(api)\n\n const targetSrcFolder = `${CliParser.getOutputPath()}/`\n\n for (const tag in apiBufferByTag) {\n const className = _.upperFirst(_.camelCase(tag))\n const apiBuffer = apiBufferByTag[tag]\n const imports = [...new Set([...dependenciesByTag[tag], ...Object.values(classImports[className])])]\n\n const classGenName = CliParser.isAdmin() ? className + 'Admin$' : 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()\n for (const ref in api.definitions) {\n const definition = api.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 api.definitions) {\n const definition = api.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('\\n----------\\nCOMPLETED.\\n----------\\n\\n')\n return indexImportsSet\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 * 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 dl 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-jsdoc-file.ts","../src/ParserUtils.ts","../src/templates/template-jsdoc-method.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 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","/*\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\n export 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-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 { applyPatch } from 'fast-json-patch'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport path from 'path'\nimport { templateClass } from './templates/template-class'\nimport { templateJsdocFile } from './templates/template-jsdoc-file'\n\nexport class ParserUtils {\n static parseQueryParamAttributeDefault = (name, definition) => {\n const attrName = name.slice(name.lastIndexOf('.') + 1)\n const defaultValue = definition.type === 'string' ? `'${definition.default}'` : definition.default\n return `${attrName}: ${defaultValue}`\n }\n\n static parseType = type => {\n if (type === 'integer') return 'number'\n if (type === 'array') return 'any[]'\n return type\n }\n\n static parseQueryParamsType = (queryParams: any[]) => {\n return queryParams.map(p => ParserUtils.parseAttributeType(p.name, p)).join(',')\n }\n\n static isAnyQueryParamRequired = (queryParams: any[]) => {\n queryParams.forEach(p => {\n if (p.required) {\n return true\n }\n })\n return false\n }\n\n static parseQueryParamsDefault = (queryParams: any[]) => {\n const result = queryParams\n .filter(p => !!p.default)\n .map(p => ParserUtils.parseQueryParamAttributeDefault(p.name, p))\n .join(',')\n return result ? `${result},` : ''\n }\n\n static parseBodyParamsImports = (bodyParams: any[]) => {\n const ret = bodyParams\n .map(p => {\n if (p?.schema?.$ref) return ParserUtils.parseRefImport(p.schema.$ref, p)\n if (p?.schema?.items?.$ref) return ParserUtils.parseRefImport(p.schema.items.$ref, p)\n if (p?.$ref) return ParserUtils.parseRefImport(p.$ref, p)\n return null\n })\n .filter(p => !!p)\n return ret\n }\n\n static parseImportDir = $ref => {\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 = ($ref, p) => {\n // const dir = ParserUtils.parseImportDir($ref)\n const type = ParserUtils.parseRefType($ref)\n // return `import {${type}} from '${dir}/${type}'`\n return `import { ${type} } from './definitions/${type}'`\n }\n\n static parseRefType = $ref => {\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))\n }\n\n static parseAttributeType = (name, definition) => {\n const required = definition.required ? '' : '?'\n\n const attrName = name.slice(name.lastIndexOf('.') + 1)\n\n if (definition.enums) {\n const enums = definition.enums.map(enm => (definition.type === 'string' ? `'${enm}'` : enm)).join(' | ')\n return `${attrName}${required}: ${enums}`\n }\n\n if (definition.type && definition.type === 'integer') {\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.type && definition.type) {\n return `${attrName}${required}: ${definition.type} | null`\n }\n\n return `${attrName}${required}: any`\n }\n\n static parseBodyParamsType = (bodyParams: any[]) => {\n const [p] = bodyParams\n\n if (!p) return null\n\n if (bodyParams.length > 0 && p?.name !== 'body' && !p?.schema) {\n let retBodyParams = `{${bodyParams.map(p => ParserUtils.parseAttributeType(p.name, p)).join(',')}}`\n retBodyParams = retBodyParams.replace('file?: file', 'file?: File') // fixed TS type File\n return retBodyParams\n }\n\n if (p?.schema?.type === 'array' && !p?.schema?.items?.$ref) {\n return `${p.schema.items.type ?? 'any'}[]`\n }\n\n if (p?.schema?.type === 'array' && p?.schema?.items?.$ref) {\n return `${ParserUtils.parseRefType(p.schema.items.$ref)}[]`\n }\n\n if (p?.schema.$ref) {\n return ParserUtils.parseRefType(p.schema.$ref)\n }\n\n if (p?.schema?.additionalProperties?.type === 'object') {\n return 'any'\n }\n\n return null\n }\n\n static get2xxResponse(methodEntity: any, path?: string): string {\n const keys = Object.keys(methodEntity) as []\n let responseClass = null\n keys.forEach(key => {\n if (String(key).startsWith('2')) {\n const sch = methodEntity[key].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 {\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 getPathParams(parametersArray: any) {\n if (!parametersArray) {\n return []\n }\n const res = []\n for (const p of parametersArray) {\n if (p.in === 'path') {\n res.push(p)\n }\n }\n return res\n }\n\n static generateClassMethod(path: string, parametersArray: any, httpMethod: string, className: string) {\n let replacedIdsPath = path\n if (parametersArray) {\n for (const p of parametersArray) {\n if (p.in === 'path') {\n replacedIdsPath = replacedIdsPath.replace('{' + p.name + '}', 'By' + ParserUtils.toTitleCaseWord(p.name))\n // remove bellow prefixes as they unnecessarily pollute method names getIamV30, etc ..\n replacedIdsPath = replacedIdsPath.replace('/iam', '')\n replacedIdsPath = replacedIdsPath.replace('/odin-config', '')\n }\n }\n }\n let classMethod = httpMethod + '/' + replacedIdsPath\n classMethod = _.camelCase(classMethod)\n\n // Replace long verbose methods with shorter names. e.g.\n // getPublicNamespacesByNamespaceBySomething -> getSomething\n // getAdminNamespacesByNamespaceBySomething -> getAdminSomething\n classMethod = classMethod.replace('PublicNamespacesByNamespace', '')\n classMethod = classMethod.replace('AdminNamespacesByNamespace', 'Admin')\n\n const searchWord = 'NamespacesByNamespace'\n const nsExistInsideMethod =\n classMethod.indexOf(searchWord) > 0 && classMethod.indexOf(searchWord) + searchWord.length < classMethod.length\n const excludedClasses = ['Policies'] // Policies replacement corrupts the file with duplicate methods, skip replacement\n if (nsExistInsideMethod && !excludedClasses.includes(className)) {\n classMethod = classMethod.replace(searchWord, '')\n }\n return classMethod\n }\n\n static getBodyParams(parametersArray: any) {\n if (!parametersArray) return []\n if (!_.isArray(parametersArray) && parametersArray) return [parametersArray].filter(p => p.in === 'body' || p.in === 'formData')\n return parametersArray.filter(p => p.in === 'body' || p.in === 'formData')\n }\n\n static getQueryParameters(parametersArray: any) {\n if (!parametersArray) {\n return []\n }\n const res = []\n for (const p of parametersArray) {\n if (p.in === 'query') {\n res.push(p)\n }\n }\n return res\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 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 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 = JSON.parse(fs.readFileSync(possibleSwaggerPatchFilePath, 'utf8'))\n const { newDocument } = applyPatch(swaggerContent, swaggerPatchFileContent)\n fs.writeFileSync(swaggerPatchedFilePath, JSON.stringify(newDocument, null, 2))\n }\n\n static mapKeys(map_: Map<string, string>) {\n const methods_ = []\n for (const m in map_) {\n methods_.push(m)\n }\n return methods_\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","/*\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 templateJsdocMethod = (classMethod, httpMethod, path, pathParams, bodyParams, queryParams) => {\n let jsdoc = ''\n let methodSignature = ''\n let newPath = path\n for (const p of pathParams) {\n methodSignature += p.name + ', '\n newPath = newPath.replace('{' + p.name + '}', `' + ${p.name} + '`)\n jsdoc += `\n * @pathParam '${p.name}${p.required ? '' : '?'}' - ${p.description}`\n }\n\n let payloads = ''\n for (const p of bodyParams) {\n methodSignature += p.name + ', '\n payloads += p.name\n jsdoc += `\n * @payload '${p.name}${p.required ? '' : '?'}' - ${p.description} ${\n p?.schema?.properties ? '=> ' + JSON.stringify(p.schema.properties) : ''\n }`\n }\n\n for (const p of queryParams) {\n const optionalMark = p.required ? '' : '?'\n methodSignature += p.name + optionalMark + ', '\n jsdoc += `\n * @queryParam '${p.name}${p.required ? '' : '?'}' - ${p.description}`\n }\n\n let queryString = ''\n for (const p of queryParams) {\n queryString += `${p.name}=__&`\n }\n queryString = queryString.length > 0 ? '?' + queryString : ''\n\n return `\n /**\n * ${httpMethod.toUpperCase()} '${newPath}${queryString}' ${payloads ? \"payload: '\" + payloads + \"'\" : ''}\n * ${jsdoc}\n */\n ${classMethod}(${methodSignature}): Promise\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 { ParserUtils } from '../ParserUtils'\n\nexport const templateMethod = (\n classMethod,\n description,\n httpMethod,\n path,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded: boolean,\n responseClass\n) => {\n let methodSignature = ''\n let newPath = `'${path}'`\n let dependencies = []\n\n for (const p of pathParams) {\n const type = ParserUtils.parseType(p.type)\n if (p.name !== 'namespace') {\n methodSignature += p.name + `:${type}` + ', '\n }\n const pName = p.name === 'namespace' ? 'this.namespace' : p.name\n if (path.match(`{${p.name}}`)) {\n if (type === 'string') {\n newPath = `${newPath}.replace('{${p.name}}', ${pName})`\n } else {\n newPath = `${newPath}.replace('{${p.name}}', String(${pName}))`\n }\n }\n }\n\n let dataType = null\n if (httpMethod !== 'get') {\n dataType = ParserUtils.parseBodyParamsType(bodyParams)\n dependencies = ParserUtils.parseBodyParamsImports(bodyParams)\n methodSignature += dataType ? `data: ${dataType},` : ''\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 isCacheFetchUnknown = ['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 let isGuardInvoked = false\n\n if (isCacheFetch) {\n methodImpl = `${descriptionText}\n ${cachedFetchMethod}<T = ${resolvedResponseClass}>(${parameters}): Promise<IResponseWithSync<T>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \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 isGuardInvoked = true\n }\n\n if (isCacheFetchUnknown) {\n methodImpl = `${descriptionText}\n ${cachedFetchMethod}(${parameters}): Promise<IResponseWithSync<unknown>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n const res = () => Validate.responseType(() => resultPromise, z.unknown())\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 isGuardInvoked = true\n }\n\n const withTypeGuard = ['post', 'put', 'patch', 'delete'].includes(httpMethod) && resolvedResponseClass !== 'unknown'\n\n if (withTypeGuard) {\n methodImpl = `${descriptionText}\n ${classMethod}<T = ${resolvedResponseClass}>(${parameters}): Promise<IResponse<T>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n return Validate.responseType(() => resultPromise, ${resolvedResponseClassValidated}) \n }\n `\n isGuardInvoked = true\n }\n\n const withTypeGuardUnknown = ['post', 'put', 'patch', 'delete'].includes(httpMethod) && resolvedResponseClass === 'unknown'\n if (withTypeGuardUnknown) {\n methodImpl = `${descriptionText}\n ${classMethod}(${parameters}): Promise<IResponse<unknown>> {\n ${queryParamsDefault}\n const url = ${newPath} ${formPayloadString} ${isFileUpload ? '\\n// TODO file upload not implemented' : ''}\n const resultPromise = this.axiosInstance.${httpMethod}(url, ${dataPayload})\n \n return Validate.responseType(() => resultPromise, z.unknown()) \n }\n `\n isGuardInvoked = true\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]\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 { ParserUtils } from '../ParserUtils'\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\n duplicateFound = false\n //\n private importClasses = new Set()\n\n // --\n render = (name, definition, duplicates) => {\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(name)\n if (containsRecursiveType) {\n this.importClasses.delete(name)\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 = `\n export const ${name}: z.ZodType<${name}> = z.lazy(() =>\n ${content.schemaString}\n )\n `\n exportedTypeString = `\n export type ${name} = {\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 ${name} = ${content.schemaString}`\n exportedTypeString = `export type ${name} = z.TypeOf<typeof ${name}>`\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 if (!definition.properties) {\n return {\n schemaString: 'z.any()',\n typeString: 'any'\n }\n }\n\n const properties = Object.entries(definition.properties) as [string, any]\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 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 ref = definition.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 {\n const items = definition.items\n model = this.parseEnumItems(items)\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'\n import { ${cls} } from './${cls}'\n \n export const ${name} = z.array(${cls})\n\n export type ${name} = 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-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 SwaggerParser from '@apidevtools/swagger-parser'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport path from 'path'\nimport { ParserUtils } from './ParserUtils'\nimport { templateJsdocMethod } from './templates/template-jsdoc-method'\nimport { templateMethod } from './templates/template-method'\nimport { TemplateZod, TemplateZodArray } from './templates/template-zod'\nimport { CliParser } from './CliParser'\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\n static iterateApi = api => {\n const apiBufferByTag = {}\n const jsDocApiBufferByTag = {}\n const dependenciesByTag = {}\n const classImports = {}\n let arrayDefinitions = []\n\n for (const path in api.paths) {\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 entity = api.paths[path]\n\n const methods = ParserUtils.mapKeys(entity)\n for (const httpMethod of methods) {\n const e = entity[httpMethod]\n const [tag] = e.tags\n const description = e.description\n const isDeprecated = e.deprecated\n const responseClass = ParserUtils.get2xxResponse(e.responses, path)\n const className = _.upperFirst(_.camelCase(tag))\n classImports[className] = classImports[className] ? classImports[className] : {}\n\n if (!isDeprecated) {\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 isFormUrlEncoded = ParserUtils.isFormUrlEncoded(httpMethod, e.consumes)\n const queryParams = ParserUtils.getQueryParameters(e.parameters)\n const pathParams = ParserUtils.getPathParams(e.parameters)\n const bodyParams = ParserUtils.getBodyParams(e.parameters)\n const classMethod = ParserUtils.generateClassMethod(path, e.parameters, httpMethod, className)\n\n const baseAndPath = `${api.basePath ?? ''}${path}`\n\n const [generatedMethodString, importStatements] = templateMethod(\n classMethod,\n description,\n httpMethod,\n baseAndPath,\n pathParams,\n bodyParams,\n queryParams,\n isFormUrlEncoded,\n responseClass\n )\n apiBufferByTag[tag] = (apiBufferByTag[tag] || '') + generatedMethodString\n jsDocApiBufferByTag[tag] =\n (jsDocApiBufferByTag[tag] || '') + templateJsdocMethod(classMethod, httpMethod, path, pathParams, bodyParams, queryParams)\n dependenciesByTag[tag] = dependenciesByTag[tag]\n ? [...new Set([...importStatements, ...dependenciesByTag[tag]])]\n : [...new Set(importStatements)]\n }\n }\n }\n\n arrayDefinitions = [...new Set(arrayDefinitions)]\n return { apiBufferByTag, jsDocApiBufferByTag, dependenciesByTag, classImports, arrayDefinitions }\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_DOCS_DIR = path.join(DIST_DIR, 'docs')\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: any = await parser.parse(swaggerPatchedFilePath)\n\n const indexImportsSet: Set<string> = new Set()\n\n console.log('\\n----------\\n API name: %s, Version: %s schemes %s', api, api.info.title, api.info.version, api.schemes)\n\n ParserUtils.mkdirIfNotExist(DIST_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DOCS_DIR)\n ParserUtils.mkdirIfNotExist(DIST_DEFINITION_DIR)\n\n const { apiBufferByTag, dependenciesByTag, classImports, arrayDefinitions /* jsDocApiBufferByTag, */ } = CodeGenerator.iterateApi(api)\n\n const targetSrcFolder = `${CliParser.getOutputPath()}/`\n\n for (const tag in apiBufferByTag) {\n const className = _.upperFirst(_.camelCase(tag))\n const apiBuffer = apiBufferByTag[tag]\n const imports = [...new Set([...dependenciesByTag[tag], ...Object.values(classImports[className])])]\n\n const classGenName = CliParser.isAdmin() ? className + 'Admin$' : 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()\n for (const ref in api.definitions) {\n const definition = api.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 api.definitions) {\n const definition = api.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('\\n----------\\nCOMPLETED.\\n----------\\n\\n')\n return indexImportsSet\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 * 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 dl 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@accelbyte/codegen",
3
- "version": "1.0.0-alpha.2",
3
+ "version": "1.0.0-alpha.3",
4
4
  "author": "AccelByte Inc",
5
5
  "license": "AccelByte License",
6
6
  "main": "dist/accelbyte-codegen.js",