|
|
- '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',
- },
- ],
- };
|