brighterscript is a Roku BrightScript compiler featuring many diagnostics out of the box: syntax check, function calls validation, script imports verification...
bslint
is:
- a CLI tool to lint your code without compiling your project,
- a
brighterscript
plugin offering additional insights on your code.
You need Node 10+ and npm
or yarn
:
# if you don't have a package.json
npm init -y
# install modules
npm install brighterscript @rokucommunity/bslint
Add the plugin to your bsconfig.json
file in the root of your project,
or create a minimal file like that:
{
"plugins": [ "@rokucommunity/bslint" ]
}
The bslint
command will run the BrighterScript compiler without publishing
step, only outputing the diagnostics.
Note: the CLI can be used without adding the bslint
plugin; you will only
get the default brighterscript
diagnostics.
npx bslint --help
# lint with default options
npx bslint
or add a npm
script in package.json
, e.g.:
{
...
"scripts": {
"lint": "bslint"
}
...
}
and call npm run lint
.
Linting rules can be set in a bslint.json
file in the root of your project.
Rules are organised in 3 categories:
- "Code style": how the code should look like for consistency
- "Strictness": requirement to ensure code safety
- "Code flow": tracks the code flow to identify risky patterns
Default rules:
{
"rules": {
"inline-if-style": "then",
"block-if-style": "no-then",
"condition-style": "no-group",
"named-function-style": "auto",
"anon-function-style": "auto",
"type-annotations": "off",
"assign-all-paths": "error",
"unsafe-path-loop": "error",
"unsafe-iterators": "error",
"unreachable-code": "info",
"case-sensitivity": "warn",
"unused-variable": "warn",
"consistent-return": "error"
}
}
-
inline-if-style
: validation of inlineif/then
statements.never
: do not allow,no-then
: do not usethen
keywordthen
: always usethen
keyword (default)off
: do not validate
-
block-if-style
: validation of regular blockif/then
statements.no-then
: do not usethen
keyword (default)then
: always usethen
keywordoff
: do not validate
-
condition-style
: validation ofif
statements conditions: should the condition be wrapped around parenthesis?no-group
: do not wrap with parenthesis (default)group
: always wrap with parenthesesoff
: do not validate
-
named-function-style
,anon-function-style
: validation of function style (function/sub
)no-function
: always usesub
no-sub
: always usefunction
auto
: usesub
forVoid
functions, otherwise usefunction
(default)off
: no not validate
-
type-annotations
: validation of presence ofas
type annotations, for function arguments and return values.all
: enforce both arguments and return type annotationsreturn
: enforce return type annotationsargs
: engorce arguments type annotationsoff
: do not validate (default)
Valid values for the rules severity are: error | warn | info | off
.
-
assign-all-paths
: a variable is not assigned in all the possible code paths,if a then b = "something" end if print b ' error
-
unsafe-path-loop
: loops are considered as unsafe code paths: assignment in a loop may not happen.for i = 0 to n b = "something" end if print b ' b may not have been assigned
-
unsafe-iterators
: loop iterator variable should not be used outside a loopfor i = 0 to n b = "something" end if print i ' value could be invalid
-
case-sensitivity
: inform of inconsistent variable casing -
unused-variable
: inform of variable being set but never used -
unreachable-code
: inform of unreachable codereturn print "is unreachable"
-
consistent-return
: verifies consistency ofsub
/function
returned values (missing return, missing value, returned value while function isas void
,...)