exiftool-vendored 30.2.0 → 30.3.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.
package/CHANGELOG.md CHANGED
@@ -25,6 +25,30 @@ vendored versions of ExifTool match the version that they vendor.
25
25
 
26
26
  ## Version history
27
27
 
28
+ ### v30.3.0
29
+
30
+ - 🌱 Upgraded ExifTool to version [13.31](https://exiftool.org/history.html#13.31).
31
+
32
+ - ✨ Added **Disposable interface support** for automatic resource cleanup:
33
+ - `ExifTool` now implements both `Disposable` and `AsyncDisposable` interfaces
34
+ - Use `using et = new ExifTool()` for automatic synchronous cleanup (TypeScript 5.2+)
35
+ - Use `await using et = new ExifTool()` for automatic asynchronous cleanup
36
+ - Synchronous disposal initiates graceful cleanup with configurable timeout fallback
37
+ - Asynchronous disposal provides robust cleanup with timeout protection
38
+ - New options: `disposalTimeoutMs` (default: 1000ms) and `asyncDisposalTimeoutMs` (default: 5000ms)
39
+ - Comprehensive error handling ensures disposal never throws or hangs
40
+ - Maintains backward compatibility - existing `.end()` method unchanged
41
+
42
+ - ✨ **Enhanced JSDoc annotations** for Tags interface with emoji-based visual hierarchy:
43
+ - Replaced cryptic star/checkmark system with ~~even more cryptic~~ semantic JSDoc tags
44
+ - Added 🔥/🧊 emojis to indicate mainstream consumer vs specialized devices
45
+ - Format: `@frequency 🔥 ★★★★ (85%)` combines device type, visual rating, and exact percentage
46
+ - Consolidated @mainstream into @frequency tag for cleaner, more compact documentation
47
+ - Added @groups tag showing all metadata groups where each tag appears (e.g., "EXIF, MakerNotes")
48
+ - Generated `data/TagMetadata.json` with programmatic access to frequency, mainstream flags, and groups
49
+ - Custom TypeDoc tags defined in tsdoc.json for proper tooling support
50
+ - Star ratings maintain same thresholds: ★★★★ (>50%), ★★★☆ (>20%), ★★☆☆ (>10%), ★☆☆☆ (>5%), ☆☆☆☆ (≤5%)
51
+
28
52
  ### v30.2.0
29
53
 
30
54
  - ✨ Enhanced `StrEnum` with iterator support and JSDoc
@@ -36,26 +60,22 @@ vendored versions of ExifTool match the version that they vendor.
36
60
  - 🐞 Fixed `ExifToolVersion` to be a `string`. Prior versions used `exiftool`'s JSON representation, which rendered a numeric float. This caused versions like "12.3" and "12.30" to appear identical. We now preserve the exact version string to enable proper version comparisons.
37
61
 
38
62
  - ✨ Added **partial date support** for `ExifDate` class. XMP date tags (like `XMP:CreateDate`, `XMP:MetadataDate`) now support:
39
-
40
63
  - **Year-only dates**: `1980` (numeric) or `"1980"` (string)
41
64
  - **Year-month dates**: `"1980:08"` (EXIF format) or `"1980-08"` (ISO format)
42
65
  - **Full dates**: `"1980:08:13"` (unchanged)
43
66
 
44
67
  - ✨ Enhanced `ExifDate` with type-safe predicates:
45
-
46
68
  - `isYearOnly()`: Returns `true` for year-only dates with type narrowing
47
69
  - `isYearMonth()`: Returns `true` for year-month dates with type narrowing
48
70
  - `isFullDate()`: Returns `true` for complete dates with type narrowing
49
71
  - `isPartial()`: Returns `true` for year-only or year-month dates
50
72
 
51
73
  - ✨ Added compositional TypeScript interfaces:
52
-
53
74
  - `ExifDateYearOnly`: `{year: number}`
54
75
  - `ExifDateYearMonth extends ExifDateYearOnly`: `{year: number, month: number}`
55
76
  - `ExifDateFull extends ExifDateYearMonth`: `{year: number, month: number, day: number}`
56
77
 
57
78
  - ✨ Enhanced `WriteTags` interface with group-prefixed tag support:
58
-
59
79
  - `"XMP:CreateDate"`, `"XMP:MetadataDate"`, etc. accept partial dates
60
80
  - `"EXIF:CreateDate"`, etc. require full dates (type-safe distinction)
61
81
 
@@ -358,7 +378,6 @@ vendored versions of ExifTool match the version that they vendor.
358
378
  ### v23.2.0
359
379
 
360
380
  - ✨ Timezone parsing improvements:
361
-
362
381
  - Added [`ExifToolOptions.inferTimezoneFromDatestampTags`](https://photostructure.github.io/exiftool-vendored.js/interfaces/ExifToolOptions.html#inferTimezoneFromDatestampTags).
363
382
  - Timezone inference from datestamps now skips over UTC values, as Google
364
383
  Takeout (and several other applications) may spuriously set "+00:00" to
@@ -530,7 +549,6 @@ vendored versions of ExifTool match the version that they vendor.
530
549
  ### v18.5.0
531
550
 
532
551
  - ✨ `ExifToolOptions` now supports an `ignorableError` predicate, used for characterizing errors as "ignorable". Defaults to ignoring the following styles of warnings:
533
-
534
552
  - `Warning: Duplicate MakerNoteUnknown tag in ExifIFD`
535
553
  - `Warning: ICC_Profile deleted. Image colors may be affected`
536
554
 
@@ -663,7 +681,6 @@ const exiftool = new ExifTool({
663
681
  - ✨ Added read/write support for
664
682
  [History](https://exiftool.org/TagNames/XMP.html#ResourceEvent) and
665
683
  [Versions](https://exiftool.org/TagNames/XMP.html#Version) structs.
666
-
667
684
  - These two tags return typed optional struct arrays.
668
685
 
669
686
  - Via the new `StructAppendTags` interface, `ExifTool.write()` now accepts
package/CLAUDE.md CHANGED
@@ -30,7 +30,7 @@ npm run docs # Generate TypeDoc docs and serve at http://localhost:3000
30
30
  npm run docs:1 # Build documentation only (without serving)
31
31
 
32
32
  # Tag Generation
33
- npm run mktags ../path/to/images # Regenerate src/Tags.ts from sample images
33
+ npm run mktags ../path/to/images # Regenerate src/Tags.ts and data/TagMetadata.json (with frequency, mainstream flags, and groups) from sample images
34
34
 
35
35
  # Release Management
36
36
  npm run release # Run release process (requires proper permissions)
@@ -63,5 +63,6 @@ npm run release # Run release process (requires proper permissions)
63
63
  - Use `if (x != null)` not `if (x)` (problematic with booleans)
64
64
  - Use `??` not `||` for nullish coalescing (problematic with booleans)
65
65
  - Strict TypeScript settings enabled
66
+ - Always use standard imports at the top of the file. Never use dynamic imports like `await import("node:fs/promises").then(fs => fs.access(path))` - instead import normally: `import { access } from "node:fs/promises"`
66
67
 
67
68
  **File Patterns**: `src/*.ts` (source), `src/*.spec.ts` (tests), `src/update/*.ts` (scripts), `bin/` (binaries), `dist/` (compiled), `test/` (test images)