diff --git a/jest-preset.js b/jest-preset.js index b92b59fd9..3eb26cc1f 100644 --- a/jest-preset.js +++ b/jest-preset.js @@ -21,7 +21,7 @@ module.exports = { '!/jest.*.ts', ], coverageDirectory: 'coverage', - reporters: ['default', require.resolve('./lib/cli/test/reporters/github')], + reporters: ['default', require.resolve('skuba/cli/test/reporters/github')], testEnvironment: 'node', testPathIgnorePatterns: [ '/node_modules.*/', diff --git a/jest.config.ts b/jest.config.cts similarity index 94% rename from jest.config.ts rename to jest.config.cts index 94b1a3e30..b8ac56832 100644 --- a/jest.config.ts +++ b/jest.config.cts @@ -1,4 +1,4 @@ -import * as Jest from './lib/api/jest/index.js'; +import { Jest } from 'skuba'; process.env.FORCE_COLOR = 'false'; diff --git a/package.json b/package.json index 36122c3e1..f8bda6bef 100644 --- a/package.json +++ b/package.json @@ -13,16 +13,104 @@ }, "license": "MIT", "sideEffects": false, - "main": "lib/index.js", - "types": "./lib/index.d.ts", + "exports": { + ".": { + "@seek/skuba/source": "./src/index.ts", + "require": "./lib/index.cjs", + "import": "./lib/index.mjs" + }, + "./cli/build": { + "@seek/skuba/source": "./src/cli/build/index.ts", + "require": "./lib/cli/build/index.cjs", + "import": "./lib/cli/build/index.mjs" + }, + "./cli/buildPackage": { + "@seek/skuba/source": "./src/cli/buildPackage/index.ts", + "require": "./lib/cli/buildPackage/index.cjs", + "import": "./lib/cli/buildPackage/index.mjs" + }, + "./cli/configure": { + "@seek/skuba/source": "./src/cli/configure/index.ts", + "require": "./lib/cli/configure/index.cjs", + "import": "./lib/cli/configure/index.mjs" + }, + "./cli/format": { + "@seek/skuba/source": "./src/cli/format/index.ts", + "require": "./lib/cli/format/index.cjs", + "import": "./lib/cli/format/index.mjs" + }, + "./cli/help": { + "@seek/skuba/source": "./src/cli/help/index.ts", + "require": "./lib/cli/help/index.cjs", + "import": "./lib/cli/help/index.mjs" + }, + "./cli/init": { + "@seek/skuba/source": "./src/cli/init/index.ts", + "require": "./lib/cli/init/index.cjs", + "import": "./lib/cli/init/index.mjs" + }, + "./cli/lint": { + "@seek/skuba/source": "./src/cli/lint/index.ts", + "require": "./lib/cli/lint/index.cjs", + "import": "./lib/cli/lint/index.mjs" + }, + "./cli/migrate": { + "@seek/skuba/source": "./src/cli/migrate/index.ts", + "require": "./lib/cli/migrate/index.cjs", + "import": "./lib/cli/migrate/index.mjs" + }, + "./cli/node": { + "@seek/skuba/source": "./src/cli/node/index.ts", + "require": "./lib/cli/node/index.cjs", + "import": "./lib/cli/node/index.mjs" + }, + "./cli/release": { + "@seek/skuba/source": "./src/cli/release/index.ts", + "require": "./lib/cli/release/index.cjs", + "import": "./lib/cli/release/index.mjs" + }, + "./cli/start": { + "@seek/skuba/source": "./src/cli/start/index.ts", + "require": "./lib/cli/start/index.cjs", + "import": "./lib/cli/start/index.mjs" + }, + "./cli/test": { + "@seek/skuba/source": "./src/cli/test/index.ts", + "require": "./lib/cli/test/index.cjs", + "import": "./lib/cli/test/index.mjs" + }, + "./cli/test/reporters/github": { + "@seek/skuba/source": "./src/cli/test/reporters/github/index.ts", + "require": "./lib/cli/test/reporters/github/index.cjs", + "import": "./lib/cli/test/reporters/github/index.mjs" + }, + "./cli/version": { + "@seek/skuba/source": "./src/cli/version/index.ts", + "require": "./lib/cli/version/index.cjs", + "import": "./lib/cli/version/index.mjs" + }, + "./skuba": { + "@seek/skuba/source": "./src/skuba.ts", + "require": "./lib/skuba.cjs", + "import": "./lib/skuba.mjs" + }, + "./package.json": "./package.json" + }, + "main": "./lib/index.cjs", + "module": "./lib/index.mjs", + "types": "./lib/index.d.cts", "bin": { - "skuba": "lib/skuba.js" + "skuba": "lib/skuba.cjs" }, "files": [ "config/**/*", "jest/**/*.js", "lib*/**/*.d.ts", + "lib*/**/*.d.cts", + "lib*/**/*.d.mts", "lib*/**/*.js", + "lib*/**/*.cjs", + "lib*/**/*.mjs", "lib*/**/*.js.map", "template/**/*", "jest-preset.js" @@ -40,7 +128,7 @@ "prepack": "pnpm --filter './template/**' exec rm -rf node_modules", "release": "pnpm --silent build && changeset publish", "skuba": "pnpm --silent build && pnpm --silent skuba:exec", - "skuba:exec": "node lib/skuba", + "skuba:exec": "node lib/skuba.cjs", "stage": "changeset version && node ./.changeset/inject.js && pnpm format", "test": "pnpm --silent skuba test --selectProjects unit", "test:ci": "pnpm --silent skuba test --runInBand", @@ -128,6 +216,7 @@ "zod": "^4.0.0" }, "devDependencies": { + "@arethetypeswrong/core": "0.18.2", "@changesets/cli": "2.29.8", "@changesets/get-github-info": "0.7.0", "@jest/reporters": "30.2.0", @@ -155,12 +244,82 @@ "remark-preset-lint-recommended": "7.0.1", "semver": "7.7.3", "supertest": "7.1.4", + "tsdown": "0.18.0", "type-fest": "2.19.0" }, "packageManager": "pnpm@10.25.0", "engines": { "node": ">=22.14.0" }, + "publishConfig": { + "exports": { + ".": { + "require": "./lib/index.cjs", + "import": "./lib/index.mjs" + }, + "./cli/build": { + "require": "./lib/cli/build/index.cjs", + "import": "./lib/cli/build/index.mjs" + }, + "./cli/buildPackage": { + "require": "./lib/cli/buildPackage/index.cjs", + "import": "./lib/cli/buildPackage/index.mjs" + }, + "./cli/configure": { + "require": "./lib/cli/configure/index.cjs", + "import": "./lib/cli/configure/index.mjs" + }, + "./cli/format": { + "require": "./lib/cli/format/index.cjs", + "import": "./lib/cli/format/index.mjs" + }, + "./cli/help": { + "require": "./lib/cli/help/index.cjs", + "import": "./lib/cli/help/index.mjs" + }, + "./cli/init": { + "require": "./lib/cli/init/index.cjs", + "import": "./lib/cli/init/index.mjs" + }, + "./cli/lint": { + "require": "./lib/cli/lint/index.cjs", + "import": "./lib/cli/lint/index.mjs" + }, + "./cli/migrate": { + "require": "./lib/cli/migrate/index.cjs", + "import": "./lib/cli/migrate/index.mjs" + }, + "./cli/node": { + "require": "./lib/cli/node/index.cjs", + "import": "./lib/cli/node/index.mjs" + }, + "./cli/release": { + "require": "./lib/cli/release/index.cjs", + "import": "./lib/cli/release/index.mjs" + }, + "./cli/start": { + "require": "./lib/cli/start/index.cjs", + "import": "./lib/cli/start/index.mjs" + }, + "./cli/test": { + "require": "./lib/cli/test/index.cjs", + "import": "./lib/cli/test/index.mjs" + }, + "./cli/test/reporters/github": { + "require": "./lib/cli/test/reporters/github/index.cjs", + "import": "./lib/cli/test/reporters/github/index.mjs" + }, + "./cli/version": { + "require": "./lib/cli/version/index.cjs", + "import": "./lib/cli/version/index.mjs" + }, + "./skuba": { + "require": "./lib/skuba.cjs", + "import": "./lib/skuba.mjs" + }, + "./package.json": "./package.json" + } + }, "skuba": { "build": "esbuild", "entryPoint": "src/index.ts", diff --git a/packages/api/package.json b/packages/api/package.json index 10c1965d8..b4982f551 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -61,7 +61,7 @@ "isomorphic-git": "^1.11.1" }, "devDependencies": { - "tsdown": "^0.17.0" + "tsdown": "0.18.0" }, "engines": { "node": ">=22.14.0" diff --git a/packages/eslint-config-skuba/package.json b/packages/eslint-config-skuba/package.json index 1ffb7cc29..8bee90437 100644 --- a/packages/eslint-config-skuba/package.json +++ b/packages/eslint-config-skuba/package.json @@ -14,18 +14,27 @@ }, "license": "MIT", "sideEffects": false, - "main": "./index.js", - "module": "./index.js", - "types": "./index.d.ts", + "exports": { + ".": { + "@seek/skuba/source": "./index.js", + "require": "./lib/index.cjs", + "import": "./lib/index.mjs" + }, + "./package.json": "./package.json" + }, + "main": "./lib/index.cjs", + "module": "./lib/index.mjs", + "types": "./lib/index.d.cts", "files": [ "index.d.ts", "index.js", "requireExtensions.js" ], "scripts": { + "build": "tsdown", "format": "pnpm --silent skuba format", "lint": "pnpm --silent skuba lint", - "skuba": "node ../../lib/skuba" + "skuba": "node ../../lib/skuba.cjs" }, "dependencies": { "eslint-config-seek": "15.0.1", @@ -35,6 +44,7 @@ }, "devDependencies": { "eslint": "^9.39.1", + "tsdown": "0.18.0", "typescript": "~5.9.0" }, "peerDependencies": { @@ -45,10 +55,19 @@ "engines": { "node": ">=20.9.0" }, + "publishConfig": { + "exports": { + ".": { + "require": "./lib/index.cjs", + "import": "./lib/index.mjs" + }, + "./package.json": "./package.json" + } + }, "skuba": { "entryPoint": "index.js", "template": "oss-npm-package", "type": "package", - "version": "13.0.0" + "version": "13.1.1" } } diff --git a/packages/eslint-config-skuba/requireExtensions.test.ts b/packages/eslint-config-skuba/requireExtensions.test.ts index 6526b32ac..d38dd89bf 100644 --- a/packages/eslint-config-skuba/requireExtensions.test.ts +++ b/packages/eslint-config-skuba/requireExtensions.test.ts @@ -28,19 +28,15 @@ import { test as validSrcIndexFileTest } from 'src/indexFile/index.js'; import { test as bothTest } from './src/both'; const asyncFunction = async () => { - // @ts-expect-error - testing ESLint rule, intentionally missing extension const dynamicImportTest = await import('./src/simple'); // eslint-disable-line require-extensions/require-extensions const validDynamicImportTest = await import('./src/simple.js'); - // @ts-expect-error - testing ESLint rule, intentionally missing extension const indexFileDynamicImportTest = await import('./src/indexFile'); // eslint-disable-line require-extensions/require-index const validIndexFileDynamicImportTest = await import('./src/indexFile/index.js'); - // @ts-expect-error - testing ESLint rule, intentionally missing extension const srcDynamicImportTest = await import('src/file'); // eslint-disable-line require-extensions/require-extensions const validSrcDynamicImportTest = await import('src/file.js'); - // @ts-expect-error - testing ESLint rule, intentionally missing extension const bothDynamicImportTest = await import('./src/both'); // eslint-disable-line require-extensions/require-extensions }; diff --git a/packages/eslint-config-skuba/src/requireExtensions.test.ts b/packages/eslint-config-skuba/src/requireExtensions.test.ts index 5a56efc8b..3e8e92a11 100644 --- a/packages/eslint-config-skuba/src/requireExtensions.test.ts +++ b/packages/eslint-config-skuba/src/requireExtensions.test.ts @@ -36,18 +36,14 @@ import '../'; import '../index.js'; const asyncFunction = async () => { - // @ts-expect-error - testing ESLint rule, intentionally missing extension const dynamicImportTest = await import('./simple'); // eslint-disable-line require-extensions/require-extensions const validDynamicImportTest = await import('./simple.js'); - // @ts-expect-error - testing ESLint rule, intentionally missing extension const indexFileDynamicImportTest = await import('./indexFile'); // eslint-disable-line require-extensions/require-index const validIndexFileDynamicImportTest = await import('./indexFile/index.js'); - // @ts-expect-error - testing ESLint rule, intentionally missing extension const srcDynamicImportTest = await import('src/file'); // eslint-disable-line require-extensions/require-extensions const validSrcDynamicImportTest = await import('src/file.js'); - // @ts-expect-error - testing ESLint rule, intentionally missing extension const bothDynamicImportTest = await import('./both'); // eslint-disable-line require-extensions/require-extensions }; diff --git a/packages/eslint-config-skuba/tsconfig.json b/packages/eslint-config-skuba/tsconfig.json index 18123faa1..c6498d02a 100644 --- a/packages/eslint-config-skuba/tsconfig.json +++ b/packages/eslint-config-skuba/tsconfig.json @@ -1,8 +1,13 @@ { "compilerOptions": { "rootDir": ".", + "declaration": true, "lib": ["ES2023"], + "module": "preserve", + "moduleResolution": "bundler", "outDir": "lib", + "removeComments": false, + "skipLibCheck": true, "target": "ES2023", "baseUrl": "." }, @@ -13,6 +18,7 @@ "index.d.ts", "index.js", "src/**/*", - "requireExtensions.test.ts" + "requireExtensions.test.ts", + "tsdown.config.mts" ] } diff --git a/packages/eslint-config-skuba/tsdown.config.mts b/packages/eslint-config-skuba/tsdown.config.mts new file mode 100644 index 000000000..d1566aba4 --- /dev/null +++ b/packages/eslint-config-skuba/tsdown.config.mts @@ -0,0 +1,11 @@ +import { defineConfig } from 'tsdown/config'; + +export default defineConfig({ + entry: ['index.js'], + exports: { + devExports: '@seek/skuba/source', + }, + format: ['cjs', 'esm'], + outDir: 'lib', + failOnWarn: false, +}); diff --git a/packages/eslint-plugin-skuba/package.json b/packages/eslint-plugin-skuba/package.json index cdb458b3d..08ca819bf 100644 --- a/packages/eslint-plugin-skuba/package.json +++ b/packages/eslint-plugin-skuba/package.json @@ -36,7 +36,7 @@ "format": "pnpm --silent skuba format", "lint": "pnpm --silent skuba lint", "prepack": "tsdown", - "skuba": "node ../../lib/skuba", + "skuba": "node ../../lib/skuba.cjs", "test": "node --import tsx --test 'src/**/*.test.ts'", "test:ci": "node --import tsx --test --experimental-test-coverage 'src/**/*.test.ts'", "test:watch": "node --import tsx --test --watch 'src/**/*.test.ts'" @@ -47,7 +47,7 @@ "devDependencies": { "@typescript-eslint/rule-tester": "^8.26.0", "eslint": "^9.39.1", - "tsdown": "^0.17.0", + "tsdown": "0.18.0", "tsx": "^4.16.2", "typescript-eslint": "^8.39.0" }, @@ -72,6 +72,6 @@ "entryPoint": "src/index.ts", "template": "oss-npm-package", "type": "package", - "version": "13.0.0" + "version": "13.1.1" } } diff --git a/packages/eslint-plugin-skuba/tsconfig.json b/packages/eslint-plugin-skuba/tsconfig.json index 865895df9..3556e4abd 100644 --- a/packages/eslint-plugin-skuba/tsconfig.json +++ b/packages/eslint-plugin-skuba/tsconfig.json @@ -2,13 +2,13 @@ "compilerOptions": { "rootDir": ".", "declaration": true, - "lib": ["ES2021"], + "lib": ["ES2023"], "module": "preserve", "moduleResolution": "bundler", "outDir": "lib", "removeComments": false, "skipLibCheck": true, - "target": "ES2021" + "target": "ES2023" }, "exclude": ["lib*/**/*"], "extends": "../../config/tsconfig.json" diff --git a/packages/skuba-dive/jest.config.ts b/packages/skuba-dive/jest.config.js similarity index 61% rename from packages/skuba-dive/jest.config.ts rename to packages/skuba-dive/jest.config.js index d19c81fa6..538a25162 100644 --- a/packages/skuba-dive/jest.config.ts +++ b/packages/skuba-dive/jest.config.js @@ -1,6 +1,6 @@ -import * as Jest from '../../lib/api/jest/index.js'; +const { Jest } = require('skuba'); -export default Jest.mergePreset({ +module.exports = Jest.mergePreset({ coverageThreshold: { global: { branches: 100, diff --git a/packages/skuba-dive/package.json b/packages/skuba-dive/package.json index e911fa760..5e0477b14 100644 --- a/packages/skuba-dive/package.json +++ b/packages/skuba-dive/package.json @@ -14,30 +14,50 @@ }, "license": "MIT", "sideEffects": false, - "main": "./lib/index.js", - "module": "./lib/index.js", - "types": "./lib/index.d.ts", + "exports": { + ".": { + "@seek/skuba/source": "./src/index.ts", + "require": "./lib/index.cjs", + "import": "./lib/index.mjs" + }, + "./package.json": "./package.json" + }, + "main": "./lib/index.cjs", + "module": "./lib/index.mjs", + "types": "./lib/index.d.cts", "files": [ "lib/**/*.d.ts", "lib/**/*.js", "lib/**/*.js.map" ], "scripts": { - "build": "pnpm skuba build", + "build": "tsdown", "format": "pnpm skuba format", "lint": "pnpm skuba lint", - "prepack": "pnpm skuba build", - "skuba": "node ../../lib/skuba", + "skuba": "node ../../lib/skuba.cjs", "test": "pnpm skuba test", "test:ci": "pnpm skuba test --coverage" }, + "devDependencies": { + "skuba": "13.1.1", + "tsdown": "0.18.0" + }, "engines": { "node": ">=22.14.0" }, + "publishConfig": { + "exports": { + ".": { + "require": "./lib/index.cjs", + "import": "./lib/index.mjs" + }, + "./package.json": "./package.json" + } + }, "skuba": { "entryPoint": "src/index.ts", "template": "oss-npm-package", "type": "package", - "version": "13.0.0" + "version": "13.1.1" } } diff --git a/packages/skuba-dive/tsconfig.json b/packages/skuba-dive/tsconfig.json index 3339c5fb7..0e01fa1e0 100644 --- a/packages/skuba-dive/tsconfig.json +++ b/packages/skuba-dive/tsconfig.json @@ -3,10 +3,11 @@ "rootDir": ".", "declaration": true, "lib": ["ES2023"], - "module": "CommonJS", - "moduleResolution": "node", + "module": "preserve", + "moduleResolution": "bundler", "outDir": "lib", "removeComments": false, + "skipLibCheck": true, // tsdown has optional peer deps "target": "ES2023" }, "exclude": ["lib*/**/*"], diff --git a/packages/skuba-dive/tsdown.config.mts b/packages/skuba-dive/tsdown.config.mts new file mode 100644 index 000000000..f03f48512 --- /dev/null +++ b/packages/skuba-dive/tsdown.config.mts @@ -0,0 +1,11 @@ +import { defineConfig } from 'tsdown/config'; + +export default defineConfig({ + entry: ['src/index.ts'], + exports: { + devExports: '@seek/skuba/source', + }, + format: ['cjs', 'esm'], + outDir: 'lib', + failOnWarn: false, +}); diff --git a/packages/vitest-koa-mocks/package.json b/packages/vitest-koa-mocks/package.json index 74e8f0df0..7b3a24c1d 100644 --- a/packages/vitest-koa-mocks/package.json +++ b/packages/vitest-koa-mocks/package.json @@ -14,20 +14,27 @@ }, "license": "MIT", "type": "module", - "main": "./lib/index.js", - "module": "./lib/index.js", - "types": "./lib/index.d.ts", + "exports": { + ".": { + "@seek/skuba/source": "./src/index.ts", + "require": "./lib/index.cjs", + "import": "./lib/index.mjs" + }, + "./package.json": "./package.json" + }, + "main": "./lib/index.cjs", + "module": "./lib/index.mjs", + "types": "./lib/index.d.cts", "files": [ "lib/**/*.d.ts", "lib/**/*.js", "lib/**/*.js.map" ], "scripts": { - "build": "pnpm skuba build", + "build": "tsdown", "format": "pnpm skuba format", "lint": "pnpm skuba lint", - "prepack": "pnpm skuba build", - "skuba": "node ../../lib/skuba", + "skuba": "node ../../lib/skuba.cjs", "test": "vitest run", "test:ci": "vitest run --coverage", "test:watch": "vitest" @@ -35,6 +42,9 @@ "dependencies": { "node-mocks-http": "^1.17.2" }, + "devDependencies": { + "tsdown": "0.18.0" + }, "peerDependencies": { "@types/koa": "^3.0.1", "koa": "^3.1.1", @@ -43,10 +53,19 @@ "engines": { "node": ">=20.9.0" }, + "publishConfig": { + "exports": { + ".": { + "require": "./lib/index.cjs", + "import": "./lib/index.mjs" + }, + "./package.json": "./package.json" + } + }, "skuba": { "entryPoint": "src/index.ts", "template": "oss-npm-package", "type": "package", - "version": "13.0.0" + "version": "13.1.1" } } diff --git a/packages/vitest-koa-mocks/tsconfig.json b/packages/vitest-koa-mocks/tsconfig.json index f6f2fa68a..0e01fa1e0 100644 --- a/packages/vitest-koa-mocks/tsconfig.json +++ b/packages/vitest-koa-mocks/tsconfig.json @@ -2,13 +2,14 @@ "compilerOptions": { "rootDir": ".", "declaration": true, - "lib": ["ES2021"], + "lib": ["ES2023"], + "module": "preserve", + "moduleResolution": "bundler", "outDir": "lib", - "target": "ES2021", - "baseUrl": ".", - "skipLibCheck": true + "removeComments": false, + "skipLibCheck": true, // tsdown has optional peer deps + "target": "ES2023" }, "exclude": ["lib*/**/*"], - "extends": "../../config/tsconfig.json", - "include": ["src/**/*"] + "extends": "../../config/tsconfig.json" } diff --git a/packages/vitest-koa-mocks/tsdown.config.mts b/packages/vitest-koa-mocks/tsdown.config.mts new file mode 100644 index 000000000..f03f48512 --- /dev/null +++ b/packages/vitest-koa-mocks/tsdown.config.mts @@ -0,0 +1,11 @@ +import { defineConfig } from 'tsdown/config'; + +export default defineConfig({ + entry: ['src/index.ts'], + exports: { + devExports: '@seek/skuba/source', + }, + format: ['cjs', 'esm'], + outDir: 'lib', + failOnWarn: false, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c47fad0e..7dc4763b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -160,6 +160,9 @@ importers: specifier: ^4.0.0 version: 4.1.13 devDependencies: + '@arethetypeswrong/core': + specifier: 0.18.2 + version: 0.18.2 '@changesets/cli': specifier: 2.29.8 version: 2.29.8(@types/node@24.10.3) @@ -241,6 +244,9 @@ importers: supertest: specifier: 7.1.4 version: 7.1.4 + tsdown: + specifier: 0.18.0 + version: 0.18.0(@arethetypeswrong/core@0.18.2)(synckit@0.11.11)(typescript@5.9.3) type-fest: specifier: 2.19.0 version: 2.19.0 @@ -267,14 +273,14 @@ importers: version: 1.35.1 devDependencies: tsdown: - specifier: ^0.17.0 - version: 0.17.2(synckit@0.11.11)(typescript@5.9.3) + specifier: 0.18.0 + version: 0.18.0(@arethetypeswrong/core@0.18.2)(synckit@0.11.11)(typescript@5.9.3) packages/eslint-config-skuba: dependencies: eslint-config-seek: specifier: 15.0.1 - version: 15.0.1(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(jest@30.2.0(@types/node@24.10.3)(ts-node@10.9.2(@types/node@24.10.3)(typescript@5.9.3)))(typescript@5.9.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(tsx@4.21.0)(yaml@2.8.1)) + version: 15.0.1(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(jest@30.2.0(@types/node@24.10.3)(ts-node@10.9.2(@types/node@24.10.3)(typescript@5.9.3)))(typescript@5.9.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(tsx@4.21.0)(yaml@2.8.1)) eslint-plugin-skuba: specifier: workspace:* version: link:../eslint-plugin-skuba @@ -288,6 +294,9 @@ importers: eslint: specifier: ^9.39.1 version: 9.39.1 + tsdown: + specifier: 0.18.0 + version: 0.18.0(@arethetypeswrong/core@0.18.2)(synckit@0.11.11)(typescript@5.9.3) typescript: specifier: ~5.9.0 version: 5.9.3 @@ -305,8 +314,8 @@ importers: specifier: ^9.39.1 version: 9.39.1 tsdown: - specifier: ^0.17.0 - version: 0.17.2(synckit@0.11.11)(typescript@5.9.3) + specifier: 0.18.0 + version: 0.18.0(@arethetypeswrong/core@0.18.2)(synckit@0.11.11)(typescript@5.9.3) tsx: specifier: ^4.16.2 version: 4.21.0 @@ -314,7 +323,14 @@ importers: specifier: ^8.39.0 version: 8.47.0(eslint@9.39.1)(typescript@5.9.3) - packages/skuba-dive: {} + packages/skuba-dive: + devDependencies: + skuba: + specifier: workspace:* + version: link:../.. + tsdown: + specifier: 0.18.0 + version: 0.18.0(@arethetypeswrong/core@0.18.2)(synckit@0.11.11)(typescript@5.9.3) packages/vitest-koa-mocks: dependencies: @@ -330,6 +346,10 @@ importers: vitest: specifier: ^4.0.14 version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(tsx@4.21.0)(yaml@2.8.1) + devDependencies: + tsdown: + specifier: 0.18.0 + version: 0.18.0(@arethetypeswrong/core@0.18.2)(synckit@0.11.11)(typescript@5.9.3) template/express-rest-api: dependencies: @@ -559,6 +579,13 @@ importers: packages: + '@andrewbranch/untar.js@1.0.3': + resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} + + '@arethetypeswrong/core@0.18.2': + resolution: {integrity: sha512-GiwTmBFOU1/+UVNqqCGzFJYfBXEytUkiI+iRZ6Qx7KmUVtLm00sYySkfe203C9QtPG11yOz1ZaMek8dT/xnlgg==} + engines: {node: '>=20'} + '@ast-grep/lang-json@0.0.5': resolution: {integrity: sha512-pA+QNncxNFIGzL1VIqZCYTkOIcdNInOr+z37/ch31qvFjxyOsvkQkgjeQLKHkYfN+1bF7m5AZS6aE1CvG2dZjw==} peerDependencies: @@ -947,6 +974,9 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@braidai/lang@1.1.2': + resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} + '@changesets/apply-release-plan@7.0.14': resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==} @@ -1790,6 +1820,9 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + '@loaderkit/resolve@1.0.4': + resolution: {integrity: sha512-rJzYKVcV4dxJv+vW6jlvagF8zvGxHJ2+HTr1e2qOejfmGhAApgJHl8Aog4mMszxceTRiKTTbnpgmTO1bEZHV/A==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -3853,6 +3886,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delay@5.0.0: resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} engines: {node: '>=10'} @@ -4346,6 +4382,9 @@ packages: picomatch: optional: true + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} @@ -5377,6 +5416,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -7091,8 +7134,8 @@ packages: tsconfig-seek@2.0.0: resolution: {integrity: sha512-pcKqW1I+CxGS6LI2QcNSdHGkJUWIP4VzcRzYAFH/LcQOlCBtD2q5w7RXZrIQxSANtcdN2RIT+o5pYEIPd81vRQ==} - tsdown@0.17.2: - resolution: {integrity: sha512-SuU+0CWm/95KfXqojHTVuwcouIsdn7HpYcwDyOdKktJi285NxKwysjFUaxYLxpCNqqPvcFvokXLO4dZThRwzkw==} + tsdown@0.18.0: + resolution: {integrity: sha512-Yotdh3NzizysnqR96xfpHFYtEntk1cZvSRHz8A+Pn3ZHNdTQa4fBQxh6HHzWZwfjdQv47xb7GCv6vEWMtxBirw==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: @@ -7209,6 +7252,11 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + typescript@5.6.1-rc: + resolution: {integrity: sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -7594,6 +7642,19 @@ packages: snapshots: + '@andrewbranch/untar.js@1.0.3': {} + + '@arethetypeswrong/core@0.18.2': + dependencies: + '@andrewbranch/untar.js': 1.0.3 + '@loaderkit/resolve': 1.0.4 + cjs-module-lexer: 1.4.3 + fflate: 0.8.2 + lru-cache: 11.2.4 + semver: 7.7.3 + typescript: 5.6.1-rc + validate-npm-package-name: 5.0.1 + '@ast-grep/lang-json@0.0.5': dependencies: '@ast-grep/setup-lang': 0.0.5 @@ -8347,6 +8408,8 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@braidai/lang@1.1.2': {} + '@changesets/apply-release-plan@7.0.14': dependencies: '@changesets/config': 3.1.2 @@ -9255,6 +9318,10 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} + '@loaderkit/resolve@1.0.4': + dependencies: + '@braidai/lang': 1.1.2 + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.28.4 @@ -10606,24 +10673,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.47.0 - eslint: 9.39.1 - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - optional: true - '@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.47.0 @@ -11648,6 +11697,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + defu@6.1.4: {} + delay@5.0.0: {} delayed-stream@1.0.0: {} @@ -11953,7 +12004,7 @@ snapshots: dependencies: eslint: 9.39.1 - eslint-config-seek@15.0.1(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(jest@30.2.0(@types/node@24.10.3)(ts-node@10.9.2(@types/node@24.10.3)(typescript@5.9.3)))(typescript@5.9.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(tsx@4.21.0)(yaml@2.8.1)): + eslint-config-seek@15.0.1(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(jest@30.2.0(@types/node@24.10.3)(ts-node@10.9.2(@types/node@24.10.3)(typescript@5.9.3)))(typescript@5.9.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@vitest/eslint-plugin': 1.5.2(eslint@9.39.1)(typescript@5.9.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.3)(tsx@4.21.0)(yaml@2.8.1)) eslint: 9.39.1 @@ -11962,7 +12013,7 @@ snapshots: eslint-plugin-cypress: 5.2.0(eslint@9.39.1) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) eslint-plugin-import-zod: 1.2.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) - eslint-plugin-jest: 29.2.1(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(jest@30.2.0(@types/node@24.10.3)(ts-node@10.9.2(@types/node@24.10.3)(typescript@5.9.3)))(typescript@5.9.3) + eslint-plugin-jest: 29.2.1(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(jest@30.2.0(@types/node@24.10.3)(ts-node@10.9.2(@types/node@24.10.3)(typescript@5.9.3)))(typescript@5.9.3) eslint-plugin-react: 7.37.5(eslint@9.39.1) eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1) globals: 16.5.0 @@ -12026,12 +12077,12 @@ snapshots: '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) eslint: 9.39.1 - eslint-plugin-jest@29.2.1(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(jest@30.2.0(@types/node@24.10.3)(ts-node@10.9.2(@types/node@24.10.3)(typescript@5.9.3)))(typescript@5.9.3): + eslint-plugin-jest@29.2.1(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(jest@30.2.0(@types/node@24.10.3)(ts-node@10.9.2(@types/node@24.10.3)(typescript@5.9.3)))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) eslint: 9.39.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) jest: 30.2.0(@types/node@24.10.3)(ts-node@10.9.2(@types/node@24.10.3)(typescript@5.9.3)) transitivePeerDependencies: - supports-color @@ -12349,6 +12400,8 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fflate@0.8.2: {} + figures@2.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -13575,6 +13628,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.2.4: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -15589,10 +15644,11 @@ snapshots: tsconfig-seek@2.0.0: {} - tsdown@0.17.2(synckit@0.11.11)(typescript@5.9.3): + tsdown@0.18.0(@arethetypeswrong/core@0.18.2)(synckit@0.11.11)(typescript@5.9.3): dependencies: ansis: 4.2.0 cac: 6.7.14 + defu: 6.1.4 empathic: 2.0.0 hookable: 5.5.3 import-without-cache: 0.2.3 @@ -15606,6 +15662,7 @@ snapshots: unconfig-core: 7.4.2 unrun: 0.2.19(synckit@0.11.11) optionalDependencies: + '@arethetypeswrong/core': 0.18.2 typescript: 5.9.3 transitivePeerDependencies: - '@ts-macro/tsc' @@ -15710,6 +15767,8 @@ snapshots: transitivePeerDependencies: - supports-color + typescript@5.6.1-rc: {} + typescript@5.9.3: {} uglify-js@3.19.3: diff --git a/scripts/build.sh b/scripts/build.sh index 7bf3ecc85..f06af46c2 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -2,12 +2,14 @@ set -e -tsx --conditions @seek/skuba/source src/skuba build "${@}" - -chmod +x 'lib/skuba.js' +tsdown pnpm --filter @skuba-lib/api build pnpm --filter @skuba-lib/vitest-koa-mocks build +pnpm --filter eslint-config-skuba build + pnpm --filter eslint-plugin-skuba build + +pnpm --filter skuba-dive build diff --git a/src/cli/lint/eslint.ts b/src/cli/lint/eslint.ts index ca563f715..c931df87f 100644 --- a/src/cli/lint/eslint.ts +++ b/src/cli/lint/eslint.ts @@ -1,5 +1,4 @@ import { styleText } from 'node:util'; -import path from 'path'; import { isMainThread } from 'worker_threads'; import { createLogger } from '../../utils/logging.js'; @@ -18,10 +17,7 @@ export const runESLintInCurrentThread = ({ debug, eslintConfigFile }: Input) => ); export const runESLintInWorkerThread = (input: Input) => - execWorkerThread( - path.posix.join(__dirname, 'eslint.js'), - input, - ); + execWorkerThread(__filename, input); if (!isMainThread) { postWorkerOutput( diff --git a/src/cli/lint/internalLints/refreshConfigFiles.test.ts b/src/cli/lint/internalLints/refreshConfigFiles.test.ts index 577493bab..3ffff72b7 100644 --- a/src/cli/lint/internalLints/refreshConfigFiles.test.ts +++ b/src/cli/lint/internalLints/refreshConfigFiles.test.ts @@ -2,7 +2,6 @@ import path from 'path'; import fs from 'fs-extra'; -import { Git } from '../../../index.js'; import { log } from '../../../utils/logging.js'; import { detectPackageManager } from '../../../utils/packageManager.js'; import * as project from '../../configure/analysis/project.js'; @@ -12,6 +11,8 @@ import { refreshConfigFiles, } from './refreshConfigFiles.js'; +import { Git } from '@skuba-lib/api'; + const stdoutMock = jest.fn(); const stdout = () => stdoutMock.mock.calls.flat(1).join(''); @@ -34,7 +35,7 @@ jest.mock('../../../utils/template', () => ({ jest.mock('../../configure/analysis/project'); -jest.mock('../../..', () => ({ +jest.mock('@skuba-lib/api', () => ({ Git: { isFileGitIgnored: jest.fn(), findRoot: () => Promise.resolve('/path/to/git/root'), diff --git a/src/cli/lint/internalLints/refreshConfigFiles.ts b/src/cli/lint/internalLints/refreshConfigFiles.ts index ac8405338..7d8a89a59 100644 --- a/src/cli/lint/internalLints/refreshConfigFiles.ts +++ b/src/cli/lint/internalLints/refreshConfigFiles.ts @@ -3,7 +3,6 @@ import { inspect, stripVTControlCharacters as stripAnsi } from 'util'; import fs from 'fs-extra'; -import { Git } from '../../../index.js'; import { findCurrentWorkspaceProjectRoot, findWorkspaceRoot, @@ -19,6 +18,8 @@ import { createDestinationFileReader } from '../../configure/analysis/project.js import { mergeWithConfigFile } from '../../configure/processing/configFile.js'; import type { InternalLintResult } from '../internal.js'; +import { Git } from '@skuba-lib/api'; + type ConditionOptions = { packageManager: PackageManagerConfig; isInWorkspaceRoot: boolean; diff --git a/src/cli/lint/prettier.ts b/src/cli/lint/prettier.ts index 2d92efe30..9db0f9a69 100644 --- a/src/cli/lint/prettier.ts +++ b/src/cli/lint/prettier.ts @@ -1,5 +1,4 @@ import { styleText } from 'node:util'; -import path from 'path'; import { isMainThread } from 'worker_threads'; import { createLogger } from '../../utils/logging.js'; @@ -14,10 +13,7 @@ export const runPrettierInCurrentThread = ({ debug }: Input) => runPrettier('lint', createLogger({ debug, prefixes: [LOG_PREFIX] })); export const runPrettierInWorkerThread = (input: Input) => - execWorkerThread( - path.posix.join(__dirname, 'prettier.js'), - input, - ); + execWorkerThread(__filename, input); if (!isMainThread) { postWorkerOutput( diff --git a/src/skuba.ts b/src/skuba.ts index 67d64ed46..205114834 100644 --- a/src/skuba.ts +++ b/src/skuba.ts @@ -36,7 +36,7 @@ const skuba = async () => { /* eslint-disable @typescript-eslint/no-require-imports */ const commandModule = require( - path.join(COMMAND_DIR, moduleName, 'index.js'), + path.join(COMMAND_DIR, moduleName, 'index.cjs'), ) as unknown; if (!hasProp(commandModule, moduleName)) { diff --git a/src/utils/args.ts b/src/utils/args.ts index 180d6f3e8..d8afe9af6 100644 --- a/src/utils/args.ts +++ b/src/utils/args.ts @@ -29,7 +29,9 @@ export const hasSerialFlag = (args = process.argv, env = process.env) => * ``` */ export const parseProcessArgs = (args = process.argv) => { - const skubaIdx = args.findIndex((chunk) => /skuba(\.[jt]s)?$/.test(chunk)); + const skubaIdx = args.findIndex((chunk) => + /skuba(\.(c|m)?[jt]s)?$/.test(chunk), + ); assert(skubaIdx >= 0, 'Cannot parse args for `skuba`'); diff --git a/tsconfig.json b/tsconfig.json index 01a1d2398..d1380fd8f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,8 @@ "removeComments": false, "target": "ES2023", "moduleResolution": "Node16", - "module": "node20" + "module": "node20", + "skipLibCheck": true }, "exclude": [ "integration/**/*", diff --git a/tsdown.config.mts b/tsdown.config.mts new file mode 100644 index 000000000..e513c86ae --- /dev/null +++ b/tsdown.config.mts @@ -0,0 +1,20 @@ +import { defineConfig } from 'tsdown/config'; + +export default defineConfig({ + entry: [ + 'src/skuba.ts', + 'src/index.ts', + 'src/cli/*/index.ts', + 'src/cli/test/reporters/github/index.ts', + ], + dts: true, + format: ['cjs', 'esm'], + outDir: 'lib', + exports: { + devExports: '@seek/skuba/source', + }, + attw: true, + failOnWarn: false, + unbundle: true, + copy: ['jest-preset.js', 'jest-preset.d.ts', 'config'], +});