@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
Options
{
"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/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/remove-process-exit": "on",
"nodejs/strict-mode": "on"
}
}
add-node-prefix
Deno
supports using Node.js built-in modules such as fs
, path
, process
, and many more via node
: specifiers.
(c) deno.land
Check out in πPutout Editor.
β Example of incorrect code
import fs from 'fs';
β
Example of correct code
import fs from 'node:fs';
convert-buffer-to-buffer-alloc
The Buffer()
function and new 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 require
function is the easiest way to include modules that exist in separate files. The basic functionality of require
is that it reads a JavaScript file, executes the file, and then proceeds to return the exports
object.
(c) Nodejs.org
Check out in πPutout Editor.
β 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 import
statement can be used to reference a value exposed by the export
statement 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);
convert-esm-to-commonjs
CommonJS is a module system supported in Node, it provides a require
function, which can be used to access the exports
object 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 module !== "module"
:
/
|-- package.json
`-- lib/
- `-- hello.cjs
+ `-- hello.js
Check out in πPutout Editor.
rename-file-mjs-to-js
Rename *.mjs
files when module === "module"
:
/
|-- package.json
`-- lib/
- `-- hello.mjs
+ `-- hello.js
Check out in πPutout Editor.
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, and remove from ESM, where it enabled by default.
β Example of incorrect code
ESM:
'strict mode';
import a from 'b';
CommonJS:
const a = require('b');
β
Example of correct code
ESM:
import a from 'b';
CommonJS:
'strict mode';
const a = require('b');
License
MIT