Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JSON Schema for Tact configuration #194

Merged
merged 22 commits into from
Mar 27, 2024
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .github/workflows/tact.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
matrix:
node-version: [18.x]
os: [ubuntu-latest, windows-latest, macos-latest]
novusnota marked this conversation as resolved.
Show resolved Hide resolved

runs-on: ${{ matrix.os }}

steps:
Expand All @@ -36,10 +36,11 @@ jobs:
yarn gen
yarn build
yarn coverage

- name: Check there are no errors reported by ESLint
run: |
yarn lint
yarn test:format
novusnota marked this conversation as resolved.
Show resolved Hide resolved

- name: Compare Tact version from CLI flag `--version` against package.json
if: runner.os != 'Windows'
Expand All @@ -61,7 +62,7 @@ jobs:
yarn build
yarn test
yarn tact --version

- name: Test compatibility with Blueprint
run: |
yarn create ton -- test-project --type tact-counter --contractName Counter
Expand Down
60 changes: 60 additions & 0 deletions grammar/configSchema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"$schema": "http://json-schema.org/schema#",
"$id": "http://raw.githubusercontent.com/tact-lang/tact/main/grammar/configSchema.json",
"title": "Tact configuration schema",
"description": "JSON Schema for tact.config.json",
"type": "object",
"required": ["projects"],
"properties": {
"projects": {
"type": "array",
"description": "List of Tact projects with respective compilation options. Each .tact file represents its own Tact project.",
"items": {
"type": "object",
"required": ["name", "path", "output"],
"properties": {
"name": {
"type": "string",
"description": "Name of the project. All generated files are prefixed with it."
},
"path": {
"type": "string",
"description": "Path to the project's Tact file. You can only specify one Tact file per project."
},
"output": {
"type": "string",
"description": "Path to the directory where all generated files will be placed."
},
"options": {
"type": "object",
"description": "Compilation options for the project.",
"properties": {
"debug": {
"type": "boolean",
"description": "False by default. If set to true, enables debug output of a contract and allows usage of `dump()` function, which is useful for debugging purposes. With this option enabled, the contract will report that it was compiled in debug mode using the supported_interfaces method.\n\nRead more on debugging Tact code: https://docs.tact-lang.org/book/debug."
},
"masterchain": {
"type": "boolean",
"description": "False by default. If set to true, enables masterchain support.\n\nRead more about masterchain: https://docs.tact-lang.org/book/masterchain."
},
"external": {
"type": "boolean",
"description": "False by default. If set to true, enables support of external message receivers.\n\nRead more about external message receivers: https://docs.tact-lang.org/book/external."
},
"experimental": {
"type": "object",
"description": "Experimental options that might be removed in the future. Use with caution!",
"properties": {
"inline": {
"type": "boolean",
"description": "False by default. If set to true, enables inlining of all functions in contracts. This can reduce gas usage at the cost of bigger contracts."
}
}
}
}
}
}
}
}
}
}
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
"gen": "yarn gen:grammar && yarn gen:pack && yarn gen:compiler",
"clean": "rm -fr dist",
"build": "tsc && cp ./src/grammar/grammar.ohm* ./dist/grammar/ && cp ./src/func/funcfiftlib.* ./dist/func",
"test": "jest",
"test": "jest --testMatch=\"**/*.spec.ts\"",
"test:format": "jest --testMatch=\"**/*.format-spec.ts\"",
"coverage": "cross-env COVERAGE=true jest",
"release": "yarn clean && yarn build && yarn coverage && yarn release-it --npm.yarn1",
"lint": "yarn eslint ."
Expand Down Expand Up @@ -59,6 +60,7 @@
"@types/qs": "^6.9.7",
"@typescript-eslint/eslint-plugin": "^7.0.2",
"@typescript-eslint/parser": "^7.0.2",
"ajv": "^8.12.0",
"cross-env": "^7.0.3",
"eslint": "^8.56.0",
"glob": "^8.1.0",
Expand Down
3 changes: 2 additions & 1 deletion src/config/parseConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const projectSchema = z.object({
}).strict();

const configSchema = z.object({
$schema: z.string().optional(),
projects: z.array(projectSchema)
}).strict();

Expand All @@ -31,4 +32,4 @@ export function parseConfig(src: string) {

export function verifyConfig(config: Config) {
return configSchema.parse(config);
}
}
novusnota marked this conversation as resolved.
Show resolved Hide resolved
File renamed without changes.
31 changes: 31 additions & 0 deletions src/test/schema.format-spec.ts
novusnota marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import fs from 'fs';
import path from 'path';
import Ajv from 'ajv';
import { __DANGER_resetNodeId } from '../grammar/ast';

describe('configuration schema', () => {
const ajv = new Ajv();
const schema = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'grammar', 'configSchema.json'), 'utf8'));

beforeEach(() => {
__DANGER_resetNodeId();
});

it('should validate Tact config', () => {
const tactConfig = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'tact.config.json'), 'utf8'));

const validate = ajv.compile(schema);
validate(tactConfig);

expect(validate.errors).toBeNull();
});

it('should validate test config', () => {
const testConfig = JSON.parse(fs.readFileSync(path.join(__dirname, 'test-tact.config.json'), 'utf8'));

const validate = ajv.compile(schema);
validate(testConfig);

expect(validate.errors).toBeNull();
});
});
21 changes: 11 additions & 10 deletions src/test/test-tact.config.json
anton-trunov marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
{
"projects": [
{
"name": "implicit-init-2",
"path": "./features/implicit-init-2.tact",
"output": "./features/output",
"options": {
"debug": true
}
"$schema": "http://raw.githubusercontent.com/tact-lang/tact/main/grammar/configSchema.json",
"projects": [
{
"name": "implicit-init-2",
"path": "./features/implicit-init-2.tact",
"output": "./features/output",
"options": {
"debug": true
}
]
}
}
]
}
3 changes: 2 additions & 1 deletion tact.config.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"$schema": "http://raw.githubusercontent.com/tact-lang/tact/main/grammar/configSchema.json",
"projects": [
{
"name": "echo",
Expand Down Expand Up @@ -269,4 +270,4 @@
}
}
]
}
}
20 changes: 20 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1323,6 +1323,16 @@ ajv@^6.12.4:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"

ajv@^8.12.0:
version "8.12.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1"
integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
dependencies:
fast-deep-equal "^3.1.1"
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
uri-js "^4.2.2"

ansi-align@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
Expand Down Expand Up @@ -4139,6 +4149,11 @@ json-schema-traverse@^0.4.1:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==

json-schema-traverse@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==

json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
Expand Down Expand Up @@ -5095,6 +5110,11 @@ require-directory@^2.1.1:
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==

require-from-string@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==

resolve-alpn@^1.2.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
Expand Down