{"version":3,"file":"call-composer.mjs","sources":["../../src/client/call-composer.ts"],"sourcesContent":["import { DecIndent, DecIndentAndCloseBlock, DocumentParts, IncIndent, jsDoc } from '../output/writer'\nimport { GeneratorContext } from './generator-context'\nimport { BARE_CALL, MethodList } from './helpers/get-call-config-summary'\nimport { getCallOnCompleteOptions } from './deploy-types'\nimport { ABIMethod, ABIMethodParams } from 'algosdk'\n\nexport function* composeMethod(ctx: GeneratorContext): DocumentParts {\n  const { name, callConfig } = ctx\n  // todo: Patrick feedback - allow common params to be passed in here so they propagate to all params calls e.g. firstValid\n  yield `public newGroup(): ${name}Composer {`\n  yield IncIndent\n\n  yield `const client = this`\n  yield `const composer = this.algorand.newGroup()`\n  yield `let promiseChain:Promise<unknown> = Promise.resolve()`\n  yield `const resultMappers: Array<undefined | ((x: ABIReturn | undefined) => any)> = []`\n  yield `return {`\n  yield IncIndent\n\n  yield* callComposerNoops(ctx)\n  if (ctx.mode === 'full') {\n    yield* callComposerOperationMethods(ctx, callConfig.updateMethods, 'update', true)\n    yield* callComposerOperationMethods(ctx, callConfig.deleteMethods, 'delete')\n  }\n  yield* callComposerOperationMethods(ctx, callConfig.optInMethods, 'optIn')\n  yield* callComposerOperationMethods(ctx, callConfig.closeOutMethods, 'closeOut')\n  yield* callComposerClearState(ctx)\n\n  yield `addTransaction(txn: Transaction, signer?: TransactionSigner) {`\n  yield IncIndent\n  yield 'promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))'\n  yield 'return this'\n  yield DecIndent\n  yield '},'\n\n  yield `async composer() {`\n  yield IncIndent\n  yield `await promiseChain`\n  yield 'return composer'\n  yield DecIndent\n  yield '},'\n\n  yield `async simulate(options?: SimulateOptions) {`\n  yield IncIndent\n  yield `await promiseChain`\n  yield `const result = await (!options ? composer.simulate() : composer.simulate(options))`\n  yield `return {`\n  yield IncIndent\n  yield `...result,`\n  yield `returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)`\n  yield DecIndentAndCloseBlock\n  yield DecIndent\n  yield '},'\n\n  yield `async send(params?: SendParams) {`\n  yield IncIndent\n  yield `await promiseChain`\n  yield `const result = await composer.send(params)`\n  yield `return {`\n  yield IncIndent\n  yield `...result,`\n  yield `returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)`\n  yield DecIndentAndCloseBlock\n  yield DecIndentAndCloseBlock\n  yield DecIndent\n  yield `} as unknown as ${name}Composer`\n\n  yield DecIndentAndCloseBlock\n}\n\nfunction* callComposerNoops({ app, name, callConfig, methodSignatureToUniqueName, sanitizer }: GeneratorContext): DocumentParts {\n  if (callConfig.callMethods.includes(BARE_CALL)) {\n    yield* jsDoc(`Add a bare method call to the ${app.name} contract`)\n    yield `bare(params: AppClientBareCallParams & ${getCallOnCompleteOptions(BARE_CALL, app).type}) {`\n    yield IncIndent\n    yield `promiseChain = promiseChain.then(() => composer.addAppCall(client.params.bare(params)))`\n    yield `return this`\n    yield DecIndent\n    yield '},'\n  }\n\n  for (const methodSignature of callConfig.callMethods.filter((m) => m !== BARE_CALL).map((m) => m as string)) {\n    const methodName = sanitizer.makeSafeMethodIdentifier(methodSignatureToUniqueName[methodSignature])\n    const methodSigSafe = sanitizer.makeSafeStringTypeLiteral(methodSignature)\n    const methodNameAccessor = sanitizer.getSafeMemberAccessor(methodName)\n    // Skip methods which don't support a no_op call config\n    if (!callConfig.callMethods.includes(methodSignature)) continue\n    yield* jsDoc(`Add a ${methodSignature} method call against the ${app.name} contract`)\n    yield `${methodName}(params: CallParams<${name}Args['obj']['${methodSigSafe}'] | ${name}Args['tuple']['${methodSigSafe}']> & ${getCallOnCompleteOptions(methodSignature, app).type}) {`\n    yield IncIndent\n    yield `promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params${methodNameAccessor}(params)))`\n    const outputTypeName = app.methods.find((m: ABIMethodParams) => new ABIMethod(m).getSignature() === methodSignature)?.returns.type\n    yield `resultMappers.push(${outputTypeName && outputTypeName !== 'void' ? `(v) => client.decodeReturnValue('${methodSigSafe}', v)` : 'undefined'})`\n    yield `return this`\n    yield DecIndent\n    yield '},'\n  }\n}\n\nfunction* callComposerClearState({ app }: GeneratorContext): DocumentParts {\n  yield* jsDoc(`Add a clear state call to the ${app.name} contract`)\n  yield `clearState(params: AppClientBareCallParams) {`\n  yield IncIndent\n  yield `promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))`\n  yield `return this`\n  yield DecIndent\n  yield '},'\n}\n\nfunction* callComposerOperationMethods(\n  { app, name, methodSignatureToUniqueName, sanitizer }: GeneratorContext,\n  methods: MethodList,\n  verb: 'update' | 'optIn' | 'closeOut' | 'delete',\n  includeCompilation?: boolean,\n): DocumentParts {\n  const callType = verb === 'update' ? 'Update' : verb === 'delete' ? 'Delete' : 'Call'\n  if (methods.length) {\n    yield `get ${verb}() {`\n    yield IncIndent\n    yield `return {`\n    yield IncIndent\n    for (const methodSig of methods) {\n      if (methodSig === BARE_CALL) {\n        yield `bare: (params?: AppClientBareCallParams ${includeCompilation ? '& AppClientCompilationParams ' : ''}) => {`\n        yield IncIndent\n        yield `promiseChain = promiseChain.then(${verb === 'update' ? 'async ' : ''}() => composer.addApp${callType}(${verb === 'update' ? 'await ' : ''}client.params.${verb}.bare(params)))`\n        yield `return this`\n        yield DecIndent\n        yield '},'\n      } else {\n        const uniqueName = methodSignatureToUniqueName[methodSig]\n        const methodName = sanitizer.makeSafeMethodIdentifier(uniqueName)\n        const methodNameAccessor = sanitizer.getSafeMemberAccessor(methodName)\n        const methodSigSafe = sanitizer.makeSafeStringTypeLiteral(methodSig)\n        yield `${methodName}: (params: CallParams<${name}Args['obj']['${methodSigSafe}'] | ${name}Args['tuple']['${methodSigSafe}']>${includeCompilation ? ' & AppClientCompilationParams' : ''}) => {`\n        yield IncIndent\n        yield `promiseChain = promiseChain.then(async () => composer.addApp${callType}MethodCall(await client.params.${verb}${methodNameAccessor}(params)))`\n        const outputTypeName = app.methods.find((m: ABIMethodParams) => new ABIMethod(m).getSignature() === methodSig)?.returns.type\n        yield `resultMappers.push(${outputTypeName && outputTypeName !== 'void' ? `(v) => client.decodeReturnValue('${methodSigSafe}', v)` : 'undefined'})`\n        yield `return this`\n        yield DecIndent\n        yield '},'\n      }\n    }\n    yield DecIndentAndCloseBlock\n    yield DecIndent\n    yield '},'\n  }\n}\n"],"names":[],"mappings":"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"}