diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 59ecb133..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = { - root: true, - extends: ["eslint:recommended"], - parserOptions: { - ecmaVersion: "latest", - }, - env: { - es6: true, - node: true, - }, - rules: { - "arrow-spacing": "error", - "brace-style": ["error", "1tbs"], - "keyword-spacing": "error", - "object-curly-spacing": ["error", "always"], - "semi": ["error", "always"], - }, - overrides: [ - { - files: ["**/*.mjs"], - parserOptions: { - sourceType: "module", - }, - } - ] -}; diff --git a/delegates.txt b/delegates.txt index 3560eb48..b4028b10 100644 --- a/delegates.txt +++ b/delegates.txt @@ -1,3 +1,5 @@ +# This file is generated and is not the canonical source; edit https://github.com/tc39/data/blob/HEAD/data/delegates/index.json instead. + Aakash Patel (AVP) Aaron Davis (ADS) Abdelrahman Awad (AAD) @@ -15,9 +17,9 @@ Alberto Tontoni (ATI) Alessia Bellisario (AMB) Alex Rattray (ARY) Alex Russell (AR) -Alex Vincent (AVT) Alexander Akait (AAT) -Alexey Shvayka (ASH) +Alexander J. Vincent (AVT) +Alexey Shvaika (ASH) Aliaksander Palpko (APO) Alissa Renz (ARZ) Allen Wirfs-Brock (AWB) @@ -54,12 +56,12 @@ Avik Chaudhuri (AVC) Axel Rauschmayer (ARR) Aysegul Yonet (AYS) Ben Allen (BAN) -Ben Coe (BCE) Ben Lichtman (BLN) Ben Lickly (BLY) Ben Newman (BN) Ben Smith (BS) Ben Titzer (BTR) +Benjamin E. Coe (BCE) Benjamin Georges (BGS) Benoit Girard (BGD) Bernd Mathiske (BM) @@ -112,20 +114,20 @@ Cristian Mattarei (CMI) Dale Bustad (DBD) Damien Engels (DES) Dan Abramov (DAV) -Dan Chao (DHC) Dan Clark (DDC) Dan Finlay (DJF) Dan Gohman (DGN) Dan Lapid (DLP) -Dan Minor (DLM) Dan Stefan (DAS) +Daniel Chao (DHC) Daniel Clifford (DCD) Daniel Ehrenberg (DE) Daniel Griesser (DGR) +Daniel Minor (DLM) Daniel Rosenwasser (DRR) Daniel Veditz (DVE) Daniele Bonetta (DBA) -Danilo Françoso Tedeschi (DFT) +Danilo Francoso Tedeschi (DFT) Dave Herman (DH) Dave Poole (DMP) David Enke (DEN) @@ -163,7 +165,7 @@ Erica Pramer (EPR) Erik Arvidsson (EA) Erik Marks (REK) Ethan Arrowood (EAD) -Evan B. Winslow (EBW) +Evan Winslow (EBW) Even Stensberg (ESG) Fabio Niephaus (FNS) Fabio Rocha (FRA) @@ -171,10 +173,11 @@ Federico Bucchi (FED) Felipe Balbontín (FBN) Filip Pizlo (FP) Forrest Norvell (FN) -Francisco Tolmasky (FRT) +Francisco Ryan Tolmasky I (FRT) Frank Yung-Fong Tang (FYT) Franziska Hinkelmann (FHN) Frederik Braun (FDY) +Frivalszky-Mayer Péter (PFM) Gabriel Isenberg (GI) Gabriel McAdams (GMS) Gary Chang (GCG) @@ -192,23 +195,27 @@ Guilherme Hermeto (GHO) Gus Caplan (GCL) Gustavo Tonietto (GTO) Guy Bedford (GB) -He Zhou (HZO) +Harry Chen (CZY) +HE Shi-Jun (JHX) Hemanth HM (HHM) Henri Sivonen (HJS) Henry Zhu (HZU) Holger Benl (HBL) +Huáng Jùnliàng (JLH) Hubert Manilla (HBM) Hugo van der Merwe (HUG) Iain Ireland (IID) Ian Halliday (IH) +Ian Tse (XWC) Igor Minar (IMR) Ilias Tsangaris (IT) Ilya Grigorik (IGK) -Ioanna M. Dimitriou H. (IOA) +Ioanna M Dimitriou H (IOA) Isaac Durazo (IDO) Isaac Schlueter (ISR) Isabelle Valet-Harper (IVH) István Sebestyén (IS) +J. S. Choi (JSC) Jack Steinberg (JBS) Jack Works (JWK) Jacob Groundwater (JBG) @@ -220,11 +227,12 @@ Jake Archibald (JAD) Jakob Kummerow (JKW) James Burke (JRB) James M Snell (JSL) +James Yang (YJM) Jamie Kyle (JK) Jamund Ferguson (JXF) Jan de Mooij (JDM) Jan Olaf Martin (JOM) -Jan Stola (JSA) +Jan Štola (JSA) Jason Nutter (JAN) Jason Orendorff (JTO) Jason Williams (JWS) @@ -235,16 +243,15 @@ Jatin Ramanathan (JRA) Jean-Francois Paradis (JFP) Jeff Long (JHL) Jeff Morrison (JM) +Jeff Posnick (JPO) Jeff Walden (JSW) -Jeffrey Posnick (JPO) Jem Young (JZY) Jenna Zeigen (JAZ) Jesse Alama (JMN) Jessica Sachs (JSS) JF Bastien (JFB) Jihyeok Park (JHP) -Jiming Yang (YJM) -Jirka Marsik (JMK) +Jirka Maršík (JMK) Joe Lencioni (JLI) Joe Mordetsky (JMY) Joe Sepi (JSI) @@ -252,17 +259,16 @@ Joel Marcey (JMA) Joffrey Richten (JRN) Johan Røed (JRD) John Buchanan (JB) -John Hax (JHX) John Lenz (JLZ) John McCutchan (JMC) John Neumann (JN) John Pampuch (JP) John-David Dalton (JDD) +Jon Kuperman (JKP) Jonas Haukenes (JHS) Jonas Kruckenberg (JKR) Jonathan Dallas (JDS) Jonathan Keslin (JKN) -Jonathan Kuperman (JKP) Jonathan Sampson (JSN) Jonathan Turner (JT) Jordan Gensler (JGR) @@ -273,19 +279,17 @@ Jose David Rodrigues Veloso (JVO) Josh Blaney (JPB) Josh Goldberg (JKG) Joshua Peek (JPK) -Joshua S. Choi (JSC) Jovonni Smith-Martinez (JSM) Joyee Cheung (JCG) Juan Dopazo (JDO) Julien Gilli (JGI) -Jùnliàng Huáng (JLH) Justin Fagnani (JFI) Justin Grant (JGT) Justin Ridgewell (JRL) Kai Gong (KGO) Kai Tamkun (KWT) Kamil Ogórek (KOK) -Kat Z. Marchán (KZM) +Kat Marchán (KZM) Katie Broida (KBA) Kawika Bader (KBR) Keith Cirkel (KCL) @@ -305,14 +309,15 @@ Kristen Hewell Garrett (KHG) Krzysztof Kotowicz (KOT) Kyle Barron-Kraus (KBK) Kyle Verrier (KVR) -Lars Hansen (LHN) +Lars T Hansen (LHN) Lea Verou (LVU) Lee Byron (LB) -Lei Zhao (LZH) +LEI Zongmin (LZM) Leland Richardson (LM) Lenz Weber-Tronic (LWT) Leo Balter (LEO) Leo Kettmeir (LEK) +Li YuBei (YLI) Liang Wu (LWU) Limin Zhu (LZU) Lin Clark (LCK) @@ -332,7 +337,7 @@ Luna Pfeiffer (LPR) Luoming Zhang (LZG) Lyza Gardner (LGR) Maël Nison (MNN) -Maggie Pint (MPT) +Maggie Johnson-Pint (MPT) Manuel Jasso (MJN) Manuel Serrano (MSR) Marco Ippolito (MIO) @@ -340,17 +345,17 @@ Mariko Kosaka (MKA) Marina Aísa (AIS) Marja Hölttä (MHA) Mark Cohen (MPC) -Mark E. Davis (MED) +Mark Davis (MED) Mark Honenberg (MH) Mark S. Miller (MM) Mark Stacey (MJS) -Markus W. Scherer (MWS) +Markus Scherer (MWS) Martin Alvarez-Espinar (MAE) Mary Marchini (MAR) Masud Rahman (MRN) Mathias Bynens (MB) Mathieu Hofman (MAH) -Matt Johnson (MAJ) +Matt Johnson-Pint (MAJ) Matt Miller (MMR) Matt Sweeney (MS) Matthew Gaudet (MAG) @@ -358,7 +363,7 @@ Mattijs Hoitink (MHK) Maxim Aleksa (MAA) Michael Dyck (MDK) Michael Ficarra (MF) -Michael Fig (MFG) +Michael FIG (MFG) Michael Hablich (MHH) Michael Saboff (MLS) Michael Z Goddard (MZG) @@ -372,8 +377,7 @@ Mike West (MCW) Mikeal Rogers (MRS) Mikhail Barash (MBH) Miles Maltbie (MME) -Milo Mighdoll (MLM) -Min Gan (JXZ) +Milo M (MLM) Min-qi Wu (MQW) Ming Wang (WMM) MingYuan Cheng (MYC) @@ -382,30 +386,29 @@ Miško Hevery (MHY) Mohamed Hegazy (MDH) Morgan Phillips (MPS) Mrelita Tiwari (MTI) -Mu-an Chiou (MCU) +Mu-An Chiou (MCU) Myles Borins (MBS) Myles C. Maxfield (MCM) Nagy Hostafa (NH) -Nan Shang (SNS) Natalie Silvanovich (NSH) Nathan Hammond (NHD) Nebojša Ćirić (NC) Nicholas Yang (NLY) Nicolò Ribaudo (NRO) Niko Matsakis (NM) -Nikolaos Papaspyrou (NPU) +Nikolaos S. Papaspyrou (NPU) Noah Tye (NTE) +Noelle Levy (TLY) Norbert Lindenberg (NL) Oliver Hunt (OH) Oliver Medhurst (OMT) Olivier Flückiger (OFR) -Pablo Gorostiaga Belio (PGO) +Pablo Gorostiaga (PGO) Paolo Severini (PSI) Patrick Soquet (PST) Paul Leather (PLR) Paul Leathers (PL) Pedram Emrouznejad (PED) -Peter Frivalszky-Mayer (PFM) Peter Hoddie (PHE) Peter Jensen (PJ) Peter Klecha (PKA) @@ -420,7 +423,7 @@ Pieter Ouwerkerk (POK) Preston Sego (NVP) Qiang Tu (QTU) Qiuyi Zhang (QZG) -Rafael Xavier (RX) +Rafael Xavier de Souza (RX) Rafeal Weinstein (RWN) Randolf Jung (JHJ) Randy Luecke (RLE) @@ -456,7 +459,7 @@ Sam Mussell (SML) Sam Tobin-Hochstadt (STH) Samina Husain (SHN) Sanket Joshi (SJI) -Santiago Díaz (SDZ) +Santiago Diaz (SDZ) Sarah D'Onofrio (SDO) Sarah Groff Hennigh-Palermo (SHO) Sathya Gunasekaran (SGN) @@ -473,7 +476,7 @@ Sergey Rubanov (SRV) Seth Brenith (SBH) Seungmin An (SAN) Shaheer Shabbir (SSR) -Shane Carr (SFC) +Shane F. Carr (SFC) Shaundai Person (SPN) Shay Lewis (SYL) Shelby Hubick (SHK) @@ -486,17 +489,17 @@ Sigrid Huemer (SHR) Simon Kaegi (SK) Simon Zünd (SZD) Song Yang Pu (SYP) -Songfeng Li (SLI) +Songfeng Li(李松峰) (SLI) Sora Morimoto (SMO) Sri Pillalamarri (SPI) Staffan Eketorp (SEP) -Staś Małolepszy (STM) +Stanisław Małolepszy (STM) Stefan Penner (SP) Stephen Adams (SRA) Stephen Hicks (SHS) Stephen Murphy (SMY) Steve Faulkner (SFR) -Steven Loomis (SRL) +Steven R. Loomis (SRL) Steven Salat (STY) Subo Zheng (SZH) Sukyoung Ryu (SRU) @@ -506,14 +509,13 @@ Suraj Sharma (SUS) Surma (SUR) Sven Sauleau (SSA) Szabolcs Szabolcsi-Toth (SZT) -Tab Atkins (TAB) +Tab Atkins Jr. (TAB) Tadeu Zagallo (TZO) Takuya Kawasaki (TKI) Tantek Çelik (TEK) Tatiana Shpeisman (TS) Taylor Woll (TW) -Theresa O'Connor (TOC) -Thomas Levy (TLY) +Theresa O’Connor (TOC) Thomas Nattestad (TND) Thomas Wood (TWD) Tianxing Yang (YTX) @@ -529,7 +531,7 @@ Tobias Koppers (TKS) Tom Care (TC) Tom Dale (TDE) Tom Kopp (TKP) -Tom Van-Cutsem (TVC) +Tom Van Cutsem (TVC) Tomoki Imai (TII) Toon Verwaest (TVT) Tooru Fujisawa a.k.a Arai (TFA) @@ -544,7 +546,6 @@ Victor Wang (VWG) Vladan Djeric (VDC) Vladimir Matveev (VM) Waldemar Horwat (WH) -Weicheng Xie (XWC) Weijia Wang (WWG) Weiwen Liang (LWW) Weixuan Lin (WXL) @@ -554,28 +555,29 @@ Whymarrh Whitby (WWW) Will Medina (WMA) Willian Martins (WMS) Xian Kun Wang (WXK) -Xuan Huang (HUX) +Xuan Huang (黄玄) (HUX) +Xuanzi (JXZ) Yagiz Nizipli (YNP) YaJu Wang (WYJ) Yan Kun Zhen (YKZ) Yang Guo (YGO) Yehuda Katz (YK) -Yi Long Li (LYL) Yi Yi (YIY) +Yilong Li (LYL) Yoav Weiss (YWS) Yorkie Liu (YKL) Younies Mahmoud (YMD) Yuanrui Liang (YRL) Yuanyan Cao (YYC) -YuBei Li (YLI) Yulia Startsev (YSV) Yusuke Suzuki (YSZ) Zalim Bashorov (ZBV) -Zbigniew Tenerowicz (ZTZ) -Zeimin Lei (LZM) +Zbyszek Tenerowicz (ZTZ) Zev Solomon (ZSN) Zeyu Yang (ZYY) +ZhaoLei (LZH) Zhi Jie Li (LZJ) -Zhongyin Chen (CZY) Zibi Braniecki (ZB) Zuo Jian Lin (ZJL) +小船 (HZO) +沧浪 (SNS) diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..5a07927f --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,19 @@ +import js from '@eslint/js'; +import { defineConfig } from 'eslint/config'; +import globals from 'globals'; + +export default defineConfig([ + js.configs.recommended, + { + languageOptions: { + globals: globals.node, + }, + rules: { + 'arrow-spacing': 'error', + 'brace-style': ['error', '1tbs'], + 'keyword-spacing': 'error', + 'object-curly-spacing': ['error', 'always'], + 'semi': ['error', 'always'], + }, + }, +]); diff --git a/package.json b/package.json index 601b1f63..9f4c4962 100644 --- a/package.json +++ b/package.json @@ -4,19 +4,22 @@ "bad-linebreaks": "node -e 'import(\"./scripts/bad-linebreaks.mjs\").then(bl => bl.processFiles(false))'", "bad-linebreaks:fix": "node -e 'import(\"./scripts/bad-linebreaks.mjs\").then(bl => bl.processFiles(true))'", "bad-linebreaks-test": "node ./scripts/bad-linebreaks-test.mjs", - "check-delegates": "node -e 'import(\"./scripts/check-delegates.mjs\").then(cd => cd.checkDelegates())'", - "check-delegates-test": "node ./scripts/check-delegates-test.mjs", + "check-delegates": "npm run generate-delegates -- --check", "fix:all": "npm run lint:fix && npm run mdlint:fix && npm run bad-linebreaks:fix", + "generate-delegates": "node ./scripts/generate-delegates.mjs", "lint": "eslint . --ext .js,.mjs,.cjs", "lint:fix": "npm run lint -- --fix", "mdlint": "markdownlint-cli2", "mdlint:fix": "markdownlint-cli2 --fix", "//": "markdownlint most likely to fail, so run that first", - "test": "npm run mdlint && npm run bad-linebreaks-test && npm run bad-linebreaks && npm run lint && npm run check-delegates-test && npm run check-delegates" + "test": "npm run mdlint && npm run bad-linebreaks-test && npm run bad-linebreaks && npm run lint && npm run check-delegates" }, "devDependencies": { - "eslint": "^8.47.0", + "@eslint/js": "^10.0.1", + "@tc39/data-delegates": "^1.0.0", + "eslint": "^10.10.0", "glob": "^10.3.3", + "globals": "^17.12.0", "markdownlint-cli2": "^0.9.0", "marked": "^7.0.4" } diff --git a/scripts/bad-linebreaks-test.mjs b/scripts/bad-linebreaks-test.mjs index a067e50f..4beaa14e 100644 --- a/scripts/bad-linebreaks-test.mjs +++ b/scripts/bad-linebreaks-test.mjs @@ -26,7 +26,7 @@ assert.strictEqual(totalMatches.badLinebreaks, 0); assert.strictEqual(totalMatches.extraWhitespace, 0); validateLines(fixed, fs.readFileSync(afterMD, 'utf8').toString()); -({ fixed, totalMatches } = findBadStuff(beforeMD)); +({ totalMatches } = findBadStuff(beforeMD)); assert.strictEqual(totalMatches.badLinebreaks, 44); assert.strictEqual(totalMatches.extraWhitespace, 131); diff --git a/scripts/check-delegates-test.mjs b/scripts/check-delegates-test.mjs deleted file mode 100644 index b3265b12..00000000 --- a/scripts/check-delegates-test.mjs +++ /dev/null @@ -1,19 +0,0 @@ -import { strict as assert } from 'node:assert'; -import { checkDelegates } from './check-delegates.mjs'; - -const lex = `Rob Palmer (RPR)\nUjjwal Sharma (USA)\nChris de Almeida (CDA)`; -const missing = `Chris de Almeida (CDA)\nRob Palmer\nUjjwal Sharma (USA)`; -const uppercaseLatin = `Chris de Almeida (CDA)\nRob Palmer (竄)\nUjjwal Sharma (USA)`; -const twoLetter = `Chris de Almeida (CDA)\nRob Palmer (RP)\nUjjwal Sharma (USA)`; -const threeLetter = `Chris de Almeida (CDA)\nRob Palmer (ROBPALMER)\nUjjwal Sharma (USA)`; -const duplicate = `Chris de Almeida (CDA)\nRob Palmer (RPR)\nUjjwal Sharma (USA)\nUjjwal Sharma (USA)`; -const valid = `Chris de Almeida (CDA)\nMichael Ficarra (MF)\nRob Palmer (RPR)\nUjjwal Sharma (USA)`; - -assert.throws(() => checkDelegates(lex), { message: 'Line 3: Not in lexicographic order.' }); // also validates expected line number -assert.throws(() => checkDelegates(missing), { message: /Missing abbreviation for/ }); -assert.throws(() => checkDelegates(uppercaseLatin), { message: /Abbreviations must be all uppercase Latin letters/ }); -assert.throws(() => checkDelegates(twoLetter), { message: /not in allowlist. New delegate abbreviations must be three letters/ }); -assert.throws(() => checkDelegates(threeLetter), { message: /New delegate abbreviations must be three letters/ }); -assert.throws(() => checkDelegates(duplicate), { message: /Conflicting usage on line/ }); - -assert.doesNotThrow(() => checkDelegates(valid)); diff --git a/scripts/check-delegates.mjs b/scripts/check-delegates.mjs deleted file mode 100755 index 862bbe5e..00000000 --- a/scripts/check-delegates.mjs +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env node - -import fs from 'fs'; - -export function checkDelegates(contents = fs.readFileSync('./delegates.txt', 'utf8').toString()) { - - console.debug('checking delegates...'); - - // List of delegate abbreviations that predate the 3-letter - // requirement. Do not change this! - const TWO_LETTER_ABBRS = new Set([ - 'AC', 'AH', 'AK', 'AR', 'AS', 'BB', 'BE', 'BG', 'BM', 'BN', 'BS', - 'BT', 'BZ', 'CF', 'CM', 'CP', 'DC', 'DD', 'DE', 'DH', 'DL', 'DS', - 'DT', 'EA', 'EF', 'ET', 'EY', 'FN', 'FP', 'GB', 'GI', 'GN', 'GY', - 'IH', 'IS', 'IT', 'JB', 'JH', 'JK', 'JM', 'JN', 'JP', 'JS', 'JT', - 'KG', 'KM', 'KR', 'KS', 'LB', 'LH', 'LL', 'LM', 'MB', 'MF', 'MH', - 'MM', 'MP', 'MS', 'NC', 'NH', 'NL', 'NM', 'OH', 'PJ', 'PL', 'RB', - 'RH', 'RW', 'RX', 'SC', 'SK', 'SM', 'SP', 'TC', 'TD', 'TS', 'TW', - 'VM', 'WH', 'YK', 'ZB', - ]); - - - const re = /^(?[^(]+)(?: \((?[^)]*)\))?$/; - const abbrs = new Map; - const lines = contents.split('\n'); - - let lineNumber = 1; - let previousLine = ''; - - for (const line of lines) { - if (line.length === 0) continue; - const match = re.exec(line); - const { abbr } = match.groups; - - if (previousLine.localeCompare(line, 'en') > 0) { - throw new Error(`Line ${lineNumber}: Not in lexicographic order.`); - } - - if (abbr == null) { - throw new Error(`Line ${lineNumber}: Missing abbreviation for ${JSON.stringify(line)}.`); - } - - if (!/^[A-Z]+$/.test(abbr)) { - throw new Error(`Line ${lineNumber}: Abbreviations must be all uppercase Latin letters.`); - } - - if (abbr.length === 2) { - if (!TWO_LETTER_ABBRS.has(abbr)) { - throw new Error(`Line ${lineNumber}: 2-letter abbreviation ${JSON.stringify(abbr)} not in allowlist. New delegate abbreviations must be three letters.`); - } - } else if (abbr.length !== 3) { - throw new Error(`Line ${lineNumber}: Invalid abbreviation ${JSON.stringify(abbr)}. New delegate abbreviations must be three letters.`); - } - - if (abbrs.has(abbr)) { - throw new Error(`Line ${lineNumber}: Duplicate abbreviation ${JSON.stringify(abbr)}. Conflicting usage on line ${abbrs.get(abbr)}.`); - } - abbrs.set(abbr, lineNumber); - - previousLine = line; - ++lineNumber; - } - - console.debug('...delegates are valid\n'); -} diff --git a/scripts/generate-delegates.mjs b/scripts/generate-delegates.mjs new file mode 100755 index 00000000..8ca49da3 --- /dev/null +++ b/scripts/generate-delegates.mjs @@ -0,0 +1,39 @@ +#!/usr/bin/env node + +import fs from 'node:fs'; +import delegates from '@tc39/data-delegates' with { type: 'json' }; + +const DELEGATES_PATH = new URL('../delegates.txt', import.meta.url); +const CANONICAL_SOURCE = 'https://github.com/tc39/data/blob/HEAD/data/delegates/index.json'; +const WARNING = `# This file is generated and is not the canonical source; edit ${CANONICAL_SOURCE} instead.`; + +/** Produce the human-readable delegate list from the canonical JSON data. */ +function getDelegatesContents() { + const delegateLines = Object.entries(delegates) + .map(([abbreviation, delegate]) => `${delegate.name} (${abbreviation})`) + .sort((left, right) => left.localeCompare(right, 'en')); + + return [WARNING, '', ...delegateLines, ''].join('\n'); +} + +/** Write delegates.txt, or check its contents without modifying it. */ +function generateDelegates(check) { + const generatedContents = getDelegatesContents(); + + if (check) { + const currentContents = fs.existsSync(DELEGATES_PATH) + ? fs.readFileSync(DELEGATES_PATH, 'utf8') + : null; + + if (currentContents !== generatedContents) { + console.error('delegates.txt is out of date; run `npm run generate-delegates` to update it.'); + process.exitCode = 1; + } + + return; + } + + fs.writeFileSync(DELEGATES_PATH, generatedContents); +} + +generateDelegates(process.argv.includes('--check'));