1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- 'use strict';
- const {methodCallSelector, STATIC_REQUIRE_SELECTOR} = require('./selectors/index.js');
- const MESSAGE_ID = 'no-process-exit';
- const messages = {
- [MESSAGE_ID]: 'Only use `process.exit()` in CLI apps. Throw an error instead.',
- };
- const importWorkerThreadsSelector = [
- // `require('worker_threads')`
- [
- STATIC_REQUIRE_SELECTOR,
- '[arguments.0.value="worker_threads"]',
- ].join(''),
- // `import workerThreads from 'worker_threads'`
- [
- 'ImportDeclaration',
- '[source.type="Literal"]',
- '[source.value="worker_threads"]',
- ].join(''),
- ].join(', ');
- const processOnOrOnceCallSelector = methodCallSelector({
- object: 'process',
- methods: ['on', 'once'],
- minimumArguments: 1,
- });
- const processExitCallSelector = methodCallSelector({
- object: 'process',
- method: 'exit',
- });
- /** @param {import('eslint').Rule.RuleContext} context */
- const create = context => {
- const startsWithHashBang = context.getSourceCode().lines[0].indexOf('#!') === 0;
- if (startsWithHashBang) {
- return {};
- }
- let processEventHandler;
- // Only report if it's outside an worker thread context. See #328.
- let requiredWorkerThreadsModule = false;
- const problemNodes = [];
- return {
- // Check `worker_threads` require / import
- [importWorkerThreadsSelector]() {
- requiredWorkerThreadsModule = true;
- },
- // Check `process.on` / `process.once` call
- [processOnOrOnceCallSelector](node) {
- processEventHandler = node;
- },
- // Check `process.exit` call
- [processExitCallSelector](node) {
- if (!processEventHandler) {
- problemNodes.push(node);
- }
- },
- 'CallExpression:exit'(node) {
- if (node === processEventHandler) {
- processEventHandler = undefined;
- }
- },
- * 'Program:exit'() {
- if (!requiredWorkerThreadsModule) {
- for (const node of problemNodes) {
- yield {
- node,
- messageId: MESSAGE_ID,
- };
- }
- }
- },
- };
- };
- /** @type {import('eslint').Rule.RuleModule} */
- module.exports = {
- create,
- meta: {
- type: 'suggestion',
- docs: {
- description: 'Disallow `process.exit()`.',
- },
- messages,
- },
- };
|