Skip to content

Releases: photostructure/exiftool-vendored.js

Release 37.0.0

Choose a tag to compare

@github-actions github-actions released this 15 Jul 19:37
Immutable release. Only release title and notes can be modified.
37.0.0
c3264df
  • 💔 BREAKING: malformed UTF-8 in ExifTool JSON output is now marked with
    Unicode replacement character U+FFFD () instead of ASCII question mark
    (?).
    For example, malformed bytes dc 4b previously surfaced as ?K
    and now surface as �K. This applies to both read() and readRaw(),
    including scalar and list values and calls that override readArgs. Valid
    Unicode and authored question marks are unchanged.

    • The original malformed string bytes are available without rereading the
      media through an optional sparse invalidUtf8Bytes sidecar. It mirrors tag
      paths, uses numeric object keys for damaged list items, stores each leaf as
      a Uint8Array, and is absent when no malformed strings were found:

      const tags = await exiftool.read(file);
      tags.City; // "�K"
      tags.invalidUtf8Bytes?.City; // Uint8Array([0xdc, 0x4b])

      exiftool-vendored does not guess a legacy charset. Consumers may decode
      only these captured bytes using camera, tag, locale, or user-specific
      evidence while retaining the U+FFFD value as a deterministic fallback.

    • Nested structures mirror the paths ExifTool returns for the selected
      struct mode. XML element text, attribute values, CDATA, opaque XML string
      values, and leaves parsed from embedded binary XML packets are supported.
      The captured bytes are the extracted value after XML parsing, not the
      original XML token. Malformed XML element and attribute names are outside
      this mechanism: value filters never receive names, and ExifTool's JSON
      output repairs or canonicalizes them before the library sees them.

    • The change affects new metadata reads only. Upgrading does not rewrite
      values that applications have already persisted. Applications that use
      extracted metadata as identifiers, facets, or tags may want to rescan or
      reindex existing files.

    • Consumers may replace ambiguous ? corruption heuristics with explicit
      U+FFFD checks where their data flow preserves the marker. Whether to
      reject, display, or retain a marked value remains application policy.

    • To restore the previous rendering, replace the marker in the string values
      you consume (it never appears in numbers, dates, or binary fields). This is
      a one-way transform — the reverse is impossible once malformed bytes have
      collapsed to ?, which is why the marker is preserved by default:

      typeof value === "string" ? value.replace(/\uFFFD/g, "?") : value;
    • Advanced callers that provide their own non-empty ExifTool
      -api Filter=... through readArgs retain ownership of the complete
      filtering pipeline. A custom filter must perform its own UTF-8 repair and
      byte capture if those behaviors are desired; invalidUtf8Bytes will be
      absent.

  • 📦 Corrected resource-cleanup documentation to distinguish normal shutdown, non-blocking using, awaited await using, and best-effort disposal timeouts.

Commits

Full Changelog: 36.1.0...37.0.0

Release 36.1.0

Choose a tag to compare

@github-actions github-actions released this 13 Jul 20:34
Immutable release. Only release title and notes can be modified.
36.1.0
36b19aa
  • ✨ Added ExifTool.editTags() for validated exact list-value additions/removals, MWG Collection additions/predicate removals, and audited scalar or flattened person-name removals without replacing unrelated metadata. See the usage examples.

Commits

Full Changelog: 36.0.0...36.1.0

Release 36.0.0

Choose a tag to compare

@github-actions github-actions released this 03 Jun 20:39
Immutable release. Only release title and notes can be modified.
36.0.0
c2189ba
  • 🏚️ Dropped Node.js 20 from the supported engines and CI matrix. Node.js 20 ("Iron") has reached end-of-life, so the minimum supported runtime is now Node.js 22 (engines.node is >=22). The CI test matrix is now Node.js 22, 24, and 26.

Commits

  • chore: update changelog for v36.0.0 and v35.21.0 releases (2028aa6)
  • chore(deps): update batch-cluster to version 18.0.0 (119cc98)
  • chore(deps): update batch-cluster to version 18.0.0 (4ac43be)
  • chore: update npm-run-all2 to version 9.0.1 and tmp to version 0.2.7 (02e961c)
  • chore/breaking: update Node.js version to 22 in GHA workflows and minimum supported engine in package.json (ec0c4cb)

Release 35.21.0

Choose a tag to compare

@github-actions github-actions released this 28 May 19:35
Immutable release. Only release title and notes can be modified.
35.21.0
6cc8b4f
  • chore: update exiftool-vendored.pl to version 13.59.0 (50ce9c6)
  • chore(deps): update dependencies (65e58d3)

Release 35.20.0

Choose a tag to compare

