@sablier/devkit 1.0.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.
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/prettierrc",
3
+ "printWidth": 120,
4
+ "trailingComma": "all",
5
+ "overrides": [
6
+ {
7
+ "files": "*.md",
8
+ "options": {
9
+ "proseWrap": "always"
10
+ }
11
+ }
12
+ ]
13
+ }
package/LICENSE.md ADDED
@@ -0,0 +1,16 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Sablier Labs Ltd
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6
+ documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
7
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
8
+ persons to whom the Software is furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
11
+ Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
14
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # 🛠️ Sablier Devkit
2
+
3
+ This repository contains configuration files and reusable scripts for various Sablier repositories.
4
+
5
+ The files are meant to be extended and customized as needed.
6
+
7
+ ## ⚙️ Config Files
8
+
9
+ | Tool | Config File/Directory |
10
+ | --------------- | :------------------------------------ |
11
+ | 🔍 Biome | [`biome.jsonc`](./biome.jsonc) |
12
+ | 📝 EditorConfig | [`.editorconfig`](./.editorconfig) |
13
+ | 🛠 Just | [`just/`](./just/) |
14
+ | ✨ Prettier | [`prettier.json`](./.prettierrc.json) |
15
+ | 📦 TSConfig | [`tsconfig/`](./tsconfig/) |
16
+
17
+ ## 🐈‍⬛ GitHub Actions
18
+
19
+ The [setup](./actions/setup/) GitHub Actions workflow is used to setup the requisite dependencies in a GitHub CI
20
+ workflow.
21
+
22
+ ## 🚀 Setup Script
23
+
24
+ This is meant to be run by Sablier Labs employees and staff.
25
+
26
+ See [`setup.sh`](./shell/setup.sh) for details.
27
+
28
+ ## 📦 VSCode Settings
29
+
30
+ See [`vscode/settings.json`](./vscode/settings.json).
31
+
32
+ ## 📄 License
33
+
34
+ This project is licensed under MIT.
package/biome.jsonc ADDED
@@ -0,0 +1,62 @@
1
+ // Sablier Devkit configuration for Biome v2: https://next.biomejs.dev
2
+ {
3
+ "$schema": "https://biomejs.dev/schemas/latest/schema.json",
4
+ "assist": {
5
+ "enabled": true,
6
+ "actions": {
7
+ "source": {
8
+ "organizeImports": "on",
9
+ "useSortedKeys": "on"
10
+ }
11
+ }
12
+ },
13
+ "files": {
14
+ "maxSize": 5242880 // 5MB
15
+ },
16
+ "formatter": {
17
+ "enabled": true,
18
+ "formatWithErrors": true,
19
+ "indentStyle": "space",
20
+ "lineWidth": 120
21
+ },
22
+ "linter": {
23
+ "enabled": true,
24
+ "rules": {
25
+ "correctness": {
26
+ "noUnusedImports": "off",
27
+ "noUnusedVariables": "error",
28
+ "useExhaustiveDependencies": "error"
29
+ },
30
+ "nursery": {
31
+ "noFloatingPromises": "error"
32
+ },
33
+ "recommended": true,
34
+ "style": {
35
+ "useImportType": {
36
+ "level": "warn",
37
+ "options": {
38
+ "style": "separatedType"
39
+ }
40
+ },
41
+ "useTemplate": "off"
42
+ }
43
+ }
44
+ },
45
+ "overrides": [
46
+ {
47
+ "assist": {
48
+ "actions": {
49
+ "source": {
50
+ "useSortedKeys": "off"
51
+ }
52
+ }
53
+ },
54
+ "includes": ["**/*.{json,json5,jsonc}"]
55
+ }
56
+ ],
57
+ "vcs": {
58
+ "clientKind": "git",
59
+ "enabled": true,
60
+ "useIgnoreFile": true
61
+ }
62
+ }
package/just/base.just ADDED
@@ -0,0 +1,106 @@
1
+ import "./settings.just"
2
+
3
+ # ---------------------------------------------------------------------------- #
4
+ # DEPENDENCIES #
5
+ # ---------------------------------------------------------------------------- #
6
+
7
+ # Ni: https://github.com/antfu-collective/ni
8
+ na := require("na")
9
+ ni := require("ni")
10
+ nlx := require("nlx")
11
+
12
+ # ---------------------------------------------------------------------------- #
13
+ # CONSTANTS #
14
+ # ---------------------------------------------------------------------------- #
15
+
16
+ GLOBS_PRETTIER := "**/*.{md,mdx,yaml,yml}"
17
+
18
+ # ---------------------------------------------------------------------------- #
19
+ # RECIPES #
20
+ # ---------------------------------------------------------------------------- #
21
+
22
+ # Clean files
23
+ [no-cd]
24
+ clean +globs:
25
+ nlx del-cli "{{ globs }}"
26
+
27
+ # Clear node_modules recursively
28
+ [confirm("Are you sure you want to delete all node_modules, including in subdirectories? y/n")]
29
+ [no-cd]
30
+ clean-modules:
31
+ nlx del-cli "node_modules" "**/node_modules"
32
+
33
+ # Install the Node.js dependencies; run with --frozen to install the dependencies with the frozen lockfile
34
+ [no-cd]
35
+ install *args:
36
+ ni {{ args }}
37
+
38
+ # Build with TypeScript
39
+ [no-cd]
40
+ tsc-build:
41
+ na tsc -p tsconfig.build.json
42
+
43
+ # ---------------------------------------------------------------------------- #
44
+ # CHECK #
45
+ # ---------------------------------------------------------------------------- #
46
+
47
+ # Check code with Biome
48
+ [group("checks")]
49
+ [no-cd]
50
+ biome-check paths=".":
51
+ na biome check {{ paths }}
52
+ alias bc := biome-check
53
+
54
+ # Fix code with Biome
55
+ [group("checks")]
56
+ [no-cd]
57
+ biome-write paths=".":
58
+ na biome check --write {{ paths }}
59
+ na biome lint --unsafe --write --only correctness/noUnusedImports {{ paths }}
60
+ alias bw := biome-write
61
+
62
+ # Run all code checks
63
+ [group("checks")]
64
+ [no-cd]
65
+ full-check: biome-check prettier-check tsc-check
66
+ alias fc := full-check
67
+
68
+ # Run all code fixes
69
+ [group("checks")]
70
+ [no-cd]
71
+ full-write: biome-write prettier-write
72
+ alias fw := full-write
73
+
74
+ # Run knip checks
75
+ [group("checks")]
76
+ [no-cd]
77
+ knip-check:
78
+ na knip
79
+ alias kc := knip-check
80
+
81
+ # Run knip fix
82
+ [group("checks")]
83
+ [no-cd]
84
+ knip-write:
85
+ na knip --fix
86
+ alias kw := knip-write
87
+
88
+ # Check Prettier formatting
89
+ [group("checks")]
90
+ [no-cd]
91
+ prettier-check globs=GLOBS_PRETTIER:
92
+ na prettier --check --cache "{{ globs }}"
93
+ alias pc := prettier-check
94
+
95
+ # Format using Prettier
96
+ [group("checks")]
97
+ [no-cd]
98
+ prettier-write globs=GLOBS_PRETTIER:
99
+ na prettier --write --cache "{{ globs }}"
100
+ alias pw := prettier-write
101
+
102
+ # Type check with TypeScript
103
+ [group("checks")]
104
+ [no-cd]
105
+ tsc-check:
106
+ na tsc --noEmit
package/just/evm.just ADDED
@@ -0,0 +1,167 @@
1
+ import "./settings.just"
2
+
3
+ # See https://just.systems/man/en/modules1190.html
4
+ mod base
5
+
6
+
7
+ # ---------------------------------------------------------------------------- #
8
+ # DEPENDENCIES #
9
+ # ---------------------------------------------------------------------------- #
10
+
11
+ # Foundry: https://getfoundry.sh
12
+ forge := require("forge")
13
+
14
+ # Ni: https://github.com/antfu-collective/ni
15
+ na := require("na")
16
+ nlx := require("nlx")
17
+
18
+ # ---------------------------------------------------------------------------- #
19
+ # CONSTANTS #
20
+ # ---------------------------------------------------------------------------- #
21
+
22
+ GLOBS_CLEAN := ```
23
+ arr=(
24
+ "artifacts"
25
+ "artifacts-*"
26
+ "broadcast"
27
+ "cache"
28
+ "cache_hardhat-zk"
29
+ "coverage"
30
+ "docs"
31
+ "out"
32
+ "out-*"
33
+ "typechain-types"
34
+ "lcov.info"
35
+ )
36
+ echo "${arr[*]}"
37
+ ```
38
+ GLOBS_PRETTIER := "**/*.{md,mdx,yaml,yml}"
39
+ GLOBS_SOLIDITY := "{precompiles,scripts,src,tests}/**/*.sol"
40
+
41
+ # ---------------------------------------------------------------------------- #
42
+ # RECIPES #
43
+ # ---------------------------------------------------------------------------- #
44
+
45
+ # Clean directories and files
46
+ clean globs=GLOBS_CLEAN:
47
+ nlx del-cli {{ globs }}
48
+ alias c := clean
49
+
50
+ # Clear node_modules recursively
51
+ [confirm("Are you sure you want to delete all node_modules, including in subdirectories? y/n")]
52
+ clean-modules:
53
+ just base::clean-modules
54
+
55
+ # Run all code checks
56
+ full-check: solhint-check fmt-check prettier-check
57
+ alias fc := full-check
58
+
59
+ # Run all code fixes
60
+ full-write: solhint-write fmt-write prettier-write
61
+ alias fw := full-write
62
+
63
+ # Install the Node.js dependencies
64
+ install *args:
65
+ just base::install {{ args }}
66
+ alias i := install
67
+
68
+ # Check Prettier formatting
69
+ @prettier-check globs=GLOBS_PRETTIER:
70
+ just base::prettier-check "{{ globs }}"
71
+ alias pc := prettier-check
72
+
73
+ # Format using Prettier
74
+ @prettier-write globs=GLOBS_PRETTIER:
75
+ just base::prettier-write "{{ globs }}"
76
+ alias pw := prettier-write
77
+
78
+ # Check code with Solhint
79
+ solhint-check globs=GLOBS_SOLIDITY:
80
+ na solhint --cache "{{ globs }}"
81
+ alias sc := solhint-check
82
+
83
+ # Fix code with Solhint
84
+ solhint-write globs=GLOBS_SOLIDITY:
85
+ na solhint --fix --noPrompt "{{ globs }}"
86
+ alias sw := solhint-write
87
+
88
+ # ---------------------------------------------------------------------------- #
89
+ # FOUNDRY #
90
+ # ---------------------------------------------------------------------------- #
91
+
92
+ # Build contracts
93
+ [group("foundry")]
94
+ build:
95
+ forge build
96
+ alias b := build
97
+
98
+ # Build using optimized profile
99
+ [group("foundry")]
100
+ build-optimized:
101
+ FOUNDRY_PROFILE=optimized \
102
+ forge build
103
+ alias bo := build-optimized
104
+
105
+ # Build using optimized profile with optional arguments
106
+ [group("foundry")]
107
+ build-optimized *args:
108
+ FOUNDRY_PROFILE=optimized \
109
+ forge build --extra-output-files metadata {{ args }}
110
+
111
+ # Dump code coverage to an html file
112
+ [group("foundry")]
113
+ [script]
114
+ coverage:
115
+ if ! command -v genhtml >/dev/null 2>&1; then
116
+ echo "✗ genhtml CLI not found"
117
+ echo "Install it with Homebrew: https://formulae.brew.sh/formula/lcov"
118
+ exit 1
119
+ fi
120
+ forge coverage --report lcov
121
+ genhtml --branch-coverage --ignore-errors inconsistent --output-dir coverage lcov.info
122
+ alias cov := coverage
123
+
124
+ # Check code with Forge formatter
125
+ [group("foundry")]
126
+ fmt-check:
127
+ forge fmt --check
128
+
129
+ # Fix code with Forge formatter
130
+ [group("foundry")]
131
+ fmt-write:
132
+ forge fmt
133
+
134
+ # Performs a gas report
135
+ [group("foundry")]
136
+ gas-report:
137
+ forge test --gas-report
138
+ alias gr := gas-report
139
+
140
+ # Run tests with optional arguments
141
+ [group("foundry")]
142
+ test *args:
143
+ forge test {{ args }}
144
+ alias t := test
145
+
146
+ # Run Bulloak checks
147
+ [group("foundry")]
148
+ test-bulloak:
149
+ bulloak check --skip-modifiers "./tests/**/*.tree"
150
+ alias tb := test-bulloak
151
+
152
+ # Run tests using lite profile (skipping fork tests)
153
+ [group("foundry")]
154
+ test-lite:
155
+ FOUNDRY_PROFILE=lite forge test --nmt "testFork"
156
+ alias tl := test-lite
157
+
158
+ # Run tests using lite profile with optional arguments
159
+ [group("foundry")]
160
+ test-lite *args:
161
+ FOUNDRY_PROFILE=lite forge test {{ args }}
162
+
163
+ # Run tests using optimized profile
164
+ [group("foundry")]
165
+ test-optimized: build-optimized
166
+ FOUNDRY_PROFILE=test-optimized forge test
167
+ alias to := test-optimized
package/just/npm.just ADDED
@@ -0,0 +1,54 @@
1
+ import "./settings.just"
2
+
3
+ # ---------------------------------------------------------------------------- #
4
+ # DEPENDENCIES #
5
+ # ---------------------------------------------------------------------------- #
6
+
7
+ # Jq
8
+ jq := require("jq")
9
+
10
+ # Npm
11
+ npm := require("npm")
12
+
13
+ # ---------------------------------------------------------------------------- #
14
+ # SCRIPTS #
15
+ # ---------------------------------------------------------------------------- #
16
+
17
+ # Publish the npm package, e.g. v1.0.0
18
+ [group("publish")]
19
+ publish *args:
20
+ npm publish {{ args }}
21
+ @just tag $(jq -r '.version' package.json)
22
+
23
+ # Publish using the `beta` tag, e.g. v1.0.0-beta.1
24
+ [group("publish")]
25
+ publish-beta *args:
26
+ @just check-beta-version
27
+ npm publish --tag beta {{ args }}
28
+
29
+ # Tag the new version
30
+ [group("publish")]
31
+ tag *version:
32
+ git tag -am "{{ version }}" {{ version }}
33
+ git push origin --tags
34
+
35
+ # ---------------------------------------------------------------------------- #
36
+ # PRIVATE HELPERS #
37
+ # ---------------------------------------------------------------------------- #
38
+
39
+
40
+ # Check that package.json version includes -beta.x suffix
41
+ [private]
42
+ [script]
43
+ @check-beta-version:
44
+ # Extract version from package.json using jq for reliable JSON parsing
45
+ version=$(jq -r '.version' package.json)
46
+
47
+ # Check if version contains -beta suffix
48
+ if [[ "$version" =~ -beta\.[0-9]+$ ]]; then
49
+ echo "✓ Version $version includes beta suffix"
50
+ else
51
+ echo "✗ Error: Version $version does not include -beta.x suffix"
52
+ echo "Please update package.json version to include -beta.x (e.g., 1.0.0-beta.1)"
53
+ exit 1
54
+ fi
@@ -0,0 +1,5 @@
1
+ # See https://just.systems/man/en/settings.html
2
+ set allow-duplicate-recipes
3
+ set allow-duplicate-variables
4
+ set shell := ["bash", "-euo", "pipefail", "-c"]
5
+ set unstable
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@sablier/devkit",
3
+ "description": "Configuration files and reusable scripts for Sablier repositories",
4
+ "version": "1.0.0",
5
+ "author": {
6
+ "name": "Sablier Labs Ltd",
7
+ "url": "https://sablier.com"
8
+ },
9
+ "bugs": {
10
+ "url": "https://github.com/sablier-labs/devkit/issues"
11
+ },
12
+ "exports": {
13
+ "./biome": "./biome.jsonc",
14
+ "./prettier": "./.prettierrc.json",
15
+ "./tsconfig/base": "./tsconfig/base.json",
16
+ "./tsconfig/build": "./tsconfig/build.json",
17
+ "./tsconfig/next": "./tsconfig/next.json"
18
+ },
19
+ "engines": {
20
+ "node": ">=20"
21
+ },
22
+ "files": [
23
+ "biome.jsonc",
24
+ ".prettierrc.json",
25
+ "just/",
26
+ "tsconfig/"
27
+ ],
28
+ "keywords": [
29
+ "biome",
30
+ "config",
31
+ "devkit",
32
+ "prettier",
33
+ "sablier",
34
+ "tsconfig",
35
+ "typescript"
36
+ ],
37
+ "license": "MIT",
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/sablier-labs/devkit.git"
44
+ },
45
+ "type": "module"
46
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/tsconfig",
3
+ "compilerOptions": {
4
+ "esModuleInterop": true,
5
+ "forceConsistentCasingInFileNames": true,
6
+ "lib": ["ESNext"],
7
+ "module": "NodeNext",
8
+ "moduleResolution": "NodeNext",
9
+ "noFallthroughCasesInSwitch": true,
10
+ "noImplicitReturns": true,
11
+ "resolveJsonModule": true,
12
+ "skipLibCheck": true,
13
+ "sourceMap": true,
14
+ "strict": true,
15
+ "target": "ESNext"
16
+ }
17
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/tsconfig",
3
+ "extends": "./base.json",
4
+ "compilerOptions": {
5
+ "declaration": true,
6
+ "declarationMap": true,
7
+ "emitDecoratorMetadata": true,
8
+ "experimentalDecorators": true,
9
+ "forceConsistentCasingInFileNames": true,
10
+ "removeComments": true,
11
+ "skipLibCheck": true,
12
+ "stripInternal": true
13
+ }
14
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/tsconfig",
3
+ "extends": "./base.json",
4
+ "compilerOptions": {
5
+ "allowJs": true,
6
+ "isolatedModules": true,
7
+ "noEmit": true,
8
+ "incremental": true,
9
+ "jsx": "preserve",
10
+ "lib": ["dom", "dom.iterable", "ESNext"],
11
+ "module": "ESNext",
12
+ "moduleResolution": "bundler",
13
+ "plugins": [
14
+ {
15
+ "name": "next"
16
+ }
17
+ ]
18
+ }
19
+ }