From f1ef3a3beab15f7191b8e5de8886b1591b3abfab Mon Sep 17 00:00:00 2001 From: Konrad Weihmann Date: Mon, 25 Apr 2022 16:31:37 +0200 Subject: [PATCH] remove eslint module Relates to #8749 Signed-off-by: Konrad Weihmann --- README.md | 2 - classes/sca-blacklist.bbclass | 1 - classes/sca-eslint-core.bbclass | 111 ------------------ classes/sca-eslint-image.bbclass | 14 --- classes/sca-eslint-recipe.bbclass | 15 --- classes/sca-global.bbclass | 1 - classes/sca-on-image.bbclass | 1 - classes/sca-on-recipe.bbclass | 1 - docs/conf/examples/img_complete.md | 2 - docs/conf/examples/web_inflight.md | 1 - docs/conf/module/eslint.md | 67 ----------- files/module_list.csv | 1 - .../sca-image-eslint-rules-native/files/fatal | 0 .../files/suppress | 0 .../sca-image-eslint-rules-native_1.0.bb | 19 --- .../files/fatal | 0 .../files/suppress | 0 .../sca-recipe-eslint-rules-native_1.0.bb | 19 --- .../eslint-native/eslint-native_1.0.bb | 48 -------- .../eslint/configs/eslint-plain.json | 18 --- .../eslint/eslint.sca.description | 31 ----- test/lang_metaoe.txt | 1 - 22 files changed, 353 deletions(-) delete mode 100755 classes/sca-eslint-core.bbclass delete mode 100755 classes/sca-eslint-image.bbclass delete mode 100755 classes/sca-eslint-recipe.bbclass delete mode 100644 docs/conf/module/eslint.md delete mode 100755 recipes-sca-rules/sca-image-eslint-rules-native/files/fatal delete mode 100755 recipes-sca-rules/sca-image-eslint-rules-native/files/suppress delete mode 100755 recipes-sca-rules/sca-image-eslint-rules-native/sca-image-eslint-rules-native_1.0.bb delete mode 100755 recipes-sca-rules/sca-recipe-eslint-rules-native/files/fatal delete mode 100755 recipes-sca-rules/sca-recipe-eslint-rules-native/files/suppress delete mode 100755 recipes-sca-rules/sca-recipe-eslint-rules-native/sca-recipe-eslint-rules-native_1.0.bb delete mode 100644 recipes-sca/eslint-native/eslint-native_1.0.bb delete mode 100644 recipes-sca/eslint-native/eslint/configs/eslint-plain.json delete mode 100644 recipes-sca/eslint-native/eslint/eslint.sca.description diff --git a/README.md b/README.md index 3c6bc3c264..dc7b20e440 100644 --- a/README.md +++ b/README.md @@ -189,7 +189,6 @@ The layer can check on a recipe-level or on an image-level. | darglint | Python docstring linter | https://github.com/terrencepreilly/darglint | | | | x | | | x | | | | | | | | | | | | | | x | | dennis | I18N linter | https://github.com/willkg/dennis/ | | | | x | | | | | | | | | | | | | | x | | x | x | | detectsecrets | Detect hardcoded secrets in code | https://github.com/Yelp/detect-secrets | | | x | x | | | | | | | | | | | | | x | | x | x | | -| eslint | Javascript linter | https://github.com/eslint/eslint | meta-oe, manual enable | x | x | x | | | | | x | | | | | | | | | | | x | | | flake8 | Python linter | http://flake8.pycqa.org/en/latest/ | | | x | x | | | x | | | | | | | | | | | | | x | x | | flawfinder | C/C++ security linter | https://github.com/david-a-wheeler/flawfinder | | | | x | x | x | | | | | | | | | | | | | x | | | | flint | C/C++ linter | https://github.com/JossWhittle/FlintPlusPlus | | | | x | x | x | | | | | | | | | | | | | | x | | @@ -295,7 +294,6 @@ each tool does have it's own benefits and flaws so don't be mad if you have 10k+ - [darglint](docs/conf/module/darglint.md) - [dennis](docs/conf/module/dennis.md) - [detectsecrets](docs/conf/module/detectsecrets.md) - - [eslint](docs/conf/module/eslint.md) - [flake8](docs/conf/module/flake8.md) - [flawfinder](docs/conf/module/flawfinder.md) - [flint++](docs/conf/module/flint++.md) diff --git a/classes/sca-blacklist.bbclass b/classes/sca-blacklist.bbclass index 0389bb5e25..d3ce487d67 100644 --- a/classes/sca-blacklist.bbclass +++ b/classes/sca-blacklist.bbclass @@ -17,7 +17,6 @@ SCA_BLACKLIST_cvecheck ?= "" SCA_BLACKLIST_darglint ?= "" SCA_BLACKLIST_dennis ?= "linux-.*" SCA_BLACKLIST_detectsecrets ?= "linux-.*" -SCA_BLACKLIST_eslint ?= "linux-.*" SCA_BLACKLIST_flake8 ?= "" SCA_BLACKLIST_flawfinder ?= "" SCA_BLACKLIST_flint ?= "linux-.*" diff --git a/classes/sca-eslint-core.bbclass b/classes/sca-eslint-core.bbclass deleted file mode 100755 index 1e203b5cb6..0000000000 --- a/classes/sca-eslint-core.bbclass +++ /dev/null @@ -1,111 +0,0 @@ -## SPDX-License-Identifier: BSD-2-Clause -## Copyright (c) 2019, Konrad Weihmann - -## Set the config file to be used - the files must be placed at ${STAGING_DATADIR_NATIVE}/eslint/configs -## See eslint-native recipe for details -SCA_ESLINT_CONFIG_FILE ?= "eslint-plain.json" -SCA_ESLINT_EXTRA_SUPPRESS ?= "" -SCA_ESLINT_EXTRA_FATAL ?= "" -SCA_ESLINT_FILE_FILTER ?= ".js .vue .html .htm" - -SCA_RAW_RESULT_FILE[eslint] = "xml" - -inherit sca-conv-to-export -inherit sca-datamodel -inherit sca-global -inherit sca-helper -inherit sca-license-filter -inherit sca-suppress -inherit sca-image-backtrack - -DEPENDS += "eslint-native" - -def do_sca_conv_eslint(d): - import os - from xml.etree.ElementTree import Element, SubElement, Comment, tostring - from xml.etree import ElementTree - - package_name = d.getVar("PN") - buildpath = d.getVar("SCA_SOURCES_DIR") - - items = [] - pattern = r"^(?P.*):(?P\d+):(?P\d+):\s+(?P\w+):\s+(?P.*)\s\[-(?P.*)\]" - - severity_map = { - "error" : "error", - "warning" : "warning", - "info": "info" - } - - __excludes = sca_filter_files(d, d.getVar("SCA_SOURCES_DIR"), clean_split(d, "SCA_FILE_FILTER_EXTRA")) - __suppress = sca_suppress_init(d, "SCA_ESLINT_EXTRA_SUPPRESS", - d.expand("${STAGING_DATADIR_NATIVE}/eslint-${SCA_MODE}-suppress")) - _findings = [] - - if os.path.exists(sca_raw_result_file(d, "eslint")): - try: - data = ElementTree.ElementTree(ElementTree.parse(sca_raw_result_file(d, "eslint"))) - for _file in data.findall(".//file"): - if _file.attrib["name"] in __excludes: - continue - try: - for f in _file.findall(".//error"): - g = sca_get_model_class(d, - PackageName=package_name, - Tool="eslint", - BuildPath=buildpath, - File=_file.attrib["name"], - Line=f.attrib["line"], - Column=f.attrib["column"], - Message=f.attrib["message"], - ID=f.attrib["source"], - Severity=f.attrib["severity"]) - if __suppress.Suppressed(g): - continue - if g.Scope not in clean_split(d, "SCA_SCOPE_FILTER"): - continue - if g.Severity in sca_allowed_warning_level(d): - _findings += sca_backtrack_findings(d, g) - except Exception as exp: - sca_log_note(d, str(exp)) - except Exception as e: - sca_log_note(d, str(e)) - sca_add_model_class_list(d, _findings) - return sca_save_model_to_string(d) - -python do_sca_eslint_core() { - import os - import subprocess - import json - - if not os.path.exists("node_modules"): - os.symlink(os.path.join(d.getVar("STAGING_LIBDIR_NATIVE"), "node_modules"), "node_modules", target_is_directory=True) - - _args = ["eslint"] - _args += ["-c", os.path.join(d.getVar("STAGING_DATADIR_NATIVE"), "eslint", "configs", d.getVar("SCA_ESLINT_CONFIG_FILE"))] - _args += ["-f", "checkstyle"] - _args += ["--quiet"] - _files = get_files_by_extention(d, d.getVar("SCA_SOURCES_DIR"), d.getVar("SCA_ESLINT_FILE_FILTER"), - sca_filter_files(d, d.getVar("SCA_SOURCES_DIR"), clean_split(d, "SCA_FILE_FILTER_EXTRA"))) - - cmd_output = exec_wrap_check_output(d, _args, _files, combine=exec_wrap_combine_xml) - with open(sca_raw_result_file(d, "eslint"), "w") as o: - o.write(cmd_output) - - try: - os.remove("node_modules") - except FileNotFoundError: - pass -} - -python do_sca_eslint_core_report() { - import os - ## Create data model - d.setVar("SCA_DATAMODEL_STORAGE", "{}/eslint.dm".format(d.getVar("T"))) - dm_output = do_sca_conv_eslint(d) - with open(d.getVar("SCA_DATAMODEL_STORAGE"), "w") as o: - o.write(dm_output) - - sca_task_aftermath(d, "eslint", get_fatal_entries(d, "SCA_ESLINT_EXTRA_FATAL", - d.expand("${STAGING_DATADIR_NATIVE}/eslint-${SCA_MODE}-fatal"))) -} diff --git a/classes/sca-eslint-image.bbclass b/classes/sca-eslint-image.bbclass deleted file mode 100755 index b0e3148557..0000000000 --- a/classes/sca-eslint-image.bbclass +++ /dev/null @@ -1,14 +0,0 @@ -## SPDX-License-Identifier: BSD-2-Clause -## Copyright (c) 2019, Konrad Weihmann - -inherit sca-helper -inherit sca-global -inherit sca-eslint-core -inherit sca-conv-to-export - -do_sca_eslint_core[doc] = "Lint js files with eslint in image" -do_sca_deploy_eslint_image[doc] = "Deploy results of do_sca_eslint_core" -addtask do_sca_eslint_core before do_image_complete after do_image -addtask do_sca_eslint_core_report after do_sca_eslint_core before do_sca_deploy - -DEPENDS += "sca-image-eslint-rules-native" diff --git a/classes/sca-eslint-recipe.bbclass b/classes/sca-eslint-recipe.bbclass deleted file mode 100755 index 64225b8015..0000000000 --- a/classes/sca-eslint-recipe.bbclass +++ /dev/null @@ -1,15 +0,0 @@ -## SPDX-License-Identifier: BSD-2-Clause -## Copyright (c) 2019, Konrad Weihmann - -inherit sca-helper -inherit sca-global -inherit sca-eslint-core -inherit sca-conv-to-export -inherit sca-tracefiles - -do_sca_eslint_core[doc] = "Lint js files with eslint" -do_sca_eslint_core_report[doc] = "Report findings from do_sca_eslint_core" -addtask do_sca_eslint_core after do_compile before do_sca_tracefiles -addtask do_sca_eslint_core_report after do_sca_tracefiles before do_sca_deploy - -DEPENDS += "sca-recipe-eslint-rules-native" diff --git a/classes/sca-global.bbclass b/classes/sca-global.bbclass index 6cdde88e38..fa856c913f 100644 --- a/classes/sca-global.bbclass +++ b/classes/sca-global.bbclass @@ -150,7 +150,6 @@ SCA_AVAILABLE_MODULES ?= "\ yara \ " # additional layer requirements -SCA_AVAILABLE_MODULES[eslint] = "openembedded-layer" SCA_AVAILABLE_MODULES[htmlhint] = "openembedded-layer" SCA_AVAILABLE_MODULES[inspec] = "openembedded-layer rubygems" SCA_AVAILABLE_MODULES[jshint] = "openembedded-layer" diff --git a/classes/sca-on-image.bbclass b/classes/sca-on-image.bbclass index 048e49a320..5ddeaac859 100755 --- a/classes/sca-on-image.bbclass +++ b/classes/sca-on-image.bbclass @@ -18,7 +18,6 @@ SCA_ENABLED_MODULES_IMAGE ?= "\ checksec \ configcheck \ detectsecrets \ - eslint \ flake8 \ htmlhint \ inspec \ diff --git a/classes/sca-on-recipe.bbclass b/classes/sca-on-recipe.bbclass index 9348971460..2fe41bae72 100755 --- a/classes/sca-on-recipe.bbclass +++ b/classes/sca-on-recipe.bbclass @@ -23,7 +23,6 @@ SCA_ENABLED_MODULES_RECIPE ?= "\ darglint \ dennis \ detectsecrets \ - eslint \ flake8 \ flawfinder \ flint \ diff --git a/docs/conf/examples/img_complete.md b/docs/conf/examples/img_complete.md index b0a934cd20..ca8278fd65 100644 --- a/docs/conf/examples/img_complete.md +++ b/docs/conf/examples/img_complete.md @@ -29,7 +29,6 @@ SCA_ENABLED_MODULES_IMAGE = "\ checkbashism \ configcheck \ detectsecrets \ - eslint \ flake8 \ htmlhint \ jsonlint \ @@ -59,7 +58,6 @@ SCA_ENABLED_MODULES_RECIPE = "\ darglint \ dennis \ detectsecrets \ - eslint \ flake8 \ flint \ gcc \ diff --git a/docs/conf/examples/web_inflight.md b/docs/conf/examples/web_inflight.md index 18c365e7d6..c5a71ba6d0 100644 --- a/docs/conf/examples/web_inflight.md +++ b/docs/conf/examples/web_inflight.md @@ -23,7 +23,6 @@ SCA_ENABLE_BESTOF = "0" SCA_VERBOSE_OUTPUT = "0" SCA_SCOPE_FILTER = "security functional style" SCA_ENABLED_MODULES_RECIPE = "\ - eslint \ flake8 \ htmlhint \ jsonlint \ diff --git a/docs/conf/module/eslint.md b/docs/conf/module/eslint.md deleted file mode 100644 index c3e15b3a88..0000000000 --- a/docs/conf/module/eslint.md +++ /dev/null @@ -1,67 +0,0 @@ -# Configuration for eslint - -## Supported environments/languages - -* javascript -* embedded javascript - -## Configuration - -| var | purpose | type | default | -| ------------- |:-------------:| -----:| -----: -| SCA_BLACKLIST_eslint | Blacklist filter for this tool | space-separated-list | "linux-*" -| SCA_ESLINT_CONFIG_FILE | Configuration-file to be used. See recipe eslint-native for details | string: eslint-plain.json or file name | eslint-plain.json -| SCA_ESLINT_EXTRA_FATAL | Extra error-IDs leading to build termination when found | space-separated-list | "" -| SCA_ESLINT_EXTRA_SUPPRESS | Extra error-IDs to be suppressed | space-separated-list | "" -| SCA_ESLINT_FILE_FILTER | File extensions to check for | space-separated-list | ".js .vue .html .htm" - -### Notes - -You can supply your own configuration by installing a premade json file into `${STAGING_DATADIR_NATIVE}/eslint/configs/` and reference the file name via `SCA_ESLINT_CONFIG_FILE` option - -## Supports - -* [x] suppression of IDs -* [x] terminate build on fatal -* [x] run on recipe -* [x] run on image -* [ ] run with SCA-layer default settings (see SCA_AVAILABLE_MODULES) - -## Requires - -* [x] requires online access - -## Known error-IDs - -__tbd__ - -## Checking scope - -* [ ] security -* [x] functional defects -* [ ] compliance -* [ ] style issues - -## Statistics - -* ⬛⬛⬛⬛⬜⬜⬜⬜⬜⬜ 04/10 Build Speed -* ⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛ 10/10 Execution Speed -* ⬛⬛⬛⬛⬛⬛⬛⬛⬜⬜ 08/10 Quality - -## Score mapping - -### Error considered as security relevant - -* n.a. - -### Error considered as functional defect - -* eslint.eslint.* - -### Error consired as compliance issue - -* n.a. - -### Error considered as style issue - -* n.a. diff --git a/files/module_list.csv b/files/module_list.csv index 68b96c61e4..4a9bd3d058 100644 --- a/files/module_list.csv +++ b/files/module_list.csv @@ -14,7 +14,6 @@ cvecheck,Check for unpatched CVEs,https://github.com/clearlinux/cve-check-tool,m darglint,Python docstring linter,https://github.com/terrencepreilly/darglint,,,,x,,,x,,,,,,,,,,,,,,x dennis,I18N linter,https://github.com/willkg/dennis/,,,,x,,,,,,,,,,,,,,x,,x,x detectsecrets,Detect hardcoded secrets in code,https://github.com/Yelp/detect-secrets,,,x,x,,,,,,,,,,,,,x,,x,x, -eslint,Javascript linter,https://github.com/eslint/eslint,"meta-oe, manual enable",x,x,x,,,,,x,,,,,,,,,,,x, flake8,Python linter,http://flake8.pycqa.org/en/latest/,,,x,x,,,x,,,,,,,,,,,,,x,x flawfinder,C/C++ security linter,https://github.com/david-a-wheeler/flawfinder,,,,x,x,x,,,,,,,,,,,,,x,, flint,C/C++ linter,https://github.com/JossWhittle/FlintPlusPlus,,,,x,x,x,,,,,,,,,,,,,,x, diff --git a/recipes-sca-rules/sca-image-eslint-rules-native/files/fatal b/recipes-sca-rules/sca-image-eslint-rules-native/files/fatal deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/recipes-sca-rules/sca-image-eslint-rules-native/files/suppress b/recipes-sca-rules/sca-image-eslint-rules-native/files/suppress deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/recipes-sca-rules/sca-image-eslint-rules-native/sca-image-eslint-rules-native_1.0.bb b/recipes-sca-rules/sca-image-eslint-rules-native/sca-image-eslint-rules-native_1.0.bb deleted file mode 100755 index f8354955d9..0000000000 --- a/recipes-sca-rules/sca-image-eslint-rules-native/sca-image-eslint-rules-native_1.0.bb +++ /dev/null @@ -1,19 +0,0 @@ -SUMMARY = "SCA ruleset for eslint at images" -DESCRIPTION = "Rules to configure how eslint is affecting the build" - -DEFAULT_PREFERENCE = "${SCA_DEFAULT_PREFERENCE}" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://${SCA_LAYERDIR}/LICENSE;md5=a4a2bbea1db029f21b3a328c7a059172" - -SRC_URI = "file://suppress \ - file://fatal" - -inherit native - -do_install() { - install -d "${D}${datadir}" - install "${WORKDIR}/suppress" "${D}${datadir}/eslint-image-suppress" - install "${WORKDIR}/fatal" "${D}${datadir}/eslint-image-fatal" -} - -FILES:${PN} = "${datadir}" diff --git a/recipes-sca-rules/sca-recipe-eslint-rules-native/files/fatal b/recipes-sca-rules/sca-recipe-eslint-rules-native/files/fatal deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/recipes-sca-rules/sca-recipe-eslint-rules-native/files/suppress b/recipes-sca-rules/sca-recipe-eslint-rules-native/files/suppress deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/recipes-sca-rules/sca-recipe-eslint-rules-native/sca-recipe-eslint-rules-native_1.0.bb b/recipes-sca-rules/sca-recipe-eslint-rules-native/sca-recipe-eslint-rules-native_1.0.bb deleted file mode 100755 index 6eedc35c5d..0000000000 --- a/recipes-sca-rules/sca-recipe-eslint-rules-native/sca-recipe-eslint-rules-native_1.0.bb +++ /dev/null @@ -1,19 +0,0 @@ -SUMMARY = "SCA ruleset for eslint at recipes" -DESCRIPTION = "Rules to configure how eslint is affecting the build" - -DEFAULT_PREFERENCE = "${SCA_DEFAULT_PREFERENCE}" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://${SCA_LAYERDIR}/LICENSE;md5=a4a2bbea1db029f21b3a328c7a059172" - -SRC_URI = "file://suppress \ - file://fatal" - -inherit native - -do_install() { - install -d "${D}${datadir}" - install "${WORKDIR}/suppress" "${D}${datadir}/eslint-recipe-suppress" - install "${WORKDIR}/fatal" "${D}${datadir}/eslint-recipe-fatal" -} - -FILES:${PN} = "${datadir}" diff --git a/recipes-sca/eslint-native/eslint-native_1.0.bb b/recipes-sca/eslint-native/eslint-native_1.0.bb deleted file mode 100644 index f99e139a99..0000000000 --- a/recipes-sca/eslint-native/eslint-native_1.0.bb +++ /dev/null @@ -1,48 +0,0 @@ -SUMMARY = "sca definition for eslint" - -DEFAULT_PREFERENCE = "${SCA_DEFAULT_PREFERENCE}" -LICENSE = "BSD-2-Clause" -LIC_FILES_CHKSUM = "file://${SCA_LAYERDIR}/LICENSE;md5=a4a2bbea1db029f21b3a328c7a059172" - -DEPENDS += "\ - npm-eslint-config-airbnb-base-native \ - npm-eslint-config-google-native \ - npm-eslint-config-standard-native \ - npm-eslint-native \ - npm-eslint-plugin-array-func-native \ - npm-eslint-plugin-deprecate-native \ - npm-eslint-plugin-filenames-native \ - npm-eslint-plugin-fp-native \ - npm-eslint-plugin-html-native \ - npm-eslint-plugin-immutable-native \ - npm-eslint-plugin-import-native \ - npm-eslint-plugin-jsx-a11y-native \ - npm-eslint-plugin-no-loops-native \ - npm-eslint-plugin-no-secrets-native \ - npm-eslint-plugin-no-use-extend-native-native \ - npm-eslint-plugin-node-native \ - npm-eslint-plugin-promise-native \ - npm-eslint-plugin-react-native \ - npm-eslint-plugin-security-native \ - npm-eslint-plugin-sql-native \ - npm-eslint-plugin-standard-native \ - npm-eslint-plugin-this-native \ - npm-eslint-plugin-unicorn-native \ - npm-eslint-plugin-vue-native \ - npm-eslint-plugin-xss-native \ - npm-getify-eslint-plugin-proper-arrows-native \ - " - -SRC_URI = "file://configs/eslint-plain.json" - -inherit sca-description -inherit native - -SCA_TOOL_DESCRIPTION = "eslint" - -do_install() { - install -d ${D}/${datadir}/eslint/configs - for _f in ${WORKDIR}/configs/*; do - install ${_f} ${D}/${datadir}/eslint/configs/ - done -} diff --git a/recipes-sca/eslint-native/eslint/configs/eslint-plain.json b/recipes-sca/eslint-native/eslint/configs/eslint-plain.json deleted file mode 100644 index 9b7c02e36e..0000000000 --- a/recipes-sca/eslint-native/eslint/configs/eslint-plain.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "env": { - "browser": true, - "es6": true - }, - "plugins": [ - ], - "extends": [ - "eslint:recommended" - ], - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly" - }, - "parserOptions": { - "ecmaVersion": 2018 - } -} \ No newline at end of file diff --git a/recipes-sca/eslint-native/eslint/eslint.sca.description b/recipes-sca/eslint-native/eslint/eslint.sca.description deleted file mode 100644 index d3d366915e..0000000000 --- a/recipes-sca/eslint-native/eslint/eslint.sca.description +++ /dev/null @@ -1,31 +0,0 @@ -{ - "buildspeed": 4, - "execspeed": 10, - "languages": [ - "javascript" - ], - "uses": [ - "@npm" - ], - "online": true, - "quality": 8, - "scope": [ - "functional" - ], - "score": { - "functional": [ - "eslint.eslint..*" - ] - }, - "test": { - "integration": [ - {"cmd": ["eslint", "--help"], "returncode": 0} - ], - "findings": [ - "bad-javascript" - ], - "no-findings": [ - "openssh" - ] - } -} \ No newline at end of file diff --git a/test/lang_metaoe.txt b/test/lang_metaoe.txt index b4a30ae2cb..54cf73962b 100644 --- a/test/lang_metaoe.txt +++ b/test/lang_metaoe.txt @@ -1,4 +1,3 @@ -eslint htmlhint jshint luacheck