diff --git a/.stylelintrc.json b/.stylelintrc.json index a223999..936d237 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -4,7 +4,6 @@ "stylelint-config-css-modules" ], "rules": { - "indentation": 4, "selector-class-pattern": "^[a-z][a-zA-Z0-9_-]+$" } -} +} \ No newline at end of file diff --git a/js/apple2io.ts b/js/apple2io.ts index 316411c..37e56ff 100644 --- a/js/apple2io.ts +++ b/js/apple2io.ts @@ -12,7 +12,7 @@ type Annunciators = Record; export interface Apple2IOState { annunciators: Annunciators; - cards: Array; + cards: Array; } export type SampleListener = (sample: number[]) => void; @@ -344,7 +344,7 @@ export default class Apple2IO implements MemoryPages, Restorable slot = page & 0x0f; card = this._slot[slot]; if (this._auxRom !== card) { - // _debug('Setting auxRom to slot', slot); + // _debug('Setting auxRom to slot', slot); this._auxRom = card; } if (card) { @@ -380,7 +380,7 @@ export default class Apple2IO implements MemoryPages, Restorable slot = page & 0x0f; card = this._slot[slot]; if (this._auxRom !== card) { - // _debug('Setting auxRom to slot', slot); + // _debug('Setting auxRom to slot', slot); this._auxRom = card; } if (card) { diff --git a/js/applesoft/heap.ts b/js/applesoft/heap.ts index 6228e53..4854919 100644 --- a/js/applesoft/heap.ts +++ b/js/applesoft/heap.ts @@ -10,7 +10,7 @@ import { VARTAB } from './zeropage'; -export type ApplesoftValue = word | number | string | ApplesoftArray; +export type ApplesoftValue = number | string | ApplesoftArray; export type ApplesoftArray = Array; export enum VariableType { @@ -29,7 +29,7 @@ export interface ApplesoftVariable { export class ApplesoftHeap { - constructor(private mem: Memory) {} + constructor(private mem: Memory) { } private readByte(addr: word): byte { const page = addr >> 8; diff --git a/js/cards/smartport.ts b/js/cards/smartport.ts index 1ffb93a..464bee1 100644 --- a/js/cards/smartport.ts +++ b/js/cards/smartport.ts @@ -27,7 +27,7 @@ class Address { lo: byte; hi: byte; - constructor(private cpu: CPU6502, a: byte | word, b?: byte) { + constructor(private cpu: CPU6502, a: number, b?: byte) { if (b === undefined) { this.lo = a & 0xff; this.hi = a >> 8; diff --git a/js/components/ErrorModal.tsx b/js/components/ErrorModal.tsx index 85e02e1..34b46b7 100644 --- a/js/components/ErrorModal.tsx +++ b/js/components/ErrorModal.tsx @@ -5,7 +5,7 @@ import { Modal, ModalContent, ModalFooter } from './Modal'; import styles from './css/ErrorModal.module.scss'; export interface ErrorProps { - error: unknown | undefined; + error: unknown; setError: (error: string | undefined) => void; } diff --git a/js/components/css/BlockDisk.module.scss b/js/components/css/BlockDisk.module.scss index a000b77..51f9474 100644 --- a/js/components/css/BlockDisk.module.scss +++ b/js/components/css/BlockDisk.module.scss @@ -29,7 +29,7 @@ user-select: none; } -@media only screen and (min-resolution: 1.25dppx) { +@media only screen and (resolution >= 1.25dppx) { .diskLight { background-image: url("../../../css/green-off-32.png"); } diff --git a/js/components/css/DiskII.module.scss b/js/components/css/DiskII.module.scss index 0ef2689..cfa1015 100644 --- a/js/components/css/DiskII.module.scss +++ b/js/components/css/DiskII.module.scss @@ -29,7 +29,7 @@ user-select: none; } -@media only screen and (min-resolution: 1.25dppx) { +@media only screen and (resolution >= 1.25dppx) { .diskLight { background-image: url("../../../css/red-off-32.png"); } diff --git a/js/components/css/Modal.module.scss b/js/components/css/Modal.module.scss index 4cdb4c8..336a9cd 100644 --- a/js/components/css/Modal.module.scss +++ b/js/components/css/Modal.module.scss @@ -1,9 +1,6 @@ .modalOverlay { position: fixed; - left: 0; - right: 0; - top: 0; - bottom: 0; + inset: 0; display: flex; align-items: center; justify-content: center; @@ -68,4 +65,4 @@ margin: 0 0 0 5px; min-width: 75px; } -} +} \ No newline at end of file diff --git a/js/components/css/Screen.module.scss b/js/components/css/Screen.module.scss index 8b96db0..3920483 100644 --- a/js/components/css/Screen.module.scss +++ b/js/components/css/Screen.module.scss @@ -8,16 +8,17 @@ :global(.full-page) .display { width: 100vw; - height: 68.5714vw; /* 384px / 560px * 100% */ + height: 68.5714vw; + + /* 384px / 560px * 100% */ max-height: 100vh; - max-width: 145.83vh; /* 560px / 384px * 100% */ + max-width: 145.83vh; + + /* 560px / 384px * 100% */ padding: 0; border: 0; position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; + inset: 0; justify-content: center; align-items: center; margin: auto !important; @@ -49,30 +50,23 @@ display: block; pointer-events: none; background-image: - repeating-linear-gradient( - to bottom, - transparent 0, - transparent 1px, - rgb(0 0 0 / 50%) 1px, - rgb(0 0 0 / 50%) 2px - ); + repeating-linear-gradient(to bottom, + transparent 0, + transparent 1px, + rgb(0 0 0 / 50%) 1px, + rgb(0 0 0 / 50%) 2px); content: ""; position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; + inset: 0; } :global(.full-page) :global(.scanlines)::after { background-image: - repeating-linear-gradient( - to bottom, - transparent 0, - transparent 0.25vh, - rgb(0 0 0 / 50%) 0.25vh, - rgb(0 0 0 / 50%) 0.5vh - ); + repeating-linear-gradient(to bottom, + transparent 0, + transparent 0.25vh, + rgb(0 0 0 / 50%) 0.25vh, + rgb(0 0 0 / 50%) 0.5vh); } .screen { @@ -91,4 +85,4 @@ :global(.full-page) .screen { width: 100%; height: 100%; -} +} \ No newline at end of file diff --git a/js/cpu6502.ts b/js/cpu6502.ts index c51b286..16810df 100644 --- a/js/cpu6502.ts +++ b/js/cpu6502.ts @@ -814,7 +814,7 @@ export default class CPU6502 { }; dec = (readAddrFn: ReadAddrFn) => { - const addr = readAddrFn({ inc: true}); + const addr = readAddrFn({ inc: true }); const oldVal = this.readByte(addr); this.workCycle(addr, oldVal); const val = this.decrement(oldVal); @@ -1013,7 +1013,7 @@ export default class CPU6502 { } }; - brc = (f: flag|0) => { + brc = (f: flag | 0) => { const off = this.readBytePC(); // changes pc if ((f & this.sr) === 0) { this.readByte(this.pc); @@ -1198,7 +1198,7 @@ export default class CPU6502 { /* DCM = DEC + CMP */ dcm = (readAddrFn: ReadAddrFn) => { - const addr = readAddrFn({ inc: true}); + const addr = readAddrFn({ inc: true }); const oldVal = this.readByte(addr); this.workCycle(addr, oldVal); const val = this.decrement(oldVal); @@ -1208,7 +1208,7 @@ export default class CPU6502 { /* INS = INC + SBC */ ins = (readAddrFn: ReadAddrFn) => { - const addr = readAddrFn({ inc: true}); + const addr = readAddrFn({ inc: true }); const oldVal = this.readByte(addr); this.workCycle(addr, oldVal); const val = this.increment(oldVal); @@ -1238,7 +1238,7 @@ export default class CPU6502 { } if (ah + (ah & 0x1) > 5) { c = true; - this.ar =((this.ar + 0x60) & 0xff); + this.ar = ((this.ar + 0x60) & 0xff); } } this.setFlag(flags.V, v); @@ -1539,7 +1539,7 @@ export default class CPU6502 { public write(a: number, b: number, c?: byte): void { let page, off, val; - if (c !== undefined ) { + if (c !== undefined) { page = a & 0xff; off = b & 0xff; val = c & 0xff; @@ -1972,18 +1972,18 @@ export default class CPU6502 { 0x73: { name: 'RRA', fn: () => this.rra(this.readAddrZeroPageIndirectY), mode: 'zeroPageIndirectY' }, // AXS - 0x8F: { name: 'AXS', fn: () => this.axs(this.writeAbsolute), mode: 'absolute'}, - 0x87: { name: 'AXS', fn: () => this.axs(this.writeZeroPage), mode: 'zeroPage'}, - 0x97: { name: 'AXS', fn: () => this.axs(this.writeZeroPageY), mode: 'zeroPageY'}, - 0x83: { name: 'AXS', fn: () => this.axs(this.writeZeroPageXIndirect), mode: 'zeroPageXIndirect'}, + 0x8F: { name: 'AXS', fn: () => this.axs(this.writeAbsolute), mode: 'absolute' }, + 0x87: { name: 'AXS', fn: () => this.axs(this.writeZeroPage), mode: 'zeroPage' }, + 0x97: { name: 'AXS', fn: () => this.axs(this.writeZeroPageY), mode: 'zeroPageY' }, + 0x83: { name: 'AXS', fn: () => this.axs(this.writeZeroPageXIndirect), mode: 'zeroPageXIndirect' }, // LAX - 0xAF: { name: 'LAX', fn: () => this.lax(this.readAbsolute), mode: 'absolute'}, - 0xBF: { name: 'LAX', fn: () => this.lax(this.readAbsoluteY), mode: 'absoluteY'}, - 0xA7: { name: 'LAX', fn: () => this.lax(this.readZeroPage), mode: 'zeroPage'}, - 0xB7: { name: 'LAX', fn: () => this.lax(this.readZeroPageY), mode: 'zeroPageY'}, - 0xA3: { name: 'LAX', fn: () => this.lax(this.readZeroPageXIndirect), mode: 'zeroPageXIndirect'}, - 0xB3: { name: 'LAX', fn: () => this.lax(this.readZeroPageIndirectY), mode: 'zeroPageIndirectY'}, + 0xAF: { name: 'LAX', fn: () => this.lax(this.readAbsolute), mode: 'absolute' }, + 0xBF: { name: 'LAX', fn: () => this.lax(this.readAbsoluteY), mode: 'absoluteY' }, + 0xA7: { name: 'LAX', fn: () => this.lax(this.readZeroPage), mode: 'zeroPage' }, + 0xB7: { name: 'LAX', fn: () => this.lax(this.readZeroPageY), mode: 'zeroPageY' }, + 0xA3: { name: 'LAX', fn: () => this.lax(this.readZeroPageXIndirect), mode: 'zeroPageXIndirect' }, + 0xB3: { name: 'LAX', fn: () => this.lax(this.readZeroPageIndirectY), mode: 'zeroPageIndirectY' }, // DCM 0xCF: { name: 'DCM', fn: () => this.dcm(this.readAddrAbsolute), mode: 'absolute' }, @@ -2066,27 +2066,27 @@ export default class CPU6502 { 0xF2: { name: 'HLT', fn: () => this.hlt(this.readNopImplied), mode: 'implied' }, // TAS - 0x9B: { name: 'TAS', fn: () => this.tas(this.readAddrAbsoluteY), mode: 'absoluteY'}, + 0x9B: { name: 'TAS', fn: () => this.tas(this.readAddrAbsoluteY), mode: 'absoluteY' }, // SAY - 0x9C: { name: 'SAY', fn: () => this.say(this.readAddrAbsoluteX), mode: 'absoluteX'}, + 0x9C: { name: 'SAY', fn: () => this.say(this.readAddrAbsoluteX), mode: 'absoluteX' }, // XAS - 0x9E: { name: 'XAS', fn: () => this.xas(this.readAddrAbsoluteY), mode: 'absoluteY'}, + 0x9E: { name: 'XAS', fn: () => this.xas(this.readAddrAbsoluteY), mode: 'absoluteY' }, // AXA - 0x9F: { name: 'AXA', fn: () => this.axa(this.readAddrAbsoluteY), mode: 'absoluteY'}, - 0x93: { name: 'AXA', fn: () => this.axa(this.readAddrZeroPageIndirectY), mode: 'zeroPageIndirectY'}, + 0x9F: { name: 'AXA', fn: () => this.axa(this.readAddrAbsoluteY), mode: 'absoluteY' }, + 0x93: { name: 'AXA', fn: () => this.axa(this.readAddrZeroPageIndirectY), mode: 'zeroPageIndirectY' }, // ANC 0x2b: { name: 'ANC', fn: () => this.anc(this.readImmediate), mode: 'immediate' }, 0x0b: { name: 'ANC', fn: () => this.anc(this.readImmediate), mode: 'immediate' }, // LAS - 0xBB: { name: 'LAS', fn: () => this.las(this.readAbsoluteY), mode: 'absoluteY'}, + 0xBB: { name: 'LAS', fn: () => this.las(this.readAbsoluteY), mode: 'absoluteY' }, // SBC - 0xEB: { name: 'SBC', fn: () => this.sbc(this.readImmediate), mode: 'immediate'} + 0xEB: { name: 'SBC', fn: () => this.sbc(this.readImmediate), mode: 'immediate' } }; OPS_ROCKWELL_65C02: Instructions = { diff --git a/js/formats/2mg.ts b/js/formats/2mg.ts index 61297f2..07d968b 100644 --- a/js/formats/2mg.ts +++ b/js/formats/2mg.ts @@ -67,9 +67,9 @@ const OFFSETS = { } as const; const FLAGS = { - READ_ONLY: 0x80000000, + READ_ONLY: 0x80000000, VOLUME_VALID: 0x00000100, - VOLUME_MASK: 0x000000FF + VOLUME_MASK: 0x000000FF } as const; export enum FORMAT { @@ -101,7 +101,7 @@ export function read2MGHeader(rawData: ArrayBuffer): HeaderData { if (headerLength !== 64) { throw new Error(`2mg header length is incorrect ${headerLength} !== 64`); } - const format = prefix.getInt32(OFFSETS.FORMAT, true); + const format = prefix.getInt32(OFFSETS.FORMAT, true) as FORMAT; const flags = prefix.getInt32(OFFSETS.FLAGS, true); const blocks = prefix.getInt32(OFFSETS.BLOCKS, true); const offset = prefix.getInt32(OFFSETS.DATA_OFFSET, true); @@ -177,7 +177,7 @@ export function read2MGHeader(rawData: ArrayBuffer): HeaderData { * @returns 2mg prefix and suffix for creating a 2mg disk image */ -export const create2MGFragments = (headerData: HeaderData | null, { blocks } : { blocks: number }) => { +export const create2MGFragments = (headerData: HeaderData | null, { blocks }: { blocks: number }) => { if (!headerData) { headerData = { bytes: blocks * 512, diff --git a/js/formats/format_utils.ts b/js/formats/format_utils.ts index fd2be68..977d67f 100644 --- a/js/formats/format_utils.ts +++ b/js/formats/format_utils.ts @@ -352,7 +352,7 @@ enum LookingFor { } export class FindSectorError extends Error { - constructor(track: byte, sector: byte, e: unknown | Error | string) { + constructor(track: byte, sector: byte, e: unknown) { super(`Error finding track ${track} (${toHex(track)}), sector ${sector} (${toHex(sector)}): ` + (e instanceof Error ? `${e.message}` @@ -501,7 +501,7 @@ export class InvalidChecksum extends Error { } export class ReadSectorError extends Error { - constructor(track: byte, sector: byte, e: unknown | Error) { + constructor(track: byte, sector: byte, e: unknown) { super(`Error reading track ${track} (${toHex(track)}), sector ${sector} (${toHex(sector)}): ` + (e instanceof Error ? `${e.message}` diff --git a/js/util.ts b/js/util.ts index 70a3cce..bfe7101 100644 --- a/js/util.ts +++ b/js/util.ts @@ -1,4 +1,4 @@ -import { byte, memory, word } from './types'; +import { byte, memory } from './types'; /*eslint no-console: 0*/ @@ -66,7 +66,7 @@ export function debug(...args: unknown[]): void { * @param n the number of nibbles. If `n` is missing, it is guessed from the value * of `v`. If `v` < 256, it is assumed to be 2 nibbles, otherwise 4. */ -export function toHex(v: byte | word | number, n?: number) { +export function toHex(v: number, n?: number) { if (!n) { n = v < 256 ? 2 : 4; } diff --git a/package-lock.json b/package-lock.json index b2d0538..9e4dd3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,14 +27,14 @@ "@types/jest-image-snapshot": "^4.3.1", "@types/micromodal": "^0.3.2", "@types/wicg-file-system-access": "^2020.9.6", - "@typescript-eslint/eslint-plugin": "^5.27.0", - "@typescript-eslint/parser": "^5.27.0", + "@typescript-eslint/eslint-plugin": "^6.3.0", + "@typescript-eslint/parser": "^6.3.0", "ajv": "^6.12.0", "babel-jest": "^29.5.0", "canvas": "^2.11.2", "css-loader": "^6.7.1", "eslint": "^8.17.0", - "eslint-plugin-jest": "^26.4.3", + "eslint-plugin-jest": "^27.2.3", "eslint-plugin-react": "^7.30.0", "eslint-plugin-react-hooks": "^4.5.0", "file-loader": "^6.0.0", @@ -1558,6 +1558,30 @@ "node": ">=10.0.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -3130,9 +3154,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/micromodal": { @@ -3198,6 +3222,12 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, "node_modules/@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -3278,31 +3308,34 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.0.tgz", - "integrity": "sha512-DDrIA7GXtmHXr1VCcx9HivA39eprYBIFxbQEHI6NyraRDxCGpxAFiYQAT/1Y0vh1C+o2vfBiy4IuPoXxtTZCAQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.3.0.tgz", + "integrity": "sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.27.0", - "@typescript-eslint/type-utils": "5.27.0", - "@typescript-eslint/utils": "5.27.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/type-utils": "6.3.0", + "@typescript-eslint/utils": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3310,6 +3343,105 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", + "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", + "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", + "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.3.0.tgz", + "integrity": "sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", + "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -3326,25 +3458,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.27.0.tgz", - "integrity": "sha512-8oGjQF46c52l7fMiPPvX4It3u3V3JipssqDfHQ2hcR0AeR8Zge+OYyKUCm5b70X72N1qXt0qgHenwN6Gc2SXZA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.3.0.tgz", + "integrity": "sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.27.0", - "@typescript-eslint/types": "5.27.0", - "@typescript-eslint/typescript-estree": "5.27.0", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3352,6 +3485,95 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", + "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", + "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", + "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", + "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.27.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.27.0.tgz", @@ -3370,24 +3592,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.27.0.tgz", - "integrity": "sha512-vpTvRRchaf628Hb/Xzfek+85o//zEUotr1SmexKvTfs7czXfYjXVT/a5yDbpzLBX1rhbqxjDdr1Gyo0x1Fc64g==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.3.0.tgz", + "integrity": "sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.27.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "@typescript-eslint/utils": "6.3.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3395,6 +3618,120 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", + "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", + "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", + "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.3.0.tgz", + "integrity": "sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", + "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.3.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/types": { "version": "5.27.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.27.0.tgz", @@ -5712,19 +6049,20 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "26.4.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.4.3.tgz", - "integrity": "sha512-eb4sIRLy7hBdBphCBttE1Gx3Go6GsCYXRfy1xtuSg56UBlLLuFpbA79jPipbUfz7AwuDJ+j9UShN7AOi6VDEuQ==", + "version": "27.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz", + "integrity": "sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { @@ -5850,12 +6188,15 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ansi-styles": { @@ -6880,6 +7221,12 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -10551,6 +10898,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -13315,6 +13668,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-jest": { "version": "29.1.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", @@ -15594,6 +15959,21 @@ "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", "dev": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true + }, "@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -16846,9 +17226,9 @@ } }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/micromodal": { @@ -16914,6 +17294,12 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, "@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -16994,22 +17380,81 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.0.tgz", - "integrity": "sha512-DDrIA7GXtmHXr1VCcx9HivA39eprYBIFxbQEHI6NyraRDxCGpxAFiYQAT/1Y0vh1C+o2vfBiy4IuPoXxtTZCAQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.3.0.tgz", + "integrity": "sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.27.0", - "@typescript-eslint/type-utils": "5.27.0", - "@typescript-eslint/utils": "5.27.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/type-utils": "6.3.0", + "@typescript-eslint/utils": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", + "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0" + } + }, + "@typescript-eslint/types": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", + "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", + "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.3.0.tgz", + "integrity": "sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", + "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.3.0", + "eslint-visitor-keys": "^3.4.1" + } + }, "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -17022,15 +17467,68 @@ } }, "@typescript-eslint/parser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.27.0.tgz", - "integrity": "sha512-8oGjQF46c52l7fMiPPvX4It3u3V3JipssqDfHQ2hcR0AeR8Zge+OYyKUCm5b70X72N1qXt0qgHenwN6Gc2SXZA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.3.0.tgz", + "integrity": "sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.27.0", - "@typescript-eslint/types": "5.27.0", - "@typescript-eslint/typescript-estree": "5.27.0", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", + "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0" + } + }, + "@typescript-eslint/types": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", + "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", + "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", + "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.3.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@typescript-eslint/scope-manager": { @@ -17044,14 +17542,82 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.27.0.tgz", - "integrity": "sha512-vpTvRRchaf628Hb/Xzfek+85o//zEUotr1SmexKvTfs7czXfYjXVT/a5yDbpzLBX1rhbqxjDdr1Gyo0x1Fc64g==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.3.0.tgz", + "integrity": "sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.27.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "@typescript-eslint/utils": "6.3.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", + "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0" + } + }, + "@typescript-eslint/types": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", + "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", + "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.3.0.tgz", + "integrity": "sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", + "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.3.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@typescript-eslint/types": { @@ -18974,9 +19540,9 @@ } }, "eslint-plugin-jest": { - "version": "26.4.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.4.3.tgz", - "integrity": "sha512-eb4sIRLy7hBdBphCBttE1Gx3Go6GsCYXRfy1xtuSg56UBlLLuFpbA79jPipbUfz7AwuDJ+j9UShN7AOi6VDEuQ==", + "version": "27.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz", + "integrity": "sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==", "dev": true, "requires": { "@typescript-eslint/utils": "^5.10.0" @@ -19066,9 +19632,9 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { @@ -19685,6 +20251,12 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -22394,6 +22966,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -24421,6 +24999,13 @@ "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true }, + "ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "requires": {} + }, "ts-jest": { "version": "29.1.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", diff --git a/package.json b/package.json index 8ac6ae7..b550af6 100644 --- a/package.json +++ b/package.json @@ -36,14 +36,14 @@ "@types/jest-image-snapshot": "^4.3.1", "@types/micromodal": "^0.3.2", "@types/wicg-file-system-access": "^2020.9.6", - "@typescript-eslint/eslint-plugin": "^5.27.0", - "@typescript-eslint/parser": "^5.27.0", + "@typescript-eslint/eslint-plugin": "^6.3.0", + "@typescript-eslint/parser": "^6.3.0", "ajv": "^6.12.0", "babel-jest": "^29.5.0", "canvas": "^2.11.2", "css-loader": "^6.7.1", "eslint": "^8.17.0", - "eslint-plugin-jest": "^26.4.3", + "eslint-plugin-jest": "^27.2.3", "eslint-plugin-react": "^7.30.0", "eslint-plugin-react-hooks": "^4.5.0", "file-loader": "^6.0.0", @@ -77,4 +77,4 @@ "micromodal": "^0.4.2", "preact": "^10.7.1" } -} +} \ No newline at end of file diff --git a/test/components/FileChooser.spec.tsx b/test/components/FileChooser.spec.tsx index 1f137a9..b644313 100644 --- a/test/components/FileChooser.spec.tsx +++ b/test/components/FileChooser.spec.tsx @@ -69,7 +69,7 @@ describe('FileChooser', () => { inputElement.files = EMPTY_FILE_LIST; fireEvent.change(inputElement); await waitFor(() => { - expect(onChange).toBeCalledWith([]); + expect(onChange).toHaveBeenCalledWith([]); }); }); @@ -123,12 +123,12 @@ describe('FileChooser', () => { fireEvent.click(await screen.findByText('Choose File')); await waitFor(() => { - expect(mockFilePicker).toBeCalledWith<[OpenFilePickerOptions]>({ + expect(mockFilePicker).toHaveBeenCalledWith<[OpenFilePickerOptions]>({ 'excludeAcceptAllOption': true, 'multiple': false, 'types': TEST_FILE_TYPES }); - expect(onChange).toBeCalledWith([]); + expect(onChange).toHaveBeenCalledWith([]); }); }); @@ -140,8 +140,8 @@ describe('FileChooser', () => { fireEvent.click(await screen.findByText('Choose File')); await waitFor(() => { - expect(mockFilePicker).toBeCalled(); - expect(onChange).toBeCalledWith([]); + expect(mockFilePicker).toHaveBeenCalled(); + expect(onChange).toHaveBeenCalledWith([]); }); }); @@ -153,7 +153,7 @@ describe('FileChooser', () => { fireEvent.click(await screen.findByText('Choose File')); await waitFor(() => { - expect(mockFilePicker).toBeCalled(); + expect(mockFilePicker).toHaveBeenCalled(); expect(onChange).toHaveBeenCalled(); const handleList = onChange.mock.calls[0][0]; expect(handleList).toHaveLength(1); diff --git a/test/js/cards/disk2.spec.ts b/test/js/cards/disk2.spec.ts index 6c056ea..7ebceca 100644 --- a/test/js/cards/disk2.spec.ts +++ b/test/js/cards/disk2.spec.ts @@ -106,8 +106,8 @@ describe('DiskII', () => { diskII.ioSwitch(0x89); // turn on the motor - expect(callbacks.driveLight).toBeCalledTimes(1); - expect(callbacks.driveLight).toBeCalledWith(1, true); + expect(callbacks.driveLight).toHaveBeenCalledTimes(1); + expect(callbacks.driveLight).toHaveBeenCalledWith(1, true); }); it('turns off drive light 1 when the motor is turned off', () => { @@ -119,8 +119,8 @@ describe('DiskII', () => { diskII.ioSwitch(0x88); // turn off the motor jest.runAllTimers(); - expect(callbacks.driveLight).toBeCalledTimes(1); - expect(callbacks.driveLight).toBeCalledWith(1, false); + expect(callbacks.driveLight).toHaveBeenCalledTimes(1); + expect(callbacks.driveLight).toHaveBeenCalledWith(1, false); jest.useRealTimers(); }); @@ -130,8 +130,8 @@ describe('DiskII', () => { diskII.ioSwitch(0x8B); // select drive 2 diskII.ioSwitch(0x89); // turn on the motor - expect(callbacks.driveLight).toBeCalledTimes(1); - expect(callbacks.driveLight).toBeCalledWith(2, true); + expect(callbacks.driveLight).toHaveBeenCalledTimes(1); + expect(callbacks.driveLight).toHaveBeenCalledWith(2, true); }); it('turns off drive light 2 when drive 2 is selected and the motor is turned off', () => { @@ -144,8 +144,8 @@ describe('DiskII', () => { diskII.ioSwitch(0x88); // turn off the motor jest.runAllTimers(); - expect(callbacks.driveLight).toBeCalledTimes(1); - expect(callbacks.driveLight).toBeCalledWith(2, false); + expect(callbacks.driveLight).toHaveBeenCalledTimes(1); + expect(callbacks.driveLight).toHaveBeenCalledWith(2, false); jest.useRealTimers(); }); @@ -155,7 +155,7 @@ describe('DiskII', () => { diskII.ioSwitch(0x89); // turn on the motor diskII.ioSwitch(0x8B); // select drive 2 - expect(callbacks.driveLight).toBeCalledTimes(3); + expect(callbacks.driveLight).toHaveBeenCalledTimes(3); expect(callbacks.driveLight).toHaveBeenNthCalledWith(1, 1, true); expect(callbacks.driveLight).toHaveBeenNthCalledWith(2, 1, false); expect(callbacks.driveLight).toHaveBeenNthCalledWith(3, 2, true); diff --git a/test/js/formats/2mg.spec.ts b/test/js/formats/2mg.spec.ts index 350e495..a7fe2b9 100644 --- a/test/js/formats/2mg.spec.ts +++ b/test/js/formats/2mg.spec.ts @@ -63,32 +63,32 @@ describe('2mg format', () => { }); it('throws if the header length is invalid', () => { - expect(() => read2MGHeader(INVALID_HEADER_LENGTH_IMAGE.buffer)).toThrowError(/header length/); + expect(() => read2MGHeader(INVALID_HEADER_LENGTH_IMAGE.buffer)).toThrow(/header length/); }); it('throws if block count is not correct for ProDOS image', () => { const image = new Uint8Array(VALID_PRODOS_IMAGE); image[0x14] = image[0x14] + 1; - expect(() => read2MGHeader(image.buffer)).toThrowError(/blocks/); + expect(() => read2MGHeader(image.buffer)).toThrow(/blocks/); }); it('throws if comment comes before end of disk data', () => { const image = new Uint8Array(VALID_PRODOS_IMAGE); image[0x20] = 1; - expect(() => read2MGHeader(image.buffer)).toThrowError(/is before/); + expect(() => read2MGHeader(image.buffer)).toThrow(/is before/); }); it('throws if creator data comes before end of disk data', () => { const image = new Uint8Array(VALID_PRODOS_IMAGE); image[0x28] = 1; - expect(() => read2MGHeader(image.buffer)).toThrowError(/is before/); + expect(() => read2MGHeader(image.buffer)).toThrow(/is before/); }); it('throws if data length is too big for file', () => { const image = new Uint8Array(VALID_PRODOS_IMAGE); image[0x1D] += 2; // Increment byte length by 512 image[0x14] += 1; // Increment block length by 1 - expect(() => read2MGHeader(image.buffer)).toThrowError(/extends beyond/); + expect(() => read2MGHeader(image.buffer)).toThrow(/extends beyond/); }); it('returns a header for a valid ProDOS image', () => { @@ -125,7 +125,7 @@ describe('2mg format', () => { offset: 64, volume: 0, }; - expect(() => create2MGFragments(headerData, { blocks: 63 })).toThrowError(/does not match/); + expect(() => create2MGFragments(headerData, { blocks: 63 })).toThrow(/does not match/); }); it('throws an error if not a ProDOS volume', () => { @@ -137,7 +137,7 @@ describe('2mg format', () => { offset: 64, volume: 254, }; - expect(() => create2MGFragments(headerData, { blocks: 280 })).toThrowError(/not supported/); + expect(() => create2MGFragments(headerData, { blocks: 280 })).toThrow(/not supported/); }); it('uses defaults', () => {