@lodev09/react-native-exify 0.2.7 → 1.0.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.
Files changed (37) hide show
  1. package/Exify.podspec +3 -23
  2. package/LICENSE +1 -1
  3. package/README.md +44 -18
  4. package/android/build.gradle +26 -53
  5. package/android/src/main/AndroidManifest.xml +2 -2
  6. package/android/src/main/java/com/lodev09/exify/ExifyModule.kt +146 -32
  7. package/android/src/main/java/com/lodev09/exify/ExifyPackage.kt +28 -10
  8. package/android/src/main/java/com/lodev09/exify/ExifyTags.kt +137 -135
  9. package/android/src/main/java/com/lodev09/exify/ExifyUtils.kt +31 -8
  10. package/ios/Exify.h +9 -0
  11. package/ios/Exify.mm +384 -25
  12. package/lib/module/index.js +12 -22
  13. package/lib/module/index.js.map +1 -1
  14. package/lib/module/package.json +1 -0
  15. package/lib/module/specs/NativeExifyModule.js +5 -0
  16. package/lib/module/specs/NativeExifyModule.js.map +1 -0
  17. package/lib/module/types.js +1 -1
  18. package/lib/typescript/package.json +1 -0
  19. package/lib/typescript/src/index.d.ts +7 -9
  20. package/lib/typescript/src/index.d.ts.map +1 -1
  21. package/lib/typescript/src/specs/NativeExifyModule.d.ts +8 -0
  22. package/lib/typescript/src/specs/NativeExifyModule.d.ts.map +1 -0
  23. package/lib/typescript/src/types.d.ts +2 -1
  24. package/lib/typescript/src/types.d.ts.map +1 -1
  25. package/package.json +82 -95
  26. package/src/index.ts +12 -31
  27. package/src/specs/NativeExifyModule.ts +8 -0
  28. package/src/types.ts +141 -140
  29. package/android/gradle.properties +0 -5
  30. package/android/src/main/AndroidManifestNew.xml +0 -2
  31. package/ios/Exify-Bridging-Header.h +0 -11
  32. package/ios/Exify.swift +0 -134
  33. package/ios/ExifyUtils.swift +0 -140
  34. package/lib/commonjs/index.js +0 -53
  35. package/lib/commonjs/index.js.map +0 -1
  36. package/lib/commonjs/types.js +0 -2
  37. package/lib/commonjs/types.js.map +0 -1
