From 086e8c611664e4b4585d339645137147afcf6227 Mon Sep 17 00:00:00 2001 From: Ivan Goncharov Date: Tue, 4 May 2021 20:26:58 +0300 Subject: [PATCH] Forbid non-ASCII characters in JS files --- .eslintrc.yml | 3 ++ benchmark/benchmark.js | 2 +- resources/eslint-internal-rules/index.js | 2 + resources/eslint-internal-rules/only-ascii.js | 39 +++++++++++++++++++ resources/eslint-internal-rules/package.json | 6 ++- src/language/__tests__/lexer-test.js | 6 +-- 6 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 resources/eslint-internal-rules/only-ascii.js diff --git a/.eslintrc.yml b/.eslintrc.yml index deb7da11d2..f081008804 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -20,6 +20,7 @@ rules: # See './resources/eslint-internal-rules/README.md' ############################################################################## + internal-rules/only-ascii: error internal-rules/no-dir-import: error ############################################################################## @@ -681,6 +682,7 @@ overrides: no-console: off - files: 'benchmark/**' rules: + internal-rules/only-ascii: [error, { allowEmoji: true }] node/no-sync: off node/no-missing-require: off import/no-nodejs-modules: off @@ -689,6 +691,7 @@ overrides: no-await-in-loop: off - files: 'resources/**' rules: + internal-rules/only-ascii: [error, { allowEmoji: true }] node/no-unpublished-require: off node/no-sync: off import/no-extraneous-dependencies: [error, { devDependencies: true }] diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js index 8b29c28a26..55125a83fa 100644 --- a/benchmark/benchmark.js +++ b/benchmark/benchmark.js @@ -249,7 +249,7 @@ async function runBenchmarks(benchmarks, benchmarkProjects) { if (i === 0) { const { name } = await sampleModule(modulePath); - console.log('⏱️ ' + name); + console.log('⏱ ' + name); } try { diff --git a/resources/eslint-internal-rules/index.js b/resources/eslint-internal-rules/index.js index aaf4e65e74..0aca129d70 100644 --- a/resources/eslint-internal-rules/index.js +++ b/resources/eslint-internal-rules/index.js @@ -1,9 +1,11 @@ 'use strict'; +const onlyASCII = require('./only-ascii'); const noDirImport = require('./no-dir-import'); module.exports = { rules: { + 'only-ascii': onlyASCII, 'no-dir-import': noDirImport, }, }; diff --git a/resources/eslint-internal-rules/only-ascii.js b/resources/eslint-internal-rules/only-ascii.js new file mode 100644 index 0000000000..f5ddbe1b68 --- /dev/null +++ b/resources/eslint-internal-rules/only-ascii.js @@ -0,0 +1,39 @@ +'use strict'; + +module.exports = { + meta: { + schema: [ + { + type: 'object', + properties: { + allowEmoji: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + ], + }, + create: onlyASCII, +}; + +function onlyASCII(context) { + const regExp = + context.options[0]?.allowEmoji === true + ? /[^\p{ASCII}\p{Emoji}]+/gu + : /\P{ASCII}+/gu; + + return { + Program() { + const sourceCode = context.getSourceCode(); + const text = sourceCode.getText(); + + for (const match of text.matchAll(regExp)) { + context.report({ + loc: sourceCode.getLocFromIndex(match.index), + message: `Non-ASCII character "${match[0]}" found.`, + }); + } + }, + }; +} diff --git a/resources/eslint-internal-rules/package.json b/resources/eslint-internal-rules/package.json index 60cbef8ee9..5912b1453e 100644 --- a/resources/eslint-internal-rules/package.json +++ b/resources/eslint-internal-rules/package.json @@ -1,4 +1,8 @@ { "name": "eslint-plugin-graphql-internal", - "version": "0.0.0" + "version": "0.0.0", + "private": true, + "engines": { + "node": ">= 14.0.0" + } } diff --git a/src/language/__tests__/lexer-test.js b/src/language/__tests__/lexer-test.js index 77ae6b629d..32a82ee97f 100644 --- a/src/language/__tests__/lexer-test.js +++ b/src/language/__tests__/lexer-test.js @@ -706,7 +706,7 @@ describe('Lexer', () => { message: 'Syntax Error: Invalid number, expected digit but got: "_".', locations: [{ line: 1, column: 2 }], }); - expectSyntaxError('1ß').to.deep.equal({ + expectSyntaxError('1\u00DF').to.deep.equal({ message: 'Syntax Error: Cannot parse the unexpected character "\\u00DF".', locations: [{ line: 1, column: 2 }], }); @@ -718,10 +718,6 @@ describe('Lexer', () => { message: 'Syntax Error: Invalid number, expected digit but got: "_".', locations: [{ line: 1, column: 6 }], }); - expectSyntaxError('1ß').to.deep.equal({ - message: 'Syntax Error: Cannot parse the unexpected character "\\u00DF".', - locations: [{ line: 1, column: 2 }], - }); }); it('lexes punctuation', () => {