Commit 4805c340 authored by Alejandro Celaya's avatar Alejandro Celaya Committed by Alejandro Celaya

Use TS and JSX shared configs from eslint-config-hypothesis

parent d7d77ffd
......@@ -130,7 +130,7 @@ export function serveDev(port, config) {
if (fs.existsSync(path)) {
const content = fs.readFileSync(path, 'utf8');
const headers = readCustomHeaderTags(content);
for (let [key, value] of headers) {
for (const [key, value] of headers) {
res.set(key, value);
}
res.render(req.params.document, templateContext(config));
......
import hypothesis from 'eslint-config-hypothesis';
import jsxA11y from 'eslint-plugin-jsx-a11y';
import hypothesisBase from 'eslint-config-hypothesis/base';
import hypothesisJSX from 'eslint-config-hypothesis/jsx';
import hypothesisTS from 'eslint-config-hypothesis/ts';
import globals from 'globals';
import tseslint from 'typescript-eslint';
export default tseslint.config(
export default [
{
ignores: [
'.tox/**/*',
......@@ -16,41 +16,10 @@ export default tseslint.config(
'dev-server/static/**/*.js',
],
},
...hypothesis,
...tseslint.configs.recommended,
jsxA11y.flatConfigs.recommended,
{
rules: {
'prefer-arrow-callback': [
'error',
{
allowNamedFunctions: true,
},
],
'object-shorthand': ['error', 'properties'],
'react/prop-types': 'off',
'@typescript-eslint/no-unused-vars': 'error',
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': [
'error',
{
functions: false,
typedefs: false,
ignoreTypeReferences: false,
},
],
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-this-alias': 'off',
'@typescript-eslint/consistent-type-assertions': 'error',
'@typescript-eslint/consistent-type-imports': 'error',
},
},
...hypothesisBase,
...hypothesisJSX,
...hypothesisTS,
// Annotator module
{
......@@ -85,4 +54,4 @@ export default tseslint.config(
},
},
},
);
];
......@@ -57,7 +57,7 @@
"escape-html": "^1.0.3",
"escape-string-regexp": "^4.0.0",
"eslint": "^9.12.0",
"eslint-config-hypothesis": "^3.0.0",
"eslint-config-hypothesis": "^3.1.0",
"eslint-plugin-jsx-a11y": "^6.10.0",
"eslint-plugin-mocha": "^10.5.0",
"eslint-plugin-react": "^7.37.1",
......@@ -100,7 +100,7 @@
"tailwindcss": "^3.0.2",
"tiny-emitter": "^2.0.2",
"typescript": "^5.0.2",
"typescript-eslint": "^8.9.0",
"typescript-eslint": "^8.10.0",
"wrap-text": "^1.0.7"
},
"browserslist": "chrome 92, firefox 90, safari 14.1",
......
......@@ -43,7 +43,7 @@ function getHighestVersionTag() {
*/
async function* itemsInGitHubAPIResponse(octokit, options) {
for await (const page of octokit.paginate.iterator(options)) {
for (let item of page.data) {
for (const item of page.data) {
yield item;
}
}
......
......@@ -70,7 +70,7 @@ describe('annotator/anchoring/xpath', () => {
},
].forEach(test => {
it('produces the correct xpath for the provided node', () => {
let node = document.getElementById(test.id);
const node = document.getElementById(test.id);
assert.equal(xpathFromNode(node, document.body), test.xpaths[0]);
});
......
......@@ -77,7 +77,7 @@ describe('createAppConfig', () => {
'onHelpRequest',
];
const service = {};
for (let callback of callbacks) {
for (const callback of callbacks) {
service[callback] = sinon.stub();
}
......@@ -87,7 +87,7 @@ describe('createAppConfig', () => {
const sidebarConfig = createAppConfig(appURL, config);
const sidebarServiceConfig = sidebarConfig.services[0];
for (let callback of callbacks) {
for (const callback of callbacks) {
assert.equal(sidebarServiceConfig[callback + 'Provided'], true);
}
});
......
......@@ -82,7 +82,7 @@ describe('HTMLMetadata', () => {
},
];
for (let source of sources) {
for (const source of sources) {
const metadata = testDocument.getDocumentMetadata();
assert.equal(metadata.title, source.value);
......
......@@ -182,7 +182,7 @@ describe('HTMLIntegration', () => {
const listeners = features.on.args;
integration.destroy();
for (let [event, callback] of listeners) {
for (const [event, callback] of listeners) {
assert.calledWith(features.off, event, callback);
}
});
......
......@@ -299,7 +299,7 @@ describe('ImageTextLayer', () => {
const tolerance = 0.01;
assert.equal(originalBoxes.length, newBoxes.length);
for (let [i, originalBox] of originalBoxes.entries()) {
for (const [i, originalBox] of originalBoxes.entries()) {
const newBox = newBoxes[i];
const leftGap = originalBox.left - imageBox.left;
......
......@@ -379,7 +379,7 @@ describe('annotator/integrations/vitalsource', () => {
const events = ['mouseup', 'mousedown', 'mouseout'];
for (let eventName of events) {
for (const eventName of events) {
const listener = sinon.stub();
document.addEventListener(eventName, listener);
......
......@@ -34,7 +34,6 @@ describe('annotationCounts', () => {
describe('listen for "publicAnnotationCountChanged" event', () => {
const emitEvent = function () {
let crossFrameArgs;
let evt;
let fn;
......@@ -42,7 +41,7 @@ describe('annotationCounts', () => {
const args =
2 <= arguments.length ? Array.prototype.slice.call(arguments, 1) : [];
crossFrameArgs = fakeCrossFrame.on.args;
const crossFrameArgs = fakeCrossFrame.on.args;
for (let i = 0, len = crossFrameArgs.length; i < len; i++) {
evt = crossFrameArgs[i][0];
fn = crossFrameArgs[i][1];
......
......@@ -79,7 +79,7 @@ describe('Guest', () => {
};
const emitSidebarEvent = (event, ...args) => {
for (let [evt, fn] of sidebarRPC().on.args) {
for (const [evt, fn] of sidebarRPC().on.args) {
if (event === evt) {
fn(...args);
}
......
......@@ -408,7 +408,7 @@ describe('annotator/highlighter', () => {
* Returns all the highlight elements.
*/
function createHighlights(root, cssClass = '') {
let highlights = [];
const highlights = [];
for (let i = 0; i < 3; i++) {
const span = document.createElement('span');
......
......@@ -52,7 +52,7 @@ describe('Sidebar', () => {
const emitNthGuestEvent = (index = 1, event, ...args) => {
const result = [];
for (let [evt, fn] of guestRPC(index).on.args) {
for (const [evt, fn] of guestRPC(index).on.args) {
if (event === evt) {
result.push(fn(...args));
}
......@@ -66,7 +66,7 @@ describe('Sidebar', () => {
const emitSidebarEvent = (event, ...args) => {
const result = [];
for (let [evt, fn] of sidebarRPC().on.args) {
for (const [evt, fn] of sidebarRPC().on.args) {
if (event === evt) {
result.push(fn(...args));
}
......
......@@ -117,7 +117,7 @@ describe('annotator/util/normalize', () => {
const end = start + 'bar'.length;
const outStrs = ['', 'foo b', 'fooba'];
for (let outStr of outStrs) {
for (const outStr of outStrs) {
const [outStart, outEnd] = translateOffsets(
inStr,
outStr,
......
......@@ -44,7 +44,7 @@ describe('PreactContainer', () => {
});
it('should unmount and remove element when `destroy` is called', () => {
let label = 'foo';
const label = 'foo';
const container = new PreactContainer('widget', () => (
<Widget label={label} />
));
......
......@@ -40,7 +40,7 @@ describe('bootstrap', () => {
return manifest;
}, {});
let extraSettings = {};
const extraSettings = {};
let bootApp;
if (app === 'annotator') {
bootApp = bootHypothesisClient;
......
......@@ -11,8 +11,6 @@ import {
const requestId = 'abcdef';
describe('PortFinder', () => {
let fakeGenerateHexString;
const frame1 = 'guest';
const type = 'offer';
let portFinder;
......@@ -36,7 +34,7 @@ describe('PortFinder', () => {
}
// Generate predictable IDs for port requests
fakeGenerateHexString = sinon.stub().returns(requestId);
const fakeGenerateHexString = sinon.stub().returns(requestId);
beforeEach(() => {
portFinders = [];
......
......@@ -9,10 +9,10 @@ describe('sidebar/components/hooks/use-user-filter-options', () => {
let lastUserOptions;
// Mock `annotationDisplayName` as if it's returning display names
let fakeAnnotationUserDisplay = annotation =>
const fakeAnnotationUserDisplay = annotation =>
annotation.user_info.display_name;
// Mock `annotationDisplayName` as if it's returning usernames
let fakeAnnotationUserUsername = annotation => annotation.user;
const fakeAnnotationUserUsername = annotation => annotation.user;
// Mount a dummy component to be able to use the hook
function DummyComponent() {
......
......@@ -319,7 +319,7 @@ describe('MarkdownEditor', () => {
.simulate('keydown', { key });
function testArrowKeySequence(buttons) {
for (let button of buttons) {
for (const button of buttons) {
pressKey('ArrowRight');
const label =
document.activeElement.getAttribute('title') ||
......
......@@ -11,7 +11,7 @@ import MenuItem, { $imports } from '../MenuItem';
describe('MenuItem', () => {
let containers = [];
const createMenuItem = props => {
let newContainer = document.createElement('div');
const newContainer = document.createElement('div');
containers.push(newContainer);
document.body.appendChild(newContainer);
return mount(<MenuItem label="Test item" {...props} />, {
......
......@@ -12,7 +12,7 @@ describe('MenuKeyboardNavigation', () => {
let containers = [];
const createMenuItem = props => {
let newContainer = document.createElement('div');
const newContainer = document.createElement('div');
containers.push(newContainer);
document.body.appendChild(newContainer);
return mount(
......
......@@ -11,7 +11,7 @@ import { $imports } from '../TagEditor';
describe('TagEditor', () => {
let containers = [];
let fakeTags = ['tag1', 'tag2'];
const fakeTags = ['tag1', 'tag2'];
let fakeTagsService;
let fakeServiceUrl;
let fakeOnAddTag;
......@@ -21,7 +21,7 @@ describe('TagEditor', () => {
function createComponent(props) {
// Use an array of containers so we can test more
// than one component at a time.
let newContainer = document.createElement('div');
const newContainer = document.createElement('div');
containers.push(newContainer);
document.body.appendChild(newContainer);
return mount(
......
......@@ -17,7 +17,7 @@ describe('sidebar/helpers/query-parser', () => {
assert.isFalse(isEmptyFilter(parseHypothesisSearchQuery('some query')));
// Now check various queries which should produce empty filters
for (let emptyQuery of ['', '""', "''", ' ']) {
for (const emptyQuery of ['', '""', "''", ' ']) {
const result = parseHypothesisSearchQuery(emptyQuery);
assert.isTrue(
isEmptyFilter(result),
......
......@@ -383,7 +383,7 @@ describe('LoadAnnotationsService', () => {
});
describe('#loadThread', () => {
let threadAnnotations = [
const threadAnnotations = [
{ id: 'parent_annotation_1' },
{ id: 'parent_annotation_2', references: ['parent_annotation_1'] },
{
......
......@@ -4,7 +4,7 @@ import { selectionModule } from '../selection';
describe('sidebar/store/modules/filters', () => {
let store;
let fakeSettings = [{}, {}];
const fakeSettings = [{}, {}];
const getFiltersState = () => {
return store.getState().filters;
......
......@@ -58,7 +58,7 @@ describe('sidebar/store/modules/groups', () => {
};
let allGroups = [];
for (let groups of Object.values(allLists)) {
for (const groups of Object.values(allLists)) {
allGroups = allGroups.concat(groups);
}
......
......@@ -11,7 +11,7 @@ describe('sidebar/store/modules/real-time-updates', () => {
let fakeAnnotationExists;
let fakeFocusedGroupId;
let fakeRoute;
let fakeSettings = {};
const fakeSettings = {};
let store;
beforeEach(() => {
......
......@@ -7,7 +7,7 @@ import { selectionModule } from '../selection';
describe('sidebar/store/modules/selection', () => {
let store;
let fakeSettings = [{}, {}];
const fakeSettings = [{}, {}];
const getSelectionState = () => {
return store.getState().selection;
......
......@@ -42,11 +42,10 @@ describe('sidebar/store/util', () => {
});
it('should wait for awaitStateChange to return a non-null value', () => {
let valPromise;
const expected = 5;
store.setState({ val: 2 });
valPromise = awaitStateChange(store, getValWhenGreaterThanTwo);
const valPromise = awaitStateChange(store, getValWhenGreaterThanTwo);
store.setState({ val: 5 });
return valPromise.then(actual => {
......
......@@ -250,7 +250,7 @@ describe('sidebar/cross-origin-rpc', () => {
it("responds with an error if there's no method", () => {
startServer(fakeStore, settings, fakeWindow);
let jsonRpcRequest = { jsonrpc: '2.0', id: 42 }; // No "method" member.
const jsonRpcRequest = { jsonrpc: '2.0', id: 42 }; // No "method" member.
fakeWindow.emitter.emit('message', {
origin: 'https://allowed1.com',
......
......@@ -4552,15 +4552,15 @@ __metadata:
languageName: node
linkType: hard
"@typescript-eslint/eslint-plugin@npm:8.9.0":
version: 8.9.0
resolution: "@typescript-eslint/eslint-plugin@npm:8.9.0"
"@typescript-eslint/eslint-plugin@npm:8.10.0":
version: 8.10.0
resolution: "@typescript-eslint/eslint-plugin@npm:8.10.0"
dependencies:
"@eslint-community/regexpp": ^4.10.0
"@typescript-eslint/scope-manager": 8.9.0
"@typescript-eslint/type-utils": 8.9.0
"@typescript-eslint/utils": 8.9.0
"@typescript-eslint/visitor-keys": 8.9.0
"@typescript-eslint/scope-manager": 8.10.0
"@typescript-eslint/type-utils": 8.10.0
"@typescript-eslint/utils": 8.10.0
"@typescript-eslint/visitor-keys": 8.10.0
graphemer: ^1.4.0
ignore: ^5.3.1
natural-compare: ^1.4.0
......@@ -4571,66 +4571,66 @@ __metadata:
peerDependenciesMeta:
typescript:
optional: true
checksum: d72bda52eb26d184286e67ceaebff17d177bf021cfcf1c31d316385f4965c60620fd3ec7178c30092faa3f30d81c4cf54ef2563c4bb0fd361e9967d2e6e64d22
checksum: 2bb311eb9a882d530fc94f790f3e1f4745cd4e3523fd8d62ee0ed14d65c4230dc0c797c490c3421c1456fd71349e9bfa146c0b78f63860b75aae6e2a32a6c27c
languageName: node
linkType: hard
"@typescript-eslint/parser@npm:8.9.0":
version: 8.9.0
resolution: "@typescript-eslint/parser@npm:8.9.0"
"@typescript-eslint/parser@npm:8.10.0":
version: 8.10.0
resolution: "@typescript-eslint/parser@npm:8.10.0"
dependencies:
"@typescript-eslint/scope-manager": 8.9.0
"@typescript-eslint/types": 8.9.0
"@typescript-eslint/typescript-estree": 8.9.0
"@typescript-eslint/visitor-keys": 8.9.0
"@typescript-eslint/scope-manager": 8.10.0
"@typescript-eslint/types": 8.10.0
"@typescript-eslint/typescript-estree": 8.10.0
"@typescript-eslint/visitor-keys": 8.10.0
debug: ^4.3.4
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
peerDependenciesMeta:
typescript:
optional: true
checksum: b7d899cca2834ab030c672693e9bdbc442b8026710af0e06cb89c162d81c43a5c777f90568cd9ea3ac5b689bbf161c8f7fcecd58989e0238bb45aec10567c26a
checksum: 2e38f34d9d044e251450116cc081a8f84ba13183e9c3e1dda919ddc00eebe634a37d4dfd785998f259b64cdd770e863ecc6c5cf7c8f422baf3d2bc2a0f9241cf
languageName: node
linkType: hard
"@typescript-eslint/scope-manager@npm:8.9.0":
version: 8.9.0
resolution: "@typescript-eslint/scope-manager@npm:8.9.0"
"@typescript-eslint/scope-manager@npm:8.10.0":
version: 8.10.0
resolution: "@typescript-eslint/scope-manager@npm:8.10.0"
dependencies:
"@typescript-eslint/types": 8.9.0
"@typescript-eslint/visitor-keys": 8.9.0
checksum: 56b71993f3b8da3fe6947710d1ead8afb128d194994e0d82052799c2b05a017735649d4dcf897d2ea63b28c8633336342d3efd269c2910d6d06e2784f248a22c
"@typescript-eslint/types": 8.10.0
"@typescript-eslint/visitor-keys": 8.10.0
checksum: 3df8df342e227b80514dcc9151774dea9a71bc649204f702d5b4a1b76a54b4814c5d5a970a6a9213462dd4df0d42342796fab35549e8663d4c0e5d84bd902bba
languageName: node
linkType: hard
"@typescript-eslint/type-utils@npm:8.9.0":
version: 8.9.0
resolution: "@typescript-eslint/type-utils@npm:8.9.0"
"@typescript-eslint/type-utils@npm:8.10.0":
version: 8.10.0
resolution: "@typescript-eslint/type-utils@npm:8.10.0"
dependencies:
"@typescript-eslint/typescript-estree": 8.9.0
"@typescript-eslint/utils": 8.9.0
"@typescript-eslint/typescript-estree": 8.10.0
"@typescript-eslint/utils": 8.10.0
debug: ^4.3.4
ts-api-utils: ^1.3.0
peerDependenciesMeta:
typescript:
optional: true
checksum: e4422ad2da0e73c1d503fd5cc72f873b20329c4fa55e4a88f201b7d02a6946b08a62d3a2ce53f6020d52db76c321b927b8e06a68e44b2a4f50b26967c75a27ff
checksum: 8b0cec8cff1926a08c2bd675b24b2ccff36e59a8d9169eed38343f70c4e3bba18796fc39f30a9307ded3f345881aded80dbd6dc1d78b9ae76cff04fbe8708788
languageName: node
linkType: hard
"@typescript-eslint/types@npm:8.9.0":
version: 8.9.0
resolution: "@typescript-eslint/types@npm:8.9.0"
checksum: bb79e8774b2c521d738d76efe6c61f5aa7f700765cf025410a5c37ca0449ed436c500a5c8cd3a4343edd5257301d4b0cfcd56275cc9bca992585e9dac76612bf
"@typescript-eslint/types@npm:8.10.0":
version: 8.10.0
resolution: "@typescript-eslint/types@npm:8.10.0"
checksum: 3839fd43b0f21b432a9f6090a39d5b2254ee48c1eecf14f8f66bea0cbaba9f2f33a7fc78aea37dfe8841442332d0a8f99cc65cd2d01ca43db99550d30d6f7fe8
languageName: node
linkType: hard
"@typescript-eslint/typescript-estree@npm:8.9.0":
version: 8.9.0
resolution: "@typescript-eslint/typescript-estree@npm:8.9.0"
"@typescript-eslint/typescript-estree@npm:8.10.0":
version: 8.10.0
resolution: "@typescript-eslint/typescript-estree@npm:8.10.0"
dependencies:
"@typescript-eslint/types": 8.9.0
"@typescript-eslint/visitor-keys": 8.9.0
"@typescript-eslint/types": 8.10.0
"@typescript-eslint/visitor-keys": 8.10.0
debug: ^4.3.4
fast-glob: ^3.3.2
is-glob: ^4.0.3
......@@ -4640,31 +4640,31 @@ __metadata:
peerDependenciesMeta:
typescript:
optional: true
checksum: 307b317c2ac45b83cbf2e5f45b6fd3615279c7ad8b105fa09004d6e415187d9ad1647ec205fcee017fdf2985192c469f9bad738f70cc754da4ba807d8d0d90ae
checksum: 3fc774f51d0a891a5e09bc77f5544b6aa268abec9c01cd9ec831f92dde9c9d61a5c818ca2800c124fb5d61d40ce7ac34740b347c21ba3493e756c052084afd65
languageName: node
linkType: hard
"@typescript-eslint/utils@npm:8.9.0":
version: 8.9.0
resolution: "@typescript-eslint/utils@npm:8.9.0"
"@typescript-eslint/utils@npm:8.10.0":
version: 8.10.0
resolution: "@typescript-eslint/utils@npm:8.10.0"
dependencies:
"@eslint-community/eslint-utils": ^4.4.0
"@typescript-eslint/scope-manager": 8.9.0
"@typescript-eslint/types": 8.9.0
"@typescript-eslint/typescript-estree": 8.9.0
"@typescript-eslint/scope-manager": 8.10.0
"@typescript-eslint/types": 8.10.0
"@typescript-eslint/typescript-estree": 8.10.0
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
checksum: 23bb2a054fcad2e5a3bb2ab9173614b2257f42a5a704434de3d81e478ca5444f1989e317a8044d6e39ef000a938316c7bc175286d595e17933e35e573a430f4c
checksum: db67603baacba9cccbbc625801a44e5320bc558be846646ff9962818c64a9ab07edcfdcad98b15a3f8954d3e398e3a41f085c1ec458f7169a1ce7b3674032d59
languageName: node
linkType: hard
"@typescript-eslint/visitor-keys@npm:8.9.0":
version: 8.9.0
resolution: "@typescript-eslint/visitor-keys@npm:8.9.0"
"@typescript-eslint/visitor-keys@npm:8.10.0":
version: 8.10.0
resolution: "@typescript-eslint/visitor-keys@npm:8.10.0"
dependencies:
"@typescript-eslint/types": 8.9.0
"@typescript-eslint/types": 8.10.0
eslint-visitor-keys: ^3.4.3
checksum: 9afb7eabfc6d279e714b80e283e062f0c2a90e2adbde1c2d2fbc6cecd6444c6e76867599f6a781b847981d02f7956748bd3ecb7abc4770ab7e77c6709693b530
checksum: 0b3060a036dd3b6acacc32b1d81b3ada1ac5523cc2d16a369ecffd3ab5b389cd98802b248bf65ee8a266a166125a9e38acd7e917d4dd26044bdf2c805537b7e3
languageName: node
linkType: hard
......@@ -7116,14 +7116,26 @@ __metadata:
languageName: node
linkType: hard
"eslint-config-hypothesis@npm:^3.0.0":
version: 3.0.0
resolution: "eslint-config-hypothesis@npm:3.0.0"
"eslint-config-hypothesis@npm:^3.1.0":
version: 3.1.0
resolution: "eslint-config-hypothesis@npm:3.1.0"
peerDependencies:
eslint-plugin-jsx-a11y: ">=6.10.0"
eslint-plugin-mocha: ">=10.4.0"
eslint-plugin-react: ">=7.34.0"
eslint-plugin-react-hooks: ">=5.0.0"
checksum: 1194156f2d043ed866afe9ccd88d7364cdf8635cb9d762d24beffb03ee02a25d44081b58d95c5b1a658e686053948d8b2493e65f4de540e14d72ae83c35c31fe
globals: ">=15.11.0"
typescript-eslint: ">=8.10.0"
peerDependenciesMeta:
eslint-plugin-jsx-a11y:
optional: true
eslint-plugin-react:
optional: true
eslint-plugin-react-hooks:
optional: true
typescript-eslint:
optional: true
checksum: 12e17da643a306fec1c8121bf5f172f2132f816d85b2b6f626dc16d353f5cbac8bee0cce080a9df829c5eab3e4bcc007bb611ec6f5d9deebd627e530802c05f6
languageName: node
linkType: hard
......@@ -8746,7 +8758,7 @@ __metadata:
escape-html: ^1.0.3
escape-string-regexp: ^4.0.0
eslint: ^9.12.0
eslint-config-hypothesis: ^3.0.0
eslint-config-hypothesis: ^3.1.0
eslint-plugin-jsx-a11y: ^6.10.0
eslint-plugin-mocha: ^10.5.0
eslint-plugin-react: ^7.37.1
......@@ -8789,7 +8801,7 @@ __metadata:
tailwindcss: ^3.0.2
tiny-emitter: ^2.0.2
typescript: ^5.0.2
typescript-eslint: ^8.9.0
typescript-eslint: ^8.10.0
wrap-text: ^1.0.7
languageName: unknown
linkType: soft
......@@ -13881,17 +13893,17 @@ __metadata:
languageName: node
linkType: hard
"typescript-eslint@npm:^8.9.0":
version: 8.9.0
resolution: "typescript-eslint@npm:8.9.0"
"typescript-eslint@npm:^8.10.0":
version: 8.10.0
resolution: "typescript-eslint@npm:8.10.0"
dependencies:
"@typescript-eslint/eslint-plugin": 8.9.0
"@typescript-eslint/parser": 8.9.0
"@typescript-eslint/utils": 8.9.0
"@typescript-eslint/eslint-plugin": 8.10.0
"@typescript-eslint/parser": 8.10.0
"@typescript-eslint/utils": 8.10.0
peerDependenciesMeta:
typescript:
optional: true
checksum: 6c54e7360e51fdbf1bc0d00f592949bb72e9c85d1b93145e9e7ad4e8259bf11784ebe035210c8f0a29e4f137ad268e22714d09bf82db1917258626d526a117a9
checksum: cf0ead50af444a887097f2ed6cf854c318082e5cebde92c218b7616086b844af0a8e80e8b9e946de7f582ed8ed96934c91d27a816130611217c1e9d34d59f20d
languageName: node
linkType: hard
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment