Skip to content
This repository has been archived by the owner on Jan 20, 2022. It is now read-only.

Commit

Permalink
use a linter
Browse files Browse the repository at this point in the history
We have more people contributing to this library now, so adding some
automated consistency is looking more and more important.

Also, this found a few unused variables, which highlighted a bug, albeit
a harmless one: a timer string was being created, but then no timer
being attached to Shrinkwrap loading.  (That's why the reify snapshot is
updated.)  Some other light refactoring was done in a few places to get
eslint to produce a reasonably readable output, and I think mostly for
the improvement of readability.

I don't 100% agree with every choice the linter is making here.
Specifically, I prefer using {} around single-line blocks in some cases,
especially loops, but they are omitted most of the time, so that's the
way I set the config.  Consistency is good though, and this will help us
maintain it.

Linting is set up as a posttest operation, so we can catch things
without having it stubbornly refuse to even run tests until it's all
sparkling.
  • Loading branch information
isaacs committed Sep 28, 2020
1 parent da93ff1 commit 731b5b5
Show file tree
Hide file tree
Showing 30 changed files with 5,013 additions and 2,255 deletions.
206 changes: 206 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
{
"parserOptions": {
"ecmaVersion": 2018,
"ecmaFeatures": {},
"sourceType": "script"
},

"env": {
"es6": true,
"node": true
},

"plugins": [
"import",
"node",
"promise",
"standard"
],

"globals": {
"document": "readonly",
"navigator": "readonly",
"window": "readonly"
},

"rules": {
"accessor-pairs": "error",
"array-bracket-spacing": ["error", "never"],
"arrow-spacing": ["error", { "before": true, "after": true }],
"block-spacing": ["error", "always"],
"brace-style": ["error", "1tbs", { "allowSingleLine": false }],
"camelcase": ["error", { "properties": "never" }],
"comma-dangle": ["error", {
"arrays": "always-multiline",
"objects": "always-multiline",
"imports": "always-multiline",
"exports": "always-multiline",
"functions": "never"
}],
"comma-spacing": ["error", { "before": false, "after": true }],
"comma-style": ["error", "last"],
"computed-property-spacing": ["error", "never"],
"constructor-super": "error",
"curly": ["error", "multi-or-nest"],
"dot-location": ["error", "property"],
"dot-notation": ["error", { "allowKeywords": true }],
"eol-last": "error",
"eqeqeq": ["error", "always", { "null": "ignore" }],
"func-call-spacing": ["error", "never"],
"generator-star-spacing": ["error", { "before": true, "after": true }],
"handle-callback-err": ["error", "^(err|error)$" ],
"indent": ["error", 2, {
"SwitchCase": 1,
"VariableDeclarator": 1,
"outerIIFEBody": 1,
"MemberExpression": 1,
"FunctionDeclaration": { "parameters": 1, "body": 1 },
"FunctionExpression": { "parameters": 1, "body": 1 },
"CallExpression": { "arguments": 1 },
"ArrayExpression": 1,
"ObjectExpression": 1,
"ImportDeclaration": 1,
"flatTernaryExpressions": true,
"ignoreComments": false,
"ignoredNodes": ["TemplateLiteral *"]
}],
"key-spacing": ["error", { "beforeColon": false, "afterColon": true }],
"keyword-spacing": ["error", { "before": true, "after": true }],
"lines-between-class-members": ["error", "always", { "exceptAfterSingleLine": true }],
"new-cap": ["error", { "newIsCap": true, "capIsNew": false, "properties": true }],
"new-parens": "error",
"no-array-constructor": "error",
"no-async-promise-executor": "error",
"no-caller": "error",
"no-case-declarations": "error",
"no-class-assign": "error",
"no-compare-neg-zero": "error",
"no-cond-assign": "off",
"no-const-assign": "error",
"no-constant-condition": ["error", { "checkLoops": false }],
"no-control-regex": "error",
"no-debugger": "error",
"no-delete-var": "error",
"no-dupe-args": "error",
"no-dupe-class-members": "error",
"no-dupe-keys": "error",
"no-duplicate-case": "error",
"no-empty-character-class": "error",
"no-empty-pattern": "error",
"no-eval": "error",
"no-ex-assign": "error",
"no-extend-native": "error",
"no-extra-bind": "error",
"no-extra-boolean-cast": "error",
"no-extra-parens": ["error", "functions"],
"no-fallthrough": "error",
"no-floating-decimal": "error",
"no-func-assign": "error",
"no-global-assign": "error",
"no-implied-eval": "error",
"no-inner-declarations": ["error", "functions"],
"no-invalid-regexp": "error",
"no-irregular-whitespace": "error",
"no-iterator": "error",
"no-labels": ["error", { "allowLoop": false, "allowSwitch": false }],
"no-lone-blocks": "error",
"no-misleading-character-class": "error",
"no-prototype-builtins": "error",
"no-useless-catch": "error",
"no-mixed-operators": "off",
"no-mixed-spaces-and-tabs": "error",
"no-multi-spaces": "error",
"no-multi-str": "error",
"no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 0 }],
"no-negated-in-lhs": "error",
"no-new": "off",
"no-new-func": "error",
"no-new-object": "error",
"no-new-require": "error",
"no-new-symbol": "error",
"no-new-wrappers": "error",
"no-obj-calls": "error",
"no-octal": "error",
"no-octal-escape": "error",
"no-path-concat": "error",
"no-proto": "error",
"no-redeclare": ["error", { "builtinGlobals": false }],
"no-regex-spaces": "error",
"no-return-assign": "off",
"no-self-assign": "off",
"no-self-compare": "error",
"no-sequences": "error",
"no-shadow-restricted-names": "error",
"no-sparse-arrays": "error",
"no-tabs": "error",
"no-template-curly-in-string": "error",
"no-this-before-super": "error",
"no-throw-literal": "off",
"no-trailing-spaces": "error",
"no-undef": "error",
"no-undef-init": "error",
"no-unexpected-multiline": "error",
"no-unmodified-loop-condition": "error",
"no-unneeded-ternary": ["error", { "defaultAssignment": false }],
"no-unreachable": "error",
"no-unsafe-finally": 0,
"no-unsafe-negation": "error",
"no-unused-expressions": ["error", { "allowShortCircuit": true, "allowTernary": true, "allowTaggedTemplates": true }],
"no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true }],
"no-use-before-define": ["error", { "functions": false, "classes": false, "variables": false }],
"no-useless-call": "error",
"no-useless-computed-key": "error",
"no-useless-constructor": "error",
"no-useless-escape": "error",
"no-useless-rename": "error",
"no-useless-return": "error",
"no-void": "error",
"no-whitespace-before-property": "error",
"no-with": "error",
"object-curly-newline": "off",
"object-curly-spacing": "off",
"object-property-newline": ["error", { "allowMultiplePropertiesPerLine": true }],
"one-var": ["error", { "initialized": "never" }],
"operator-linebreak": "off",
"padded-blocks": ["error", { "blocks": "never", "switches": "never", "classes": "never" }],
"prefer-const": ["error", {"destructuring": "all"}],
"prefer-promise-reject-errors": "error",
"quote-props": ["error", "as-needed"],
"quotes": ["error", "single", { "avoidEscape": true, "allowTemplateLiterals": true }],
"rest-spread-spacing": ["error", "never"],
"semi": ["error", "never"],
"semi-spacing": ["error", { "before": false, "after": true }],
"space-before-blocks": ["error", "always"],
"space-before-function-paren": ["error", "always"],
"space-in-parens": ["error", "never"],
"space-infix-ops": "error",
"space-unary-ops": ["error", { "words": true, "nonwords": false }],
"spaced-comment": ["error", "always", {
"line": { "markers": ["*package", "!", "/", ",", "="] },
"block": { "balanced": true, "markers": ["*package", "!", ",", ":", "::", "flow-include"], "exceptions": ["*"] }
}],
"symbol-description": "error",
"template-curly-spacing": ["error", "never"],
"template-tag-spacing": ["error", "never"],
"unicode-bom": ["error", "never"],
"use-isnan": "error",
"valid-typeof": ["error", { "requireStringLiterals": true }],
"wrap-iife": ["error", "any", { "functionPrototypeMethods": true }],
"yield-star-spacing": ["error", "both"],
"yoda": ["error", "never"],

"import/export": "error",
"import/first": "error",
"import/no-absolute-path": ["error", { "esmodule": true, "commonjs": true, "amd": false }],
"import/no-duplicates": "error",
"import/no-named-default": "error",
"import/no-webpack-loader-syntax": "error",

"node/no-deprecated-api": "error",
"node/process-exit-as-throw": "error",

"promise/param-names": "off",

"standard/no-callback-literal": "error"
}
}
16 changes: 6 additions & 10 deletions lib/add-rm-pkg-deps.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,22 @@ const removeFromOthers = (name, type, pkg) => {
break
}