@github-actions github-actions released this 08 May 05:05
Immutable release. Only release title and notes can be modified.
35.20.0
fc8b375
  • docs(CHANGELOG): add entry for Node.js 26 in CI test matrix (44cd3d9)
  • chore: add Node.js version 26 to the build matrix (22ea7d1)
  • docs(CHANGELOG): update to version 35.20.0 with ExifTool 13.58 and restore support for ^ modifier in tag names (37d27e2)
  • chore: update dependencies to latest versions (7ced8d9)
  • chore: update actions/setup-node to v6.4.0 in workflows (3b6b67b)
  • fix: allow ^ write-even-if-empty modifier in tag names (05e6920)
  • docs(CHANGELOG): update version to v35.19.0 instead of 35.18.1 (9d95f01)

Release 35.19.0

Choose a tag to compare

@github-actions github-actions released this 25 Apr 05:09
Immutable release. Only release title and notes can be modified.
35.19.0
6ec9f9f
  • 🔥 Security: argument injection hardening GHSA-cw26-7653-2rp5. ExifTool runs in -stay_open True -@ - mode, where arguments are read from stdin one per line. Several caller-supplied strings were previously interpolated into ExifTool arguments without rejecting line delimiters, so a \n inside a tag name or filename could split one argument into many. Two layers of defense have been added:
    • Per-site validation. A new validateTagName helper rejects tag-name strings that fall outside the ExifTool tag grammar (letters, digits, :, -, _, and the modifiers *, ?, +, #). Applied to write tag keys, deleteAllTags({retain}), read({numericTags}), and the binary-extraction tag names. imageHashType is now also validated against an ImageHashTypes allowlist at runtime.
    • Defense-in-depth at the command renderer. ExifToolTask.renderCommand now rejects any argument containing \r, \n, or \0 before transmission. This covers filename/path arguments, including readRaw() and rewriteAllTags(), raw readArgs / writeArgs, option values, and future newline-delimited interpolation sites.
    • Tag values passed to write() were already whitespace-encoded and were not vulnerable.
    • Reported by Hank Tam through coordinated disclosure.
  • ✨ Added ImageHashTypes runtime enum and ImageHashType type export, for callers that need runtime-checked construction of the imageHashType option.

Commits

  • docs(CHANGELOG): update for v35.18.1 - enhance security with argument injection hardening and add ImageHashTypes enum (63dc9b8)
  • chore: add .codex to .gitignore (a977b67)
  • chore: add "retriable" to cSpell words list (3b132a8)
  • test(ExifTool): cover filename argument injection guards (6b7d249)
  • docs(ExifTool): document argument validation boundaries (4015fca)
  • fix: harden ExifTool argument construction against injection (5d5b155)
  • fix: add ImageHashTypes enum and update imageHashType validation (8f999f6)
  • test: add check for inherited Object property names in StrEnum (26f7c30)
  • chore: update dependencies for globals, prettier, typedoc, and typescript (c77662e)
  • chore: update upload-pages-artifact action to version 5.0.0 (ab63cc4)
  • chore(fmt) (21e5ab5)

Release 35.18.0

Choose a tag to compare

@github-actions github-actions released this 17 Apr 17:04
Immutable release. Only release title and notes can be modified.
35.18.0
7930dd5
  • 🌱 Upgraded ExifTool to version 13.57.
  • 🐞 Fixes an ExifTool 13.56 regression (shipped in v35.17.0) where XMP list-valued tags (dc:subject, HierarchicalSubject, Keywords) read from sidecar files were collapsed to just the last <rdf:li> as a scalar string when -api struct=1 was in effect. Users on v35.17.0 who read XMP sidecars should upgrade.

Commits

  • chore: update changelog for ExifTool version 13.57 and fix regression in v35.17.0 (cf488b4)
  • chore: update @types/node and exiftool-vendored dependencies to version 25.6.0 and 13.57.0 respectively (7a3c307)
  • chore: update create-pull-request action to version 8.1.1 (bcd562e)

Release 35.17.0

Choose a tag to compare

@github-actions github-actions released this 15 Apr 19:42
Immutable release. Only release title and notes can be modified.
35.17.0
f671fa3
  • chore(mktags): rebuild (bd0122e)
  • chore: update optional dependencies for exiftool-vendored to version 13.56.0 (d6f9bbd)

Release 35.16.0

Choose a tag to compare

@github-actions github-actions released this 12 Apr 18:41
Immutable release. Only release title and notes can be modified.
35.16.0
3929402
  • chore(changelog): add entry for v35.16.0 - upgraded ExifTool to version 13.55 (d805083)
  • chore: update dependencies and improve geolocation tests (bafe442)
  • chore(workflows): update actions in build and docs workflows to latest versions (942dca2)

Release 35.15.1

Choose a tag to compare

@github-actions github-actions released this 22 Mar 21:19
Immutable release. Only release title and notes can be modified.
35.15.1
8874bba
  • chore(release) (713a5a1)
  • chore(changelog): update version to v35.15.0 (e535d00)
  • feat(time): parse POSIX locale datestamps. Add TZA to fixed UTC offsets lookups. (30df449)
  • chore(skill): add replan skill for iterative design and critique process (ba76286)