# Changelog

## [Unreleased]

## [7.1.3]

### Fixed
- `UrlFetcher` in Node.js can now handle redirects.
- added missing `multiSegment` in .d.ts file.

## [7.1.2]

### Fixed
- Issue #67 -> improved IPTC parsing performance.

## [7.1.0]

### Added
- Sidecar support through `exifr.sidecar()`.
- Support for url query strings and headers in Node.js polyfill of UrlFetcher.

## [7.0.0]

### Added
- `UrlFetcher` now works in Node.js too. i.e. You can use `string` URL as `file` argument in Node.js (previously only available in browser). Exifr now implements polyfill for `window.fetch()`. But it's only available in `full` bundle.

### Fixed
- Issue #59 regarding `mwg-rs:Regions`.
- Problems with parsing absolute paths in Electron, NW.JS and other Node/browser hybrid environments. (*Node's `fs` now takes precedence over brower's `fetch` when parsing absolute path argument*)

### Breaking changes
- Slight changes to XMP parsing logic. Only affects obscure cases with lists and nested `rdf:Description`. Won't affect most of the basic use cases.

## [6.3.0]

### Added

- **AVIF SUPPORT**

## [6.2.0]

### Added

- **EXIF** segment (and thus GPS) extraction from **PNG files**. Only parses the modern `eXIf` chunks and not `zTXt`
- IIQ file support

### Fixed

- `Invalid input argument for BufferView` bug when parsing XMP from TIFF file if the XMP IFD0 tag was of type string (2) instead of byte array (1)
- `Closing file descriptor N on garbage collection` when reading unknown format.

## [6.1.1]

### Fixed

- Encoding in IPTC (issue 47)

## [6.1.0]

### Fixed

- d.ts: typo; additional type for `exifr.rotation()`
- `exifr.rotation()` works correctly on latest macos safari.

## [6.0.0]

### Added

- **PNG SUPPORT** (and IHDR segment parser which implements the PNG header structure)
- IHDR dictionary
- JFIF dictionary - the keys are now in configurable dictionary instead of hardcoded into a parser.

### Fixed

- Orientation bug related to ios and webview (PR 42)
- Reading APP13 Segment not containing IPTC
- Unwrapping value of ExifImageHeight ExifImageWidth in case it is in typed array

## [5.0.6]

### Fixed

- Chunked reading of heic file, related to Issue 35

## [5.0.5]

### Changed

- Nothing new. Re-release of 5.0.4 which was accidentally released with code from 5.0.3.

## [5.0.4]

### Fixed

- Issue 35 - reading heic file if mdat box preceded meta.
- autorotation detection in firefox 77

## [5.0.3]

### Fixed

- Bug: Reading photo in chunked mode where segment header is split between chunks.
- Bug: ICC Text fields (of type 'text') are no longer missing last few characters.
- Bug: IPTC out of range error.

### Changed

- Initial work on reducing the library's filesize
- Slightly improved IPTC performance.

## [5.0.2]

### Fixed

- Updated `exifr.rotation()` with Chrome 81' new autorotation behavior. Applies to all Chromium browsers (like the new Edge).

## [5.0.1]

### Changed

- `"main"` field in package.json now points to `./dist/full.umd.js` instead of `./dist/full.umd.cjs`.

## [5.0.0]

### Changed
- package.json no longer includes `"type": "module"` for now. Tools don't support it yet and `"main"` field was already pointing to UMD (CJS). Source codes were using `.mjs` extension for a while so nothing should break, but it's a major release just in case.

### Added
- `exifr.rotation()`

## [4.3.x]

### Fixed
- `orientation()` in mini bundle (possibly more mini-bundle related bugs)
- bug: **Critical dependency: require function** related to bundling UMD with webpack
- d.ts types
- IE10 DataView related bug

### Added
- `.cjs` copy of all `legacy` builds in dist/.

## [4.3.0]

Quality-Of-Life release. Improves compatibility and ease of use with various tools and environments.

### Changed
- all ESM bundles are now available in two identical copies with different file extensions. `.mjs` and `.js` for ESM, `.cjs` and `.js` for UMD. Just pick one that works with your tooling or environment.
- Backtracking on using only `"type":"module"` in package.json as the only way to define the module as ESM.
- package.json's `"main"` points to UMD bundle `full.esm.mjs` instead of UMD `full.umd.js`.
- Added default export which wraps all named exports into single object.

## [4.2.0]

### Changed
- Simplified and improved implementation of `thumbnail()` and `thumbnailUrl()`.
- Improved typescript types. Added `HTMLImageElement` to `input`.

## [4.1.0]

### Added
- Support for IE10

### Breaking changes (for IE / `legacy` bundle)
- No need to use these polyfills anymore: `TextDecoder`, `Object.assign`, `Object.keys`, `Object.values`, `Object.fromEntries`, `Array.from`, `Array.prototype.includes`, `fetch`, `Map`, `Set`.
- `Promise` polyfill is needed now instead of `regeneratorRuntime`

## [4.0.0]

### Added
- XMP XML Parser
- XMP Extended support. To extract all XMP segments, set `options.multiSegment` or `options.xmp.multiSegment` to true.

### Changed
- `output.xmp` is no longer where the XMP segment data are stored. XMP tags are parsed, grouped by namespace and each namespace is assigned directly to `output` object, like `output.xmlns`, `output.GPano`, `output.crs` and more. This can be disabled by setting `options.xmp.parse: false`

### Fixed
- `window.BigInt` bug in webworker

## [3.0.1]

### Fixed
- Fixed types in d.ts (`String` -> `string`, `Number` -> `number`).

## [3.0.0]

### Breaking changes
#### Exports
- renamed `ExifParser` class to `Exifr`.
- renamed `thumbnailBuffer()` function to `thumbnail()`. It now also returns `Uint8Array` instead of `ArrayBuffer` in browser. Node.js version keeps returning `Buffer`.

