diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8960e9c..6c24e62 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,14 +13,15 @@ jobs: strategy: matrix: - node-version: [12.x] + node-version: [lts/*] steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} + cache: npm - name: Install Dependencies run: npm ci - name: Check Code Style diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a340f2f --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,54 @@ +# Contributing + +Contributions to `@sasjs/lint` are very welcome! +Please fill in the pull request template and make sure that your code changes are adequately covered with tests when making a PR. + +## Architecture + +This project implements a number of rules for SAS projects and code. There are three types of rules: + +* File rules - rules applied at the file level +* Line rules - rules applied to each line of a file +* Path rules - rules applied to paths and file names + +When implementing a new rule, place it in the appropriate folder for its type. +Please also make sure to export it from the `index.ts` file in that folder. + +The file for each rule typically exports an object that conforms to the `LintRule` interface. +This means it will have a `type`, `name`, `description` and `message` at a minimum. + +File, line and path lint rules also have a `test` property. +This is a function that will run a piece of logic against the supplied item and produce an array of `Diagnostic` objects. +These objects can be used in the consuming application to display the problems in the code. + +With some lint rules, we can also write logic that can automatically fix the issues found. +These rules will also have a `fix` property, which is a function that takes the original content - +either a line or the entire contents of a file, and returns the transformed content with the fix applied. + +## Testing + +Testing is one of the most important steps when developing a new lint rule. +It helps us ensure that our lint rules do what they are intended to do. + +We use `jest` for testing, and since most of the code is based on pure functions, there is little mocking to do. +This makes `@sasjs/lint` very easy to unit test, and so there is no excuse for not testing a new rule. :) + +When adding a new rule, please make sure that all positive and negative scenarios are tested in separate test cases. +When modifying an existing rule, ensure that your changes haven't affected existing functionality by running the tests on your machine. + +You can run the tests using `npm test`. + +## Code Style + +This repository uses `Prettier` to ensure a uniform code style. +If you are using VS Code for development, you can automatically fix your code to match the style as follows: + +- Install the `Prettier` extension for VS Code. +- Open your `settings.json` file by choosing 'Preferences: Open Settings (JSON)' from the command palette. +- Add the following items to the JSON. + ``` + "editor.formatOnSave": true, + "editor.formatOnPaste": true, + ``` + +If you are using another editor, or are unable to install the extension, you can run `npm run lint:fix` to fix the formatting after you've made your changes. diff --git a/checkNodeVersion.js b/checkNodeVersion.js new file mode 100644 index 0000000..ac3d46d --- /dev/null +++ b/checkNodeVersion.js @@ -0,0 +1,16 @@ +const result = process.versions +if (result && result.node) { + if (parseInt(result.node) < 14) { + console.log( + '\x1b[31m%s\x1b[0m', + `❌ Process failed due to Node Version,\nPlease install and use Node Version >= 14\nYour current Node Version is: ${result.node}` + ) + process.exit(1) + } +} else { + console.log( + '\x1b[31m%s\x1b[0m', + 'Something went wrong while checking Node version' + ) + process.exit(1) +} diff --git a/package.json b/package.json index ddd7825..02c70e9 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,8 @@ "scripts": { "test": "jest --coverage", "build": "rimraf build && tsc", + "preinstall": "node checkNodeVersion", + "prebuild": "node checkNodeVersion", "prepublishOnly": "cp -r ./build/* . && rm -rf ./build && rm -rf ./src && rm tsconfig.json", "postpublish": "git clean -fd", "package:lib": "npm run build && cp ./package.json build && cp README.md build && cd build && npm version \"5.0.0\" && npm pack",