Skip to content

feat(api): export precompile() and allow passing AstModule[] in #1549

feat(api): export precompile() and allow passing AstModule[] in

feat(api): export precompile() and allow passing AstModule[] in #1549

Workflow file for this run

name: Tact CI
env:
HUSKY: 0
on:
push:
branches: ["main"]
pull_request:
branches: ["main"]
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@v3
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
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: |
npm i -g pnpm
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