#### Output format
- Renamed `options.image` block to `options.ifd0`.
- Renamed `options.thumbnail` block to `options.ifd1`.
- renamed & simplified behavior of `seekChunkSize` and `parseChunkSize`. See `firstChunkSize`, `firstChunkSizeBrowser`, `firstChunkSizeNode`.
- Changed EXIF & IPTC tag dictionary to match [ExifTool](https://exiftool.org/TagNames/EXIF.html). Most tag names remain the same. Some might be changed slightly. You can check out the `src/dicts/*` files for reference. For example: before `{ExposureBiasValue: 0}`, after `{ExposureCompensation: 0}`; before `{WhiteBalance: 'Auto white balance'}`, after `{WhiteBalance: 'Auto'}`

#### Options
- Renamed `output.image` block to `output.ifd0`.
- Renamed `output.thumbnail` block to `output.ifd1`.
- removed `postProcess` property and split its behavior to new properties `sanitize`, `translateKeys`, `translateValues` and `reviveValues`.
- Changed behavior of `options.wholeFile` and renamed to `options.chunked`

#### library bundles
- The library now comes in multiple bundles, with varying number of parsers & tag dictonaries. `lite` bundle is now **recommend as the default for browser** use because of its small footprint.
- Broken down parsers and tag dictionaries into multiple files. No all of them are included in `lite` or `mini` builds.
- `package.json` defined module as `"type": "module"`. All `.js` files are treated as ES Modules by Node.js.

### Added
- ICC Parser
- Older browsers support
- multiple new output builds (so users can prevent importing unused code)
- tags filtering (`pick`/`skip` options)
- `exifr.gps()` 

### Changed
- major rewrite of a whole input reader pipeline
    - implemented `BufferView` wrapper class for all forms of binary data.
    - reimplemented chunked reader
- major rewrite of a whole parser pipeline
    - broken the code into separate parser classes & files (TIFF, XMP, IPTC, ICC)
    - TIFF is no longer the main parser
    - All APP segments are now first searched in the file and then parsed
    - implemented base parser class than can be used to implement custom APP-segment parsers by user
    - exposed segment parsers
- rewrote readme

## [2.1.4] - 2019-11-10

### Changed
- udpated dependencies
- tweaked demo page

## [2.1.3] - 2019-11-10

### Added
- code coverage

## [2.1.2] - 2019-11-09

### Changed
- added project logo
- tweaked demo page UI
- moved demo page to custom domain mutiny.cz & changed links to reflect that

## [2.1.1] - 2019-09-18

### Added
- tests for IPTC
- magic comments for webpack

### Changed
- normalized old tests

## [2.1.0] - 2019-09-12

### Added
- tests for webworker

### Fixed
- webworker bug
- removed dependency on Nodes fs module
- various bugfixes

## [2.0.0] - 2019-07-05

### Breaking changes
- default export is not longer `getExif()` function. It's available as named export `parse()`along few new ones.

### Added
- thumbnail extraction
- better docs and readme

### Fixed
- `*.tif` and `*.tiff` file support (raw TIFF segments not wrapped in jpg APPn segments)
- many bugfixes, typos, stability improvements

## [1.2.0] - 2019-04-27

### Fixed
- issue #1

## [1.1.0] - 2018-09-29

### Added
- AMD module support

## [1.0.0] - 2018-08-01

### Added
- initial implementation

[Unreleased]: https://github.com/MikeKovarik/exifr/compare/7.1.3...HEAD
[7.1.3]: https://github.com/MikeKovarik/exifr/compare/v7.1.2...v7.1.3
[7.1.2]: https://github.com/MikeKovarik/exifr/compare/v7.1.0...v7.1.2
[7.1.0]: https://github.com/MikeKovarik/exifr/compare/v7.0.0...v7.1.0
[7.0.0]: https://github.com/MikeKovarik/exifr/compare/v6.3.0...v7.0.0
[6.3.0]: https://github.com/MikeKovarik/exifr/compare/v6.2.0...v6.3.0
[6.2.0]: https://github.com/MikeKovarik/exifr/compare/v6.1.1...v6.2.0
[6.1.1]: https://github.com/MikeKovarik/exifr/compare/v6.1.0...v6.1.1
[6.1.0]: https://github.com/MikeKovarik/exifr/compare/v6.0.0...v6.1.0
[6.0.0]: https://github.com/MikeKovarik/exifr/compare/v5.0.6...v6.0.0
[5.0.6]: https://github.com/MikeKovarik/exifr/compare/v5.0.5...v5.0.6
[5.0.5]: https://github.com/MikeKovarik/exifr/compare/v5.0.4...v5.0.5
[5.0.4]: https://github.com/MikeKovarik/exifr/compare/v5.0.3...v5.0.4
[5.0.3]: https://github.com/MikeKovarik/exifr/compare/v5.0.2...v5.0.3
[5.0.2]: https://github.com/MikeKovarik/exifr/compare/v5.0.1...v5.0.2
[5.0.1]: https://github.com/MikeKovarik/exifr/compare/v5.0.0...v5.0.1
[5.0.0]: https://github.com/MikeKovarik/exifr/compare/v4.3.3...v5.0.0
[4.3.x]: https://github.com/MikeKovarik/exifr/compare/v4.3.0...v4.3.3
[4.3.0]: https://github.com/MikeKovarik/exifr/compare/v4.2.0...v4.3.0
[4.2.0]: https://github.com/MikeKovarik/exifr/compare/v4.1.0...v4.2.0
[4.1.0]: https://github.com/MikeKovarik/exifr/compare/v4.0.0...v4.1.0
[4.0.0]: https://github.com/MikeKovarik/exifr/compare/v3.0.1...v4.0.0
[3.0.1]: https://github.com/MikeKovarik/exifr/compare/v3.0.0...v3.0.1
[3.0.0]: https://github.com/MikeKovarik/exifr/compare/v2.1.4...v3.0.0
[2.1.4]: https://github.com/MikeKovarik/exifr/compare/v2.1.3...v2.1.4
[2.1.3]: https://github.com/MikeKovarik/exifr/compare/v2.1.2...v2.1.3
[2.1.2]: https://github.com/MikeKovarik/exifr/compare/v2.1.1...v2.1.2
[2.1.1]: https://github.com/MikeKovarik/exifr/compare/v2.1.0...v2.1.1
[2.1.0]: https://github.com/MikeKovarik/exifr/compare/v2.0.0...v2.1.0
[2.0.0]: https://github.com/MikeKovarik/exifr/compare/v1.2.0...v2.0.0
[1.2.0]: https://github.com/MikeKovarik/exifr/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/MikeKovarik/exifr/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/MikeKovarik/exifr/releases/tag/v1.0.0