diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d578407..d991a68 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,6 +10,9 @@ jobs: fail-fast: false matrix: node-version: + - 20 + - 18 + - 16 - 14 - 12 - 10 diff --git a/.gitignore b/.gitignore index 9fc660b..af1eaca 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules yarn.lock .cache +/index.d.ts diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index a842e4c..0000000 --- a/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import {ReadonlyDeep} from 'type-fest'; -import globalsJson = require('./globals.json'); - -declare const globals: ReadonlyDeep; - -export = globals; diff --git a/index.test-d.ts b/index.test-d.ts index 234b036..6fd196b 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -1,7 +1,7 @@ -import {expectType, expectError} from 'tsd'; +import {expectType, expectError, expectAssignable} from 'tsd'; import {ReadonlyDeep} from 'type-fest'; -import globals = require('.'); +import globals from '.'; -expectType>>>(globals); -expectType(globals.builtin.Array); +expectAssignable>>>(globals); +expectType(globals.builtin.Array); expectError((globals.builtin.Array = true)); diff --git a/package.json b/package.json index b4fd3e1..599f283 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,10 @@ "node": ">=8" }, "scripts": { - "test": "xo && ava", - "update-builtin-globals": "node scripts/get-builtin-globals.mjs" + "test": "xo && ava && tsd", + "prepare": "npm run --silent update-types", + "update-builtin-globals": "node scripts/get-builtin-globals.mjs", + "update-types": "node scripts/generate-types.mjs > index.d.ts" }, "files": [ "index.js", @@ -33,13 +35,11 @@ "eslint", "environments" ], - "dependencies": { - "type-fest": "^0.20.2" - }, "devDependencies": { "ava": "^2.4.0", "cheerio": "^1.0.0-rc.12", - "tsd": "^0.14.0", + "tsd": "^0.30.4", + "type-fest": "^4.10.2", "xo": "^0.36.1" }, "xo": { diff --git a/scripts/generate-types.mjs b/scripts/generate-types.mjs new file mode 100644 index 0000000..c4c0a3e --- /dev/null +++ b/scripts/generate-types.mjs @@ -0,0 +1,38 @@ +import fs from 'node:fs/promises'; + +const DATA_FILE = new URL('../globals.json', import.meta.url); + +const globals = JSON.parse(await fs.readFile(DATA_FILE)); + +const getGroupTypeName = (group) => `Globals${group[0].toUpperCase() + group.slice(1).replaceAll('-', '')}`; + +const groups = {}; +const output = [ + '// This file is autogenerated by scripts/generate-types.mjs', + '// Do NOT modify this file manually\n' +]; + +for (const group in globals) { + const groupType = getGroupTypeName(group); + groups[group] = groupType; + + output.push(`type ${getGroupTypeName(group)} = {`); + + for (const [rule, status] of Object.entries(globals[group])) { + output.push(` readonly '${rule}': ${status};`); + } + + output.push(`}\n`); +} + +output.push(`type Globals = {`); + +for (const [group, groupType] of Object.entries(groups)) { + output.push(` readonly '${group}': ${groupType};`); +} + +output.push(`}\n`); +output.push(`declare const globals: Globals;\n`); +output.push(`export = globals;`); + +console.log(output.join('\n'));