music-metadata 8.2.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +152 -132
  2. package/lib/ParserFactory.d.ts +1 -1
  3. package/lib/ParserFactory.js +1 -2
  4. package/lib/aiff/AiffParser.js +3 -4
  5. package/lib/aiff/AiffToken.d.ts +2 -4
  6. package/lib/aiff/AiffToken.js +7 -7
  7. package/lib/apev2/APEv2Parser.d.ts +1 -1
  8. package/lib/apev2/APEv2Parser.js +10 -12
  9. package/lib/apev2/APEv2TagMapper.js +1 -1
  10. package/lib/apev2/APEv2Token.d.ts +1 -1
  11. package/lib/asf/AsfObject.d.ts +15 -17
  12. package/lib/asf/AsfObject.js +52 -46
  13. package/lib/asf/AsfParser.js +6 -8
  14. package/lib/asf/AsfTagMapper.js +1 -1
  15. package/lib/asf/AsfUtil.d.ts +1 -3
  16. package/lib/asf/AsfUtil.js +4 -5
  17. package/lib/asf/GUID.d.ts +4 -5
  18. package/lib/asf/GUID.js +14 -11
  19. package/lib/common/BasicParser.d.ts +1 -1
  20. package/lib/common/FourCC.d.ts +1 -1
  21. package/lib/common/FourCC.js +5 -3
  22. package/lib/common/MetadataCollector.d.ts +3 -3
  23. package/lib/common/MetadataCollector.js +7 -8
  24. package/lib/common/RandomFileReader.d.ts +0 -1
  25. package/lib/common/Util.d.ts +1 -1
  26. package/lib/common/Util.js +4 -3
  27. package/lib/core.d.ts +16 -8
  28. package/lib/core.js +19 -5
  29. package/lib/dsdiff/DsdiffParser.js +1 -1
  30. package/lib/dsdiff/DsdiffToken.d.ts +1 -1
  31. package/lib/dsf/DsfChunk.d.ts +1 -1
  32. package/lib/flac/FlacParser.d.ts +1 -1
  33. package/lib/flac/FlacParser.js +6 -4
  34. package/lib/id3v1/ID3v1Parser.js +6 -6
  35. package/lib/id3v2/AbstractID3Parser.d.ts +1 -1
  36. package/lib/id3v2/AbstractID3Parser.js +1 -1
  37. package/lib/id3v2/FrameParser.js +4 -3
  38. package/lib/id3v2/ID3v24TagMapper.d.ts +2 -3
  39. package/lib/id3v2/ID3v24TagMapper.js +14 -9
  40. package/lib/id3v2/ID3v2Parser.d.ts +1 -1
  41. package/lib/id3v2/ID3v2Parser.js +10 -17
  42. package/lib/id3v2/ID3v2Token.d.ts +1 -1
  43. package/lib/id3v2/ID3v2Token.js +2 -2
  44. package/lib/iff/index.d.ts +1 -1
  45. package/lib/index.d.ts +1 -2
  46. package/lib/index.js +1 -1
  47. package/lib/lyrics3/Lyrics3.js +1 -1
  48. package/lib/matroska/MatroskaDtd.js +12 -12
  49. package/lib/matroska/MatroskaParser.d.ts +1 -1
  50. package/lib/matroska/MatroskaParser.js +16 -20
  51. package/lib/matroska/types.d.ts +0 -1
  52. package/lib/mp4/Atom.d.ts +1 -1
  53. package/lib/mp4/AtomToken.d.ts +2 -3
  54. package/lib/mp4/AtomToken.js +2 -2
  55. package/lib/mp4/MP4Parser.js +20 -19
  56. package/lib/mp4/MP4TagMapper.js +1 -1
  57. package/lib/mpeg/ExtendedLameHeader.d.ts +1 -1
  58. package/lib/mpeg/MpegParser.js +4 -4
  59. package/lib/mpeg/ReplayGainDataFormat.d.ts +1 -1
  60. package/lib/mpeg/XingTag.d.ts +1 -2
  61. package/lib/musepack/index.js +1 -1
  62. package/lib/musepack/sv7/BitReader.d.ts +1 -1
  63. package/lib/musepack/sv7/StreamVersion7.d.ts +1 -1
  64. package/lib/musepack/sv7/StreamVersion7.js +1 -1
  65. package/lib/musepack/sv8/StreamVersion8.d.ts +1 -1
  66. package/lib/musepack/sv8/StreamVersion8.js +1 -1
  67. package/lib/ogg/Ogg.d.ts +2 -2
  68. package/lib/ogg/OggParser.d.ts +1 -1
  69. package/lib/ogg/OggParser.js +5 -5
  70. package/lib/ogg/opus/Opus.d.ts +1 -1
  71. package/lib/ogg/opus/Opus.js +6 -6
  72. package/lib/ogg/opus/OpusParser.d.ts +2 -3
  73. package/lib/ogg/opus/OpusParser.js +2 -2
  74. package/lib/ogg/speex/Speex.d.ts +1 -1
  75. package/lib/ogg/speex/Speex.js +13 -13
  76. package/lib/ogg/speex/SpeexParser.d.ts +1 -2
  77. package/lib/ogg/theora/Theora.d.ts +1 -1
  78. package/lib/ogg/theora/Theora.js +6 -6
  79. package/lib/ogg/theora/TheoraParser.d.ts +4 -5
  80. package/lib/ogg/theora/TheoraParser.js +4 -4
  81. package/lib/ogg/vorbis/Vorbis.d.ts +3 -4
  82. package/lib/ogg/vorbis/Vorbis.js +11 -12
  83. package/lib/ogg/vorbis/VorbisDecoder.js +1 -1
  84. package/lib/ogg/vorbis/VorbisParser.d.ts +6 -7
  85. package/lib/ogg/vorbis/VorbisParser.js +11 -11
  86. package/lib/riff/RiffChunk.d.ts +1 -1
  87. package/lib/riff/RiffChunk.js +2 -2
  88. package/lib/riff/RiffInfoTagMap.js +16 -16
  89. package/lib/type.d.ts +9 -11
  90. package/lib/wav/BwfChunk.d.ts +1 -1
  91. package/lib/wav/WaveChunk.d.ts +2 -3
  92. package/lib/wav/WaveChunk.js +8 -7
  93. package/lib/wav/WaveParser.js +2 -2
  94. package/lib/wavpack/WavPackParser.js +1 -1
  95. package/lib/wavpack/WavPackToken.d.ts +1 -1
  96. package/lib/wavpack/WavPackToken.js +1 -1
  97. package/package.json +29 -28
