From e6a498638c61da8d1d8636e08aee7bb59aebafe5 Mon Sep 17 00:00:00 2001 From: Stefan Schramm Date: Mon, 25 Mar 2024 20:21:13 +0100 Subject: [PATCH 1/3] Implement annotations for encoded audio --- retroload-lib/src/common/Positioning.ts | 2 +- .../adapter/atari/AtariGenericAdapter.ts | 5 ++ .../adapter/basicode/BasicodeEncoder.ts | 2 + .../src/encoding/adapter/c64/C64Encoder.ts | 18 +++- .../encoding/adapter/cpc/CpcGenericAdapter.ts | 14 ++- .../electron/ElectronGenericAdapter.ts | 4 + .../src/encoding/adapter/kc/KcEncoder.ts | 4 + .../src/encoding/adapter/mo5/Mo5Encoder.ts | 6 ++ .../src/encoding/adapter/ta/TaEncoder.ts | 4 + .../src/encoding/adapter/ti/TiEncoder.ts | 4 + .../encoding/adapter/z1013/Z1013Encoder.ts | 7 ++ .../zxspectrum/ZxSpectrumGenericAdapter.ts | 4 + .../src/encoding/recorder/Annotations.test.ts | 86 +++++++++++++++++++ .../src/encoding/recorder/Annotations.ts | 69 +++++++++++++++ .../src/encoding/recorder/PcmRecorder.ts | 15 ++++ .../encoding/recorder/RecorderInterface.ts | 8 +- .../src/encoding/recorder/WaveRecorder.ts | 14 +++ retroload-lib/src/index.ts | 1 + retroload/src/retroload.ts | 20 ++++- 19 files changed, 279 insertions(+), 8 deletions(-) create mode 100644 retroload-lib/src/encoding/recorder/Annotations.test.ts create mode 100644 retroload-lib/src/encoding/recorder/Annotations.ts diff --git a/retroload-lib/src/common/Positioning.ts b/retroload-lib/src/common/Positioning.ts index 81339b7..93b7402 100644 --- a/retroload-lib/src/common/Positioning.ts +++ b/retroload-lib/src/common/Positioning.ts @@ -4,7 +4,7 @@ export type Position = { }; export function formatPosition(p: Position): string { - return `${secondsToTimestamp(p.seconds)} sample ${p.samples}`; + return `${secondsToTimestamp(p.seconds)} sample ${p.samples.toString().padStart(9, '0')}`; } function secondsToTimestamp(totalSeconds: number): string { diff --git a/retroload-lib/src/encoding/adapter/atari/AtariGenericAdapter.ts b/retroload-lib/src/encoding/adapter/atari/AtariGenericAdapter.ts index d931d18..21bacab 100644 --- a/retroload-lib/src/encoding/adapter/atari/AtariGenericAdapter.ts +++ b/retroload-lib/src/encoding/adapter/atari/AtariGenericAdapter.ts @@ -4,6 +4,7 @@ import {type OptionContainer} from '../../Options.js'; import {type RecorderInterface} from '../../recorder/RecorderInterface.js'; import {unidentifiable, type FormatIdentification} from '../AdapterDefinition.js'; import {type AdapterDefinition} from '../AdapterDefinition.js'; +import {hex8} from '../../../common/Utils.js'; const definition: AdapterDefinition = { name: 'Atari (Generic data)', @@ -32,6 +33,7 @@ function encode(recorder: RecorderInterface, ba: BufferAccess, _options: OptionC e.setDefaultBaudrate(); const chunks = ba.chunks(dataBytesPerBlock); for (let blockId = 0; blockId < chunks.length; blockId++) { + recorder.beginAnnotation(`Block ${hex8(blockId)}`); const chunkBa = chunks[blockId]; const partialBlock = chunkBa.length() !== dataBytesPerBlock; const blockType = partialBlock ? blockTypePartial : blockTypeFull; @@ -48,9 +50,11 @@ function encode(recorder: RecorderInterface, ba: BufferAccess, _options: OptionC blockBa.setUint8(131, calculateChecksum(blockBa)); e.recordIrg((blockId === 0) ? pilotIrgLength : defaultIrgLength); // TODO: create option (longer values are required for "ENTER-loading") e.recordBytes(blockBa); + recorder.endAnnotation(); } // End of file block + recorder.beginAnnotation('Block EOF'); const eofBlockBa = BufferAccess.create(132); eofBlockBa.writeUint8(markerByte); eofBlockBa.writeUint8(markerByte); @@ -58,6 +62,7 @@ function encode(recorder: RecorderInterface, ba: BufferAccess, _options: OptionC eofBlockBa.setUint8(131, calculateChecksum(eofBlockBa)); e.recordIrg(defaultIrgLength); // TODO: create option (longer values are required for "ENTER-loading") e.recordBytes(eofBlockBa); + recorder.endAnnotation(); } function calculateChecksum(ba: BufferAccess) { diff --git a/retroload-lib/src/encoding/adapter/basicode/BasicodeEncoder.ts b/retroload-lib/src/encoding/adapter/basicode/BasicodeEncoder.ts index 7e62319..353c233 100644 --- a/retroload-lib/src/encoding/adapter/basicode/BasicodeEncoder.ts +++ b/retroload-lib/src/encoding/adapter/basicode/BasicodeEncoder.ts @@ -37,7 +37,9 @@ export class BasicodeEncoder extends AbstractEncoder { public recordBasicData(ba: BufferAccess) { for (const chunkBa of ba.chunksPadded(1024, sth)) { + this.recorder.beginAnnotation('Chunk'); this.record(chunkBa, sth); + this.recorder.endAnnotation(); } } diff --git a/retroload-lib/src/encoding/adapter/c64/C64Encoder.ts b/retroload-lib/src/encoding/adapter/c64/C64Encoder.ts index 766787a..5036a30 100644 --- a/retroload-lib/src/encoding/adapter/c64/C64Encoder.ts +++ b/retroload-lib/src/encoding/adapter/c64/C64Encoder.ts @@ -171,33 +171,43 @@ export class C64Encoder extends AbstractEncoder { headerBa.writeAsciiString(filename); // 16 bytes: filename headerBa.writeAsciiString(' '.repeat(171)); // 171 bytes: padding with spaces + this.recorder.beginAnnotation('File'); + Logger.debug('C64Encoder - recordBasicOrPrg - header:'); Logger.debug(headerBa.asHexDump()); - // header + this.recorder.beginAnnotation('Header'); this.recordPilot(this.shortpilot ? 0x1a00 : 0x6a00); this.recordSyncChain(); this.recordDataWithCheckByte(headerBa); this.recordEndOfDataMarker(); - // header repeated + this.recorder.endAnnotation(); + + this.recorder.beginAnnotation('Header repeated'); this.recordPilot(0x4f); this.recordSyncChainRepeated(); this.recordDataWithCheckByte(headerBa); this.recordEndOfDataMarker(); + this.recorder.endAnnotation(); Logger.debug('C64Encoder - recordBasicOrPrg - data:'); Logger.debug(dataBa.asHexDump()); - // data + this.recorder.beginAnnotation('Data'); this.recordPilot(0x1a00); this.recordSyncChain(); this.recordDataWithCheckByte(dataBa); // include end of data marker this.recordEndOfDataMarker(); - // data repeated + this.recorder.endAnnotation(); + + this.recorder.beginAnnotation('Data repeated'); this.recordPilot(0x4f); this.recordSyncChainRepeated(); this.recordDataWithCheckByte(dataBa); // include end of data marker this.recordEndOfDataMarker(); this.recordPilot(0x4e); + this.recorder.endAnnotation(); + + this.recorder.endAnnotation(); } } diff --git a/retroload-lib/src/encoding/adapter/cpc/CpcGenericAdapter.ts b/retroload-lib/src/encoding/adapter/cpc/CpcGenericAdapter.ts index d15bfb8..72ca59c 100644 --- a/retroload-lib/src/encoding/adapter/cpc/CpcGenericAdapter.ts +++ b/retroload-lib/src/encoding/adapter/cpc/CpcGenericAdapter.ts @@ -5,7 +5,7 @@ import {BufferAccess} from '../../../common/BufferAccess.js'; import {type RecorderInterface} from '../../recorder/RecorderInterface.js'; import {unidentifiable, type FormatIdentification} from '../AdapterDefinition.js'; import {type AdapterDefinition} from '../AdapterDefinition.js'; -import {calculateCrc16Ccitt} from '../../../common/Utils.js'; +import {calculateCrc16Ccitt, hex8} from '../../../common/Utils.js'; /** * https://www.cpcwiki.eu/imgs/5/5d/S968se08.pdf @@ -51,6 +51,8 @@ function encode(recorder: RecorderInterface, ba: BufferAccess, options: OptionCo e.begin(); for (let b = 0; b < chunks.length; b++) { + recorder.beginAnnotation(`Block ${hex8(b)}`); + const chunk = chunks[b]; const isFirstBlock = b === 0; const isLastBlock = b === (chunks.length - 1); @@ -58,6 +60,8 @@ function encode(recorder: RecorderInterface, ba: BufferAccess, options: OptionCo // header block + recorder.beginAnnotation('Header'); + const headerBa = BufferAccess.create(0x100); headerBa.writeAsciiString(filename, maxFileNameLength, 0); headerBa.writeUint8(b + 1); // block number @@ -75,10 +79,18 @@ function encode(recorder: RecorderInterface, ba: BufferAccess, options: OptionCo const headerRecordBa = createHeaderRecord(headerBa); e.recordDataBlock(headerRecordBa, {...e.getStandardSpeedRecordOptions(), pauseLengthMs: 0x000a}); + recorder.endAnnotation(); // end of header + // data block + recorder.beginAnnotation('Data'); + const dataRecordBa = createDataRecord(chunk); e.recordDataBlock(dataRecordBa, {...e.getStandardSpeedRecordOptions(), pauseLengthMs: 0x09c4}); + + recorder.endAnnotation(); // end of data + + recorder.endAnnotation(); // end of block } e.end(); } diff --git a/retroload-lib/src/encoding/adapter/electron/ElectronGenericAdapter.ts b/retroload-lib/src/encoding/adapter/electron/ElectronGenericAdapter.ts index d67e5dd..ab6ad1a 100644 --- a/retroload-lib/src/encoding/adapter/electron/ElectronGenericAdapter.ts +++ b/retroload-lib/src/encoding/adapter/electron/ElectronGenericAdapter.ts @@ -45,6 +45,8 @@ function encode(recorder: RecorderInterface, ba: BufferAccess, options: OptionCo e.begin(); for (let block = 0; block < chunks.length; block++) { + recorder.beginAnnotation(`Block ${block}`); + const isFirstBlock = block === 0; const isLastBlock = block === chunks.length - 1; const blockDataBa = chunks[block]; @@ -72,6 +74,8 @@ function encode(recorder: RecorderInterface, ba: BufferAccess, options: OptionCo e.recordPilot(isFirstBlock ? (shortpilot ? 1.5 : 5.1) : 0.9); e.recordBytes(blockBa); + + recorder.endAnnotation(); } e.recordPilot(shortpilot ? 1.5 : 5.3); diff --git a/retroload-lib/src/encoding/adapter/kc/KcEncoder.ts b/retroload-lib/src/encoding/adapter/kc/KcEncoder.ts index c7d6cbc..e96305a 100644 --- a/retroload-lib/src/encoding/adapter/kc/KcEncoder.ts +++ b/retroload-lib/src/encoding/adapter/kc/KcEncoder.ts @@ -27,6 +27,8 @@ export class KcEncoder extends AbstractEncoder { } recordBlock(blockNumber: number, blockDataBa: BufferAccess) { + this.recorder.beginAnnotation(`Block ${hex8(blockNumber)}`); + if (blockDataBa.length() > blockSize) { throw new InputDataError('Block data exceeds length of 128 bytes'); } @@ -44,6 +46,8 @@ export class KcEncoder extends AbstractEncoder { blockBa.setUint8(blockSize + 1, checksum); this.recordBytes(blockBa); + + this.recorder.endAnnotation(); } recordIntro() { diff --git a/retroload-lib/src/encoding/adapter/mo5/Mo5Encoder.ts b/retroload-lib/src/encoding/adapter/mo5/Mo5Encoder.ts index f6cb69b..ff2a222 100644 --- a/retroload-lib/src/encoding/adapter/mo5/Mo5Encoder.ts +++ b/retroload-lib/src/encoding/adapter/mo5/Mo5Encoder.ts @@ -15,21 +15,27 @@ const fOne = 1200; export class Mo5Encoder extends AbstractEncoder { recordStartBlock(ba: BufferAccess) { Logger.debug(ba.asHexDump()); + this.recorder.beginAnnotation('Start block'); this.recordPilot(1); this.recordBytes(ba); this.recordPilot(2); + this.recorder.endAnnotation(); } recordDataBlock(ba: BufferAccess) { Logger.debug(ba.asHexDump()); + this.recorder.beginAnnotation('Data block'); this.recordPilot(0.2); this.recordBytes(ba); + this.recorder.endAnnotation(); } recordEndBlock(ba: BufferAccess) { Logger.debug(ba.asHexDump()); + this.recorder.beginAnnotation('End block'); this.recordBytes(ba); this.recordPilot(1.5); + this.recorder.endAnnotation(); } override recordByte(byte: number) { diff --git a/retroload-lib/src/encoding/adapter/ta/TaEncoder.ts b/retroload-lib/src/encoding/adapter/ta/TaEncoder.ts index f66dfae..4c953b2 100644 --- a/retroload-lib/src/encoding/adapter/ta/TaEncoder.ts +++ b/retroload-lib/src/encoding/adapter/ta/TaEncoder.ts @@ -17,11 +17,15 @@ export class TaEncoder extends AbstractEncoder { headerBa.writeAsciiString('', 10, 0xd3); headerBa.writeAsciiString(filename, maxFileNameLength, 0); + this.recorder.beginAnnotation('Header'); this.recordOscillations(fOne, 500); this.recordBytes(headerBa); + this.recorder.endAnnotation(); + this.recorder.beginAnnotation('Data'); this.recordOscillations(fOne, 500); this.recordBytes(dataBa); this.recordOscillations(fOne, 500); + this.recorder.endAnnotation(); } override recordByte(byte: number) { diff --git a/retroload-lib/src/encoding/adapter/ti/TiEncoder.ts b/retroload-lib/src/encoding/adapter/ti/TiEncoder.ts index d331bb7..8ac72bf 100644 --- a/retroload-lib/src/encoding/adapter/ti/TiEncoder.ts +++ b/retroload-lib/src/encoding/adapter/ti/TiEncoder.ts @@ -14,12 +14,14 @@ const fOne = 1379; */ export class TiEncoder extends AbstractEncoder { recordHeader(numberOfRecords: number) { + this.recorder.beginAnnotation('Header'); for (let i = 0; i < 768; i++) { this.recordByte(0x00); } this.recordByte(0xff); // data mark this.recordByte(numberOfRecords); this.recordByte(numberOfRecords); // repeated + this.recorder.endAnnotation(); } recordBlock(blockDataBa: BufferAccess) { @@ -31,12 +33,14 @@ export class TiEncoder extends AbstractEncoder { const checksum = calculateChecksum8(blockDataBa); // every block is written twice for (let i = 0; i < 2; i++) { + this.recorder.beginAnnotation(i === 0 ? 'Data' : 'Data repeated'); for (let j = 0; j < 8; j++) { this.recordByte(0x00); } this.recordByte(0xff); // data mark this.recordBytes(blockDataBa); this.recordByte(checksum); + this.recorder.endAnnotation(); } } diff --git a/retroload-lib/src/encoding/adapter/z1013/Z1013Encoder.ts b/retroload-lib/src/encoding/adapter/z1013/Z1013Encoder.ts index 01347d2..45b1ebe 100644 --- a/retroload-lib/src/encoding/adapter/z1013/Z1013Encoder.ts +++ b/retroload-lib/src/encoding/adapter/z1013/Z1013Encoder.ts @@ -1,6 +1,7 @@ import {AbstractEncoder} from '../AbstractEncoder.js'; import {BufferAccess} from '../../../common/BufferAccess.js'; import {Logger} from '../../../common/logging/Logger.js'; +import {hex16} from '../../../common/Utils.js'; const blockDataSize = 32; const fOne = 1280; @@ -38,6 +39,8 @@ export class Z1013Encoder extends AbstractEncoder { } recordBlock(blockNumber: number, blockDataBa: BufferAccess) { + this.recorder.beginAnnotation(`Block ${hex16(blockNumber)}`); + const blockBa = BufferAccess.create(2 + blockDataBa.length() + 2); blockBa.writeUint16Le(blockNumber); blockBa.writeBa(blockDataBa); @@ -48,10 +51,14 @@ export class Z1013Encoder extends AbstractEncoder { this.recordIntro(); this.recordDelimiter(); this.recordBytes(blockBa); + + this.recorder.endAnnotation(); } recordFirstIntro() { + this.recorder.beginAnnotation('Sync'); this.recordOscillations(fSync, 2000); + this.recorder.endAnnotation(); } recordIntro() { diff --git a/retroload-lib/src/encoding/adapter/zxspectrum/ZxSpectrumGenericAdapter.ts b/retroload-lib/src/encoding/adapter/zxspectrum/ZxSpectrumGenericAdapter.ts index 80f29c0..ba6342e 100644 --- a/retroload-lib/src/encoding/adapter/zxspectrum/ZxSpectrumGenericAdapter.ts +++ b/retroload-lib/src/encoding/adapter/zxspectrum/ZxSpectrumGenericAdapter.ts @@ -89,14 +89,18 @@ function encode(recorder: RecorderInterface, ba: BufferAccess, options: OptionCo headerBlockBa.writeUint16Le(param2); headerBlockBa.writeUint8(calculateChecksum8Xor(headerBlockBa.slice(0, 18))); + recorder.beginAnnotation('Header'); e.recordStandardSpeedDataBlock(headerBlockBa); + recorder.endAnnotation(); const dataBlockBa = BufferAccess.create(ba.length() + 2); dataBlockBa.writeUint8(0xff); // marker byte dataBlockBa.writeBa(ba); dataBlockBa.writeUint8(calculateChecksum8Xor(dataBlockBa)); + recorder.beginAnnotation('Data'); e.recordStandardSpeedDataBlock(dataBlockBa); + recorder.endAnnotation(); e.end(); } diff --git a/retroload-lib/src/encoding/recorder/Annotations.test.ts b/retroload-lib/src/encoding/recorder/Annotations.test.ts new file mode 100644 index 0000000..139621a --- /dev/null +++ b/retroload-lib/src/encoding/recorder/Annotations.test.ts @@ -0,0 +1,86 @@ +import {InternalError} from '../../common/Exceptions.js'; +import {AnnotationCollector} from './Annotations.js'; + +test('Collects annotations', () => { + // Example annotations: + // 0 s 1 s 2s + // ------------------------------------------- + // |label 0 | + // ---------------------|--------------------- + // |label 0.1 |label 0.2 | + // ---------------------|--------------------- + + const collector = new AnnotationCollector(); + collector.beginAnnotation('label 0', {samples: 0, seconds: 0}); + collector.beginAnnotation('label 0.0', {samples: 0, seconds: 0}); + collector.endAnnotation({samples: 44100, seconds: 1}); + collector.beginAnnotation('label 0.1', {samples: 44100, seconds: 1}); + collector.endAnnotation({samples: 88200, seconds: 2}); + collector.endAnnotation({samples: 88200, seconds: 2}); + + const annotations = collector.getAnnotations(); + + expect(annotations.length).toBe(1); + expect(annotations[0].label).toBe('label 0'); + expect(annotations[0].begin).toStrictEqual({samples: 0, seconds: 0}); + expect(annotations[0].end).toStrictEqual({samples: 88200, seconds: 2}); + expect(annotations[0].annotations.length).toBe(2); + + expect(annotations[0].annotations[0].label).toBe('label 0.0'); + expect(annotations[0].annotations[0].begin).toStrictEqual({samples: 0, seconds: 0}); + expect(annotations[0].annotations[0].end).toStrictEqual({samples: 44100, seconds: 1}); + expect(annotations[0].annotations[0].annotations.length).toBe(0); + + expect(annotations[0].annotations[1].label).toBe('label 0.1'); + expect(annotations[0].annotations[1].begin).toStrictEqual({samples: 44100, seconds: 1}); + expect(annotations[0].annotations[1].end).toStrictEqual({samples: 88200, seconds: 2}); + expect(annotations[0].annotations[1].annotations.length).toBe(0); +}); + +test('Throws exception on invalid encapsulation', () => { + let exception: any; + try { + const collector = new AnnotationCollector(); + collector.beginAnnotation('label 0', {samples: 1, seconds: 44100}); + collector.beginAnnotation('label 0.0', {samples: 0, seconds: 0}); // begin before parent annotation + } catch (e) { + exception = e; + } + expect(exception).toBeInstanceOf(InternalError); +}); + +test('Throws exception when end is before begin', () => { + let exception: any; + try { + const collector = new AnnotationCollector(); + collector.beginAnnotation('label 0', {samples: 88200, seconds: 2}); + collector.endAnnotation({samples: 1, seconds: 44100}); + } catch (e) { + exception = e; + } + expect(exception).toBeInstanceOf(InternalError); +}); + +test('Throws exception when begin is before end of previous annotation in same level', () => { + let exception: any; + try { + const collector = new AnnotationCollector(); + collector.beginAnnotation('label 0', {samples: 0, seconds: 0}); + collector.endAnnotation({samples: 2, seconds: 88200}); + collector.beginAnnotation('label 1', {samples: 44100, seconds: 1}); + } catch (e) { + exception = e; + } + expect(exception).toBeInstanceOf(InternalError); +}); + +test('Throws exception when trying to close unopened annotation', () => { + let exception: any; + try { + const collector = new AnnotationCollector(); + collector.endAnnotation({samples: 1, seconds: 44100}); + } catch (e) { + exception = e; + } + expect(exception).toBeInstanceOf(InternalError); +}); diff --git a/retroload-lib/src/encoding/recorder/Annotations.ts b/retroload-lib/src/encoding/recorder/Annotations.ts new file mode 100644 index 0000000..65da93f --- /dev/null +++ b/retroload-lib/src/encoding/recorder/Annotations.ts @@ -0,0 +1,69 @@ +import {InternalError} from '../../common/Exceptions.js'; +import {type Position} from '../../common/Positioning.js'; + +export type Annotation = { + label: string; + begin: Position; + end?: Position; + annotations: Annotation[]; +}; + +export class AnnotationCollector { + private readonly annotationStack: Annotation[] = []; + private readonly annotations: Annotation[] = []; + + public beginAnnotation(label: string, position: Position) { + const parentAnnotation = this.getParentAnnotation(); + if (parentAnnotation !== undefined && (position.samples < parentAnnotation.begin.samples || position.seconds < parentAnnotation.begin.seconds)) { + throw new InternalError('Begin of pushed annotation is before parent annotation.'); + } + const previousAnnotation = this.getPreviousAnnotationInSameLevel(); + if (previousAnnotation?.end !== undefined && (previousAnnotation.end.samples > position.samples || previousAnnotation.end.seconds > position.seconds)) { + throw new InternalError('Begin of pushed annotation is before previous annotation.'); + } + this.annotationStack.push({label, begin: position, annotations: []}); + } + + public endAnnotation(position: Position) { + const annotation = this.annotationStack.pop(); + if (annotation === undefined) { + throw new InternalError('Unable to end annotation. No annotation has been opened.'); + } + if (annotation.begin.samples > position.samples || annotation.begin.seconds > position.seconds) { + throw new InternalError('End of annotation is before begin.'); + } + const closedAnnotation = { + ...annotation, + end: position, + }; + + this.getCurrentAnnotationList().push(closedAnnotation); + } + + public getAnnotations(): Annotation[] { + return this.annotations; + } + + private getParentAnnotation(): Annotation | undefined { + if (this.annotationStack.length === 0) { + return undefined; + } + + return this.annotationStack[this.annotationStack.length - 1]; + } + + private getCurrentAnnotationList(): Annotation[] { + const parentAnnotation = this.getParentAnnotation(); + + return parentAnnotation ? parentAnnotation.annotations : this.annotations; + } + + private getPreviousAnnotationInSameLevel(): Annotation | undefined { + const currentList = this.getCurrentAnnotationList(); + if (currentList.length === 0) { + return undefined; + } + + return currentList[currentList.length - 1]; + } +} diff --git a/retroload-lib/src/encoding/recorder/PcmRecorder.ts b/retroload-lib/src/encoding/recorder/PcmRecorder.ts index 13a04dd..e53f07a 100644 --- a/retroload-lib/src/encoding/recorder/PcmRecorder.ts +++ b/retroload-lib/src/encoding/recorder/PcmRecorder.ts @@ -1,4 +1,5 @@ import {InternalError} from '../../common/Exceptions.js'; +import {AnnotationCollector, type Annotation} from './Annotations.js'; import {SampleValue, type RecorderInterface} from './RecorderInterface.js'; const dataMap = { @@ -11,6 +12,8 @@ export class PcmRecorder implements RecorderInterface { audioContext: AudioContext; data: number[] = []; sampleRate = 44100; + private readonly annotationCollector = new AnnotationCollector(); + constructor(audioContext: any) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment this.audioContext = audioContext; @@ -30,4 +33,16 @@ export class PcmRecorder implements RecorderInterface { return buffer; } + + beginAnnotation(label: string): void { + this.annotationCollector.beginAnnotation(label, {samples: this.data.length, seconds: this.data.length / this.sampleRate}); + } + + endAnnotation(): void { + this.annotationCollector.endAnnotation({samples: this.data.length, seconds: this.data.length / this.sampleRate}); + } + + getAnnotations(): Annotation[] { + return this.annotationCollector.getAnnotations(); + } } diff --git a/retroload-lib/src/encoding/recorder/RecorderInterface.ts b/retroload-lib/src/encoding/recorder/RecorderInterface.ts index 654c416..7c828f4 100644 --- a/retroload-lib/src/encoding/recorder/RecorderInterface.ts +++ b/retroload-lib/src/encoding/recorder/RecorderInterface.ts @@ -1,6 +1,12 @@ +import {type Annotation} from './Annotations.js'; + export type RecorderInterface = { - pushSample: (value: SampleValue) => void; sampleRate: number; + + pushSample(value: SampleValue): void; + beginAnnotation(label: string): void; + endAnnotation(): void; + getAnnotations(): Annotation[]; }; export enum SampleValue { diff --git a/retroload-lib/src/encoding/recorder/WaveRecorder.ts b/retroload-lib/src/encoding/recorder/WaveRecorder.ts index 67c6a4b..fdc0082 100644 --- a/retroload-lib/src/encoding/recorder/WaveRecorder.ts +++ b/retroload-lib/src/encoding/recorder/WaveRecorder.ts @@ -1,4 +1,5 @@ import {BufferAccess} from '../../common/BufferAccess.js'; +import {AnnotationCollector, type Annotation} from './Annotations.js'; import {SampleValue, type RecorderInterface} from './RecorderInterface.js'; const dataMap: Record = { @@ -12,6 +13,7 @@ export class WaveRecorder implements RecorderInterface { sampleRate = 44100; bitsPerSample = 8; channels = 1; + private readonly annotationCollector = new AnnotationCollector(); pushSample(value: SampleValue) { const mappedValue = dataMap[value]; @@ -57,4 +59,16 @@ export class WaveRecorder implements RecorderInterface { getRawBuffer() { return new Uint8Array(this.data); } + + beginAnnotation(label: string): void { + this.annotationCollector.beginAnnotation(label, {samples: this.data.length, seconds: this.data.length / this.sampleRate}); + } + + endAnnotation(): void { + this.annotationCollector.endAnnotation({samples: this.data.length, seconds: this.data.length / this.sampleRate}); + } + + getAnnotations(): Annotation[] { + return this.annotationCollector.getAnnotations(); + } } diff --git a/retroload-lib/src/index.ts b/retroload-lib/src/index.ts index 4eb49c0..c1c2349 100644 --- a/retroload-lib/src/index.ts +++ b/retroload-lib/src/index.ts @@ -10,3 +10,4 @@ export {type PublicOptionDefinition} from './encoding/Options.js'; export {formatPosition, type Position} from './common/Positioning.js'; export {version} from './version.js'; export type {PublicAdapterDefinition} from './encoding/adapter/AdapterDefinition.js'; +export type {Annotation} from './encoding/recorder/Annotations.js'; diff --git a/retroload/src/retroload.ts b/retroload/src/retroload.ts index b1ab9d6..363f2d4 100755 --- a/retroload/src/retroload.ts +++ b/retroload/src/retroload.ts @@ -1,6 +1,6 @@ #!/usr/bin/env node -import {WaveRecorder, AdapterManager, Exception, Logger, version as libVersion, type PublicOptionDefinition} from 'retroload-lib'; +import {WaveRecorder, AdapterManager, Exception, Logger, version as libVersion, type PublicOptionDefinition, type Annotation, formatPosition} from 'retroload-lib'; import {Option} from 'commander'; import {type PlayerWrapper} from './player/PlayerWrapper.js'; import {SpeakerWrapper} from './player/SpeakerWrapper.js'; @@ -32,6 +32,7 @@ async function main() { .option('-o ', 'Generate WAVE file instead of playback') .option('-f, ' + getCommanderFlagsString(AdapterManager.formatOption), `${AdapterManager.formatOption.description}. See list below for supported formats.`) .option('-l, --loglevel ', 'Verbosity of log output', '1') + .option('-a, --annotations', 'Output annotations (if available)') .version(`retroload: ${cliVersion}\nretroload-lib: ${libVersion}`) .showHelpAfterError(); // Options defined in adapters/encoders @@ -65,6 +66,10 @@ async function main() { } } + if (options['annotations']) { + printAnnotations(recorder.getAnnotations()); + } + if (undefined === outfile) { // play const playerWrapper = await getPlayerWrapper(recorder); @@ -106,3 +111,16 @@ async function getPlayerWrapper(recorder: WaveRecorder): Promise Logger.error(msg); process.exit(1); } + +function printAnnotations(annotations: Annotation[], depth = 0) { + for (const annotation of annotations) { + const indentation = ' '.repeat(depth); + const range = annotation.end === undefined + ? formatPosition(annotation.begin) + : `${formatPosition(annotation.begin)} - ${formatPosition(annotation.end)}`; + const line = `${range} ${indentation}${annotation.label}\n`; + process.stdout.write(line); + + printAnnotations(annotation.annotations, depth + 1); + } +} From 5885be2f2f36a41c1472bec5652d6ef6c2a7761c Mon Sep 17 00:00:00 2001 From: Stefan Schramm Date: Tue, 26 Mar 2024 15:01:21 +0100 Subject: [PATCH 2/3] Restructure index.ts --- retroload-lib/src/index.ts | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/retroload-lib/src/index.ts b/retroload-lib/src/index.ts index c1c2349..20f2139 100644 --- a/retroload-lib/src/index.ts +++ b/retroload-lib/src/index.ts @@ -1,13 +1,20 @@ -export {PcmRecorder} from './encoding/recorder/PcmRecorder.js'; -export {WaveRecorder} from './encoding/recorder/WaveRecorder.js'; +// General export {Logger} from './common/logging/Logger.js'; +export * as Exception from './common/Exceptions.js'; export {BufferAccess} from './common/BufferAccess.js'; +export {formatPosition, type Position} from './common/Positioning.js'; +export {version} from './version.js'; +export {type Annotation} from './encoding/recorder/Annotations.js'; + +// Encoding +export {PcmRecorder} from './encoding/recorder/PcmRecorder.js'; +export {WaveRecorder} from './encoding/recorder/WaveRecorder.js'; export * as AdapterManager from './encoding/AdapterManager.js'; -export * as Exception from './common/Exceptions.js'; +export {type PublicOptionDefinition} from './encoding/Options.js'; +export {type PublicAdapterDefinition} from './encoding/adapter/AdapterDefinition.js'; + +// Decoding export * as DecoderManager from './decoding/DecoderManager.js'; + +// Tokenization export {tokenizers as BasicTokenizers} from './tokenizing/TokenizerProvider.js'; -export {type PublicOptionDefinition} from './encoding/Options.js'; -export {formatPosition, type Position} from './common/Positioning.js'; -export {version} from './version.js'; -export type {PublicAdapterDefinition} from './encoding/adapter/AdapterDefinition.js'; -export type {Annotation} from './encoding/recorder/Annotations.js'; From ff239b465a7b84569bd177e7c73065e58b4b7c82 Mon Sep 17 00:00:00 2001 From: Stefan Schramm Date: Wed, 27 Mar 2024 21:44:16 +0100 Subject: [PATCH 3/3] Fix package-lock --- package-lock.json | 482 +++++++++++++++++++--------------------------- 1 file changed, 202 insertions(+), 280 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea8c01f..91f77b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,127 +32,56 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -177,14 +106,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -251,12 +180,12 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -282,9 +211,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -315,9 +244,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -342,28 +271,29 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -441,9 +371,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -513,12 +443,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -615,12 +545,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -630,33 +560,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -674,9 +604,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -763,9 +693,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1213,32 +1143,32 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1251,9 +1181,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1394,9 +1324,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.11", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", - "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1410,9 +1340,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.6.tgz", - "integrity": "sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==", + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1425,9 +1355,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/stack-utils": { @@ -1452,16 +1382,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.1.tgz", - "integrity": "sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.19.1", - "@typescript-eslint/type-utils": "6.19.1", - "@typescript-eslint/utils": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1487,15 +1417,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.1.tgz", - "integrity": "sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.19.1", - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/typescript-estree": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "engines": { @@ -1515,13 +1445,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz", - "integrity": "sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1532,13 +1462,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.1.tgz", - "integrity": "sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.19.1", - "@typescript-eslint/utils": "6.19.1", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1559,9 +1489,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.1.tgz", - "integrity": "sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1572,13 +1502,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz", - "integrity": "sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1600,17 +1530,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.1.tgz", - "integrity": "sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "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.19.1", - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/typescript-estree": "6.19.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "engines": { @@ -1625,12 +1555,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz", - "integrity": "sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.1", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1913,9 +1843,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -1932,8 +1862,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -1990,9 +1920,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001579", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", - "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", "dev": true, "funding": [ { @@ -2268,9 +2198,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.644", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.644.tgz", - "integrity": "sha512-zOnPndwz3u1sVFSyBcRWcn0529Kz+jr+tDxN9iP69I3CpC5wlvYmjLrK2O7TEsg2oDDoUqooeXqbiHLvXvl6Lg==", + "version": "1.4.718", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.718.tgz", + "integrity": "sha512-6FpOapKxHuRNUoNQEP54sAacMod/XX68/Oaau+UoTEC8yxy5lR8jAvTlyrb60oZ9OtuUuAEtKvCQOJm6S4MtBQ==", "dev": true }, "node_modules/emittery": { @@ -2301,9 +2231,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -2322,16 +2252,16 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -2641,9 +2571,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -2743,9 +2673,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/fs.realpath": { @@ -2953,9 +2883,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -2980,9 +2910,9 @@ } }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -3151,14 +3081,14 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, @@ -3195,9 +3125,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -4401,9 +4331,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -4564,9 +4494,9 @@ } }, "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==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4847,12 +4777,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" @@ -4935,9 +4865,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5121,11 +5051,11 @@ } }, "retroload": { - "version": "0.0.15", + "version": "0.0.16", "license": "AGPL-3.0-only", "dependencies": { "commander": "^11.1.0", - "retroload-lib": "^0.0.15" + "retroload-lib": "^0.0.16" }, "bin": { "retroload": "bin/retroload.js", @@ -5133,7 +5063,7 @@ "retroload-tokenizer": "bin/retroload-tokenizer.js" }, "devDependencies": { - "genversion": "^3.1.1" + "genversion": "^3.2.0" } }, "retroload-lib": { @@ -5144,15 +5074,7 @@ }, "devDependencies": { "@types/pako": "^2.0.3", - "genversion": "^3.1.1" - } - }, - "retroload/node_modules/retroload-lib": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/retroload-lib/-/retroload-lib-0.0.15.tgz", - "integrity": "sha512-xx+qGRKtcOEzYwWv4R5j52bW/xsQG3TWwpauYAXzpys7IMgZDU1Ll6x/GswJcj9Ey58H6k92sloVVa0ywrRtmQ==", - "dependencies": { - "pako": "^2.1.0" + "genversion": "^3.2.0" } } }