skittles 1.2.6 → 1.3.0
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 +4 -4
- package/dist/commands/clean.d.ts.map +1 -1
- package/dist/commands/clean.js +4 -1
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/compile.d.ts +1 -0
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +51 -1
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +5 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/test.d.ts +7 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +60 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/compiler/analysis.d.ts +7 -0
- package/dist/compiler/analysis.d.ts.map +1 -0
- package/dist/compiler/analysis.js +234 -0
- package/dist/compiler/analysis.js.map +1 -0
- package/dist/compiler/codegen.d.ts +10 -1
- package/dist/compiler/codegen.d.ts.map +1 -1
- package/dist/compiler/codegen.js +389 -22
- package/dist/compiler/codegen.js.map +1 -1
- package/dist/compiler/compiler.d.ts +2 -1
- package/dist/compiler/compiler.d.ts.map +1 -1
- package/dist/compiler/compiler.js +94 -9
- package/dist/compiler/compiler.js.map +1 -1
- package/dist/compiler/parser.d.ts +7 -1
- package/dist/compiler/parser.d.ts.map +1 -1
- package/dist/compiler/parser.js +731 -47
- package/dist/compiler/parser.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +5 -1
- package/dist/config/config.js.map +1 -1
- package/dist/exports.d.ts +13 -2
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js.map +1 -1
- package/dist/index.js +19 -4
- package/dist/index.js.map +1 -1
- package/dist/testing.d.ts +93 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +143 -0
- package/dist/testing.js.map +1 -0
- package/dist/types/index.d.ts +51 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -4,15 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
# Skittles
|
|
6
6
|
|
|
7
|
-
Write
|
|
7
|
+
Write smart contracts in TypeScript.
|
|
8
8
|
|
|
9
|
-
Skittles
|
|
9
|
+
Skittles lets you write blockchain smart contracts using TypeScript — the language you already know. No new syntax to learn. Full IDE support with autocomplete, type checking, and go-to-definition. Under the hood, Skittles compiles to Solidity for compatibility with every EVM tool and blockchain.
|
|
10
10
|
|
|
11
11
|
Website: [skittles.dev](https://skittles.dev/)
|
|
12
12
|
|
|
13
13
|
## Quick Start
|
|
14
14
|
|
|
15
|
-
Requires Node.js
|
|
15
|
+
Requires Node.js 22+.
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
18
|
npx skittles@latest init
|
|
@@ -55,7 +55,7 @@ export class Token {
|
|
|
55
55
|
}
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
This
|
|
58
|
+
This creates a simple token contract. Users can transfer tokens to each other, with balance checks and a Transfer event that logs activity on the blockchain.
|
|
59
59
|
|
|
60
60
|
## Contributing
|
|
61
61
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE"}
|
package/dist/commands/clean.js
CHANGED
|
@@ -5,8 +5,11 @@ import { loadConfig } from "../config/config.js";
|
|
|
5
5
|
export async function cleanCommand(projectRoot) {
|
|
6
6
|
const config = await loadConfig(projectRoot);
|
|
7
7
|
const outputDir = path.join(projectRoot, config.outputDir);
|
|
8
|
-
|
|
8
|
+
const cacheDir = path.join(projectRoot, config.cacheDir);
|
|
9
|
+
logInfo(`Removing output directory: ${config.outputDir}/`);
|
|
9
10
|
removeDirectory(outputDir);
|
|
11
|
+
logInfo(`Removing cache directory: ${config.cacheDir}/`);
|
|
12
|
+
removeDirectory(cacheDir);
|
|
10
13
|
logSuccess("Build artifacts cleaned");
|
|
11
14
|
}
|
|
12
15
|
//# sourceMappingURL=clean.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3D,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,CAAC,8BAA8B,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;IAC3D,eAAe,CAAC,SAAS,CAAC,CAAC;IAC3B,OAAO,CAAC,6BAA6B,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzD,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1B,UAAU,CAAC,yBAAyB,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAOA,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvE;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CA6B3E"}
|
package/dist/commands/compile.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
1
3
|
import ora from "ora";
|
|
2
4
|
import { loadConfig } from "../config/config.js";
|
|
3
5
|
import { compile } from "../compiler/compiler.js";
|
|
4
|
-
import { logSuccess, logError } from "../utils/console.js";
|
|
6
|
+
import { logSuccess, logError, logInfo } from "../utils/console.js";
|
|
5
7
|
export async function compileCommand(projectRoot) {
|
|
6
8
|
const spinner = ora({ text: "Loading configuration...", color: "cyan" }).start();
|
|
7
9
|
try {
|
|
@@ -27,4 +29,52 @@ export async function compileCommand(projectRoot) {
|
|
|
27
29
|
process.exit(1);
|
|
28
30
|
}
|
|
29
31
|
}
|
|
32
|
+
export async function watchCompile(projectRoot) {
|
|
33
|
+
const config = await loadConfig(projectRoot);
|
|
34
|
+
const contractsDir = path.join(projectRoot, config.contractsDir);
|
|
35
|
+
// Run initial compilation
|
|
36
|
+
await runCompilation(projectRoot);
|
|
37
|
+
logInfo(`Watching for file changes in ${config.contractsDir}/...`);
|
|
38
|
+
let debounceTimer = null;
|
|
39
|
+
if (!fs.existsSync(contractsDir)) {
|
|
40
|
+
fs.mkdirSync(contractsDir, { recursive: true });
|
|
41
|
+
}
|
|
42
|
+
const watcher = fs.watch(contractsDir, { recursive: true }, (_event, filename) => {
|
|
43
|
+
if (!filename || !filename.endsWith(".ts"))
|
|
44
|
+
return;
|
|
45
|
+
if (debounceTimer)
|
|
46
|
+
clearTimeout(debounceTimer);
|
|
47
|
+
debounceTimer = setTimeout(() => {
|
|
48
|
+
logInfo(`File changed: ${filename}`);
|
|
49
|
+
runCompilation(projectRoot);
|
|
50
|
+
}, 200);
|
|
51
|
+
});
|
|
52
|
+
return () => {
|
|
53
|
+
if (debounceTimer)
|
|
54
|
+
clearTimeout(debounceTimer);
|
|
55
|
+
watcher.close();
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function runCompilation(projectRoot) {
|
|
59
|
+
const spinner = ora({ text: "Compiling contracts...", color: "cyan" }).start();
|
|
60
|
+
try {
|
|
61
|
+
const config = await loadConfig(projectRoot);
|
|
62
|
+
const result = await compile(projectRoot, config);
|
|
63
|
+
if (result.success) {
|
|
64
|
+
spinner.succeed("Compilation complete");
|
|
65
|
+
logSuccess(`${result.artifacts.length} contract(s) compiled successfully`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
spinner.fail("Compilation failed");
|
|
69
|
+
for (const error of result.errors) {
|
|
70
|
+
logError(error);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
spinner.fail("Compilation failed");
|
|
76
|
+
const message = err instanceof Error ? err.message : "Unknown error occurred";
|
|
77
|
+
logError(message);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
30
80
|
//# sourceMappingURL=compile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAEjF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,GAAG,wBAAwB,CAAC;QAExC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAElD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YACxC,UAAU,CACR,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,oCAAoC,CAC/D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACnC,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAChE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAEjE,0BAA0B;IAC1B,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IAElC,OAAO,CAAC,gCAAgC,MAAM,CAAC,YAAY,MAAM,CAAC,CAAC;IAEnE,IAAI,aAAa,GAAyC,IAAI,CAAC;IAE/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;QAC/E,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO;QAEnD,IAAI,aAAa;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QAC/C,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;YACrC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC9B,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE;QACV,IAAI,aAAa;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,WAAmB;IAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAE/E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAElD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YACxC,UAAU,CACR,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,oCAAoC,CAC/D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACnC,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAChE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAqMA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CA+Kf"}
|
package/dist/commands/init.js
CHANGED
|
@@ -5,8 +5,9 @@ import { writeFile, ensureDirectory } from "../utils/file.js";
|
|
|
5
5
|
import { logSuccess, logError, logInfo, logWarning } from "../utils/console.js";
|
|
6
6
|
const CONFIG_TEMPLATE = JSON.stringify({
|
|
7
7
|
typeCheck: true,
|
|
8
|
+
consoleLog: true,
|
|
8
9
|
contractsDir: "contracts",
|
|
9
|
-
outputDir: "
|
|
10
|
+
outputDir: "artifacts",
|
|
10
11
|
}, null, 2);
|
|
11
12
|
const TSCONFIG_TEMPLATE = JSON.stringify({
|
|
12
13
|
compilerOptions: {
|
|
@@ -25,7 +26,7 @@ const TSCONFIG_TEMPLATE = JSON.stringify({
|
|
|
25
26
|
rootDir: ".",
|
|
26
27
|
},
|
|
27
28
|
include: ["contracts/**/*", "test/**/*", "types/**/*"],
|
|
28
|
-
exclude: ["node_modules", "
|
|
29
|
+
exclude: ["node_modules", "artifacts", "cache", "dist"],
|
|
29
30
|
}, null, 2);
|
|
30
31
|
const HARDHAT_CONFIG_TEMPLATE = `import { defineConfig } from "hardhat/config";
|
|
31
32
|
import hardhatEthers from "@nomicfoundation/hardhat-ethers";
|
|
@@ -43,7 +44,7 @@ export default defineConfig({
|
|
|
43
44
|
hardhatNetworkHelpers,
|
|
44
45
|
],
|
|
45
46
|
paths: {
|
|
46
|
-
sources: "./
|
|
47
|
+
sources: "./artifacts/solidity",
|
|
47
48
|
tests: "./test",
|
|
48
49
|
},
|
|
49
50
|
solidity: {
|
|
@@ -79,6 +80,7 @@ export class Token {
|
|
|
79
80
|
|
|
80
81
|
public transfer(to: address, amount: number): boolean {
|
|
81
82
|
const sender: address = msg.sender;
|
|
83
|
+
console.log("transfer", sender, to, amount);
|
|
82
84
|
if (this.balances[sender] < amount) {
|
|
83
85
|
throw new Error("Insufficient balance");
|
|
84
86
|
}
|
|
@@ -300,7 +302,6 @@ export async function initCommand(projectRoot, options = {}) {
|
|
|
300
302
|
// Update .gitignore
|
|
301
303
|
const gitignorePath = path.join(projectRoot, ".gitignore");
|
|
302
304
|
const gitignoreEntries = [
|
|
303
|
-
"build/",
|
|
304
305
|
"dist/",
|
|
305
306
|
"types/",
|
|
306
307
|
"node_modules/",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEhF,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CACpC;IACE,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { spawn } from "child_process";
|
|
4
|
+
import { loadConfig } from "../config/config.js";
|
|
5
|
+
import { compile } from "../compiler/compiler.js";
|
|
6
|
+
import { logSuccess, logError, logInfo } from "../utils/console.js";
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the path to a locally installed binary in node_modules/.bin.
|
|
9
|
+
* Returns the binary name as a fallback if not found locally.
|
|
10
|
+
*/
|
|
11
|
+
function resolveLocalBin(projectRoot, bin) {
|
|
12
|
+
const localPath = path.join(projectRoot, "node_modules", ".bin", bin);
|
|
13
|
+
if (fs.existsSync(localPath)) {
|
|
14
|
+
return localPath;
|
|
15
|
+
}
|
|
16
|
+
return bin;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The `skittles test` command.
|
|
20
|
+
* 1. Compiles all contracts (same as `skittles compile`)
|
|
21
|
+
* 2. Runs hardhat test
|
|
22
|
+
*/
|
|
23
|
+
export async function testCommand(projectRoot, watch) {
|
|
24
|
+
// Step 1: Compile contracts
|
|
25
|
+
logInfo("Compiling contracts before running tests...");
|
|
26
|
+
try {
|
|
27
|
+
const config = await loadConfig(projectRoot);
|
|
28
|
+
const result = await compile(projectRoot, config);
|
|
29
|
+
if (!result.success) {
|
|
30
|
+
for (const error of result.errors) {
|
|
31
|
+
logError(error);
|
|
32
|
+
}
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
logSuccess(`${result.artifacts.length} contract(s) compiled successfully`);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const message = err instanceof Error ? err.message : "Unknown error occurred";
|
|
39
|
+
logError(`Compilation failed: ${message}`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
// Step 2: Run hardhat test using the locally installed binary
|
|
43
|
+
logInfo(watch ? "Starting tests in watch mode..." : "Running tests...");
|
|
44
|
+
const hardhatBin = resolveLocalBin(projectRoot, "hardhat");
|
|
45
|
+
const args = watch ? ["test", "--watch"] : ["test"];
|
|
46
|
+
const child = spawn(hardhatBin, args, {
|
|
47
|
+
cwd: projectRoot,
|
|
48
|
+
stdio: "inherit",
|
|
49
|
+
shell: true,
|
|
50
|
+
});
|
|
51
|
+
child.on("close", (code) => {
|
|
52
|
+
process.exit(code ?? 0);
|
|
53
|
+
});
|
|
54
|
+
child.on("error", (err) => {
|
|
55
|
+
logError(`Failed to start hardhat: ${err.message}`);
|
|
56
|
+
logInfo("Make sure hardhat is installed: npm install --save-dev hardhat");
|
|
57
|
+
process.exit(1);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEpE;;;GAGG;AACH,SAAS,eAAe,CAAC,WAAmB,EAAE,GAAW;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACtE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAmB,EACnB,KAAc;IAEd,4BAA4B;IAC5B,OAAO,CAAC,6CAA6C,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,UAAU,CACR,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,oCAAoC,CAC/D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAChE,QAAQ,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8DAA8D;IAC9D,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAExE,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;QACpC,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,QAAQ,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,OAAO,CACL,gEAAgE,CACjE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SkittlesFunction, SkittlesConstructor } from "../types/index.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Analyze a function body for unreachable code and unused local variables.
|
|
4
|
+
* Returns an array of warning strings.
|
|
5
|
+
*/
|
|
6
|
+
export declare function analyzeFunction(fn: SkittlesFunction | SkittlesConstructor, contractName: string): string[];
|
|
7
|
+
//# sourceMappingURL=analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/compiler/analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEtG;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,gBAAgB,GAAG,mBAAmB,EAC1C,YAAY,EAAE,MAAM,GACnB,MAAM,EAAE,CAQV"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analyze a function body for unreachable code and unused local variables.
|
|
3
|
+
* Returns an array of warning strings.
|
|
4
|
+
*/
|
|
5
|
+
export function analyzeFunction(fn, contractName) {
|
|
6
|
+
const warnings = [];
|
|
7
|
+
const name = "name" in fn ? fn.name : "constructor";
|
|
8
|
+
warnings.push(...checkUnreachableCode(fn.body, contractName, name));
|
|
9
|
+
warnings.push(...checkUnusedVariables(fn.body, fn.parameters.map((p) => p.name), contractName, name));
|
|
10
|
+
return warnings;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Check for unreachable code after return, throw (revert), break, or continue statements.
|
|
14
|
+
*/
|
|
15
|
+
function checkUnreachableCode(statements, contractName, functionName) {
|
|
16
|
+
const warnings = [];
|
|
17
|
+
function checkBlock(stmts) {
|
|
18
|
+
for (let i = 0; i < stmts.length; i++) {
|
|
19
|
+
const stmt = stmts[i];
|
|
20
|
+
if (isTerminating(stmt) && i < stmts.length - 1) {
|
|
21
|
+
warnings.push(`${contractName}.${functionName}: Unreachable code after '${stmt.kind === "revert" ? "throw" : stmt.kind}' statement`);
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
// Recurse into nested blocks
|
|
25
|
+
walkNestedBlocks(stmt, checkBlock);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
checkBlock(statements);
|
|
29
|
+
return warnings;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Returns true if a statement always terminates execution flow (return, revert, break, continue).
|
|
33
|
+
*/
|
|
34
|
+
function isTerminating(stmt) {
|
|
35
|
+
return (stmt.kind === "return" ||
|
|
36
|
+
stmt.kind === "revert" ||
|
|
37
|
+
stmt.kind === "break" ||
|
|
38
|
+
stmt.kind === "continue");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Recurse into nested blocks of a statement.
|
|
42
|
+
*/
|
|
43
|
+
function walkNestedBlocks(stmt, visitor) {
|
|
44
|
+
switch (stmt.kind) {
|
|
45
|
+
case "if":
|
|
46
|
+
visitor(stmt.thenBody);
|
|
47
|
+
if (stmt.elseBody)
|
|
48
|
+
visitor(stmt.elseBody);
|
|
49
|
+
break;
|
|
50
|
+
case "for":
|
|
51
|
+
visitor(stmt.body);
|
|
52
|
+
break;
|
|
53
|
+
case "while":
|
|
54
|
+
visitor(stmt.body);
|
|
55
|
+
break;
|
|
56
|
+
case "do-while":
|
|
57
|
+
visitor(stmt.body);
|
|
58
|
+
break;
|
|
59
|
+
case "switch":
|
|
60
|
+
for (const c of stmt.cases) {
|
|
61
|
+
visitor(c.body);
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
case "try-catch":
|
|
65
|
+
visitor(stmt.successBody);
|
|
66
|
+
visitor(stmt.catchBody);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check for unused local variables in a function body.
|
|
72
|
+
* A variable is considered unused if it is declared but never referenced
|
|
73
|
+
* in any expression (including in nested blocks).
|
|
74
|
+
*/
|
|
75
|
+
function checkUnusedVariables(statements, parameterNames, contractName, functionName) {
|
|
76
|
+
const warnings = [];
|
|
77
|
+
const declared = new Set();
|
|
78
|
+
const used = new Set();
|
|
79
|
+
// Collect all variable declarations and identifier usages
|
|
80
|
+
walkAllStatements(statements, declared, used);
|
|
81
|
+
// Only warn about declared locals that are never used in any expression
|
|
82
|
+
// Skip parameters – they may be required by an interface signature
|
|
83
|
+
for (const name of declared) {
|
|
84
|
+
if (!used.has(name) && !parameterNames.includes(name)) {
|
|
85
|
+
warnings.push(`${contractName}.${functionName}: Unused variable '${name}'`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return warnings;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Walk all statements recursively, collecting declared variable names
|
|
92
|
+
* and used identifier names.
|
|
93
|
+
*/
|
|
94
|
+
function walkAllStatements(stmts, declared, used) {
|
|
95
|
+
for (const stmt of stmts) {
|
|
96
|
+
switch (stmt.kind) {
|
|
97
|
+
case "variable-declaration":
|
|
98
|
+
declared.add(stmt.name);
|
|
99
|
+
if (stmt.initializer)
|
|
100
|
+
collectUsedIdentifiers(stmt.initializer, used);
|
|
101
|
+
break;
|
|
102
|
+
case "return":
|
|
103
|
+
if (stmt.value)
|
|
104
|
+
collectUsedIdentifiers(stmt.value, used);
|
|
105
|
+
break;
|
|
106
|
+
case "expression":
|
|
107
|
+
collectUsedIdentifiers(stmt.expression, used);
|
|
108
|
+
break;
|
|
109
|
+
case "if":
|
|
110
|
+
collectUsedIdentifiers(stmt.condition, used);
|
|
111
|
+
walkAllStatements(stmt.thenBody, declared, used);
|
|
112
|
+
if (stmt.elseBody)
|
|
113
|
+
walkAllStatements(stmt.elseBody, declared, used);
|
|
114
|
+
break;
|
|
115
|
+
case "for":
|
|
116
|
+
if (stmt.initializer) {
|
|
117
|
+
if (stmt.initializer.kind === "variable-declaration") {
|
|
118
|
+
declared.add(stmt.initializer.name);
|
|
119
|
+
if (stmt.initializer.initializer)
|
|
120
|
+
collectUsedIdentifiers(stmt.initializer.initializer, used);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
collectUsedIdentifiers(stmt.initializer.expression, used);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (stmt.condition)
|
|
127
|
+
collectUsedIdentifiers(stmt.condition, used);
|
|
128
|
+
if (stmt.incrementor)
|
|
129
|
+
collectUsedIdentifiers(stmt.incrementor, used);
|
|
130
|
+
walkAllStatements(stmt.body, declared, used);
|
|
131
|
+
break;
|
|
132
|
+
case "while":
|
|
133
|
+
collectUsedIdentifiers(stmt.condition, used);
|
|
134
|
+
walkAllStatements(stmt.body, declared, used);
|
|
135
|
+
break;
|
|
136
|
+
case "do-while":
|
|
137
|
+
collectUsedIdentifiers(stmt.condition, used);
|
|
138
|
+
walkAllStatements(stmt.body, declared, used);
|
|
139
|
+
break;
|
|
140
|
+
case "revert":
|
|
141
|
+
if (stmt.message)
|
|
142
|
+
collectUsedIdentifiers(stmt.message, used);
|
|
143
|
+
if (stmt.customErrorArgs) {
|
|
144
|
+
for (const arg of stmt.customErrorArgs) {
|
|
145
|
+
collectUsedIdentifiers(arg, used);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
break;
|
|
149
|
+
case "emit":
|
|
150
|
+
for (const arg of stmt.args) {
|
|
151
|
+
collectUsedIdentifiers(arg, used);
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
case "switch":
|
|
155
|
+
collectUsedIdentifiers(stmt.discriminant, used);
|
|
156
|
+
for (const c of stmt.cases) {
|
|
157
|
+
if (c.value)
|
|
158
|
+
collectUsedIdentifiers(c.value, used);
|
|
159
|
+
walkAllStatements(c.body, declared, used);
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
case "delete":
|
|
163
|
+
collectUsedIdentifiers(stmt.target, used);
|
|
164
|
+
break;
|
|
165
|
+
case "try-catch":
|
|
166
|
+
collectUsedIdentifiers(stmt.call, used);
|
|
167
|
+
if (stmt.returnVarName)
|
|
168
|
+
declared.add(stmt.returnVarName);
|
|
169
|
+
walkAllStatements(stmt.successBody, declared, used);
|
|
170
|
+
walkAllStatements(stmt.catchBody, declared, used);
|
|
171
|
+
break;
|
|
172
|
+
case "console-log":
|
|
173
|
+
for (const arg of stmt.args) {
|
|
174
|
+
collectUsedIdentifiers(arg, used);
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Collect all identifier names used in an expression.
|
|
182
|
+
*/
|
|
183
|
+
function collectUsedIdentifiers(expr, used) {
|
|
184
|
+
switch (expr.kind) {
|
|
185
|
+
case "identifier":
|
|
186
|
+
used.add(expr.name);
|
|
187
|
+
break;
|
|
188
|
+
case "binary":
|
|
189
|
+
collectUsedIdentifiers(expr.left, used);
|
|
190
|
+
collectUsedIdentifiers(expr.right, used);
|
|
191
|
+
break;
|
|
192
|
+
case "unary":
|
|
193
|
+
collectUsedIdentifiers(expr.operand, used);
|
|
194
|
+
break;
|
|
195
|
+
case "assignment":
|
|
196
|
+
collectUsedIdentifiers(expr.target, used);
|
|
197
|
+
collectUsedIdentifiers(expr.value, used);
|
|
198
|
+
break;
|
|
199
|
+
case "call":
|
|
200
|
+
collectUsedIdentifiers(expr.callee, used);
|
|
201
|
+
for (const arg of expr.args) {
|
|
202
|
+
collectUsedIdentifiers(arg, used);
|
|
203
|
+
}
|
|
204
|
+
break;
|
|
205
|
+
case "property-access":
|
|
206
|
+
collectUsedIdentifiers(expr.object, used);
|
|
207
|
+
break;
|
|
208
|
+
case "element-access":
|
|
209
|
+
collectUsedIdentifiers(expr.object, used);
|
|
210
|
+
collectUsedIdentifiers(expr.index, used);
|
|
211
|
+
break;
|
|
212
|
+
case "conditional":
|
|
213
|
+
collectUsedIdentifiers(expr.condition, used);
|
|
214
|
+
collectUsedIdentifiers(expr.whenTrue, used);
|
|
215
|
+
collectUsedIdentifiers(expr.whenFalse, used);
|
|
216
|
+
break;
|
|
217
|
+
case "new":
|
|
218
|
+
for (const arg of expr.args) {
|
|
219
|
+
collectUsedIdentifiers(arg, used);
|
|
220
|
+
}
|
|
221
|
+
break;
|
|
222
|
+
case "object-literal":
|
|
223
|
+
for (const prop of expr.properties) {
|
|
224
|
+
collectUsedIdentifiers(prop.value, used);
|
|
225
|
+
}
|
|
226
|
+
break;
|
|
227
|
+
case "tuple-literal":
|
|
228
|
+
for (const elem of expr.elements) {
|
|
229
|
+
collectUsedIdentifiers(elem, used);
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/compiler/analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type SkittlesContract, type SkittlesType, type Statement, type Expression } from "../types/index.ts";
|
|
1
|
+
import { type SkittlesContract, type SkittlesType, type Statement, type Expression, type SourceMapping } from "../types/index.ts";
|
|
2
2
|
/**
|
|
3
3
|
* Generate a Solidity file containing multiple contracts.
|
|
4
4
|
* Used when a single source file defines multiple classes (e.g., for inheritance).
|
|
@@ -8,4 +8,13 @@ export declare function generateSolidity(contract: SkittlesContract, imports?: s
|
|
|
8
8
|
export declare function generateType(type: SkittlesType): string;
|
|
9
9
|
export declare function generateExpression(expr: Expression): string;
|
|
10
10
|
export declare function generateStatement(stmt: Statement, indent: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Build a source map that maps generated Solidity line numbers
|
|
13
|
+
* back to TypeScript source line numbers.
|
|
14
|
+
*
|
|
15
|
+
* The mapping is built by walking the IR (which has source line info
|
|
16
|
+
* from the parser) and counting lines in the generated Solidity output
|
|
17
|
+
* to correlate each Solidity line with its TypeScript origin.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildSourceMap(solidity: string, contracts: SkittlesContract[], sourceFile: string): SourceMapping;
|
|
11
20
|
//# sourceMappingURL=codegen.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/compiler/codegen.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EAKrB,KAAK,YAAY,EAEjB,KAAK,SAAS,EACd,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/compiler/codegen.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EAKrB,KAAK,YAAY,EAEjB,KAAK,SAAS,EACd,KAAK,UAAU,EAKf,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAM3B;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAoH9F;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAEvF;AA0XD,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAiCvD;AA+BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAiF3D;AAMD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAuLzE;AAqKD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,gBAAgB,EAAE,EAC7B,UAAU,EAAE,MAAM,GACjB,aAAa,CA8Hf"}
|