-
Notifications
You must be signed in to change notification settings - Fork 112
282 lines (238 loc) · 9.13 KB
/
tact.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
name: Tact CI
env:
HUSKY: 0
on:
pull_request:
branches: ["**"]
workflow_dispatch:
jobs:
test:
strategy:
fail-fast: false
matrix:
node-version: [22]
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js 18 for backwards compat tests
uses: actions/setup-node@v4
with:
node-version: 18
# without caching
- name: Backwards compat tests
run: |
# Temporarily ignore engines
yarn config set ignore-engines true
# Install dependencies, gen and build the compiler
yarn install
yarn clean
yarn gen
yarn build
# Test some specific things for backwards compatibility.
# It's important to restrain from using too much of Node.js 22+ features
# until it goes into maintenance LTS state and majority of users catches up
yarn jest -t 'isSubsetOf'
# Clean-up
yarn cleanall
yarn config delete ignore-engines
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: "yarn"
- name: Install dependencies
run: |
corepack enable
yarn install
- name: List installed packages
run: |
yarn list
- name: Print some environment info
run: |
yarn cross-env echo $NODE_ENV
- name: Build Tact compiler
run: |
yarn clean
yarn gen
yarn build
- name: Check there are no errors to be fixed in package.json and no uncommited changes
run: |
npm pkg fix && git diff --exit-code
- name: Test Tact compiler
run: |
yarn coverage
- name: Check there are no errors reported by ESLint
run: |
yarn lint
- name: Check formatting with Prettier
run: |
yarn fmt:check
- name: Check that tact.config.json adheres to the JSON schema
run: |
yarn lint:schema
- name: Spellcheck code base
run: |
yarn spell
- name: Check there are no unused dependencies
run: |
yarn knip
- name: Run ShellCheck
uses: ludeeus/action-shellcheck@master
if: runner.os != 'Windows'
with:
scandir: "./scripts"
- name: Show an example .pkg file on Windows
if: runner.os == 'Windows'
run: |
type examples\output\echo_Echo.pkg
- name: Link Tact yarn package
run: |
yarn link
- name: CLI Test | Check tact --version
if: runner.os != 'Windows'
run: |
tact --version
- name: CLI Test | Compare Tact version from CLI flag `--version` against package.json
if: runner.os != 'Windows'
run: |
if [ "$(tact --version | head -n1)" != "$(jq -r '.version' < package.json)" ];
then false
fi
- name: CLI Test | Check single-contract compilation
if: runner.os != 'Windows'
run: |
tact --check bin/test/success.tact
tact --func bin/test/success.tact
tact bin/test/success.tact
tact --with-decompilation bin/test/success.tact
- name: CLI Test | Check compilation via `--config`
if: runner.os != 'Windows'
run: |
# should output complete results
tact --config bin/test/success.config.json
# should output complete result + decompile binary code
tact --config bin/test/success.config.with.decompilation.json
# should only run the syntax and type checking
tact --config bin/test/success.config.json --check
- name: CLI Test | Check parsing of mutually exclusive flags - 1
if: runner.os != 'Windows'
run: |
! tact --func --check bin/test/success.config.json
- name: CLI Test | Check parsing of mutually exclusive flags - 2
if: runner.os != 'Windows'
run: |
! tact --with-decompilation --check bin/test/success.config.json
- name: CLI Test | Check parsing of mutually exclusive flags - 3
if: runner.os != 'Windows'
run: |
! tact --func --with-decompilation bin/test/success.config.json
- name: CLI Test | Check parsing of a non-existing CLI flag
if: runner.os != 'Windows'
run: |
! tact --nonexistentoption bin/test/success.config.json
- name: CLI Test | tact executable return non-zero exit code if compilation fails
if: runner.os != 'Windows'
run: |
! tact --config bin/test/fail.config.json
- name: CLI Test | Evaluate expression
if: runner.os != 'Windows'
run: |
tact -e '(1 + 2 * (pow(3,4) - 2) << 1 & 0x54 | 33 >> 1) * 2 + 2'
- name: Test compatibility with tact-template
run: |
git clone https://github.com/tact-lang/tact-template.git
cd tact-template
yarn install
yarn link @tact-lang/compiler
yarn build
yarn test
test-blueprint:
strategy:
fail-fast: false
matrix:
node-version: [22]
os: [ubuntu-latest, windows-latest, macos-latest]
package-manager: [npm, yarn, pnpm, bun]
# follow-up ifs are for ensuring clean state at all times
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: "yarn" # dependency caching only
- uses: oven-sh/setup-bun@v2
if: ${{ matrix.package-manager == 'bun' }}
- name: Prepare Tact compiler
run: |
# There are issues with corepack + it disallows the use of pnpm for linkage later on
# It's only useful for making sure that Tact compiler developers use the same version of Yarn
# https://github.com/nodejs/corepack/issues/112
# corepack enable
yarn install
yarn clean
yarn gen
yarn build
- name: (npm) Test creation of new Blueprint projects
if: ${{ matrix.package-manager == 'npm' }}
run: |
npm link
# for end-users 'npm create ton@latest' works fine even in PowerShell,
# but it fails on Windows in GitHub Actions because of weird -- expansion
npx create-ton@latest test-project --type tact-counter --contractName Counter
cd test-project
npm link @tact-lang/compiler
npm run build
npm run test
- name: (npm) Test Tact and Blueprint installs in existing projects
if: ${{ matrix.package-manager == 'npm' }}
run: |
# Out of the box, only npm experiences issues
# with lifecycle scripts of installed dependencies
mkdir npm-test && cd npm-test
npm init -y
npm i ../ # installing compiler relatively
npm i @ton/blueprint
- name: (yarn) Test creation of new Blueprint projects
if: ${{ matrix.package-manager == 'yarn' }}
run: |
yarn link
yarn create ton test-project --type tact-counter --contractName Counter
cd test-project
yarn link @tact-lang/compiler
yarn build
yarn test
- name: (pnpm) Test creation of new Blueprint projects
if: ${{ matrix.package-manager == 'pnpm' }}
run: |
# Installing the specific pnpm version to work around https://github.com/pnpm/pnpm/issues/5000
# and not fail suddenly when a release comes that fixes this
# NOTE: revisit and simplify this step if/when those bugs with pnpm are resolved
npm i -g [email protected]
# To help pnpm recognize the shell (they cannot do it themselves sometimes...)
${{ matrix.os != 'windows-latest' && 'export SHELL=bash' || 'echo windows_noop' }}
pnpm setup -f
# To source .bashrc on Linux:
${{ matrix.os == 'ubuntu-latest' && 'source ~/.bashrc' || 'echo noop' }}
# To expose stuff for pnpm directly on macOS (because otherwise the pre-installed Node.js version gets used):
${{ matrix.os == 'macos-latest' && 'export PNPM_HOME=~/Library/pnpm; export PATH=$PNPM_HOME:$PATH' || 'echo noop' }}
pnpm link -g
cd ..
pnpm create ton@latest test-project --type tact-counter --contractName Counter
cd test-project
pnpm link -g @tact-lang/compiler
pnpm build
pnpm test
- name: (bun) Test creation of new Blueprint projects
if: ${{ matrix.package-manager == 'bun' }}
run: |
bun link
bun create ton@latest test-project --type tact-counter --contractName Counter
cd test-project
bun link @tact-lang/compiler
bun run build # without 'run' Bun will use its own bundler
bun run test # without 'run' Bun will use its own test runner