react-native-image-compression-kit 0.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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +562 -0
  3. package/android/build.gradle +63 -0
  4. package/android/src/main/AndroidManifest.xml +1 -0
  5. package/android/src/main/java/com/imagecompressionkit/ImageCompressionKitModule.kt +1127 -0
  6. package/android/src/main/java/com/imagecompressionkit/ImageCompressionKitPackage.kt +33 -0
  7. package/android/src/main/java/com/imagecompressionkit/ImageCompressionOutput.kt +396 -0
  8. package/android/src/main/java/com/imagecompressionkit/JpegExifMetadata.kt +233 -0
  9. package/ios/RCTImageCompressionKit.h +10 -0
  10. package/ios/RCTImageCompressionKit.mm +72 -0
  11. package/lib/NativeImageCompressionKit.d.ts +55 -0
  12. package/lib/NativeImageCompressionKit.d.ts.map +1 -0
  13. package/lib/NativeImageCompressionKit.js +5 -0
  14. package/lib/NativeImageCompressionKit.js.map +1 -0
  15. package/lib/api.d.ts +4 -0
  16. package/lib/api.d.ts.map +1 -0
  17. package/lib/api.js +25 -0
  18. package/lib/api.js.map +1 -0
  19. package/lib/errors.d.ts +9 -0
  20. package/lib/errors.d.ts.map +1 -0
  21. package/lib/errors.js +53 -0
  22. package/lib/errors.js.map +1 -0
  23. package/lib/index.d.ts +5 -0
  24. package/lib/index.d.ts.map +1 -0
  25. package/lib/index.js +14 -0
  26. package/lib/index.js.map +1 -0
  27. package/lib/nativeModule.d.ts +7 -0
  28. package/lib/nativeModule.d.ts.map +1 -0
  29. package/lib/nativeModule.js +73 -0
  30. package/lib/nativeModule.js.map +1 -0
  31. package/lib/types.d.ts +59 -0
  32. package/lib/types.d.ts.map +1 -0
  33. package/lib/types.js +23 -0
  34. package/lib/types.js.map +1 -0
  35. package/lib/validation.d.ts +3 -0
  36. package/lib/validation.d.ts.map +1 -0
  37. package/lib/validation.js +108 -0
  38. package/lib/validation.js.map +1 -0
  39. package/package.json +106 -0
  40. package/react-native-image-compression-kit.podspec +21 -0
  41. package/react-native.config.js +12 -0
  42. package/src/NativeImageCompressionKit.ts +81 -0
  43. package/src/api.ts +28 -0
  44. package/src/errors.ts +91 -0
  45. package/src/index.ts +25 -0
  46. package/src/nativeModule.ts +130 -0
  47. package/src/types.ts +88 -0
  48. package/src/validation.ts +181 -0