@@ -1,4 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
1
  import { IVorbisPicture } from './Vorbis.js';
3
2
  import { IPageConsumer, IPageHeader } from '../Ogg.js';
4
3
  import { IOptions } from '../../type.js';
@@ -17,10 +16,10 @@ export declare class VorbisParser implements IPageConsumer {
17
16
  * @param header Ogg Page Header
18
17
  * @param pageData Page data
19
18
  */
20
- parsePage(header: IPageHeader, pageData: Buffer): void;
21
- flush(): void;
22
- parseUserComment(pageData: Buffer, offset: number): number;
23
- addTag(id: string, value: string | IVorbisPicture): void;
19
+ parsePage(header: IPageHeader, pageData: Buffer): Promise<void>;
20
+ flush(): Promise<void>;
21
+ parseUserComment(pageData: Buffer, offset: number): Promise<number>;
22
+ addTag(id: string, value: string | IVorbisPicture): Promise<void>;
24
23
  calculateDuration(header: IPageHeader): void;
25
24
  /**
26
25
  * Parse first Ogg/Vorbis page
@@ -28,9 +27,9 @@ export declare class VorbisParser implements IPageConsumer {
28
27
  * @param pageData
29
28
  */
30
29
  protected parseFirstPage(header: IPageHeader, pageData: Buffer): void;
31
- protected parseFullPage(pageData: Buffer): void;
30
+ protected parseFullPage(pageData: Buffer): Promise<void>;
32
31
  /**
33
32
  * Ref: https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-840005.2
34
33
  */
35
- protected parseUserCommentList(pageData: Buffer, offset: number): void;
34
+ protected parseUserCommentList(pageData: Buffer, offset: number): Promise<void>;
36
35
  }
