exiftool-vendored 30.0.0 → 30.2.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 +40 -0
- package/CLAUDE.md +40 -104
- package/README.md +30 -1
- package/RELEASE.md +29 -34
- 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 +0 -1
- package/dist/ExifToolVendoredTags.js +0 -4
- 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 +1 -1
- package/dist/GeolocationTags.js +2 -2
- package/dist/GeolocationTags.js.map +1 -1
- package/dist/ICCProfileTags.d.ts +0 -1
- package/dist/ICCProfileTags.js +0 -4
- package/dist/ICCProfileTags.js.map +1 -1
- package/dist/IPTCApplicationRecordTags.d.ts +0 -4
- package/dist/IPTCApplicationRecordTags.js +0 -7
- package/dist/IPTCApplicationRecordTags.js.map +1 -1
- package/dist/ImageDataHashTag.d.ts +0 -1
- package/dist/ImageDataHashTag.js +0 -4
- 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 +0 -8
- package/dist/MWGTags.js +0 -14
- package/dist/MWGTags.js.map +1 -1
- package/dist/Maybe.js +1 -1
- package/dist/Maybe.js.map +1 -1
- package/dist/Object.d.ts +2 -2
- package/dist/Object.js +3 -3
- package/dist/Object.js.map +1 -1
- package/dist/RawTags.d.ts +1 -4
- package/dist/ReadTask.js +5 -2
- package/dist/ReadTask.js.map +1 -1
- package/dist/StrEnum.d.ts +144 -4
- package/dist/StrEnum.js +2 -0
- package/dist/StrEnum.js.map +1 -1
- package/dist/String.js +1 -6
- package/dist/String.js.map +1 -1
- package/dist/Tags.d.ts +167 -171
- package/dist/Tags.js +5 -6
- package/dist/Tags.js.map +1 -1
- package/dist/TimeParsing.js +1 -1
- package/dist/TimeParsing.js.map +1 -1
- package/dist/Timezones.js +3 -1
- package/dist/Timezones.js.map +1 -1
- package/dist/WriteTags.d.ts +18 -2
- package/eslint.config.mjs +37 -18
- package/package.json +12 -11
- 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,46 @@ vendored versions of ExifTool match the version that they vendor.
|
|
|
25
25
|
|
|
26
26
|
## Version history
|
|
27
27
|
|
|
28
|
+
### v30.2.0
|
|
29
|
+
|
|
30
|
+
- ✨ Enhanced `StrEnum` with iterator support and JSDoc
|
|
31
|
+
|
|
32
|
+
### v30.1.0
|
|
33
|
+
|
|
34
|
+
- 🌱 Upgraded ExifTool to version [13.30](https://exiftool.org/history.html#13.30).
|
|
35
|
+
|
|
36
|
+
- 🐞 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
|
+
|
|
38
|
+
- ✨ Added **partial date support** for `ExifDate` class. XMP date tags (like `XMP:CreateDate`, `XMP:MetadataDate`) now support:
|
|
39
|
+
|
|
40
|
+
- **Year-only dates**: `1980` (numeric) or `"1980"` (string)
|
|
41
|
+
- **Year-month dates**: `"1980:08"` (EXIF format) or `"1980-08"` (ISO format)
|
|
42
|
+
- **Full dates**: `"1980:08:13"` (unchanged)
|
|
43
|
+
|
|
44
|
+
- ✨ Enhanced `ExifDate` with type-safe predicates:
|
|
45
|
+
|
|
46
|
+
- `isYearOnly()`: Returns `true` for year-only dates with type narrowing
|
|
47
|
+
- `isYearMonth()`: Returns `true` for year-month dates with type narrowing
|
|
48
|
+
- `isFullDate()`: Returns `true` for complete dates with type narrowing
|
|
49
|
+
- `isPartial()`: Returns `true` for year-only or year-month dates
|
|
50
|
+
|
|
51
|
+
- ✨ Added compositional TypeScript interfaces:
|
|
52
|
+
|
|
53
|
+
- `ExifDateYearOnly`: `{year: number}`
|
|
54
|
+
- `ExifDateYearMonth extends ExifDateYearOnly`: `{year: number, month: number}`
|
|
55
|
+
- `ExifDateFull extends ExifDateYearMonth`: `{year: number, month: number, day: number}`
|
|
56
|
+
|
|
57
|
+
- ✨ Enhanced `WriteTags` interface with group-prefixed tag support:
|
|
58
|
+
|
|
59
|
+
- `"XMP:CreateDate"`, `"XMP:MetadataDate"`, etc. accept partial dates
|
|
60
|
+
- `"EXIF:CreateDate"`, etc. require full dates (type-safe distinction)
|
|
61
|
+
|
|
62
|
+
- 📦 Docs are now automatically updated via [GitHub Actions](https://github.com/photostructure/exiftool-vendored.js/actions/workflows/docs.yml)
|
|
63
|
+
|
|
64
|
+
- 📦 Added comprehensive test coverage (47 new tests) for partial date functionality
|
|
65
|
+
|
|
66
|
+
- 📦 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.
|
|
67
|
+
|
|
28
68
|
### v30.0.0
|
|
29
69
|
|
|
30
70
|
- 💔 Dropped support for Node v18, whose End-of-Life was 2025-04-30.
|
package/CLAUDE.md
CHANGED
|
@@ -8,124 +8,60 @@ This is exiftool-vendored.js, a Node.js library that provides cross-platform acc
|
|
|
8
8
|
|
|
9
9
|
## Key Commands
|
|
10
10
|
|
|
11
|
-
### Building & Development
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
# Install dependencies
|
|
15
|
-
npm install
|
|
16
|
-
|
|
17
|
-
# Compile TypeScript to JavaScript
|
|
18
|
-
npm run compile
|
|
19
|
-
|
|
20
|
-
# Watch mode for development
|
|
21
|
-
npm run compile:watch
|
|
22
|
-
|
|
23
|
-
# Clean build artifacts
|
|
24
|
-
npm run clean
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### Linting & Formatting
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
# Run ESLint with TypeScript configuration
|
|
31
|
-
npm run lint
|
|
32
|
-
|
|
33
|
-
# Format all TypeScript and other files with Prettier
|
|
34
|
-
npm run fmt
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
### Testing
|
|
38
|
-
|
|
39
11
|
```bash
|
|
40
|
-
#
|
|
41
|
-
npm
|
|
42
|
-
|
|
43
|
-
|
|
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)
|
|
44
37
|
```
|
|
45
38
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
# Generate TypeDoc documentation
|
|
50
|
-
npm run docs
|
|
51
|
-
|
|
52
|
-
# This runs the typedoc tool and serves the documentation locally
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Tag Generation
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
# Regenerate src/Tags.ts from sample images
|
|
59
|
-
npm run mktags ../path/to/images
|
|
60
|
-
|
|
61
|
-
# This requires a directory of sample images to analyze and extract metadata tags
|
|
62
|
-
```
|
|
39
|
+
**Note**: Documentation is automatically built and deployed to GitHub Pages on every push to main branch via `.github/workflows/docs.yml`.
|
|
63
40
|
|
|
64
41
|
## Architecture & Key Concepts
|
|
65
42
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
1. **ExifTool Class** (`src/ExifTool.ts`): Main entry point that wraps ExifTool process management using batch-cluster. Provides methods for reading metadata, writing tags, extracting binaries, and rewriting tags.
|
|
69
|
-
|
|
70
|
-
2. **Tags Interface** (`src/Tags.ts`): Auto-generated TypeScript interface containing ~2000 metadata fields commonly found in photo/video files. Generated by analyzing thousands of sample files to avoid TypeScript union type limits. Fields include popularity ratings and example values.
|
|
71
|
-
|
|
72
|
-
3. **Date/Time Handling**: Custom classes for handling EXIF dates with timezone complexities:
|
|
73
|
-
|
|
74
|
-
- `ExifDate`: Date without time
|
|
75
|
-
- `ExifTime`: Time without date
|
|
76
|
-
- `ExifDateTime`: Date and time with optional timezone
|
|
77
|
-
|
|
78
|
-
4. **Task System**: Various task classes for different operations:
|
|
79
|
-
|
|
80
|
-
- `ReadTask`: Read metadata from files
|
|
81
|
-
- `WriteTask`: Write metadata to files
|
|
82
|
-
- `BinaryExtractionTask`: Extract thumbnails/previews
|
|
83
|
-
- `RewriteAllTagsTask`: Repair corrupt metadata
|
|
84
|
-
|
|
85
|
-
5. **Platform Support**: Includes platform-specific ExifTool binaries via optional dependencies:
|
|
86
|
-
- `exiftool-vendored.exe` for Windows
|
|
87
|
-
- `exiftool-vendored.pl` for Unix-like systems
|
|
88
|
-
|
|
89
|
-
### Timezone Handling
|
|
90
|
-
|
|
91
|
-
The library implements sophisticated timezone heuristics to handle underspecified date metadata:
|
|
92
|
-
|
|
93
|
-
1. Uses explicit timezone metadata if available
|
|
94
|
-
2. Falls back to GPS location for timezone inference
|
|
95
|
-
3. Uses UTC timestamp deltas to infer timezone offsets
|
|
96
|
-
4. Handles edge cases like daylight saving time transitions
|
|
97
|
-
|
|
98
|
-
### Tag Generation Process
|
|
99
|
-
|
|
100
|
-
The `mktags.ts` script analyzes sample images to generate TypeScript interfaces:
|
|
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.
|
|
101
44
|
|
|
102
|
-
|
|
103
|
-
2. Extracts metadata using ExifTool
|
|
104
|
-
3. Counts tag frequencies and value types
|
|
105
|
-
4. Generates strongly-typed interfaces for the most common ~2000 tags
|
|
106
|
-
5. Includes popularity ratings (★★★★ = >50% of samples)
|
|
45
|
+
**Process Management**: Uses [batch-cluster](https://photostructure.github.io/batch-cluster.js/) with configurable `maxProcs`, `minDelayBetweenSpawnMillis`, and `streamFlushMillis`. Singleton `exiftool` instance configured conservatively.
|
|
107
46
|
|
|
108
|
-
|
|
47
|
+
**Timezone Handling**: Sophisticated heuristics using explicit timezone metadata, GPS location inference, UTC timestamp deltas, and daylight saving transitions.
|
|
109
48
|
|
|
110
|
-
|
|
49
|
+
**Tag Generation**: `mktags.ts` analyzes sample images to generate TypeScript interfaces with ~2000 most common tags and popularity ratings.
|
|
111
50
|
|
|
112
|
-
|
|
113
|
-
- Integration tests for ExifTool operations
|
|
114
|
-
- Test images in the `test/` directory cover various edge cases
|
|
115
|
-
- Includes non-English filename tests
|
|
51
|
+
**Testing**: Mocha with Chai assertions, unit/integration tests, test images in `test/` directory including non-English filenames.
|
|
116
52
|
|
|
117
53
|
## Important Notes
|
|
118
54
|
|
|
119
55
|
- Always run `npm run compile` before testing
|
|
120
|
-
-
|
|
121
|
-
- Tag interfaces
|
|
122
|
-
-
|
|
123
|
-
- TypeScript
|
|
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
|
|
124
60
|
|
|
125
|
-
##
|
|
61
|
+
## TypeScript Hygiene
|
|
126
62
|
|
|
127
|
-
-
|
|
128
|
-
|
|
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
|
|
129
66
|
|
|
130
|
-
|
|
131
|
-
DO NOT use `||`: this is problematic (especially when handling boolean values).
|
|
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.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Array.js","sourceRoot":"","sources":["../src/Array.ts"],"names":[],"mappings":"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
|
|
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
|