@kesbyte/capacitor-exif-gallery 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.
- package/CapacitorExifGallery.podspec +17 -0
- package/LICENSE +8 -0
- package/Package.swift +28 -0
- package/README.md +813 -0
- package/dist/esm/ExifGalleryImpl.d.ts +176 -0
- package/dist/esm/ExifGalleryImpl.js +295 -0
- package/dist/esm/ExifGalleryImpl.js.map +1 -0
- package/dist/esm/FilterValidator.d.ts +126 -0
- package/dist/esm/FilterValidator.js +274 -0
- package/dist/esm/FilterValidator.js.map +1 -0
- package/dist/esm/PluginState.d.ts +128 -0
- package/dist/esm/PluginState.js +166 -0
- package/dist/esm/PluginState.js.map +1 -0
- package/dist/esm/PolylineDecoder.d.ts +23 -0
- package/dist/esm/PolylineDecoder.js +34 -0
- package/dist/esm/PolylineDecoder.js.map +1 -0
- package/dist/esm/TranslationLoader.d.ts +140 -0
- package/dist/esm/TranslationLoader.js +218 -0
- package/dist/esm/TranslationLoader.js.map +1 -0
- package/dist/esm/definitions.d.ts +539 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/errors.d.ts +252 -0
- package/dist/esm/errors.js +276 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +40 -0
- package/dist/esm/index.js +42 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/translations/de.json +20 -0
- package/dist/esm/translations/en.json +20 -0
- package/dist/esm/translations/es.json +20 -0
- package/dist/esm/translations/fr.json +20 -0
- package/dist/esm/web.d.ts +6 -0
- package/dist/esm/web.js +14 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +1820 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +1823 -0
- package/dist/plugin.js.map +1 -0
- package/package.json +121 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["../node_modules/@mapbox/polyline/src/polyline.js","esm/PolylineDecoder.js","esm/errors.js","esm/FilterValidator.js","esm/PluginState.js","../node_modules/@capacitor/device/dist/esm/index.js","esm/TranslationLoader.js","esm/ExifGalleryImpl.js","esm/index.js","../node_modules/@capacitor/device/dist/esm/web.js","esm/web.js"],"sourcesContent":["'use strict';\n\n/**\n * Based off of [the offical Google document](https://developers.google.com/maps/documentation/utilities/polylinealgorithm)\n *\n * Some parts from [this implementation](http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/PolylineEncoder.js)\n * by [Mark McClure](http://facstaff.unca.edu/mcmcclur/)\n *\n * @module polyline\n */\n\nvar polyline = {};\n\nfunction py2_round(value) {\n // Google's polyline algorithm uses the same rounding strategy as Python 2, which is different from JS for negative values\n return Math.floor(Math.abs(value) + 0.5) * (value >= 0 ? 1 : -1);\n}\n\nfunction encode(current, previous, factor) {\n current = py2_round(current * factor);\n previous = py2_round(previous * factor);\n var coordinate = (current - previous) * 2;\n if (coordinate < 0) {\n coordinate = -coordinate - 1\n }\n var output = '';\n while (coordinate >= 0x20) {\n output += String.fromCharCode((0x20 | (coordinate & 0x1f)) + 63);\n coordinate /= 32;\n }\n output += String.fromCharCode((coordinate | 0) + 63);\n return output;\n}\n\n/**\n * Decodes to a [latitude, longitude] coordinates array.\n *\n * This is adapted from the implementation in Project-OSRM.\n *\n * @param {String} str\n * @param {Number} precision\n * @returns {Array}\n *\n * @see https://github.com/Project-OSRM/osrm-frontend/blob/master/WebContent/routing/OSRM.RoutingGeometry.js\n */\npolyline.decode = function(str, precision) {\n var index = 0,\n lat = 0,\n lng = 0,\n coordinates = [],\n shift = 0,\n result = 0,\n byte = null,\n latitude_change,\n longitude_change,\n factor = Math.pow(10, Number.isInteger(precision) ? precision : 5);\n\n // Coordinates have variable length when encoded, so just keep\n // track of whether we've hit the end of the string. In each\n // loop iteration, a single coordinate is decoded.\n while (index < str.length) {\n\n // Reset shift, result, and byte\n byte = null;\n shift = 1;\n result = 0;\n\n do {\n byte = str.charCodeAt(index++) - 63;\n result += (byte & 0x1f) * shift;\n shift *= 32;\n } while (byte >= 0x20);\n\n latitude_change = (result & 1) ? ((-result - 1) / 2) : (result / 2);\n\n shift = 1;\n result = 0;\n\n do {\n byte = str.charCodeAt(index++) - 63;\n result += (byte & 0x1f) * shift;\n shift *= 32;\n } while (byte >= 0x20);\n\n longitude_change = (result & 1) ? ((-result - 1) / 2) : (result / 2);\n\n lat += latitude_change;\n lng += longitude_change;\n\n coordinates.push([lat / factor, lng / factor]);\n }\n\n return coordinates;\n};\n\n/**\n * Encodes the given [latitude, longitude] coordinates array.\n *\n * @param {Array.<Array.<Number>>} coordinates\n * @param {Number} precision\n * @returns {String}\n */\npolyline.encode = function(coordinates, precision) {\n if (!coordinates.length) { return ''; }\n\n var factor = Math.pow(10, Number.isInteger(precision) ? precision : 5),\n output = encode(coordinates[0][0], 0, factor) + encode(coordinates[0][1], 0, factor);\n\n for (var i = 1; i < coordinates.length; i++) {\n var a = coordinates[i], b = coordinates[i - 1];\n output += encode(a[0], b[0], factor);\n output += encode(a[1], b[1], factor);\n }\n\n return output;\n};\n\nfunction flipped(coords) {\n var flipped = [];\n for (var i = 0; i < coords.length; i++) {\n var coord = coords[i].slice();\n flipped.push([coord[1], coord[0]]);\n }\n return flipped;\n}\n\n/**\n * Encodes a GeoJSON LineString feature/geometry.\n *\n * @param {Object} geojson\n * @param {Number} precision\n * @returns {String}\n */\npolyline.fromGeoJSON = function(geojson, precision) {\n if (geojson && geojson.type === 'Feature') {\n geojson = geojson.geometry;\n }\n if (!geojson || geojson.type !== 'LineString') {\n throw new Error('Input must be a GeoJSON LineString');\n }\n return polyline.encode(flipped(geojson.coordinates), precision);\n};\n\n/**\n * Decodes to a GeoJSON LineString geometry.\n *\n * @param {String} str\n * @param {Number} precision\n * @returns {Object}\n */\npolyline.toGeoJSON = function(str, precision) {\n var coords = polyline.decode(str, precision);\n return {\n type: 'LineString',\n coordinates: flipped(coords)\n };\n};\n\nif (typeof module === 'object' && module.exports) {\n module.exports = polyline;\n}\n","import * as polyline from '@mapbox/polyline';\n/**\n * Decodes Google's Encoded Polyline format to coordinate array.\n *\n * Algorithm: https://developers.google.com/maps/documentation/utilities/polylinealgorithm\n *\n * Precision: Uses precision 5 (Google Maps default, ±1 meter accuracy).\n * Higher precision polylines (precision 6+) are also supported automatically.\n *\n * @param encoded - Encoded polyline string (e.g., \"_p~iF~ps|U_ulLnnqC\")\n * @returns Array of LatLng coordinates\n * @throws Error if encoded string is malformed or exceeds limits\n *\n * @example\n * const coords = PolylineDecoder.decode(\"_p~iF~ps|U_ulLnnqC\");\n * // Returns: [{ lat: 38.5, lng: -120.2 }, { lat: 40.7, lng: -120.95 }, ...]\n */\nexport class PolylineDecoder {\n /**\n * Decodes an encoded polyline string to LatLng coordinate array.\n */\n static decode(encoded) {\n try {\n // polyline package returns array of [lat, lng] coordinate pairs\n const decoded = polyline.decode(encoded);\n // Convert to LatLng objects\n return decoded.map(([lat, lng]) => ({ lat, lng }));\n }\n catch (error) {\n throw new Error(`Failed to decode polyline: ${error.message}`);\n }\n }\n}\n//# sourceMappingURL=PolylineDecoder.js.map","/**\n * Error types thrown by the ExifGallery Plugin.\n *\n * All errors extend ExifGalleryError for easy type checking.\n * Each error has a unique code for programmatic handling.\n *\n * @example\n * ```typescript\n * import { ExifGallery, InitializationRequiredError, NoPermissionError } from '@kesbyte/capacitor-exif-gallery';\n *\n * try {\n * const result = await ExifGallery.pick();\n * } catch (error) {\n * if (error instanceof InitializationRequiredError) {\n * // Plugin not initialized - call initialize() first\n * await ExifGallery.initialize();\n * // Retry pick()\n * const result = await ExifGallery.pick();\n * } else if (error instanceof NoPermissionError) {\n * // User denied permissions - show explanation and retry\n * alert('Photo access required to select images');\n * } else if (error instanceof FilterError) {\n * // Invalid filter parameters - fix and retry\n * console.error('Invalid filter:', error.message);\n * }\n * }\n * ```\n */\n/**\n * Base class for all ExifGallery Plugin errors.\n *\n * @example\n * ```typescript\n * try {\n * await ExifGallery.pick();\n * } catch (error) {\n * if (error instanceof ExifGalleryError) {\n * console.error(`Plugin error [${error.code}]:`, error.message);\n * }\n * }\n * ```\n */\nexport class ExifGalleryError extends Error {\n constructor(code, message) {\n super(message);\n this.code = code;\n this.name = this.constructor.name;\n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n // V8 engines (Chrome, Node.js)\n Error.captureStackTrace(this, this.constructor);\n }\n else {\n // Safari, Firefox fallback\n this.stack = new Error().stack;\n }\n }\n}\n/**\n * Thrown when pick() is called before initialize().\n *\n * **Resolution:** Call initialize() before calling pick().\n *\n * @example\n * ```typescript\n * import { ExifGallery, InitializationRequiredError } from '@kesbyte/capacitor-exif-gallery';\n *\n * try {\n * // ERROR: calling pick() without initialize()\n * const result = await ExifGallery.pick();\n * } catch (error) {\n * if (error instanceof InitializationRequiredError) {\n * // Fix: Initialize plugin first\n * await ExifGallery.initialize();\n * // Retry pick()\n * const result = await ExifGallery.pick();\n * }\n * }\n * ```\n */\nexport class InitializationRequiredError extends ExifGalleryError {\n constructor(message = 'Plugin must be initialized before calling pick()') {\n super('initialization_required', message);\n }\n}\n/**\n * Thrown when pick() is called while another picker is already in progress.\n *\n * **Resolution:** Wait for the first pick() to complete before calling again.\n *\n * @example\n * ```typescript\n * import { ExifGallery, PickerInProgressError } from '@kesbyte/capacitor-exif-gallery';\n *\n * // Track picker state\n * let isPickerOpen = false;\n *\n * async function selectImages() {\n * if (isPickerOpen) {\n * console.log('Picker already open');\n * return;\n * }\n *\n * try {\n * isPickerOpen = true;\n * const result = await ExifGallery.pick();\n * // Handle result...\n * } catch (error) {\n * if (error instanceof PickerInProgressError) {\n * console.log('Another picker is open, please wait');\n * }\n * } finally {\n * isPickerOpen = false;\n * }\n * }\n * ```\n */\nexport class PickerInProgressError extends ExifGalleryError {\n constructor(message = 'Cannot open picker while another picker is in progress') {\n super('picker_in_progress', message);\n }\n}\n/**\n * Thrown when user denies photo library or location permissions.\n *\n * **Resolution:**\n * - Check `permissionType` to show specific guidance\n * - Explain why permission is needed\n * - Guide user to Settings to enable permission\n * - Request permission again on next attempt\n *\n * @example\n * ```typescript\n * import { ExifGallery, NoPermissionError } from '@kesbyte/capacitor-exif-gallery';\n *\n * try {\n * const result = await ExifGallery.pick({\n * filter: {\n * location: {\n * coordinates: [{ lat: 48.8566, lng: 2.3522 }],\n * radius: 500\n * }\n * }\n * });\n * } catch (error) {\n * if (error instanceof NoPermissionError) {\n * // Show context-specific guidance\n * if (error.permissionType === 'photo_library') {\n * await showPermissionDialog(\n * 'Photo Access Required',\n * 'This app needs access to your photos to let you select images. ' +\n * 'Please enable photo access in Settings.'\n * );\n * } else if (error.permissionType === 'location') {\n * await showPermissionDialog(\n * 'Location Access Required',\n * 'This app needs location access to filter photos by location. ' +\n * 'Please enable location access in Settings.'\n * );\n * }\n * }\n * }\n * ```\n */\nexport class NoPermissionError extends ExifGalleryError {\n constructor(permissionType = 'photo_library', message) {\n const defaultMessage = permissionType === 'photo_library' ? 'Photo library permission denied' : 'Location permission denied';\n super('no_permission', message !== null && message !== void 0 ? message : defaultMessage);\n this.permissionType = permissionType;\n }\n}\n/**\n * Thrown when filter parameters are invalid.\n *\n * **Common causes:**\n * - Empty coordinates/polyline arrays\n * - Invalid LatLng coordinates (out of bounds)\n * - Negative or zero radius\n * - Invalid date range (end before start)\n * - Infinite or NaN numeric values\n * - Arrays exceeding size limits\n *\n * **Resolution:** Fix the filter parameters based on the error message.\n *\n * @example\n * ```typescript\n * import { ExifGallery, FilterError } from '@kesbyte/capacitor-exif-gallery';\n *\n * try {\n * const result = await ExifGallery.pick({\n * filter: {\n * location: {\n * coordinates: [], // ERROR: empty array\n * radius: -100 // ERROR: negative radius\n * }\n * }\n * });\n * } catch (error) {\n * if (error instanceof FilterError) {\n * // error.message contains specific validation error\n * console.error('Invalid filter:', error.message);\n *\n * // Fix and retry\n * const result = await ExifGallery.pick({\n * filter: {\n * location: {\n * coordinates: [{ lat: 48.8566, lng: 2.3522 }], // Fixed\n * radius: 500 // Fixed\n * }\n * }\n * });\n * }\n * }\n *\n * // Validation errors include details:\n * // - \"coordinates must contain at least one coordinate\"\n * // - \"radius must be greater than 0\"\n * // - \"polyline[2] is not a valid LatLng coordinate\"\n * // - \"timeRange.start must be before timeRange.end\"\n * ```\n */\nexport class FilterError extends ExifGalleryError {\n constructor(message) {\n // Validate message parameter\n if (typeof message !== 'string') {\n throw new TypeError('FilterError requires a string message, got ' + typeof message);\n }\n // Remove 'filter_error: ' prefix if present for cleaner message\n const cleanMessage = message.replace(/^filter_error:\\s*/, '').trim();\n // Ensure we have a meaningful message after cleanup\n if (!cleanMessage) {\n super('filter_error', 'Invalid filter parameters');\n // Warn about empty message in development\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('FilterError created with empty message. Original:', message);\n }\n }\n else {\n super('filter_error', cleanMessage);\n }\n }\n}\n/**\n * Thrown when native platform operation fails.\n *\n * **Common causes:**\n * - Native gallery UI failed to open\n * - Device storage access error\n * - Out of memory\n * - Platform-specific errors\n *\n * **Resolution:** Check error message for platform-specific details.\n *\n * @example\n * ```typescript\n * import { ExifGallery, NativeError } from '@kesbyte/capacitor-exif-gallery';\n *\n * try {\n * const result = await ExifGallery.pick();\n * } catch (error) {\n * if (error instanceof NativeError) {\n * // Log platform-specific error for debugging\n * console.error('Native error:', error.message);\n *\n * // Show user-friendly message\n * alert('Unable to open photo gallery. Please try again.');\n * }\n * }\n * ```\n */\nexport class NativeError extends ExifGalleryError {\n constructor(message = 'Native platform operation failed') {\n super('native_error', message);\n }\n}\n//# sourceMappingURL=errors.js.map","import { PolylineDecoder } from './PolylineDecoder';\nimport { FilterError } from './errors';\n/**\n * Validation utilities for filter parameters.\n *\n * Ensures filter configurations are valid before passing to native layers.\n *\n * @internal\n */\nexport class FilterValidator {\n /**\n * Validate that an object is a valid LatLng coordinate.\n *\n * Valid coordinates must have:\n * - lat: number between -90 and 90\n * - lng: number between -180 and 180\n *\n * @param obj - Object to validate\n * @returns True if valid LatLng\n *\n * @example\n * ```typescript\n * isValidLatLng({ lat: 48.8566, lng: 2.3522 }); // true\n * isValidLatLng({ lat: 200, lng: 0 }); // false (lat out of range)\n * isValidLatLng({ lat: 0 }); // false (missing lng)\n * ```\n */\n static isValidLatLng(obj) {\n return (obj !== null &&\n obj !== undefined &&\n typeof obj === 'object' &&\n typeof obj.lat === 'number' &&\n typeof obj.lng === 'number' &&\n !isNaN(obj.lat) &&\n !isNaN(obj.lng) &&\n obj.lat >= -90 &&\n obj.lat <= 90 &&\n obj.lng >= -180 &&\n obj.lng <= 180);\n }\n /**\n * Validate location filter configuration.\n *\n * Valid location filter must have:\n * - Either polyline OR coordinates array (not both)\n * - polyline/coordinates must be non-empty array of valid LatLng\n * - radius must be > 0 if provided\n *\n * ⚠️ **MUTATION WARNING:** If polyline is provided as an encoded string,\n * it will be decoded and replaced with a LatLng[] array in-place.\n * This is an optimization to prevent double-decoding. If you need to\n * preserve the original filter object, pass a deep copy.\n *\n * @mutates locationFilter.polyline - Replaces encoded string with decoded LatLng[]\n * @param locationFilter - Location filter to validate\n * @throws {Error} If validation fails\n *\n * @example\n * ```typescript\n * // Valid - coordinate array\n * validateLocationFilter({\n * coordinates: [{ lat: 48.8566, lng: 2.3522 }],\n * radius: 500\n * });\n *\n * // Valid - encoded polyline (will be decoded in-place)\n * const filter = { polyline: \"_p~iF~ps|U_ulLnnqC\", radius: 1000 };\n * validateLocationFilter(filter);\n * // Note: filter.polyline is now LatLng[] (not string)\n *\n * // Invalid: empty coordinates array\n * validateLocationFilter({ coordinates: [] }); // throws\n *\n * // Invalid: negative radius\n * validateLocationFilter({ coordinates: [...], radius: -1 }); // throws\n * ```\n */\n static validateLocationFilter(locationFilter) {\n const { polyline, coordinates, radius } = locationFilter;\n // Check for presence (excluding null/undefined but allowing empty string for better error message)\n const hasPolyline = polyline !== null && polyline !== undefined;\n const hasCoordinates = coordinates !== null && coordinates !== undefined;\n // At least one of polyline or coordinates must be present\n if (!hasPolyline && !hasCoordinates) {\n throw new FilterError('LocationFilter must have either polyline or coordinates');\n }\n // Cannot have both polyline and coordinates\n if (hasPolyline && hasCoordinates) {\n throw new FilterError('LocationFilter cannot have both polyline and coordinates');\n }\n // Validate polyline if present\n if (polyline !== undefined && polyline !== null) {\n let decodedPolyline;\n // Type guard: Check if polyline is string, array, or invalid type\n if (typeof polyline === 'string') {\n // Encoded polyline string - decode it\n // Check for empty or whitespace-only strings FIRST (before length check)\n const trimmed = polyline.trim();\n if (trimmed === '') {\n throw new FilterError('encoded polyline string cannot be empty');\n }\n // Check max string length (DoS protection)\n if (polyline.length > 51200) {\n // 50 KB limit\n throw new FilterError('encoded polyline string exceeds 50KB limit. ' + 'Use a simplified polyline or reduce precision.');\n }\n // Decode encoded polyline\n try {\n decodedPolyline = PolylineDecoder.decode(trimmed);\n }\n catch (error) {\n throw new FilterError(`Invalid encoded polyline: ${error.message}. ` +\n `Expected Google Encoded Polyline format (e.g., \"_p~iF~ps|U_ulLnnqC\"). ` +\n `See: https://developers.google.com/maps/documentation/utilities/polylinealgorithm`);\n }\n // Replace string with decoded array for downstream processing\n // This ensures native layers always receive coordinate arrays\n locationFilter.polyline = decodedPolyline;\n }\n else if (Array.isArray(polyline)) {\n // Already a coordinate array - use as-is\n decodedPolyline = polyline;\n }\n else {\n // Invalid type (not string or array)\n throw new FilterError('polyline must be a string (encoded polyline) or array of LatLng coordinates. ' +\n `Received: ${typeof polyline}`);\n }\n // Validate decoded polyline structure\n if (decodedPolyline.length === 0) {\n throw new FilterError('decoded polyline is empty');\n }\n if (decodedPolyline.length < 2) {\n throw new FilterError('polyline must contain at least 2 coordinates to define a path');\n }\n if (decodedPolyline.length > 1000) {\n throw new FilterError(`polyline contains ${decodedPolyline.length} points, maximum is 1,000. ` +\n `Use a simplified polyline or reduce precision.`);\n }\n // Validate each coordinate\n for (let i = 0; i < decodedPolyline.length; i++) {\n if (!this.isValidLatLng(decodedPolyline[i])) {\n throw new FilterError(`polyline[${i}] is not a valid LatLng coordinate`);\n }\n }\n }\n // Validate coordinates if present\n if (coordinates) {\n if (!Array.isArray(coordinates)) {\n throw new FilterError('coordinates must be an array');\n }\n if (coordinates.length === 0) {\n throw new FilterError('coordinates must contain at least one coordinate');\n }\n // Prevent DoS via huge coordinates arrays (max 1000 points)\n if (coordinates.length > 1000) {\n throw new FilterError('coordinates must not exceed 1,000 points');\n }\n for (let i = 0; i < coordinates.length; i++) {\n if (!this.isValidLatLng(coordinates[i])) {\n throw new FilterError(`coordinates[${i}] is not a valid LatLng coordinate`);\n }\n }\n }\n // Validate radius if present\n if (radius !== undefined) {\n if (typeof radius !== 'number' || !isFinite(radius)) {\n throw new FilterError('radius must be a finite number');\n }\n if (radius <= 0) {\n throw new FilterError('radius must be greater than 0');\n }\n // Prevent unreasonably large radius (50km = 50,000 meters)\n if (radius > 50000) {\n throw new FilterError('radius must not exceed 50,000 meters (50km)');\n }\n }\n }\n /**\n * Validate time range filter configuration.\n *\n * Valid time range must have:\n * - start and end as Date objects\n * - start must be before end\n *\n * @param timeRange - Time range filter to validate\n * @throws {Error} If validation fails\n *\n * @example\n * ```typescript\n * // Valid\n * validateTimeRangeFilter({\n * start: new Date('2024-01-01'),\n * end: new Date('2024-12-31')\n * });\n *\n * // Invalid: end before start\n * validateTimeRangeFilter({\n * start: new Date('2024-12-31'),\n * end: new Date('2024-01-01')\n * }); // throws\n * ```\n */\n static validateTimeRangeFilter(timeRange) {\n const { start, end } = timeRange;\n // Validate start\n if (!(start instanceof Date)) {\n throw new FilterError('timeRange.start must be a Date object');\n }\n if (isNaN(start.getTime())) {\n throw new FilterError('timeRange.start is an invalid Date');\n }\n // Validate end\n if (!(end instanceof Date)) {\n throw new FilterError('timeRange.end must be a Date object');\n }\n if (isNaN(end.getTime())) {\n throw new FilterError('timeRange.end is an invalid Date');\n }\n // Validate start < end\n if (start >= end) {\n throw new FilterError('timeRange.start must be before timeRange.end');\n }\n }\n /**\n * Validate complete filter configuration.\n *\n * Valid filter must have:\n * - At least one of: location or timeRange\n * - Valid location filter (if present)\n * - Valid time range filter (if present)\n *\n * @param filter - Filter configuration to validate\n * @throws {Error} If validation fails\n *\n * @example\n * ```typescript\n * // Valid: location only\n * validateFilterConfig({\n * location: { coordinates: [{ lat: 0, lng: 0 }] }\n * });\n *\n * // Valid: time only\n * validateFilterConfig({\n * timeRange: { start: new Date(), end: new Date() }\n * });\n *\n * // Valid: both\n * validateFilterConfig({\n * location: { coordinates: [...] },\n * timeRange: { start: ..., end: ... }\n * });\n *\n * // Invalid: neither\n * validateFilterConfig({}); // throws\n * ```\n */\n static validateFilterConfig(filter) {\n const { location, timeRange } = filter;\n // At least one filter type must be present\n if (!location && !timeRange) {\n throw new FilterError('Filter must have at least one of location or timeRange');\n }\n // Validate location filter if present\n if (location) {\n this.validateLocationFilter(location);\n }\n // Validate time range filter if present\n if (timeRange) {\n this.validateTimeRangeFilter(timeRange);\n }\n }\n}\n//# sourceMappingURL=FilterValidator.js.map","/**\n * Singleton class for managing plugin state.\n *\n * Ensures:\n * - Plugin is initialized before pick() is called\n * - Only one picker can be open at a time\n * - Translations are consistently available across all calls\n *\n * @example\n * ```typescript\n * const state = PluginState.getInstance();\n * state.setInitialized(true);\n * if (state.isInitialized()) {\n * // Safe to call pick()\n * }\n * ```\n */\nexport class PluginState {\n /**\n * Private constructor to enforce singleton pattern.\n * Use getInstance() to access the singleton instance.\n */\n constructor() {\n this._initialized = false;\n this._mergedTranslations = null;\n this._pickerInProgress = false;\n this._requestPermissionsUpfront = false;\n this._photoLibraryPermissionRequested = false;\n // Private constructor prevents direct instantiation\n }\n /**\n * Get the singleton instance of PluginState.\n *\n * @returns The singleton PluginState instance\n *\n * @example\n * ```typescript\n * const state = PluginState.getInstance();\n * ```\n */\n static getInstance() {\n if (!PluginState.instance) {\n PluginState.instance = new PluginState();\n }\n return PluginState.instance;\n }\n /**\n * Check if plugin has been initialized.\n *\n * @returns True if initialize() has been called successfully\n */\n isInitialized() {\n return this._initialized;\n }\n /**\n * Set initialization status.\n *\n * @param value - True if plugin is initialized\n */\n setInitialized(value) {\n this._initialized = value;\n }\n /**\n * Get merged translations (defaults + custom overrides).\n *\n * @returns Merged translations or null if not initialized\n */\n getMergedTranslations() {\n return this._mergedTranslations;\n }\n /**\n * Set merged translations.\n * Creates a defensive copy to prevent external mutation.\n *\n * @param translations - Complete TranslationSet with all keys\n */\n setMergedTranslations(translations) {\n this._mergedTranslations = Object.assign({}, translations);\n }\n /**\n * Check if picker is currently in progress.\n *\n * @returns True if pick() is currently active\n */\n isPickerInProgress() {\n return this._pickerInProgress;\n }\n /**\n * Set picker progress status.\n *\n * @param value - True if picker is active\n */\n setPickerInProgress(value) {\n this._pickerInProgress = value;\n }\n /**\n * Atomically check and set picker progress flag.\n * Prevents race condition where two concurrent pick() calls could both pass the check.\n *\n * @returns True if picker was NOT in progress and has been set to in progress.\n * False if picker is already in progress.\n *\n * @example\n * ```typescript\n * if (!state.trySetPickerInProgress()) {\n * throw new Error('picker_in_progress');\n * }\n * try {\n * // ... picker logic ...\n * } finally {\n * state.setPickerInProgress(false);\n * }\n * ```\n */\n trySetPickerInProgress() {\n if (this._pickerInProgress) {\n return false;\n }\n this._pickerInProgress = true;\n return true;\n }\n /**\n * Check if requestPermissionsUpfront is enabled.\n *\n * @returns True if permissions should be requested upfront\n */\n getRequestPermissionsUpfront() {\n return this._requestPermissionsUpfront;\n }\n /**\n * Set requestPermissionsUpfront flag.\n *\n * @param value - True if permissions should be requested upfront\n */\n setRequestPermissionsUpfront(value) {\n this._requestPermissionsUpfront = value;\n }\n /**\n * Check if Photo Library permission has been requested.\n * Used to prevent duplicate permission requests.\n *\n * @returns True if permission was already requested\n */\n isPhotoLibraryPermissionRequested() {\n return this._photoLibraryPermissionRequested;\n }\n /**\n * Mark Photo Library permission as requested.\n * Prevents duplicate permission requests.\n */\n setPhotoLibraryPermissionRequested(value) {\n this._photoLibraryPermissionRequested = value;\n }\n /**\n * Reset all state to initial values.\n * Primarily used for testing.\n */\n reset() {\n this._initialized = false;\n this._mergedTranslations = null;\n this._pickerInProgress = false;\n this._requestPermissionsUpfront = false;\n this._photoLibraryPermissionRequested = false;\n }\n}\n//# sourceMappingURL=PluginState.js.map","import { registerPlugin } from '@capacitor/core';\nconst Device = registerPlugin('Device', {\n web: () => import('./web').then((m) => new m.DeviceWeb()),\n});\nexport * from './definitions';\nexport { Device };\n//# sourceMappingURL=index.js.map","import { Device } from '@capacitor/device';\n// Import translation files\nimport deTranslations from './translations/de.json';\nimport enTranslations from './translations/en.json';\nimport esTranslations from './translations/es.json';\nimport frTranslations from './translations/fr.json';\n/**\n * Translation loader utility for language detection and merging.\n *\n * Handles:\n * - System language detection via navigator.language\n * - Default translation loading\n * - Custom translation merging\n * - Validation of locale and custom keys\n *\n * @internal\n */\nexport class TranslationLoader {\n /**\n * Detect system language from navigator.language.\n *\n * Logic:\n * 1. Get navigator.language (e.g., 'de-DE', 'fr-FR', 'en-US')\n * 2. Extract language code (first 2 chars: 'de', 'fr', 'en')\n * 3. Check if supported ('en' | 'de' | 'fr' | 'es')\n * 4. Fallback to 'en' if not supported\n *\n * @returns Detected SupportedLocale, fallback to 'en'\n *\n * @example\n * ```typescript\n * // navigator.language = 'de-DE'\n * detectSystemLanguage(); // 'de'\n *\n * // navigator.language = 'ja-JP' (not supported)\n * detectSystemLanguage(); // 'en' (fallback)\n * ```\n */\n static async detectSystemLanguage() {\n try {\n const deviceInfo = await Device.getLanguageCode();\n const langCode = deviceInfo.value.split('-')[0].toLowerCase();\n const supportedLocales = ['en', 'de', 'fr', 'es'];\n if (supportedLocales.includes(langCode)) {\n return langCode;\n }\n }\n catch (error) {\n console.warn('[TranslationLoader] Failed to detect device language, falling back to English:', error);\n }\n return 'en'; // Fallback to English\n }\n /**\n * Load default translations for a given locale.\n *\n * @param locale - The locale to load translations for\n * @returns TranslationSet with all 18 keys\n *\n * @example\n * ```typescript\n * const translations = TranslationLoader.loadDefaults('de');\n * console.log(translations.galleryTitle); // 'Bilder auswählen'\n * ```\n */\n static loadDefaults(locale) {\n return Object.assign({}, this.DEFAULT_TRANSLATIONS[locale]);\n }\n /**\n * Validate that a locale is supported.\n *\n * @param locale - The locale to validate\n * @throws {Error} If locale is not a SupportedLocale\n *\n * @example\n * ```typescript\n * TranslationLoader.validateLocale('en'); // OK\n * TranslationLoader.validateLocale('ja'); // Error: Invalid locale 'ja'\n * ```\n */\n static validateLocale(locale) {\n const supportedLocales = ['en', 'de', 'fr', 'es'];\n if (!supportedLocales.includes(locale)) {\n throw new Error(`Invalid locale '${locale}'. Supported locales: ${supportedLocales.join(', ')}`);\n }\n }\n /**\n * Validate that custom text keys match TranslationSet keys.\n *\n * @param customTexts - Partial custom overrides\n * @throws {Error} If any key in customTexts is not a valid TranslationSet key\n *\n * @example\n * ```typescript\n * TranslationLoader.validateCustomTexts({ galleryTitle: 'Custom' }); // OK\n * TranslationLoader.validateCustomTexts({ invalidKey: 'X' }); // Error\n * ```\n */\n static validateCustomTexts(customTexts) {\n const invalidKeys = Object.keys(customTexts).filter((key) => !this.REQUIRED_KEYS.includes(key));\n if (invalidKeys.length > 0) {\n throw new Error(`Invalid customTexts keys: ${invalidKeys.join(', ')}. ` + `Valid keys: ${this.REQUIRED_KEYS.join(', ')}`);\n }\n }\n /**\n * Merge custom overrides on top of default translations.\n *\n * Creates a defensive copy to prevent mutation.\n *\n * @param defaults - Default TranslationSet\n * @param customTexts - Partial custom overrides\n * @returns Merged TranslationSet with all 18 keys\n *\n * @example\n * ```typescript\n * const defaults = TranslationLoader.loadDefaults('en');\n * const merged = TranslationLoader.merge(defaults, {\n * galleryTitle: 'My Custom Title',\n * });\n * console.log(merged.galleryTitle); // 'My Custom Title'\n * console.log(merged.selectButton); // 'Select' (from defaults)\n * ```\n */\n static merge(defaults, customTexts) {\n if (!customTexts) {\n return Object.assign({}, defaults);\n }\n return Object.assign(Object.assign({}, defaults), customTexts);\n }\n /**\n * Load and merge translations based on configuration.\n *\n * This is the main entry point for translation loading.\n *\n * Logic:\n * 1. If locale provided: validate and use it\n * 2. Else: detect system language (fallback to 'en')\n * 3. Load default translations for locale\n * 4. If customTexts provided: validate and merge\n * 5. Return merged TranslationSet\n *\n * @param locale - Optional explicit locale ('en' | 'de' | 'fr' | 'es')\n * @param customTexts - Optional custom text overrides\n * @returns Merged TranslationSet with all 18 keys\n * @throws {Error} If locale is invalid or customTexts has invalid keys\n *\n * @example\n * ```typescript\n * // System language detection\n * const t1 = TranslationLoader.loadTranslations();\n *\n * // Explicit locale\n * const t2 = TranslationLoader.loadTranslations('de');\n *\n * // Explicit locale + custom overrides\n * const t3 = TranslationLoader.loadTranslations('en', {\n * galleryTitle: 'Pick Photos',\n * });\n *\n * // System language + custom overrides\n * const t4 = TranslationLoader.loadTranslations(undefined, {\n * confirmButton: 'Done',\n * });\n * ```\n */\n static async loadTranslations(locale, customTexts) {\n // Determine locale to use\n let targetLocale;\n if (locale !== undefined) {\n this.validateLocale(locale);\n targetLocale = locale;\n }\n else {\n targetLocale = await this.detectSystemLanguage();\n }\n // Load default translations\n const defaults = this.loadDefaults(targetLocale);\n // Validate and merge custom overrides\n if (customTexts !== undefined) {\n this.validateCustomTexts(customTexts);\n return this.merge(defaults, customTexts);\n }\n return defaults;\n }\n}\n/**\n * All required keys in a valid TranslationSet.\n * Used for validation of custom overrides.\n */\nTranslationLoader.REQUIRED_KEYS = [\n 'galleryTitle',\n 'selectButton',\n 'cancelButton',\n 'selectAllButton',\n 'deselectAllButton',\n 'selectionCounter',\n 'confirmButton',\n 'filterDialogTitle',\n 'radiusLabel',\n 'startDateLabel',\n 'endDateLabel',\n 'loadingMessage',\n 'emptyMessage',\n 'errorMessage',\n 'retryButton',\n 'initializationError',\n 'permissionError',\n 'filterError',\n];\n/**\n * Default translations by locale.\n */\nTranslationLoader.DEFAULT_TRANSLATIONS = {\n en: enTranslations,\n de: deTranslations,\n fr: frTranslations,\n es: esTranslations,\n};\n//# sourceMappingURL=TranslationLoader.js.map","import { FilterValidator } from './FilterValidator';\nimport { PluginState } from './PluginState';\nimport { TranslationLoader } from './TranslationLoader';\nimport { InitializationRequiredError, PickerInProgressError, FilterError } from './errors';\n/**\n * TypeScript implementation of ExifGalleryPlugin.\n *\n * Handles:\n * - Translation loading and merging\n * - Plugin state management\n * - Validation\n * - Native bridge communication\n *\n * @internal\n */\nexport class ExifGalleryImpl {\n /**\n * Create ExifGalleryImpl instance with native bridge dependency.\n *\n * @param nativePlugin - Native plugin instance from Capacitor Bridge\n */\n constructor(nativePlugin) {\n this.nativePlugin = nativePlugin;\n }\n /**\n * Initialize the plugin with optional configuration.\n *\n * This method performs the following steps:\n * 1. Language Detection: Detects system language via navigator.language\n * (e.g., 'de-DE' → 'de'), or uses explicit config.locale\n * 2. Default Loading: Loads appropriate translation file (en.json, de.json, fr.json, es.json)\n * 3. Fallback: Falls back to English if system language is not supported\n * 4. Merging: Merges config.customTexts on top of default translations\n * 5. Validation: Validates locale and customTexts keys\n * 6. Native Bridge: Passes translations and permissions to native layers\n * 7. State Update: Stores merged translations in PluginState singleton (only after native success)\n *\n * All InitConfig properties are optional:\n * - locale?: 'en' | 'de' | 'fr' | 'es' - Explicit language override\n * - customTexts?: Partial<TranslationSet> - Custom text overrides\n * - requestPermissionsUpfront?: boolean - Request Photo Library permissions immediately\n *\n * Permission Behavior:\n * - If requestPermissionsUpfront is true, native layers request Photo Library access\n * - The promise resolves regardless of whether permission was granted or denied\n * - If permission is denied, pick() will request it again when called\n * - Location permissions are NEVER requested upfront (only when filter uses location)\n * - Check logs for permission grant/deny status on Android\n *\n * Placeholder Syntax:\n * - {count}: Current selection count (e.g., \"3\")\n * - {total}: Total available items (e.g., \"24\")\n * - Example: \"{count} of {total} selected\" → \"3 of 24 selected\"\n *\n * @param config - Optional initialization configuration\n * @returns Promise that resolves when initialization is complete\n * @throws {Error} If locale is invalid (not 'en' | 'de' | 'fr' | 'es')\n * @throws {Error} If customTexts contains invalid keys\n * @throws {Error} If native initialization fails\n *\n * @example\n * ```typescript\n * // System language detection (navigator.language)\n * await ExifGallery.initialize();\n *\n * // Explicit locale\n * await ExifGallery.initialize({ locale: 'de' });\n *\n * // Custom text overrides with system language detection\n * await ExifGallery.initialize({\n * customTexts: {\n * galleryTitle: 'Pick Your Photos',\n * confirmButton: 'Done',\n * },\n * });\n *\n * // Explicit locale + custom overrides\n * await ExifGallery.initialize({\n * locale: 'en',\n * customTexts: {\n * galleryTitle: 'Choose Images',\n * },\n * });\n *\n * // Request permissions upfront\n * await ExifGallery.initialize({\n * requestPermissionsUpfront: true,\n * });\n * ```\n */\n async initialize(config) {\n var _a;\n const state = PluginState.getInstance();\n // Load and merge translations (async: detects device language)\n const mergedTranslations = await TranslationLoader.loadTranslations(config === null || config === void 0 ? void 0 : config.locale, config === null || config === void 0 ? void 0 : config.customTexts);\n const requestPermissionsUpfront = (_a = config === null || config === void 0 ? void 0 : config.requestPermissionsUpfront) !== null && _a !== void 0 ? _a : false;\n // Call native layer FIRST (before updating state)\n // If native call fails, state remains unchanged\n await this.nativePlugin.initialize({\n locale: undefined, // Not needed, we pass full translations\n customTexts: mergedTranslations, // Full merged TranslationSet\n requestPermissionsUpfront,\n });\n // Only update state after native confirmation\n state.setRequestPermissionsUpfront(requestPermissionsUpfront);\n state.setMergedTranslations(mergedTranslations);\n state.setInitialized(true);\n }\n /**\n * Open native gallery with optional filter configuration.\n *\n * This method performs the following steps:\n * 1. Initialization Check: Verifies initialize() was called\n * 2. Concurrent Check: Prevents opening multiple pickers simultaneously\n * 3. Filter Validation: Validates all filter parameters\n * 4. Default Values: Applies defaults for fallbackThreshold and allowManualAdjustment\n * 5. Native Bridge: Calls native layer with filter configuration\n * 6. Result Handling: Returns PickResult with selected images\n *\n * Filter Options:\n * - filter.location.polyline: Array of LatLng defining a path (min 2 points)\n * - filter.location.coordinates: Array of LatLng for specific locations\n * - filter.location.radius: Search radius in meters (default: 100, must be > 0)\n * - filter.timeRange.start: Start date/time (must be before end)\n * - filter.timeRange.end: End date/time (must be after start)\n * - fallbackThreshold: Minimum images to show filter UI (default: 5)\n * - allowManualAdjustment: Allow user to adjust filters (default: true)\n *\n * @param options - Optional picker configuration\n * @returns Promise<PickResult> with selected images array and cancelled flag\n * @throws {Error} 'initialization_required' if initialize() not called\n * @throws {Error} 'picker_in_progress' if picker is already open\n * @throws {Error} 'filter_error' if filter parameters are invalid\n *\n * @example\n * ```typescript\n * // Simple pick without filters\n * const result = await ExifGallery.pick();\n *\n * // Location filter with coordinates\n * const result = await ExifGallery.pick({\n * filter: {\n * location: {\n * coordinates: [{ lat: 48.8566, lng: 2.3522 }], // Paris\n * radius: 500 // 500 meters\n * }\n * }\n * });\n *\n * // Time range filter\n * const result = await ExifGallery.pick({\n * filter: {\n * timeRange: {\n * start: new Date('2024-01-01'),\n * end: new Date('2024-12-31')\n * }\n * }\n * });\n *\n * // Combined filters with custom options\n * const result = await ExifGallery.pick({\n * filter: {\n * location: {\n * polyline: [\n * { lat: 48.8566, lng: 2.3522 },\n * { lat: 48.8606, lng: 2.3376 }\n * ],\n * radius: 200\n * },\n * timeRange: {\n * start: new Date('2024-06-01'),\n * end: new Date('2024-06-30')\n * }\n * },\n * fallbackThreshold: 10,\n * allowManualAdjustment: false\n * });\n * ```\n */\n async pick(options) {\n var _a, _b, _c, _d;\n const state = PluginState.getInstance();\n // 1. Verify plugin is initialized\n if (!state.isInitialized()) {\n throw new InitializationRequiredError();\n }\n // 2. Prevent concurrent picker operations (atomic check-and-set)\n if (!state.trySetPickerInProgress()) {\n throw new PickerInProgressError();\n }\n try {\n // Picker is now marked as in progress (atomic operation above)\n // 3. Validate filter configuration if provided\n if (options === null || options === void 0 ? void 0 : options.filter) {\n FilterValidator.validateFilterConfig(options.filter);\n }\n // 4. Apply default values and convert Date objects to timestamps\n const pickOptions = {\n fallbackThreshold: (_a = options === null || options === void 0 ? void 0 : options.fallbackThreshold) !== null && _a !== void 0 ? _a : 5,\n allowManualAdjustment: (_b = options === null || options === void 0 ? void 0 : options.allowManualAdjustment) !== null && _b !== void 0 ? _b : true,\n hasActiveFilters: this.hasActiveFilters(options), // Story 8.2: Detect active filters\n distanceUnit: (_c = options === null || options === void 0 ? void 0 : options.distanceUnit) !== null && _c !== void 0 ? _c : 'kilometers',\n distanceStep: (_d = options === null || options === void 0 ? void 0 : options.distanceStep) !== null && _d !== void 0 ? _d : 5,\n };\n // Convert filter configuration for native bridge\n if (options === null || options === void 0 ? void 0 : options.filter) {\n pickOptions.filter = {};\n // Copy location filter as-is\n if (options.filter.location) {\n pickOptions.filter.location = options.filter.location;\n }\n // Convert Date objects to timestamps (milliseconds) for native bridge\n if (options.filter.timeRange) {\n pickOptions.filter.timeRange = {\n start: options.filter.timeRange.start.getTime(),\n end: options.filter.timeRange.end.getTime(),\n };\n }\n }\n // Validate fallbackThreshold\n if (pickOptions.fallbackThreshold !== undefined) {\n if (typeof pickOptions.fallbackThreshold !== 'number' || !isFinite(pickOptions.fallbackThreshold)) {\n throw new FilterError('fallbackThreshold must be a finite number');\n }\n if (pickOptions.fallbackThreshold < 0) {\n throw new FilterError('fallbackThreshold must be greater than or equal to 0');\n }\n // Prevent unreasonably large threshold\n if (pickOptions.fallbackThreshold > 10000) {\n throw new FilterError('fallbackThreshold must not exceed 10,000');\n }\n }\n // Validate allowManualAdjustment\n if (pickOptions.allowManualAdjustment !== undefined) {\n if (typeof pickOptions.allowManualAdjustment !== 'boolean') {\n throw new FilterError('allowManualAdjustment must be a boolean');\n }\n }\n // Validate distanceUnit\n if (pickOptions.distanceUnit !== undefined) {\n const validUnits = ['kilometers', 'miles'];\n if (!validUnits.includes(pickOptions.distanceUnit)) {\n throw new FilterError(`distanceUnit must be one of: ${validUnits.join(', ')}`);\n }\n }\n // Validate distanceStep\n if (pickOptions.distanceStep !== undefined) {\n if (typeof pickOptions.distanceStep !== 'number' || !isFinite(pickOptions.distanceStep)) {\n throw new FilterError('distanceStep must be a finite number');\n }\n if (pickOptions.distanceStep < 1) {\n throw new FilterError('distanceStep must be at least 1 km');\n }\n if (pickOptions.distanceStep > 25) {\n throw new FilterError('distanceStep must not exceed 25 km');\n }\n }\n // 5. Call native layer via Capacitor Bridge\n const result = await this.nativePlugin.pick(pickOptions);\n return result;\n }\n finally {\n // 6. Always clear picker in progress flag (success or error)\n state.setPickerInProgress(false);\n }\n }\n /**\n * Detects if active filters are present in pick options.\n *\n * **Story 8.2:** Used to determine filter button visibility.\n *\n * Note: This is called AFTER FilterValidator.validateFilterConfig(),\n * so encoded polyline strings have already been decoded to arrays.\n *\n * @param options - Pick options to check\n * @returns true if location or time filters are present\n */\n hasActiveFilters(options) {\n var _a, _b, _c, _d;\n if (!(options === null || options === void 0 ? void 0 : options.filter))\n return false;\n // Check for location filter (coordinates array or polyline)\n // Note: polyline can be string OR array, but after validation it's always an array\n const polyline = (_a = options.filter.location) === null || _a === void 0 ? void 0 : _a.polyline;\n const hasPolyline = Array.isArray(polyline)\n ? polyline.length > 0\n : typeof polyline === 'string'\n ? polyline.trim().length > 0\n : false;\n const hasLocationFilter = !!(((_c = (_b = options.filter.location) === null || _b === void 0 ? void 0 : _b.coordinates) === null || _c === void 0 ? void 0 : _c.length) || hasPolyline);\n const hasTimeFilter = !!(((_d = options.filter.timeRange) === null || _d === void 0 ? void 0 : _d.start) && options.filter.timeRange.end);\n return hasLocationFilter || hasTimeFilter;\n }\n}\n//# sourceMappingURL=ExifGalleryImpl.js.map","import { registerPlugin } from '@capacitor/core';\nimport { ExifGalleryImpl } from './ExifGalleryImpl';\n/**\n * Native plugin instance (registered via Capacitor Bridge).\n * Provides direct bridge communication with iOS/Android native code.\n *\n * @internal\n */\nexport const ExifGalleryNative = registerPlugin('ExifGalleryPlugin', {\n web: () => import('./web').then((m) => new m.ExifGalleryPluginWeb()),\n});\n/**\n * ExifGallery Plugin Instance.\n *\n * This combines TypeScript-side logic (translation loading, validation)\n * with native platform calls via Capacitor Bridge.\n *\n * Use this singleton to interact with the plugin:\n *\n * @example\n * ```typescript\n * import { ExifGallery } from '@kesbyte/capacitor-exif-gallery';\n *\n * // Initialize plugin\n * await ExifGallery.initialize({ locale: 'de' });\n *\n * // Pick images with location filter\n * const result = await ExifGallery.pick({\n * filter: {\n * location: {\n * coordinates: [{ lat: 48.8566, lng: 2.3522 }],\n * radius: 500,\n * },\n * },\n * });\n * ```\n */\nexport const ExifGallery = new ExifGalleryImpl(ExifGalleryNative);\nexport * from './definitions';\nexport { PluginState } from './PluginState';\nexport * from './errors';\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class DeviceWeb extends WebPlugin {\n async getId() {\n return {\n identifier: this.getUid(),\n };\n }\n async getInfo() {\n if (typeof navigator === 'undefined' || !navigator.userAgent) {\n throw this.unavailable('Device API not available in this browser');\n }\n const ua = navigator.userAgent;\n const uaFields = this.parseUa(ua);\n return {\n model: uaFields.model,\n platform: 'web',\n operatingSystem: uaFields.operatingSystem,\n osVersion: uaFields.osVersion,\n manufacturer: navigator.vendor,\n isVirtual: false,\n webViewVersion: uaFields.browserVersion,\n };\n }\n async getBatteryInfo() {\n if (typeof navigator === 'undefined' || !navigator.getBattery) {\n throw this.unavailable('Device API not available in this browser');\n }\n let battery = {};\n try {\n battery = await navigator.getBattery();\n }\n catch (e) {\n // Let it fail, we don't care\n }\n return {\n batteryLevel: battery.level,\n isCharging: battery.charging,\n };\n }\n async getLanguageCode() {\n return {\n value: navigator.language.split('-')[0].toLowerCase(),\n };\n }\n async getLanguageTag() {\n return {\n value: navigator.language,\n };\n }\n parseUa(ua) {\n const uaFields = {};\n const start = ua.indexOf('(') + 1;\n let end = ua.indexOf(') AppleWebKit');\n if (ua.indexOf(') Gecko') !== -1) {\n end = ua.indexOf(') Gecko');\n }\n const fields = ua.substring(start, end);\n if (ua.indexOf('Android') !== -1) {\n const tmpFields = fields.replace('; wv', '').split('; ').pop();\n if (tmpFields) {\n uaFields.model = tmpFields.split(' Build')[0];\n }\n uaFields.osVersion = fields.split('; ')[1];\n }\n else {\n uaFields.model = fields.split('; ')[0];\n if (typeof navigator !== 'undefined' && navigator.oscpu) {\n uaFields.osVersion = navigator.oscpu;\n }\n else {\n if (ua.indexOf('Windows') !== -1) {\n uaFields.osVersion = fields;\n }\n else {\n const tmpFields = fields.split('; ').pop();\n if (tmpFields) {\n const lastParts = tmpFields.replace(' like Mac OS X', '').split(' ');\n uaFields.osVersion = lastParts[lastParts.length - 1].replace(/_/g, '.');\n }\n }\n }\n }\n if (/android/i.test(ua)) {\n uaFields.operatingSystem = 'android';\n }\n else if (/iPad|iPhone|iPod/.test(ua) && !window.MSStream) {\n uaFields.operatingSystem = 'ios';\n }\n else if (/Win/.test(ua)) {\n uaFields.operatingSystem = 'windows';\n }\n else if (/Mac/i.test(ua)) {\n uaFields.operatingSystem = 'mac';\n }\n else {\n uaFields.operatingSystem = 'unknown';\n }\n // Check for browsers based on non-standard javascript apis, only not user agent\n const isSafari = !!window.ApplePaySession;\n const isChrome = !!window.chrome;\n const isFirefox = /Firefox/.test(ua);\n const isEdge = /Edg/.test(ua);\n const isFirefoxIOS = /FxiOS/.test(ua);\n const isChromeIOS = /CriOS/.test(ua);\n const isEdgeIOS = /EdgiOS/.test(ua);\n // FF and Edge User Agents both end with \"/MAJOR.MINOR\"\n if (isSafari || (isChrome && !isEdge) || isFirefoxIOS || isChromeIOS || isEdgeIOS) {\n // Safari version comes as \"... Version/MAJOR.MINOR ...\"\n // Chrome version comes as \"... Chrome/MAJOR.MINOR ...\"\n // FirefoxIOS version comes as \"... FxiOS/MAJOR.MINOR ...\"\n // ChromeIOS version comes as \"... CriOS/MAJOR.MINOR ...\"\n let searchWord;\n if (isFirefoxIOS) {\n searchWord = 'FxiOS';\n }\n else if (isChromeIOS) {\n searchWord = 'CriOS';\n }\n else if (isEdgeIOS) {\n searchWord = 'EdgiOS';\n }\n else if (isSafari) {\n searchWord = 'Version';\n }\n else {\n searchWord = 'Chrome';\n }\n const words = ua.split(' ');\n for (const word of words) {\n if (word.includes(searchWord)) {\n const version = word.split('/')[1];\n uaFields.browserVersion = version;\n }\n }\n }\n else if (isFirefox || isEdge) {\n const reverseUA = ua.split('').reverse().join('');\n const reverseVersion = reverseUA.split('/')[0];\n const version = reverseVersion.split('').reverse().join('');\n uaFields.browserVersion = version;\n }\n return uaFields;\n }\n getUid() {\n if (typeof window !== 'undefined' && window.localStorage) {\n let uid = window.localStorage.getItem('_capuid');\n if (uid) {\n return uid;\n }\n uid = this.uuid4();\n window.localStorage.setItem('_capuid', uid);\n return uid;\n }\n return this.uuid4();\n }\n uuid4() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0, v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n//# sourceMappingURL=web.js.map","import { WebPlugin } from '@capacitor/core';\nexport class ExifGalleryPluginWeb extends WebPlugin {\n async initialize(config) {\n console.log('ExifGallery.initialize() called on web', config);\n // Web implementation not supported\n throw new Error('ExifGallery plugin is not supported on web platform');\n }\n async pick(options) {\n console.log('ExifGallery.pick() called on web', options);\n // Web implementation not supported\n throw new Error('ExifGallery plugin is not supported on web platform');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["polyline.decode","registerPlugin","WebPlugin"],"mappings":"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","x_google_ignoreList":[0,5,9]}
|