package/ios/Exify.mm CHANGED
@@ -1,28 +1,387 @@
1
- /*
2
- *
3
- * Created by Jovanni Lo (@lodev09)
4
- * Copyright 2024
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE file in the root directory of this source tree.
8
- */
9
-
10
- #import <React/RCTBridgeModule.h>
11
-
12
- @interface RCT_EXTERN_MODULE(Exify, NSObject)
13
-
14
- RCT_EXTERN_METHOD(readAsync:(NSString*)uri
15
- withResolver:(RCTPromiseResolveBlock)resolve
16
- withRejecter:(RCTPromiseRejectBlock)reject)
17
-
18
- RCT_EXTERN_METHOD(writeAsync:(NSString*)uri
19
- withExif:(NSDictionary*)exif
20
- withResolver:(RCTPromiseResolveBlock)resolve
21
- withRejecter:(RCTPromiseRejectBlock)reject)
22
-
23
- + (BOOL)requiresMainQueueSetup
24
- {
25
- return NO;
1
+ #import "Exify.h"
2
+
3
+ static NSSet *tiffKeys;
4
+
5
+ __attribute__((constructor)) static void initTiffKeys(void) {
6
+ tiffKeys = [NSSet
7
+ setWithObjects:@"Make", @"Model", @"Software", @"DateTime", @"Artist",
8
+ @"Copyright", @"ImageDescription", @"Orientation",
9
+ @"XResolution", @"YResolution", @"ResolutionUnit",
10
+ @"Compression", @"PhotometricInterpretation",
11
+ @"TransferFunction", @"WhitePoint",
12
+ @"PrimaryChromaticities", @"HostComputer", nil];
13
+ }
14
+
15
+ #pragma mark - Helpers
16
+
17
+ static PHAsset *getAssetById(NSString *assetId) {
18
+ PHFetchOptions *options = [PHFetchOptions new];
19
+ options.includeHiddenAssets = YES;
20
+ options.includeAllBurstAssets = YES;
21
+ options.fetchLimit = 1;
22
+
23
+ PHFetchResult<PHAsset *> *result =
24
+ [PHAsset fetchAssetsWithLocalIdentifiers:@[ assetId ] options:options];
25
+ return result.firstObject;
26
+ }
27
+
28
+ static void addTagEntries(CFStringRef dictionary, NSDictionary *metadata,
29
+ NSMutableDictionary *tags) {
30
+ NSDictionary *entries = metadata[(__bridge NSString *)dictionary];
31
+ if (entries) {
32
+ [tags addEntriesFromDictionary:entries];
33
+ }
34
+ }
35
+
36
+ static NSDictionary *getExifTags(NSDictionary *metadata) {
37
+ NSMutableDictionary *tags = [NSMutableDictionary new];
38
+
39
+ NSString *compressionKey =
40
+ (__bridge NSString *)kCGImageDestinationLossyCompressionQuality;
41
+ for (NSString *key in metadata) {
42
+ id value = metadata[key];
43
+ if (![value isKindOfClass:[NSDictionary class]] &&
44
+ ![key isEqualToString:compressionKey]) {
45
+ tags[key] = value;
46
+ }
47
+ }
48
+
49
+ addTagEntries(kCGImagePropertyExifDictionary, metadata, tags);
50
+ addTagEntries(kCGImagePropertyTIFFDictionary, metadata, tags);
51
+ addTagEntries(kCGImagePropertyPNGDictionary, metadata, tags);
52
+
53
+ if (@available(iOS 13.0, *)) {
54
+ addTagEntries(kCGImagePropertyHEICSDictionary, metadata, tags);
55
+ }
56
+
57
+ // Prefix GPS keys with "GPS"
58
+ NSDictionary *gps =
59
+ metadata[(__bridge NSString *)kCGImagePropertyGPSDictionary];
60
+ if (gps) {
61
+ for (NSString *key in gps) {
62
+ tags[[@"GPS" stringByAppendingString:key]] = gps[key];
63
+ }
64
+ }
65
+
66
+ return [tags copy];
67
+ }
68
+
69
+ static NSDictionary *readExifTags(NSURL *url) {
70
+ if (!url)
71
+ return nil;
72
+
73
+ CGImageSourceRef source =
74
+ CGImageSourceCreateWithURL((__bridge CFURLRef)url, nil);
75
+ if (!source)
76
+ return nil;
77
+
78
+ NSDictionary *metadata =
79
+ (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(
80
+ source, 0, nil);
81
+ CFRelease(source);
82
+
83
+ if (!metadata)
84
+ return nil;
85
+
86
+ return getExifTags(metadata);
87
+ }
88
+
89
+ /// Returns @{@"metadata": NSDictionary, @"data": NSData} or nil on failure.
90
+ static NSDictionary *updateMetadata(NSURL *url, NSDictionary *tags) {
91
+ CGImageSourceRef imageSource =
92
+ CGImageSourceCreateWithURL((__bridge CFURLRef)url, nil);
93
+ if (!imageSource)
94
+ return nil;
95
+
96
+ CFStringRef sourceType = CGImageSourceGetType(imageSource);
97
+ if (!sourceType) {
98
+ CFRelease(imageSource);
99
+ return nil;
100
+ }
101
+
102
+ CFDictionaryRef props =
103
+ CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil);
104
+ NSMutableDictionary *metadata =
105
+ props ? [NSMutableDictionary
106
+ dictionaryWithDictionary:(__bridge_transfer NSDictionary *)
107
+ props]
108
+ : [NSMutableDictionary new];
109
+
110
+ // Route tags into the correct sub-dictionaries
111
+ NSMutableDictionary *exifDict = [NSMutableDictionary
112
+ dictionaryWithDictionary:metadata[(__bridge NSString *)
113
+ kCGImagePropertyExifDictionary]
114
+ ?: @{}];
115
+ NSMutableDictionary *tiffDict = [NSMutableDictionary
116
+ dictionaryWithDictionary:metadata[(__bridge NSString *)
117
+ kCGImagePropertyTIFFDictionary]
118
+ ?: @{}];
119
+ NSMutableDictionary *gpsDict = [NSMutableDictionary
120
+ dictionaryWithDictionary:metadata[(__bridge NSString *)
121
+ kCGImagePropertyGPSDictionary]
122
+ ?: @{}];
123
+
124
+ // Pre-read explicit GPS ref values so coordinate handlers can use them
125
+ NSString *latRef = tags[@"GPSLatitudeRef"];
126
+ NSString *lngRef = tags[@"GPSLongitudeRef"];
127
+ NSNumber *altRef = tags[@"GPSAltitudeRef"];
128
+
129
+ for (NSString *key in tags) {
130
+ id value = tags[key];
131
+
132
+ if ([key isEqualToString:@"GPSLatitude"]) {
133
+ double lat = [value doubleValue];
134
+ gpsDict[(__bridge NSString *)kCGImagePropertyGPSLatitude] = @(fabs(lat));
135
+ gpsDict[(__bridge NSString *)kCGImagePropertyGPSLatitudeRef] =
136
+ latRef ?: (lat >= 0 ? @"N" : @"S");
137
+ } else if ([key isEqualToString:@"GPSLongitude"]) {
138
+ double lng = [value doubleValue];
139
+ gpsDict[(__bridge NSString *)kCGImagePropertyGPSLongitude] = @(fabs(lng));
140
+ gpsDict[(__bridge NSString *)kCGImagePropertyGPSLongitudeRef] =
141
+ lngRef ?: (lng >= 0 ? @"E" : @"W");
142
+ } else if ([key isEqualToString:@"GPSAltitude"]) {
143
+ double alt = [value doubleValue];
144
+ gpsDict[(__bridge NSString *)kCGImagePropertyGPSAltitude] = @(fabs(alt));
145
+ gpsDict[(__bridge NSString *)kCGImagePropertyGPSAltitudeRef] =
146
+ altRef ?: @(alt >= 0 ? 0 : 1);
147
+ } else if ([key isEqualToString:@"GPSLatitudeRef"] ||
148
+ [key isEqualToString:@"GPSLongitudeRef"] ||
149
+ [key isEqualToString:@"GPSAltitudeRef"]) {
150
+ // Already handled above
151
+ } else if ([key hasPrefix:@"GPS"]) {
152
+ gpsDict[[key substringFromIndex:3]] = value;
153
+ } else if ([tiffKeys containsObject:key]) {
154
+ tiffDict[key] = value;
155
+ } else {
156
+ exifDict[key] = value;
157
+ }
158
+ }
159
+
160
+ metadata[(__bridge NSString *)kCGImagePropertyExifDictionary] = exifDict;
161
+ metadata[(__bridge NSString *)kCGImagePropertyTIFFDictionary] = tiffDict;
162
+ metadata[(__bridge NSString *)kCGImagePropertyGPSDictionary] = gpsDict;
163
+ metadata[(__bridge NSString *)kCGImageDestinationLossyCompressionQuality] =
164
+ @(1);
165
+
166
+ // Write image with updated metadata
167
+ CGImageRef cgImage = CGImageSourceCreateImageAtIndex(imageSource, 0, nil);
168
+ if (!cgImage) {
169
+ CFRelease(imageSource);
170
+ return nil;
171
+ }
172
+
173
+ NSMutableData *destinationData = [NSMutableData new];
174
+ CGImageDestinationRef destination = CGImageDestinationCreateWithData(
175
+ (__bridge CFMutableDataRef)destinationData, sourceType, 1, nil);
176
+
177
+ if (!destination) {
178
+ CGImageRelease(cgImage);
179
+ CFRelease(imageSource);
180
+ return nil;
181
+ }
182
+
183
+ CGImageDestinationAddImage(destination, cgImage,
184
+ (__bridge CFDictionaryRef)metadata);
185
+ CGImageDestinationFinalize(destination);
186
+
187
+ CFRelease(destination);
188
+ CGImageRelease(cgImage);
189
+ CFRelease(imageSource);
190
+
191
+ return @{@"metadata" : metadata, @"data" : destinationData};
192
+ }
193
+
194
+ #pragma mark - Exify Module
195
+
196
+ @implementation Exify
197
+
198
+ - (void)read:(NSString *)uri
199
+ resolve:(RCTPromiseResolveBlock)resolve
200
+ reject:(RCTPromiseRejectBlock)reject {
201
+ if ([uri hasPrefix:@"ph://"]) {
202
+ NSString *assetId = [uri substringFromIndex:5];
203
+ PHAsset *asset = getAssetById(assetId);
204
+ if (!asset) {
205
+ RCTLogWarn(@"Exify: Could not retrieve asset");
206
+ reject(@"Error", @"Could not retrieve asset", nil);
207
+ return;
208
+ }
209
+
210
+ PHContentEditingInputRequestOptions *options =
211
+ [PHContentEditingInputRequestOptions new];
212
+ options.networkAccessAllowed = YES;
213
+
214
+ [asset requestContentEditingInputWithOptions:options
215
+ completionHandler:^(
216
+ PHContentEditingInput *contentInput,
217
+ NSDictionary *info) {
218
+ if (!contentInput ||
219
+ !contentInput.fullSizeImageURL) {
220
+ RCTLogWarn(@"Exify: Could not read asset "
221
+ "content");
222
+ reject(@"Error",
223
+ @"Could not read asset content", nil);
224
+ return;
225
+ }
226
+
227
+ NSDictionary *tags = readExifTags(
228
+ contentInput.fullSizeImageURL);
229
+ if (!tags) {
230
+ RCTLogWarn(@"Exify: Could not read metadata "
231
+ "from asset");
232
+ reject(@"Error",
233
+ @"Could not read metadata from asset",
234
+ nil);
235
+ return;
236
+ }
237
+
238
+ resolve(tags);
239
+ }];
240
+ } else {
241
+ if ([uri hasPrefix:@"/"] || ![uri containsString:@"://"]) {
242
+ RCTLogWarn(@"Exify: URI must include a scheme (e.g. file://): %@", uri);
243
+ reject(@"Error",
244
+ [NSString stringWithFormat:@"URI must include a scheme (e.g. "
245
+ @"file://): %@",
246
+ uri],
247
+ nil);
248
+ return;
249
+ }
250
+
251
+ NSURL *url = [NSURL URLWithString:uri];
252
+ if (!url) {
253
+ RCTLogWarn(@"Exify: Invalid URI: %@", uri);
254
+ reject(@"Error", [NSString stringWithFormat:@"Invalid URI: %@", uri],
255
+ nil);
256
+ return;
257
+ }
258
+
259
+ NSDictionary *tags = readExifTags(url);
260
+ if (!tags) {
261
+ RCTLogWarn(@"Exify: Could not read metadata from: %@", uri);
262
+ reject(
263
+ @"Error",
264
+ [NSString stringWithFormat:@"Could not read metadata from: %@", uri],
265
+ nil);
266
+ return;
267
+ }
268
+
269
+ resolve(tags);
270
+ }
271
+ }
272
+
273
+ - (void)write:(NSString *)uri
274
+ tags:(NSDictionary *)tags
275
+ resolve:(RCTPromiseResolveBlock)resolve
276
+ reject:(RCTPromiseRejectBlock)reject {
277
+ if ([uri hasPrefix:@"ph://"]) {
278
+ NSString *assetId = [uri substringFromIndex:5];
279
+ PHAsset *asset = getAssetById(assetId);
280
+ if (!asset) {
281
+ reject(@"Error", @"Cannot retrieve asset.", nil);
282
+ return;
283
+ }
284
+
285
+ PHContentEditingInputRequestOptions *options =
286
+ [PHContentEditingInputRequestOptions new];
287
+ options.networkAccessAllowed = YES;
288
+
289
+ [asset
290
+ requestContentEditingInputWithOptions:options
291
+ completionHandler:^(
292
+ PHContentEditingInput *contentInput,
293
+ NSDictionary *info) {
294
+ if (!contentInput ||
295
+ !contentInput.fullSizeImageURL) {
296
+ reject(@"Error",
297
+ @"Unable to read metadata from asset",
298
+ nil);
299
+ return;
300
+ }
301
+
302
+ NSDictionary *result = updateMetadata(
303
+ contentInput.fullSizeImageURL, tags);
304
+ if (!result) {
305
+ reject(@"Error", @"Could not update metadata",
306
+ nil);
307
+ return;
308
+ }
309
+
310
+ __block NSString *newAssetId = nil;
311
+ NSError *error = nil;
312
+ [[PHPhotoLibrary sharedPhotoLibrary]
313
+ performChangesAndWait:^{
314
+ PHAssetCreationRequest *request =
315
+ [PHAssetCreationRequest
316
+ creationRequestForAsset];
317
+ [request addResourceWithType:
318
+ PHAssetResourceTypePhoto
319
+ data:result[@"data"]
320
+ options:nil];
321
+ request.creationDate = [NSDate date];
322
+ newAssetId =
323
+ request.placeholderForCreatedAsset
324
+ .localIdentifier;
325
+ }
326
+ error:&error];
327
+
328
+ if (error) {
329
+ reject(@"Error",
330
+ @"Could not save to image file", error);
331
+ return;
332
+ }
333
+
334
+ resolve(@{
335
+ @"uri" : [NSString
336
+ stringWithFormat:@"ph://%@", newAssetId],
337
+ @"assetId" : newAssetId ?: @"",
338
+ @"tags" : getExifTags(result[@"metadata"]),
339
+ });
340
+ }];
341
+ } else {
342
+ if ([uri hasPrefix:@"/"] || ![uri containsString:@"://"]) {
343
+ RCTLogWarn(@"Exify: URI must include a scheme (e.g. file://): %@", uri);
344
+ reject(@"Error",
345
+ [NSString stringWithFormat:@"URI must include a scheme (e.g. "
346
+ @"file://): %@",
347
+ uri],
348
+ nil);
349
+ return;
350
+ }
351
+
352
+ NSURL *url = [NSURL URLWithString:uri];
353
+ if (!url) {
354
+ reject(@"Error", @"Invalid URL", nil);
355
+ return;
356
+ }
357
+
358
+ NSDictionary *result = updateMetadata(url, tags);
359
+ if (!result) {
360
+ reject(@"Error", @"Could not update metadata", nil);
361
+ return;
362
+ }
363
+
364
+ NSError *error = nil;
365
+ [result[@"data"] writeToURL:url options:NSDataWritingAtomic error:&error];
366
+ if (error) {
367
+ reject(@"Error", @"Could not save to image file", error);
368
+ return;
369
+ }
370
+
371
+ resolve(@{
372
+ @"uri" : uri,
373
+ @"tags" : getExifTags(result[@"metadata"]),
374
+ });
375
+ }
376
+ }
377
+
378
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
379
+ (const facebook::react::ObjCTurboModule::InitParams &)params {
380
+ return std::make_shared<facebook::react::NativeExifyModuleSpecJSI>(params);
381
+ }
382
+
383
+ + (NSString *)moduleName {
384
+ return @"Exify";
26
385
  }
27
386
 
28
387
  @end
@@ -1,31 +1,21 @@
1
- import { NativeModules, Platform } from 'react-native';
2
- const LINKING_ERROR = `The package '@lodev09/react-native-exify' doesn't seem to be linked. Make sure: \n\n` + Platform.select({
3
- ios: "- You have run 'pod install'\n",
4
- default: ''
5
- }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
6
- const Exify = NativeModules.Exify ? NativeModules.Exify : new Proxy({}, {
7
- get() {
8
- throw new Error(LINKING_ERROR);
9
- }
10
- });
1
+ "use strict";
11
2
 
3
+ import Exify from "./specs/NativeExifyModule.js";
12
4
  /**
13
- * Write Exif data into an image file.
14
- * @param {string} uri the image uri to write
15
- * @param {ExifTags} tags the exif tags to be written
16
- * @return {Promise<ExifyWriteResult>} the full exif tags of the image
5
+ * Read Exif metadata from an image.
6
+ * @param uri Image URI with a scheme (e.g. `file://`, `ph://`, `content://`). Bare file paths are not supported.
17
7
  */
18
- export function writeAsync(uri, tags) {
19
- return Exify.writeAsync(uri, tags);
8
+ export function read(uri) {
9
+ return Exify.read(uri);
20
10
  }
21
11
 
22
12
  /**
23
- * Read Exif data from an image file.
24
- * @param {string} uri the image uri to read
25
- * @return {Promise<ExifTags>} the raw exif tags of the image
13
+ * Write Exif metadata into an image.
14
+ * @param uri Image URI with a scheme (e.g. `file://`, `ph://`, `content://`). Bare file paths are not supported.
15
+ * @param tags Exif tags to write.
26
16
  */
27
- export function readAsync(uri) {
28
- return Exify.readAsync(uri);
17
+ export function write(uri, tags) {
18
+ return Exify.write(uri, tags);
29
19
  }
30
- export * from './types';
20
+ export * from "./types.js";
31
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","Platform","LINKING_ERROR","select","ios","default","Exify","Proxy","get","Error","writeAsync","uri","tags","readAsync"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAGtD,MAAMC,aAAa,GAChB,sFAAqF,GACtFD,QAAQ,CAACE,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,KAAK,GAAGN,aAAa,CAACM,KAAK,GAC7BN,aAAa,CAACM,KAAK,GACnB,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CACF,CAAC;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASQ,UAAUA,CAACC,GAAW,EAAEC,IAAc,EAAyC;EAC7F,OAAON,KAAK,CAACI,UAAU,CAACC,GAAG,EAAEC,IAAI,CAAC;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAACF,GAAW,EAAiC;EACpE,OAAOL,KAAK,CAACO,SAAS,CAACF,GAAG,CAAC;AAC7B;AAEA,cAAc,SAAS","ignoreList":[]}
1
+ {"version":3,"names":["Exify","read","uri","write","tags"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,8BAA2B;AAG7C;AACA;AACA;AACA;AACA,OAAO,SAASC,IAAIA,CAACC,GAAW,EAA4B;EAC1D,OAAOF,KAAK,CAACC,IAAI,CAACC,GAAG,CAAC;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,KAAKA,CAACD,GAAW,EAAEE,IAAc,EAA6B;EAC5E,OAAOJ,KAAK,CAACG,KAAK,CAACD,GAAG,EAAEE,IAAc,CAAC;AACzC;AAEA,cAAc,YAAS","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ import { TurboModuleRegistry } from 'react-native';
4
+ export default TurboModuleRegistry.getEnforcing('Exify');
5
+ //# sourceMappingURL=NativeExifyModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["specs/NativeExifyModule.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AAOpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,OAAO,CAAC","ignoreList":[]}
@@ -1,2 +1,2 @@
1
-
1
+ "use strict";
2
2
  //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -1,16 +1,14 @@
1
1
  import type { ExifTags, ExifyWriteResult } from './types';
2
2
  /**
3
- * Write Exif data into an image file.
4
- * @param {string} uri the image uri to write
5
- * @param {ExifTags} tags the exif tags to be written
6
- * @return {Promise<ExifyWriteResult>} the full exif tags of the image
3
+ * Read Exif metadata from an image.
4
+ * @param uri Image URI with a scheme (e.g. `file://`, `ph://`, `content://`). Bare file paths are not supported.
7
5
  */
8
- export declare function writeAsync(uri: string, tags: ExifTags): Promise<ExifyWriteResult | undefined>;
6
+ export declare function read(uri: string): Promise<ExifTags | null>;
9
7
  /**
10
- * Read Exif data from an image file.
11
- * @param {string} uri the image uri to read
12
- * @return {Promise<ExifTags>} the raw exif tags of the image
8
+ * Write Exif metadata into an image.
9
+ * @param uri Image URI with a scheme (e.g. `file://`, `ph://`, `content://`). Bare file paths are not supported.
10
+ * @param tags Exif tags to write.
13
11
  */
14
- export declare function readAsync(uri: string): Promise<ExifTags | undefined>;
12
+ export declare function write(uri: string, tags: ExifTags): Promise<ExifyWriteResult>;
15
13
  export * from './types';
16
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAmBzD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAE7F;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAEpE;AAED,cAAc,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE5E;AAED,cAAc,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type TurboModule } from 'react-native';
2
+ export interface Spec extends TurboModule {
3
+ read(uri: string): Promise<Object | null>;
4
+ write(uri: string, tags: Object): Promise<Object>;
5
+ }
6
+ declare const _default: Spec;
7
+ export default _default;
8
+ //# sourceMappingURL=NativeExifyModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeExifyModule.d.ts","sourceRoot":"","sources":["../../../../src/specs/NativeExifyModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnD;;AAED,wBAA+D"}
@@ -63,7 +63,7 @@ export interface ExifTags {
63
63
  LightSource?: number;
64
64
  UserComment?: string;
65
65
  GainControl?: number;
66
- ISOSpeedRatings?: number[];
66
+ ISOSpeedRatings?: string;
67
67
  FocalPlaneResolutionUnit?: number;
68
68
  FocalPlaneXResolution?: number;
69
69
  YCbCrCoefficients?: number;
@@ -139,6 +139,7 @@ export interface ExifTags {
139
139
  SubjectDistanceRange?: number;
140
140
  XResolution?: number;
141
141
  Software?: string;
142
+ HostComputer?: string;
142
143
  [key: string]: unknown;
143
144
  }
144
145
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}