exiftool-vendored 29.3.0 → 30.1.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 +50 -0
- package/CLAUDE.md +67 -0
- package/README.md +30 -1
- package/RELEASE.md +29 -34
- package/dist/Array.d.ts +2 -2
- package/dist/Array.js.map +1 -1
- package/dist/BinaryToBufferTask.js +1 -1
- package/dist/BinaryToBufferTask.js.map +1 -1
- package/dist/CoordinateParser.js +9 -0
- package/dist/CoordinateParser.js.map +1 -1
- package/dist/DateTime.js +1 -1
- package/dist/DateTime.js.map +1 -1
- package/dist/ExifDate.d.ts +47 -7
- package/dist/ExifDate.js +60 -1
- package/dist/ExifDate.js.map +1 -1
- package/dist/ExifDateTime.js +5 -1
- package/dist/ExifDateTime.js.map +1 -1
- package/dist/ExifTool.d.ts +9 -23
- package/dist/ExifTool.js +16 -1
- package/dist/ExifTool.js.map +1 -1
- package/dist/ExifToolVendoredTags.d.ts +15 -6
- package/dist/ExifToolVendoredTags.js +2 -15
- package/dist/ExifToolVendoredTags.js.map +1 -1
- package/dist/ExiftoolPath.js +5 -5
- package/dist/ExiftoolPath.js.map +1 -1
- package/dist/GPS.d.ts +3 -1
- package/dist/GPS.js +4 -15
- package/dist/GPS.js.map +1 -1
- package/dist/GeolocationTags.d.ts +4 -6
- package/dist/GeolocationTags.js +4 -22
- package/dist/GeolocationTags.js.map +1 -1
- package/dist/ICCProfileTags.d.ts +3 -0
- package/dist/ICCProfileTags.js +3 -0
- package/dist/ICCProfileTags.js.map +1 -1
- package/dist/IPTCApplicationRecordTags.d.ts +3 -0
- package/dist/IPTCApplicationRecordTags.js +3 -0
- package/dist/IPTCApplicationRecordTags.js.map +1 -1
- package/dist/ImageDataHashTag.d.ts +3 -0
- package/dist/ImageDataHashTag.js +3 -0
- package/dist/ImageDataHashTag.js.map +1 -1
- package/dist/JSON.d.ts +4 -0
- package/dist/JSON.js +7 -2
- package/dist/JSON.js.map +1 -1
- package/dist/MWGTags.d.ts +5 -0
- package/dist/MWGTags.js +4 -0
- package/dist/MWGTags.js.map +1 -1
- package/dist/Maybe.d.ts +4 -3
- package/dist/Maybe.js +1 -1
- package/dist/Maybe.js.map +1 -1
- package/dist/Object.d.ts +8 -2
- package/dist/Object.js +13 -13
- package/dist/Object.js.map +1 -1
- package/dist/RawTags.d.ts +1 -4
- package/dist/ReadTask.js +12 -5
- package/dist/ReadTask.js.map +1 -1
- package/dist/StrEnum.d.ts +35 -0
- package/dist/StrEnum.js +75 -0
- package/dist/StrEnum.js.map +1 -0
- package/dist/String.js +1 -6
- package/dist/String.js.map +1 -1
- package/dist/Tags.d.ts +223 -181
- package/dist/Tags.js +31 -0
- package/dist/Tags.js.map +1 -1
- package/dist/TimeParsing.js +1 -1
- package/dist/TimeParsing.js.map +1 -1
- package/dist/Timezones.d.ts +11 -0
- package/dist/Timezones.js +54 -23
- package/dist/Timezones.js.map +1 -1
- package/dist/WriteTags.d.ts +18 -2
- package/eslint.config.mjs +37 -18
- package/package.json +31 -18
- package/dist/ExifToolTags.d.ts +0 -7
- package/dist/ExifToolTags.js +0 -19
- package/dist/ExifToolTags.js.map +0 -1
- package/dist/FileTags.d.ts +0 -7
- package/dist/FileTags.js +0 -41
- package/dist/FileTags.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -25,6 +25,56 @@ vendored versions of ExifTool match the version that they vendor.
|
|
|
25
25
|
|
|
26
26
|
## Version history
|
|
27
27
|
|
|
28
|
+
### v30.2.0
|
|
29
|
+
|
|
30
|
+
- ✨ Added **partial date support** for `ExifDate` class. XMP date tags (like `XMP:CreateDate`, `XMP:MetadataDate`) now support:
|
|
31
|
+
|
|
32
|
+
- **Year-only dates**: `1980` (numeric) or `"1980"` (string)
|
|
33
|
+
- **Year-month dates**: `"1980:08"` (EXIF format) or `"1980-08"` (ISO format)
|
|
34
|
+
- **Full dates**: `"1980:08:13"` (unchanged)
|
|
35
|
+
|
|
36
|
+
- ✨ Enhanced `ExifDate` with type-safe predicates:
|
|
37
|
+
|
|
38
|
+
- `isYearOnly()`: Returns `true` for year-only dates with type narrowing
|
|
39
|
+
- `isYearMonth()`: Returns `true` for year-month dates with type narrowing
|
|
40
|
+
- `isFullDate()`: Returns `true` for complete dates with type narrowing
|
|
41
|
+
- `isPartial()`: Returns `true` for year-only or year-month dates
|
|
42
|
+
|
|
43
|
+
- ✨ Added compositional TypeScript interfaces:
|
|
44
|
+
|
|
45
|
+
- `ExifDateYearOnly`: `{year: number}`
|
|
46
|
+
- `ExifDateYearMonth extends ExifDateYearOnly`: `{year: number, month: number}`
|
|
47
|
+
- `ExifDateFull extends ExifDateYearMonth`: `{year: number, month: number, day: number}`
|
|
48
|
+
|
|
49
|
+
- ✨ Enhanced `WriteTags` interface with group-prefixed tag support:
|
|
50
|
+
|
|
51
|
+
- `"XMP:CreateDate"`, `"XMP:MetadataDate"`, etc. accept partial dates
|
|
52
|
+
- `"EXIF:CreateDate"`, etc. require full dates (type-safe distinction)
|
|
53
|
+
|
|
54
|
+
- 📦 Added comprehensive test coverage (47 new tests) for partial date functionality
|
|
55
|
+
|
|
56
|
+
- 📦 Upgrade to batch-cluster [v14.0.0](https://github.com/photostructure/batch-cluster.js/releases/tag/v14.0.0) which removes the requirement for `procps` on most linux distributions.
|
|
57
|
+
|
|
58
|
+
### v30.1.0
|
|
59
|
+
|
|
60
|
+
- 🌱 Upgraded ExifTool to version [13.30](https://exiftool.org/history.html#13.30).
|
|
61
|
+
|
|
62
|
+
- 🐞 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.
|
|
63
|
+
|
|
64
|
+
- 📦 Docs are now automatically updated via [GitHub Actions](https://github.com/photostructure/exiftool-vendored.js/actions/workflows/docs.yml)
|
|
65
|
+
|
|
66
|
+
### v30.0.0
|
|
67
|
+
|
|
68
|
+
- 💔 Dropped support for Node v18, whose End-of-Life was 2025-04-30.
|
|
69
|
+
|
|
70
|
+
- 🌱 Upgraded ExifTool to version [13.29](https://exiftool.org/history.html#13.29).
|
|
71
|
+
|
|
72
|
+
- ✨ Added new `TagNames` string enumeration with the most popular 2,500(ish) tag field names that is automatically updated by `mktags`. As a reminder: the `Tags` interface _is not comprehensive_. If we're missing any of your favorite fields, open an issue with an attached example media file and I look into promoting it to a "guaranteed" status (like we've done with several hundred fields already).
|
|
73
|
+
|
|
74
|
+
- 📦 Renamed the `.tz` field in `Tags` to `.zone`. Note that for the next few releases, `.tz` will be kept, but marked as deprecated. After doing a bit of research, it turns out the correct term for identifiers like `America/Los_Angeles` within the IANA Time Zone Database is "zone." The "tz" term commonly refers to the entire Time Zone Database, or "tz database" (also called tzdata or zoneinfo).
|
|
75
|
+
|
|
76
|
+
- ✨ Updating to new versions of ExifTool is now fully automated via GitHub Actions.
|
|
77
|
+
|
|
28
78
|
### v29.3.0
|
|
29
79
|
|
|
30
80
|
- 🌱 Upgraded ExifTool to version [13.26](https://exiftool.org/history.html#13.26).
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This is exiftool-vendored.js, a Node.js library that provides cross-platform access to ExifTool for reading and writing metadata in photos and videos. The library includes comprehensive TypeScript type definitions for metadata tags and is used by PhotoStructure and 500+ other projects.
|
|
8
|
+
|
|
9
|
+
## Key Commands
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Development
|
|
13
|
+
npm install # Install dependencies
|
|
14
|
+
npm run compile # Compile TypeScript to JavaScript
|
|
15
|
+
npm run compile:watch # Watch mode for development
|
|
16
|
+
npm run clean # Clean build artifacts
|
|
17
|
+
npm run u # Update dependencies and install
|
|
18
|
+
|
|
19
|
+
# Linting & Formatting
|
|
20
|
+
npm run lint # Run ESLint with TypeScript configuration
|
|
21
|
+
npm run fmt # Format all TypeScript and other files with Prettier
|
|
22
|
+
|
|
23
|
+
# Testing (requires compilation first)
|
|
24
|
+
npm test # Run all tests
|
|
25
|
+
npm run compile && npx mocha dist/ExifTool.spec.js # Run specific test file
|
|
26
|
+
npm run compile && npx mocha 'dist/*.spec.js' --grep "pattern" # Run tests matching pattern
|
|
27
|
+
|
|
28
|
+
# Documentation
|
|
29
|
+
npm run docs # Generate TypeDoc docs and serve at http://localhost:3000
|
|
30
|
+
npm run docs:1 # Build documentation only (without serving)
|
|
31
|
+
|
|
32
|
+
# Tag Generation
|
|
33
|
+
npm run mktags ../path/to/images # Regenerate src/Tags.ts from sample images
|
|
34
|
+
|
|
35
|
+
# Release Management
|
|
36
|
+
npm run release # Run release process (requires proper permissions)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Note**: Documentation is automatically built and deployed to GitHub Pages on every push to main branch via `.github/workflows/docs.yml`.
|
|
40
|
+
|
|
41
|
+
## Architecture & Key Concepts
|
|
42
|
+
|
|
43
|
+
**Core Components**: `ExifTool` class (`src/ExifTool.ts`) wraps ExifTool process management using batch-cluster. `Tags` interface (`src/Tags.ts`) contains ~2000 auto-generated metadata fields with popularity ratings. Custom date/time classes (`ExifDate`, `ExifTime`, `ExifDateTime`) handle timezone complexities. Task system includes `ReadTask`, `WriteTask`, `BinaryExtractionTask`, and `RewriteAllTagsTask`. Platform-specific binaries via optional dependencies.
|
|
44
|
+
|
|
45
|
+
**Process Management**: Uses [batch-cluster](https://photostructure.github.io/batch-cluster.js/) with configurable `maxProcs`, `minDelayBetweenSpawnMillis`, and `streamFlushMillis`. Singleton `exiftool` instance configured conservatively.
|
|
46
|
+
|
|
47
|
+
**Timezone Handling**: Sophisticated heuristics using explicit timezone metadata, GPS location inference, UTC timestamp deltas, and daylight saving transitions.
|
|
48
|
+
|
|
49
|
+
**Tag Generation**: `mktags.ts` analyzes sample images to generate TypeScript interfaces with ~2000 most common tags and popularity ratings.
|
|
50
|
+
|
|
51
|
+
**Testing**: Mocha with Chai assertions, unit/integration tests, test images in `test/` directory including non-English filenames.
|
|
52
|
+
|
|
53
|
+
## Important Notes
|
|
54
|
+
|
|
55
|
+
- Always run `npm run compile` before testing
|
|
56
|
+
- End singleton `exiftool` instance with `.end()` to clean up child processes
|
|
57
|
+
- Tag interfaces not comprehensive - less common tags may exist in returned objects
|
|
58
|
+
- Uses batch processing with automatic process pool management
|
|
59
|
+
- TypeScript union type limits require careful tag selection
|
|
60
|
+
|
|
61
|
+
## TypeScript Hygiene
|
|
62
|
+
|
|
63
|
+
- Use `if (x != null)` not `if (x)` (problematic with booleans)
|
|
64
|
+
- Use `??` not `||` for nullish coalescing (problematic with booleans)
|
|
65
|
+
- Strict TypeScript settings enabled
|
|
66
|
+
|
|
67
|
+
**File Patterns**: `src/*.ts` (source), `src/*.spec.ts` (tests), `src/update/*.ts` (scripts), `bin/` (binaries), `dist/` (compiled), `test/` (test images)
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
1. **Best-of-class cross-platform performance and reliability**.
|
|
13
13
|
|
|
14
|
-
This library enables [PhotoStructure](https://photostructure.com) and [
|
|
14
|
+
This library enables [PhotoStructure](https://photostructure.com) and [over 1,000](https://github.com/photostructure/exiftool-vendored.js/network/dependents?package_id=UGFja2FnZS0xNjYxNjY2MQ%3D%3D) other projects to read and write metadata in photos and videos.
|
|
15
15
|
|
|
16
16
|
Expect [an order of magnitude faster performance](#performance) than other Node.js ExifTool modules.
|
|
17
17
|
|
|
@@ -299,6 +299,35 @@ exiftool.write("path/to/file.jpg", { UserComment: null });
|
|
|
299
299
|
|
|
300
300
|
The above example removes any value associated with the `UserComment` tag.
|
|
301
301
|
|
|
302
|
+
### Partial Date Support
|
|
303
|
+
|
|
304
|
+
**NEW in v30.2.0:** XMP date tags now support partial dates (year-only or year-month):
|
|
305
|
+
|
|
306
|
+
```js
|
|
307
|
+
// Year-only dates
|
|
308
|
+
exiftool.write("path/to/file.jpg", { "XMP:CreateDate": 1980 });
|
|
309
|
+
// or
|
|
310
|
+
exiftool.write("path/to/file.jpg", {
|
|
311
|
+
"XMP:CreateDate": ExifDate.fromYear(1980),
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
// Year-month dates (EXIF format)
|
|
315
|
+
exiftool.write("path/to/file.jpg", { "XMP:CreateDate": "1980:08" });
|
|
316
|
+
// Year-month dates (ISO format)
|
|
317
|
+
exiftool.write("path/to/file.jpg", { "XMP:CreateDate": "1980-08" });
|
|
318
|
+
// or
|
|
319
|
+
exiftool.write("path/to/file.jpg", {
|
|
320
|
+
"XMP:CreateDate": ExifDate.fromYearMonth("1980-08"),
|
|
321
|
+
});
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**⚠️ IMPORTANT:** Partial dates are only supported for [XMP
|
|
325
|
+
tags](https://exiftool.org/TagNames/XMP.html) (like `XMP:CreateDate`,
|
|
326
|
+
`XMP:MetadataDate`). [EXIF tags](https://exiftool.org/TagNames/EXIF.html), like
|
|
327
|
+
`EXIF:CreateDate`, require **complete** (year, month, and day) dates. Always use
|
|
328
|
+
the group-prefixed tag names (e.g., `"XMP:CreateDate"`) when working with
|
|
329
|
+
partial dates.
|
|
330
|
+
|
|
302
331
|
### Always Beware: Timezones
|
|
303
332
|
|
|
304
333
|
If you edit a timestamp tag, realize that the difference between the
|
package/RELEASE.md
CHANGED
|
@@ -1,36 +1,31 @@
|
|
|
1
1
|
# Releasing new versions of `exiftool-vendored`
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
1. `npm run test`
|
|
33
|
-
1. Verify diffs are reasonable, `git commit` and `git push`
|
|
34
|
-
1. Verify [](https://github.com/photostructure/exiftool-vendored.js/actions/workflows/node.js.yml)
|
|
35
|
-
1. Update the [CHANGELOG.md](https://github.com/photostructure/exiftool-vendored.js/blob/main/CHANGELOG.md)
|
|
36
|
-
1. `npx release-it --only-version`
|
|
3
|
+
As of May 2025, the Windows
|
|
4
|
+
[exiftool-vendored.exe](https://github.com/photostructure/exiftool-vendored.exe)
|
|
5
|
+
and POSIX
|
|
6
|
+
[exiftool-vendored.pl](https://github.com/photostructure/exiftool-vendored.pl)
|
|
7
|
+
vendored versions of ExifTool are updated and released automatically.
|
|
8
|
+
|
|
9
|
+
## Automated Dependency Updates
|
|
10
|
+
|
|
11
|
+
A GitHub Actions workflow automatically checks for dependency updates (including ExifTool packages) periodically and creates pull requests when updates are available. The workflow:
|
|
12
|
+
|
|
13
|
+
- Updates all dependencies using `npm-check-updates`
|
|
14
|
+
- Creates a pull request with signed commits
|
|
15
|
+
- Includes a detailed diff of changes
|
|
16
|
+
- Allows manual approval and merging
|
|
17
|
+
- Can also be triggered manually via the Actions tab
|
|
18
|
+
|
|
19
|
+
## Manual Release Process
|
|
20
|
+
|
|
21
|
+
1. `git clone` this repo,
|
|
22
|
+
1. `npm install`
|
|
23
|
+
1. `npm run u` # should be a no-op if automated updates are working
|
|
24
|
+
1. `npm run mktags ../test-images` # < assumes `../test-images` has the full ExifTool sample image suite
|
|
25
|
+
1. `npm run fmt && npm run lint && npm run docs` (look for lint or documentation generation issues)
|
|
26
|
+
1. `npm run test`
|
|
27
|
+
1. Verify diffs are reasonable, `git commit` and `git push`
|
|
28
|
+
1. Verify [](https://github.com/photostructure/exiftool-vendored.js/actions/workflows/node.js.yml)
|
|
29
|
+
1. Update the [CHANGELOG.md](https://github.com/photostructure/exiftool-vendored.js/blob/main/CHANGELOG.md)
|
|
30
|
+
1. Run the [release action on GitHub](https://github.com/photostructure/exiftool-vendored.js/actions/workflows/release.yml)
|
|
31
|
+
1. Copy the relevant CHANGELOG entries into the new GitHub Release. [Here's an example](https://github.com/photostructure/exiftool-vendored.js/releases/tag/30.0.0).
|
package/dist/Array.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Maybe,
|
|
1
|
+
import { Maybe, Nullable } from "./Maybe";
|
|
2
2
|
export declare function isIterable(obj: unknown): obj is Iterable<unknown>;
|
|
3
3
|
export declare function ifArray<T = unknown>(arr: T[] | unknown): Maybe<T[]>;
|
|
4
4
|
export declare function toArray<T>(arr: undefined | null | T[] | T | Iterable<T>): T[];
|
|
5
|
-
export declare function compact<T>(array:
|
|
5
|
+
export declare function compact<T>(array: Nullable<T>[]): T[];
|
|
6
6
|
/**
|
|
7
7
|
* Remove all elements from the given array that return false from the given
|
|
8
8
|
* predicate `filter`.
|
package/dist/Array.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Array.js","sourceRoot":"","sources":["../src/Array.ts"],"names":[],"mappings":";;AAIA,gCAEC;AAED,0BAEC;AAED,0BAUC;AAED,0BAEC;AAMD,sCAUC;AAED,oBAKC;AAGD,0CAOC;AAWD,wBAYC;AAwBD,0BAcC;AAvHD,qCAAoC;AACpC,qCAAoC;AAEpC,SAAgB,UAAU,CAAC,GAAY;IACrC,OAAO,CAAC,IAAA,iBAAQ,EAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzE,CAAC;AAED,SAAgB,OAAO,CAAc,GAAkB;IACrD,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED,SAAgB,OAAO,CAAI,GAA6C;IACtE,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,2BAA2B;QACnD,CAAC,CAAE,GAAW;QACd,CAAC,CAAC,GAAG,IAAI,IAAI;YACX,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAA,iBAAQ,EAAC,GAAG,CAAC,CAAC,+CAA+C;gBAC7D,CAAC,CAAC,CAAC,GAAQ,CAAC;gBACZ,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;oBACf,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;oBACjB,CAAC,CAAC,CAAC,GAAQ,CAAC,CAAC;AACvB,CAAC;AAED,SAAgB,OAAO,CAAI,
|
|
1
|
+
{"version":3,"file":"Array.js","sourceRoot":"","sources":["../src/Array.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,7 +55,7 @@ class BinaryToBufferTask extends ExifToolTask_1.ExifToolTask {
|
|
|
55
55
|
exports.BinaryToBufferTask = BinaryToBufferTask;
|
|
56
56
|
const B64Prefix = "base64:";
|
|
57
57
|
function decode(data) {
|
|
58
|
-
return
|
|
58
|
+
return !data?.startsWith(B64Prefix)
|
|
59
59
|
? undefined
|
|
60
60
|
: Buffer.from(data.substring(B64Prefix.length), "base64");
|
|
61
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BinaryToBufferTask.js","sourceRoot":"","sources":["../src/BinaryToBufferTask.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA6B;AAC7B,iDAAmE;AACnE,+DAAgE;AAEhE,qCAAoC;AAEpC;;;GAGG;AACH,MAAa,kBAAmB,SAAQ,2BAA4B;IAEvD;IADX,YACW,OAAe,EACxB,IAAc,EACd,OAA6B;QAE7B,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAJZ,YAAO,GAAP,OAAO,CAAQ;IAK1B,CAAC;IAED,MAAM,CAAC,GAAG,CACR,OAAe,EACf,MAAc,EACd,OAA6B;QAE7B,sEAAsE;QACtE,wCAAwC;QACxC,MAAM,IAAI,GAAG,CAAC,GAAG,6CAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAChC,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,GAAW;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAClC,iCAAiC;YACjC,CAAC;gBACC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBACzC,IAAI,MAAM,IAAI,IAAI;oBAAE,OAAO,MAAM,CAAC;YACpC,CAAC,CAAC,+CAA+C;YACjD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;oBACnD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,MAAM,IAAI,IAAI;wBAAE,OAAO,MAAM,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,GAAG,KAAK,IAAA,iBAAQ,EAAC,IAAI,CAAC;gBACpB,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;gBACjB,CAAC,CAAC,MAAM,YAAY,KAAK;oBACvB,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC;IACvD,CAAC;CACF;AA5CD,gDA4CC;AAED,MAAM,SAAS,GAAG,SAAS,CAAC;AAE5B,SAAS,MAAM,CAAC,IAAmB;IACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"BinaryToBufferTask.js","sourceRoot":"","sources":["../src/BinaryToBufferTask.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA6B;AAC7B,iDAAmE;AACnE,+DAAgE;AAEhE,qCAAoC;AAEpC;;;GAGG;AACH,MAAa,kBAAmB,SAAQ,2BAA4B;IAEvD;IADX,YACW,OAAe,EACxB,IAAc,EACd,OAA6B;QAE7B,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAJZ,YAAO,GAAP,OAAO,CAAQ;IAK1B,CAAC;IAED,MAAM,CAAC,GAAG,CACR,OAAe,EACf,MAAc,EACd,OAA6B;QAE7B,sEAAsE;QACtE,wCAAwC;QACxC,MAAM,IAAI,GAAG,CAAC,GAAG,6CAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAChC,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,GAAW;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAClC,iCAAiC;YACjC,CAAC;gBACC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBACzC,IAAI,MAAM,IAAI,IAAI;oBAAE,OAAO,MAAM,CAAC;YACpC,CAAC,CAAC,+CAA+C;YACjD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;oBACnD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,MAAM,IAAI,IAAI;wBAAE,OAAO,MAAM,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,GAAG,KAAK,IAAA,iBAAQ,EAAC,IAAI,CAAC;gBACpB,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;gBACjB,CAAC,CAAC,MAAM,YAAY,KAAK;oBACvB,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC;IACvD,CAAC;CACF;AA5CD,gDA4CC;AAED,MAAM,SAAS,GAAG,SAAS,CAAC;AAE5B,SAAS,MAAM,CAAC,IAAmB;IACjC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC;QACjC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/CoordinateParser.js
CHANGED
|
@@ -164,10 +164,16 @@ function parseCoordinate(input, expectRemainders = false) {
|
|
|
164
164
|
}
|
|
165
165
|
const { degrees: degreesStr, minutes: minutesStr, seconds: secondsStr, direction: directionStr, remainder, } = match.groups;
|
|
166
166
|
const direction = directionStr?.toUpperCase();
|
|
167
|
+
if (degreesStr == null) {
|
|
168
|
+
throw new CoordinateParseError("Missing degrees in coordinate");
|
|
169
|
+
}
|
|
167
170
|
const degrees = parseFloat(degreesStr);
|
|
168
171
|
let minutes;
|
|
169
172
|
let seconds;
|
|
170
173
|
if (format === "DMS") {
|
|
174
|
+
if (minutesStr == null || secondsStr == null) {
|
|
175
|
+
throw new CoordinateParseError("Missing minutes or seconds in DMS coordinate");
|
|
176
|
+
}
|
|
171
177
|
minutes = parseInt(minutesStr, 10);
|
|
172
178
|
seconds = parseFloat(secondsStr);
|
|
173
179
|
if (minutes >= 60) {
|
|
@@ -178,6 +184,9 @@ function parseCoordinate(input, expectRemainders = false) {
|
|
|
178
184
|
}
|
|
179
185
|
}
|
|
180
186
|
else if (format === "DM") {
|
|
187
|
+
if (minutesStr == null) {
|
|
188
|
+
throw new CoordinateParseError("Missing minutes in DM coordinate");
|
|
189
|
+
}
|
|
181
190
|
minutes = parseFloat(minutesStr);
|
|
182
191
|
if (minutes >= 60) {
|
|
183
192
|
throw new CoordinateParseError("Minutes must be between 0 and 59.999...");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CoordinateParser.js","sourceRoot":"","sources":["../src/CoordinateParser.ts"],"names":[],"mappings":";;AA0CA,4CAgDC;AA0BD,wDAeC;AAWD,
|
|
1
|
+
{"version":3,"file":"CoordinateParser.js","sourceRoot":"","sources":["../src/CoordinateParser.ts"],"names":[],"mappings":"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"}
|
package/dist/DateTime.js
CHANGED
|
@@ -11,7 +11,7 @@ const ExifDate_1 = require("./ExifDate");
|
|
|
11
11
|
const ExifDateTime_1 = require("./ExifDateTime");
|
|
12
12
|
const ExifTime_1 = require("./ExifTime");
|
|
13
13
|
function validDateTime(dt) {
|
|
14
|
-
return dt
|
|
14
|
+
return dt?.isValid === true;
|
|
15
15
|
}
|
|
16
16
|
exports.SecondMs = 1000;
|
|
17
17
|
exports.MinuteMs = 60 * exports.SecondMs;
|
package/dist/DateTime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateTime.js","sourceRoot":"","sources":["../src/DateTime.ts"],"names":[],"mappings":";;;AAMA,sCAEC;AASD,oCAOC;AAED,wCASC;AAED,oCAMC;AAED,kBAOC;AApDD,iCAAiC;AACjC,yCAAsC;AACtC,iDAA8C;AAC9C,yCAAsC;AAGtC,SAAgB,aAAa,CAAC,EAAmB;IAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"DateTime.js","sourceRoot":"","sources":["../src/DateTime.ts"],"names":[],"mappings":";;;AAMA,sCAEC;AASD,oCAOC;AAED,wCASC;AAED,oCAMC;AAED,kBAOC;AApDD,iCAAiC;AACjC,yCAAsC;AACtC,iDAA8C;AAC9C,yCAAsC;AAGtC,SAAgB,aAAa,CAAC,EAAmB;IAC/C,OAAO,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;AAC9B,CAAC;AAEY,QAAA,QAAQ,GAAG,IAAI,CAAC;AAChB,QAAA,QAAQ,GAAG,EAAE,GAAG,gBAAQ,CAAC;AACzB,QAAA,MAAM,GAAG,EAAE,GAAG,gBAAQ,CAAC;AACvB,QAAA,KAAK,GAAG,EAAE,GAAG,cAAM,CAAC;AAIjC,SAAgB,YAAY,CAAC,CAAU;IACrC,OAAO,CACL,CAAC,YAAY,2BAAY;QACzB,CAAC,YAAY,mBAAQ;QACrB,CAAC,YAAY,mBAAQ;QACrB,gBAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CACvB,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAC5B,CAAW,EACX,IAAiE;IAEjE,OAAO,CAAC,CAAC,QAAQ,CACf,kBAAkB;QAChB,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,CAAC,IAAI,EAAE,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAC9C,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAAC,CAAa;IACxC,IAAI,gBAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAgB,GAAG,CACjB,CAAW,EACX,IAAwC;IAExC,OAAO,CAAC,CAAC,QAAQ,CACf,UAAU,GAAG,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAChE,CAAC;AACJ,CAAC"}
|
package/dist/ExifDate.d.ts
CHANGED
|
@@ -1,23 +1,47 @@
|
|
|
1
1
|
import { DateTime } from "luxon";
|
|
2
2
|
import { Maybe } from "./Maybe";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Base type for year-only date
|
|
5
5
|
*/
|
|
6
|
-
export
|
|
6
|
+
export interface ExifDateYearOnly {
|
|
7
7
|
readonly year: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Type for year-month date (extends year-only)
|
|
11
|
+
*/
|
|
12
|
+
export interface ExifDateYearMonth extends ExifDateYearOnly {
|
|
8
13
|
readonly month: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Type for full date (extends year-month)
|
|
17
|
+
*/
|
|
18
|
+
export interface ExifDateFull extends ExifDateYearMonth {
|
|
9
19
|
readonly day: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Type for partial ExifDate (year-only or year-month)
|
|
23
|
+
*/
|
|
24
|
+
export type ExifDatePartial = ExifDateYearOnly | ExifDateYearMonth;
|
|
25
|
+
/**
|
|
26
|
+
* Encodes an ExifDate
|
|
27
|
+
*/
|
|
28
|
+
export declare class ExifDate {
|
|
29
|
+
readonly year: number;
|
|
30
|
+
readonly month?: number | undefined;
|
|
31
|
+
readonly day?: number | undefined;
|
|
10
32
|
readonly rawValue?: string | undefined;
|
|
11
|
-
static from(exifOrIso: string): Maybe<ExifDate>;
|
|
33
|
+
static from(exifOrIso: string | number): Maybe<ExifDate>;
|
|
12
34
|
static fromISO(text: string): Maybe<ExifDate>;
|
|
13
35
|
private static fromPatterns;
|
|
14
36
|
static fromExifStrict(text: string): Maybe<ExifDate>;
|
|
37
|
+
static fromYearMonth(text: string | number): Maybe<ExifDate>;
|
|
38
|
+
static fromYear(yearValue: string | number): Maybe<ExifDate>;
|
|
15
39
|
static fromExifLoose(text: string): Maybe<ExifDate>;
|
|
16
40
|
static fromEXIF(text: string): Maybe<ExifDate>;
|
|
17
41
|
static fromDateTime(dt: DateTime, rawValue?: string): Maybe<ExifDate>;
|
|
18
42
|
constructor(year: number, // full year (probably 2019-ish, but maybe Japanese 30-ish). See https://ericasadun.com/2018/12/25/iso-8601-yyyy-yyyy-and-why-your-year-may-be-wrong/
|
|
19
|
-
month
|
|
20
|
-
day
|
|
43
|
+
month?: number | undefined, // 1-12, (no crazy 0-11 nonsense from Date!)
|
|
44
|
+
day?: number | undefined, // 1-31
|
|
21
45
|
rawValue?: string | undefined);
|
|
22
46
|
toDate(): Date;
|
|
23
47
|
/**
|
|
@@ -32,9 +56,25 @@ export declare class ExifDate {
|
|
|
32
56
|
toJSON(): {
|
|
33
57
|
_ctor: string;
|
|
34
58
|
year: number;
|
|
35
|
-
month: number;
|
|
36
|
-
day: number;
|
|
59
|
+
month: number | undefined;
|
|
60
|
+
day: number | undefined;
|
|
37
61
|
rawValue: string | undefined;
|
|
38
62
|
};
|
|
39
63
|
static fromJSON(json: ReturnType<ExifDate["toJSON"]>): ExifDate;
|
|
64
|
+
/**
|
|
65
|
+
* @returns true if this is a partial date (year-only or year-month)
|
|
66
|
+
*/
|
|
67
|
+
isPartial(): this is ExifDatePartial;
|
|
68
|
+
/**
|
|
69
|
+
* @returns true if this is a year-only date
|
|
70
|
+
*/
|
|
71
|
+
isYearOnly(): this is ExifDateYearOnly;
|
|
72
|
+
/**
|
|
73
|
+
* @returns true if this is a year-month date (no day)
|
|
74
|
+
*/
|
|
75
|
+
isYearMonth(): this is ExifDateYearMonth;
|
|
76
|
+
/**
|
|
77
|
+
* @returns true if this is a full date (year, month, and day)
|
|
78
|
+
*/
|
|
79
|
+
isFullDate(): this is ExifDateFull;
|
|
40
80
|
}
|
package/dist/ExifDate.js
CHANGED
|
@@ -6,6 +6,8 @@ const DateTime_1 = require("./DateTime");
|
|
|
6
6
|
const Maybe_1 = require("./Maybe");
|
|
7
7
|
const String_1 = require("./String");
|
|
8
8
|
const StrictExifRE = /^\d{1,4}:\d{1,2}:\d{1,2}|\d{1,4}-\d{1,2}-\d{1,2}$/;
|
|
9
|
+
const YearMonthRE = /^\d{1,4}[:-]\d{1,2}$/;
|
|
10
|
+
const YearOnlyRE = /^\d{1,4}$/;
|
|
9
11
|
const LooseExifRE = /^\S+\s+\S+\s+\S+$/;
|
|
10
12
|
/**
|
|
11
13
|
* Encodes an ExifDate
|
|
@@ -16,9 +18,14 @@ class ExifDate {
|
|
|
16
18
|
day;
|
|
17
19
|
rawValue;
|
|
18
20
|
static from(exifOrIso) {
|
|
21
|
+
if (typeof exifOrIso === "number") {
|
|
22
|
+
return this.fromYear(exifOrIso);
|
|
23
|
+
}
|
|
19
24
|
return (
|
|
20
25
|
// in order of strictness:
|
|
21
26
|
this.fromExifStrict(exifOrIso) ??
|
|
27
|
+
this.fromYearMonth(exifOrIso) ??
|
|
28
|
+
this.fromYear(exifOrIso) ??
|
|
22
29
|
this.fromISO(exifOrIso) ??
|
|
23
30
|
this.fromExifLoose(exifOrIso));
|
|
24
31
|
}
|
|
@@ -48,6 +55,28 @@ class ExifDate {
|
|
|
48
55
|
? this.fromPatterns(text, ["y:MM:dd", "y-MM-dd", "y:M:d"])
|
|
49
56
|
: undefined;
|
|
50
57
|
}
|
|
58
|
+
static fromYearMonth(text) {
|
|
59
|
+
const textStr = (0, String_1.toS)(text).trim();
|
|
60
|
+
if (!YearMonthRE.test(textStr))
|
|
61
|
+
return undefined;
|
|
62
|
+
for (const fmt of ["y:MM", "y-MM", "y:M", "y-M"]) {
|
|
63
|
+
const dt = luxon_1.DateTime.fromFormat(textStr, fmt);
|
|
64
|
+
if ((0, DateTime_1.validDateTime)(dt)) {
|
|
65
|
+
return new ExifDate(dt.year, dt.month, undefined, textStr);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
static fromYear(yearValue) {
|
|
71
|
+
const textStr = (0, String_1.toS)(yearValue).trim();
|
|
72
|
+
if (YearOnlyRE.test(textStr)) {
|
|
73
|
+
const year = parseInt(textStr, 10);
|
|
74
|
+
if (!isNaN(year) && year > 0 && year <= 9999) {
|
|
75
|
+
return new ExifDate(year, undefined, undefined, textStr);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
51
80
|
static fromExifLoose(text) {
|
|
52
81
|
// Unfortunately, Luxon parses "00" and "01" as _today_. So if we don't
|
|
53
82
|
// three non-blank strings parts, reject.
|
|
@@ -76,7 +105,7 @@ class ExifDate {
|
|
|
76
105
|
this.rawValue = rawValue;
|
|
77
106
|
}
|
|
78
107
|
toDate() {
|
|
79
|
-
return new Date(this.year, this.month - 1, this.day);
|
|
108
|
+
return new Date(this.year, (this.month ?? 1) - 1, this.day ?? 1);
|
|
80
109
|
}
|
|
81
110
|
/**
|
|
82
111
|
* @param deltaMs defaults to 12 hours, so toMillis() is in the middle of the day.
|
|
@@ -93,6 +122,12 @@ class ExifDate {
|
|
|
93
122
|
return this.toString(":");
|
|
94
123
|
}
|
|
95
124
|
toString(sep = "-") {
|
|
125
|
+
if (this.month == null) {
|
|
126
|
+
return `${this.year}`;
|
|
127
|
+
}
|
|
128
|
+
if (this.day == null) {
|
|
129
|
+
return `${this.year}${sep}${(0, String_1.pad2)(this.month).join("")}`;
|
|
130
|
+
}
|
|
96
131
|
return `${this.year}${sep}${(0, String_1.pad2)(this.month, this.day).join(sep)}`;
|
|
97
132
|
}
|
|
98
133
|
toJSON() {
|
|
@@ -107,6 +142,30 @@ class ExifDate {
|
|
|
107
142
|
static fromJSON(json) {
|
|
108
143
|
return new ExifDate(json.year, json.month, json.day, json.rawValue);
|
|
109
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* @returns true if this is a partial date (year-only or year-month)
|
|
147
|
+
*/
|
|
148
|
+
isPartial() {
|
|
149
|
+
return this.month == null || this.day == null;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* @returns true if this is a year-only date
|
|
153
|
+
*/
|
|
154
|
+
isYearOnly() {
|
|
155
|
+
return this.month == null;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* @returns true if this is a year-month date (no day)
|
|
159
|
+
*/
|
|
160
|
+
isYearMonth() {
|
|
161
|
+
return this.month != null && this.day == null;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* @returns true if this is a full date (year, month, and day)
|
|
165
|
+
*/
|
|
166
|
+
isFullDate() {
|
|
167
|
+
return this.month != null && this.day != null;
|
|
168
|
+
}
|
|
110
169
|
}
|
|
111
170
|
exports.ExifDate = ExifDate;
|
|
112
171
|
//# sourceMappingURL=ExifDate.js.map
|
package/dist/ExifDate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExifDate.js","sourceRoot":"","sources":["../src/ExifDate.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAEjC,yCAAmD;AACnD,mCAAmD;AACnD,qCAA4C;
|
|
1
|
+
{"version":3,"file":"ExifDate.js","sourceRoot":"","sources":["../src/ExifDate.ts"],"names":[],"mappings":"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"}
|
package/dist/ExifDateTime.js
CHANGED
|
@@ -156,7 +156,11 @@ class ExifDateTime {
|
|
|
156
156
|
dt = dt.setZone(Timezones_1.UnsetZone, { keepLocalTime: true });
|
|
157
157
|
}
|
|
158
158
|
// TODO: is there a way to provide an invalid millisecond value?
|
|
159
|
-
|
|
159
|
+
const result = this.fromDateTime(dt, { rawValue: options.rawValue });
|
|
160
|
+
if (result == null) {
|
|
161
|
+
throw new Error(`Failed to create ExifDateTime from millis: ${millis}`);
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
160
164
|
}
|
|
161
165
|
static now(opts = {}) {
|
|
162
166
|
return this.fromMillis(Date.now(), opts);
|