@putout/plugin-nodejs 
Node.js is an open-source, cross-platform, JavaScript runtime environment.
(c) Nodejs.org
🐊Putout plugin adds ability to transform to new Node.js API and apply best practices.
Install
npm i putout @putout/plugin-nodejs -D
Rules
- ✅ add-node-prefix;
- ✅ add-missing-strict-mode;
- ✅ convert-buffer-to-buffer-alloc;
- ✅ convert-commonjs-to-esm;
- ✅ convert-dirname-to-url;
- ✅ convert-esm-to-commonjs;
- ✅ convert-exports-to-module-exports;
- ✅ convert-fs-promises;
- ✅ convert-promisify-to-fs-promises;
- ✅ convert-top-level-return;
- ✅ convert-url-to-dirname;
- ✅ declare;
- ✅ declare-after-require;
- ✅ group-require-by-id;
- ✅ remove-process-exit;
- ✅ remove-useless-promisify;
- ✅ rename-file-cjs-to-js;
- ✅ rename-file-mjs-to-js;
- ✅ remove-useless-strict-mode;
- ✅ remove-illegal-strict-mode;
- ✅ cjs-file;
- ✅ mjs-file;
Config
{
"rules": {
"nodejs/convert-commonjs-to-esm": "off",
"nodejs/convert-esm-to-commonjs": "off",
"nodejs/cjs-file": "off",
"nodejs/mjs-file": "off",
"nodejs/rename-file-cjs-to-js": "off",
"nodejs/rename-file-mjs-to-js": "off",
"nodejs/add-node-prefix": "on",
"nodejs/convert-buffer-to-buffer-alloc": "on",
"nodejs/convert-fs-promises": "on",
"nodejs/convert-promisify-to-fs-promises": "on",
"nodejs/convert-dirname-to-url": "on",
"nodejs/convert-exportst-to-module-exports": "on",
"nodejs/convert-url-to-dirname": "on",
"nodejs/convert-top-level-return": "on",
"nodejs/declare": "on",
"nodejs/declare-after-require": "on",
"nodejs/group-require-by-id": "on",
"nodejs/remove-process-exit": "on",
"nodejs/add-missing-strict-mode": "on",
"nodejs/remove-useless-strict-mode": "on",
"nodejs/remove-illegal-strict-mode": "on",
"nodejs/remove-useless-promisify": "on"
}
}
add-node-prefix
Denosupports using Node.js built-in modules such asfs,path,process, and many more vianode: specifiers.(c) deno.land
Check out in 🐊Putout Editor.
❌ Example of incorrect code
import fs from 'fs';
const path = require('path');
await import('path');
✅ Example of correct code
import fs from 'node:fs';
const path = require('node:path');
await import('node:path');
Comparison
| Linter | Rule | Fix |
|---|---|---|
| 🐊 Putout | apply-node-prefix |
✅ |
| ⏣ ESLint | prefer-node-protocol |
✅ |
convert-buffer-to-buffer-alloc
The
Buffer()function andnew Buffer()constructor are deprecated due to API usability issues that can lead to accidental security issues.(c) DEP0005
Check out in 🐊Putout Editor.
❌ Example of incorrect code
const n = 100;
const buf = [];
new Buffer(123);
new Buffer(n);
new Buffer('hello');
new Buffer([]);
new Buffer(buf);
✅ Example of correct code
const n = 100;
const buf = [];
Buffer.alloc(123);
Buffer.alloc(n);
Buffer.from('hello');
Buffer.from([]);
Buffer.from(buf);
convert-fs-promises
Convert fs.promises into form that will be simpler to use and convert to and from ESM.
❌ Example of incorrect code
const {readFile} = require('fs').promises;
✅ Example of correct code
const {readFile} = require('fs/promises');
convert-promisify-to-fs-promises
❌ Example of incorrect code
const fs = require('fs');
const readFile = promisify(fs.readFile);
✅ Example of correct code
const {readFile} = require('fs/promises');
convert-dirname-to-url
Only for ESM.
❌ Example of incorrect code
const {join} = require('path');
const path = require('path');
const file1 = join(__dirname, '../../package.json');
const file2 = path.join(__dirname, '../../package.json');
✅ Example of correct code
const file1 = new URL('../../package.json', import.meta.url);
const file2 = new URL('../../package.json', import.meta.url);
convert-url-to-dirname
Only for CommonJS.
❌ Example of incorrect code
const {readFile} = require('fs/promises');
const file = new URL('../../package.json', import.meta.url);
✅ Example of correct code
const {readFile} = require('fs/promises');
const {join} = require('path');
const file = join(__dirname, '../../package.json');
remove-process-exit
In most cases process.exit() is called from bin directory, if not - disable this rule using match.
-process.exit();
convert-exports-to-module-exports
Since exports = 5 wan't make any export, just change value of variable.
Checkout in 🐊Putout Editor.
❌ Example of incorrect code
exports.x = 5;
✅ Example of correct code
module.exports.x = 5;
convert-top-level-return
❌ Example of incorrect code
return;
✅ Example of correct code
process.exit();
declare
Add declarations to built-in node.js modules:
Based on @putout/operator-declare.
❌ Example of incorrect code
await readFile('hello.txt', 'utf8');
✅ Example of correct code
import {readFile} from 'fs/promises';
await readFile('hello.txt', 'utf8');
When you want to skip some declaration use dismiss:
{
"rules": {
"nodejs/declare": ["on", {
"dismiss": ["readFile"]
}]
}
}
declare-after-require
Node.js follows the CommonJS module system, and the builtin
requirefunction is the easiest way to include modules that exist in separate files. The basic functionality ofrequireis that it reads a JavaScript file, executes the file, and then proceeds to return theexportsobject.(c) Nodejs.org
Check out in 🐊Putout Editor.For ESM use esm/declare-imports-first.
❌ Example of incorrect code
const name = 'hello.txt';
const {readFile} = require('fs/promises');
✅ Example of correct code
const {readFile} = require('fs/promises');
const name = 'hello.txt';
convert-commonjs-to-esm
Convert CommonJS EcmaScript Modules.
EcmaScript module syntax is the standard way to import and export values between files in JavaScript. The
importstatement can be used to reference a value exposed by theexportstatement in another file.(c) parceljs
require
❌ Example of incorrect code
const {join} = require('path');
const args = require('minimist')({
string: ['a', 'b'],
});
✅ Example of correct code
import {join} from 'path';
import minimist from 'minimist';
const args = minimist({
string: ['a', 'b'],
});
exports
❌ Example of incorrect code
module.exports = () => {};
✅ Example of correct code
export default () => {};
Commons
❌ Example of incorrect code
const {readFile} = require('fs/promises');
await readFile(__filename);
✅ Example of correct code
import {readFile} from 'fs/promises';
import {fileURLToPath} from 'url';
const __filename = fileURLToPath(import.meta.url);
await readFile(__filename);
group-require-by-id
Checkout in 🐊Putout Editor. For ESM use esm/group-imports-by-sources.
❌ Example of incorrect code
const ss = require('../../bb/ss');
const d = require('../hello');
const react = require('react');
const {lodash} = require('lodash');
const fs = require('node:fs');
const b = require('./ss');
const m = require(x);
const c = 5;
✅ Example of correct code
const fs = require('node:fs');
const react = require('react');
const {lodash} = require('lodash');
const ss = require('../../bb/ss');
const d = require('../hello');
const b = require('./ss');
const m = require(x);
const c = 5;
convert-esm-to-commonjs
CommonJS is a module system supported in Node, it provides a
requirefunction, which can be used to access theexportsobject exposed by another file.(c) parceljs
Convert EcmaScript Modules to CommonJS.
❌ Example of incorrect code
import hello from 'world';
✅ Example of correct code
const hello = require('world');
cjs-file
Run convert-esm-to-commonjs for all *.cjs files with help of redlint.
Check out in 🐊Putout Editor.
mjs-file
Run convert-commonjs-to-esm for all *.cjs files with help of redlint.
Check out in 🐊Putout Editor.
rename-file-cjs-to-js
Rename *.cjs files when type === "commonjs":
/
|-- package.json
`-- lib/
- `-- hello.cjs
+ `-- hello.js
Check out in 🐊Putout Editor.
rename-file-mjs-to-js
Rename *.mjs files when type === "module":
/
|-- package.json
`-- lib/
- `-- hello.mjs
+ `-- hello.js
Check out in 🐊Putout Editor.
add-missing-strict-mode
Strict mode makes several changes to normal JavaScript semantics:
- Eliminates some JavaScript silent errors by changing them to throw errors.
- Fixes mistakes that make it difficult for JavaScript engines to perform optimizations: strict mode code can sometimes be made to run faster than identical code that's not strict mode.
- Prohibits some syntax likely to be defined in future versions of ECMAScript.
(c) MDN
Add strict mode to CommonJS:
❌ Example of incorrect code
const a = require('b');
✅ Example of correct code
'strict mode';
const a = require('b');
✅ Example of correct code
remove-useless-strict-mode
Remove 'use strict' from ESM.
❌ Example of incorrect code
'strict mode';
import a from 'b';
✅ Example of correct code
import a from 'b';
remove-illegal-strict-mode
SyntaxError: "use strict" not allowed in function with non-simple parametersThe JavaScript exception"use strict" not allowed in functionoccurs when ause strictdirective is used at the top of a function with default parameters, rest parameters, or destructuring parameters.(c) MDN
Checkout in 🐊Putout Editor.
❌ Example of incorrect code
function x1(...a) {
'use strict';
}
function x2(a, b = 3) {
'use strict';
}
function x3({a}) {
'use strict';
}
function x4([a]) {
'use strict';
}
function x5(...a) {
'use strict';
}
✅ Example of correct code
function x1(...a) {}
function x2(a, b = 3) {}
function x3({a}) {}
function x4([a]) {}
function x5(...a) {}
remove-useless-promisify
Takes a function following the common error-first callback style, i.e. taking an (err, value) => ... callback as the last argument, and returns a version that returns promises.
(c) nodejs.org
Remove useless promisify(). Checkout in 🐊Putout Editor.
❌ Example of incorrect code
export const readSize = promisify(async (dir, options, callback) => {});
✅ Example of correct code
export const readSize = async (dir, options, callback) => {};
License
MIT