{"version":3,"file":"params-factory.mjs","sources":["../../src/client/params-factory.ts"],"sourcesContent":["import { DecIndent, DecIndentAndCloseBlock, DocumentParts, IncIndent, indent, jsDoc, NewLine } from '../output/writer'\nimport { GeneratorContext } from './generator-context'\nimport { BARE_CALL, MethodList } from './helpers/get-call-config-summary'\nimport { getCreateOnCompleteOptions } from './deploy-types'\nimport { Sanitizer } from '../util/sanitization'\nimport { Method } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport { ABIMethod } from 'algosdk'\n\nexport function* paramsFactory(ctx: GeneratorContext): DocumentParts {\n  yield* jsDoc(`Exposes methods for constructing \\`AppClient\\` params objects for ABI calls to the ${ctx.name} smart contract`)\n  yield `export abstract class ${ctx.name}ParamsFactory {`\n  yield IncIndent\n\n  yield* opMethods(ctx)\n\n  for (const method of ctx.app.methods) {\n    yield* callFactoryMethod(ctx, method)\n  }\n\n  yield DecIndent\n\n  yield '}'\n}\n\nfunction* opMethods(ctx: GeneratorContext): DocumentParts {\n  const { app, callConfig } = ctx\n\n  if (ctx.mode === 'full') {\n    yield* operationMethod(\n      ctx,\n      `Constructs create ABI call params for the ${app.name} smart contract`,\n      callConfig.createMethods,\n      'create',\n      true,\n    )\n    yield* operationMethod(\n      ctx,\n      `Constructs update ABI call params for the ${app.name} smart contract`,\n      callConfig.updateMethods,\n      'update',\n      true,\n    )\n    yield* operationMethod(ctx, `Constructs delete ABI call params for the ${app.name} smart contract`, callConfig.deleteMethods, 'delete')\n  }\n  yield* operationMethod(ctx, `Constructs opt-in ABI call params for the ${app.name} smart contract`, callConfig.optInMethods, 'optIn')\n  yield* operationMethod(\n    ctx,\n    `Constructs close out ABI call params for the ${app.name} smart contract`,\n    callConfig.closeOutMethods,\n    'closeOut',\n  )\n}\n\nfunction* operationMethod(\n  ctx: GeneratorContext,\n  description: string,\n  methods: MethodList,\n  verb: 'create' | 'update' | 'optIn' | 'closeOut' | 'delete',\n  includeCompilation?: boolean,\n): DocumentParts {\n  const { app, methodSignatureToUniqueName, sanitizer, name } = ctx\n  if (methods.length > 0 && methods.some((m) => m !== BARE_CALL)) {\n    yield* jsDoc(`Gets available ${verb} ABI call param factories`)\n    yield `static get ${verb}() {`\n    yield IncIndent\n    yield `return {`\n    yield IncIndent\n\n    if (['create', 'update', 'delete'].includes(verb)) {\n      yield `_resolveByMethod<TParams extends ${ctx.name}${verb[0].toUpperCase()}${verb.substring(1)}CallParams & {method: string}>(params: TParams) {`\n      yield IncIndent\n      yield `switch(params.method) {`\n      yield IncIndent\n\n      for (const methodSig of methods) {\n        if (methodSig === BARE_CALL) continue\n\n        const uniqueName = methodSignatureToUniqueName[methodSig]\n        if (uniqueName !== methodSig) {\n          yield `case '${sanitizer.makeSafeStringTypeLiteral(uniqueName)}':`\n        }\n        yield `case '${sanitizer.makeSafeStringTypeLiteral(methodSig)}':`\n        yield* indent(\n          `return ${ctx.name}ParamsFactory.${verb}${sanitizer.getSafeMemberAccessor(sanitizer.makeSafeMethodIdentifier(uniqueName))}(params)`,\n        )\n      }\n      yield DecIndentAndCloseBlock\n\n      // Ordinarily we'd pop in the params.method value, but we can't here since it knows at compile time the type of params.method is never\n      yield `throw new Error(\\`Unknown ' + verb + ' method\\`)`\n      yield DecIndent\n      yield '},'\n      yield NewLine\n    }\n\n    for (const methodSig of methods) {\n      const onComplete = verb === 'create' ? getCreateOnCompleteOptions(methodSig, app) : undefined\n      if (methodSig !== BARE_CALL) {\n        const method = app.methods.find((m) => new ABIMethod(m).getSignature() === methodSig)!\n        const uniqueName = methodSignatureToUniqueName[methodSig]\n        yield* jsDoc({\n          description: `${description} using the ${methodSig} ABI method`,\n          params: {\n            params: `Parameters for the call`,\n          },\n          returns: 'An `AppClientMethodCallParams` object for the call',\n        })\n        yield* factoryMethod({\n          isNested: true,\n          sanitizer,\n          name: sanitizer.makeSafeMethodIdentifier(uniqueName),\n          signature: methodSig,\n          args: method.args,\n          additionalParamTypes: `${includeCompilation ? ' & AppClientCompilationParams' : ''}${\n            onComplete?.type ? ` & ${onComplete.type}` : ''\n          }`,\n          contractName: name,\n        })\n      }\n    }\n    yield DecIndentAndCloseBlock\n    yield DecIndentAndCloseBlock\n    yield NewLine\n  }\n}\n\nfunction* callFactoryMethod({ methodSignatureToUniqueName, callConfig, sanitizer, name }: GeneratorContext, method: Method) {\n  const methodSignature = new ABIMethod(method).getSignature()\n  if (!callConfig.callMethods.includes(methodSignature)) return\n\n  yield* jsDoc({\n    description: `Constructs a no op call for the ${methodSignature} ABI method`,\n    abiDescription: method.desc,\n    params: {\n      params: `Parameters for the call`,\n    },\n    returns: 'An `AppClientMethodCallParams` object for the call',\n  })\n  yield* factoryMethod({\n    isNested: false,\n    sanitizer,\n    name: sanitizer.makeSafeMethodIdentifier(methodSignatureToUniqueName[methodSignature]),\n    signature: methodSignature,\n    args: method.args,\n    additionalParamTypes: ' & CallOnComplete',\n    contractName: name,\n  })\n}\n\nfunction* factoryMethod(m: {\n  isNested: boolean\n  name?: string\n  signature: string\n  args: Array<{ name?: string }>\n  additionalParamTypes?: string\n  sanitizer: Sanitizer\n  contractName: string\n}) {\n  const { isNested, name, signature, args, additionalParamTypes, sanitizer, contractName } = m\n  const methodSigSafe = sanitizer.makeSafeStringTypeLiteral(signature)\n  yield `${isNested ? '' : 'static '}${name}(params: CallParams<${contractName}Args['obj']['${methodSigSafe}'] | ${contractName}Args['tuple']['${methodSigSafe}']>${additionalParamTypes}): AppClientMethodCallParams${additionalParamTypes} {`\n  yield IncIndent\n  yield `return {`\n  yield IncIndent\n  yield '...params,'\n  yield `method: '${methodSigSafe}' as const,`\n  yield `args: Array.isArray(params.args) ? params.args : [${args\n    .map((a, i) => `params.args${sanitizer.getSafeMemberAccessor(sanitizer.makeSafePropertyIdentifier(a.name ?? `arg${i + 1}`))}`)\n    .join(', ')}],`\n  yield DecIndent\n  yield '}'\n  yield DecIndent\n  yield `}${isNested ? ',' : ''}`\n}\n"],"names":[],"mappings":"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"}