for (const other of others) {
for (const other of others)
deleteSubKey(pkg, other, name)
}
}

const add = ({pkg, add, saveBundle, saveType}) => {
for (const spec of add) {
for (const spec of add)
addSingle({pkg, spec, saveBundle, saveType})
}

return pkg
}

const addSingle = ({pkg, spec, saveBundle, saveType}) => {
if (!saveType)
saveType = getSaveType(pkg, spec)

const {name, rawSpec, type: specType, fetchSpec } = spec
const { name, rawSpec } = spec
removeFromOthers(name, saveType, pkg)
const type = saveType === 'prod' ? 'dependencies'
: saveType === 'dev' ? 'devDependencies'
Expand All @@ -51,9 +50,8 @@ const addSingle = ({pkg, spec, saveBundle, saveType}) => {
: /* istanbul ignore next */ null

pkg[type] = pkg[type] || {}
if (rawSpec !== '' || pkg[type][name] === undefined) {
if (rawSpec !== '' || pkg[type][name] === undefined)
pkg[type][name] = rawSpec || '*'
}

if (saveType === 'peer' || saveType === 'peerOptional') {
const pdm = pkg.peerDependenciesMeta || {}
Expand All @@ -78,7 +76,6 @@ const getSaveType = (pkg, spec) => {
const {name} = spec
const {
// these names are so lonnnnngggg
dependencies: deps,
devDependencies: devDeps,
optionalDependencies: optDeps,
peerDependencies: peerDeps,
Expand Down Expand Up @@ -114,9 +111,8 @@ const rm = (pkg, rm) => {
'peerDependenciesMeta',
'devDependencies',
]) {
for (const name of rm) {
for (const name of rm)
deleteSubKey(pkg, type, name)
}
}
if (pkg.bundleDependencies) {
pkg.bundleDependencies = pkg.bundleDependencies
Expand Down
4 changes: 2 additions & 2 deletions lib/arborist/audit.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// mixin implementing the audit method

const Reifier = require('./reify.js')
const AuditReport = require('../audit-report.js')

// shared with reify
Expand All @@ -9,11 +8,12 @@ const _global = Symbol.for('global')
module.exports = cls => class Auditor extends cls {
async audit (options = {}) {
this.addTracker('audit')
if (this[_global])
if (this[_global]) {
throw Object.assign(
new Error('`npm audit` does not support testing globals'),
{ code: 'EAUDITGLOBAL' }
)
}

// allow the user to set options on the ctor as well.
// XXX: deprecate separate method options objects.
Expand Down
Loading

0 comments on commit 731b5b5

Please sign in to comment.