@algorandfoundation/algorand-typescript-testing 1.0.0-beta.16 → 1.0.0-beta.18
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/README.md +205 -0
- package/package.json +2 -2
- package/test-transformer/index.d.ts +3 -0
- package/test-transformer/index.mjs +35 -28
- package/test-transformer/index.mjs.map +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# Algorand TypeScript Testing
|
|
2
|
+
|
|
3
|
+
[](https://github.com/algorandfoundation/algorand-typescript-testing/)
|
|
4
|
+
[](https://developer.algorand.org/algokit/)
|
|
5
|
+
[](https://github.com/algorandfoundation/algorand-typescript-testing)
|
|
6
|
+
[](https://github.com/algorandfoundation/algorand-typescript-testing/)
|
|
7
|
+
|
|
8
|
+
`algorand-typescript-testing` is a companion package to [Algorand Typescript](https://github.com/algorandfoundation/puya-ts/tree/main/packages/algo-ts) that enables efficient unit testing of Algorand TypeScript smart contracts in an offline environment. This package emulates key AVM behaviors without requiring a network connection, offering fast and reliable testing capabilities with a familiar TypeScript interface.
|
|
9
|
+
|
|
10
|
+
The `algorand-typescript-testing` package provides:
|
|
11
|
+
|
|
12
|
+
- A simple interface for fast and reliable unit testing
|
|
13
|
+
- An offline testing environment that simulates core AVM functionality
|
|
14
|
+
- A familiar TypeScript experience, compatible with testing frameworks like [vitest](https://vitest.dev/), and [jest](https://jestjs.io/)
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
`algorand-typescript` is a prerequisite for `algorand-typescript-testing`, providing stubs and type annotations for Algorand TypeScript syntax. It enhances code completion and type checking when writing smart contracts. Note that this code isn't directly executable in standard Node.js environment; it's compiled by `puya-ts` into TEAL for Algorand Network deployment.
|
|
19
|
+
|
|
20
|
+
Traditionally, testing Algorand smart contracts involved deployment on sandboxed networks and interacting with live instances. While robust, this approach can be inefficient and lacks versatility for testing Algorand TypeScript code.
|
|
21
|
+
|
|
22
|
+
Enter `algorand-typescript-testing`: it leverages TypeScript's rich testing ecosystem for unit testing without network deployment. This enables rapid iteration and granular logic testing.
|
|
23
|
+
|
|
24
|
+
> **NOTE**: While `algorand-typescript-testing` offers valuable unit testing capabilities, it's not a replacement for comprehensive testing. Use it alongside other test types, particularly those running against the actual Algorand Network, for thorough contract validation.
|
|
25
|
+
|
|
26
|
+
### Prerequisites
|
|
27
|
+
|
|
28
|
+
- Python 3.12 or later
|
|
29
|
+
- [Algorand Python](https://github.com/algorandfoundation/puya)
|
|
30
|
+
- Node.js 20.x or later
|
|
31
|
+
- [Algorand TypeScript](https://github.com/algorandfoundation/puya-ts)
|
|
32
|
+
|
|
33
|
+
### Installation
|
|
34
|
+
|
|
35
|
+
`algorand-typescript-testing` is distributed via [npm](https://www.npmjs.com/package/@algorandfoundation/algorand-typescript-testing/). Install the package using `npm`:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm i @algorandfoundation/algorand-typescript-testing
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Testing your first contract
|
|
42
|
+
|
|
43
|
+
Let's write a simple contract and test it using the `algorand-typescript-testing` framework.
|
|
44
|
+
|
|
45
|
+
If you are using [vitest](https://vitest.dev/) with [@rollup/plugin-typescript](https://www.npmjs.com/package/@rollup/plugin-typescript) plugin, configure `puyaTsTransformer` as a `before` stage transformer of `typescript` plugin in `vitest.config.mts` file.
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import typescript from '@rollup/plugin-typescript'
|
|
49
|
+
import { defineConfig } from 'vitest/config'
|
|
50
|
+
import { puyaTsTransformer } from '@algorandfoundation/algorand-typescript-testing/test-transformer'
|
|
51
|
+
|
|
52
|
+
export default defineConfig({
|
|
53
|
+
esbuild: {},
|
|
54
|
+
test: {
|
|
55
|
+
setupFiles: 'vitest.setup.ts',
|
|
56
|
+
},
|
|
57
|
+
plugins: [
|
|
58
|
+
typescript({
|
|
59
|
+
tsconfig: './tsconfig.json',
|
|
60
|
+
transformers: {
|
|
61
|
+
before: [puyaTsTransformer],
|
|
62
|
+
},
|
|
63
|
+
}),
|
|
64
|
+
],
|
|
65
|
+
})
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`algorand-typescript-testing` package also exposes additional equality testers which enables the smart contract developers to write terser test by avoiding type casting in assertions. It can setup in `beforeAll` hook point in the setup file, `vitest.setup.ts`.
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
import { beforeAll, expect } from 'vitest'
|
|
72
|
+
import { addEqualityTesters } from '@algorandfoundation/algorand-typescript-testing'
|
|
73
|
+
|
|
74
|
+
beforeAll(() => {
|
|
75
|
+
addEqualityTesters({ expect })
|
|
76
|
+
})
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
#### Contract Definition
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
import { arc4, assert, Bytes, GlobalState, gtxn, LocalState, op, Txn, uint64, Uint64 } from '@algorandfoundation/algorand-typescript'
|
|
83
|
+
|
|
84
|
+
export default class VotingContract extends arc4.Contract {
|
|
85
|
+
topic = GlobalState({ initialValue: 'default_topic', key: Bytes('topic') })
|
|
86
|
+
votes = GlobalState({ initialValue: Uint64(0), key: Bytes('votes') })
|
|
87
|
+
voted = LocalState<uint64>({ key: Bytes('voted') })
|
|
88
|
+
|
|
89
|
+
@arc4.abimethod()
|
|
90
|
+
public setTopic(topic: string): void {
|
|
91
|
+
this.topic.value = topic
|
|
92
|
+
}
|
|
93
|
+
@arc4.abimethod()
|
|
94
|
+
public vote(pay: gtxn.PaymentTxn): boolean {
|
|
95
|
+
assert(op.Global.groupSize === 2, 'Expected 2 transactions')
|
|
96
|
+
assert(pay.amount === 10_000, 'Incorrect payment amount')
|
|
97
|
+
assert(pay.sender === Txn.sender, 'Payment sender must match transaction sender')
|
|
98
|
+
|
|
99
|
+
if (this.voted(Txn.sender).hasValue) {
|
|
100
|
+
return false // Already voted
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
this.votes.value = this.votes.value + 1
|
|
104
|
+
this.voted(Txn.sender).value = 1
|
|
105
|
+
return true
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
@arc4.abimethod({ readonly: true })
|
|
109
|
+
public getVotes(): uint64 {
|
|
110
|
+
return this.votes.value
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public clearStateProgram(): boolean {
|
|
114
|
+
return true
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
#### Test Definition
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
import { Uint64 } from '@algorandfoundation/algorand-typescript'
|
|
123
|
+
import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing'
|
|
124
|
+
import { afterEach, describe, expect, test } from 'vitest'
|
|
125
|
+
import VotingContract from './contract.algo'
|
|
126
|
+
|
|
127
|
+
describe('Voting contract', () => {
|
|
128
|
+
const ctx = new TestExecutionContext()
|
|
129
|
+
afterEach(() => {
|
|
130
|
+
ctx.reset()
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
test('vote function', () => {
|
|
134
|
+
// Initialize the contract within the testing context
|
|
135
|
+
const contract = ctx.contract.create(VotingContract)
|
|
136
|
+
|
|
137
|
+
const voter = ctx.defaultSender
|
|
138
|
+
const payment = ctx.any.txn.payment({
|
|
139
|
+
sender: voter,
|
|
140
|
+
amount: 10_000,
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
const result = contract.vote(payment)
|
|
144
|
+
expect(result).toEqual(true)
|
|
145
|
+
expect(contract.votes.value).toEqual(1)
|
|
146
|
+
expect(contract.voted(voter).value).toEqual(1)
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
test('setTopic function', () => {
|
|
150
|
+
// Initialize the contract within the testing context
|
|
151
|
+
const contract = ctx.contract.create(VotingContract)
|
|
152
|
+
|
|
153
|
+
const newTopic = ctx.any.string(10)
|
|
154
|
+
contract.setTopic(newTopic)
|
|
155
|
+
expect(contract.topic.value).toEqual(newTopic)
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
test('getVotes function', () => {
|
|
159
|
+
// Initialize the contract within the testing context
|
|
160
|
+
const contract = ctx.contract.create(VotingContract)
|
|
161
|
+
|
|
162
|
+
contract.votes.value = 5
|
|
163
|
+
const votes = contract.getVotes()
|
|
164
|
+
expect(votes).toEqual(5)
|
|
165
|
+
})
|
|
166
|
+
})
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
This example demonstrates key aspects of testing with `algorand-typescript-testing` for ARC4-based contracts:
|
|
170
|
+
|
|
171
|
+
1. ARC4 Contract Features:
|
|
172
|
+
|
|
173
|
+
- Use of `arc4.Contract` as the base class for the contract.
|
|
174
|
+
- ABI methods defined using the `@arc4.abimethod` decorator.
|
|
175
|
+
- Readonly method annotation with `@arc4.abimethod({readonly: true})`.
|
|
176
|
+
|
|
177
|
+
2. Testing ARC4 Contracts:
|
|
178
|
+
|
|
179
|
+
- Creation of an `arc4.Contract` instance within the test context.
|
|
180
|
+
- Use of `ctx.any` for generating random test data.
|
|
181
|
+
- Direct invocation of ABI methods on the contract instance.
|
|
182
|
+
|
|
183
|
+
3. Transaction Handling:
|
|
184
|
+
|
|
185
|
+
- Use of `ctx.any.txn` to create test transactions.
|
|
186
|
+
- Passing transaction objects as parameters to contract methods.
|
|
187
|
+
|
|
188
|
+
4. State Verification:
|
|
189
|
+
- Checking global and local state changes after method execution.
|
|
190
|
+
- Verifying return values from ABI methods.
|
|
191
|
+
|
|
192
|
+
> **NOTE**: Thorough testing is crucial in smart contract development due to their immutable nature post-deployment. Comprehensive unit and integration tests ensure contract validity and reliability. Optimizing for efficiency can significantly improve user experience by reducing transaction fees and simplifying interactions. Investing in robust testing and optimization practices is crucial and offers many benefits in the long run.
|
|
193
|
+
|
|
194
|
+
### Next steps
|
|
195
|
+
|
|
196
|
+
To dig deeper into the capabilities of `algorand-typescript-testing`, continue with the following sections.
|
|
197
|
+
|
|
198
|
+
#### Contents
|
|
199
|
+
|
|
200
|
+
- [Testing Guide](./docs/testing-guide/index.md)
|
|
201
|
+
- [Examples](./docs/examples.md)
|
|
202
|
+
- [Coverage](./docs/coverage.md)
|
|
203
|
+
- [FQA](./docs/faq.md)
|
|
204
|
+
- [API Reference](./docs/api.md)
|
|
205
|
+
- [Algorand TypeScript](./docs/algots.md)
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"**"
|
|
5
5
|
],
|
|
6
6
|
"name": "@algorandfoundation/algorand-typescript-testing",
|
|
7
|
-
"version": "1.0.0-beta.
|
|
7
|
+
"version": "1.0.0-beta.18",
|
|
8
8
|
"description": "A library which allows you to execute Algorand TypeScript code locally under a test context either emulating or mocking AVM behaviour.",
|
|
9
9
|
"private": false,
|
|
10
10
|
"peerDependencies": {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@algorandfoundation/algorand-typescript": "^1.0.0-beta.16",
|
|
15
|
-
"@algorandfoundation/puya-ts": "^1.0.0-beta.
|
|
15
|
+
"@algorandfoundation/puya-ts": "^1.0.0-beta.23",
|
|
16
16
|
"elliptic": "^6.5.7",
|
|
17
17
|
"js-sha256": "^0.11.0",
|
|
18
18
|
"js-sha3": "^0.9.3",
|
|
@@ -33,3 +33,6 @@ export interface TransformerConfig {
|
|
|
33
33
|
* })
|
|
34
34
|
*/
|
|
35
35
|
export declare const puyaTsTransformer: ts.TransformerFactory<ts.SourceFile> & ((config: Partial<TransformerConfig>) => ts.TransformerFactory<ts.SourceFile>);
|
|
36
|
+
export declare const name = "puyaTsTransformer";
|
|
37
|
+
export declare const version = "0.1.0";
|
|
38
|
+
export declare const factory: (program: ts.Program) => ts.TransformerFactory<ts.SourceFile>;
|
|
@@ -20,44 +20,44 @@ const getPropertyNameAsString = (name) => {
|
|
|
20
20
|
};
|
|
21
21
|
const trimGenericTypeName = (typeName) => typeName.replace(/<.*>/, '');
|
|
22
22
|
|
|
23
|
-
const factory$
|
|
23
|
+
const factory$2 = ts.factory;
|
|
24
24
|
const nodeFactory = {
|
|
25
25
|
importHelpers(testingPackageName) {
|
|
26
|
-
return factory$
|
|
26
|
+
return factory$2.createImportDeclaration(undefined, factory$2.createImportClause(false, undefined, factory$2.createNamespaceImport(factory$2.createIdentifier('runtimeHelpers'))), factory$2.createStringLiteral(`${testingPackageName}/runtime-helpers`), undefined);
|
|
27
27
|
},
|
|
28
28
|
switchableValue(x) {
|
|
29
|
-
return factory$
|
|
29
|
+
return factory$2.createCallExpression(factory$2.createPropertyAccessExpression(factory$2.createIdentifier('runtimeHelpers'), factory$2.createIdentifier('switchableValue')), undefined, [x]);
|
|
30
30
|
},
|
|
31
31
|
binaryOp(left, right, op) {
|
|
32
|
-
return factory$
|
|
32
|
+
return factory$2.createCallExpression(factory$2.createPropertyAccessExpression(factory$2.createIdentifier('runtimeHelpers'), factory$2.createIdentifier('binaryOp')), undefined, [left, right, factory$2.createStringLiteral(op)]);
|
|
33
33
|
},
|
|
34
34
|
augmentedAssignmentBinaryOp(left, right, op) {
|
|
35
|
-
return factory$
|
|
35
|
+
return factory$2.createAssignment(left, factory$2.createCallExpression(factory$2.createPropertyAccessExpression(factory$2.createIdentifier('runtimeHelpers'), factory$2.createIdentifier('binaryOp')), undefined, [left, right, factory$2.createStringLiteral(op.replace('=', ''))]));
|
|
36
36
|
},
|
|
37
37
|
prefixUnaryOp(operand, op) {
|
|
38
|
-
return factory$
|
|
38
|
+
return factory$2.createCallExpression(factory$2.createPropertyAccessExpression(factory$2.createIdentifier('runtimeHelpers'), factory$2.createIdentifier('unaryOp')), undefined, [operand, factory$2.createStringLiteral(op)]);
|
|
39
39
|
},
|
|
40
40
|
attachMetaData(classIdentifier, method, functionType, argTypes, returnType) {
|
|
41
41
|
const methodName = getPropertyNameAsString(method.name);
|
|
42
|
-
const metadata = factory$
|
|
43
|
-
factory$
|
|
44
|
-
factory$
|
|
45
|
-
factory$
|
|
42
|
+
const metadata = factory$2.createObjectLiteralExpression([
|
|
43
|
+
factory$2.createPropertyAssignment('methodName', methodName),
|
|
44
|
+
factory$2.createPropertyAssignment('argTypes', factory$2.createArrayLiteralExpression(argTypes.map((p) => factory$2.createStringLiteral(p)))),
|
|
45
|
+
factory$2.createPropertyAssignment('returnType', factory$2.createStringLiteral(returnType)),
|
|
46
46
|
]);
|
|
47
|
-
return factory$
|
|
47
|
+
return factory$2.createExpressionStatement(factory$2.createCallExpression(factory$2.createPropertyAccessExpression(factory$2.createIdentifier('runtimeHelpers'), factory$2.createIdentifier('attachAbiMetadata')), undefined, [classIdentifier, methodName, metadata]));
|
|
48
48
|
},
|
|
49
49
|
captureGenericTypeInfo(x, info) {
|
|
50
|
-
return factory$
|
|
50
|
+
return factory$2.createCallExpression(factory$2.createPropertyAccessExpression(factory$2.createIdentifier('runtimeHelpers'), factory$2.createIdentifier('captureGenericTypeInfo')), undefined, [x, factory$2.createStringLiteral(info)]);
|
|
51
51
|
},
|
|
52
52
|
instantiateARC4EncodedType(node, typeInfo) {
|
|
53
53
|
const infoString = JSON.stringify(typeInfo);
|
|
54
54
|
const classIdentifier = node.expression.getText().replace('arc4.', '');
|
|
55
|
-
return factory$
|
|
55
|
+
return factory$2.createNewExpression(factory$2.createIdentifier(`runtimeHelpers.${trimGenericTypeName(typeInfo?.name ?? classIdentifier)}Impl`), node.typeArguments, [infoString ? factory$2.createStringLiteral(infoString) : undefined, ...(node.arguments ?? [])].filter((arg) => !!arg));
|
|
56
56
|
},
|
|
57
57
|
callStubbedFunction(functionName, node, typeInfo) {
|
|
58
|
-
const typeInfoArg = typeInfo ? factory$
|
|
59
|
-
const updatedPropertyAccessExpression = factory$
|
|
60
|
-
return factory$
|
|
58
|
+
const typeInfoArg = typeInfo ? factory$2.createStringLiteral(JSON.stringify(typeInfo)) : undefined;
|
|
59
|
+
const updatedPropertyAccessExpression = factory$2.createPropertyAccessExpression(factory$2.createIdentifier('runtimeHelpers'), `${functionName}Impl`);
|
|
60
|
+
return factory$2.createCallExpression(updatedPropertyAccessExpression, node.typeArguments, [typeInfoArg, ...(node.arguments ?? [])].filter((arg) => !!arg));
|
|
61
61
|
},
|
|
62
62
|
};
|
|
63
63
|
|
|
@@ -146,7 +146,7 @@ function supportedPrefixUnaryOpString(x) {
|
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
-
const { factory } = ts;
|
|
149
|
+
const { factory: factory$1 } = ts;
|
|
150
150
|
const algotsModuleRegExp = new RegExp(/^("|')@algorandfoundation\/algorand-typescript(\/|"|')/);
|
|
151
151
|
const algotsModuleSpecifier = '@algorandfoundation/algorand-typescript';
|
|
152
152
|
const testingInternalModuleSpecifier = (testingPackageName) => `${testingPackageName}/internal`;
|
|
@@ -164,9 +164,11 @@ class SourceFileVisitor {
|
|
|
164
164
|
this.context = context;
|
|
165
165
|
this.sourceFile = sourceFile;
|
|
166
166
|
this.config = config;
|
|
167
|
-
|
|
167
|
+
// ts-jest would pass a TsCompilerInstance as program parameter whereas rollup-plugin-typescript would pass a ts.Program
|
|
168
|
+
const programInstance = (Object.hasOwn(program, 'program') ? program.program : program);
|
|
169
|
+
const typeChecker = programInstance.getTypeChecker();
|
|
168
170
|
const loggingContext = LoggingContext.create();
|
|
169
|
-
const typeResolver = new TypeResolver(typeChecker,
|
|
171
|
+
const typeResolver = new TypeResolver(typeChecker, programInstance.getCurrentDirectory());
|
|
170
172
|
this.helper = {
|
|
171
173
|
additionalStatements: [],
|
|
172
174
|
resolveType(node) {
|
|
@@ -185,13 +187,13 @@ class SourceFileVisitor {
|
|
|
185
187
|
return s && s.flags & ts.SymbolFlags.Alias ? typeChecker.getAliasedSymbol(s) : s;
|
|
186
188
|
},
|
|
187
189
|
sourceLocation(node) {
|
|
188
|
-
return SourceLocation.fromNode(node,
|
|
190
|
+
return SourceLocation.fromNode(node, programInstance.getCurrentDirectory());
|
|
189
191
|
},
|
|
190
192
|
};
|
|
191
193
|
}
|
|
192
194
|
result() {
|
|
193
195
|
const updatedSourceFile = ts.visitNode(this.sourceFile, this.visit);
|
|
194
|
-
return factory.updateSourceFile(updatedSourceFile, [
|
|
196
|
+
return factory$1.updateSourceFile(updatedSourceFile, [
|
|
195
197
|
nodeFactory.importHelpers(this.config.testingPackageName),
|
|
196
198
|
...updatedSourceFile.statements,
|
|
197
199
|
...this.helper.additionalStatements,
|
|
@@ -232,9 +234,9 @@ class ImportDeclarationVisitor {
|
|
|
232
234
|
return this.declarationNode;
|
|
233
235
|
const namedBindings = this.declarationNode.importClause?.namedBindings;
|
|
234
236
|
const nonTypeNamedBindings = namedBindings && ts.isNamedImports(namedBindings) ? namedBindings.elements.filter((e) => !e.isTypeOnly) : [];
|
|
235
|
-
return factory.createImportDeclaration(this.declarationNode.modifiers, nonTypeNamedBindings.length
|
|
236
|
-
? factory.createImportClause(false, this.declarationNode.importClause?.name, factory.createNamedImports(nonTypeNamedBindings))
|
|
237
|
-
: this.declarationNode.importClause, factory.createStringLiteral(moduleSpecifier
|
|
237
|
+
return factory$1.createImportDeclaration(this.declarationNode.modifiers, nonTypeNamedBindings.length
|
|
238
|
+
? factory$1.createImportClause(false, this.declarationNode.importClause?.name, factory$1.createNamedImports(nonTypeNamedBindings))
|
|
239
|
+
: this.declarationNode.importClause, factory$1.createStringLiteral(moduleSpecifier
|
|
238
240
|
.replace(algotsModuleSpecifier, testingInternalModuleSpecifier(this.config.testingPackageName))
|
|
239
241
|
.replace(/^("|')/, '')
|
|
240
242
|
.replace(/("|')$/, '')), this.declarationNode.attributes);
|
|
@@ -307,7 +309,7 @@ class VariableInitializerVisitor {
|
|
|
307
309
|
const updatedInitializer = new ExpressionVisitor(this.context, this.helper, initializerNode).result();
|
|
308
310
|
if (updatedInitializer === initializerNode)
|
|
309
311
|
return this.declarationNode;
|
|
310
|
-
return factory.updateVariableDeclaration(this.declarationNode, this.declarationNode.name, this.declarationNode.exclamationToken, this.declarationNode.type, updatedInitializer);
|
|
312
|
+
return factory$1.updateVariableDeclaration(this.declarationNode, this.declarationNode.name, this.declarationNode.exclamationToken, this.declarationNode.type, updatedInitializer);
|
|
311
313
|
}
|
|
312
314
|
}
|
|
313
315
|
class FunctionOrMethodVisitor {
|
|
@@ -324,10 +326,10 @@ class FunctionOrMethodVisitor {
|
|
|
324
326
|
};
|
|
325
327
|
updateNode(node) {
|
|
326
328
|
if (ts.isSwitchStatement(node)) {
|
|
327
|
-
return factory.updateSwitchStatement(node, nodeFactory.switchableValue(node.expression), node.caseBlock);
|
|
329
|
+
return factory$1.updateSwitchStatement(node, nodeFactory.switchableValue(node.expression), node.caseBlock);
|
|
328
330
|
}
|
|
329
331
|
if (ts.isCaseClause(node)) {
|
|
330
|
-
return factory.updateCaseClause(node, nodeFactory.switchableValue(node.expression), node.statements);
|
|
332
|
+
return factory$1.updateCaseClause(node, nodeFactory.switchableValue(node.expression), node.statements);
|
|
331
333
|
}
|
|
332
334
|
if (ts.isBinaryExpression(node)) {
|
|
333
335
|
const opTokenText = supportedBinaryOpString(node.operatorToken.kind);
|
|
@@ -552,6 +554,11 @@ programTransformer.factory = createProgramFactory(defaultTransformerConfig);
|
|
|
552
554
|
* })
|
|
553
555
|
*/
|
|
554
556
|
const puyaTsTransformer = programTransformer;
|
|
557
|
+
// exporting values needed by ts-jest for a transformer to work
|
|
558
|
+
// https://github.com/kulshekhar/ts-jest/tree/main/src/transformers
|
|
559
|
+
const name = 'puyaTsTransformer';
|
|
560
|
+
const version = '0.1.0';
|
|
561
|
+
const factory = createProgramFactory(defaultTransformerConfig);
|
|
555
562
|
|
|
556
|
-
export { puyaTsTransformer };
|
|
563
|
+
export { factory, name, puyaTsTransformer, version };
|
|
557
564
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/test-transformer/errors.ts","../../src/test-transformer/helpers.ts","../../src/test-transformer/node-factory.ts","../../src/test-transformer/supported-binary-op-string.ts","../../src/test-transformer/visitors.ts","../../src/test-transformer/index.ts"],"sourcesContent":["export class TransformerError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","import ts from 'typescript'\nimport { TransformerError } from './errors'\n\nexport const getPropertyNameAsString = (name: ts.PropertyName): ts.Identifier | ts.StringLiteral | ts.NoSubstitutionTemplateLiteral => {\n if (ts.isStringLiteralLike(name)) {\n return name\n }\n if (ts.isIdentifier(name)) {\n return ts.factory.createStringLiteral(name.text)\n }\n throw new TransformerError(`Node ${name.kind} cannot be converted to a static string`)\n}\n\nexport const trimGenericTypeName = (typeName: string) => typeName.replace(/<.*>/, '')\n","import type { ptypes } from '@algorandfoundation/puya-ts'\nimport ts from 'typescript'\nimport type { TypeInfo } from '../encoders'\nimport type { DeliberateAny } from '../typescript-helpers'\nimport { getPropertyNameAsString, trimGenericTypeName } from './helpers'\n\nconst factory = ts.factory\nexport const nodeFactory = {\n importHelpers(testingPackageName: string) {\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(false, undefined, factory.createNamespaceImport(factory.createIdentifier('runtimeHelpers'))),\n factory.createStringLiteral(`${testingPackageName}/runtime-helpers`),\n undefined,\n )\n },\n\n switchableValue(x: ts.Expression) {\n return factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('runtimeHelpers'), factory.createIdentifier('switchableValue')),\n undefined,\n [x],\n )\n },\n binaryOp(left: ts.Expression, right: ts.Expression, op: string) {\n return factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('runtimeHelpers'), factory.createIdentifier('binaryOp')),\n undefined,\n [left, right, factory.createStringLiteral(op)],\n )\n },\n augmentedAssignmentBinaryOp(left: ts.Expression, right: ts.Expression, op: string) {\n return factory.createAssignment(\n left,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('runtimeHelpers'), factory.createIdentifier('binaryOp')),\n undefined,\n [left, right, factory.createStringLiteral(op.replace('=', ''))],\n ),\n )\n },\n\n prefixUnaryOp(operand: ts.Expression, op: string) {\n return factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('runtimeHelpers'), factory.createIdentifier('unaryOp')),\n undefined,\n [operand, factory.createStringLiteral(op)],\n )\n },\n\n attachMetaData(\n classIdentifier: ts.Identifier,\n method: ts.MethodDeclaration,\n functionType: ptypes.FunctionPType,\n argTypes: string[],\n returnType: string,\n ) {\n const methodName = getPropertyNameAsString(method.name)\n const metadata = factory.createObjectLiteralExpression([\n factory.createPropertyAssignment('methodName', methodName),\n factory.createPropertyAssignment(\n 'argTypes',\n factory.createArrayLiteralExpression(argTypes.map((p) => factory.createStringLiteral(p))),\n ),\n factory.createPropertyAssignment('returnType', factory.createStringLiteral(returnType)),\n ])\n return factory.createExpressionStatement(\n factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('runtimeHelpers'), factory.createIdentifier('attachAbiMetadata')),\n undefined,\n [classIdentifier, methodName, metadata],\n ),\n )\n },\n\n captureGenericTypeInfo(x: ts.Expression, info: string) {\n return factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier('runtimeHelpers'),\n factory.createIdentifier('captureGenericTypeInfo'),\n ),\n undefined,\n [x, factory.createStringLiteral(info)],\n )\n },\n\n instantiateARC4EncodedType(node: ts.NewExpression, typeInfo?: TypeInfo) {\n const infoString = JSON.stringify(typeInfo)\n const classIdentifier = node.expression.getText().replace('arc4.', '')\n return factory.createNewExpression(\n factory.createIdentifier(`runtimeHelpers.${trimGenericTypeName(typeInfo?.name ?? classIdentifier)}Impl`),\n node.typeArguments,\n [infoString ? factory.createStringLiteral(infoString) : undefined, ...(node.arguments ?? [])].filter((arg) => !!arg),\n )\n },\n\n callStubbedFunction(functionName: string, node: ts.CallExpression, typeInfo?: TypeInfo) {\n const typeInfoArg = typeInfo ? factory.createStringLiteral(JSON.stringify(typeInfo)) : undefined\n const updatedPropertyAccessExpression = factory.createPropertyAccessExpression(\n factory.createIdentifier('runtimeHelpers'),\n `${functionName}Impl`,\n )\n\n return factory.createCallExpression(\n updatedPropertyAccessExpression,\n node.typeArguments,\n [typeInfoArg, ...(node.arguments ?? [])].filter((arg) => !!arg),\n )\n },\n} satisfies Record<string, (...args: DeliberateAny[]) => ts.Node>\n","import type { BinaryOperator, PrefixUnaryOperator } from 'typescript'\nimport ts from 'typescript'\n\nexport function supportedBinaryOpString(x: BinaryOperator): string | undefined {\n switch (x) {\n case ts.SyntaxKind.MinusToken:\n return '-'\n case ts.SyntaxKind.PlusToken:\n return '+'\n case ts.SyntaxKind.EqualsEqualsEqualsToken:\n return '==='\n case ts.SyntaxKind.ExclamationEqualsEqualsToken:\n return '!=='\n case ts.SyntaxKind.GreaterThanToken:\n return '>'\n case ts.SyntaxKind.GreaterThanEqualsToken:\n return '>='\n case ts.SyntaxKind.GreaterThanGreaterThanToken:\n return '>>'\n case ts.SyntaxKind.LessThanToken:\n return '<'\n case ts.SyntaxKind.LessThanEqualsToken:\n return '<='\n case ts.SyntaxKind.LessThanLessThanToken:\n return '<<'\n case ts.SyntaxKind.AsteriskToken:\n return '*'\n case ts.SyntaxKind.AsteriskAsteriskToken:\n return '**'\n case ts.SyntaxKind.SlashToken:\n return '/'\n case ts.SyntaxKind.PercentToken:\n return '%'\n case ts.SyntaxKind.AmpersandToken:\n return '&'\n case ts.SyntaxKind.BarToken:\n return '|'\n case ts.SyntaxKind.CaretToken:\n return '^'\n case ts.SyntaxKind.AmpersandAmpersandEqualsToken:\n case ts.SyntaxKind.AmpersandAmpersandToken:\n case ts.SyntaxKind.AmpersandEqualsToken:\n case ts.SyntaxKind.BarBarEqualsToken:\n case ts.SyntaxKind.BarBarToken:\n case ts.SyntaxKind.BarEqualsToken:\n case ts.SyntaxKind.CaretEqualsToken:\n case ts.SyntaxKind.CommaToken:\n case ts.SyntaxKind.EqualsEqualsToken:\n case ts.SyntaxKind.EqualsToken:\n case ts.SyntaxKind.ExclamationEqualsToken:\n case ts.SyntaxKind.InKeyword:\n case ts.SyntaxKind.InstanceOfKeyword:\n case ts.SyntaxKind.QuestionQuestionEqualsToken:\n case ts.SyntaxKind.QuestionQuestionToken:\n case ts.SyntaxKind.GreaterThanGreaterThanEqualsToken:\n case ts.SyntaxKind.LessThanLessThanEqualsToken:\n case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken:\n case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken:\n return undefined\n }\n}\n\nexport function supportedAugmentedAssignmentBinaryOpString(x: BinaryOperator): string | undefined {\n switch (x) {\n case ts.SyntaxKind.PlusEqualsToken:\n return '+='\n case ts.SyntaxKind.MinusEqualsToken:\n return '-='\n case ts.SyntaxKind.SlashEqualsToken:\n return '/='\n case ts.SyntaxKind.AsteriskEqualsToken:\n return '*='\n case ts.SyntaxKind.AsteriskAsteriskEqualsToken:\n return '**='\n case ts.SyntaxKind.PercentEqualsToken:\n return '%='\n default:\n return undefined\n }\n}\n\nexport function supportedPrefixUnaryOpString(x: PrefixUnaryOperator): string | undefined {\n switch (x) {\n case ts.SyntaxKind.TildeToken:\n return '~'\n default:\n return undefined\n }\n}\n","import { LoggingContext, ptypes, SourceLocation, TypeResolver } from '@algorandfoundation/puya-ts'\nimport path from 'path'\nimport ts from 'typescript'\nimport type { TypeInfo } from '../encoders'\nimport { instanceOfAny } from '../typescript-helpers'\nimport type { TransformerConfig } from './index'\nimport { nodeFactory } from './node-factory'\nimport {\n supportedAugmentedAssignmentBinaryOpString,\n supportedBinaryOpString,\n supportedPrefixUnaryOpString,\n} from './supported-binary-op-string'\n\nconst { factory } = ts\n\nconst algotsModuleRegExp = new RegExp(/^(\"|')@algorandfoundation\\/algorand-typescript(\\/|\"|')/)\nconst algotsModuleSpecifier = '@algorandfoundation/algorand-typescript'\nconst testingInternalModuleSpecifier = (testingPackageName: string) => `${testingPackageName}/internal`\nconst algotsModulePaths = [\n algotsModuleSpecifier,\n '/puya-ts/packages/algo-ts/',\n `${path.sep}puya-ts${path.sep}packages${path.sep}algo-ts${path.sep}`,\n]\n\ntype VisitorHelper = {\n additionalStatements: ts.Statement[]\n resolveType(node: ts.Node): ptypes.PType\n resolveTypeParameters(node: ts.CallExpression): ptypes.PType[]\n sourceLocation(node: ts.Node): SourceLocation\n tryGetSymbol(node: ts.Node): ts.Symbol | undefined\n}\n\nexport class SourceFileVisitor {\n private helper: VisitorHelper\n\n constructor(\n private context: ts.TransformationContext,\n private sourceFile: ts.SourceFile,\n program: ts.Program,\n private config: TransformerConfig,\n ) {\n const typeChecker = program.getTypeChecker()\n const loggingContext = LoggingContext.create()\n const typeResolver = new TypeResolver(typeChecker, program.getCurrentDirectory())\n this.helper = {\n additionalStatements: [],\n resolveType(node: ts.Node): ptypes.PType {\n try {\n return loggingContext.run(() => typeResolver.resolve(node, this.sourceLocation(node)))\n } catch {\n return ptypes.anyPType\n }\n },\n resolveTypeParameters(node: ts.CallExpression) {\n return loggingContext.run(() => typeResolver.resolveTypeParameters(node, this.sourceLocation(node)))\n },\n tryGetSymbol(node: ts.Node): ts.Symbol | undefined {\n const s = typeChecker.getSymbolAtLocation(node)\n return s && s.flags & ts.SymbolFlags.Alias ? typeChecker.getAliasedSymbol(s) : s\n },\n sourceLocation(node: ts.Node): SourceLocation {\n return SourceLocation.fromNode(node, program.getCurrentDirectory())\n },\n }\n }\n\n public result(): ts.SourceFile {\n const updatedSourceFile = ts.visitNode(this.sourceFile, this.visit) as ts.SourceFile\n return factory.updateSourceFile(updatedSourceFile, [\n nodeFactory.importHelpers(this.config.testingPackageName),\n ...updatedSourceFile.statements,\n ...this.helper.additionalStatements,\n ])\n }\n\n private visit = (node: ts.Node): ts.Node => {\n if (ts.isImportDeclaration(node)) {\n return new ImportDeclarationVisitor(this.context, this.helper, this.config, node).result()\n }\n if (ts.isFunctionLike(node)) {\n return new FunctionLikeDecVisitor(this.context, this.helper, node).result()\n }\n if (ts.isClassDeclaration(node)) {\n return new ClassVisitor(this.context, this.helper, node).result()\n }\n\n // capture generic type info for variable initialising outside class and function declarations\n // e.g. `const x = new UintN<32>(42)\n if (ts.isVariableDeclaration(node) && node.initializer) {\n return new VariableInitializerVisitor(this.context, this.helper, node).result()\n }\n\n return ts.visitEachChild(node, this.visit, this.context)\n }\n}\n\nclass ImportDeclarationVisitor {\n constructor(\n private context: ts.TransformationContext,\n private helper: VisitorHelper,\n private config: TransformerConfig,\n private declarationNode: ts.ImportDeclaration,\n ) {}\n\n public result(): ts.ImportDeclaration {\n const moduleSpecifier = this.declarationNode.moduleSpecifier.getText()\n if (this.declarationNode.importClause?.isTypeOnly || !algotsModuleRegExp.test(moduleSpecifier)) return this.declarationNode\n\n const namedBindings = this.declarationNode.importClause?.namedBindings\n const nonTypeNamedBindings =\n namedBindings && ts.isNamedImports(namedBindings) ? (namedBindings as ts.NamedImports).elements.filter((e) => !e.isTypeOnly) : []\n return factory.createImportDeclaration(\n this.declarationNode.modifiers,\n nonTypeNamedBindings.length\n ? factory.createImportClause(false, this.declarationNode.importClause?.name, factory.createNamedImports(nonTypeNamedBindings))\n : this.declarationNode.importClause,\n factory.createStringLiteral(\n moduleSpecifier\n .replace(algotsModuleSpecifier, testingInternalModuleSpecifier(this.config.testingPackageName))\n .replace(/^(\"|')/, '')\n .replace(/(\"|')$/, ''),\n ),\n this.declarationNode.attributes,\n )\n }\n}\n\nclass ExpressionVisitor {\n constructor(\n private context: ts.TransformationContext,\n private helper: VisitorHelper,\n private expressionNode: ts.Expression,\n private stubbedFunctionName?: string,\n ) {}\n\n public result(): ts.Expression {\n return this.visit(this.expressionNode) as ts.Expression\n }\n\n private visit = (node: ts.Node): ts.Node => {\n if (ts.isCallExpression(node) || ts.isNewExpression(node)) {\n let type = this.helper.resolveType(node)\n\n // `voted = LocalState<uint64>()` is resolved to FunctionPType with returnType LocalState<uint64>\n if (type instanceof ptypes.FunctionPType) type = type.returnType\n\n const isGeneric = isGenericType(type)\n const needsToCaptureTypeInfo = isGeneric && isStateOrBoxType(type)\n const isArc4Encoded = isArc4EncodedType(type)\n const info = isGeneric || isArc4Encoded ? getGenericTypeInfo(type) : undefined\n let updatedNode = node\n\n if (ts.isNewExpression(updatedNode)) {\n if (isArc4EncodedType(type)) {\n updatedNode = nodeFactory.instantiateARC4EncodedType(updatedNode, info)\n }\n }\n\n if (ts.isCallExpression(updatedNode)) {\n const stubbedFunctionName = this.stubbedFunctionName ?? tryGetStubbedFunctionName(updatedNode, this.helper)\n this.stubbedFunctionName = undefined\n let infoArg = info\n if (isCallingEmit(stubbedFunctionName)) {\n infoArg = this.helper.resolveTypeParameters(updatedNode).map(getGenericTypeInfo)[0]\n }\n if (isCallingDecodeArc4(stubbedFunctionName)) {\n const targetType = ptypes.ptypeToArc4EncodedType(type, this.helper.sourceLocation(node))\n const targetTypeInfo = getGenericTypeInfo(targetType)\n infoArg = targetTypeInfo\n }\n updatedNode = stubbedFunctionName ? nodeFactory.callStubbedFunction(stubbedFunctionName, updatedNode, infoArg) : updatedNode\n }\n return needsToCaptureTypeInfo\n ? nodeFactory.captureGenericTypeInfo(ts.visitEachChild(updatedNode, this.visit, this.context), JSON.stringify(info))\n : ts.visitEachChild(updatedNode, this.visit, this.context)\n }\n return ts.visitEachChild(node, this.visit, this.context)\n }\n}\nclass VariableInitializerVisitor {\n constructor(\n private context: ts.TransformationContext,\n private helper: VisitorHelper,\n private declarationNode: ts.VariableDeclaration,\n ) {}\n\n public result(): ts.VariableDeclaration {\n const initializerNode = this.declarationNode.initializer\n if (!initializerNode) return this.declarationNode\n\n const updatedInitializer = new ExpressionVisitor(this.context, this.helper, initializerNode).result()\n if (updatedInitializer === initializerNode) return this.declarationNode\n return factory.updateVariableDeclaration(\n this.declarationNode,\n this.declarationNode.name,\n this.declarationNode.exclamationToken,\n this.declarationNode.type,\n updatedInitializer,\n )\n }\n}\n\nclass FunctionOrMethodVisitor {\n constructor(\n protected context: ts.TransformationContext,\n protected helper: VisitorHelper,\n private isFunction?: boolean,\n ) {}\n protected visit = (node: ts.Node): ts.Node => {\n return ts.visitEachChild(this.updateNode(node), this.visit, this.context)\n }\n\n protected updateNode(node: ts.Node): ts.Node {\n if (ts.isSwitchStatement(node)) {\n return factory.updateSwitchStatement(node, nodeFactory.switchableValue(node.expression), node.caseBlock)\n }\n\n if (ts.isCaseClause(node)) {\n return factory.updateCaseClause(node, nodeFactory.switchableValue(node.expression), node.statements)\n }\n\n if (ts.isBinaryExpression(node)) {\n const opTokenText = supportedBinaryOpString(node.operatorToken.kind)\n if (opTokenText) {\n return nodeFactory.binaryOp(node.left, node.right, opTokenText)\n }\n const augmentedAssignmentOpTokenText = supportedAugmentedAssignmentBinaryOpString(node.operatorToken.kind)\n if (augmentedAssignmentOpTokenText) {\n return nodeFactory.augmentedAssignmentBinaryOp(node.left, node.right, augmentedAssignmentOpTokenText)\n }\n }\n if (ts.isPrefixUnaryExpression(node)) {\n const tokenText = supportedPrefixUnaryOpString(node.operator)\n if (tokenText) {\n return nodeFactory.prefixUnaryOp(node.operand, tokenText)\n }\n }\n\n /*\n * capture generic type info in test functions; e.g.\n * ```\n * it('should work', () => {\n * ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => {\n * const box = Box<uint64>({key: Bytes('test-key')})\n * })\n * })\n * ```\n */\n if (ts.isVariableDeclaration(node) && node.initializer) {\n return new VariableInitializerVisitor(this.context, this.helper, node).result()\n }\n\n /*\n * capture generic type info in test functions and swap arc4 types with implementation; e.g.\n * ```\n * it('should work', () => {\n * expect(() => new UintN<32>(2 ** 32)).toThrowError(`expected value <= ${2 ** 32 - 1}`)\n * expect(UintN.fromBytes<UintN<32>>('').bytes).toEqual(Bytes())\n * })\n * ```\n */\n if (ts.isNewExpression(node)) {\n return new ExpressionVisitor(this.context, this.helper, node).result()\n }\n if (ts.isCallExpression(node)) {\n const stubbedFunctionName = tryGetStubbedFunctionName(node, this.helper)\n if (stubbedFunctionName) {\n return new ExpressionVisitor(this.context, this.helper, node, stubbedFunctionName).result()\n }\n }\n\n return node\n }\n}\n\nclass FunctionLikeDecVisitor extends FunctionOrMethodVisitor {\n constructor(\n context: ts.TransformationContext,\n helper: VisitorHelper,\n private funcNode: ts.SignatureDeclaration,\n ) {\n super(context, helper, true)\n }\n\n public result(): ts.SignatureDeclaration {\n return ts.visitNode(this.funcNode, this.visit) as ts.SignatureDeclaration\n }\n}\nclass MethodDecVisitor extends FunctionOrMethodVisitor {\n constructor(\n context: ts.TransformationContext,\n helper: VisitorHelper,\n private methodNode: ts.MethodDeclaration,\n ) {\n super(context, helper)\n }\n\n public result(): ts.MethodDeclaration {\n return ts.visitNode(this.methodNode, this.visit) as ts.MethodDeclaration\n }\n}\n\nclass ClassVisitor {\n private isArc4: boolean\n constructor(\n private context: ts.TransformationContext,\n private helper: VisitorHelper,\n private classDec: ts.ClassDeclaration,\n ) {\n const classType = helper.resolveType(classDec)\n this.isArc4 = classType instanceof ptypes.ContractClassPType && classType.isARC4\n }\n\n public result(): ts.ClassDeclaration {\n return this.visit(this.classDec) as ts.ClassDeclaration\n }\n\n private visit = (node: ts.Node): ts.Node => {\n if (ts.isMethodDeclaration(node)) {\n if (this.classDec.name && this.isArc4) {\n const methodType = this.helper.resolveType(node)\n if (methodType instanceof ptypes.FunctionPType) {\n const argTypes = methodType.parameters.map((p) => JSON.stringify(getGenericTypeInfo(p[1])))\n const returnType = JSON.stringify(getGenericTypeInfo(methodType.returnType))\n this.helper.additionalStatements.push(nodeFactory.attachMetaData(this.classDec.name, node, methodType, argTypes, returnType))\n }\n }\n\n return new MethodDecVisitor(this.context, this.helper, node).result()\n }\n\n if (ts.isCallExpression(node)) {\n return new ExpressionVisitor(this.context, this.helper, node).result()\n }\n return ts.visitEachChild(node, this.visit, this.context)\n }\n}\n\nconst isGenericType = (type: ptypes.PType): boolean =>\n instanceOfAny(\n type,\n ptypes.ARC4StructType,\n ptypes.ARC4TupleType,\n ptypes.BoxMapPType,\n ptypes.BoxPType,\n ptypes.DynamicArrayType,\n ptypes.GlobalStateType,\n ptypes.LocalStateType,\n ptypes.StaticArrayType,\n ptypes.UFixedNxMType,\n ptypes.UintNType,\n ptypes.TuplePType,\n )\n\nconst isStateOrBoxType = (type: ptypes.PType): boolean =>\n instanceOfAny(type, ptypes.BoxMapPType, ptypes.BoxPType, ptypes.GlobalStateType, ptypes.LocalStateType)\n\nconst isArc4EncodedType = (type: ptypes.PType): boolean =>\n instanceOfAny(\n type,\n ptypes.ARC4StructType,\n ptypes.ARC4TupleType,\n ptypes.DynamicArrayType,\n ptypes.StaticArrayType,\n ptypes.UFixedNxMType,\n ptypes.UintNType,\n ) ||\n type === ptypes.arc4StringType ||\n type === ptypes.arc4BooleanType\n\nconst getGenericTypeInfo = (type: ptypes.PType): TypeInfo => {\n let typeName = type?.name ?? type?.toString() ?? 'unknown'\n let genericArgs: TypeInfo[] | Record<string, TypeInfo> = []\n\n if (instanceOfAny(type, ptypes.LocalStateType, ptypes.GlobalStateType, ptypes.BoxPType)) {\n genericArgs.push(getGenericTypeInfo(type.contentType))\n } else if (type instanceof ptypes.BoxMapPType) {\n genericArgs.push(getGenericTypeInfo(type.keyType))\n genericArgs.push(getGenericTypeInfo(type.contentType))\n } else if (instanceOfAny(type, ptypes.StaticArrayType, ptypes.DynamicArrayType)) {\n const entries = []\n entries.push(['elementType', getGenericTypeInfo(type.elementType)])\n if (instanceOfAny(type, ptypes.StaticArrayType)) {\n entries.push(['size', { name: type.arraySize.toString() }])\n }\n genericArgs = Object.fromEntries(entries)\n } else if (type instanceof ptypes.UFixedNxMType) {\n genericArgs = { n: { name: type.n.toString() }, m: { name: type.m.toString() } }\n } else if (type instanceof ptypes.UintNType) {\n genericArgs.push({ name: type.n.toString() })\n } else if (type instanceof ptypes.ARC4StructType) {\n typeName = `Struct<${type.name}>`\n genericArgs = Object.fromEntries(\n Object.entries(type.fields)\n .map(([key, value]) => [key, getGenericTypeInfo(value)])\n .filter((x) => !!x),\n )\n } else if (type instanceof ptypes.ARC4TupleType || type instanceof ptypes.TuplePType) {\n genericArgs.push(...type.items.map(getGenericTypeInfo))\n }\n\n const result: TypeInfo = { name: typeName }\n if (genericArgs && (genericArgs.length || Object.keys(genericArgs).length)) {\n result.genericArgs = genericArgs\n }\n return result\n}\n\nconst tryGetStubbedFunctionName = (node: ts.CallExpression, helper: VisitorHelper): string | undefined => {\n if (node.expression.kind !== ts.SyntaxKind.Identifier && !ts.isPropertyAccessExpression(node.expression)) return undefined\n const identityExpression = ts.isPropertyAccessExpression(node.expression)\n ? (node.expression as ts.PropertyAccessExpression).name\n : (node.expression as ts.Identifier)\n const functionSymbol = helper.tryGetSymbol(identityExpression)\n if (functionSymbol) {\n const sourceFileName = functionSymbol.valueDeclaration?.getSourceFile().fileName\n if (sourceFileName && !algotsModulePaths.some((s) => sourceFileName.includes(s))) return undefined\n }\n const functionName = functionSymbol?.getName() ?? identityExpression.text\n const stubbedFunctionNames = ['interpretAsArc4', 'decodeArc4', 'encodeArc4', 'emit']\n return stubbedFunctionNames.includes(functionName) ? functionName : undefined\n}\n\nconst isCallingDecodeArc4 = (functionName: string | undefined): boolean => ['decodeArc4', 'encodeArc4'].includes(functionName ?? '')\nconst isCallingEmit = (functionName: string | undefined): boolean => 'emit' === (functionName ?? '')\n","import { registerPTypes, typeRegistry } from '@algorandfoundation/puya-ts'\nimport type ts from 'typescript'\nimport type { DeliberateAny } from '../typescript-helpers'\nimport { SourceFileVisitor } from './visitors'\n\nexport interface TransformerConfig {\n includeExt: string[]\n testingPackageName: string\n}\nconst defaultTransformerConfig: TransformerConfig = {\n includeExt: ['.algo.ts', '.spec.ts'],\n testingPackageName: '@algorandfoundation/algorand-typescript-testing',\n}\n\nconst createProgramFactory = (config: TransformerConfig) => {\n function programFactory(program: ts.Program): ts.TransformerFactory<ts.SourceFile> {\n registerPTypes(typeRegistry)\n return (context) => {\n return (sourceFile) => {\n if (!config.includeExt.some((i) => sourceFile.fileName.endsWith(i))) return sourceFile\n return new SourceFileVisitor(context, sourceFile, program, config).result()\n }\n }\n }\n return programFactory\n}\n\n// Typescript.d.ts typings require a TransformerFactory however rollup plugin supports a program transformer\n// https://github.com/rollup/plugins/blob/master/packages/typescript/src/customTransformers.ts\nfunction programTransformer(config: Partial<TransformerConfig>) {\n return {\n type: 'program',\n factory: createProgramFactory({ ...defaultTransformerConfig, ...config }),\n }\n}\nprogramTransformer.type = 'program'\nprogramTransformer.factory = createProgramFactory(defaultTransformerConfig)\n\n/**\n * TypeScript transformer for Algorand TypeScript smart contracts and testing files\n * which is mainly responsilbe for swapping in stub implementations of op codes,\n * and capturing TypeScript type information for the Node.js runtime.\n *\n ** @type {ts.TransformerFactory<ts.SourceFile> & ((config: Partial<TransformerConfig>) => ts.TransformerFactory<ts.SourceFile>)}\n *\n * @param {Partial<TransformerConfig>} [config] Configuration options\n * @param {string[]} [config.includeExt=['.algo.ts', '.spec.ts']] File extensions to process\n * @param {string} [config.testingPackageName='@algorandfoundation/algorand-typescript-testing'] Package name for testing imports\n *\n * @example\n * // Use as factory function with custom config in vitest.config.mts\n * import typescript from '@rollup/plugin-typescript'\n * import { defineConfig } from 'vitest/config'\n * import { puyaTsTransformer } from '@algorandfoundation/algorand-typescript-testing/test-transformer'\n *\n * export default defineConfig({\n * esbuild: {},\n * plugins: [\n * typescript({\n * tsconfig: './tsconfig.json',\n * transformers: {\n * before: [puyaTsTransformer],\n * },\n * }),\n * ],\n * })\n */\nexport const puyaTsTransformer: ts.TransformerFactory<ts.SourceFile> &\n ((config: Partial<TransformerConfig>) => ts.TransformerFactory<ts.SourceFile>) = programTransformer as DeliberateAny\n"],"names":["factory"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/test-transformer/errors.ts","../../src/test-transformer/helpers.ts","../../src/test-transformer/node-factory.ts","../../src/test-transformer/supported-binary-op-string.ts","../../src/test-transformer/visitors.ts","../../src/test-transformer/index.ts"],"sourcesContent":["export class TransformerError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","import ts from 'typescript'\nimport { TransformerError } from './errors'\n\nexport const getPropertyNameAsString = (name: ts.PropertyName): ts.Identifier | ts.StringLiteral | ts.NoSubstitutionTemplateLiteral => {\n if (ts.isStringLiteralLike(name)) {\n return name\n }\n if (ts.isIdentifier(name)) {\n return ts.factory.createStringLiteral(name.text)\n }\n throw new TransformerError(`Node ${name.kind} cannot be converted to a static string`)\n}\n\nexport const trimGenericTypeName = (typeName: string) => typeName.replace(/<.*>/, '')\n","import type { ptypes } from '@algorandfoundation/puya-ts'\nimport ts from 'typescript'\nimport type { TypeInfo } from '../encoders'\nimport type { DeliberateAny } from '../typescript-helpers'\nimport { getPropertyNameAsString, trimGenericTypeName } from './helpers'\n\nconst factory = ts.factory\nexport const nodeFactory = {\n importHelpers(testingPackageName: string) {\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(false, undefined, factory.createNamespaceImport(factory.createIdentifier('runtimeHelpers'))),\n factory.createStringLiteral(`${testingPackageName}/runtime-helpers`),\n undefined,\n )\n },\n\n switchableValue(x: ts.Expression) {\n return factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('runtimeHelpers'), factory.createIdentifier('switchableValue')),\n undefined,\n [x],\n )\n },\n binaryOp(left: ts.Expression, right: ts.Expression, op: string) {\n return factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('runtimeHelpers'), factory.createIdentifier('binaryOp')),\n undefined,\n [left, right, factory.createStringLiteral(op)],\n )\n },\n augmentedAssignmentBinaryOp(left: ts.Expression, right: ts.Expression, op: string) {\n return factory.createAssignment(\n left,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('runtimeHelpers'), factory.createIdentifier('binaryOp')),\n undefined,\n [left, right, factory.createStringLiteral(op.replace('=', ''))],\n ),\n )\n },\n\n prefixUnaryOp(operand: ts.Expression, op: string) {\n return factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('runtimeHelpers'), factory.createIdentifier('unaryOp')),\n undefined,\n [operand, factory.createStringLiteral(op)],\n )\n },\n\n attachMetaData(\n classIdentifier: ts.Identifier,\n method: ts.MethodDeclaration,\n functionType: ptypes.FunctionPType,\n argTypes: string[],\n returnType: string,\n ) {\n const methodName = getPropertyNameAsString(method.name)\n const metadata = factory.createObjectLiteralExpression([\n factory.createPropertyAssignment('methodName', methodName),\n factory.createPropertyAssignment(\n 'argTypes',\n factory.createArrayLiteralExpression(argTypes.map((p) => factory.createStringLiteral(p))),\n ),\n factory.createPropertyAssignment('returnType', factory.createStringLiteral(returnType)),\n ])\n return factory.createExpressionStatement(\n factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('runtimeHelpers'), factory.createIdentifier('attachAbiMetadata')),\n undefined,\n [classIdentifier, methodName, metadata],\n ),\n )\n },\n\n captureGenericTypeInfo(x: ts.Expression, info: string) {\n return factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier('runtimeHelpers'),\n factory.createIdentifier('captureGenericTypeInfo'),\n ),\n undefined,\n [x, factory.createStringLiteral(info)],\n )\n },\n\n instantiateARC4EncodedType(node: ts.NewExpression, typeInfo?: TypeInfo) {\n const infoString = JSON.stringify(typeInfo)\n const classIdentifier = node.expression.getText().replace('arc4.', '')\n return factory.createNewExpression(\n factory.createIdentifier(`runtimeHelpers.${trimGenericTypeName(typeInfo?.name ?? classIdentifier)}Impl`),\n node.typeArguments,\n [infoString ? factory.createStringLiteral(infoString) : undefined, ...(node.arguments ?? [])].filter((arg) => !!arg),\n )\n },\n\n callStubbedFunction(functionName: string, node: ts.CallExpression, typeInfo?: TypeInfo) {\n const typeInfoArg = typeInfo ? factory.createStringLiteral(JSON.stringify(typeInfo)) : undefined\n const updatedPropertyAccessExpression = factory.createPropertyAccessExpression(\n factory.createIdentifier('runtimeHelpers'),\n `${functionName}Impl`,\n )\n\n return factory.createCallExpression(\n updatedPropertyAccessExpression,\n node.typeArguments,\n [typeInfoArg, ...(node.arguments ?? [])].filter((arg) => !!arg),\n )\n },\n} satisfies Record<string, (...args: DeliberateAny[]) => ts.Node>\n","import type { BinaryOperator, PrefixUnaryOperator } from 'typescript'\nimport ts from 'typescript'\n\nexport function supportedBinaryOpString(x: BinaryOperator): string | undefined {\n switch (x) {\n case ts.SyntaxKind.MinusToken:\n return '-'\n case ts.SyntaxKind.PlusToken:\n return '+'\n case ts.SyntaxKind.EqualsEqualsEqualsToken:\n return '==='\n case ts.SyntaxKind.ExclamationEqualsEqualsToken:\n return '!=='\n case ts.SyntaxKind.GreaterThanToken:\n return '>'\n case ts.SyntaxKind.GreaterThanEqualsToken:\n return '>='\n case ts.SyntaxKind.GreaterThanGreaterThanToken:\n return '>>'\n case ts.SyntaxKind.LessThanToken:\n return '<'\n case ts.SyntaxKind.LessThanEqualsToken:\n return '<='\n case ts.SyntaxKind.LessThanLessThanToken:\n return '<<'\n case ts.SyntaxKind.AsteriskToken:\n return '*'\n case ts.SyntaxKind.AsteriskAsteriskToken:\n return '**'\n case ts.SyntaxKind.SlashToken:\n return '/'\n case ts.SyntaxKind.PercentToken:\n return '%'\n case ts.SyntaxKind.AmpersandToken:\n return '&'\n case ts.SyntaxKind.BarToken:\n return '|'\n case ts.SyntaxKind.CaretToken:\n return '^'\n case ts.SyntaxKind.AmpersandAmpersandEqualsToken:\n case ts.SyntaxKind.AmpersandAmpersandToken:\n case ts.SyntaxKind.AmpersandEqualsToken:\n case ts.SyntaxKind.BarBarEqualsToken:\n case ts.SyntaxKind.BarBarToken:\n case ts.SyntaxKind.BarEqualsToken:\n case ts.SyntaxKind.CaretEqualsToken:\n case ts.SyntaxKind.CommaToken:\n case ts.SyntaxKind.EqualsEqualsToken:\n case ts.SyntaxKind.EqualsToken:\n case ts.SyntaxKind.ExclamationEqualsToken:\n case ts.SyntaxKind.InKeyword:\n case ts.SyntaxKind.InstanceOfKeyword:\n case ts.SyntaxKind.QuestionQuestionEqualsToken:\n case ts.SyntaxKind.QuestionQuestionToken:\n case ts.SyntaxKind.GreaterThanGreaterThanEqualsToken:\n case ts.SyntaxKind.LessThanLessThanEqualsToken:\n case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken:\n case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken:\n return undefined\n }\n}\n\nexport function supportedAugmentedAssignmentBinaryOpString(x: BinaryOperator): string | undefined {\n switch (x) {\n case ts.SyntaxKind.PlusEqualsToken:\n return '+='\n case ts.SyntaxKind.MinusEqualsToken:\n return '-='\n case ts.SyntaxKind.SlashEqualsToken:\n return '/='\n case ts.SyntaxKind.AsteriskEqualsToken:\n return '*='\n case ts.SyntaxKind.AsteriskAsteriskEqualsToken:\n return '**='\n case ts.SyntaxKind.PercentEqualsToken:\n return '%='\n default:\n return undefined\n }\n}\n\nexport function supportedPrefixUnaryOpString(x: PrefixUnaryOperator): string | undefined {\n switch (x) {\n case ts.SyntaxKind.TildeToken:\n return '~'\n default:\n return undefined\n }\n}\n","import { LoggingContext, ptypes, SourceLocation, TypeResolver } from '@algorandfoundation/puya-ts'\nimport path from 'path'\nimport ts from 'typescript'\nimport type { TypeInfo } from '../encoders'\nimport type { DeliberateAny } from '../typescript-helpers'\nimport { instanceOfAny } from '../typescript-helpers'\nimport type { TransformerConfig } from './index'\nimport { nodeFactory } from './node-factory'\nimport {\n supportedAugmentedAssignmentBinaryOpString,\n supportedBinaryOpString,\n supportedPrefixUnaryOpString,\n} from './supported-binary-op-string'\n\nconst { factory } = ts\n\nconst algotsModuleRegExp = new RegExp(/^(\"|')@algorandfoundation\\/algorand-typescript(\\/|\"|')/)\nconst algotsModuleSpecifier = '@algorandfoundation/algorand-typescript'\nconst testingInternalModuleSpecifier = (testingPackageName: string) => `${testingPackageName}/internal`\nconst algotsModulePaths = [\n algotsModuleSpecifier,\n '/puya-ts/packages/algo-ts/',\n `${path.sep}puya-ts${path.sep}packages${path.sep}algo-ts${path.sep}`,\n]\n\ntype VisitorHelper = {\n additionalStatements: ts.Statement[]\n resolveType(node: ts.Node): ptypes.PType\n resolveTypeParameters(node: ts.CallExpression): ptypes.PType[]\n sourceLocation(node: ts.Node): SourceLocation\n tryGetSymbol(node: ts.Node): ts.Symbol | undefined\n}\n\nexport class SourceFileVisitor {\n private helper: VisitorHelper\n\n constructor(\n private context: ts.TransformationContext,\n private sourceFile: ts.SourceFile,\n program: ts.Program,\n private config: TransformerConfig,\n ) {\n // ts-jest would pass a TsCompilerInstance as program parameter whereas rollup-plugin-typescript would pass a ts.Program\n const programInstance = (Object.hasOwn(program, 'program') ? (program as DeliberateAny).program : program) as ts.Program\n const typeChecker = programInstance.getTypeChecker()\n const loggingContext = LoggingContext.create()\n const typeResolver = new TypeResolver(typeChecker, programInstance.getCurrentDirectory())\n this.helper = {\n additionalStatements: [],\n resolveType(node: ts.Node): ptypes.PType {\n try {\n return loggingContext.run(() => typeResolver.resolve(node, this.sourceLocation(node)))\n } catch {\n return ptypes.anyPType\n }\n },\n resolveTypeParameters(node: ts.CallExpression) {\n return loggingContext.run(() => typeResolver.resolveTypeParameters(node, this.sourceLocation(node)))\n },\n tryGetSymbol(node: ts.Node): ts.Symbol | undefined {\n const s = typeChecker.getSymbolAtLocation(node)\n return s && s.flags & ts.SymbolFlags.Alias ? typeChecker.getAliasedSymbol(s) : s\n },\n sourceLocation(node: ts.Node): SourceLocation {\n return SourceLocation.fromNode(node, programInstance.getCurrentDirectory())\n },\n }\n }\n\n public result(): ts.SourceFile {\n const updatedSourceFile = ts.visitNode(this.sourceFile, this.visit) as ts.SourceFile\n return factory.updateSourceFile(updatedSourceFile, [\n nodeFactory.importHelpers(this.config.testingPackageName),\n ...updatedSourceFile.statements,\n ...this.helper.additionalStatements,\n ])\n }\n\n private visit = (node: ts.Node): ts.Node => {\n if (ts.isImportDeclaration(node)) {\n return new ImportDeclarationVisitor(this.context, this.helper, this.config, node).result()\n }\n if (ts.isFunctionLike(node)) {\n return new FunctionLikeDecVisitor(this.context, this.helper, node).result()\n }\n if (ts.isClassDeclaration(node)) {\n return new ClassVisitor(this.context, this.helper, node).result()\n }\n\n // capture generic type info for variable initialising outside class and function declarations\n // e.g. `const x = new UintN<32>(42)\n if (ts.isVariableDeclaration(node) && node.initializer) {\n return new VariableInitializerVisitor(this.context, this.helper, node).result()\n }\n\n return ts.visitEachChild(node, this.visit, this.context)\n }\n}\n\nclass ImportDeclarationVisitor {\n constructor(\n private context: ts.TransformationContext,\n private helper: VisitorHelper,\n private config: TransformerConfig,\n private declarationNode: ts.ImportDeclaration,\n ) {}\n\n public result(): ts.ImportDeclaration {\n const moduleSpecifier = this.declarationNode.moduleSpecifier.getText()\n if (this.declarationNode.importClause?.isTypeOnly || !algotsModuleRegExp.test(moduleSpecifier)) return this.declarationNode\n\n const namedBindings = this.declarationNode.importClause?.namedBindings\n const nonTypeNamedBindings =\n namedBindings && ts.isNamedImports(namedBindings) ? (namedBindings as ts.NamedImports).elements.filter((e) => !e.isTypeOnly) : []\n return factory.createImportDeclaration(\n this.declarationNode.modifiers,\n nonTypeNamedBindings.length\n ? factory.createImportClause(false, this.declarationNode.importClause?.name, factory.createNamedImports(nonTypeNamedBindings))\n : this.declarationNode.importClause,\n factory.createStringLiteral(\n moduleSpecifier\n .replace(algotsModuleSpecifier, testingInternalModuleSpecifier(this.config.testingPackageName))\n .replace(/^(\"|')/, '')\n .replace(/(\"|')$/, ''),\n ),\n this.declarationNode.attributes,\n )\n }\n}\n\nclass ExpressionVisitor {\n constructor(\n private context: ts.TransformationContext,\n private helper: VisitorHelper,\n private expressionNode: ts.Expression,\n private stubbedFunctionName?: string,\n ) {}\n\n public result(): ts.Expression {\n return this.visit(this.expressionNode) as ts.Expression\n }\n\n private visit = (node: ts.Node): ts.Node => {\n if (ts.isCallExpression(node) || ts.isNewExpression(node)) {\n let type = this.helper.resolveType(node)\n\n // `voted = LocalState<uint64>()` is resolved to FunctionPType with returnType LocalState<uint64>\n if (type instanceof ptypes.FunctionPType) type = type.returnType\n\n const isGeneric = isGenericType(type)\n const needsToCaptureTypeInfo = isGeneric && isStateOrBoxType(type)\n const isArc4Encoded = isArc4EncodedType(type)\n const info = isGeneric || isArc4Encoded ? getGenericTypeInfo(type) : undefined\n let updatedNode = node\n\n if (ts.isNewExpression(updatedNode)) {\n if (isArc4EncodedType(type)) {\n updatedNode = nodeFactory.instantiateARC4EncodedType(updatedNode, info)\n }\n }\n\n if (ts.isCallExpression(updatedNode)) {\n const stubbedFunctionName = this.stubbedFunctionName ?? tryGetStubbedFunctionName(updatedNode, this.helper)\n this.stubbedFunctionName = undefined\n let infoArg = info\n if (isCallingEmit(stubbedFunctionName)) {\n infoArg = this.helper.resolveTypeParameters(updatedNode).map(getGenericTypeInfo)[0]\n }\n if (isCallingDecodeArc4(stubbedFunctionName)) {\n const targetType = ptypes.ptypeToArc4EncodedType(type, this.helper.sourceLocation(node))\n const targetTypeInfo = getGenericTypeInfo(targetType)\n infoArg = targetTypeInfo\n }\n updatedNode = stubbedFunctionName ? nodeFactory.callStubbedFunction(stubbedFunctionName, updatedNode, infoArg) : updatedNode\n }\n return needsToCaptureTypeInfo\n ? nodeFactory.captureGenericTypeInfo(ts.visitEachChild(updatedNode, this.visit, this.context), JSON.stringify(info))\n : ts.visitEachChild(updatedNode, this.visit, this.context)\n }\n return ts.visitEachChild(node, this.visit, this.context)\n }\n}\nclass VariableInitializerVisitor {\n constructor(\n private context: ts.TransformationContext,\n private helper: VisitorHelper,\n private declarationNode: ts.VariableDeclaration,\n ) {}\n\n public result(): ts.VariableDeclaration {\n const initializerNode = this.declarationNode.initializer\n if (!initializerNode) return this.declarationNode\n\n const updatedInitializer = new ExpressionVisitor(this.context, this.helper, initializerNode).result()\n if (updatedInitializer === initializerNode) return this.declarationNode\n return factory.updateVariableDeclaration(\n this.declarationNode,\n this.declarationNode.name,\n this.declarationNode.exclamationToken,\n this.declarationNode.type,\n updatedInitializer,\n )\n }\n}\n\nclass FunctionOrMethodVisitor {\n constructor(\n protected context: ts.TransformationContext,\n protected helper: VisitorHelper,\n private isFunction?: boolean,\n ) {}\n protected visit = (node: ts.Node): ts.Node => {\n return ts.visitEachChild(this.updateNode(node), this.visit, this.context)\n }\n\n protected updateNode(node: ts.Node): ts.Node {\n if (ts.isSwitchStatement(node)) {\n return factory.updateSwitchStatement(node, nodeFactory.switchableValue(node.expression), node.caseBlock)\n }\n\n if (ts.isCaseClause(node)) {\n return factory.updateCaseClause(node, nodeFactory.switchableValue(node.expression), node.statements)\n }\n\n if (ts.isBinaryExpression(node)) {\n const opTokenText = supportedBinaryOpString(node.operatorToken.kind)\n if (opTokenText) {\n return nodeFactory.binaryOp(node.left, node.right, opTokenText)\n }\n const augmentedAssignmentOpTokenText = supportedAugmentedAssignmentBinaryOpString(node.operatorToken.kind)\n if (augmentedAssignmentOpTokenText) {\n return nodeFactory.augmentedAssignmentBinaryOp(node.left, node.right, augmentedAssignmentOpTokenText)\n }\n }\n if (ts.isPrefixUnaryExpression(node)) {\n const tokenText = supportedPrefixUnaryOpString(node.operator)\n if (tokenText) {\n return nodeFactory.prefixUnaryOp(node.operand, tokenText)\n }\n }\n\n /*\n * capture generic type info in test functions; e.g.\n * ```\n * it('should work', () => {\n * ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => {\n * const box = Box<uint64>({key: Bytes('test-key')})\n * })\n * })\n * ```\n */\n if (ts.isVariableDeclaration(node) && node.initializer) {\n return new VariableInitializerVisitor(this.context, this.helper, node).result()\n }\n\n /*\n * capture generic type info in test functions and swap arc4 types with implementation; e.g.\n * ```\n * it('should work', () => {\n * expect(() => new UintN<32>(2 ** 32)).toThrowError(`expected value <= ${2 ** 32 - 1}`)\n * expect(UintN.fromBytes<UintN<32>>('').bytes).toEqual(Bytes())\n * })\n * ```\n */\n if (ts.isNewExpression(node)) {\n return new ExpressionVisitor(this.context, this.helper, node).result()\n }\n if (ts.isCallExpression(node)) {\n const stubbedFunctionName = tryGetStubbedFunctionName(node, this.helper)\n if (stubbedFunctionName) {\n return new ExpressionVisitor(this.context, this.helper, node, stubbedFunctionName).result()\n }\n }\n\n return node\n }\n}\n\nclass FunctionLikeDecVisitor extends FunctionOrMethodVisitor {\n constructor(\n context: ts.TransformationContext,\n helper: VisitorHelper,\n private funcNode: ts.SignatureDeclaration,\n ) {\n super(context, helper, true)\n }\n\n public result(): ts.SignatureDeclaration {\n return ts.visitNode(this.funcNode, this.visit) as ts.SignatureDeclaration\n }\n}\nclass MethodDecVisitor extends FunctionOrMethodVisitor {\n constructor(\n context: ts.TransformationContext,\n helper: VisitorHelper,\n private methodNode: ts.MethodDeclaration,\n ) {\n super(context, helper)\n }\n\n public result(): ts.MethodDeclaration {\n return ts.visitNode(this.methodNode, this.visit) as ts.MethodDeclaration\n }\n}\n\nclass ClassVisitor {\n private isArc4: boolean\n constructor(\n private context: ts.TransformationContext,\n private helper: VisitorHelper,\n private classDec: ts.ClassDeclaration,\n ) {\n const classType = helper.resolveType(classDec)\n this.isArc4 = classType instanceof ptypes.ContractClassPType && classType.isARC4\n }\n\n public result(): ts.ClassDeclaration {\n return this.visit(this.classDec) as ts.ClassDeclaration\n }\n\n private visit = (node: ts.Node): ts.Node => {\n if (ts.isMethodDeclaration(node)) {\n if (this.classDec.name && this.isArc4) {\n const methodType = this.helper.resolveType(node)\n if (methodType instanceof ptypes.FunctionPType) {\n const argTypes = methodType.parameters.map((p) => JSON.stringify(getGenericTypeInfo(p[1])))\n const returnType = JSON.stringify(getGenericTypeInfo(methodType.returnType))\n this.helper.additionalStatements.push(nodeFactory.attachMetaData(this.classDec.name, node, methodType, argTypes, returnType))\n }\n }\n\n return new MethodDecVisitor(this.context, this.helper, node).result()\n }\n\n if (ts.isCallExpression(node)) {\n return new ExpressionVisitor(this.context, this.helper, node).result()\n }\n return ts.visitEachChild(node, this.visit, this.context)\n }\n}\n\nconst isGenericType = (type: ptypes.PType): boolean =>\n instanceOfAny(\n type,\n ptypes.ARC4StructType,\n ptypes.ARC4TupleType,\n ptypes.BoxMapPType,\n ptypes.BoxPType,\n ptypes.DynamicArrayType,\n ptypes.GlobalStateType,\n ptypes.LocalStateType,\n ptypes.StaticArrayType,\n ptypes.UFixedNxMType,\n ptypes.UintNType,\n ptypes.TuplePType,\n )\n\nconst isStateOrBoxType = (type: ptypes.PType): boolean =>\n instanceOfAny(type, ptypes.BoxMapPType, ptypes.BoxPType, ptypes.GlobalStateType, ptypes.LocalStateType)\n\nconst isArc4EncodedType = (type: ptypes.PType): boolean =>\n instanceOfAny(\n type,\n ptypes.ARC4StructType,\n ptypes.ARC4TupleType,\n ptypes.DynamicArrayType,\n ptypes.StaticArrayType,\n ptypes.UFixedNxMType,\n ptypes.UintNType,\n ) ||\n type === ptypes.arc4StringType ||\n type === ptypes.arc4BooleanType\n\nconst getGenericTypeInfo = (type: ptypes.PType): TypeInfo => {\n let typeName = type?.name ?? type?.toString() ?? 'unknown'\n let genericArgs: TypeInfo[] | Record<string, TypeInfo> = []\n\n if (instanceOfAny(type, ptypes.LocalStateType, ptypes.GlobalStateType, ptypes.BoxPType)) {\n genericArgs.push(getGenericTypeInfo(type.contentType))\n } else if (type instanceof ptypes.BoxMapPType) {\n genericArgs.push(getGenericTypeInfo(type.keyType))\n genericArgs.push(getGenericTypeInfo(type.contentType))\n } else if (instanceOfAny(type, ptypes.StaticArrayType, ptypes.DynamicArrayType)) {\n const entries = []\n entries.push(['elementType', getGenericTypeInfo(type.elementType)])\n if (instanceOfAny(type, ptypes.StaticArrayType)) {\n entries.push(['size', { name: type.arraySize.toString() }])\n }\n genericArgs = Object.fromEntries(entries)\n } else if (type instanceof ptypes.UFixedNxMType) {\n genericArgs = { n: { name: type.n.toString() }, m: { name: type.m.toString() } }\n } else if (type instanceof ptypes.UintNType) {\n genericArgs.push({ name: type.n.toString() })\n } else if (type instanceof ptypes.ARC4StructType) {\n typeName = `Struct<${type.name}>`\n genericArgs = Object.fromEntries(\n Object.entries(type.fields)\n .map(([key, value]) => [key, getGenericTypeInfo(value)])\n .filter((x) => !!x),\n )\n } else if (type instanceof ptypes.ARC4TupleType || type instanceof ptypes.TuplePType) {\n genericArgs.push(...type.items.map(getGenericTypeInfo))\n }\n\n const result: TypeInfo = { name: typeName }\n if (genericArgs && (genericArgs.length || Object.keys(genericArgs).length)) {\n result.genericArgs = genericArgs\n }\n return result\n}\n\nconst tryGetStubbedFunctionName = (node: ts.CallExpression, helper: VisitorHelper): string | undefined => {\n if (node.expression.kind !== ts.SyntaxKind.Identifier && !ts.isPropertyAccessExpression(node.expression)) return undefined\n const identityExpression = ts.isPropertyAccessExpression(node.expression)\n ? (node.expression as ts.PropertyAccessExpression).name\n : (node.expression as ts.Identifier)\n const functionSymbol = helper.tryGetSymbol(identityExpression)\n if (functionSymbol) {\n const sourceFileName = functionSymbol.valueDeclaration?.getSourceFile().fileName\n if (sourceFileName && !algotsModulePaths.some((s) => sourceFileName.includes(s))) return undefined\n }\n const functionName = functionSymbol?.getName() ?? identityExpression.text\n const stubbedFunctionNames = ['interpretAsArc4', 'decodeArc4', 'encodeArc4', 'emit']\n return stubbedFunctionNames.includes(functionName) ? functionName : undefined\n}\n\nconst isCallingDecodeArc4 = (functionName: string | undefined): boolean => ['decodeArc4', 'encodeArc4'].includes(functionName ?? '')\nconst isCallingEmit = (functionName: string | undefined): boolean => 'emit' === (functionName ?? '')\n","import { registerPTypes, typeRegistry } from '@algorandfoundation/puya-ts'\nimport type ts from 'typescript'\nimport type { DeliberateAny } from '../typescript-helpers'\nimport { SourceFileVisitor } from './visitors'\n\nexport interface TransformerConfig {\n includeExt: string[]\n testingPackageName: string\n}\nconst defaultTransformerConfig: TransformerConfig = {\n includeExt: ['.algo.ts', '.spec.ts'],\n testingPackageName: '@algorandfoundation/algorand-typescript-testing',\n}\n\nconst createProgramFactory = (config: TransformerConfig) => {\n function programFactory(program: ts.Program): ts.TransformerFactory<ts.SourceFile> {\n registerPTypes(typeRegistry)\n return (context) => {\n return (sourceFile) => {\n if (!config.includeExt.some((i) => sourceFile.fileName.endsWith(i))) return sourceFile\n return new SourceFileVisitor(context, sourceFile, program, config).result()\n }\n }\n }\n return programFactory\n}\n\n// Typescript.d.ts typings require a TransformerFactory however rollup plugin supports a program transformer\n// https://github.com/rollup/plugins/blob/master/packages/typescript/src/customTransformers.ts\nfunction programTransformer(config: Partial<TransformerConfig>) {\n return {\n type: 'program',\n factory: createProgramFactory({ ...defaultTransformerConfig, ...config }),\n }\n}\nprogramTransformer.type = 'program'\nprogramTransformer.factory = createProgramFactory(defaultTransformerConfig)\n\n/**\n * TypeScript transformer for Algorand TypeScript smart contracts and testing files\n * which is mainly responsilbe for swapping in stub implementations of op codes,\n * and capturing TypeScript type information for the Node.js runtime.\n *\n ** @type {ts.TransformerFactory<ts.SourceFile> & ((config: Partial<TransformerConfig>) => ts.TransformerFactory<ts.SourceFile>)}\n *\n * @param {Partial<TransformerConfig>} [config] Configuration options\n * @param {string[]} [config.includeExt=['.algo.ts', '.spec.ts']] File extensions to process\n * @param {string} [config.testingPackageName='@algorandfoundation/algorand-typescript-testing'] Package name for testing imports\n *\n * @example\n * // Use as factory function with custom config in vitest.config.mts\n * import typescript from '@rollup/plugin-typescript'\n * import { defineConfig } from 'vitest/config'\n * import { puyaTsTransformer } from '@algorandfoundation/algorand-typescript-testing/test-transformer'\n *\n * export default defineConfig({\n * esbuild: {},\n * plugins: [\n * typescript({\n * tsconfig: './tsconfig.json',\n * transformers: {\n * before: [puyaTsTransformer],\n * },\n * }),\n * ],\n * })\n */\nexport const puyaTsTransformer: ts.TransformerFactory<ts.SourceFile> &\n ((config: Partial<TransformerConfig>) => ts.TransformerFactory<ts.SourceFile>) = programTransformer as DeliberateAny\n\n// exporting values needed by ts-jest for a transformer to work\n// https://github.com/kulshekhar/ts-jest/tree/main/src/transformers\nexport const name = 'puyaTsTransformer'\nexport const version = '0.1.0'\nexport const factory = createProgramFactory(defaultTransformerConfig)\n"],"names":["factory"],"mappings":"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"}
|