{"version":3,"sources":["../../src/cli/move.ts"],"sourcesContent":["import { spawn } from \"child_process\";\nimport { platform } from \"os\";\n\nimport { AccountAddress } from \"../core\";\nimport { Network } from \"../utils\";\n\nexport class Move {\n  /**\n   * Function to initialize current directory for Aptos\n   *\n   * Configuration will be pushed into .aptos/config.yaml\n   * @param args.network optional Netowrk type argument to use for default settings, default is local\n   * @param args.profile optional Profile to use from the config file, default is 'default'\n   * This will be used to override associated settings such as the REST URL, the Faucet URL, and the private key arguments.\n   *\n   * @returns\n   */\n  async init(args: { network?: Network; profile?: string }): Promise<boolean> {\n    const { network, profile } = args;\n    const cliArgs = [\"aptos\", \"init\", `--network=${network ?? \"local\"}`, `--profile=${profile ?? \"default\"}`];\n\n    return this.runCommand(cliArgs);\n  }\n\n  /**\n   * Function to compile a package\n   *\n   * @param args.packageDirectoryPath Path to a move package (the folder with a Move.toml file)\n   * @param args.namedAddresses  Named addresses for the move binary\n   * @example\n   * {\n   *  alice:0x1234, bob:0x5678\n   * }\n   *\n   * @returns\n   */\n  async compile(args: {\n    packageDirectoryPath: string;\n    namedAddresses: Record<string, AccountAddress>;\n  }): Promise<boolean> {\n    const { packageDirectoryPath, namedAddresses } = args;\n    const cliArgs = [\"aptos\", \"move\", \"compile\", \"--package-dir\", packageDirectoryPath, \"--skip-fetch-latest-git-deps\"];\n\n    const addressesMap = this.parseNamedAddresses(namedAddresses);\n\n    cliArgs.push(...this.prepareNamedAddresses(addressesMap));\n\n    return this.runCommand(cliArgs);\n  }\n\n  /**\n   * Function to run Move unit tests for a package\n   *\n   * @param args.packageDirectoryPath Path to a move package (the folder with a Move.toml file)\n   * @param args.namedAddresses  Named addresses for the move binary\n   * @example\n   * {\n   *  alice:0x1234, bob:0x5678\n   * }\n   *\n   * @returns\n   */\n  async test(args: { packageDirectoryPath: string; namedAddresses: Record<string, AccountAddress> }): Promise<boolean> {\n    const { packageDirectoryPath, namedAddresses } = args;\n    const cliArgs = [\"aptos\", \"move\", \"test\", \"--package-dir\", packageDirectoryPath, \"--skip-fetch-latest-git-deps\"];\n\n    const addressesMap = this.parseNamedAddresses(namedAddresses);\n\n    cliArgs.push(...this.prepareNamedAddresses(addressesMap));\n\n    return this.runCommand(cliArgs);\n  }\n\n  /**\n   * Function to publishe the modules in a Move package to the Aptos blockchain\n   *\n   * @param args.packageDirectoryPath Path to a move package (the folder with a Move.toml file)\n   * @param args.namedAddresses  Named addresses for the move binary\n   * @example\n   * {\n   *  alice:0x1234, bob:0x5678\n   * }\n   * @param args.profile optional Profile to use from the config file.\n   *\n   * @returns\n   */\n  async publish(args: {\n    packageDirectoryPath: string;\n    namedAddresses: Record<string, AccountAddress>;\n    profile?: string;\n  }): Promise<boolean> {\n    const { packageDirectoryPath, namedAddresses, profile } = args;\n    const cliArgs = [\n      \"aptos\",\n      \"move\",\n      \"publish\",\n      \"--package-dir\",\n      packageDirectoryPath,\n      \"--skip-fetch-latest-git-deps\",\n      `--profile=${profile ?? \"default\"}`,\n    ];\n\n    const addressesMap = this.parseNamedAddresses(namedAddresses);\n\n    cliArgs.push(...this.prepareNamedAddresses(addressesMap));\n\n    return this.runCommand(cliArgs);\n  }\n\n  /**\n   * Run a move command\n   *\n   * @param args\n   * @returns\n   */\n  // eslint-disable-next-line class-methods-use-this\n  private async runCommand(args: Array<string>): Promise<boolean> {\n    return new Promise((resolve, reject) => {\n      const currentPlatform = platform();\n      let childProcess;\n\n      // Check if current OS is windows\n      if (currentPlatform === \"win32\") {\n        childProcess = spawn(\"npx\", args, { shell: true });\n      } else {\n        childProcess = spawn(\"npx\", args);\n      }\n\n      childProcess.stdout.pipe(process.stdout);\n      childProcess.stderr.pipe(process.stderr);\n      process.stdin.pipe(childProcess.stdin);\n\n      childProcess.on(\"close\", (code) => {\n        if (code === 0) {\n          resolve(true); // Resolve with true if the child process exits successfully\n        } else {\n          reject(new Error(`Child process exited with code ${code}`)); // Reject with an error if the child process exits with an error code\n        }\n      });\n    });\n  }\n\n  /**\n   * Convert named addresses from a Map into an array seperated by a comma\n   *\n   * @example\n   * input: {'alice' => '0x123', 'bob' => '0x456'}\n   * output: \"alice=0x123,bob=0x456\"\n   *\n   * @param namedAddresses\n   * @returns An array of names addresses seperated by a comma\n   */\n  // eslint-disable-next-line class-methods-use-this\n  private prepareNamedAddresses(namedAddresses: Map<string, AccountAddress>): Array<string> {\n    const totalNames = namedAddresses.size;\n    const newArgs: Array<string> = [];\n\n    if (totalNames === 0) {\n      return newArgs;\n    }\n\n    newArgs.push(\"--named-addresses\");\n\n    let idx = 0;\n    namedAddresses.forEach((value, key) => {\n      idx += 1;\n      let toAppend = `${key}=${value.toString()}`;\n      if (idx < totalNames - 1) {\n        toAppend += \",\";\n      }\n      newArgs.push(toAppend);\n    });\n    return newArgs;\n  }\n\n  /**\n   * Parse named addresses from a Record type into a Map\n   *\n   * @param namedAddresses\n   * @returns Map<name,address>\n   */\n  // eslint-disable-next-line class-methods-use-this\n  private parseNamedAddresses(namedAddresses: Record<string, AccountAddress>): Map<string, AccountAddress> {\n    const addressesMap = new Map();\n\n    Object.keys(namedAddresses).forEach((key) => {\n      const address = namedAddresses[key];\n      addressesMap.set(key, address);\n    });\n\n    return addressesMap;\n  }\n}\n"],"mappings":"AAAA,OAAS,SAAAA,MAAa,gBACtB,OAAS,YAAAC,MAAgB,KAKlB,IAAMC,EAAN,KAAW,CAWhB,MAAM,KAAKC,EAAiE,CAC1E,GAAM,CAAE,QAAAC,EAAS,QAAAC,CAAQ,EAAIF,EACvBG,EAAU,CAAC,QAAS,OAAQ,aAAaF,GAAW,OAAO,GAAI,aAAaC,GAAW,SAAS,EAAE,EAExG,OAAO,KAAK,WAAWC,CAAO,CAChC,CAcA,MAAM,QAAQH,EAGO,CACnB,GAAM,CAAE,qBAAAI,EAAsB,eAAAC,CAAe,EAAIL,EAC3CG,EAAU,CAAC,QAAS,OAAQ,UAAW,gBAAiBC,EAAsB,8BAA8B,EAE5GE,EAAe,KAAK,oBAAoBD,CAAc,EAE5D,OAAAF,EAAQ,KAAK,GAAG,KAAK,sBAAsBG,CAAY,CAAC,EAEjD,KAAK,WAAWH,CAAO,CAChC,CAcA,MAAM,KAAKH,EAA0G,CACnH,GAAM,CAAE,qBAAAI,EAAsB,eAAAC,CAAe,EAAIL,EAC3CG,EAAU,CAAC,QAAS,OAAQ,OAAQ,gBAAiBC,EAAsB,8BAA8B,EAEzGE,EAAe,KAAK,oBAAoBD,CAAc,EAE5D,OAAAF,EAAQ,KAAK,GAAG,KAAK,sBAAsBG,CAAY,CAAC,EAEjD,KAAK,WAAWH,CAAO,CAChC,CAeA,MAAM,QAAQH,EAIO,CACnB,GAAM,CAAE,qBAAAI,EAAsB,eAAAC,EAAgB,QAAAH,CAAQ,EAAIF,EACpDG,EAAU,CACd,QACA,OACA,UACA,gBACAC,EACA,+BACA,aAAaF,GAAW,SAAS,EACnC,EAEMI,EAAe,KAAK,oBAAoBD,CAAc,EAE5D,OAAAF,EAAQ,KAAK,GAAG,KAAK,sBAAsBG,CAAY,CAAC,EAEjD,KAAK,WAAWH,CAAO,CAChC,CASA,MAAc,WAAWH,EAAuC,CAC9D,OAAO,IAAI,QAAQ,CAACO,EAASC,IAAW,CACtC,IAAMC,EAAkBX,EAAS,EAC7BY,EAGAD,IAAoB,QACtBC,EAAeb,EAAM,MAAOG,EAAM,CAAE,MAAO,EAAK,CAAC,EAEjDU,EAAeb,EAAM,MAAOG,CAAI,EAGlCU,EAAa,OAAO,KAAK,QAAQ,MAAM,EACvCA,EAAa,OAAO,KAAK,QAAQ,MAAM,EACvC,QAAQ,MAAM,KAAKA,EAAa,KAAK,EAErCA,EAAa,GAAG,QAAUC,GAAS,CAC7BA,IAAS,EACXJ,EAAQ,EAAI,EAEZC,EAAO,IAAI,MAAM,kCAAkCG,CAAI,EAAE,CAAC,CAE9D,CAAC,CACH,CAAC,CACH,CAaQ,sBAAsBN,EAA4D,CACxF,IAAMO,EAAaP,EAAe,KAC5BQ,EAAyB,CAAC,EAEhC,GAAID,IAAe,EACjB,OAAOC,EAGTA,EAAQ,KAAK,mBAAmB,EAEhC,IAAIC,EAAM,EACV,OAAAT,EAAe,QAAQ,CAACU,EAAOC,IAAQ,CACrCF,GAAO,EACP,IAAIG,EAAW,GAAGD,CAAG,IAAID,EAAM,SAAS,CAAC,GACrCD,EAAMF,EAAa,IACrBK,GAAY,KAEdJ,EAAQ,KAAKI,CAAQ,CACvB,CAAC,EACMJ,CACT,CASQ,oBAAoBR,EAA6E,CACvG,IAAMC,EAAe,IAAI,IAEzB,cAAO,KAAKD,CAAc,EAAE,QAASW,GAAQ,CAC3C,IAAME,EAAUb,EAAeW,CAAG,EAClCV,EAAa,IAAIU,EAAKE,CAAO,CAC/B,CAAC,EAEMZ,CACT,CACF","names":["spawn","platform","Move","args","network","profile","cliArgs","packageDirectoryPath","namedAddresses","addressesMap","resolve","reject","currentPlatform","childProcess","code","totalNames","newArgs","idx","value","key","toAppend","address"]}