diff --git a/.eslintrc b/.eslintrc index 19106e5b..95a3175d 100644 --- a/.eslintrc +++ b/.eslintrc @@ -4,7 +4,8 @@ "node": true }, "parserOptions": { - "ecmaVersion": "latest" + "ecmaVersion": "latest", + "sourceType": "module" }, "extends": [ "plugin:prettier/recommended", diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3f7ed8c0..11e2b6f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,19 +4,28 @@ on: - push - pull_request +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: default: + name: Lint and Test with Node.js ${{ matrix.node }} on ${{ matrix.os }} strategy: matrix: node: - 16 - 18 - 20 + - 22 os: - ubuntu-latest - windows-latest - macos-latest + fail-fast: false runs-on: ${{ matrix.os }} + env: + YARN_IGNORE_NODE: 1 steps: - uses: actions/checkout@v4 @@ -33,17 +42,12 @@ jobs: with: node-version: ${{ matrix.node }} cache: yarn - env: - YARN_IGNORE_NODE: 1 - name: Install Dependencies run: yarn --immutable - env: - YARN_IGNORE_NODE: 1 - name: Build, Lint and Test run: yarn run-s build lint test typecov env: EFF_NO_LINK_RULES: true PARSER_NO_WATCH: true - YARN_IGNORE_NODE: 1 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 17a1049f..925e4126 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -4,12 +4,18 @@ on: push: branches: - master + - v3.x pull_request: branches: - master + - v3.x schedule: - cron: '16 11 * * 2' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: analyze: name: Analyze @@ -30,15 +36,15 @@ jobs: uses: actions/checkout@v4 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} queries: +security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: '/language:${{ matrix.language }}' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1b54dd01..92ab801f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,6 +4,11 @@ on: push: branches: - master + - v3.x + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: release: diff --git a/.github/workflows/size-limit.yml b/.github/workflows/size-limit.yml index d09c4940..44884f4c 100644 --- a/.github/workflows/size-limit.yml +++ b/.github/workflows/size-limit.yml @@ -4,11 +4,16 @@ on: pull_request: branches: - master + - v3.x permissions: contents: read pull-requests: write +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: size-limit: runs-on: ubuntu-latest diff --git a/.nvmrc b/.nvmrc index 1fc51668..9be0c705 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.20.6 +18.20.7 diff --git a/.size-limit.json b/.size-limit.json index 0c0657ad..bdf75734 100644 --- a/.size-limit.json +++ b/.size-limit.json @@ -1,6 +1,6 @@ [ { "path": "./lib/index.js", - "limit": "3kB" + "limit": "3.2kB" } ] diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dd6496f..dc7202b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,29 @@ # Changelog +## 3.8.7 + +### Patch Changes + +- [#377](https://github.com/import-js/eslint-import-resolver-typescript/pull/377) [`a14fdd9`](https://github.com/import-js/eslint-import-resolver-typescript/commit/a14fdd95011c4c09b74f71854410f684c0f04bc5) Thanks [@carlocorradini](https://github.com/carlocorradini)! - fix: include mapper with no files and force non-dynamic projects to use absolute paths + +## 3.8.6 + +### Patch Changes + +- [#374](https://github.com/import-js/eslint-import-resolver-typescript/pull/374) [`c9d5ab0`](https://github.com/import-js/eslint-import-resolver-typescript/commit/c9d5ab0fa963bd891b6f2ae312ae3ec10a397b7c) Thanks [@JounQin](https://github.com/JounQin)! - fix: add support for importing with .js extension as tsx importee + +## 3.8.5 + +### Patch Changes + +- [#372](https://github.com/import-js/eslint-import-resolver-typescript/pull/372) [`366eeaf`](https://github.com/import-js/eslint-import-resolver-typescript/commit/366eeaf8ba87adf7c2e165b0a73406292c002ad9) Thanks [@carlocorradini](https://github.com/carlocorradini)! - fix: if file has no corresponding mapper function, apply all of them, starting with the nearest one. + +## 3.8.4 + +### Patch Changes + +- [#370](https://github.com/import-js/eslint-import-resolver-typescript/pull/370) [`c940785`](https://github.com/import-js/eslint-import-resolver-typescript/commit/c94078504cfb6fd17b775c53d268962a56a2d118) Thanks [@JounQin](https://github.com/JounQin)! - fix: support multiple matching ts paths + ## 3.8.3 ### Patch Changes diff --git a/package.json b/package.json index 758c4c91..128f7b89 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eslint-import-resolver-typescript", - "version": "3.8.3", + "version": "3.8.7", "type": "module", "description": "This plugin adds `TypeScript` support to `eslint-plugin-import`", "repository": "git+https://github.com/import-js/eslint-import-resolver-typescript", @@ -54,9 +54,10 @@ "test:dotInclude": "eslint --ext ts,tsx tests/dotInclude --ignore-pattern \"!.dot\"", "test:dotPaths": "eslint --ext ts,tsx tests/dotPaths --ignore-pattern \"!.dot\"", "test:dotProject": "eslint --ext ts,tsx tests/dotProject --ignore-pattern \"!.dot\"", - "test:importXResolverV3": "eslint --config=tests/importXResolverV3/eslint.config.js tests/importXResolverV3", + "test:importXResolverV3": "cross-env ESLINT_USE_FLAT_CONFIG=true eslint --config=tests/importXResolverV3/eslint.config.js tests/importXResolverV3", "test:multipleEslintrcs": "eslint --ext ts,tsx tests/multipleEslintrcs", "test:multipleTsconfigs": "eslint --ext ts,tsx tests/multipleTsconfigs", + "test:nearestTsconfig": "eslint --ext ts,tsx tests/nearestTsconfig", "test:withJsExtension": "node tests/withJsExtension/test.js && eslint --ext ts,tsx tests/withJsExtension", "test:withJsconfig": "eslint --ext js tests/withJsconfig", "test:withPaths": "eslint --ext ts,tsx tests/withPaths", @@ -90,14 +91,15 @@ "devDependencies": { "@1stg/eslint-config": "7.0.1", "@1stg/lib-config": "^12.0.1", - "@changesets/changelog-github": "^0.5.0", + "@changesets/changelog-github": "^0.5.1", "@changesets/cli": "^2.27.12", "@commitlint/cli": "^17.8.1", "@mozilla/glean": "^3.0.0", "@pkgr/rollup": "^4.1.3", "@types/debug": "^4.1.12", - "@types/node": "^18.19.74", + "@types/node": "^18.19.78", "@types/unist": "^2.0.11", + "cross-env": "^7.0.3", "dummy.js": "link:dummy.js", "eslint": "^8.57.1", "eslint-import-resolver-typescript": "link:.", @@ -111,7 +113,7 @@ "size-limit": "^11.0.0", "size-limit-preset-node-lib": "^0.3.0", "type-coverage": "^2.27.0", - "typescript": "^5.3.2" + "typescript": "~5.1.0" }, "resolutions": { "eslint-import-resolver-typescript": "link:.", diff --git a/src/index.ts b/src/index.ts index bc92c25d..46ba89f9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -112,6 +112,7 @@ let prevCwd: string let mappersCachedOptions: InternalResolverOptions let mappers: Array<{ + path: string files: Set mapperFn: NonNullable> }> = [] @@ -181,22 +182,30 @@ export function resolve( initMappers(cachedOptions) - const mappedPath = getMappedPath(source, file, cachedOptions.extensions, true) - if (mappedPath) { - log('matched ts path:', mappedPath) + let mappedPaths = getMappedPaths(source, file, cachedOptions.extensions, true) + + if (mappedPaths.length > 0) { + log('matched ts path:', ...mappedPaths) + } else { + mappedPaths = [source] } // note that even if we map the path, we still need to do a final resolve - let foundNodePath: string | null - try { - foundNodePath = - resolver.resolveSync( + let foundNodePath: string | undefined + for (const mappedPath of mappedPaths) { + try { + const resolved = resolver.resolveSync( {}, path.dirname(path.resolve(file)), - mappedPath ?? source, - ) || null - } catch { - foundNodePath = null + mappedPath, + ) + if (resolved) { + foundNodePath = resolved + break + } + } catch { + log('failed to resolve with', mappedPath) + } } // naive attempt at `@types/*` resolution, @@ -286,16 +295,16 @@ const isModule = (modulePath?: string | undefined): modulePath is string => { * @returns The mapped path of the module or undefined */ // eslint-disable-next-line sonarjs/cognitive-complexity -function getMappedPath( +function getMappedPaths( source: string, file: string, extensions: string[] = defaultExtensions, retry?: boolean, -): string | undefined { +): string[] { const originalExtensions = extensions extensions = ['', ...extensions] - let paths: Array | undefined = [] + let paths: string[] = [] if (RELATIVE_PATH_PATTERN.test(source)) { const resolved = path.resolve(path.dirname(file), source) @@ -303,72 +312,95 @@ function getMappedPath( paths = [resolved] } } else { - paths = [ - ...new Set( - mappers - .filter(({ files }) => files.has(file)) - .map(({ mapperFn }) => - mapperFn(source).map(item => [ - ...extensions.map(ext => `${item}${ext}`), - ...originalExtensions.map(ext => `${item}/index${ext}`), - ]), - ) - .flat(2) - .map(toNativePathSeparator), - ), - ].filter(mappedPath => { - try { - const stat = fs.statSync(mappedPath, { throwIfNoEntry: false }) - if (stat === undefined) return false - if (stat.isFile()) return true - - // Maybe this is a module dir? - if (stat.isDirectory()) { - return isModule(mappedPath) + // Filter mapper functions associated with file + let mapperFns: Array>> = + mappers + .filter(({ files }) => files.has(file)) + .map(({ mapperFn }) => mapperFn) + if (mapperFns.length === 0) { + // If empty, try all mapper functions, starting with the nearest one + mapperFns = mappers + .map(mapper => ({ + mapperFn: mapper.mapperFn, + counter: equalChars(path.dirname(file), path.dirname(mapper.path)), + })) + .sort( + (a, b) => + // Sort in descending order where the nearest one has the longest counter + b.counter - a.counter, + ) + .map(({ mapperFn }) => mapperFn) + } + paths = mapperFns + .map(mapperFn => + mapperFn(source).map(item => [ + ...extensions.map(ext => `${item}${ext}`), + ...originalExtensions.map(ext => `${item}/index${ext}`), + ]), + ) + .flat(2) + .map(toNativePathSeparator) + .filter(mappedPath => { + try { + const stat = fs.statSync(mappedPath, { throwIfNoEntry: false }) + if (stat === undefined) return false + if (stat.isFile()) return true + + // Maybe this is a module dir? + if (stat.isDirectory()) { + return isModule(mappedPath) + } + } catch { + return false } - } catch { - return false - } - return false - }) + return false + }) } if (retry && paths.length === 0) { const isJs = JS_EXT_PATTERN.test(source) if (isJs) { const jsExt = path.extname(source) + // cjs -> cts, js -> ts, jsx -> tsx, mjs -> mts const tsExt = jsExt.replace('js', 'ts') + const basename = source.replace(JS_EXT_PATTERN, '') - const resolved = - getMappedPath(basename + tsExt, file) || - getMappedPath( + let resolved = getMappedPaths(basename + tsExt, file) + + if (resolved.length === 0 && jsExt === '.js') { + // js -> tsx + const tsxExt = jsExt.replace('js', 'tsx') + resolved = getMappedPaths(basename + tsxExt, file) + } + + if (resolved.length === 0) { + resolved = getMappedPaths( basename + '.d' + (tsExt === '.tsx' ? '.ts' : tsExt), file, ) + } - if (resolved) { + if (resolved.length > 0) { return resolved } } for (const ext of extensions) { + const mappedPaths = isJs ? [] : getMappedPaths(source + ext, file) const resolved = - (isJs ? null : getMappedPath(source + ext, file)) || - getMappedPath(source + `/index${ext}`, file) + mappedPaths.length > 0 + ? mappedPaths + : getMappedPaths(source + `/index${ext}`, file) - if (resolved) { + if (resolved.length > 0) { return resolved } } } - if (paths.length > 1) { - log('found multiple matching ts paths:', paths) - } - - return paths[0] + return paths } // eslint-disable-next-line sonarjs/cognitive-complexity @@ -398,7 +430,9 @@ function initMappers(options: InternalResolverOptions) { // Turn glob patterns into paths const projectPaths = [ ...new Set([ - ...configPaths.filter(path => !isDynamicPattern(path)), + ...configPaths + .filter(p => !isDynamicPattern(p)) + .map(p => path.resolve(process.cwd(), p)), ...globSync( configPaths.filter(path => isDynamicPattern(path)), { @@ -472,12 +506,8 @@ function initMappers(options: InternalResolverOptions) { : []), ] - if (files.length === 0) { - // eslint-disable-next-line unicorn/no-useless-undefined - return undefined - } - return { + path: toNativePathSeparator(tsconfigResult.path), files: new Set(files.map(toNativePathSeparator)), mapperFn, } @@ -542,3 +572,23 @@ function toNativePathSeparator(p: string) { function isDefined(value: T | null | undefined): value is T { return value !== null && value !== undefined } + +/** + * Counts how many characters in strings `a` and `b` are exactly the same and in the same position. + * + * @param {string} a First string + * @param {string} b Second string + * @returns Number of matching characters + */ +function equalChars(a: string, b: string): number { + if (a.length === 0 || b.length === 0) { + return 0 + } + + let i = 0 + const length = Math.min(a.length, b.length) + while (i < length && a.charAt(i) === b.charAt(i)) { + i += 1 + } + return i +} diff --git a/tests/importXResolverV3/eslint.config.js b/tests/importXResolverV3/eslint.config.js index 70a0e565..4fe2fdd4 100644 --- a/tests/importXResolverV3/eslint.config.js +++ b/tests/importXResolverV3/eslint.config.js @@ -1,20 +1,31 @@ const path = require('path') -const { createTypeScriptImportResolver } = require('../../lib/index.cjs') +const importX = require('eslint-plugin-import-x') + +const { createTypeScriptImportResolver } = require('../..') const globPattern = './packages/*/tsconfig.json' // in normal cases this is not needed because the __dirname would be the root const absoluteGlobPath = path.join(__dirname, globPattern) -module.exports = { - ...require('eslint-plugin-import-x').flatConfigs.typescript, - settings: { - ...require('eslint-plugin-import-x').flatConfigs.typescript.settings, - 'import-x/resolver-next': [ - createTypeScriptImportResolver({ - project: absoluteGlobPath, - alwaysTryTypes: true, - }), - ], - }, -} +const base = require('../baseEslintConfig.cjs')() + +module.exports = + // don't run on node 16 because lacking of `structuredClone` + +process.versions.node.split('.')[0] <= 16 + ? {} + : { + files: ['**/*.ts', '**/*.tsx'], + plugins: { + import: importX, + }, + settings: { + ...importX.flatConfigs.typescript.settings, + 'import-x/resolver-next': [ + createTypeScriptImportResolver({ + project: absoluteGlobPath, + }), + ], + }, + rules: base.rules, + } diff --git a/tests/nearestTsconfig/.eslintrc.cjs b/tests/nearestTsconfig/.eslintrc.cjs new file mode 100644 index 00000000..285ee8d6 --- /dev/null +++ b/tests/nearestTsconfig/.eslintrc.cjs @@ -0,0 +1,10 @@ +const path = require('node:path') + +const project = [ + 'tsconfig.json', + 'a/tsconfig.json', + 'a/b/tsconfig.json', + 'a/b/c/tsconfig.json', +].map(tsconfig => path.resolve(__dirname, tsconfig)) + +module.exports = require('../baseEslintConfig.cjs')(project) diff --git a/tests/nearestTsconfig/a/app/app.ts b/tests/nearestTsconfig/a/app/app.ts new file mode 100644 index 00000000..9597f5bf --- /dev/null +++ b/tests/nearestTsconfig/a/app/app.ts @@ -0,0 +1,2 @@ +import 'components/a' +import 'components/root' diff --git a/tests/nearestTsconfig/a/b/app/app.ts b/tests/nearestTsconfig/a/b/app/app.ts new file mode 100644 index 00000000..61b335ec --- /dev/null +++ b/tests/nearestTsconfig/a/b/app/app.ts @@ -0,0 +1,2 @@ +import 'components/b' +import 'components/root' diff --git a/tests/nearestTsconfig/a/b/c/app/app.ts b/tests/nearestTsconfig/a/b/c/app/app.ts new file mode 100644 index 00000000..e49cf01e --- /dev/null +++ b/tests/nearestTsconfig/a/b/c/app/app.ts @@ -0,0 +1,2 @@ +import 'components/c' +import 'components/root' diff --git a/tests/nearestTsconfig/a/b/c/components/c.ts b/tests/nearestTsconfig/a/b/c/components/c.ts new file mode 100644 index 00000000..da4b0eda --- /dev/null +++ b/tests/nearestTsconfig/a/b/c/components/c.ts @@ -0,0 +1 @@ +export default 'c' diff --git a/tests/nearestTsconfig/a/b/c/tsconfig.json b/tests/nearestTsconfig/a/b/c/tsconfig.json new file mode 100644 index 00000000..6f4b6a28 --- /dev/null +++ b/tests/nearestTsconfig/a/b/c/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "components/*": ["../../../components/*", "./components/*"] + } + }, + "files": ["components/c.ts"] +} diff --git a/tests/nearestTsconfig/a/b/components/b.ts b/tests/nearestTsconfig/a/b/components/b.ts new file mode 100644 index 00000000..a3bb4904 --- /dev/null +++ b/tests/nearestTsconfig/a/b/components/b.ts @@ -0,0 +1 @@ +export default 'b' diff --git a/tests/nearestTsconfig/a/b/tsconfig.json b/tests/nearestTsconfig/a/b/tsconfig.json new file mode 100644 index 00000000..fedccddb --- /dev/null +++ b/tests/nearestTsconfig/a/b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "components/*": ["../../components/*", "./components/*"] + } + }, + "files": ["components/b.ts"] +} diff --git a/tests/nearestTsconfig/a/components/a.ts b/tests/nearestTsconfig/a/components/a.ts new file mode 100644 index 00000000..90bd54cd --- /dev/null +++ b/tests/nearestTsconfig/a/components/a.ts @@ -0,0 +1 @@ +export default 'a' diff --git a/tests/nearestTsconfig/a/tsconfig.json b/tests/nearestTsconfig/a/tsconfig.json new file mode 100644 index 00000000..c01728fe --- /dev/null +++ b/tests/nearestTsconfig/a/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "components/*": ["../components/*", "./components/*"] + } + }, + "files": ["components/a.ts"] +} diff --git a/tests/nearestTsconfig/app/app.ts b/tests/nearestTsconfig/app/app.ts new file mode 100644 index 00000000..60f1cde9 --- /dev/null +++ b/tests/nearestTsconfig/app/app.ts @@ -0,0 +1 @@ +import 'components/root' diff --git a/tests/nearestTsconfig/components/root.ts b/tests/nearestTsconfig/components/root.ts new file mode 100644 index 00000000..8c841b31 --- /dev/null +++ b/tests/nearestTsconfig/components/root.ts @@ -0,0 +1 @@ +export default 'root' diff --git a/tests/nearestTsconfig/tsconfig.json b/tests/nearestTsconfig/tsconfig.json new file mode 100644 index 00000000..21cf5788 --- /dev/null +++ b/tests/nearestTsconfig/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "components/*": ["./components/*"] + } + }, + "files": ["components/root.ts"] +} diff --git a/tests/withPaths/index.ts b/tests/withPaths/index.ts index 594e79d4..696bf409 100644 --- a/tests/withPaths/index.ts +++ b/tests/withPaths/index.ts @@ -6,9 +6,13 @@ import './subfolder/tsxImportee' // import using tsconfig.json path mapping import 'folder/tsImportee' +import 'folder/tsImportee.js' import 'folder/tsxImportee' +import 'folder/tsxImportee.js' import 'folder/subfolder/tsImportee' +import 'folder/subfolder/tsImportee.js' import 'folder/subfolder/tsxImportee' +import 'folder/subfolder/tsxImportee.js' // import module with typings set in package.json import 'folder/module' diff --git a/yarn.lock b/yarn.lock index 420dcfa3..841bba11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2076,14 +2076,14 @@ __metadata: languageName: node linkType: hard -"@changesets/changelog-github@npm:^0.5.0": - version: 0.5.0 - resolution: "@changesets/changelog-github@npm:0.5.0" +"@changesets/changelog-github@npm:^0.5.1": + version: 0.5.1 + resolution: "@changesets/changelog-github@npm:0.5.1" dependencies: "@changesets/get-github-info": "npm:^0.6.0" - "@changesets/types": "npm:^6.0.0" + "@changesets/types": "npm:^6.1.0" dotenv: "npm:^8.1.0" - checksum: a9c01d918f67c3d5dd38a505da29261518bed932c67fe3eb85cc15a485d32c1d11549cd276f121b4e169f26fb20923b435e931e6a5e83e213623dd8c3733cde9 + checksum: 1284e7dc067652edfa14792196e6036849455d121afabe63e8d1a7dc0e8fb0310edb58d1130f2a5944819ae4011eeecc7e0c44c1cda43e6a581a3add187c3447 languageName: node linkType: hard @@ -2268,10 +2268,10 @@ __metadata: languageName: node linkType: hard -"@changesets/types@npm:^6.0.0": - version: 6.0.0 - resolution: "@changesets/types@npm:6.0.0" - checksum: 214c58ff3e3da019c578b94815ec6748729a38b665d950acddf53f3a23073ac7a57dce45812c4bec0cbcd6902c84a482c804457d4c903602005b2399de8a4021 +"@changesets/types@npm:^6.0.0, @changesets/types@npm:^6.1.0": + version: 6.1.0 + resolution: "@changesets/types@npm:6.1.0" + checksum: 2dcd00712cb85d0c53afdd8d0e856b4bf9c0ce8dc36c838c918d44799aacd9ba8659b9ff610ff92b94fc03c8fd2b52c5b05418fcf8a1bd138cd9182414ede373 languageName: node linkType: hard @@ -3724,12 +3724,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^18.0.0, @types/node@npm:^18.19.74": - version: 18.19.74 - resolution: "@types/node@npm:18.19.74" +"@types/node@npm:^18.0.0, @types/node@npm:^18.19.78": + version: 18.19.78 + resolution: "@types/node@npm:18.19.78" dependencies: undici-types: "npm:~5.26.4" - checksum: 2306bd0b41cdd528b890b210b96f287a5b5035c128f62636057d6616bd612b3f53d32d77f7e76ef41a9f130ea691e6980e6d5942dd625df05d3a641764fddb78 + checksum: c9b285b965c054d4ffd511fd31c18b3d1512dfdf2af0f0340b19a225716aedc2a26d87dadc2dd27b33e2fa6cbcdacff2bb8bf70f91978b2ef3b18dfa327afdfb languageName: node linkType: hard @@ -5357,6 +5357,18 @@ __metadata: languageName: node linkType: hard +"cross-env@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-env@npm:7.0.3" + dependencies: + cross-spawn: "npm:^7.0.1" + bin: + cross-env: src/bin/cross-env.js + cross-env-shell: src/bin/cross-env-shell.js + checksum: e99911f0d31c20e990fd92d6fd001f4b01668a303221227cc5cb42ed155f086351b1b3bd2699b200e527ab13011b032801f8ce638e6f09f854bdf744095e604c + languageName: node + linkType: hard + "cross-spawn@npm:^6.0.5": version: 6.0.5 resolution: "cross-spawn@npm:6.0.5" @@ -5370,7 +5382,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -6144,15 +6156,16 @@ __metadata: dependencies: "@1stg/eslint-config": "npm:7.0.1" "@1stg/lib-config": "npm:^12.0.1" - "@changesets/changelog-github": "npm:^0.5.0" + "@changesets/changelog-github": "npm:^0.5.1" "@changesets/cli": "npm:^2.27.12" "@commitlint/cli": "npm:^17.8.1" "@mozilla/glean": "npm:^3.0.0" "@nolyfill/is-core-module": "npm:1.0.39" "@pkgr/rollup": "npm:^4.1.3" "@types/debug": "npm:^4.1.12" - "@types/node": "npm:^18.19.74" + "@types/node": "npm:^18.19.78" "@types/unist": "npm:^2.0.11" + cross-env: "npm:^7.0.3" debug: "npm:^4.3.7" dummy.js: "link:dummy.js" enhanced-resolve: "npm:^5.15.0" @@ -6172,7 +6185,7 @@ __metadata: stable-hash: "npm:^0.0.4" tinyglobby: "npm:^0.2.12" type-coverage: "npm:^2.27.0" - typescript: "npm:^5.3.2" + typescript: "npm:~5.1.0" peerDependencies: eslint: "*" eslint-plugin-import: "*" @@ -13857,6 +13870,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:~5.1.0": + version: 5.1.6 + resolution: "typescript@npm:5.1.6" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: f347cde665cf43dc4c1c7d9821c7d9bbec3c3914f4bdd82ee490e9fb9f6d99036ed8666463b6a192dd005eeef333c5087d5931bdd51ec853436ff9a670a7417e + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A^4.6.4 || ^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.3.2#optional!builtin": version: 5.3.2 resolution: "typescript@patch:typescript@npm%3A5.3.2#optional!builtin::version=5.3.2&hash=e012d7" @@ -13867,6 +13890,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A~5.1.0#optional!builtin": + version: 5.1.6 + resolution: "typescript@patch:typescript@npm%3A5.1.6#optional!builtin::version=5.1.6&hash=5da071" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: f5481fa3ba0eee8970f46708d13c05650a865ad093b586fc9573f425c64c57ca97e3308e110bb528deb3ccebe83f6fd7b5a8ac90018038da96326a9ccdf8e77c + languageName: node + linkType: hard + "unassert@npm:^2.0.0, unassert@npm:^2.0.2": version: 2.0.2 resolution: "unassert@npm:2.0.2" pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy