|
'use strict';
|
|
|
|
const commonNodeOverrides = {
|
|
rules: {
|
|
'node/no-missing-require': ['error', {
|
|
allowModules: [
|
|
// Disable the node/no-missing-require rule for `require('ep_etherpad-lite/foo')`. It would
|
|
// be nice to warn plugin devs that their plugin is requiring a core Etherpad module that
|
|
// doesn't actually exist, but there is a significant cost to enabling this rule for
|
|
// ep_etherpad-lite: ep_etherpad-lite is a peer dependency for plugins, so a simple `npm i`
|
|
// in the plugin's clone will not install it. Instead, the developer working on the plugin
|
|
// ep_example has to do one of these two things:
|
|
//
|
|
// * Manually clone the etherpad-lite repo, then clone the ep_example repo to
|
|
// `/path/to/etherpad-lite/node_modules/ep_example`. Creating a symlink there that
|
|
// points to the clone's actual location will not work because npm (or maybe Node.js
|
|
// itself?) will resolve the symlink to its physical path before Node.js walks the
|
|
// parent directories in search of ep_etherpad-lite.
|
|
//
|
|
// The biggest flaw with this option: npm loves to quietly nuke anything in
|
|
// `node_modules` that isn't a dependency. There's no easy way to prevent npm from
|
|
// nuking the plugin's clone. "Installing" the plugin via
|
|
// npm install ep_example@file:/path/to/ep_example
|
|
// does not help because installation via `file:` works by creating a symlink in
|
|
// `node_modules`. (Another annoyance: The dev would have to remember to not commit the
|
|
// changes npm makes to `package.json` and `package-lock.json`.)
|
|
//
|
|
// * Manually clone the etherpad-lite repo, then create an `ep_etherpad-lite` symlink
|
|
// inside the plugin's `node_modules` directory that points to
|
|
// `/path/to/etherpad-lite/src`. This is a hack: It assumes Node.js searches the
|
|
// plugin's own `node_modules` directory even though ep_etherpad-lite is a peer
|
|
// dependency. Unfortunately, npm will quietly delete the `ep_etherpad-lite` symlink
|
|
// whenever it runs. To prevent npm from deleting the symlink, ep_etherpad-lite could be
|
|
// "installed" as a dev dependency via:
|
|
// npm install --save-dev ep_etherpad-lite@file:/path/to/etherpad-lite/src
|
|
// The dev would have to remember to not commit the changes npm makes to `package.json`
|
|
// and `package-lock.json`.
|
|
//
|
|
// This exemption is made here in this `plugin.js` file and not in `node.js` because
|
|
// Etherpad code in `etherpad-lite/bin` and `etherpad-lite/tests` already has
|
|
// ep_etherpad-lite available as a dependency (there is no developer burden there).
|
|
//
|
|
// This exemption does not affect node/no-extraneous-require, so a plugin is still required
|
|
// to add `ep_etherpad-lite` to its `peerDependencies` if it requires ep_etherpad-lite.
|
|
//
|
|
// All peer dependencies are similarly troublesome; this is not just an ep_etherpad-lite
|
|
// problem. They should all be listed here to avoid hassle. Unfortunately, this
|
|
// `allowModules` option does not take regular expressions, otherwise we could simply permit
|
|
// `ep_.*`. (Modules beginning with `ep_` are almost certainly going to be peer
|
|
// dependencies.)
|
|
'ep_etherpad-lite',
|
|
],
|
|
}],
|
|
},
|
|
};
|
|
|
|
module.exports = {
|
|
overrides: [
|
|
{
|
|
files: ['**/.eslintrc.js'],
|
|
extends: './node.js',
|
|
},
|
|
{
|
|
files: ['**/*'],
|
|
excludedFiles: ['**/.eslintrc.js', 'static/js/**/*', 'static/tests/frontend/**/*'],
|
|
extends: './node.js',
|
|
...commonNodeOverrides,
|
|
},
|
|
{
|
|
files: ['static/js/**/*'],
|
|
excludedFiles: ['**/.eslintrc.js'],
|
|
extends: './browser.js',
|
|
},
|
|
{
|
|
files: ['static/tests/**/*'],
|
|
excludedFiles: ['**/.eslintrc.js'],
|
|
extends: './tests.js',
|
|
},
|
|
{
|
|
files: ['static/tests/backend/**/*'],
|
|
excludedFiles: ['**/.eslintrc.js'],
|
|
extends: './tests/backend.js',
|
|
...commonNodeOverrides,
|
|
},
|
|
{
|
|
files: ['static/tests/frontend/**/*'],
|
|
excludedFiles: ['**/.eslintrc.js'],
|
|
extends: './tests/frontend.js',
|
|
},
|
|
],
|
|
};
|