JSPM

  • Created
  • Published
  • Downloads 6209
  • Score
    100M100P100Q119660F
  • License MIT

A flexible, stand-alone linter for Ethereum Solidity

Package Exports

  • solium

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (solium) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Solium

Solium is a linter for Solidity which uses Abstract Syntax Trees and allows the user to enable/disable existing rules and add their own ones!

It internally uses solparse to parse your solidity code into a Spider Monkey compliant AST

#Install

npm install -g solium

#Usage In the root directory of your DApp, run the following:

solium --init

This creates .soliumrc.json inside your root directory, which has the configuration for the enabled and custom rules.

You can disable a particular rule by setting its value to false

In order to lint a specific file, use:

solium --file foobar.sol

To run the linter over your entire project, use the following command in your root directory:

solium

#Plugging in your custom rules -> Open up the .soliumrc.json configuration file and set the value of custom-rules-filename to the path of the file that defines your rules. You can either provide an absolute path or a path relative to the directory in which .soliumrc.json resides. For example: "custom-rules-filename": "./my-rules.js"

The format for writing your custom rule file (for example, my-rules.js) is:

module.exports = {
  'my-rule-name-1': function (context) {
    //Solium internally uses EventEmitter and emits an event every time it enters or leaves a node during the Depth First Traversal of the AST
    context.on ('IfStatement', function (emittedObject) {
    
      //exit property is set to true if we are leaving the node
      if (emittedObject.exit) {
        return;
      }
      
      //View the node representing an If Statement 
      console.log (emittedObject.node);
      
      //report an error
      context.report ({
        node: emittedObject.node,
        message: 'I JUST ENTERED AN IF STATEMENT!!',
        line: 1,  //optional
        column: 2 //optional
      });
      
    });
  },
  
  'my-rule-name-2': function (context) {
    context.on ('ContractStatement', function (emittedObject) {
      //similarly define this rule to do something with Contract Declarations
    });
  }
};

NOTE: The best way to know which event you're looking for is to simply install solparse or solidity-parser, then parse your code into the AST and see the value of the type field of the node that you wish to target.

See the existing rules to get an idea of how the rules are making use of the context object being provided to them.

-> Then, inside the rules object in the same file, set your rule names to true. For instance:

"rules": {
  "my-rule-name-1": true,
  "my-rule-name-2": true
}

NOTE: If you write a rule whose name clashes with the name of a pre-defined rule, your custom rule overrides the pre-defined one.

#Integrate Solium in your app To access Solium's API, first install it:

npm install --save solium

##Usage

let Solium = require ('solium'),
  sourceCode = 'contract fOO_bar { function HELLO_WORLD () {} }';
    
let errorObjects = Solium.lint (sourceCode, {
  rules: {
    camelcase: true,
    mixedcase: true
  }
});

errorObjects.forEach ( (err) => {
  console.log (err);
});

For a list of all available rules, see solium.json.