prettier-config-solidity
v1.9.1
Published
conformant configuration for linting solidity files with prettier, based on offical solidity documentation
Downloads
4
Maintainers
Readme
Quickstart
See the dappspec format for additional style guide directives
Prettier & Plugin+Config
Warning A Major Semver release for prettier is upcoming, ensure you are using compatible versions
npm i -D prettier@^2 prettier-plugin-solidity@latest prettier-config-solidity@latest --save-exact
create prettier.config.js
file
'use strict';
const prettierConfig = require('prettier-config-solidity');
module.exports = prettierConfig;
Editorconfig
# Stop the editor from looking for .editorconfig files in the parent directories
# root = true
[*]
# Non-configurable Prettier behaviors
charset = utf-8
insert_final_newline = true
# Caveat: Prettier won’t trim trailing whitespace inside template strings, but your editor might.
# trim_trailing_whitespace = true
# Configurable Prettier behaviors
# (change these if your Prettier config differs)
end_of_line = lf
indent_style = space
indent_size = 2
max_line_length = 80
# Solidity
# https://github.com/sambacha/prettier-config-solidity
[*.sol]
indent_size = 4
indent_style = space
# Ignore fixtures and vendored files
[{dist,artifacts,vendor,test,fixtures,tests,cache,__snapshot__,}/**]
charset = unset
end_of_line = unset
indent_size = unset
indent_style = unset
insert_final_newline = unset
trim_trailing_spaces = unset
Style Convention
Example:
- Changes
unit
tounit256
unformatted
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
override
payable
ensure(deadline)
returns (uint[] memory amounts)
{
formatted
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable override ensure(deadline) returns (uint256[] memory amounts) {
require(path[0] == WETH, "UniswapV2Router: INVALID_PATH");
Overview
Prettier configuration for Solidity
Motivation
This configuration is optimized to reduce diff churn and improve AST results.
The following rules are employed, with specific reasonings to their choice (source: airbnb style guide):
printWidth
The behavior of printWidth
is located here:
prettier-solidity/prettier-plugin-solidity/blob/b504261047d0019c924d53a2b9ab0738b1e05703/src/nodes/FunctionDefinition.js#L99
See more here prettier-plugin-solidity/issues/474#issuecomment-823670541
whitespace
source@airbnb/javascript#whitespace--in-braces
- 19.12 Add spaces inside curly braces. eslint: object-curly-spacing
// bad
const foo = { clark: 'kent' };
// good
const foo = { clark: 'kent' };
arrow-parens
- 8.4 Always include parentheses around arguments for clarity and consistency. eslint: arrow-parens
source@airbnb/javascript#arrows--one-arg-parens
Why? Minimizes diff churn when adding or removing arguments.
// bad
[1, 2, 3].map((x) => x * x);
// good
[1, 2, 3].map((x) => x * x);
// bad
[1, 2, 3].map(
(number) =>
`A long string with the ${number}. It’s so long that we don’t want it to take up space on the .map line!`,
);
// good
[1, 2, 3].map(
(number) =>
`A long string with the ${number}. It’s so long that we don’t want it to take up space on the .map line!`,
);
// bad
[1, 2, 3].map((x) => {
const y = x + 1;
return x * y;
});
// good
[1, 2, 3].map((x) => {
const y = x + 1;
return x * y;
});
one var
- 13.2 Use one const or let declaration per variable or assignment. eslint: one-var
Why? It’s easier to add new variable declarations this way, and you never have to worry about swapping out a ; for a , or introducing punctuation-only diffs. You can also step through each declaration with the debugger, instead of jumping through all of them at once.
ref:eslint/rules/one-var
// bad
const items = getItems(),
goSportsTeam = true,
dragonball = 'z';
// bad
// (compare to above, and try to spot the mistake)
const items = getItems(),
goSportsTeam = true;
dragonball = 'z';
// good
const items = getItems();
const goSportsTeam = true;
const dragonball = 'z';
20.2 Additional trailing comma: Yup. eslint: comma-dangle
Why? This leads to cleaner git diffs. Also, transpilers like Babel will remove the additional trailing comma in the transpiled code which means you don’t have to worry about the trailing comma problem in legacy browsers.
// bad - git diff without trailing comma
const hero = {
firstName: 'Florence',
- lastName: 'Nightingale'
+ lastName: 'Nightingale',
+ inventorOf: ['coxcomb chart', 'modern nursing']
};
// good - git diff with trailing comma
const hero = {
firstName: 'Florence',
lastName: 'Nightingale',
+ inventorOf: ['coxcomb chart', 'modern nursing'],
};
8.6 Enforce the location of arrow function bodies with implicit returns. eslint: implicit-arrow-linebreak
// bad
(foo) => bar;
(foo) => bar;
// good
(foo) => bar;
(foo) => bar;
(foo) => bar;
Install
Prettier
npm i -D prettier prettier-plugin-solidity@latest prettier-config-solidity --save-exact
npm i -D prettier prettier-plugin-solidity@latest prettier-config-solidity --save-exact --legacy-peer-deps
or
yarn add -D prettier prettier-plugin-solidity@latest prettier-config-solidity --save-exact
with SolHint
npm install --save-dev solhint solhint-plugin-prettier prettier prettier-plugin-solidity --save-exact
{
"plugins": ["prettier"],
"rules": {
"prettier/prettier": "error"
}
}
License
SPDX-License-Identifier: Apache-2.0