- Linting (ESLint): Check eslintrc file itself

- Linting: Add linting plugins (mocha, chai-expect, chai-friendly, cypress)
- Testing: Change cypress plugins file to ESM (so can set up any needed unit testing tasks)
master
Brett Zamir 2020-02-21 16:34:55 +08:00
parent b1ceb3c911
commit e60812e196
6 changed files with 340 additions and 245 deletions

View File

@ -32,3 +32,4 @@ editor/external/dom-polyfill/*
mochawesome-report mochawesome-report
releases releases
!.eslintrc.js

View File

@ -1,7 +1,9 @@
'use strict';
module.exports = { module.exports = {
extends: ["ash-nazg/sauron-node"], extends: ['ash-nazg/sauron-node'],
parserOptions: { parserOptions: {
sourceType: "module" sourceType: 'module'
}, },
env: { env: {
browser: true browser: true
@ -14,13 +16,13 @@ module.exports = {
// In case we need to extend // In case we need to extend
customTags: [] customTags: []
}, },
augmentsExtendsReplacesDocs: true, augmentsExtendsReplacesDocs: true
// Todo: Figure out why this is not working and why seem to have to // Todo: Figure out why this is not working and why seem to have to
// disable for all Markdown: // disable for all Markdown:
/* /*
baseConfig: { baseConfig: {
rules: { rules: {
"no-multi-spaces": "off" 'no-multi-spaces': 'off'
} }
} }
*/ */
@ -30,30 +32,30 @@ module.exports = {
// Locales have no need for importing outside of SVG-Edit // Locales have no need for importing outside of SVG-Edit
{ {
files: [ files: [
"editor/locale/lang.*.js", "editor/extensions/ext-locale/**", 'editor/locale/lang.*.js', 'editor/extensions/ext-locale/**',
"docs/tutorials/ExtensionDocs.md" 'docs/tutorials/ExtensionDocs.md'
], ],
rules: { rules: {
"import/no-anonymous-default-export": ["off"] 'import/no-anonymous-default-export': ['off']
} }
}, },
// These browser files don't do importing or requiring // These browser files don't do importing or requiring
{ {
files: [ files: [
"editor/svgpathseg.js", "editor/touch.js", "editor/typedefs.js", 'editor/svgpathseg.js', 'editor/touch.js', 'editor/typedefs.js',
"editor/redirect-on-no-module-support.js", 'editor/redirect-on-no-module-support.js',
"editor/extensions/imagelib/index.js", 'editor/extensions/imagelib/index.js',
"editor/external/dom-polyfill/dom-polyfill.js", 'editor/external/dom-polyfill/dom-polyfill.js',
"screencasts/svgopen2010/script.js" 'screencasts/svgopen2010/script.js'
], ],
rules: { rules: {
"import/unambiguous": ["off"] 'import/unambiguous': ['off']
} }
}, },
{ {
files: ['**/*.html', 'screencasts/**'], files: ['**/*.html', 'screencasts/**'],
globals: { globals: {
root: "off" root: 'off'
}, },
settings: { settings: {
polyfills: [ polyfills: [
@ -66,10 +68,19 @@ module.exports = {
'import/unambiguous': 'off' 'import/unambiguous': 'off'
} }
}, },
{
files: '.eslintrc.js',
extends: [
'plugin:node/recommended-script'
],
rules: {
'import/no-commonjs': 0
}
},
// Our Markdown rules (and used for JSDoc examples as well, by way of // Our Markdown rules (and used for JSDoc examples as well, by way of
// our use of `jsdoc/check-examples` within `ash-nazg`) // our use of `jsdoc/check-examples` within `ash-nazg`)
{ {
files: ["**/*.md"], files: ['**/*.md'],
settings: { settings: {
polyfills: [ polyfills: [
// Tutorials // Tutorials
@ -78,28 +89,28 @@ module.exports = {
] ]
}, },
rules: { rules: {
"eol-last": ["off"], 'eol-last': ['off'],
"no-console": ["off"], 'no-console': ['off'],
"no-undef": ["off"], 'no-undef': ['off'],
"no-unused-vars": ["warn"], 'no-unused-vars': ['warn'],
"padded-blocks": ["off"], 'padded-blocks': ['off'],
"import/unambiguous": ["off"], 'import/unambiguous': ['off'],
"import/no-unresolved": ["off"], 'import/no-unresolved': ['off'],
"node/no-missing-import": ["off"], 'node/no-missing-import': ['off'],
"no-multi-spaces": "off", 'no-multi-spaces': 'off',
"sonarjs/no-all-duplicated-branches": "off", 'sonarjs/no-all-duplicated-branches': 'off',
'node/no-unpublished-import': ['error', {allowModules: ['@cypress/fiddle']}], 'node/no-unpublished-import': ['error', {allowModules: ['@cypress/fiddle']}],
"no-alert": "off", 'no-alert': 'off',
// Disable until may fix https://github.com/gajus/eslint-plugin-jsdoc/issues/211 // Disable until may fix https://github.com/gajus/eslint-plugin-jsdoc/issues/211
"indent": "off" indent: 'off'
} }
}, },
// Dis-apply Node rules mistakenly giving errors with browser files, // Dis-apply Node rules mistakenly giving errors with browser files,
// and treating Node global `root` as being present for shadowing // and treating Node global `root` as being present for shadowing
{ {
files: ["editor/**"], files: ['editor/**'],
globals: { globals: {
root: "off" root: 'off'
}, },
settings: { settings: {
polyfills: [ polyfills: [
@ -141,14 +152,14 @@ module.exports = {
] ]
}, },
rules: { rules: {
"node/no-unsupported-features/node-builtins": "off" 'node/no-unsupported-features/node-builtins': 'off'
} }
}, },
// For extensions, `this` is generally assigned to be the more // For extensions, `this` is generally assigned to be the more
// descriptive `svgEditor`; they also have no need for importing outside // descriptive `svgEditor`; they also have no need for importing outside
// of SVG-Edit // of SVG-Edit
{ {
files: ["editor/extensions/**"], files: ['editor/extensions/**'],
settings: { settings: {
polyfills: [ polyfills: [
'console', 'console',
@ -158,19 +169,19 @@ module.exports = {
] ]
}, },
rules: { rules: {
"consistent-this": ["error", "svgEditor"], 'consistent-this': ['error', 'svgEditor'],
"import/no-anonymous-default-export": ["off"] 'import/no-anonymous-default-export': ['off']
} }
}, },
{ {
// Node files // Node files
files: [ files: [
"docs/jsdoc-config.js", 'docs/jsdoc-config.js',
"build/build-html.js", 'build/build-html.js',
"rollup.config.js", "rollup-config.config.js" 'rollup.config.js', 'rollup-config.config.js'
], ],
env: { env: {
node: true, node: true
}, },
settings: { settings: {
polyfills: [ polyfills: [
@ -186,21 +197,21 @@ module.exports = {
// and we have too many modules to add to `peerDependencies` // and we have too many modules to add to `peerDependencies`
// so this rule can know them to be available, so we instead // so this rule can know them to be available, so we instead
// disable // disable
"node/no-unpublished-import": "off" 'node/no-unpublished-import': 'off'
} }
}, },
{ {
// As consumed by jsdoc, cannot be expressed as ESM // As consumed by jsdoc, cannot be expressed as ESM
files: ["docs/jsdoc-config.js"], files: ['docs/jsdoc-config.js'],
parserOptions: { parserOptions: {
sourceType: "script" sourceType: 'script'
}, },
globals: { globals: {
"module": false module: false
}, },
rules: { rules: {
"import/no-commonjs": "off", 'import/no-commonjs': 'off',
"strict": "off" strict: 'off'
} }
}, },
{ {
@ -221,8 +232,22 @@ module.exports = {
} }
}, },
{ {
files: ["cypress/**"], files: ['cypress/plugins/index.js'],
extends: ["plugin:cypress/recommended"], extends: [
'plugin:node/recommended-script'
],
rules: {
'import/no-commonjs': 0
}
},
{
files: ['cypress/**'],
extends: [
'plugin:cypress/recommended',
'plugin:mocha/recommended',
'plugin:chai-friendly/recommended',
'plugin:chai-expect/recommended'
],
env: { env: {
node: true node: true
}, },
@ -239,54 +264,73 @@ module.exports = {
] ]
}, },
rules: { rules: {
// Would be good but seems necessary due to some bugs in Cypress
// in detecting visibility
// 'cypress/no-force': 0,
// Good but would be difficult to enforce (and data-* may not be less
// brittle than IDs/classes anyways)
// 'cypress/require-data-selectors': 0,
'cypress/assertion-before-screenshot': 2,
// Too oppressive when planning to extend a section
'mocha/no-hooks-for-single-case': 0,
// Would be good to enable but needs some refactoring
'mocha/no-setup-in-describe': 0,
// Useful to ensure allowing `this.timeout()`, etc., but a little oppressive
'mocha/no-mocha-arrows': 0,
// Useful if enabling the regular `prefer-arrow-callback`
// 'mocha/prefer-arrow-callback': 2
'jsdoc/require-jsdoc': 0, 'jsdoc/require-jsdoc': 0,
'no-console': 0, 'no-console': 0,
'import/unambiguous': 0, 'import/unambiguous': 0
} }
} }
], ],
rules: { rules: {
// https://github.com/sindresorhus/eslint-plugin-unicorn/issues/453 // https://github.com/sindresorhus/eslint-plugin-unicorn/issues/453
"unicorn/regex-shorthand": 0, 'unicorn/regex-shorthand': 0,
// The Babel transform seems to have a problem converting these // The Babel transform seems to have a problem converting these
"prefer-named-capture-group": "off", 'prefer-named-capture-group': 'off',
// Override these `ash-nazg/sauron` rules which are difficult for us // Override these `ash-nazg/sauron` rules which are difficult for us
// to apply at this time // to apply at this time
"unicorn/prefer-string-slice": "off", 'unicorn/prefer-string-slice': 'off',
"default-case": "off", 'default-case': 'off',
"require-unicode-regexp": "off", 'require-unicode-regexp': 'off',
"max-len": ["off", { 'max-len': ['off', {
ignoreUrls: true, ignoreUrls: true,
ignoreRegExpLiterals: true ignoreRegExpLiterals: true
}], }],
"unicorn/prefer-query-selector": "off", 'unicorn/prefer-query-selector': 'off',
"unicorn/prefer-node-append": "off", 'unicorn/prefer-node-append': 'off',
"unicorn/no-zero-fractions": "off", 'unicorn/no-zero-fractions': 'off',
"jsdoc/require-file-overview": ["error", { 'jsdoc/require-file-overview': ['error', {
tags: { tags: {
file: { file: {
"initialCommentsOnly": true, initialCommentsOnly: true,
"preventDuplicates": true, preventDuplicates: true
}, },
license: { license: {
"initialCommentsOnly": true, initialCommentsOnly: true,
"preventDuplicates": true, preventDuplicates: true
}, },
copyright: { copyright: {
"initialCommentsOnly": true, initialCommentsOnly: true,
"preventDuplicates": true, preventDuplicates: true
}, },
author: { author: {
"initialCommentsOnly": true, initialCommentsOnly: true,
"preventDuplicates": true, preventDuplicates: true
}, },
module: { module: {
"initialCommentsOnly": true, initialCommentsOnly: true,
"preventDuplicates": true, preventDuplicates: true
}, },
exports: { exports: {
"initialCommentsOnly": true, initialCommentsOnly: true,
"preventDuplicates": true, preventDuplicates: true
} }
} }
}] }]

View File

@ -1,5 +1,4 @@
/* globals module, require */ 'use strict';
/* eslint-disable import/no-commonjs */
// *********************************************************** // ***********************************************************
// This example plugins/index.js can be used to load plugins // This example plugins/index.js can be used to load plugins
@ -11,18 +10,7 @@
// https://on.cypress.io/plugins-guide // https://on.cypress.io/plugins-guide
// *********************************************************** // ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to require('@babel/register')({
// the project's config changing) plugins: ['@babel/plugin-transform-modules-commonjs']
});
const codeCoverageTask = require('@cypress/code-coverage/task.js'); module.exports = require('./main.js').default;
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
// https://docs.cypress.io/guides/tooling/code-coverage.html#Install-the-plugin
on('task', codeCoverageTask);
};

16
cypress/plugins/main.js Normal file
View File

@ -0,0 +1,16 @@
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
import codeCoverageTask from '@cypress/code-coverage/task.js';
// eslint-disable-next-line import/no-anonymous-default-export
export default (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
// https://docs.cypress.io/guides/tooling/code-coverage.html#Install-the-plugin
on('task', codeCoverageTask);
};

346
package-lock.json generated
View File

@ -2130,139 +2130,6 @@
"integrity": "sha512-KyqT0kkdxgbGys9mvo/1Mgdt/LGvUFPCZIK9pWPIfOM2mYzMDd/eVYy4sMP1YqvVI129k0alxRyM53H2MAs/Nw==", "integrity": "sha512-KyqT0kkdxgbGys9mvo/1Mgdt/LGvUFPCZIK9pWPIfOM2mYzMDd/eVYy4sMP1YqvVI129k0alxRyM53H2MAs/Nw==",
"dev": true "dev": true
}, },
"@cypress/browserify-preprocessor": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@cypress/browserify-preprocessor/-/browserify-preprocessor-2.1.1.tgz",
"integrity": "sha512-S+0bzZbRsiFbrLkEygu5D0958z4ejio7hWxnO5MoSqD7SmZOmGRpjuZ9RaGcDmL6RWnklNjn8DkpP2s368qCKA==",
"dev": true,
"requires": {
"@babel/core": "7.4.5",
"@babel/plugin-proposal-class-properties": "7.3.0",
"@babel/plugin-proposal-object-rest-spread": "7.3.2",
"@babel/plugin-transform-runtime": "7.2.0",
"@babel/preset-env": "7.4.5",
"@babel/preset-react": "7.0.0",
"@babel/runtime": "7.3.1",
"babel-plugin-add-module-exports": "1.0.0",
"babelify": "10.0.0",
"bluebird": "3.5.3",
"browserify": "16.2.3",
"coffeeify": "3.0.1",
"coffeescript": "1.12.7",
"debug": "4.1.1",
"fs-extra": "7.0.1",
"lodash.clonedeep": "4.5.0",
"watchify": "3.11.1"
},
"dependencies": {
"@babel/core": {
"version": "7.4.5",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz",
"integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
"@babel/generator": "^7.4.4",
"@babel/helpers": "^7.4.4",
"@babel/parser": "^7.4.5",
"@babel/template": "^7.4.4",
"@babel/traverse": "^7.4.5",
"@babel/types": "^7.4.4",
"convert-source-map": "^1.1.0",
"debug": "^4.1.0",
"json5": "^2.1.0",
"lodash": "^4.17.11",
"resolve": "^1.3.2",
"semver": "^5.4.1",
"source-map": "^0.5.0"
}
},
"@babel/plugin-proposal-object-rest-spread": {
"version": "7.3.2",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz",
"integrity": "sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/plugin-syntax-object-rest-spread": "^7.2.0"
}
},
"@babel/preset-env": {
"version": "7.4.5",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.5.tgz",
"integrity": "sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.0.0",
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/plugin-proposal-async-generator-functions": "^7.2.0",
"@babel/plugin-proposal-json-strings": "^7.2.0",
"@babel/plugin-proposal-object-rest-spread": "^7.4.4",
"@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
"@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
"@babel/plugin-syntax-async-generators": "^7.2.0",
"@babel/plugin-syntax-json-strings": "^7.2.0",
"@babel/plugin-syntax-object-rest-spread": "^7.2.0",
"@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
"@babel/plugin-transform-arrow-functions": "^7.2.0",
"@babel/plugin-transform-async-to-generator": "^7.4.4",
"@babel/plugin-transform-block-scoped-functions": "^7.2.0",
"@babel/plugin-transform-block-scoping": "^7.4.4",
"@babel/plugin-transform-classes": "^7.4.4",
"@babel/plugin-transform-computed-properties": "^7.2.0",
"@babel/plugin-transform-destructuring": "^7.4.4",
"@babel/plugin-transform-dotall-regex": "^7.4.4",
"@babel/plugin-transform-duplicate-keys": "^7.2.0",
"@babel/plugin-transform-exponentiation-operator": "^7.2.0",
"@babel/plugin-transform-for-of": "^7.4.4",
"@babel/plugin-transform-function-name": "^7.4.4",
"@babel/plugin-transform-literals": "^7.2.0",
"@babel/plugin-transform-member-expression-literals": "^7.2.0",
"@babel/plugin-transform-modules-amd": "^7.2.0",
"@babel/plugin-transform-modules-commonjs": "^7.4.4",
"@babel/plugin-transform-modules-systemjs": "^7.4.4",
"@babel/plugin-transform-modules-umd": "^7.2.0",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5",
"@babel/plugin-transform-new-target": "^7.4.4",
"@babel/plugin-transform-object-super": "^7.2.0",
"@babel/plugin-transform-parameters": "^7.4.4",
"@babel/plugin-transform-property-literals": "^7.2.0",
"@babel/plugin-transform-regenerator": "^7.4.5",
"@babel/plugin-transform-reserved-words": "^7.2.0",
"@babel/plugin-transform-shorthand-properties": "^7.2.0",
"@babel/plugin-transform-spread": "^7.2.0",
"@babel/plugin-transform-sticky-regex": "^7.2.0",
"@babel/plugin-transform-template-literals": "^7.4.4",
"@babel/plugin-transform-typeof-symbol": "^7.2.0",
"@babel/plugin-transform-unicode-regex": "^7.4.4",
"@babel/types": "^7.4.4",
"browserslist": "^4.6.0",
"core-js-compat": "^3.1.1",
"invariant": "^2.2.2",
"js-levenshtein": "^1.1.3",
"semver": "^5.5.0"
},
"dependencies": {
"@babel/plugin-proposal-object-rest-spread": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz",
"integrity": "sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/plugin-syntax-object-rest-spread": "^7.7.4"
}
}
}
},
"coffeescript": {
"version": "1.12.7",
"resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz",
"integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==",
"dev": true
}
}
},
"@cypress/code-coverage": { "@cypress/code-coverage": {
"version": "1.12.1", "version": "1.12.1",
"resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-1.12.1.tgz", "resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-1.12.1.tgz",
@ -2436,6 +2303,165 @@
"debug": "4.1.1", "debug": "4.1.1",
"safe-marked": "2.0.0", "safe-marked": "2.0.0",
"temp-write": "4.0.0" "temp-write": "4.0.0"
},
"dependencies": {
"@babel/core": {
"version": "7.4.5",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz",
"integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
"@babel/generator": "^7.4.4",
"@babel/helpers": "^7.4.4",
"@babel/parser": "^7.4.5",
"@babel/template": "^7.4.4",
"@babel/traverse": "^7.4.5",
"@babel/types": "^7.4.4",
"convert-source-map": "^1.1.0",
"debug": "^4.1.0",
"json5": "^2.1.0",
"lodash": "^4.17.11",
"resolve": "^1.3.2",
"semver": "^5.4.1",
"source-map": "^0.5.0"
}
},
"@babel/plugin-proposal-object-rest-spread": {
"version": "7.3.2",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz",
"integrity": "sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/plugin-syntax-object-rest-spread": "^7.2.0"
}
},
"@babel/preset-env": {
"version": "7.4.5",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.5.tgz",
"integrity": "sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.0.0",
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/plugin-proposal-async-generator-functions": "^7.2.0",
"@babel/plugin-proposal-json-strings": "^7.2.0",
"@babel/plugin-proposal-object-rest-spread": "^7.4.4",
"@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
"@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
"@babel/plugin-syntax-async-generators": "^7.2.0",
"@babel/plugin-syntax-json-strings": "^7.2.0",
"@babel/plugin-syntax-object-rest-spread": "^7.2.0",
"@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
"@babel/plugin-transform-arrow-functions": "^7.2.0",
"@babel/plugin-transform-async-to-generator": "^7.4.4",
"@babel/plugin-transform-block-scoped-functions": "^7.2.0",
"@babel/plugin-transform-block-scoping": "^7.4.4",
"@babel/plugin-transform-classes": "^7.4.4",
"@babel/plugin-transform-computed-properties": "^7.2.0",
"@babel/plugin-transform-destructuring": "^7.4.4",
"@babel/plugin-transform-dotall-regex": "^7.4.4",
"@babel/plugin-transform-duplicate-keys": "^7.2.0",
"@babel/plugin-transform-exponentiation-operator": "^7.2.0",
"@babel/plugin-transform-for-of": "^7.4.4",
"@babel/plugin-transform-function-name": "^7.4.4",
"@babel/plugin-transform-literals": "^7.2.0",
"@babel/plugin-transform-member-expression-literals": "^7.2.0",
"@babel/plugin-transform-modules-amd": "^7.2.0",
"@babel/plugin-transform-modules-commonjs": "^7.4.4",
"@babel/plugin-transform-modules-systemjs": "^7.4.4",
"@babel/plugin-transform-modules-umd": "^7.2.0",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5",
"@babel/plugin-transform-new-target": "^7.4.4",
"@babel/plugin-transform-object-super": "^7.2.0",
"@babel/plugin-transform-parameters": "^7.4.4",
"@babel/plugin-transform-property-literals": "^7.2.0",
"@babel/plugin-transform-regenerator": "^7.4.5",
"@babel/plugin-transform-reserved-words": "^7.2.0",
"@babel/plugin-transform-shorthand-properties": "^7.2.0",
"@babel/plugin-transform-spread": "^7.2.0",
"@babel/plugin-transform-sticky-regex": "^7.2.0",
"@babel/plugin-transform-template-literals": "^7.4.4",
"@babel/plugin-transform-typeof-symbol": "^7.2.0",
"@babel/plugin-transform-unicode-regex": "^7.4.4",
"@babel/types": "^7.4.4",
"browserslist": "^4.6.0",
"core-js-compat": "^3.1.1",
"invariant": "^2.2.2",
"js-levenshtein": "^1.1.3",
"semver": "^5.5.0"
},
"dependencies": {
"@babel/plugin-proposal-object-rest-spread": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz",
"integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.3",
"@babel/plugin-syntax-object-rest-spread": "^7.8.0"
},
"dependencies": {
"@babel/helper-plugin-utils": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz",
"integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==",
"dev": true
},
"@babel/plugin-syntax-object-rest-spread": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
"integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.0"
}
}
}
}
}
},
"@cypress/browserify-preprocessor": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@cypress/browserify-preprocessor/-/browserify-preprocessor-2.1.1.tgz",
"integrity": "sha512-S+0bzZbRsiFbrLkEygu5D0958z4ejio7hWxnO5MoSqD7SmZOmGRpjuZ9RaGcDmL6RWnklNjn8DkpP2s368qCKA==",
"dev": true,
"requires": {
"@babel/core": "7.4.5",
"@babel/plugin-proposal-class-properties": "7.3.0",
"@babel/plugin-proposal-object-rest-spread": "7.3.2",
"@babel/plugin-transform-runtime": "7.2.0",
"@babel/preset-env": "7.4.5",
"@babel/preset-react": "7.0.0",
"@babel/runtime": "7.3.1",
"babel-plugin-add-module-exports": "1.0.0",
"babelify": "10.0.0",
"bluebird": "3.5.3",
"browserify": "16.2.3",
"coffeeify": "3.0.1",
"coffeescript": "1.12.7",
"debug": "4.1.1",
"fs-extra": "7.0.1",
"lodash.clonedeep": "4.5.0",
"watchify": "3.11.1"
}
},
"babel-plugin-add-module-exports": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.0.tgz",
"integrity": "sha512-m0sMxPL4FaN2K69GQgaRJa4Ny15qKSdoknIcpN+gz+NaJlAW9pge/povs13tPYsKDboflrEQC+/3kfIsONBTaw==",
"dev": true,
"requires": {
"chokidar": "^2.0.4"
}
},
"coffeescript": {
"version": "1.12.7",
"resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz",
"integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==",
"dev": true
}
} }
}, },
"@cypress/listr-verbose-renderer": { "@cypress/listr-verbose-renderer": {
@ -3246,15 +3272,6 @@
"integrity": "sha512-wJqOIreoFiGjvZ1UZvGLAUs8H3QQ3cS833+6ctFcCdr/xFd5oB66mmwGWnwQlBXFFaefRt+KR+m2dY9em2RxVg==", "integrity": "sha512-wJqOIreoFiGjvZ1UZvGLAUs8H3QQ3cS833+6ctFcCdr/xFd5oB66mmwGWnwQlBXFFaefRt+KR+m2dY9em2RxVg==",
"dev": true "dev": true
}, },
"babel-plugin-add-module-exports": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.0.tgz",
"integrity": "sha512-m0sMxPL4FaN2K69GQgaRJa4Ny15qKSdoknIcpN+gz+NaJlAW9pge/povs13tPYsKDboflrEQC+/3kfIsONBTaw==",
"dev": true,
"requires": {
"chokidar": "^2.0.4"
}
},
"babel-plugin-dynamic-import-node": { "babel-plugin-dynamic-import-node": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
@ -5953,6 +5970,18 @@
"integrity": "sha512-uRfJ4d9Fyyvxm6/w++++RSQoXZyERFF0+6zqupgg5Mw/+eG4y19yrptTghJlApntKlPZBpA4XCOIBzJbvLrArQ==", "integrity": "sha512-uRfJ4d9Fyyvxm6/w++++RSQoXZyERFF0+6zqupgg5Mw/+eG4y19yrptTghJlApntKlPZBpA4XCOIBzJbvLrArQ==",
"dev": true "dev": true
}, },
"eslint-plugin-chai-expect": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-chai-expect/-/eslint-plugin-chai-expect-2.1.0.tgz",
"integrity": "sha512-rd0/4mjMV6c3i0o4DKkWI4uaFN9DK707kW+/fDphaDI6HVgxXnhML9Xgt5vHnTXmSSnDhupuCFBgsEAEpchXmQ==",
"dev": true
},
"eslint-plugin-chai-friendly": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.5.0.tgz",
"integrity": "sha512-Pxe6z8C9fP0pn2X2nGFU/b3GBOCM/5FVus1hsMwJsXP3R7RiXFl7g0ksJbsc0GxiLyidTW4mEFk77qsNn7Tk7g==",
"dev": true
},
"eslint-plugin-compat": { "eslint-plugin-compat": {
"version": "3.5.1", "version": "3.5.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-3.5.1.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-3.5.1.tgz",
@ -5992,9 +6021,9 @@
} }
}, },
"eslint-plugin-cypress": { "eslint-plugin-cypress": {
"version": "2.9.0", "version": "2.10.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.9.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.10.3.tgz",
"integrity": "sha512-3x6EQYDB30VHyqFV6leBRf9Zo51FsPWXG+aLtpUSlRtcLGcrbmnfno02E318YYSmGbCJH6K5i+MLCFHBpcyreg==", "integrity": "sha512-CvFeoCquShfO8gHNIKA1VpUTz78WtknMebLemBd1lRbcmJNjwpqCqpQYUG/XVja8GjdX/e2TJXYa+EUBxehtUg==",
"dev": true, "dev": true,
"requires": { "requires": {
"globals": "^11.12.0" "globals": "^11.12.0"
@ -6124,6 +6153,33 @@
"unified": "^6.1.2" "unified": "^6.1.2"
} }
}, },
"eslint-plugin-mocha": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.3.0.tgz",
"integrity": "sha512-Cd2roo8caAyG21oKaaNTj7cqeYRWW1I2B5SfpKRp0Ip1gkfwoR1Ow0IGlPWnNjzywdF4n+kHL8/9vM6zCJUxdg==",
"dev": true,
"requires": {
"eslint-utils": "^2.0.0",
"ramda": "^0.27.0"
},
"dependencies": {
"eslint-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz",
"integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
}
},
"ramda": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.0.tgz",
"integrity": "sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==",
"dev": true
}
}
},
"eslint-plugin-no-unsanitized": { "eslint-plugin-no-unsanitized": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-3.0.2.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-3.0.2.tgz",

View File

@ -14,20 +14,16 @@
}, },
"scripts": { "scripts": {
"add-release": "git submodule add -b \"release-v$VERSION\" https://github.com/SVG-Edit/svgedit.git \"releases/svg-edit-$VERSION\" && git submodule set-branch -b \"release-v$VERSION\" releases/latest", "add-release": "git submodule add -b \"release-v$VERSION\" https://github.com/SVG-Edit/svgedit.git \"releases/svg-edit-$VERSION\" && git submodule set-branch -b \"release-v$VERSION\" releases/latest",
"start-allow-origin": "static -p 8001 -H '{\"Access-Control-Allow-Origin\": \"*\"}'", "start-allow-origin": "static -p 8001 -H '{\"Access-Control-Allow-Origin\": \"*\"}'",
"start-embedded": "run-p start start-allow-origin", "start-embedded": "run-p start start-allow-origin",
"start": "echo \"Open file, e.g., to http://localhost:8000/editor/svg-editor-es.html\" && static -p 8000", "start": "echo \"Open file, e.g., to http://localhost:8000/editor/svg-editor-es.html\" && static -p 8000",
"open-docs-no-start": "open-cli http://localhost:8000/docs/jsdoc/", "open-docs-no-start": "open-cli http://localhost:8000/docs/jsdoc/",
"open-docs": "run-p start open-docs-no-start", "open-docs": "run-p start open-docs-no-start",
"build-docs-remove": "rimraf \"docs/jsdoc/*\"", "build-docs-remove": "rimraf \"docs/jsdoc/*\"",
"build-docs-create": "jsdoc --pedantic -c docs/jsdoc-config.js editor", "build-docs-create": "jsdoc --pedantic -c docs/jsdoc-config.js editor",
"build-docs": "run-s -c build-docs-remove build-docs-create", "build-docs": "run-s -c build-docs-remove build-docs-create",
"build-and-open-docs-no-start": "run-s build-docs open-docs-no-start", "build-and-open-docs-no-start": "run-s build-docs open-docs-no-start",
"build-and-open-docs": "run-s build-docs open-docs", "build-and-open-docs": "run-s build-docs open-docs",
"open-embedded-no-start": "open-cli http://localhost:8000/editor/embedapi.html", "open-embedded-no-start": "open-cli http://localhost:8000/editor/embedapi.html",
"open-embedded": "run-p start-embedded open-embedded-no-start", "open-embedded": "run-p start-embedded open-embedded-no-start",
"open-all-ext-no-start": "open-cli http://localhost:8000/editor/svg-editor-es.html?extensions=ext-arrows.js,ext-closepath.js,ext-foreignobject.js,ext-helloworld.js,ext-mathjax.js,ext-php_savefile.js,ext-server_moinsave.js,ext-server_opensave.js,ext-webappfind.js,ext-xdomain-messaging.js", "open-all-ext-no-start": "open-cli http://localhost:8000/editor/svg-editor-es.html?extensions=ext-arrows.js,ext-closepath.js,ext-foreignobject.js,ext-helloworld.js,ext-mathjax.js,ext-php_savefile.js,ext-server_moinsave.js,ext-server_opensave.js,ext-webappfind.js,ext-xdomain-messaging.js",
@ -36,48 +32,38 @@
"open-compiled": "run-p start open-compiled-no-start", "open-compiled": "run-p start open-compiled-no-start",
"open-no-start": "open-cli http://localhost:8000/editor/svg-editor-es.html", "open-no-start": "open-cli http://localhost:8000/editor/svg-editor-es.html",
"open": "run-p start open-no-start", "open": "run-p start open-no-start",
"open-cov-no-start": "open-cli http://localhost:8000/coverage/", "open-cov-no-start": "open-cli http://localhost:8000/coverage/",
"open-cov": "run-p start open-cov-no-start", "open-cov": "run-p start open-cov-no-start",
"instrument:replace-html": "frs-replace \"../svgedit-config-es.js\" \"svgedit-config-es.js\" -i instrumented/svg-editor-es.html -o instrumented/svg-editor-es.html", "instrument:replace-html": "frs-replace \"../svgedit-config-es.js\" \"svgedit-config-es.js\" -i instrumented/svg-editor-es.html -o instrumented/svg-editor-es.html",
"instrument:replace-js": "frs-replace \"editor/svg-editor.js\" \"svg-editor.js\" -i svgedit-config-es.js -o instrumented/svgedit-config-es.js", "instrument:replace-js": "frs-replace \"editor/svg-editor.js\" \"svg-editor.js\" -i svgedit-config-es.js -o instrumented/svgedit-config-es.js",
"instrument:copy-excluded": "node cypress/support/copy.js", "instrument:copy-excluded": "node cypress/support/copy.js",
"copy-instrumented": "copyfiles -e \"**/*.js\" -u 1 \"editor/**/*\" instrumented && npm run instrument:replace-html && npm run instrument:replace-js && npm run instrument:copy-excluded", "copy-instrumented": "copyfiles -e \"**/*.js\" -u 1 \"editor/**/*\" instrumented && npm run instrument:replace-html && npm run instrument:replace-js && npm run instrument:copy-excluded",
"instrument": "rimraf instrumented && nyc instrument editor instrumented && npm run copy-instrumented", "instrument": "rimraf instrumented && nyc instrument editor instrumented && npm run copy-instrumented",
"report": "nyc report", "report": "nyc report",
"report-summary": "nyc report --reporter=text-summary", "report-summary": "nyc report --reporter=text-summary",
"license-badge": "license-badger --uncategorizedLicenseTemplate \"\\${license} (\\${name} (\\${version}))\" --filteredTypes=nonempty --textTemplate \"License types\n(project, deps, and bundled devDeps)\" --packageJson --production badges/licenses-badge.svg", "license-badge": "license-badger --uncategorizedLicenseTemplate \"\\${license} (\\${name} (\\${version}))\" --filteredTypes=nonempty --textTemplate \"License types\n(project, deps, and bundled devDeps)\" --packageJson --production badges/licenses-badge.svg",
"license-badge-dev": "license-badger --corrections --filteredTypes=nonempty --textTemplate \"License types\n(all devDeps)\" --allDevelopment badges/licenses-badge-dev.svg", "license-badge-dev": "license-badger --corrections --filteredTypes=nonempty --textTemplate \"License types\n(all devDeps)\" --allDevelopment badges/licenses-badge-dev.svg",
"license-badges": "run-p license-badge license-badge-dev", "license-badges": "run-p license-badge license-badge-dev",
"coverage-badge": "coveradge badges/coverage-badge", "coverage-badge": "coveradge badges/coverage-badge",
"compress-images": "imageoptim \"editor/extensions/*.png\" \"editor/spinbtn/*.png\" \"editor/jgraduate/images/*.{png,gif}\" \"editor/images/*.png\"", "compress-images": "imageoptim \"editor/extensions/*.png\" \"editor/spinbtn/*.png\" \"editor/jgraduate/images/*.{png,gif}\" \"editor/images/*.png\"",
"copy": "copyfiles -f node_modules/load-stylesheets/dist/index-es.js editor/external/load-stylesheets && copyfiles -f node_modules/jamilih/dist/jml-es.js editor/external/jamilih && copyfiles -f node_modules/query-result/esm/index.js editor/external/query-result/esm && copyfiles -f node_modules/qr-manipulation/dist/index-es.js editor/external/qr-manipulation/dist && copyfiles -f node_modules/stackblur-canvas/dist/stackblur-es.js editor/external/stackblur-canvas/dist && copyfiles -f node_modules/regenerator-runtime/runtime.js editor/external/regenerator-runtime && copyfiles -f \"node_modules/core-js-bundle//minified*\" editor/external/core-js-bundle && copyfiles -f \"node_modules/underscore/underscore-*\" editor/jspdf && copyfiles -f \"node_modules/deparam/dist/deparam.esm.js\" editor/external/deparam", "copy": "copyfiles -f node_modules/load-stylesheets/dist/index-es.js editor/external/load-stylesheets && copyfiles -f node_modules/jamilih/dist/jml-es.js editor/external/jamilih && copyfiles -f node_modules/query-result/esm/index.js editor/external/query-result/esm && copyfiles -f node_modules/qr-manipulation/dist/index-es.js editor/external/qr-manipulation/dist && copyfiles -f node_modules/stackblur-canvas/dist/stackblur-es.js editor/external/stackblur-canvas/dist && copyfiles -f node_modules/regenerator-runtime/runtime.js editor/external/regenerator-runtime && copyfiles -f \"node_modules/core-js-bundle//minified*\" editor/external/core-js-bundle && copyfiles -f \"node_modules/underscore/underscore-*\" editor/jspdf && copyfiles -f \"node_modules/deparam/dist/deparam.esm.js\" editor/external/deparam",
"remark": "remark -q -f .", "remark": "remark -q -f .",
"build-html": "babel-node --plugins @babel/plugin-transform-modules-commonjs build/build-html.js", "build-html": "babel-node --plugins @babel/plugin-transform-modules-commonjs build/build-html.js",
"eslint-fix": "eslint --fix --ext js,md,html .", "eslint-fix": "eslint --fix --ext js,md,html .",
"eslint": "eslint --ext js,md,html .", "eslint": "eslint --ext js,md,html .",
"rollup": "rollup -c", "rollup": "rollup -c",
"build-by-config": "rollup -c rollup-config.config.js", "build-by-config": "rollup -c rollup-config.config.js",
"prep-no-core-rollup": "run-s eslint build-html build-by-config", "prep-no-core-rollup": "run-s eslint build-html build-by-config",
"prep": "run-s prep-no-core-rollup rollup", "prep": "run-s prep-no-core-rollup rollup",
"prepublishOnly": "npm run prep", "prepublishOnly": "npm run prep",
"cypress:open-no-start": "cypress open", "cypress:open-no-start": "cypress open",
"cypress:open": "run-p start cypress:open-no-start", "cypress:open": "run-p start cypress:open-no-start",
"open-tests": "run-s instrument cypress:open", "open-tests": "run-s instrument cypress:open",
"cypress:merge": "mochawesome-merge \"cypress/results/mochaw*.json\" > mochawesome.json && marge mochawesome.json && mbg --file ./mochawesome.json --badge_output badges/tests-badge.svg", "cypress:merge": "mochawesome-merge \"cypress/results/mochaw*.json\" > mochawesome.json && marge mochawesome.json && mbg --file ./mochawesome.json --badge_output badges/tests-badge.svg",
"cypress:run-only": "rimraf \"cypress/results/mochaw*.json\" && rimraf \".nyc_output/*\" && cypress run", "cypress:run-only": "rimraf \"cypress/results/mochaw*.json\" && rimraf \".nyc_output/*\" && cypress run",
"cypress:run-no-badge": "run-s -c cypress:run-only cypress:merge", "cypress:run-no-badge": "run-s -c cypress:run-only cypress:merge",
"cypress:run": "run-s -c cypress:run-no-badge coverage-badge", "cypress:run": "run-s -c cypress:run-no-badge coverage-badge",
"test-only-no-report": "run-p start cypress:run", "test-only-no-report": "run-p start cypress:run",
"test-only": "run-s -c test-only-no-report report", "test-only": "run-s -c test-only-no-report report",
"test-no-cov-no-core-rollup": "run-s prep-no-core-rollup test-only", "test-no-cov-no-core-rollup": "run-s prep-no-core-rollup test-only",
"test-no-cov": "run-s prep test-only", "test-no-cov": "run-s prep test-only",
@ -150,6 +136,7 @@
"@babel/plugin-transform-modules-commonjs": "^7.8.3", "@babel/plugin-transform-modules-commonjs": "^7.8.3",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3",
"@babel/preset-env": "^7.8.4", "@babel/preset-env": "^7.8.4",
"@babel/register": "^7.8.3",
"@cypress/code-coverage": "^1.12.1", "@cypress/code-coverage": "^1.12.1",
"@cypress/fiddle": "^1.4.0", "@cypress/fiddle": "^1.4.0",
"@mysticatea/eslint-plugin": "^13.0.0", "@mysticatea/eslint-plugin": "^13.0.0",
@ -167,13 +154,16 @@
"eslint-config-ash-nazg": "^17.2.0", "eslint-config-ash-nazg": "^17.2.0",
"eslint-config-standard": "^14.1.0", "eslint-config-standard": "^14.1.0",
"eslint-plugin-array-func": "^3.1.3", "eslint-plugin-array-func": "^3.1.3",
"eslint-plugin-chai-expect": "^2.1.0",
"eslint-plugin-chai-friendly": "^0.5.0",
"eslint-plugin-compat": "^3.5.1", "eslint-plugin-compat": "^3.5.1",
"eslint-plugin-cypress": "^2.9.0", "eslint-plugin-cypress": "^2.10.3",
"eslint-plugin-eslint-comments": "^3.1.2", "eslint-plugin-eslint-comments": "^3.1.2",
"eslint-plugin-html": "^6.0.0", "eslint-plugin-html": "^6.0.0",
"eslint-plugin-import": "^2.20.1", "eslint-plugin-import": "^2.20.1",
"eslint-plugin-jsdoc": "^21.0.0", "eslint-plugin-jsdoc": "^21.0.0",
"eslint-plugin-markdown": "^1.0.1", "eslint-plugin-markdown": "^1.0.1",
"eslint-plugin-mocha": "^6.3.0",
"eslint-plugin-no-unsanitized": "^3.0.2", "eslint-plugin-no-unsanitized": "^3.0.2",
"eslint-plugin-no-use-extend-native": "^0.4.1", "eslint-plugin-no-use-extend-native": "^0.4.1",
"eslint-plugin-node": "^11.0.0", "eslint-plugin-node": "^11.0.0",