Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Eslint angular and jasmine: is not defined no-undef

I am trying to lint my angular code using angular, eslint:recommended and the jasmine plugin recommended settings. However I get is not defined errors on the jasmine stuff. My eslint file looks like this:

{
  "plugins": ["jasmine"],
  "extends": ["angular", "eslint:recommended", 
  "plugin:jasmine/recommended"],
  "rules": {
   "quotes": [ 2, "single"],
   "strict": [2, "global"],
   "semi": ["error", "always"],
   "angular/on-watch": "warn"
  }
}

I get the following errors:

3:1 error 'describe' is not defined no-undef

4:5 error 'it' is not defined no-undef

5:9 error 'expect' is not defined no-undef

7:5 error 'it' is not defined no-undef

8:9 error 'expect' is not defined no-undef

And in my package.json I have version 2.3.0 for eslint and 1.8.1 for eslint-plugin-jasmine. I also have version 0.5.0 for eslint-config-angular and 1.0.0 for eslint-plugin-angular.

I have also tried without specifying the "plugins": ["jasmine"] in my eslint file but then I get an error telling me the jasmine rules are not defined (eg Definition for rule 'jasmine/no-focused-tests' was not found).

like image 766
Geert Olaerts Avatar asked Apr 30 '16 07:04

Geert Olaerts


3 Answers

Adding

"env": {
 "jasmine": true
}

solved the problem. This was the suggestion that i got through the github page of the eslint jasmine plugin.

like image 118
Geert Olaerts Avatar answered Sep 23 '22 09:09

Geert Olaerts


With this rule set, any variable non explicitly declared causes a warning. You can set at the top of your spec file:

/* global describe it expect */
like image 31
Bruno Garcia Avatar answered Sep 20 '22 09:09

Bruno Garcia


The way I found to configure the validations for all Jasmine functions and do it in a single place, but still flag them when they are used in a "non-spec" file is as follows.

Have the common configuration defined at config level. Then, for those specific configurations (such as Typescript or Jasmin) do an override. That way, the "global configuration" is applied only to specific files.

{
    "env": {
        "jasmine": true
    },
    "files": ["**/*.spec.js"]
}

Fragment of .eslintrc.js:

/**
 * @type {import("eslint").Linter.Config}
 */
module.exports = {
    "env": {...},
    "extends": [
        "eslint:recommended"
    ],
    "overrides": [
        {
            "extends": [
                "plugin:@typescript-eslint/eslint-recommended",
                "plugin:@typescript-eslint/recommended"
            ],
            "files": ["**/*.ts"],
            "parser": "@typescript-eslint/parser",
            "parserOptions": {
                "project": "tsconfig.json",
                "tsconfigRootDir": __dirname
            },
            "plugins": [
                "@typescript-eslint"
            ]
        },
        // This is the important part
        {
            "env": {
                "jasmine": true
            },
            "files": ["**/*.spec.js"] 
        }
    ],
    "root": true,
    "rules": {...}
};
like image 7
gian1200 Avatar answered Sep 23 '22 09:09

gian1200