@putout/plugin-nodejs
v13.1.1
Published
๐Putout plugin adds ability to transform code to new API of Node.js
Downloads
57,749
Maintainers
Readme
@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-commons;
- โ convert-commonjs-to-esm-exports;
- โ convert-commonjs-to-esm-require;
- โ convert-commonjs-to-esm.js;
- โ 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
Deno
supports 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
require
function is the easiest way to include modules that exist in separate files. The basic functionality ofrequire
is that it reads a JavaScript file, executes the file, and then proceeds to return theexports
object.(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
import
statement can be used to reference a value exposed by theexport
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);
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
require
function, which can be used to access theexports
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 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 parameters
The JavaScript exception"use strict" not allowed in function
occurs when ause strict
directive 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