@algorandfoundation/puya-ts 1.2.0-beta.32 → 1.2.0-beta.34
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.
- package/{analyser-service-4cYQscWZ.js → analyser-service-DjrWRS0-.js} +3 -3
- package/{analyser-service-4cYQscWZ.js.map → analyser-service-DjrWRS0-.js.map} +1 -1
- package/analyserService.mjs +3 -3
- package/{arc4-clientgen-CkO21MdT.js → arc4-clientgen-CZtNN1eT.js} +3 -3
- package/arc4-clientgen-CZtNN1eT.js.map +1 -0
- package/awst_build/ast-visitors/class-definition-visitor.d.ts +721 -1
- package/awst_build/ast-visitors/function-visitor.d.ts +721 -1
- package/awst_build/ast-visitors/text-visitor.d.ts +721 -1
- package/awst_build/eb/arc4/arrays.d.ts +2 -1
- package/awst_build/eb/arc4/c2c.d.ts +0 -17
- package/awst_build/eb/array-like/arrays.d.ts +3 -2
- package/awst_build/eb/bytes-expression-builder.d.ts +0 -28
- package/awst_build/eb/contract-builder.d.ts +0 -11
- package/awst_build/eb/index.d.ts +0 -1
- package/awst_build/eb/literal/object-literal-expression-builder.d.ts +8 -4
- package/awst_build/eb/objects/util.d.ts +0 -2
- package/awst_build/eb/op-module-builder.d.ts +0 -3
- package/awst_build/eb/storage/box/box.d.ts +1 -21
- package/awst_build/eb/string-expression-builder.d.ts +0 -6
- package/awst_build/eb/util/resolve-compat-builder.d.ts +0 -8
- package/awst_build/op-metadata.d.ts +4 -3
- package/awst_build/ptypes/arc4-types.d.ts +0 -1
- package/awst_build/ptypes/index.d.ts +1 -1
- package/awst_build/ptypes/visitors/index-type-visitor.d.ts +0 -30
- package/bin/puyats-clientgen.mjs +5 -5
- package/bin/puyats-ls.mjs +6 -6
- package/bin/puyats-ls.mjs.map +1 -1
- package/bin/run-cli.mjs +8 -8
- package/{check-node-version-CJZN8bUo.js → check-node-version-BYGc-qxw.js} +3 -3
- package/{check-node-version-CJZN8bUo.js.map → check-node-version-BYGc-qxw.js.map} +1 -1
- package/cli.mjs +8 -8
- package/{compile-P13jbcuM.js → compile-BKk4hPli.js} +6 -6
- package/{compile-P13jbcuM.js.map → compile-BKk4hPli.js.map} +1 -1
- package/constants.d.ts +5 -0
- package/{contract-class-model-BUOeMEKh.js → contract-class-model-Dpn9A-pJ.js} +38 -33
- package/contract-class-model-Dpn9A-pJ.js.map +1 -0
- package/errors.d.ts +1 -6
- package/index.mjs +8 -9
- package/index.mjs.map +1 -1
- package/language-server/compile-trigger-queue.d.ts +2 -2
- package/language-server/puya-language-server.d.ts +0 -38
- package/logger/index.d.ts +0 -7
- package/{options-DgrJjFC_.js → options-BCW57sPn.js} +142 -132
- package/options-BCW57sPn.js.map +1 -0
- package/options.d.ts +4 -3
- package/package.json +2 -2
- package/puya/check-puya-version.d.ts +0 -13
- package/puya/log-deserializer.d.ts +0 -2
- package/{resolve-puya-path-n5rXecTR.js → resolve-puya-path-CdZID0Yd.js} +4 -4
- package/resolve-puya-path-CdZID0Yd.js.map +1 -0
- package/{semver-C4QVXBwz.js → semver-a7hIj_hk.js} +2 -2
- package/{semver-C4QVXBwz.js.map → semver-a7hIj_hk.js.map} +1 -1
- package/{util-J87OKSaa.js → util-nZLj7LWS.js} +2 -2
- package/{util-J87OKSaa.js.map → util-nZLj7LWS.js.map} +1 -1
- package/visitor/syntax-names.d.ts +4 -4
- package/visitor/visitor.d.ts +4 -4
- package/arc4-clientgen-CkO21MdT.js.map +0 -1
- package/contract-class-model-BUOeMEKh.js.map +0 -1
- package/language-server/ls-logger.d.ts +0 -11
- package/options-DgrJjFC_.js.map +0 -1
- package/resolve-puya-path-n5rXecTR.js.map +0 -1
package/options.d.ts
CHANGED
|
@@ -5,9 +5,9 @@ export interface AlgoFile {
|
|
|
5
5
|
sourceFile: AbsolutePath;
|
|
6
6
|
outDir: AbsolutePath;
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
type FileExistsMethod = (fileName: string) => boolean;
|
|
9
|
+
type ReadFileMethod = (fileName: string) => string | undefined;
|
|
10
|
+
type SourceFileProvider = {
|
|
11
11
|
fileExists: FileExistsMethod;
|
|
12
12
|
readFile: ReadFileMethod;
|
|
13
13
|
};
|
|
@@ -80,3 +80,4 @@ export declare class PuyaOptions {
|
|
|
80
80
|
validateAbiReturn: boolean;
|
|
81
81
|
constructor(options: Props<PuyaOptions>);
|
|
82
82
|
}
|
|
83
|
+
export {};
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"**"
|
|
5
5
|
],
|
|
6
6
|
"name": "@algorandfoundation/puya-ts",
|
|
7
|
-
"version": "1.2.0-beta.
|
|
7
|
+
"version": "1.2.0-beta.34",
|
|
8
8
|
"description": "Compiles Algorand TypeScript into byte code which runs on the Algorand Virtual Machine (AVM)",
|
|
9
9
|
"private": false,
|
|
10
10
|
"repository": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@algorandfoundation/algokit-utils": "10.0.0-beta.1",
|
|
18
|
-
"@algorandfoundation/algorand-typescript": "1.2.0-beta.
|
|
18
|
+
"@algorandfoundation/algorand-typescript": "1.2.0-beta.34",
|
|
19
19
|
"arcsecond": "^5.0.0",
|
|
20
20
|
"argparse": "^2.0.1",
|
|
21
21
|
"chalk": "^5.6.2",
|
|
@@ -1,14 +1 @@
|
|
|
1
|
-
export declare enum VersionCompareVerdict {
|
|
2
|
-
ExactMatch = "ExactMatch",
|
|
3
|
-
Inconclusive = "Inconclusive",
|
|
4
|
-
MajorMismatch = "MajorMismatch",
|
|
5
|
-
MinorMismatch = "MinorMismatch",
|
|
6
|
-
OlderRevision = "OlderRevision",
|
|
7
|
-
NewerRevision = "NewerRevision"
|
|
8
|
-
}
|
|
9
|
-
export declare function comparePuyaVersion(puyaPath: string): Promise<{
|
|
10
|
-
target: string;
|
|
11
|
-
found?: string;
|
|
12
|
-
verdict: VersionCompareVerdict;
|
|
13
|
-
}>;
|
|
14
1
|
export declare function checkPuyaVersion(puyaPath: string): Promise<void>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { __addDisposableResource, __disposeResources } from 'tslib';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import fs__default, { rmdirSync, existsSync, statSync, mkdirSync } from 'fs';
|
|
4
|
-
import { l as logger, d as Constants, I as InternalError } from './contract-class-model-
|
|
4
|
+
import { l as logger, d as Constants, I as InternalError } from './contract-class-model-Dpn9A-pJ.js';
|
|
5
5
|
import { onExit } from 'signal-exit';
|
|
6
|
-
import {
|
|
6
|
+
import { a6 as sleep } from './options-BCW57sPn.js';
|
|
7
7
|
import { spawn } from 'cross-spawn';
|
|
8
8
|
import * as require$$3 from 'crypto';
|
|
9
9
|
import { fileURLToPath } from 'node:url';
|
|
@@ -14,7 +14,7 @@ import { globIterateSync } from 'glob';
|
|
|
14
14
|
import { writeFileSync } from 'node:fs';
|
|
15
15
|
import { gzipSync } from 'node:zlib';
|
|
16
16
|
import require$$2 from 'os';
|
|
17
|
-
import { p as parseSemVer } from './semver-
|
|
17
|
+
import { p as parseSemVer } from './semver-a7hIj_hk.js';
|
|
18
18
|
|
|
19
19
|
const lockPaths = new Set();
|
|
20
20
|
function acquireLock(path, options) {
|
|
@@ -479,4 +479,4 @@ function isBinaryCached(cachePath) {
|
|
|
479
479
|
}
|
|
480
480
|
|
|
481
481
|
export { resolvePuyaPath as r };
|
|
482
|
-
//# sourceMappingURL=resolve-puya-path-
|
|
482
|
+
//# sourceMappingURL=resolve-puya-path-CdZID0Yd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-puya-path-CdZID0Yd.js","sources":["../src/util/lock-file.ts","../src/util/invoke-cli.ts","../src/puya/run-puya.ts","../src/puya/check-puya-version.ts","../src/util/generate-temp-file.ts","../src/puya/puya-binary.ts","../src/puya/resolve-puya-path.ts"],"sourcesContent":["import { existsSync, mkdirSync, rmdirSync, statSync } from 'fs'\nimport { onExit } from 'signal-exit'\nimport { logger } from '../logger'\nimport { sleep } from './sleep'\n\nconst lockPaths = new Set<string>()\n\nfunction acquireLock(path: string, options?: { staleMs?: number }) {\n const { staleMs = 60 * 1000 } = options ?? {}\n lockPaths.add(path)\n\n if (existsSync(path)) {\n const now = Date.now()\n const fileStat = statSync(path)\n\n if (now - fileStat.mtime.getTime() > staleMs) {\n // Remove the lock file if it has expired\n rmdirSync(path)\n } else {\n throw new Error('Lock file already exists')\n }\n }\n\n mkdirSync(path, { recursive: true })\n}\n\nexport async function createLockFile(\n path: string,\n options?: { staleMs?: number; maxRetries?: number; delayMs?: number },\n): Promise<AsyncDisposable> {\n const { maxRetries = 3, delayMs = 1000 } = options ?? {}\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n acquireLock(path, options)\n\n return {\n async [Symbol.asyncDispose]() {\n await unlockFile(path)\n },\n }\n } catch (err) {\n logger.debug(undefined, `Failed to acquire lock file ${path}: ${err}`)\n await sleep(delayMs)\n }\n }\n\n throw new Error('Failed to lock file')\n}\n\nasync function unlockFile(path: string): Promise<void> {\n try {\n rmdirSync(path)\n lockPaths.delete(path)\n } catch (err) {\n logger.warn(undefined, `Failed to unlock file ${path}: ${err}`)\n }\n}\n\nonExit(() => {\n for (const path of lockPaths) {\n unlockFile(path)\n }\n})\n","import { spawn } from 'cross-spawn'\n\ntype InvokeCliOptions = {\n command: string\n args: string[]\n cwd?: string\n onReceiveLine?(line: string): void\n dontThrowOnNonzeroCode?: boolean\n}\n\ntype InvokeCliResponse = {\n lines: string[]\n code: number\n}\n\ntype CliExit = {\n code?: number | null\n signal?: NodeJS.Signals | null\n}\n\nclass InvokeCliError extends Error {\n exit: CliExit\n\n constructor(exit: CliExit) {\n if (exit.code) {\n super(`Exited with code ${exit.code}`)\n } else if (exit.signal) {\n super(`Exited with signal ${exit.signal}`)\n } else {\n super('Exited with unknown cause')\n }\n\n this.exit = exit\n }\n}\n\nexport function invokeCli(options: InvokeCliOptions): Promise<InvokeCliResponse> {\n return new Promise<InvokeCliResponse>((resolve, reject) => {\n const lineAggregator = new LineAggregator(options.onReceiveLine)\n const process = spawn(options.command, options.args, {\n stdio: 'pipe',\n })\n\n process.stdout.on('data', (data) => lineAggregator.aggregate(data))\n process.once('close', (code) => {\n if (code !== 0 && !options.dontThrowOnNonzeroCode) {\n reject(new InvokeCliError({ code }))\n }\n lineAggregator.flush()\n resolve({\n code: code ?? 0,\n lines: lineAggregator.lines,\n })\n })\n process.once('exit', (code, signal) => {\n if (signal !== null) {\n reject(new InvokeCliError({ signal }))\n }\n if (code !== 0 && !options.dontThrowOnNonzeroCode) {\n reject(new InvokeCliError({ code }))\n }\n lineAggregator.flush()\n resolve({\n code: code ?? 0,\n lines: lineAggregator.lines,\n })\n })\n process.once('error', reject)\n })\n}\n\nclass LineAggregator {\n #line = ''\n #lines: string[] = []\n constructor(private readonly onLine?: (line: string) => void) {}\n\n aggregate(chunk: Buffer<ArrayBufferLike> | null | undefined) {\n if (chunk === undefined || chunk === null) return\n const text = chunk.toString('utf-8')\n for (const c of text) {\n switch (c) {\n case '\\n':\n this.flushLine()\n break\n case '\\r':\n continue\n default:\n this.#line += c\n break\n }\n }\n }\n\n flush() {\n if (this.#line) this.flushLine()\n }\n\n private flushLine() {\n this.#lines.push(this.#line)\n this.onLine?.(this.#line)\n this.#line = ''\n }\n\n get lines() {\n return this.#lines\n }\n}\n","import { logger } from '../logger'\nimport { invokeCli } from '../util/invoke-cli'\n\nexport async function runPuya({\n command,\n args,\n cwd,\n onOutput,\n}: {\n command: string\n args: string[]\n cwd?: string\n onOutput: (line: string) => void\n}) {\n const result = await invokeCli({\n command,\n args,\n cwd,\n onReceiveLine: onOutput,\n dontThrowOnNonzeroCode: true,\n })\n\n if (result.code !== 0) {\n logger.critical(undefined, `Compilation exited with status ${result.code}`)\n }\n}\n","import { Constants } from '../constants'\nimport { logger } from '../logger'\nimport { runPuya } from './run-puya'\nimport type { SemVer } from './semver'\n\nenum VersionCompareVerdict {\n ExactMatch = 'ExactMatch',\n Inconclusive = 'Inconclusive',\n MajorMismatch = 'MajorMismatch',\n MinorMismatch = 'MinorMismatch',\n OlderRevision = 'OlderRevision',\n NewerRevision = 'NewerRevision',\n}\n\nasync function comparePuyaVersion(puyaPath: string): Promise<{\n target: string\n found?: string\n verdict: VersionCompareVerdict\n}> {\n const target = Constants.targetedPuyaVersion\n\n const versionParser = new VersionParser()\n await runPuya({\n command: puyaPath,\n args: ['--version'],\n onOutput: (line) => versionParser.receiveLine(line),\n })\n\n if (!versionParser.version) return { target, verdict: VersionCompareVerdict.Inconclusive }\n const ver = versionParser.version\n\n // Compare\n const [major, minor, rev] = target.split('.').map((x) => Number(x))\n if (ver.major !== major) return { verdict: VersionCompareVerdict.MajorMismatch, target, found: ver.formatted }\n if (ver.minor !== minor) return { verdict: VersionCompareVerdict.MinorMismatch, target, found: ver.formatted }\n if (ver.rev < rev) return { verdict: VersionCompareVerdict.OlderRevision, target, found: ver.formatted }\n if (ver.rev > rev) return { verdict: VersionCompareVerdict.NewerRevision, target, found: ver.formatted }\n return { verdict: VersionCompareVerdict.ExactMatch, target, found: ver.formatted }\n}\n\nexport async function checkPuyaVersion(puyaPath: string) {\n const result = await comparePuyaVersion(puyaPath)\n\n switch (result.verdict) {\n case VersionCompareVerdict.Inconclusive:\n logger.warn(undefined, `Unable to verify the version of Puya at ${puyaPath}.`)\n break\n case VersionCompareVerdict.MajorMismatch:\n case VersionCompareVerdict.MinorMismatch:\n logger.warn(\n undefined,\n `Version of Puya at ${puyaPath} (${result.found}) does not match targeted version (${result.target}). There may be compatibility issues.`,\n )\n break\n case VersionCompareVerdict.OlderRevision:\n logger.warn(undefined, `Revision of Puya at ${puyaPath} (${result.found}) is older than the targeted revision (${result.target})`)\n break\n case VersionCompareVerdict.NewerRevision:\n logger.debug(undefined, `Revision of Puya at ${puyaPath} (${result.found}) is newer than the targeted revision (${result.target})`)\n break\n }\n}\n\nclass VersionParser {\n #ver: SemVer | undefined\n\n receiveLine(line: string): void {\n const matched = /^puya ((\\d+)\\.(\\d+)\\.(\\d+)(-.*)?)$/.exec(line)\n if (!matched) {\n logger.debug(undefined, `'puya --version' command returned unexpected output: \"${line}\"`)\n } else {\n this.#ver = {\n formatted: matched[1],\n major: Number(matched[2]),\n minor: Number(matched[3]),\n rev: Number(matched[4]),\n suffix: matched[5] ?? '',\n }\n }\n }\n\n get version(): undefined | SemVer {\n return this.#ver\n }\n}\n","import fs from 'fs'\nimport { globIterateSync } from 'glob'\nimport type { WriteFileOptions } from 'node:fs'\nimport { writeFileSync } from 'node:fs'\nimport { gzipSync } from 'node:zlib'\nimport os from 'os'\nimport pathe from 'pathe'\n\nexport type TempDir = {\n readonly dirPath: string\n files(): IterableIterator<string>\n\n makeFile(args: { name: string; ext?: string; compress?: boolean }): {\n readonly filePath: string\n writeFileSync(data: string | NodeJS.ArrayBufferView, options?: WriteFileOptions): void\n }\n} & Disposable\n\nexport function generateTempDir(): TempDir {\n const dirPath = fs.mkdtempSync(pathe.join(os.tmpdir(), 'puya-ts-'))\n\n return {\n get dirPath() {\n return dirPath\n },\n *files(): IterableIterator<string> {\n for (const p of globIterateSync(pathe.join(dirPath, '**'), {\n nodir: true,\n })) {\n yield p\n }\n },\n makeFile({ name, ext, compress }) {\n const path = pathe.join(this.dirPath, `${name}.${ext ?? 'tmp'}${compress ? '.gz' : ''}`)\n return {\n get filePath() {\n return path\n },\n writeFileSync(data, options) {\n if (compress) {\n data = gzipSync(data)\n }\n writeFileSync(path, data, options)\n },\n }\n },\n [Symbol.dispose]() {\n fs.rmSync(dirPath, { recursive: true, force: true })\n },\n }\n}\n","import * as crypto from 'crypto'\nimport * as fs from 'fs'\nimport { fileURLToPath } from 'node:url'\nimport * as path from 'path'\nimport pathe from 'pathe'\nimport * as tar from 'tar'\nimport { Constants } from '../constants'\nimport { InternalError } from '../errors'\nimport { logger } from '../logger'\nimport { generateTempDir } from '../util/generate-temp-file'\nimport { runPuya } from './run-puya'\nimport type { SemVer } from './semver'\n\n/**\n * Gets the platform-specific binary name\n * @returns The appropriate binary name for the current platform\n */\nfunction getBinaryName(): string {\n return process.platform === 'win32' ? 'puya.exe' : 'puya'\n}\n\nfunction getPuyaTsDir(): string {\n try {\n return pathe.dirname(require.resolve('@algorandfoundation/puya-ts'))\n } catch {\n return pathe.dirname(fileURLToPath(import.meta.url))\n }\n}\n\nexport function getPuyaStorageDir(): string {\n const puyaTsDirName = getPuyaTsDir()\n return path.join(puyaTsDirName, '.puya')\n}\n\nexport function getCachedPuyaBinaryPath(puyaStorageDir: string, version: SemVer): string {\n const binaryFileName = getBinaryName()\n return path.join(puyaStorageDir, version.formatted, binaryFileName)\n}\n\n/**\n * Gets the platform-specific details for downloads\n * @returns Object containing OS and architecture information\n */\nfunction getPlatformDetails(): { os: string; arch: string } {\n const cliMessage = `Please refer to the puya-ts CLI documentation for information on how to install the Puya backend manually.`\n\n // Map Node.js platform to OS name used in filenames\n let os: string\n switch (process.platform) {\n case 'win32':\n os = 'windows'\n break\n case 'darwin':\n os = 'macos'\n break\n case 'linux':\n os = 'linux'\n break\n default:\n throw new InternalError(`Unsupported platform: ${process.platform}. ${cliMessage}`)\n }\n\n // Map Node.js architecture to architecture name used in filenames\n let arch: string\n switch (process.arch) {\n case 'x64':\n arch = 'x64'\n break\n case 'arm64':\n arch = 'arm64'\n break\n default:\n throw new InternalError(`Unsupported architecture: ${process.arch}. ${cliMessage}`)\n }\n\n return { os, arch }\n}\n\n/**\n * Downloads the Puya binary for a specific release version\n * @param puyaStorageDir The directory where puya binaries should be stored once downloaded\n * @param version The release version to download (e.g., \"1.0.0\")\n * @returns Promise that resolves to the path of the extracted binary\n */\nexport async function downloadPuyaBinary(puyaStorageDir: string, version: SemVer): Promise<string> {\n // Get platform-specific details\n const { os, arch } = getPlatformDetails()\n\n // Build platform-specific filenames\n const platformId = `${os}_${arch}`\n const archiveFileName = `puya-${version.formatted}-${platformId}.tar.gz`\n const checksumFileName = `puya-${version.formatted}-${platformId}.sha256.txt`\n const binaryFileName = getBinaryName()\n\n const extractedDir = path.join(puyaStorageDir, version.formatted)\n\n // Ensure our storage directories exist\n if (!fs.existsSync(extractedDir)) {\n fs.mkdirSync(extractedDir, { recursive: true })\n }\n\n using tempDir = generateTempDir()\n\n const archiveFilePath = path.join(tempDir.dirPath, archiveFileName)\n const checksumFilePath = path.join(tempDir.dirPath, checksumFileName)\n const extractedBinaryPath = path.join(extractedDir, binaryFileName)\n\n logger.debug(undefined, `Downloading Puya binary for version ${version.formatted} and platform ${platformId}`)\n const archiveUrl = `https://github.com/${Constants.puyaGithubRepo}/releases/download/v${version.formatted}/${archiveFileName}`\n const checksumUrl = `https://github.com/${Constants.puyaGithubRepo}/releases/download/v${version.formatted}/${checksumFileName}`\n\n await downloadFile(archiveUrl, archiveFilePath)\n await downloadFile(checksumUrl, checksumFilePath)\n\n await verifyChecksum(archiveFilePath, archiveFileName, checksumFilePath)\n\n await tar.extract({\n file: archiveFilePath,\n cwd: extractedDir,\n })\n\n // Check if extraction was successful and binary exists\n if (!fs.existsSync(extractedBinaryPath)) {\n throw new InternalError(`Binary file ${binaryFileName} not found in the extracted archive`)\n }\n\n await smokeTestBinary(extractedBinaryPath)\n\n logger.debug(undefined, `Successfully downloaded and extracted Puya binary to ${extractedBinaryPath}`)\n return extractedBinaryPath\n}\n\nasync function smokeTestBinary(path: string) {\n logger.debug(undefined, `Smoke testing downloaded binary @ ${path}`)\n\n let output = ''\n await runPuya({\n command: path,\n args: ['--version'],\n onOutput: (line) => (output += line),\n })\n if (!/^puya ((\\d+)\\.(\\d+)\\.(\\d+)(.*)?)$/.test(output)) {\n throw new InternalError(`Unexpected output from puya --version : ${output}`)\n }\n}\n\n/**\n * Downloads a file from a URL to a specified path\n * @param url The URL to download from\n * @param destination The local path to save the file to\n * @returns Promise that resolves when the download is complete\n */\nasync function downloadFile(url: string, destination: string): Promise<void> {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Failed to download file. Status Code: ${response.status}`)\n }\n const buffer = await response.arrayBuffer()\n return await new Promise<void>((resolve, reject) => {\n const fileStream = fs.createWriteStream(destination)\n const nodeBuffer = Buffer.from(buffer)\n\n fileStream.write(nodeBuffer)\n fileStream.end()\n\n fileStream.on('finish', () => {\n resolve()\n })\n\n fileStream.on('error', (err) => {\n fs.unlinkSync(destination)\n reject(err)\n })\n })\n}\n\n/**\n * Verifies the checksum of a downloaded file\n * @param filePath Path to the file to verify\n * @param checksumFilePath Path to the checksum file\n * @returns Promise that resolves to true if the checksum matches, false otherwise\n */\nasync function verifyChecksum(filePath: string, fileName: string, checksumFilePath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Read the checksum file\n const expectedChecksum = fs.readFileSync(checksumFilePath, 'utf8').trim().toLowerCase()\n\n // Calculate the SHA256 checksum of the downloaded file\n const hash = crypto.createHash('sha256')\n const stream = fs.createReadStream(filePath)\n\n stream.on('data', (data) => {\n hash.update(data)\n })\n\n stream.on('end', () => {\n const calculatedChecksum = hash.digest('hex').toLowerCase()\n\n if (`${calculatedChecksum} ${fileName}` === expectedChecksum) {\n resolve()\n }\n reject(new InternalError(`Checksum verification failed. Expected checksum: ${expectedChecksum} but got: ${calculatedChecksum}`))\n })\n })\n}\n","import * as fs from 'fs'\nimport { Constants } from '../constants'\nimport { logger } from '../logger'\nimport { createLockFile } from '../util/lock-file'\nimport { checkPuyaVersion } from './check-puya-version'\nimport { downloadPuyaBinary, getCachedPuyaBinaryPath, getPuyaStorageDir } from './puya-binary'\nimport { parseSemVer } from './semver'\n\nexport async function resolvePuyaPath(options: { customPuyaPath?: string; skipVersionCheck?: boolean }): Promise<string> {\n if (options.customPuyaPath) {\n if (!options.skipVersionCheck) {\n await checkPuyaVersion(options.customPuyaPath)\n }\n return options.customPuyaPath\n }\n\n const version = parseSemVer(Constants.targetedPuyaVersion)\n\n const puyaStorageDir = getPuyaStorageDir()\n const cachedBinaryPath = getCachedPuyaBinaryPath(puyaStorageDir, version)\n\n if (isBinaryCached(cachedBinaryPath)) {\n return cachedBinaryPath\n }\n\n await using _ = await createLockFile(`${puyaStorageDir}.lock`, { maxRetries: 30, delayMs: 1000, staleMs: 60 * 1000 })\n\n // Between the first check and acquiring the lock, the binary may have been downloaded by another process.\n // In this case there is no need to download the binary again.\n if (isBinaryCached(cachedBinaryPath)) {\n return cachedBinaryPath\n }\n return await downloadPuyaBinary(puyaStorageDir, version)\n}\n\nfunction isBinaryCached(cachePath: string): boolean {\n if (fs.existsSync(cachePath)) {\n logger.debug(undefined, `Found cached Puya binary at ${cachePath}`)\n return true\n }\n return false\n}\n"],"names":["fs","pathe","os","crypto"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs__default from 'fs';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
import pathe__default from 'pathe';
|
|
4
|
-
import { d as Constants, I as InternalError } from './contract-class-model-
|
|
4
|
+
import { d as Constants, I as InternalError } from './contract-class-model-Dpn9A-pJ.js';
|
|
5
5
|
|
|
6
6
|
function packageVersion() {
|
|
7
7
|
let dirName = pathe__default.dirname(fileURLToPath(import.meta.url));
|
|
@@ -42,4 +42,4 @@ function parseSemVer(version) {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
export { appVersion as a, packageVersion as b, parseSemVer as p };
|
|
45
|
-
//# sourceMappingURL=semver-
|
|
45
|
+
//# sourceMappingURL=semver-a7hIj_hk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semver-
|
|
1
|
+
{"version":3,"file":"semver-a7hIj_hk.js","sources":["../src/cli/app-version.ts","../src/puya/semver.ts"],"sourcesContent":["import fs from 'fs'\nimport { fileURLToPath } from 'node:url'\nimport pathe from 'pathe'\nimport { Constants } from '../constants'\n\nexport function packageVersion(): string {\n let dirName = pathe.dirname(fileURLToPath(import.meta.url))\n\n while (true) {\n const packageJsonPath = pathe.join(dirName, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n return JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')).version\n }\n if (dirName === pathe.dirname(dirName)) break\n dirName = pathe.dirname(dirName)\n }\n return 'unknown'\n}\n\nexport function appVersion(options?: { name?: string; withAVMVersion?: boolean }): string {\n const name = options?.name ?? 'puya-ts'\n const withAVMVersion = options?.withAVMVersion ?? true\n\n const version = packageVersion()\n return [`${name} ${version}`]\n .concat(\n withAVMVersion\n ? ['', 'Targets:', `puya ${Constants.targetedPuyaVersion}`, `AVM ${Constants.supportedAvmVersions.join(', ')}`]\n : [`puya ${Constants.targetedPuyaVersion}`],\n )\n .join('\\n')\n}\n","import { InternalError } from '../errors'\n\nexport type SemVer = {\n major: number\n minor: number\n rev: number\n suffix: string\n formatted: string\n}\n\nexport function parseSemVer(version: string): SemVer {\n const matched = /^(\\d+)\\.(\\d+)\\.(\\d+)(-.*)?$/.exec(version)\n if (!matched) {\n throw new InternalError(`Invalid version string: ${version}`)\n }\n\n return {\n major: Number(matched[1]),\n minor: Number(matched[2]),\n rev: Number(matched[3]),\n suffix: matched[4] ?? '',\n formatted: version,\n }\n}\n"],"names":["pathe","fs"],"mappings":";;;;;SAKgB,cAAc,GAAA;AAC5B,IAAA,IAAI,OAAO,GAAGA,cAAK,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE3D,OAAO,IAAI,EAAE;QACX,MAAM,eAAe,GAAGA,cAAK,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;AAC3D,QAAA,IAAIC,WAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE;AAClC,YAAA,OAAO,IAAI,CAAC,KAAK,CAACA,WAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO;QACrE;AACA,QAAA,IAAI,OAAO,KAAKD,cAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE;AACxC,QAAA,OAAO,GAAGA,cAAK,CAAC,OAAO,CAAC,OAAO,CAAC;IAClC;AACA,IAAA,OAAO,SAAS;AAClB;AAEM,SAAU,UAAU,CAAC,OAAqD,EAAA;AAC9E,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,SAAS;AACvC,IAAA,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,IAAI;AAEtD,IAAA,MAAM,OAAO,GAAG,cAAc,EAAE;AAChC,IAAA,OAAO,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,OAAO,EAAE;AACzB,SAAA,MAAM,CACL;UACI,CAAC,EAAE,EAAE,UAAU,EAAE,CAAA,KAAA,EAAQ,SAAS,CAAC,mBAAmB,CAAA,CAAE,EAAE,CAAA,IAAA,EAAO,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE;UAC5G,CAAC,CAAA,KAAA,EAAQ,SAAS,CAAC,mBAAmB,CAAA,CAAE,CAAC;SAE9C,IAAI,CAAC,IAAI,CAAC;AACf;;ACrBM,SAAU,WAAW,CAAC,OAAe,EAAA;IACzC,MAAM,OAAO,GAAG,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC;IAC3D,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,aAAa,CAAC,2BAA2B,OAAO,CAAA,CAAE,CAAC;IAC/D;IAEA,OAAO;AACL,QAAA,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzB,QAAA,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzB,QAAA,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACvB,QAAA,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;AACxB,QAAA,SAAS,EAAE,OAAO;KACnB;AACH;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import { ci as isMinLevel, L as LogLevel, a as LoggingContext, cj as enumFromValue } from './contract-class-model-
|
|
2
|
+
import { ci as isMinLevel, L as LogLevel, a as LoggingContext, cj as enumFromValue } from './contract-class-model-Dpn9A-pJ.js';
|
|
3
3
|
|
|
4
4
|
const levelConfig = {
|
|
5
5
|
/* eslint-disable no-console */
|
|
@@ -60,4 +60,4 @@ function convertInt(val) {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
export { ConsoleLogSink as C, addEnumArg as a, convertInt as c };
|
|
63
|
-
//# sourceMappingURL=util-
|
|
63
|
+
//# sourceMappingURL=util-nZLj7LWS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util-
|
|
1
|
+
{"version":3,"file":"util-nZLj7LWS.js","sources":["../src/logger/sinks/console-log-sink.ts","../src/cli/util.ts"],"sourcesContent":["import chalk from 'chalk'\nimport type { SourceLocation } from '../../awst/source-location'\nimport type { LogEvent } from '../index'\nimport { isMinLevel, LoggingContext, LogLevel } from '../index'\nimport type { LogSink } from './index'\nimport type { AbsolutePath } from '../../util/absolute-path'\n\ntype ColorFn = (text: string) => string\nconst levelConfig: Record<LogEvent['level'], { colorFn: ColorFn; writeFn: (...args: unknown[]) => void }> = {\n /* eslint-disable no-console */\n debug: { colorFn: chalk.green, writeFn: console.debug },\n info: { colorFn: chalk.green, writeFn: console.info },\n warning: { colorFn: chalk.yellow, writeFn: console.warn },\n error: { colorFn: chalk.red, writeFn: console.error },\n critical: { colorFn: chalk.red, writeFn: console.error },\n /* eslint-enable no-console */\n}\n\nexport class ConsoleLogSink implements LogSink {\n constructor(\n public readonly minLogLevel: LogLevel,\n private readonly pathsRelativeTo?: AbsolutePath,\n ) {}\n\n add(logEvent: LogEvent): void {\n const config = levelConfig[logEvent.level]\n\n let logText = `${config.colorFn(logEvent.level)}: ${logEvent.message}`\n if (logEvent.sourceLocation) {\n const sourceLocationText = logEvent.sourceLocation.toString({ pathsRelativeTo: this.pathsRelativeTo })\n const indentSize = sourceLocationText.length + logEvent.level.length + 4\n\n const sourceSummary = isMinLevel(logEvent.level, LogLevel.Warning) ? this.getSourceSummary(logEvent.sourceLocation, indentSize) : ''\n logText = `${sourceLocationText} ${logText}${sourceSummary}`\n }\n if (isMinLevel(LogLevel.Debug, this.minLogLevel) && logEvent.stack) {\n logText += `\\n ${logEvent.stack}`\n }\n config.writeFn(logText)\n }\n\n getSourceSummary(sourceLocation: SourceLocation, indent: number): string {\n const sourceFile = sourceLocation.file && LoggingContext.current.sourcesByPath[sourceLocation.file.toString()]\n if (!sourceFile || sourceLocation.scope === 'file') return ''\n\n const line = sourceFile[sourceLocation.line - 1]\n const trimmedLine = line.trimStart()\n const marker = `${''.padStart(sourceLocation.column - (line.length - trimmedLine.length))}^${''.padStart(Math.max(sourceLocation.endColumn - sourceLocation.column - 1, 0), '~')}`\n const indentChars = ''.padStart(indent, ' ')\n return `\\n${indentChars}${trimmedLine}\\n${indentChars}${marker}`\n }\n}\n","import type { ArgumentParser } from 'argparse'\nimport { enumFromValue } from '../util'\n\nexport function addEnumArg<T>(\n parser: ArgumentParser,\n { name, enumType, default: defaultValue, help }: { name: string; enumType: Record<string, string>; default?: T; help: string },\n) {\n parser.add_argument(name, {\n type: (v: string) => enumFromValue(v, enumType),\n choices: Array.from(Object.values(enumType)),\n default: defaultValue,\n help,\n })\n}\n\nexport function convertInt(val: string) {\n const res = Number(val)\n if (isNaN(res) || Math.round(res) !== res) {\n throw new Error(`'${val}' could not be converted to a number`)\n }\n return res\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -363,9 +363,9 @@ export declare const getNodeName: (node: ts.Node) => string;
|
|
|
363
363
|
export declare const getSyntaxName: (kind: ts.SyntaxKind) => string;
|
|
364
364
|
export type SyntaxKindNameType = typeof SyntaxKindName;
|
|
365
365
|
export type ModuleStatements = ts.ClassDeclaration | ts.ImportDeclaration | ts.VariableStatement | ts.FunctionDeclaration | ts.TypeAliasDeclaration | ts.InterfaceDeclaration;
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
366
|
+
type PrimaryExpressions = LiteralExpressions | ts.TrueLiteral | ts.FalseLiteral | ts.ArrayLiteralExpression | ts.ClassExpression | ts.FunctionExpression | ts.Identifier | ts.ImportExpression | ts.NewExpression | ts.NullLiteral | ts.ObjectLiteralExpression | ts.PrivateIdentifier | ts.ParenthesizedExpression | ts.SuperExpression | ts.TemplateExpression | ts.ThisExpression;
|
|
367
|
+
type MemberExpressions = PrimaryExpressions | ts.ElementAccessExpression | ts.ExpressionWithTypeArguments | ts.PropertyAccessExpression | ts.TaggedTemplateExpression;
|
|
368
|
+
type LeftHandSideExpression = ts.CallExpression | MemberExpressions | ts.NonNullExpression;
|
|
369
369
|
/**
|
|
370
370
|
* All concrete types which extends ts.ClassElement
|
|
371
371
|
*/
|
|
@@ -377,7 +377,7 @@ export type Statements = ts.EmptyStatement | ts.VariableStatement | ts.Expressio
|
|
|
377
377
|
/**
|
|
378
378
|
* All concrete types which extends ts.LiteralExpression
|
|
379
379
|
*/
|
|
380
|
-
|
|
380
|
+
type LiteralExpressions = ts.NumericLiteral | ts.BigIntLiteral | ts.StringLiteral | ts.RegularExpressionLiteral | ts.NoSubstitutionTemplateLiteral;
|
|
381
381
|
/**
|
|
382
382
|
* All concrete types which extend ts.Expression
|
|
383
383
|
*/
|
package/visitor/visitor.d.ts
CHANGED
|
@@ -14,12 +14,12 @@ export type Visitor<T extends {
|
|
|
14
14
|
* will return `typeof SyntaxKind` instead of `typeof SyntaxKind.someValue` and that will break the rest of the
|
|
15
15
|
* generic types here. `MapBaseType<TNode>` exists to convert these base types into a union of their concrete implementors
|
|
16
16
|
*/
|
|
17
|
-
|
|
17
|
+
type KindForNode<T extends ts.Node> = T extends {
|
|
18
18
|
kind: infer TKind;
|
|
19
19
|
} ? TKind : never;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
type VisitorMethod<TKind> = TKind extends keyof SyntaxKindNameType ? `visit${SyntaxKindNameType[TKind]}` : never;
|
|
21
|
+
type MethodReturnType<TMethod, TVisitor> = TMethod extends keyof TVisitor ? TVisitor[TMethod] extends (...args: DeliberateAny[]) => infer TReturn ? TReturn : never : never;
|
|
22
|
+
type ReturnTypeForNode<T extends ts.Node, TVisitor> = MethodReturnType<VisitorMethod<KindForNode<T>>, TVisitor>;
|
|
23
23
|
export declare const accept: <TSelf extends {
|
|
24
24
|
context: AwstBuildContext;
|
|
25
25
|
}, T extends ts.Node>(visitor: TSelf, node: T) => ReturnTypeForNode<MapBaseType<T>, TSelf>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"arc4-clientgen-CkO21MdT.js","sources":["../src/arc4-clientgen.ts"],"sourcesContent":["import * as abi from '@algorandfoundation/algokit-utils/abi'\nimport { existsSync } from 'fs'\nimport { readFile, writeFile } from 'fs/promises'\nimport { ContractReference, OnCompletionAction } from './awst/models'\nimport type { CompilationSet } from './awst_build/models/contract-class-model'\nimport { ContractClassModel } from './awst_build/models/contract-class-model'\nimport type { ABICompatiblePType } from './awst_build/ptypes'\nimport * as ptype from './awst_build/ptypes'\nimport { Constants } from './constants'\nimport { CodeError, InternalError } from './errors'\nimport { logger } from './logger'\nimport type { AlgoFile } from './options'\nimport { AbsolutePath } from './util/absolute-path'\n\ntype Arc56Arg = abi.Arc56Method['args'][number]\n\ntype ClientTask = {\n spec: abi.Arc56Contract\n outFile: AbsolutePath\n}\n\nconst AUTO_GENERATED_COMMENT = '// This file is auto-generated, do not modify'\nconst DISABLE_ESLINT_PRAGMA = '/* eslint-disable */'\n\nconst ARC4_PYTYPE_MAPPING = new Map<string, ABICompatiblePType>([\n ['account', ptype.accountPType],\n ['application', ptype.applicationPType],\n ['asset', ptype.assetPType],\n ['void', ptype.voidPType],\n ['txn', ptype.anyGtxnType],\n ['pay', ptype.paymentGtxnType],\n ['keyreg', ptype.keyRegistrationGtxnType],\n ['acfg', ptype.assetConfigGtxnType],\n ['axfer', ptype.assetTransferGtxnType],\n ['afrz', ptype.assetFreezeGtxnType],\n ['appl', ptype.applicationCallGtxnType],\n])\n\nfunction resolveClients(\n compilationSet: CompilationSet,\n filePaths: AlgoFile[],\n arc56Contracts: Record<string, abi.Arc56Contract>,\n): ClientTask[] {\n const sourceFileToOutDir = new Map<string, AbsolutePath>()\n for (const { sourceFile, outDir } of filePaths) {\n sourceFileToOutDir.set(sourceFile.toString(), outDir)\n }\n\n const arc56Files = []\n for (const ref of compilationSet.compilationOutputSet) {\n if (!(ref instanceof ContractReference)) {\n continue\n }\n const model = compilationSet.get(ref)\n if (!(model instanceof ContractClassModel)) {\n continue\n }\n if (!model.type.isARC4) {\n continue\n }\n\n const sourceFile = AbsolutePath.resolve({ path: ref.moduleName })\n const outDir = sourceFileToOutDir.get(sourceFile.toString())\n if (outDir === undefined) {\n logger.error(undefined, `Could not find a source file for the contract ${ref.className} at ${ref.moduleName}`)\n continue\n }\n\n const spec = arc56Contracts[ref.id]\n if (spec === undefined) {\n logger.error(undefined, `Could not find a generated spec for the contract ${ref.className} at ${ref.moduleName}`)\n continue\n }\n\n const name = model.options?.name || model.name\n arc56Files.push({\n spec,\n outFile: outDir.join(`${name}.client.ts`),\n })\n }\n return arc56Files\n}\n\nexport function writeARC4Clients(compilationSet: CompilationSet, filePaths: AlgoFile[], arc56Contracts: Record<string, abi.Arc56Contract>) {\n const clientFiles = resolveClients(compilationSet, filePaths, arc56Contracts)\n return Promise.all(\n clientFiles.map(async (clientTask) => {\n await writeARC4Client(clientTask.spec, clientTask.outFile)\n }),\n )\n}\n\nexport async function writeARC4Client(spec: abi.Arc56Contract, outFile: AbsolutePath) {\n if (await shouldWriteFile(outFile)) {\n logger.info(undefined, `Writing ${outFile.relativeTo('.')}`)\n const typescriptClient = generateClientFor(spec)\n await writeFile(outFile.toString(), typescriptClient, { encoding: 'utf-8' })\n } else {\n logger.error(undefined, `Not outputting ${outFile.relativeTo('.')} since content does not appear to be auto-generated`)\n }\n}\n\nasync function shouldWriteFile(outFile: AbsolutePath): Promise<boolean> {\n const filePath = outFile.toString()\n // FIXME: There's a TOCTOU bug here...\n if (!existsSync(filePath)) {\n return true\n }\n const contents = await readFile(filePath, { encoding: 'utf-8' })\n return contents.startsWith(AUTO_GENERATED_COMMENT)\n}\n\nfunction generateClientFor(contract: abi.Arc56Contract): string {\n const typeImports = new Set<string>()\n const imports = new Set<string>()\n const structToClass = new Map<string, string>()\n const reservedClassNames = new Set<string>()\n const reservedMethodNames = new Set<string>()\n const classDecls: string[] = []\n\n function useImport(name: string, asValue: boolean) {\n if (asValue) {\n if (typeImports.has(name)) typeImports.delete(name)\n imports.add(name)\n } else if (!imports.has(name)) {\n typeImports.add(name)\n }\n }\n function indent(...texts: string[]): string {\n const INDENT = ' '\n return INDENT + texts.join('\\n').replaceAll(/\\n+/g, `$&${INDENT}`)\n }\n\n function classNameFor(name: string): string {\n const base_name = name\n let seq = 1\n while (reservedClassNames.has(name)) {\n seq++\n name = `${base_name}${seq}`\n }\n\n reservedClassNames.add(name)\n return name\n }\n\n function methodNameFor(name: string): string {\n const base_name = name\n let seq = 1\n while (reservedMethodNames.has(name)) {\n seq++\n name = `${base_name}${seq}`\n }\n\n reservedMethodNames.add(name)\n return name\n }\n\n function typeNameToAlgoTSName(typeName: string): string {\n const knownMapping = ARC4_PYTYPE_MAPPING.get(typeName)\n if (knownMapping !== undefined) {\n const { name, module } = knownMapping\n if (module === Constants.moduleNames.algoTs.gtxn) {\n useImport('gtxn', false)\n return `gtxn.${name}`\n } else if (module === Constants.moduleNames.algoTs.reference) {\n useImport(name, false)\n return name\n } else if (module === 'lib.d.ts') {\n // The TypeScript prelude is always imported\n return name\n }\n\n throw new InternalError(`Cannot import ${name}: The module ${module} is unsupported`)\n }\n return ARC4ToAlgoTSName(abi.ABIType.from(typeName))\n }\n\n function ARC4ToAlgoTSName(type: abi.ABIType): string {\n useImport('arc4', false)\n if (type instanceof abi.ABIBoolType) return 'arc4.Bool'\n if (type instanceof abi.ABIStringType) return 'arc4.Str'\n if (type instanceof abi.ABIAddressType) return 'arc4.Address'\n if (type instanceof abi.ABIByteType) return 'arc4.Byte'\n if (type instanceof abi.ABIUintType) return `arc4.Uint<${type.bitSize}>`\n if (type instanceof abi.ABIUfixedType) return `arc4.UFixed<${type.bitSize}, ${type.precision}>`\n if (type instanceof abi.ABIArrayStaticType) {\n const elementType = ARC4ToAlgoTSName(type.childType)\n return `arc4.StaticArray<${elementType}, ${type.length}>`\n }\n if (type instanceof abi.ABIArrayDynamicType) {\n if (type.childType instanceof abi.ABIByteType) return 'arc4.DynamicBytes'\n\n const elementType = ARC4ToAlgoTSName(type.childType)\n return `arc4.DynamicArray<${elementType}>`\n }\n if (type instanceof abi.ABITupleType) {\n const tupleTypes = type.childTypes.map(ARC4ToAlgoTSName)\n return `arc4.Tuple<readonly [${tupleTypes.join(', ')}]>`\n }\n throw new CodeError(`unknown ARC-4 type '${type}'`)\n }\n\n function getClientType(type: string): string {\n // map ABI / AVM type to algots type\n if (type === 'AVMUint64') {\n useImport('uint64', false)\n return 'uint64'\n } else if (type === 'AVMBytes') {\n useImport('bytes', false)\n return 'bytes'\n } else if (type in contract.structs) {\n return structToClass.get(type) || prepareStructClass(type, contract.structs[type])\n } else {\n return typeNameToAlgoTSName(type)\n }\n }\n\n function prepareStructClass(name: string, fields: abi.StructField[]) {\n useImport('arc4', true)\n\n const className = classNameFor(name)\n structToClass.set(name, className)\n const lines = ['', `export class ${className} extends arc4.Struct<{`]\n for (const field of fields) {\n let type: string\n if (typeof field.type === 'string') {\n type = getClientType(field.type)\n } else {\n // generate anonymous struct type\n const anonStruct = `${name}_${field.name}`\n type = prepareStructClass(anonStruct, field.type)\n }\n lines.push(indent(`${field.name}: ${type}`))\n }\n lines.push('}> {}')\n classDecls.push(...lines)\n return className\n }\n\n function tsdoc(description: string | undefined | null): string[] {\n if (description === undefined || description === null) {\n return []\n }\n return ['/**', ` * ${description.replaceAll(/\\n+/g, '$& * ')}`, ' */']\n }\n\n function compatibleActions(create: string[], call: string[]): boolean {\n if (create.length === 0) {\n return true\n }\n if (call.length === 0) {\n return true\n }\n // if both collections are present, then they are compatible if everything in\n // create is also in call\n const createSet = new Set(create)\n const callSet = new Set(call)\n return createSet.symmetricDifference(callSet).size === 0\n }\n\n function ARC4MethodToTSDecorator(name: string, method: abi.Arc56Method): string {\n useImport('abimethod', true)\n\n const abimethodArgs: string[] = []\n if (method.name !== name) {\n abimethodArgs.push(`name: '${method.name}'`)\n }\n if (method.readonly) {\n abimethodArgs.push('readonly: true')\n }\n // if any alias types are encountered, force index encoding\n const argTypes = new Set(method.args.map((v) => v.type))\n const aliasTypes = new Set(['asset', 'application', 'account'])\n if (argTypes.intersection(aliasTypes).size !== 0) {\n abimethodArgs.push(\"resourceEncoding: 'index'\")\n }\n if (!compatibleActions(method.actions.create, method.actions.call)) {\n // TODO: support this, once decorators support it\n throw new CodeError(`unsupported on completion combination for generating an ARC-4 client for method: ${method.name}`)\n }\n const actions = [...method.actions.create, ...method.actions.call]\n actions.sort((a, b) => OnCompletionAction[a] - OnCompletionAction[b])\n const uniqueActions = new Set(actions)\n\n if (!(uniqueActions.size === 1 && uniqueActions.has('NoOp'))) {\n abimethodArgs.push(`allowActions: [${actions.map((v) => `'${v}'`).join(', ')}]`)\n }\n if (method.actions.create.length !== 0 && method.actions.call.length !== 0) {\n abimethodArgs.push(\"onCreate: 'allow'\")\n } else if (method.actions.create.length !== 0) {\n abimethodArgs.push(\"onCreate: 'require'\")\n } else {\n // disallow is default\n }\n const args = abimethodArgs.length === 0 ? '' : `{ ${abimethodArgs.join(', ')} }`\n return `@abimethod(${args})`\n }\n\n function genArg(arg: Arc56Arg): string {\n const argType = getClientType(arg.struct || arg.type)\n return `${arg.name}: ${argType},`\n }\n\n function genMethod(method: abi.Arc56Method): string {\n useImport('err', true)\n\n const return_type = getClientType(method.returns.struct || method.returns.type)\n const method_name = methodNameFor(method.name)\n const args = method.args.map(genArg)\n let arglist: string\n if (args.length === 0) {\n // No args -> inline arglist\n arglist = '()'\n } else if (args.length === 1) {\n // One arg -> inline arglist (remove trailing comma)\n arglist = `(${args[0].slice(0, -1)})`\n } else {\n // At least two args -> multiline arglist\n arglist = `(\\n${indent(...args)}\\n)`\n }\n\n return indent(\n ...tsdoc(method.desc),\n ARC4MethodToTSDecorator(method_name, method),\n `${method_name}${arglist}: ${return_type} {`,\n indent(\"err('stub only')\"),\n '}',\n )\n }\n\n function genMethods(): string[] {\n const methods = []\n if (contract.methods.length !== 0) {\n methods.push(genMethod(contract.methods[0]))\n }\n for (const method of contract.methods.slice(1)) {\n methods.push(`\\n${genMethod(method)}`)\n }\n return methods\n }\n\n // generate class definitions for any referenced structs in methods\n // don't generate from self.contract.structs as it may contain other struct definitions\n const clientClass = classNameFor(contract.name)\n const docs = tsdoc(contract.desc)\n const methods = genMethods()\n useImport('Contract', true)\n\n const sortedTypeImports = [...typeImports].toSorted().join(', ')\n const sortedImports = [...imports].toSorted().join(', ')\n const lines = []\n // Header\n lines.push(AUTO_GENERATED_COMMENT)\n lines.push(DISABLE_ESLINT_PRAGMA)\n if (sortedTypeImports.length !== 0) lines.push(`import type { ${sortedTypeImports} } from '@algorandfoundation/algorand-typescript'`)\n if (sortedImports.length !== 0) lines.push(`import { ${sortedImports} } from '@algorandfoundation/algorand-typescript'`)\n\n lines.push(\n // Struct declarations\n ...classDecls,\n '',\n // Contract definition\n ...docs,\n `export abstract class ${clientClass} extends Contract {`,\n ...methods,\n '}',\n '',\n )\n return lines.join('\\n')\n}\n"],"names":["ptype.accountPType","ptype.applicationPType","ptype.assetPType","ptype.voidPType","ptype.anyGtxnType","ptype.paymentGtxnType","ptype.keyRegistrationGtxnType","ptype.assetConfigGtxnType","ptype.assetTransferGtxnType","ptype.assetFreezeGtxnType","ptype.applicationCallGtxnType"],"mappings":"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"}
|