@@ -18,7 +18,7 @@ export class VorbisParser {
18
18
  * @param header Ogg Page Header
19
19
  * @param pageData Page data
20
20
  */
21
- parsePage(header, pageData) {
21
+ async parsePage(header, pageData) {
22
22
  if (header.headerType.firstPage) {
23
23
  this.parseFirstPage(header, pageData);
24
24
  }
@@ -33,7 +33,7 @@ export class VorbisParser {
33
33
  // Flush page segments
34
34
  if (this.pageSegments.length > 0) {
35
35
  const fullPage = Buffer.concat(this.pageSegments);
36
- this.parseFullPage(fullPage);
36
+ await this.parseFullPage(fullPage);
37
37
  }
38
38
  // Reset page segments
39
39
  this.pageSegments = header.headerType.lastPage ? [] : [pageData];
@@ -43,16 +43,16 @@ export class VorbisParser {
43
43
  this.calculateDuration(header);
44
44
  }
45
45
  }
46
- flush() {
47
- this.parseFullPage(Buffer.concat(this.pageSegments));
46
+ async flush() {
47
+ await this.parseFullPage(Buffer.concat(this.pageSegments));
48
48
  }
49
- parseUserComment(pageData, offset) {
49
+ async parseUserComment(pageData, offset) {
50
50
  const decoder = new VorbisDecoder(pageData, offset);
51
51
  const tag = decoder.parseUserComment();
52
- this.addTag(tag.key, tag.value);
52
+ await this.addTag(tag.key, tag.value);
53
53
  return tag.len;
54
54
  }
55
- addTag(id, value) {
55
+ async addTag(id, value) {
56
56
  if (id === 'METADATA_BLOCK_PICTURE' && (typeof value === 'string')) {
57
57
  if (this.options.skipCovers) {
58
58
  debug(`Ignore picture`);
@@ -64,7 +64,7 @@ export class VorbisParser {
64
64
  else {
65
65
  debug(`Push tag: id=${id}, value=${value}`);
66
66
  }
67
- this.metadata.addTag('vorbis', id, value);
67
+ await this.metadata.addTag('vorbis', id, value);
68
68
  }
69
69
  calculateDuration(header) {
70
70
  if (this.metadata.format.sampleRate && header.absoluteGranulePosition >= 0) {
@@ -95,7 +95,7 @@ export class VorbisParser {
95
95
  else
96
96
  throw new Error('First Ogg page should be type 1: the identification header');
97
97
  }
98
- parseFullPage(pageData) {
98
+ async parseFullPage(pageData) {
99
99
  // New page
100
100
  const commonHeader = CommonHeader.get(pageData, 0);
101
101
  debug('Parse full page: type=%s, byteLength=%s', commonHeader.packetType, pageData.byteLength);
@@ -110,7 +110,7 @@ export class VorbisParser {
110
110
  /**
111
111
  * Ref: https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-840005.2
112
112
  */
113
- parseUserCommentList(pageData, offset) {
113
+ async parseUserCommentList(pageData, offset) {
114
114
  const strLen = Token.UINT32_LE.get(pageData, offset);
115
115
  offset += 4;
116
116
  // const vendorString = new Token.StringType(strLen, 'utf-8').get(pageData, offset);
@@ -118,7 +118,7 @@ export class VorbisParser {
118
118
  let userCommentListLength = Token.UINT32_LE.get(pageData, offset);
119
119
  offset += 4;
120
120
  while (userCommentListLength-- > 0) {
121
- offset += this.parseUserComment(pageData, offset);
121
+ offset += (await this.parseUserComment(pageData, offset));
122
122
  }
123
123
  }
124
124
  }
@@ -1,4 +1,4 @@
1
- import { IGetToken } from 'strtok3/core';
1
+ import type { IGetToken } from 'strtok3';
2
2
  import { IChunkHeader } from '../iff/index.js';
3
3
  export { IChunkHeader } from '../iff/index.js';
4
4
  /**
@@ -7,9 +7,9 @@ export const Header = {
7
7
  get: (buf, off) => {
8
8
  return {
9
9
  // Group-ID
10
- chunkID: buf.toString('binary', off, off + 4),
10
+ chunkID: new Token.StringType(4, 'latin1').get(buf, off),
11
11
  // Size
12
- chunkSize: Token.UINT32_LE.get(buf, 4)
12
+ chunkSize: Token.UINT32_LE.get(buf, off + 4)
13
13
  };
14
14
  }
15
15
  };
@@ -4,27 +4,27 @@ import { CommonTagMapper } from '../common/GenericTagMapper.js';
4
4
  * Ref: http://owl.phy.queensu.ca/~phil/exiftool/TagNames/RIFF.html#Info
5
5
  */
6
6
  export const riffInfoTagMap = {
7
- IART: 'artist',
8
- ICRD: 'date',
9
- INAM: 'title',
7
+ IART: 'artist', // Artist
8
+ ICRD: 'date', // DateCreated
9
+ INAM: 'title', // Title
10
10
  TITL: 'title',
11
- IPRD: 'album',
11
+ IPRD: 'album', // Product
12
12
  ITRK: 'track',
13
- IPRT: 'track',
14
- COMM: 'comment',
15
- ICMT: 'comment',
13
+ IPRT: 'track', // Additional tag for track index
14
+ COMM: 'comment', // Comments
15
+ ICMT: 'comment', // Country
16
16
  ICNT: 'releasecountry',
17
- GNRE: 'genre',
18
- IWRI: 'writer',
17
+ GNRE: 'genre', // Genre
18
+ IWRI: 'writer', // WrittenBy
19
19
  RATE: 'rating',
20
20
  YEAR: 'year',
21
- ISFT: 'encodedby',
22
- CODE: 'encodedby',
23
- TURL: 'website',
24
- IGNR: 'genre',
25
- IENG: 'engineer',
26
- ITCH: 'technician',
27
- IMED: 'media',
21
+ ISFT: 'encodedby', // Software
22
+ CODE: 'encodedby', // EncodedBy
23
+ TURL: 'website', // URL,
24
+ IGNR: 'genre', // Genre
25
+ IENG: 'engineer', // Engineer
26
+ ITCH: 'technician', // Technician
27
+ IMED: 'media', // Original Media
28
28
  IRPD: 'album' // Product, where the file was intended for
29
29
  };
30
30
  export class RiffInfoTagMapper extends CommonTagMapper {
package/lib/type.d.ts CHANGED
@@ -1,5 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- import { Buffer } from 'node:buffer';
3
1
  import { GenericTagId, TagType } from './common/GenericTagTypes.js';
4
2
  import { IFooter } from './apev2/APEv2Token.js';
5
3
  import { TrackType } from './matroska/types.js';
@@ -15,7 +13,7 @@ export interface IPicture {
15
13
  /**
16
14
  * Image data
17
15
  */
18
- data: Buffer;
16
+ data: Uint8Array;
19
17
  /**
20
18
  * Optional description
21
19
  */
@@ -366,7 +364,7 @@ export interface IAudioTrack {
366
364
  samplingFrequency?: number;
367
365
  outputSamplingFrequency?: number;
368
366
  channels?: number;
369
- channelPositions?: Buffer;
367
+ channelPositions?: Uint8Array;
370
368
  bitDepth?: number;
371
369
  }
372
370
  export interface IVideoTrack {
@@ -378,7 +376,7 @@ export interface IVideoTrack {
378
376
  displayHeight?: number;
379
377
  displayUnit?: number;
380
378
  aspectRatioType?: number;
381
- colourSpace?: Buffer;
379
+ colourSpace?: Uint8Array;
382
380
  gammaValue?: number;
383
381
  }
384
382
  export interface ITrackInfo {
@@ -445,7 +443,7 @@ export interface IFormat {
445
443
  /**
446
444
  * 16-byte MD5 of raw audio
447
445
  */
448
- readonly audioMD5?: Buffer;
446
+ readonly audioMD5?: Uint8Array;
449
447
  /**
450
448
  * Chapters in audio stream
451
449
  */
@@ -587,11 +585,11 @@ export interface IRandomReader {
587
585
  fileSize: number;
588
586
  /**
589
587
  * Read from a given position of an abstracted file or buffer.
590
- * @param buffer {Buffer} is the buffer that the data will be written to.
591
- * @param offset {number} is the offset in the buffer to start writing at.
592
- * @param length {number}is an integer specifying the number of bytes to read.
593
- * @param position {number} is an argument specifying where to begin reading from in the file.
588
+ * @param {Uint8Array} buffer the buffer that the data will be written to.
589
+ * @param {number} offset the offset in the buffer to start writing at.
590
+ * @param {number} length an integer specifying the number of bytes to read.
591
+ * @param {number} position an argument specifying where to begin reading from in the file.
594
592
  * @return {Promise<number>} bytes read
595
593
  */
596
- randomRead(buffer: Buffer, offset: number, length: number, position: number): Promise<number>;
594
+ randomRead(buffer: Uint8Array, offset: number, length: number, position: number): Promise<number>;
597
595
  }
@@ -1,4 +1,4 @@
1
- import { IGetToken } from 'strtok3/core';
1
+ import type { IGetToken } from 'strtok3';
2
2
  export interface IBroadcastAudioExtensionChunk {
3
3
  description: string;
4
4
  originator: string;
@@ -1,5 +1,4 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- import { IGetToken } from 'strtok3/core';
1
+ import type { IGetToken } from 'strtok3';
3
2
  import { IChunkHeader } from '../iff/index.js';
4
3
  /**
5
4
  * Ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd317599(v=vs.85).aspx
@@ -47,7 +46,7 @@ export interface IWaveFormat {
47
46
  export declare class Format implements IGetToken<IWaveFormat> {
48
47
  len: number;
49
48
  constructor(header: IChunkHeader);
50
- get(buf: Buffer, off: number): IWaveFormat;
49
+ get(buf: Uint8Array, off: number): IWaveFormat;
51
50
  }
52
51
  export interface IFactChunk {
53
52
  dwSampleLength: number;
@@ -1,3 +1,4 @@
1
+ import * as Token from 'token-types';
1
2
  /**
2
3
  * Ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd317599(v=vs.85).aspx
3
4
  */
@@ -31,12 +32,12 @@ export class Format {
31
32
  }
32
33
  get(buf, off) {
33
34
  return {
34
- wFormatTag: buf.readUInt16LE(off),
35
- nChannels: buf.readUInt16LE(off + 2),
36
- nSamplesPerSec: buf.readUInt32LE(off + 4),
37
- nAvgBytesPerSec: buf.readUInt32LE(off + 8),
38
- nBlockAlign: buf.readUInt16LE(off + 12),
39
- wBitsPerSample: buf.readUInt16LE(off + 14)
35
+ wFormatTag: Token.UINT16_LE.get(buf, off),
36
+ nChannels: Token.UINT16_LE.get(buf, off + 2),
37
+ nSamplesPerSec: Token.UINT32_LE.get(buf, off + 4),
38
+ nAvgBytesPerSec: Token.UINT32_LE.get(buf, off + 8),
39
+ nBlockAlign: Token.UINT16_LE.get(buf, off + 12),
40
+ wBitsPerSample: Token.UINT16_LE.get(buf, off + 14)
40
41
  };
41
42
  }
42
43
  }
@@ -54,7 +55,7 @@ export class FactChunk {
54
55
  }
55
56
  get(buf, off) {
56
57
  return {
57
- dwSampleLength: buf.readUInt32LE(off)
58
+ dwSampleLength: Token.UINT32_LE.get(buf, off)
58
59
  };
59
60
  }
60
61
  }
@@ -1,4 +1,4 @@
1
- import * as strtok3 from 'strtok3/core';
1
+ import * as strtok3 from 'strtok3';
2
2
  import * as Token from 'token-types';
3
3
  import initDebug from 'debug';
4
4
  import * as riff from '../riff/RiffChunk.js';
@@ -129,7 +129,7 @@ export class WaveParser extends BasicParser {
129
129
  }
130
130
  }
131
131
  async parseListTag(listHeader) {
132
- const listType = await this.tokenizer.readToken(new Token.StringType(4, 'binary'));
132
+ const listType = await this.tokenizer.readToken(new Token.StringType(4, 'latin1'));
133
133
  debug('pos=%s, parseListTag: chunkID=RIFF/WAVE/LIST/%s', this.tokenizer.position, listType);
134
134
  switch (listType) {
135
135
  case 'INFO':
@@ -64,7 +64,7 @@ export class WavPackParser extends BasicParser {
64
64
  case 0xe: // ID_DSD_BLOCK
65
65
  debug('ID_DSD_BLOCK');
66
66
  // https://github.com/dbry/WavPack/issues/71#issuecomment-483094813
67
- const mp = 1 << data.readUInt8(0);
67
+ const mp = 1 << Token.UINT8.get(data, 0);
68
68
  const samplingRate = header.flags.samplingRate * mp * 8; // ToDo: second factor should be read from DSD-metadata block https://github.com/dbry/WavPack/issues/71#issuecomment-483094813
69
69
  if (!header.flags.isDSD)
70
70
  throw new Error('Only expect DSD block if DSD-flag is set');
@@ -1,4 +1,4 @@
1
- import { IGetToken } from 'strtok3/core';
1
+ import type { IGetToken } from 'strtok3';
2
2
  /**
3
3
  * WavPack Block Header
4
4
  *
@@ -63,7 +63,7 @@ WavPack.MetadataIdToken = {
63
63
  len: 1,
64
64
  get: (buf, off) => {
65
65
  return {
66
- functionId: WavPack.getBitAllignedNumber(buf[off], 0, 6),
66
+ functionId: WavPack.getBitAllignedNumber(buf[off], 0, 6), // functionId overlaps with isOptional flag
67
67
  isOptional: WavPack.isBitSet(buf[off], 5),
68
68
  isOddSize: WavPack.isBitSet(buf[off], 6),
69
69
  largeBlock: WavPack.isBitSet(buf[off], 7)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "music-metadata",
3
3
  "description": "Music metadata parser for Node.js, supporting virtual any audio and tag format.",
4
- "version": "8.2.0",
4
+ "version": "9.0.0",
5
5
  "author": {
6
6
  "name": "Borewit",
7
7
  "url": "https://github.com/Borewit"
@@ -92,42 +92,43 @@
92
92
  "@tokenizer/token": "^0.3.0",
93
93
  "content-type": "^1.0.5",
94
94
  "debug": "^4.3.4",
95
- "file-type": "^18.6.0",
95
+ "file-type": "^19.1.0",
96
96
  "media-typer": "^1.1.0",
97
- "strtok3": "^7.0.0",
98
- "token-types": "^5.0.1"
97
+ "strtok3": "^7.1.0",
98
+ "token-types": "^6.0.0",
99
+ "uint8array-extras": "^1.3.0"
99
100
  },
100
101
  "devDependencies": {
101
- "@types/chai": "^4.3.9",
102
- "@types/chai-as-promised": "^7.1.7",
103
- "@types/debug": "^4.1.11",
102
+ "@types/chai": "^4.3.16",
103
+ "@types/chai-as-promised": "^7.1.8",
104
+ "@types/debug": "^4.1.12",
104
105
  "@types/file-type": "^10.9.1",
105
- "@types/mocha": "^10.0.3",
106
- "@types/node": "^20.8.10",
107
- "@typescript-eslint/eslint-plugin": "^5.62.0",
108
- "@typescript-eslint/parser": "^5.62.0",
109
- "c8": "^8.0.1",
110
- "chai": "^4.3.10",
111
- "chai-as-promised": "^7.1.1",
112
- "del-cli": "5.1.0",
113
- "eslint": "^8.53.0",
114
- "eslint-config-prettier": "^9.0.0",
106
+ "@types/mocha": "^10.0.7",
107
+ "@types/node": "^20.14.10",
108
+ "@typescript-eslint/eslint-plugin": "^7.14.1",
109
+ "@typescript-eslint/parser": "^7.16.0",
110
+ "c8": "^10.1.2",
111
+ "chai": "^5.1.1",
112
+ "chai-as-promised": "^8.0.0",
113
+ "del-cli": "^5.1.0",
114
+ "eslint": "^8.57.0",
115
+ "eslint-config-prettier": "^9.1.0",
115
116
  "eslint-import-resolver-typescript": "^3.6.1",
116
- "eslint-plugin-import": "^2.29.0",
117
- "eslint-plugin-jsdoc": "^46.8.2",
117
+ "eslint-plugin-import": "^2.29.1",
118
+ "eslint-plugin-jsdoc": "^48.5.0",
118
119
  "eslint-plugin-node": "^11.1.0",
119
- "eslint-plugin-unicorn": "^49.0.0",
120
- "mime": "^3.0.0",
121
- "mocha": "^10.2.0",
120
+ "eslint-plugin-unicorn": "^54.0.0",
121
+ "mime": "^4.0.4",
122
+ "mocha": "^10.6.0",
122
123
  "npm-run-all": "^4.1.5",
123
- "prettier": "^3.0.3",
124
- "remark-cli": "^12.0.0",
125
- "remark-preset-lint-markdown-style-guide": "^5.1.3",
126
- "ts-node": "^10.9.1",
127
- "typescript": "^5.2.2"
124
+ "prettier": "^3.3.2",
125
+ "remark-cli": "^12.0.1",
126
+ "remark-preset-lint-markdown-style-guide": "^6.0.0",
127
+ "ts-node": "^10.9.2",
128
+ "typescript": "^5.5.3"
128
129
  },
129
130
  "engines": {
130
- "node": "^14.13.1 || >=16.0.0"
131
+ "node": ">=16.0.0"
131
132
  },
132
133
  "repository": {
133
134
  "type": "git",