@@ -0,0 +1,72 @@
1
+ #import "RCTImageCompressionKit.h"
2
+
3
+ #include <memory>
4
+
5
+ static NSString *const RCTImageCompressionKitModuleName = @"ImageCompressionKit";
6
+ static NSString *const RCTImageCompressionKitNotImplementedCode = @"ERR_NOT_IMPLEMENTED";
7
+
8
+ static NSArray<NSString *> *RCTImageCompressionKitFormats(void)
9
+ {
10
+ return @[@"jpeg", @"png", @"webp", @"heic", @"heif", @"avif", @"gif"];
11
+ }
12
+
13
+ static NSArray<NSString *> *RCTImageCompressionKitMetadataPolicies(void)
14
+ {
15
+ return @[@"preserve", @"safe", @"strip"];
16
+ }
17
+
18
+ static NSDictionary *RCTImageCompressionKitUnavailableFormatCapability(NSString *format)
19
+ {
20
+ return @{
21
+ @"format" : format,
22
+ @"input" : @NO,
23
+ @"output" : @NO,
24
+ @"supportsAlpha" : @NO,
25
+ @"supportsAnimation" : @NO,
26
+ @"notes" : @[@"Native codec support has not been implemented yet."]
27
+ };
28
+ }
29
+
30
+ @implementation RCTImageCompressionKit
31
+
32
+ + (NSString *)moduleName
33
+ {
34
+ return RCTImageCompressionKitModuleName;
35
+ }
36
+
37
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
38
+ (const facebook::react::ObjCTurboModule::InitParams &)params
39
+ {
40
+ return std::make_shared<facebook::react::NativeImageCompressionKitSpecJSI>(params);
41
+ }
42
+
43
+ - (void)compressImage:(NSDictionary *)options
44
+ resolve:(RCTPromiseResolveBlock)resolve
45
+ reject:(RCTPromiseRejectBlock)reject
46
+ {
47
+ reject(
48
+ RCTImageCompressionKitNotImplementedCode,
49
+ @"Image compression is not implemented in the iOS native stub yet.",
50
+ nil
51
+ );
52
+ }
53
+
54
+ - (void)getImageCompressionCapabilities:(RCTPromiseResolveBlock)resolve
55
+ reject:(RCTPromiseRejectBlock)reject
56
+ {
57
+ NSMutableArray<NSDictionary *> *formats = [NSMutableArray array];
58
+
59
+ for (NSString *format in RCTImageCompressionKitFormats()) {
60
+ [formats addObject:RCTImageCompressionKitUnavailableFormatCapability(format)];
61
+ }
62
+
63
+ resolve(@{
64
+ @"platform" : @"ios",
65
+ @"formats" : formats,
66
+ @"metadataPolicies" : RCTImageCompressionKitMetadataPolicies(),
67
+ @"supportsTargetSizeCompression" : @NO,
68
+ @"supportsCancellation" : @NO
69
+ });
70
+ }
71
+
72
+ @end
@@ -0,0 +1,55 @@
1
+ import type { TurboModule } from 'react-native';
2
+ export type NativeImageFormat = 'jpeg' | 'png' | 'webp' | 'heic' | 'heif' | 'avif' | 'gif';
3
+ export type NativeOutputFormat = 'jpeg' | 'png' | 'webp' | 'heic' | 'heif' | 'avif';
4
+ export type NativeMetadataPolicy = 'preserve' | 'safe' | 'strip';
5
+ export type NativeResizeMode = 'contain' | 'cover' | 'stretch';
6
+ export type NativeCompressionSource = {
7
+ uri: string;
8
+ };
9
+ export type NativeResizeOptions = {
10
+ maxWidth?: number;
11
+ maxHeight?: number;
12
+ mode: NativeResizeMode;
13
+ };
14
+ export type NativeOutputOptions = {
15
+ format: NativeOutputFormat;
16
+ quality?: number;
17
+ maxBytes?: number;
18
+ };
19
+ export type NativeCompressionOptions = {
20
+ source: NativeCompressionSource;
21
+ resize?: NativeResizeOptions;
22
+ output: NativeOutputOptions;
23
+ metadata: NativeMetadataPolicy;
24
+ };
25
+ export type NativeCompressionResult = {
26
+ uri: string;
27
+ format: NativeOutputFormat;
28
+ width: number;
29
+ height: number;
30
+ byteSize: number;
31
+ originalByteSize: number;
32
+ compressionRatio: number;
33
+ };
34
+ export type NativeFormatCapability = {
35
+ format: NativeImageFormat;
36
+ input: boolean;
37
+ output: boolean;
38
+ supportsAlpha: boolean;
39
+ supportsAnimation: boolean;
40
+ notes?: Array<string>;
41
+ };
42
+ export type NativeImageCompressionCapabilities = {
43
+ platform: 'android' | 'ios' | 'unknown';
44
+ formats: Array<NativeFormatCapability>;
45
+ metadataPolicies: Array<NativeMetadataPolicy>;
46
+ supportsTargetSizeCompression: boolean;
47
+ supportsCancellation: boolean;
48
+ };
49
+ export interface Spec extends TurboModule {
50
+ compressImage(options: NativeCompressionOptions): Promise<NativeCompressionResult>;
51
+ getImageCompressionCapabilities(): Promise<NativeImageCompressionCapabilities>;
52
+ }
53
+ declare const _default: Spec | null;
54
+ export default _default;
55
+ //# sourceMappingURL=NativeImageCompressionKit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeImageCompressionKit.d.ts","sourceRoot":"","sources":["../src/NativeImageCompressionKit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,KAAK,GACL,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,KAAK,CAAC;AAEV,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,KAAK,GACL,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AACjE,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/D,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,gBAAgB,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,uBAAuB,CAAC;IAChC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,QAAQ,EAAE,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;IACxC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACvC,gBAAgB,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9C,6BAA6B,EAAE,OAAO,CAAC;IACvC,oBAAoB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,aAAa,CACX,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACpC,+BAA+B,IAAI,OAAO,CAAC,kCAAkC,CAAC,CAAC;CAChF;;AAED,wBAAoE"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const react_native_1 = require("react-native");
4
+ exports.default = react_native_1.TurboModuleRegistry.get('ImageCompressionKit');
5
+ //# sourceMappingURL=NativeImageCompressionKit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeImageCompressionKit.js","sourceRoot":"","sources":["../src/NativeImageCompressionKit.ts"],"names":[],"mappings":";;AACA,+CAAmD;AA+EnD,kBAAe,kCAAmB,CAAC,GAAG,CAAO,qBAAqB,CAAC,CAAC"}
package/lib/api.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { CompressionOptions, CompressionResult, ImageCompressionCapabilities } from './types';
2
+ export declare function compressImage(options: CompressionOptions): Promise<CompressionResult>;
3
+ export declare function getImageCompressionCapabilities(): Promise<ImageCompressionCapabilities>;
4
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AAGjB,wBAAsB,aAAa,CACjC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAQ5B;AAED,wBAAsB,+BAA+B,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAM7F"}
package/lib/api.js ADDED
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compressImage = compressImage;
4
+ exports.getImageCompressionCapabilities = getImageCompressionCapabilities;
5
+ const errors_1 = require("./errors");
6
+ const nativeModule_1 = require("./nativeModule");
7
+ const validation_1 = require("./validation");
8
+ async function compressImage(options) {
9
+ const normalizedOptions = (0, validation_1.normalizeCompressionOptions)(options);
10
+ try {
11
+ return await (0, nativeModule_1.getNativeModule)().compressImage(normalizedOptions);
12
+ }
13
+ catch (error) {
14
+ throw (0, errors_1.normalizeNativeError)(error);
15
+ }
16
+ }
17
+ async function getImageCompressionCapabilities() {
18
+ try {
19
+ return await (0, nativeModule_1.getNativeModule)().getImageCompressionCapabilities();
20
+ }
21
+ catch (error) {
22
+ throw (0, errors_1.normalizeNativeError)(error);
23
+ }
24
+ }
25
+ //# sourceMappingURL=api.js.map
package/lib/api.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":";;AASA,sCAUC;AAED,0EAMC;AA3BD,qCAAgD;AAChD,iDAAiD;AAMjD,6CAA2D;AAEpD,KAAK,UAAU,aAAa,CACjC,OAA2B;IAE3B,MAAM,iBAAiB,GAAG,IAAA,wCAA2B,EAAC,OAAO,CAAC,CAAC;IAE/D,IAAI,CAAC;QACH,OAAO,MAAM,IAAA,8BAAe,GAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,6BAAoB,EAAC,KAAK,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,+BAA+B;IACnD,IAAI,CAAC;QACH,OAAO,MAAM,IAAA,8BAAe,GAAE,CAAC,+BAA+B,EAAE,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,6BAAoB,EAAC,KAAK,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type ImageCompressionKitErrorCode = 'ERR_INVALID_OPTIONS' | 'ERR_UNSUPPORTED_SOURCE' | 'ERR_UNSUPPORTED_FORMAT' | 'ERR_NATIVE_MODULE_UNAVAILABLE' | 'ERR_NOT_IMPLEMENTED' | 'ERR_FILE_ACCESS' | 'ERR_DECODE_FAILED' | 'ERR_ENCODE_FAILED' | 'ERR_NATIVE_OPERATION_FAILED';
2
+ export declare class ImageCompressionKitError extends Error {
3
+ readonly code: ImageCompressionKitErrorCode;
4
+ constructor(code: ImageCompressionKitErrorCode, message: string, options?: {
5
+ cause?: unknown;
6
+ });
7
+ }
8
+ export declare function normalizeNativeError(error: unknown): Error;
9
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,4BAA4B,GACpC,qBAAqB,GACrB,wBAAwB,GACxB,wBAAwB,GACxB,+BAA+B,GAC/B,qBAAqB,GACrB,iBAAiB,GACjB,mBAAmB,GACnB,mBAAmB,GACnB,6BAA6B,CAAC;AAElC,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;gBAG1C,IAAI,EAAE,4BAA4B,EAClC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAUhC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CA+B1D"}
package/lib/errors.js ADDED
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImageCompressionKitError = void 0;
4
+ exports.normalizeNativeError = normalizeNativeError;
5
+ class ImageCompressionKitError extends Error {
6
+ constructor(code, message, options) {
7
+ super(message);
8
+ this.name = 'ImageCompressionKitError';
9
+ this.code = code;
10
+ if (options && 'cause' in options) {
11
+ this.cause = options.cause;
12
+ }
13
+ }
14
+ }
15
+ exports.ImageCompressionKitError = ImageCompressionKitError;
16
+ function normalizeNativeError(error) {
17
+ if (error instanceof ImageCompressionKitError) {
18
+ return error;
19
+ }
20
+ if (error instanceof Error) {
21
+ return new ImageCompressionKitError(getNativeErrorCode(error), error.message || 'Native image compression failed.', { cause: error });
22
+ }
23
+ if (isRecord(error)) {
24
+ const message = typeof error.message === 'string'
25
+ ? error.message
26
+ : 'Native image compression failed.';
27
+ return new ImageCompressionKitError(getNativeErrorCode(error), message, { cause: error });
28
+ }
29
+ return new ImageCompressionKitError('ERR_NATIVE_OPERATION_FAILED', 'Native image compression failed.', { cause: error });
30
+ }
31
+ function isRecord(value) {
32
+ return typeof value === 'object' && value !== null;
33
+ }
34
+ function getNativeErrorCode(value) {
35
+ if (!isRecord(value) || typeof value.code !== 'string') {
36
+ return 'ERR_NATIVE_OPERATION_FAILED';
37
+ }
38
+ return isImageCompressionKitErrorCode(value.code)
39
+ ? value.code
40
+ : 'ERR_NATIVE_OPERATION_FAILED';
41
+ }
42
+ function isImageCompressionKitErrorCode(code) {
43
+ return (code === 'ERR_INVALID_OPTIONS' ||
44
+ code === 'ERR_UNSUPPORTED_SOURCE' ||
45
+ code === 'ERR_UNSUPPORTED_FORMAT' ||
46
+ code === 'ERR_NATIVE_MODULE_UNAVAILABLE' ||
47
+ code === 'ERR_NOT_IMPLEMENTED' ||
48
+ code === 'ERR_FILE_ACCESS' ||
49
+ code === 'ERR_DECODE_FAILED' ||
50
+ code === 'ERR_ENCODE_FAILED' ||
51
+ code === 'ERR_NATIVE_OPERATION_FAILED');
52
+ }
53
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AA6BA,oDA+BC;AAjDD,MAAa,wBAAyB,SAAQ,KAAK;IAGjD,YACE,IAAkC,EAClC,OAAe,EACf,OAA6B;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;YACjC,IAAoC,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9D,CAAC;IACH,CAAC;CACF;AAhBD,4DAgBC;AAED,SAAgB,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,wBAAwB,CACjC,kBAAkB,CAAC,KAAK,CAAC,EACzB,KAAK,CAAC,OAAO,IAAI,kCAAkC,EACnD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,OAAO,GACX,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;YAC/B,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,kCAAkC,CAAC;QAEzC,OAAO,IAAI,wBAAwB,CACjC,kBAAkB,CAAC,KAAK,CAAC,EACzB,OAAO,EACP,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,wBAAwB,CACjC,6BAA6B,EAC7B,kCAAkC,EAClC,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvD,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED,OAAO,8BAA8B,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/C,CAAC,CAAC,KAAK,CAAC,IAAI;QACZ,CAAC,CAAC,6BAA6B,CAAC;AACpC,CAAC;AAED,SAAS,8BAA8B,CACrC,IAAY;IAEZ,OAAO,CACL,IAAI,KAAK,qBAAqB;QAC9B,IAAI,KAAK,wBAAwB;QACjC,IAAI,KAAK,wBAAwB;QACjC,IAAI,KAAK,+BAA+B;QACxC,IAAI,KAAK,qBAAqB;QAC9B,IAAI,KAAK,iBAAiB;QAC1B,IAAI,KAAK,mBAAmB;QAC5B,IAAI,KAAK,mBAAmB;QAC5B,IAAI,KAAK,6BAA6B,CACvC,CAAC;AACJ,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { compressImage, getImageCompressionCapabilities, } from './api';
2
+ export { ImageCompressionKitError } from './errors';
3
+ export { IMAGE_FORMATS, METADATA_POLICIES, OUTPUT_FORMATS, RESIZE_MODES, } from './types';
4
+ export type { CompressionOptions, CompressionResult, CompressionSource, FormatCapability, ImageCompressionCapabilities, ImageFormat, MetadataPolicy, NormalizedCompressionOptions, OutputFormat, OutputOptions, ResizeMode, ResizeOptions, } from './types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,+BAA+B,GAChC,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,4BAA4B,EAC5B,WAAW,EACX,cAAc,EACd,4BAA4B,EAC5B,YAAY,EACZ,aAAa,EACb,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RESIZE_MODES = exports.OUTPUT_FORMATS = exports.METADATA_POLICIES = exports.IMAGE_FORMATS = exports.ImageCompressionKitError = exports.getImageCompressionCapabilities = exports.compressImage = void 0;
4
+ var api_1 = require("./api");
5
+ Object.defineProperty(exports, "compressImage", { enumerable: true, get: function () { return api_1.compressImage; } });
6
+ Object.defineProperty(exports, "getImageCompressionCapabilities", { enumerable: true, get: function () { return api_1.getImageCompressionCapabilities; } });
7
+ var errors_1 = require("./errors");
8
+ Object.defineProperty(exports, "ImageCompressionKitError", { enumerable: true, get: function () { return errors_1.ImageCompressionKitError; } });
9
+ var types_1 = require("./types");
10
+ Object.defineProperty(exports, "IMAGE_FORMATS", { enumerable: true, get: function () { return types_1.IMAGE_FORMATS; } });
11
+ Object.defineProperty(exports, "METADATA_POLICIES", { enumerable: true, get: function () { return types_1.METADATA_POLICIES; } });
12
+ Object.defineProperty(exports, "OUTPUT_FORMATS", { enumerable: true, get: function () { return types_1.OUTPUT_FORMATS; } });
13
+ Object.defineProperty(exports, "RESIZE_MODES", { enumerable: true, get: function () { return types_1.RESIZE_MODES; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,6BAGe;AAFb,oGAAA,aAAa,OAAA;AACb,sHAAA,+BAA+B,OAAA;AAEjC,mCAAoD;AAA3C,kHAAA,wBAAwB,OAAA;AACjC,iCAKiB;AAJf,sGAAA,aAAa,OAAA;AACb,0GAAA,iBAAiB,OAAA;AACjB,uGAAA,cAAc,OAAA;AACd,qGAAA,YAAY,OAAA"}
@@ -0,0 +1,7 @@
1
+ import type { Spec as NativeImageCompressionKitSpec } from './NativeImageCompressionKit';
2
+ export declare const NATIVE_MODULE_NAME = "ImageCompressionKit";
3
+ export type NativeImageCompressionKitModule = NativeImageCompressionKitSpec;
4
+ export declare function getNativeModule(): NativeImageCompressionKitModule;
5
+ export declare function setNativeModuleForTesting(nativeModule: NativeImageCompressionKitModule | null): void;
6
+ export declare function resetNativeModuleForTesting(): void;
7
+ //# sourceMappingURL=nativeModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeModule.d.ts","sourceRoot":"","sources":["../src/nativeModule.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,IAAI,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAOzF,eAAO,MAAM,kBAAkB,wBAAwB,CAAC;AAExD,MAAM,MAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAwB5E,wBAAgB,eAAe,IAAI,+BAA+B,CAcjE;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,+BAA+B,GAAG,IAAI,GACnD,IAAI,CAEN;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NATIVE_MODULE_NAME = void 0;
4
+ exports.getNativeModule = getNativeModule;
5
+ exports.setNativeModuleForTesting = setNativeModuleForTesting;
6
+ exports.resetNativeModuleForTesting = resetNativeModuleForTesting;
7
+ const errors_1 = require("./errors");
8
+ exports.NATIVE_MODULE_NAME = 'ImageCompressionKit';
9
+ const _nativeModuleContractCheck = true;
10
+ let testNativeModule;
11
+ function getNativeModule() {
12
+ const nativeModule = testNativeModule !== undefined
13
+ ? testNativeModule
14
+ : resolveNativeModuleFromReactNative();
15
+ if (nativeModule) {
16
+ return nativeModule;
17
+ }
18
+ throw new errors_1.ImageCompressionKitError('ERR_NATIVE_MODULE_UNAVAILABLE', `Native module ${exports.NATIVE_MODULE_NAME} is unavailable. The TypeScript API is scaffolded, but Android and iOS implementations have not been added yet.`);
19
+ }
20
+ function setNativeModuleForTesting(nativeModule) {
21
+ testNativeModule = nativeModule;
22
+ }
23
+ function resetNativeModuleForTesting() {
24
+ testNativeModule = undefined;
25
+ }
26
+ function resolveNativeModuleFromReactNative() {
27
+ const codegenModule = resolveNativeModuleFromCodegenSpec();
28
+ if (codegenModule) {
29
+ return codegenModule;
30
+ }
31
+ const reactNative = loadReactNativeRuntime();
32
+ const turboModule = reactNative?.TurboModuleRegistry?.get?.(exports.NATIVE_MODULE_NAME);
33
+ if (isNativeModule(turboModule)) {
34
+ return turboModule;
35
+ }
36
+ const legacyModule = reactNative?.NativeModules?.[exports.NATIVE_MODULE_NAME];
37
+ if (isNativeModule(legacyModule)) {
38
+ return legacyModule;
39
+ }
40
+ return null;
41
+ }
42
+ function resolveNativeModuleFromCodegenSpec() {
43
+ if (typeof require !== 'function') {
44
+ return null;
45
+ }
46
+ try {
47
+ const codegenSpec = require('./NativeImageCompressionKit');
48
+ return isNativeModule(codegenSpec.default) ? codegenSpec.default : null;
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ function loadReactNativeRuntime() {
55
+ if (typeof require !== 'function') {
56
+ return null;
57
+ }
58
+ try {
59
+ return require('react-native');
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ function isNativeModule(value) {
66
+ return (typeof value === 'object' &&
67
+ value !== null &&
68
+ typeof value.compressImage ===
69
+ 'function' &&
70
+ typeof value
71
+ .getImageCompressionCapabilities === 'function');
72
+ }
73
+ //# sourceMappingURL=nativeModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeModule.js","sourceRoot":"","sources":["../src/nativeModule.ts"],"names":[],"mappings":";;;AAkCA,0CAcC;AAED,8DAIC;AAED,kEAEC;AA1DD,qCAAoD;AAQvC,QAAA,kBAAkB,GAAG,qBAAqB,CAAC;AAWxD,MAAM,0BAA0B,GAEpB,IAAI,CAAC;AAWjB,IAAI,gBAAoE,CAAC;AAEzE,SAAgB,eAAe;IAC7B,MAAM,YAAY,GAChB,gBAAgB,KAAK,SAAS;QAC5B,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,kCAAkC,EAAE,CAAC;IAE3C,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,iCAAwB,CAChC,+BAA+B,EAC/B,iBAAiB,0BAAkB,iHAAiH,CACrJ,CAAC;AACJ,CAAC;AAED,SAAgB,yBAAyB,CACvC,YAAoD;IAEpD,gBAAgB,GAAG,YAAY,CAAC;AAClC,CAAC;AAED,SAAgB,2BAA2B;IACzC,gBAAgB,GAAG,SAAS,CAAC;AAC/B,CAAC;AAED,SAAS,kCAAkC;IAGzC,MAAM,aAAa,GAAG,kCAAkC,EAAE,CAAC;IAE3D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,WAAW,GAAG,sBAAsB,EAAE,CAAC;IAE7C,MAAM,WAAW,GAAG,WAAW,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAEzD,0BAAkB,CAAC,CAAC;IAEtB,IAAI,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,EAAE,aAAa,EAAE,CAAC,0BAAkB,CAAC,CAAC;IAEtE,IAAI,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kCAAkC;IAGzC,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,OAAO,CAAC,6BAA6B,CAExD,CAAC;QAEF,OAAO,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB;IAC7B,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,cAAc,CAAuB,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,KAAc;IAEd,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAAyC,CAAC,aAAa;YAC7D,UAAU;QACZ,OAAQ,KAAyC;aAC9C,+BAA+B,KAAK,UAAU,CAClD,CAAC;AACJ,CAAC"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,59 @@
1
+ export declare const IMAGE_FORMATS: readonly ["jpeg", "png", "webp", "heic", "heif", "avif", "gif"];
2
+ export declare const OUTPUT_FORMATS: readonly ["jpeg", "png", "webp", "heic", "heif", "avif"];
3
+ export declare const METADATA_POLICIES: readonly ["preserve", "safe", "strip"];
4
+ export declare const RESIZE_MODES: readonly ["contain", "cover", "stretch"];
5
+ export type ImageFormat = (typeof IMAGE_FORMATS)[number];
6
+ export type OutputFormat = (typeof OUTPUT_FORMATS)[number];
7
+ export type MetadataPolicy = (typeof METADATA_POLICIES)[number];
8
+ export type ResizeMode = (typeof RESIZE_MODES)[number];
9
+ export interface CompressionSource {
10
+ uri: string;
11
+ }
12
+ export interface ResizeOptions {
13
+ maxWidth?: number;
14
+ maxHeight?: number;
15
+ mode?: ResizeMode;
16
+ }
17
+ export interface OutputOptions {
18
+ format: OutputFormat;
19
+ quality?: number;
20
+ maxBytes?: number;
21
+ }
22
+ export interface CompressionOptions {
23
+ source: CompressionSource;
24
+ resize?: ResizeOptions;
25
+ output: OutputOptions;
26
+ metadata?: MetadataPolicy;
27
+ }
28
+ export interface NormalizedResizeOptions extends Omit<ResizeOptions, 'mode'> {
29
+ mode: ResizeMode;
30
+ }
31
+ export interface NormalizedCompressionOptions extends Omit<CompressionOptions, 'metadata' | 'resize'> {
32
+ metadata: MetadataPolicy;
33
+ resize?: NormalizedResizeOptions;
34
+ }
35
+ export interface CompressionResult {
36
+ uri: string;
37
+ format: OutputFormat;
38
+ width: number;
39
+ height: number;
40
+ byteSize: number;
41
+ originalByteSize: number;
42
+ compressionRatio: number;
43
+ }
44
+ export interface FormatCapability {
45
+ format: ImageFormat;
46
+ input: boolean;
47
+ output: boolean;
48
+ supportsAlpha: boolean;
49
+ supportsAnimation: boolean;
50
+ notes?: string[];
51
+ }
52
+ export interface ImageCompressionCapabilities {
53
+ platform: 'android' | 'ios' | 'unknown';
54
+ formats: FormatCapability[];
55
+ metadataPolicies: MetadataPolicy[];
56
+ supportsTargetSizeCompression: boolean;
57
+ supportsCancellation: boolean;
58
+ }
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,iEAQhB,CAAC;AAEX,eAAO,MAAM,cAAc,0DAOjB,CAAC;AAEX,eAAO,MAAM,iBAAiB,wCAAyC,CAAC;AAExE,eAAO,MAAM,YAAY,0CAA2C,CAAC;AAErE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,uBACf,SAAQ,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC;IACnC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,4BACf,SAAQ,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC;IACvD,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,uBAAuB,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;IACxC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,6BAA6B,EAAE,OAAO,CAAC;IACvC,oBAAoB,EAAE,OAAO,CAAC;CAC/B"}
package/lib/types.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RESIZE_MODES = exports.METADATA_POLICIES = exports.OUTPUT_FORMATS = exports.IMAGE_FORMATS = void 0;
4
+ exports.IMAGE_FORMATS = [
5
+ 'jpeg',
6
+ 'png',
7
+ 'webp',
8
+ 'heic',
9
+ 'heif',
10
+ 'avif',
11
+ 'gif',
12
+ ];
13
+ exports.OUTPUT_FORMATS = [
14
+ 'jpeg',
15
+ 'png',
16
+ 'webp',
17
+ 'heic',
18
+ 'heif',
19
+ 'avif',
20
+ ];
21
+ exports.METADATA_POLICIES = ['preserve', 'safe', 'strip'];
22
+ exports.RESIZE_MODES = ['contain', 'cover', 'stretch'];
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG;IAC3B,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;CACG,CAAC;AAEE,QAAA,cAAc,GAAG;IAC5B,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACE,CAAC;AAEE,QAAA,iBAAiB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAE3D,QAAA,YAAY,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type CompressionOptions, type NormalizedCompressionOptions } from './types';
2
+ export declare function normalizeCompressionOptions(options: CompressionOptions): NormalizedCompressionOptions;
3
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,kBAAkB,EAEvB,KAAK,4BAA4B,EAGlC,MAAM,SAAS,CAAC;AAGjB,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,kBAAkB,GAC1B,4BAA4B,CAwG9B"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeCompressionOptions = normalizeCompressionOptions;
4
+ const types_1 = require("./types");
5
+ const errors_1 = require("./errors");
6
+ function normalizeCompressionOptions(options) {
7
+ if (!isRecord(options)) {
8
+ throw invalidOptions('Compression options must be an object.');
9
+ }
10
+ const source = options.source;
11
+ if (!isRecord(source)) {
12
+ throw invalidOptions('Compression source must be an object.');
13
+ }
14
+ const uri = source.uri;
15
+ if (typeof uri !== 'string' || uri.trim().length === 0) {
16
+ throw invalidOptions('Compression source.uri must be a non-empty string.');
17
+ }
18
+ if (isRemoteOrInlineUri(uri)) {
19
+ throw new errors_1.ImageCompressionKitError('ERR_UNSUPPORTED_SOURCE', 'Compression source.uri must point to a local image. Remote URLs and inline data URIs are outside this package scope.');
20
+ }
21
+ if (!isRecord(options.output)) {
22
+ throw invalidOptions('Compression output must be an object.');
23
+ }
24
+ const format = options.output.format;
25
+ if (!isOutputFormat(format)) {
26
+ throw invalidOptions(`Compression output.format must be one of: ${types_1.OUTPUT_FORMATS.join(', ')}.`);
27
+ }
28
+ const output = { format };
29
+ if (options.output.quality !== undefined) {
30
+ assertIntegerInRange(options.output.quality, 'Compression output.quality', 0, 100);
31
+ output.quality = options.output.quality;
32
+ }
33
+ if (options.output.maxBytes !== undefined) {
34
+ assertPositiveInteger(options.output.maxBytes, 'Compression output.maxBytes');
35
+ output.maxBytes = options.output.maxBytes;
36
+ }
37
+ const metadata = options.metadata ?? 'safe';
38
+ if (!isMetadataPolicy(metadata)) {
39
+ throw invalidOptions(`Compression metadata must be one of: ${types_1.METADATA_POLICIES.join(', ')}.`);
40
+ }
41
+ const normalized = {
42
+ source: { uri },
43
+ output,
44
+ metadata,
45
+ };
46
+ if (options.resize !== undefined) {
47
+ if (!isRecord(options.resize)) {
48
+ throw invalidOptions('Compression resize must be an object.');
49
+ }
50
+ const { maxWidth, maxHeight } = options.resize;
51
+ if (maxWidth === undefined && maxHeight === undefined) {
52
+ throw invalidOptions('Compression resize must include maxWidth, maxHeight, or both.');
53
+ }
54
+ if (maxWidth !== undefined) {
55
+ assertPositiveInteger(maxWidth, 'Compression resize.maxWidth');
56
+ }
57
+ if (maxHeight !== undefined) {
58
+ assertPositiveInteger(maxHeight, 'Compression resize.maxHeight');
59
+ }
60
+ const mode = options.resize.mode ?? 'contain';
61
+ if (!isResizeMode(mode)) {
62
+ throw invalidOptions(`Compression resize.mode must be one of: ${types_1.RESIZE_MODES.join(', ')}.`);
63
+ }
64
+ normalized.resize = {
65
+ ...(maxWidth !== undefined ? { maxWidth } : {}),
66
+ ...(maxHeight !== undefined ? { maxHeight } : {}),
67
+ mode,
68
+ };
69
+ }
70
+ return normalized;
71
+ }
72
+ function invalidOptions(message) {
73
+ return new errors_1.ImageCompressionKitError('ERR_INVALID_OPTIONS', message);
74
+ }
75
+ function isRecord(value) {
76
+ return typeof value === 'object' && value !== null;
77
+ }
78
+ function isOutputFormat(value) {
79
+ return (typeof value === 'string' &&
80
+ types_1.OUTPUT_FORMATS.includes(value));
81
+ }
82
+ function isMetadataPolicy(value) {
83
+ return (typeof value === 'string' &&
84
+ types_1.METADATA_POLICIES.includes(value));
85
+ }
86
+ function isResizeMode(value) {
87
+ return (typeof value === 'string' &&
88
+ types_1.RESIZE_MODES.includes(value));
89
+ }
90
+ function isRemoteOrInlineUri(uri) {
91
+ return /^(https?:|data:)/i.test(uri.trim());
92
+ }
93
+ function assertIntegerInRange(value, label, min, max) {
94
+ if (typeof value !== 'number' ||
95
+ !Number.isInteger(value) ||
96
+ value < min ||
97
+ value > max) {
98
+ throw invalidOptions(`${label} must be an integer from ${min} to ${max}.`);
99
+ }
100
+ }
101
+ function assertPositiveInteger(value, label) {
102
+ if (typeof value !== 'number' ||
103
+ !Number.isInteger(value) ||
104
+ value <= 0) {
105
+ throw invalidOptions(`${label} must be a positive integer.`);
106
+ }
107
+ }
108
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}