@capgo/capacitor-launch-navigator 8.0.20 → 8.0.21
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/README.md +200 -15
- package/android/src/main/AndroidManifest.xml +10 -0
- package/android/src/main/java/app/capgo/plugin/launch_navigator/LaunchNavigator.java +858 -71
- package/android/src/main/java/app/capgo/plugin/launch_navigator/LaunchNavigatorPlugin.java +62 -2
- package/dist/docs.json +358 -0
- package/dist/esm/definitions.d.ts +180 -1
- package/dist/esm/definitions.js +12 -0
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/web.d.ts +8 -2
- package/dist/esm/web.js +332 -0
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +344 -0
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +344 -0
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/LaunchNavigatorPlugin/LaunchNavigator.swift +234 -19
- package/ios/Sources/LaunchNavigatorPlugin/LaunchNavigatorIcons.swift +447 -0
- package/ios/Sources/LaunchNavigatorPlugin/LaunchNavigatorPlugin.swift +47 -2
- package/package.json +1 -1
package/dist/esm/definitions.js
CHANGED
|
@@ -17,9 +17,14 @@ export var IOSNavigationApp;
|
|
|
17
17
|
IOSNavigationApp["MOOVIT"] = "moovit";
|
|
18
18
|
IOSNavigationApp["LYFT"] = "lyft";
|
|
19
19
|
IOSNavigationApp["MAPS_ME"] = "mapsme";
|
|
20
|
+
IOSNavigationApp["GURU_MAPS"] = "guru_maps";
|
|
21
|
+
IOSNavigationApp["ORGANIC_MAPS"] = "organic_maps";
|
|
22
|
+
IOSNavigationApp["YANDEX_MAPS"] = "yandex_maps";
|
|
23
|
+
IOSNavigationApp["TWO_GIS"] = "2gis";
|
|
20
24
|
IOSNavigationApp["CABIFY"] = "cabify";
|
|
21
25
|
IOSNavigationApp["BAIDU"] = "baidu";
|
|
22
26
|
IOSNavigationApp["GAODE"] = "gaode";
|
|
27
|
+
IOSNavigationApp["TESLA"] = "tesla";
|
|
23
28
|
IOSNavigationApp["TAXI_99"] = "99taxi";
|
|
24
29
|
})(IOSNavigationApp || (IOSNavigationApp = {}));
|
|
25
30
|
/**
|
|
@@ -37,9 +42,16 @@ export var AndroidNavigationApp;
|
|
|
37
42
|
AndroidNavigationApp["MOOVIT"] = "moovit";
|
|
38
43
|
AndroidNavigationApp["LYFT"] = "lyft";
|
|
39
44
|
AndroidNavigationApp["MAPS_ME"] = "mapsme";
|
|
45
|
+
AndroidNavigationApp["TOMTOM"] = "tomtom";
|
|
46
|
+
AndroidNavigationApp["GURU_MAPS"] = "guru_maps";
|
|
47
|
+
AndroidNavigationApp["ORGANIC_MAPS"] = "organic_maps";
|
|
48
|
+
AndroidNavigationApp["YANDEX_MAPS"] = "yandex_maps";
|
|
49
|
+
AndroidNavigationApp["MAPY"] = "mapy";
|
|
50
|
+
AndroidNavigationApp["TWO_GIS"] = "2gis";
|
|
40
51
|
AndroidNavigationApp["CABIFY"] = "cabify";
|
|
41
52
|
AndroidNavigationApp["BAIDU"] = "baidu";
|
|
42
53
|
AndroidNavigationApp["GAODE"] = "gaode";
|
|
54
|
+
AndroidNavigationApp["TESLA"] = "tesla";
|
|
43
55
|
})(AndroidNavigationApp || (AndroidNavigationApp = {}));
|
|
44
56
|
/**
|
|
45
57
|
* Transport modes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAN,IAAY,gBAmBX;AAnBD,WAAY,gBAAgB;IAC1B,6CAAyB,CAAA;IACzB,+CAA2B,CAAA;IAC3B,iCAAa,CAAA;IACb,6CAAyB,CAAA;IACzB,qDAAiC,CAAA;IACjC,+CAA2B,CAAA;IAC3B,+CAA2B,CAAA;IAC3B,iCAAa,CAAA;IACb,qCAAiB,CAAA;IACjB,mCAAe,CAAA;IACf,sCAAkB,CAAA;IAClB,qCAAiB,CAAA;IACjB,iCAAa,CAAA;IACb,sCAAkB,CAAA;IAClB,qCAAiB,CAAA;IACjB,mCAAe,CAAA;IACf,mCAAe,CAAA;IACf,sCAAkB,CAAA;AACpB,CAAC,EAnBW,gBAAgB,KAAhB,gBAAgB,QAmB3B;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,oBAcX;AAdD,WAAY,oBAAoB;IAC9B,mDAA2B,CAAA;IAC3B,qCAAa,CAAA;IACb,iDAAyB,CAAA;IACzB,qCAAa,CAAA;IACb,yCAAiB,CAAA;IACjB,uCAAe,CAAA;IACf,0CAAkB,CAAA;IAClB,yCAAiB,CAAA;IACjB,qCAAa,CAAA;IACb,0CAAkB,CAAA;IAClB,yCAAiB,CAAA;IACjB,uCAAe,CAAA;IACf,uCAAe,CAAA;AACjB,CAAC,EAdW,oBAAoB,KAApB,oBAAoB,QAc/B;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;IACnB,wCAAuB,CAAA;IACvB,oCAAmB,CAAA;AACrB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,2CAA6B,CAAA;IAC7B,yBAAW,CAAA;AACb,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB","sourcesContent":["/**\n * Available navigation apps for iOS\n */\nexport enum IOSNavigationApp {\n APPLE_MAPS = 'apple_maps',\n GOOGLE_MAPS = 'google_maps',\n WAZE = 'waze',\n CITYMAPPER = 'citymapper',\n GARMIN_NAVIGON = 'garmin_navigon',\n TRANSIT_APP = 'transit_app',\n YANDEX_NAVIGATOR = 'yandex',\n UBER = 'uber',\n TOMTOM = 'tomtom',\n SYGIC = 'sygic',\n HERE_MAPS = 'here',\n MOOVIT = 'moovit',\n LYFT = 'lyft',\n MAPS_ME = 'mapsme',\n CABIFY = 'cabify',\n BAIDU = 'baidu',\n GAODE = 'gaode',\n TAXI_99 = '99taxi',\n}\n\n/**\n * Available navigation apps for Android\n */\nexport enum AndroidNavigationApp {\n GOOGLE_MAPS = 'google_maps',\n WAZE = 'waze',\n CITYMAPPER = 'citymapper',\n UBER = 'uber',\n YANDEX = 'yandex',\n SYGIC = 'sygic',\n HERE_MAPS = 'here',\n MOOVIT = 'moovit',\n LYFT = 'lyft',\n MAPS_ME = 'mapsme',\n CABIFY = 'cabify',\n BAIDU = 'baidu',\n GAODE = 'gaode',\n}\n\n/**\n * Transport modes\n */\nexport enum TransportMode {\n DRIVING = 'driving',\n WALKING = 'walking',\n BICYCLING = 'bicycling',\n TRANSIT = 'transit',\n}\n\n/**\n * Launch modes\n */\nexport enum LaunchMode {\n MAPS = 'maps',\n TURN_BY_TURN = 'turn_by_turn',\n GEO = 'geo',\n}\n\n/**\n * Options for navigation\n */\nexport interface NavigateOptions {\n /**\n * Starting location coordinates [latitude, longitude]\n */\n start?: [number, number];\n\n /**\n * Starting location name\n */\n startName?: string;\n\n /**\n * Destination name (will be ignored since we only support coordinates)\n */\n destinationName?: string;\n\n /**\n * Transport mode\n */\n transportMode?: TransportMode;\n\n /**\n * Specific app to launch (if not specified, will use default or prompt)\n */\n app?: IOSNavigationApp | AndroidNavigationApp | string;\n\n /**\n * Launch mode\n */\n launchMode?: LaunchMode;\n\n /**\n * Additional parameters specific to certain apps\n */\n extras?: Record<string, any>;\n\n /**\n * Enable debug logging\n */\n enableDebug?: boolean;\n}\n\n/**\n * Result of checking app availability\n */\nexport interface AvailableApp {\n /**\n * App identifier\n */\n app: string;\n\n /**\n * Display name of the app\n */\n name: string;\n\n /**\n * Whether the app is available on the device\n */\n available: boolean;\n}\n\n/**\n * Main plugin interface\n */\nexport interface LaunchNavigatorPlugin {\n /**\n * Navigate to a location using latitude and longitude\n * @param options Navigation options with destination coordinates\n */\n navigate(options: {\n /**\n * Destination coordinates [latitude, longitude]\n */\n destination: [number, number];\n\n /**\n * Optional navigation options\n */\n options?: NavigateOptions;\n }): Promise<void>;\n\n /**\n * Check if a specific navigation app is available\n * @param options Options containing app identifier\n */\n isAppAvailable(options: {\n /**\n * App identifier to check\n */\n app: IOSNavigationApp | AndroidNavigationApp | string;\n }): Promise<{\n /**\n * Whether the app is available\n */\n available: boolean;\n }>;\n\n /**\n * Get list of available navigation apps on the device\n */\n getAvailableApps(): Promise<{\n /**\n * List of available apps\n */\n apps: AvailableApp[];\n }>;\n\n /**\n * Get list of supported apps for the current platform\n */\n getSupportedApps(): Promise<{\n /**\n * List of supported app identifiers\n */\n apps: string[];\n }>;\n\n /**\n * Get the name of the default app for navigation\n */\n getDefaultApp(): Promise<{\n /**\n * Default app identifier\n */\n app: string;\n }>;\n\n /**\n * Get the native Capacitor plugin version\n *\n * @returns {Promise<{ id: string }>} an Promise with version for this device\n * @throws An error if the something went wrong\n */\n getPluginVersion(): Promise<{ version: string }>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAN,IAAY,gBAwBX;AAxBD,WAAY,gBAAgB;IAC1B,6CAAyB,CAAA;IACzB,+CAA2B,CAAA;IAC3B,iCAAa,CAAA;IACb,6CAAyB,CAAA;IACzB,qDAAiC,CAAA;IACjC,+CAA2B,CAAA;IAC3B,+CAA2B,CAAA;IAC3B,iCAAa,CAAA;IACb,qCAAiB,CAAA;IACjB,mCAAe,CAAA;IACf,sCAAkB,CAAA;IAClB,qCAAiB,CAAA;IACjB,iCAAa,CAAA;IACb,sCAAkB,CAAA;IAClB,2CAAuB,CAAA;IACvB,iDAA6B,CAAA;IAC7B,+CAA2B,CAAA;IAC3B,oCAAgB,CAAA;IAChB,qCAAiB,CAAA;IACjB,mCAAe,CAAA;IACf,mCAAe,CAAA;IACf,mCAAe,CAAA;IACf,sCAAkB,CAAA;AACpB,CAAC,EAxBW,gBAAgB,KAAhB,gBAAgB,QAwB3B;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,oBAqBX;AArBD,WAAY,oBAAoB;IAC9B,mDAA2B,CAAA;IAC3B,qCAAa,CAAA;IACb,iDAAyB,CAAA;IACzB,qCAAa,CAAA;IACb,yCAAiB,CAAA;IACjB,uCAAe,CAAA;IACf,0CAAkB,CAAA;IAClB,yCAAiB,CAAA;IACjB,qCAAa,CAAA;IACb,0CAAkB,CAAA;IAClB,yCAAiB,CAAA;IACjB,+CAAuB,CAAA;IACvB,qDAA6B,CAAA;IAC7B,mDAA2B,CAAA;IAC3B,qCAAa,CAAA;IACb,wCAAgB,CAAA;IAChB,yCAAiB,CAAA;IACjB,uCAAe,CAAA;IACf,uCAAe,CAAA;IACf,uCAAe,CAAA;AACjB,CAAC,EArBW,oBAAoB,KAApB,oBAAoB,QAqB/B;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;IACnB,wCAAuB,CAAA;IACvB,oCAAmB,CAAA;AACrB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,2CAA6B,CAAA;IAC7B,yBAAW,CAAA;AACb,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB","sourcesContent":["/**\n * Available navigation apps for iOS\n */\nexport enum IOSNavigationApp {\n APPLE_MAPS = 'apple_maps',\n GOOGLE_MAPS = 'google_maps',\n WAZE = 'waze',\n CITYMAPPER = 'citymapper',\n GARMIN_NAVIGON = 'garmin_navigon',\n TRANSIT_APP = 'transit_app',\n YANDEX_NAVIGATOR = 'yandex',\n UBER = 'uber',\n TOMTOM = 'tomtom',\n SYGIC = 'sygic',\n HERE_MAPS = 'here',\n MOOVIT = 'moovit',\n LYFT = 'lyft',\n MAPS_ME = 'mapsme',\n GURU_MAPS = 'guru_maps',\n ORGANIC_MAPS = 'organic_maps',\n YANDEX_MAPS = 'yandex_maps',\n TWO_GIS = '2gis',\n CABIFY = 'cabify',\n BAIDU = 'baidu',\n GAODE = 'gaode',\n TESLA = 'tesla',\n TAXI_99 = '99taxi',\n}\n\n/**\n * Available navigation apps for Android\n */\nexport enum AndroidNavigationApp {\n GOOGLE_MAPS = 'google_maps',\n WAZE = 'waze',\n CITYMAPPER = 'citymapper',\n UBER = 'uber',\n YANDEX = 'yandex',\n SYGIC = 'sygic',\n HERE_MAPS = 'here',\n MOOVIT = 'moovit',\n LYFT = 'lyft',\n MAPS_ME = 'mapsme',\n TOMTOM = 'tomtom',\n GURU_MAPS = 'guru_maps',\n ORGANIC_MAPS = 'organic_maps',\n YANDEX_MAPS = 'yandex_maps',\n MAPY = 'mapy',\n TWO_GIS = '2gis',\n CABIFY = 'cabify',\n BAIDU = 'baidu',\n GAODE = 'gaode',\n TESLA = 'tesla',\n}\n\n/**\n * Transport modes\n */\nexport enum TransportMode {\n DRIVING = 'driving',\n WALKING = 'walking',\n BICYCLING = 'bicycling',\n TRANSIT = 'transit',\n}\n\n/**\n * Launch modes\n */\nexport enum LaunchMode {\n MAPS = 'maps',\n TURN_BY_TURN = 'turn_by_turn',\n GEO = 'geo',\n}\n\n/**\n * Options for navigation\n */\nexport interface NavigateOptions {\n /**\n * Starting location coordinates [latitude, longitude]\n */\n start?: [number, number];\n\n /**\n * Starting location name\n */\n startName?: string;\n\n /**\n * Destination name (will be ignored since we only support coordinates)\n */\n destinationName?: string;\n\n /**\n * Transport mode\n */\n transportMode?: TransportMode;\n\n /**\n * Specific app to launch (if not specified, will use default or prompt)\n */\n app?: IOSNavigationApp | AndroidNavigationApp | string;\n\n /**\n * Launch mode\n */\n launchMode?: LaunchMode;\n\n /**\n * Additional parameters specific to certain apps\n */\n extras?: Record<string, any>;\n\n /**\n * Enable debug logging\n */\n enableDebug?: boolean;\n}\n\n/**\n * Result of checking app availability\n */\nexport interface AvailableApp {\n /**\n * App identifier\n */\n app: string;\n\n /**\n * Display name of the app\n */\n name: string;\n\n /**\n * Whether the app is available on the device\n */\n available: boolean;\n}\n\n/**\n * Web source used to discover or download a provider icon.\n */\nexport interface IconProvider {\n /**\n * Navigation app identifier\n */\n app: IOSNavigationApp | AndroidNavigationApp | string;\n\n /**\n * Display name for the provider\n */\n name?: string;\n\n /**\n * Provider website used to discover favicon metadata\n */\n url?: string;\n\n /**\n * Direct image URL. When provided, the plugin downloads this URL instead of discovering a favicon from `url`.\n */\n iconUrl?: string;\n}\n\n/**\n * Options for fetching navigation provider icons.\n */\nexport interface GetAppIconsOptions {\n /**\n * App identifiers to fetch. Defaults to all built-in providers for the current platform.\n */\n apps?: (IOSNavigationApp | AndroidNavigationApp | string)[];\n\n /**\n * Provider definitions to fetch or override built-in provider websites.\n */\n providers?: IconProvider[];\n\n /**\n * Cache revalidation interval in milliseconds. Defaults to 24 hours.\n */\n maxAgeMs?: number;\n\n /**\n * Ignore the current cache and fetch icons again.\n */\n forceRefresh?: boolean;\n}\n\n/**\n * Cached icon for a navigation provider.\n */\nexport interface ProviderIcon {\n /**\n * Navigation app identifier\n */\n app: string;\n\n /**\n * Display name for the provider\n */\n name?: string;\n\n /**\n * URL that can be used directly in an image element inside the WebView.\n */\n localUrl: string;\n\n /**\n * Web URL used to download the cached image\n */\n sourceUrl: string;\n\n /**\n * MIME type reported for the cached image, when known\n */\n mimeType?: string;\n\n /**\n * Unix timestamp in milliseconds when the icon was last fetched\n */\n fetchedAt: number;\n\n /**\n * Whether the icon came from the local cache without a network refresh\n */\n fromCache: boolean;\n\n /**\n * Whether a stale cached icon was returned because refresh failed\n */\n stale: boolean;\n}\n\n/**\n * Icon fetch failure for a provider.\n */\nexport interface ProviderIconFailure {\n /**\n * Navigation app identifier\n */\n app: string;\n\n /**\n * Display name for the provider\n */\n name?: string;\n\n /**\n * Web URL that failed, when known\n */\n sourceUrl?: string;\n\n /**\n * Failure message\n */\n message: string;\n}\n\n/**\n * Result of fetching provider icons.\n */\nexport interface ProviderIconsResult {\n /**\n * Icons available from cache or freshly downloaded\n */\n icons: ProviderIcon[];\n\n /**\n * Providers that could not be fetched and had no cached fallback\n */\n failures: ProviderIconFailure[];\n}\n\n/**\n * Options for clearing cached provider icons.\n */\nexport interface ClearIconCacheOptions {\n /**\n * App identifiers to clear. Defaults to all cached icons.\n */\n apps?: (IOSNavigationApp | AndroidNavigationApp | string)[];\n}\n\n/**\n * Main plugin interface\n */\nexport interface LaunchNavigatorPlugin {\n /**\n * Navigate to a location using latitude and longitude\n * @param options Navigation options with destination coordinates\n */\n navigate(options: {\n /**\n * Destination coordinates [latitude, longitude]\n */\n destination: [number, number];\n\n /**\n * Optional navigation options\n */\n options?: NavigateOptions;\n }): Promise<void>;\n\n /**\n * Check if a specific navigation app is available\n * @param options Options containing app identifier\n */\n isAppAvailable(options: {\n /**\n * App identifier to check\n */\n app: IOSNavigationApp | AndroidNavigationApp | string;\n }): Promise<{\n /**\n * Whether the app is available\n */\n available: boolean;\n }>;\n\n /**\n * Get list of available navigation apps on the device\n */\n getAvailableApps(): Promise<{\n /**\n * List of available apps\n */\n apps: AvailableApp[];\n }>;\n\n /**\n * Get list of supported apps for the current platform\n */\n getSupportedApps(): Promise<{\n /**\n * List of supported app identifiers\n */\n apps: string[];\n }>;\n\n /**\n * Get the name of the default app for navigation\n */\n getDefaultApp(): Promise<{\n /**\n * Default app identifier\n */\n app: string;\n }>;\n\n /**\n * Fetch provider icons and cache them locally.\n *\n * The native implementations revalidate cached icons after 24 hours by default.\n * Pass `forceRefresh: true` to bypass the cache when an icon must be repaired.\n */\n getAppIcons?(options?: GetAppIconsOptions): Promise<ProviderIconsResult>;\n\n /**\n * Refresh provider icons, ignoring the cache age.\n */\n refreshAppIcons?(options?: GetAppIconsOptions): Promise<ProviderIconsResult>;\n\n /**\n * Clear cached provider icons.\n */\n clearIconCache?(options?: ClearIconCacheOptions): Promise<{\n /**\n * Number of cached icon files removed\n */\n cleared: number;\n }>;\n\n /**\n * Get the native Capacitor plugin version\n *\n * @returns {Promise<{ id: string }>} an Promise with version for this device\n * @throws An error if the something went wrong\n */\n getPluginVersion(): Promise<{ version: string }>;\n}\n\n/**\n * Required icon cache helpers exposed by the bundled plugin export.\n */\nexport interface LaunchNavigatorPluginIcons {\n /**\n * Fetch provider icons and cache them locally.\n *\n * The native implementations revalidate cached icons after 24 hours by default.\n * Pass `forceRefresh: true` to bypass the cache when an icon must be repaired.\n */\n getAppIcons(options?: GetAppIconsOptions): Promise<ProviderIconsResult>;\n\n /**\n * Refresh provider icons, ignoring the cache age.\n */\n refreshAppIcons(options?: GetAppIconsOptions): Promise<ProviderIconsResult>;\n\n /**\n * Clear cached provider icons.\n */\n clearIconCache(options?: ClearIconCacheOptions): Promise<{\n /**\n * Number of cached icon files removed\n */\n cleared: number;\n }>;\n}\n"]}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { LaunchNavigatorPlugin } from './definitions';
|
|
2
|
-
declare const LaunchNavigator: LaunchNavigatorPlugin;
|
|
1
|
+
import type { LaunchNavigatorPlugin, LaunchNavigatorPluginIcons } from './definitions';
|
|
2
|
+
declare const LaunchNavigator: LaunchNavigatorPlugin & LaunchNavigatorPluginIcons;
|
|
3
3
|
export * from './definitions';
|
|
4
4
|
export { LaunchNavigator };
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,eAAe,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,eAAe,GAAG,cAAc,CAAqD,iBAAiB,EAAE;IAC5G,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;CACnE,CAAC,CAAC;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import { registerPlugin } from '@capacitor/core';\n\nimport type { LaunchNavigatorPlugin, LaunchNavigatorPluginIcons } from './definitions';\n\nconst LaunchNavigator = registerPlugin<LaunchNavigatorPlugin & LaunchNavigatorPluginIcons>('LaunchNavigator', {\n web: () => import('./web').then((m) => new m.LaunchNavigatorWeb()),\n});\n\nexport * from './definitions';\nexport { LaunchNavigator };\n"]}
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { WebPlugin } from '@capacitor/core';
|
|
2
|
-
import type { LaunchNavigatorPlugin, NavigateOptions, AvailableApp } from './definitions';
|
|
3
|
-
export declare class LaunchNavigatorWeb extends WebPlugin implements LaunchNavigatorPlugin {
|
|
2
|
+
import type { LaunchNavigatorPlugin, NavigateOptions, AvailableApp, GetAppIconsOptions, ProviderIconsResult, ClearIconCacheOptions, LaunchNavigatorPluginIcons } from './definitions';
|
|
3
|
+
export declare class LaunchNavigatorWeb extends WebPlugin implements LaunchNavigatorPlugin, LaunchNavigatorPluginIcons {
|
|
4
4
|
/**
|
|
5
5
|
* Navigate to a location using latitude and longitude
|
|
6
6
|
* Opens the location in the default map application or Google Maps web
|
|
@@ -39,7 +39,13 @@ export declare class LaunchNavigatorWeb extends WebPlugin implements LaunchNavig
|
|
|
39
39
|
getDefaultApp(): Promise<{
|
|
40
40
|
app: string;
|
|
41
41
|
}>;
|
|
42
|
+
getAppIcons(options?: GetAppIconsOptions): Promise<ProviderIconsResult>;
|
|
43
|
+
refreshAppIcons(options?: GetAppIconsOptions): Promise<ProviderIconsResult>;
|
|
44
|
+
clearIconCache(options?: ClearIconCacheOptions): Promise<{
|
|
45
|
+
cleared: number;
|
|
46
|
+
}>;
|
|
42
47
|
getPluginVersion(): Promise<{
|
|
43
48
|
version: string;
|
|
44
49
|
}>;
|
|
50
|
+
private getProviderIcon;
|
|
45
51
|
}
|
package/dist/esm/web.js
CHANGED
|
@@ -1,4 +1,42 @@
|
|
|
1
1
|
import { WebPlugin } from '@capacitor/core';
|
|
2
|
+
const DEFAULT_ICON_CACHE_MAX_AGE_MS = 24 * 60 * 60 * 1000;
|
|
3
|
+
const ICON_CACHE_NAME = 'capgo-launch-navigator-icons';
|
|
4
|
+
const ICON_METADATA_PREFIX = 'capgo-launch-navigator-icon:';
|
|
5
|
+
const BUILT_IN_ICON_PROVIDERS = [
|
|
6
|
+
iconProvider('google_maps', 'Google Maps', 'https://www.google.com/maps'),
|
|
7
|
+
iconProvider('waze', 'Waze', 'https://www.waze.com'),
|
|
8
|
+
iconProvider('citymapper', 'Citymapper', 'https://citymapper.com'),
|
|
9
|
+
iconProvider('uber', 'Uber', 'https://www.uber.com'),
|
|
10
|
+
iconProvider('yandex', 'Yandex Navigator', 'https://yandex.com/maps'),
|
|
11
|
+
iconProvider('sygic', 'Sygic', 'https://www.sygic.com/gps-navigation'),
|
|
12
|
+
iconProvider('here', 'HERE Maps', 'https://wego.here.com'),
|
|
13
|
+
iconProvider('moovit', 'Moovit', 'https://moovitapp.com'),
|
|
14
|
+
iconProvider('lyft', 'Lyft', 'https://www.lyft.com'),
|
|
15
|
+
iconProvider('mapsme', 'MAPS.ME', 'https://maps.me'),
|
|
16
|
+
iconProvider('guru_maps', 'Guru Maps', 'https://gurumaps.app'),
|
|
17
|
+
iconProvider('organic_maps', 'Organic Maps', 'https://organicmaps.app'),
|
|
18
|
+
iconProvider('yandex_maps', 'Yandex Maps', 'https://yandex.com/maps'),
|
|
19
|
+
iconProvider('mapy', 'Mapy.com', 'https://mapy.com'),
|
|
20
|
+
iconProvider('2gis', '2GIS', 'https://2gis.com'),
|
|
21
|
+
iconProvider('cabify', 'Cabify', 'https://cabify.com'),
|
|
22
|
+
iconProvider('baidu', 'Baidu Maps', 'https://map.baidu.com'),
|
|
23
|
+
iconProvider('gaode', 'Gaode Maps', 'https://www.amap.com'),
|
|
24
|
+
iconProvider('tesla', 'Tesla', 'https://www.tesla.com'),
|
|
25
|
+
iconProvider('apple_maps', 'Apple Maps', 'https://www.apple.com/maps/'),
|
|
26
|
+
iconProvider('tomtom', 'TomTom', 'https://www.tomtom.com'),
|
|
27
|
+
iconProvider('transit_app', 'Transit App', 'https://transitapp.com'),
|
|
28
|
+
iconProvider('garmin_navigon', 'Garmin Navigon', 'https://www.garmin.com'),
|
|
29
|
+
iconProvider('99taxi', '99 Taxi', 'https://99app.com'),
|
|
30
|
+
];
|
|
31
|
+
function iconProvider(app, name, url) {
|
|
32
|
+
return {
|
|
33
|
+
app,
|
|
34
|
+
name,
|
|
35
|
+
url,
|
|
36
|
+
iconUrl: `https://favicone.com/${new URL(url).hostname}?s=128`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const objectUrls = new Map();
|
|
2
40
|
export class LaunchNavigatorWeb extends WebPlugin {
|
|
3
41
|
/**
|
|
4
42
|
* Navigate to a location using latitude and longitude
|
|
@@ -70,8 +108,302 @@ export class LaunchNavigatorWeb extends WebPlugin {
|
|
|
70
108
|
app: 'google_maps',
|
|
71
109
|
};
|
|
72
110
|
}
|
|
111
|
+
async getAppIcons(options = {}) {
|
|
112
|
+
const providers = resolveIconProviders(options);
|
|
113
|
+
const maxAgeMs = normalizeMaxAge(options.maxAgeMs);
|
|
114
|
+
const forceRefresh = options.forceRefresh === true;
|
|
115
|
+
const icons = [];
|
|
116
|
+
const failures = [];
|
|
117
|
+
await Promise.all(providers.map(async (provider) => {
|
|
118
|
+
try {
|
|
119
|
+
icons.push(await this.getProviderIcon(provider, maxAgeMs, forceRefresh));
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
failures.push({
|
|
123
|
+
app: String(provider.app),
|
|
124
|
+
name: provider.name,
|
|
125
|
+
sourceUrl: provider.iconUrl || provider.url,
|
|
126
|
+
message: error instanceof Error ? error.message : String(error),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
return { icons, failures };
|
|
131
|
+
}
|
|
132
|
+
async refreshAppIcons(options = {}) {
|
|
133
|
+
return this.getAppIcons(Object.assign(Object.assign({}, options), { forceRefresh: true }));
|
|
134
|
+
}
|
|
135
|
+
async clearIconCache(options = {}) {
|
|
136
|
+
var _a;
|
|
137
|
+
const appIds = (_a = options.apps) === null || _a === void 0 ? void 0 : _a.map(String);
|
|
138
|
+
const cache = await getCache();
|
|
139
|
+
let cleared = 0;
|
|
140
|
+
if (appIds && appIds.length > 0) {
|
|
141
|
+
for (const app of appIds) {
|
|
142
|
+
cleared += (await deleteCachedIcon(app, cache)) ? 1 : 0;
|
|
143
|
+
}
|
|
144
|
+
return { cleared };
|
|
145
|
+
}
|
|
146
|
+
const storedApps = await getStoredAppIds(cache);
|
|
147
|
+
for (const app of storedApps) {
|
|
148
|
+
cleared += (await deleteCachedIcon(app, cache)) ? 1 : 0;
|
|
149
|
+
}
|
|
150
|
+
return { cleared };
|
|
151
|
+
}
|
|
73
152
|
async getPluginVersion() {
|
|
74
153
|
return { version: 'web' };
|
|
75
154
|
}
|
|
155
|
+
async getProviderIcon(provider, maxAgeMs, forceRefresh) {
|
|
156
|
+
const app = String(provider.app);
|
|
157
|
+
const cached = await readCachedIcon(app);
|
|
158
|
+
const now = Date.now();
|
|
159
|
+
if (cached && !forceRefresh && now - cached.metadata.fetchedAt < maxAgeMs) {
|
|
160
|
+
return toProviderIcon(cached, true, false);
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const sourceUrl = provider.iconUrl
|
|
164
|
+
? absolutizeUrl(provider.iconUrl, provider.url)
|
|
165
|
+
: await discoverIconUrl(provider);
|
|
166
|
+
const response = await fetch(sourceUrl);
|
|
167
|
+
if (!response.ok) {
|
|
168
|
+
throw new Error(`Icon request failed with status ${response.status}`);
|
|
169
|
+
}
|
|
170
|
+
const blob = await response.blob();
|
|
171
|
+
const mimeType = blob.type || response.headers.get('content-type') || undefined;
|
|
172
|
+
const cache = await getCache();
|
|
173
|
+
const metadata = {
|
|
174
|
+
app,
|
|
175
|
+
name: provider.name,
|
|
176
|
+
sourceUrl,
|
|
177
|
+
mimeType,
|
|
178
|
+
fetchedAt: now,
|
|
179
|
+
};
|
|
180
|
+
const localUrl = URL.createObjectURL(blob);
|
|
181
|
+
setObjectUrl(app, localUrl);
|
|
182
|
+
if (cache) {
|
|
183
|
+
try {
|
|
184
|
+
await cache.put(cacheRequest(app), new Response(blob, { headers: mimeType ? { 'content-type': mimeType } : undefined }));
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
console.warn('Unable to persist provider icon in Cache Storage', error);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
writeMetadata(metadata);
|
|
191
|
+
return {
|
|
192
|
+
app,
|
|
193
|
+
name: metadata.name,
|
|
194
|
+
localUrl,
|
|
195
|
+
sourceUrl,
|
|
196
|
+
mimeType,
|
|
197
|
+
fetchedAt: metadata.fetchedAt,
|
|
198
|
+
fromCache: false,
|
|
199
|
+
stale: false,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
if (cached) {
|
|
204
|
+
return toProviderIcon(cached, true, true);
|
|
205
|
+
}
|
|
206
|
+
throw error;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function resolveIconProviders(options) {
|
|
211
|
+
const builtIns = new Map(BUILT_IN_ICON_PROVIDERS.map((provider) => [String(provider.app), provider]));
|
|
212
|
+
const customProviders = options.providers || [];
|
|
213
|
+
for (const provider of customProviders) {
|
|
214
|
+
const app = String(provider.app);
|
|
215
|
+
builtIns.set(app, Object.assign(Object.assign(Object.assign({}, builtIns.get(app)), provider), { app }));
|
|
216
|
+
}
|
|
217
|
+
if (options.apps && options.apps.length > 0) {
|
|
218
|
+
return options.apps.map((app) => builtIns.get(String(app)) || { app: String(app) });
|
|
219
|
+
}
|
|
220
|
+
return Array.from(builtIns.values());
|
|
221
|
+
}
|
|
222
|
+
function normalizeMaxAge(maxAgeMs) {
|
|
223
|
+
if (typeof maxAgeMs !== 'number' || !Number.isFinite(maxAgeMs) || maxAgeMs < 0) {
|
|
224
|
+
return DEFAULT_ICON_CACHE_MAX_AGE_MS;
|
|
225
|
+
}
|
|
226
|
+
return maxAgeMs;
|
|
227
|
+
}
|
|
228
|
+
async function discoverIconUrl(provider) {
|
|
229
|
+
var _a;
|
|
230
|
+
if (!provider.url) {
|
|
231
|
+
throw new Error('Provider url or iconUrl is required');
|
|
232
|
+
}
|
|
233
|
+
const response = await fetch(provider.url);
|
|
234
|
+
if (!response.ok) {
|
|
235
|
+
throw new Error(`Provider page request failed with status ${response.status}`);
|
|
236
|
+
}
|
|
237
|
+
const html = await response.text();
|
|
238
|
+
const linkMatch = html.match(/<link\s+[^>]*rel=["'][^"']*(?:apple-touch-icon|icon)[^"']*["'][^>]*>/i);
|
|
239
|
+
const href = (_a = linkMatch === null || linkMatch === void 0 ? void 0 : linkMatch[0].match(/\shref=["']([^"']+)["']/i)) === null || _a === void 0 ? void 0 : _a[1];
|
|
240
|
+
if (href) {
|
|
241
|
+
return absolutizeUrl(href, provider.url);
|
|
242
|
+
}
|
|
243
|
+
return absolutizeUrl('/favicon.ico', provider.url);
|
|
244
|
+
}
|
|
245
|
+
function absolutizeUrl(url, baseUrl) {
|
|
246
|
+
try {
|
|
247
|
+
return new URL(url, baseUrl).toString();
|
|
248
|
+
}
|
|
249
|
+
catch (_a) {
|
|
250
|
+
throw new Error(`Invalid icon URL: ${url}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async function readCachedIcon(app) {
|
|
254
|
+
const metadata = readMetadata(app);
|
|
255
|
+
const cachedObjectUrl = objectUrls.get(app);
|
|
256
|
+
if (!metadata) {
|
|
257
|
+
return undefined;
|
|
258
|
+
}
|
|
259
|
+
if (cachedObjectUrl) {
|
|
260
|
+
return { metadata, localUrl: cachedObjectUrl };
|
|
261
|
+
}
|
|
262
|
+
const cache = await getCache();
|
|
263
|
+
const response = await (cache === null || cache === void 0 ? void 0 : cache.match(cacheRequest(app)));
|
|
264
|
+
if (!response) {
|
|
265
|
+
return undefined;
|
|
266
|
+
}
|
|
267
|
+
const blob = await response.blob();
|
|
268
|
+
const localUrl = URL.createObjectURL(blob);
|
|
269
|
+
setObjectUrl(app, localUrl);
|
|
270
|
+
return { metadata, localUrl };
|
|
271
|
+
}
|
|
272
|
+
function toProviderIcon(cached, fromCache, stale) {
|
|
273
|
+
return {
|
|
274
|
+
app: cached.metadata.app,
|
|
275
|
+
name: cached.metadata.name,
|
|
276
|
+
localUrl: cached.localUrl,
|
|
277
|
+
sourceUrl: cached.metadata.sourceUrl,
|
|
278
|
+
mimeType: cached.metadata.mimeType,
|
|
279
|
+
fetchedAt: cached.metadata.fetchedAt,
|
|
280
|
+
fromCache,
|
|
281
|
+
stale,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
async function getCache() {
|
|
285
|
+
if (!('caches' in window)) {
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
try {
|
|
289
|
+
return await caches.open(ICON_CACHE_NAME);
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
console.warn('Unable to open provider icon cache', error);
|
|
293
|
+
return undefined;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
function cacheRequest(app) {
|
|
297
|
+
return new Request(`https://capgo.local/launch-navigator-icons/${encodeURIComponent(app)}`);
|
|
298
|
+
}
|
|
299
|
+
function readMetadata(app) {
|
|
300
|
+
try {
|
|
301
|
+
const raw = localStorage.getItem(metadataKey(app));
|
|
302
|
+
return raw ? JSON.parse(raw) : undefined;
|
|
303
|
+
}
|
|
304
|
+
catch (_a) {
|
|
305
|
+
return undefined;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
function writeMetadata(metadata) {
|
|
309
|
+
try {
|
|
310
|
+
localStorage.setItem(metadataKey(metadata.app), JSON.stringify(metadata));
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
console.warn('Unable to persist provider icon metadata', error);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
async function getStoredAppIds(cache) {
|
|
317
|
+
const apps = new Set();
|
|
318
|
+
try {
|
|
319
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
320
|
+
const key = localStorage.key(i);
|
|
321
|
+
if (key === null || key === void 0 ? void 0 : key.startsWith(ICON_METADATA_PREFIX)) {
|
|
322
|
+
apps.add(key.slice(ICON_METADATA_PREFIX.length));
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
console.warn('Unable to read provider icon metadata', error);
|
|
328
|
+
}
|
|
329
|
+
const cachesToRead = new Map();
|
|
330
|
+
if (cache) {
|
|
331
|
+
cachesToRead.set(ICON_CACHE_NAME, cache);
|
|
332
|
+
}
|
|
333
|
+
try {
|
|
334
|
+
if ('caches' in window) {
|
|
335
|
+
const cacheNames = await caches.keys();
|
|
336
|
+
for (const cacheName of cacheNames) {
|
|
337
|
+
if (cacheName === ICON_CACHE_NAME && !cachesToRead.has(cacheName)) {
|
|
338
|
+
cachesToRead.set(cacheName, await caches.open(cacheName));
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
console.warn('Unable to enumerate provider icon caches', error);
|
|
345
|
+
}
|
|
346
|
+
try {
|
|
347
|
+
for (const iconCache of cachesToRead.values()) {
|
|
348
|
+
const requests = await iconCache.keys();
|
|
349
|
+
for (const request of requests) {
|
|
350
|
+
const app = appFromCacheRequest(request);
|
|
351
|
+
if (app) {
|
|
352
|
+
apps.add(app);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
console.warn('Unable to read provider icon cache entries', error);
|
|
359
|
+
}
|
|
360
|
+
return Array.from(apps);
|
|
361
|
+
}
|
|
362
|
+
async function deleteCachedIcon(app, cache) {
|
|
363
|
+
let hadMetadata = false;
|
|
364
|
+
try {
|
|
365
|
+
hadMetadata = localStorage.getItem(metadataKey(app)) !== null;
|
|
366
|
+
localStorage.removeItem(metadataKey(app));
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
console.warn('Unable to clear provider icon metadata', error);
|
|
370
|
+
}
|
|
371
|
+
const objectUrl = objectUrls.get(app);
|
|
372
|
+
if (objectUrl) {
|
|
373
|
+
URL.revokeObjectURL(objectUrl);
|
|
374
|
+
objectUrls.delete(app);
|
|
375
|
+
}
|
|
376
|
+
let deletedFromCache = false;
|
|
377
|
+
try {
|
|
378
|
+
deletedFromCache = (await (cache === null || cache === void 0 ? void 0 : cache.delete(cacheRequest(app)))) || false;
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
console.warn('Unable to clear provider icon cache entry', error);
|
|
382
|
+
}
|
|
383
|
+
return hadMetadata || deletedFromCache;
|
|
384
|
+
}
|
|
385
|
+
function metadataKey(app) {
|
|
386
|
+
return `${ICON_METADATA_PREFIX}${app}`;
|
|
387
|
+
}
|
|
388
|
+
function appFromCacheRequest(request) {
|
|
389
|
+
try {
|
|
390
|
+
const url = new URL(request.url);
|
|
391
|
+
const prefix = '/launch-navigator-icons/';
|
|
392
|
+
if (url.origin !== 'https://capgo.local' || !url.pathname.startsWith(prefix)) {
|
|
393
|
+
return undefined;
|
|
394
|
+
}
|
|
395
|
+
const app = decodeURIComponent(url.pathname.slice(prefix.length));
|
|
396
|
+
return app || undefined;
|
|
397
|
+
}
|
|
398
|
+
catch (_a) {
|
|
399
|
+
return undefined;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
function setObjectUrl(app, url) {
|
|
403
|
+
const existing = objectUrls.get(app);
|
|
404
|
+
if (existing) {
|
|
405
|
+
URL.revokeObjectURL(existing);
|
|
406
|
+
}
|
|
407
|
+
objectUrls.set(app, url);
|
|
76
408
|
}
|
|
77
409
|
//# sourceMappingURL=web.js.map
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAC/C;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAqE;QAClF,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAEzC,IAAI,GAAW,CAAC;QAEhB,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;YAC9C,GAAG,GAAG,mCAAmC,QAAQ,IAAI,QAAQ,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,mDAAmD,GAAG,IAAI,GAAG,EAAE,CAAC;QACxE,CAAC;QAED,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;YAC7B,MAAM,OAAO,GAA2B;gBACtC,OAAO,EAAE,SAAS;gBAClB,OAAO,EAAE,SAAS;gBAClB,SAAS,EAAE,WAAW;gBACtB,OAAO,EAAE,SAAS;aACnB,CAAC;YACF,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAC/C,IAAI,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;gBAC7B,GAAG,IAAI,eAAe,IAAI,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,OAAwB;QAC3C,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB;QACpB,OAAO;YACL,IAAI,EAAE;gBACJ;oBACE,GAAG,EAAE,aAAa;oBAClB,IAAI,EAAE,mBAAmB;oBACzB,SAAS,EAAE,IAAI;iBAChB;aACF;SACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB;QACpB,OAAO;YACL,IAAI,EAAE,CAAC,aAAa,CAAC;SACtB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa;QACjB,OAAO;YACL,GAAG,EAAE,aAAa;SACnB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport type { LaunchNavigatorPlugin, NavigateOptions, AvailableApp } from './definitions';\n\nexport class LaunchNavigatorWeb extends WebPlugin implements LaunchNavigatorPlugin {\n /**\n * Navigate to a location using latitude and longitude\n * Opens the location in the default map application or Google Maps web\n */\n async navigate(options: { destination: [number, number]; options?: NavigateOptions }): Promise<void> {\n const [lat, lon] = options.destination;\n const navOptions = options.options || {};\n\n let url: string;\n\n if (navOptions.start) {\n const [startLat, startLon] = navOptions.start;\n url = `https://www.google.com/maps/dir/${startLat},${startLon}/${lat},${lon}`;\n } else {\n url = `https://www.google.com/maps/search/?api=1&query=${lat},${lon}`;\n }\n\n if (navOptions.transportMode) {\n const modeMap: Record<string, string> = {\n driving: 'driving',\n walking: 'walking',\n bicycling: 'bicycling',\n transit: 'transit',\n };\n const mode = modeMap[navOptions.transportMode];\n if (mode && navOptions.start) {\n url += `&travelmode=${mode}`;\n }\n }\n\n window.open(url, '_blank');\n }\n\n /**\n * Check if a specific navigation app is available\n * Always returns false on web\n */\n async isAppAvailable(options: { app: string }): Promise<{ available: boolean }> {\n console.log('isAppAvailable called with app:', options.app);\n return { available: false };\n }\n\n /**\n * Get list of available navigation apps\n * Returns only Google Maps as available on web\n */\n async getAvailableApps(): Promise<{ apps: AvailableApp[] }> {\n return {\n apps: [\n {\n app: 'google_maps',\n name: 'Google Maps (Web)',\n available: true,\n },\n ],\n };\n }\n\n /**\n * Get list of supported apps for the current platform\n * Returns only Google Maps for web\n */\n async getSupportedApps(): Promise<{ apps: string[] }> {\n return {\n apps: ['google_maps'],\n };\n }\n\n /**\n * Get the default app for navigation\n * Returns Google Maps for web\n */\n async getDefaultApp(): Promise<{ app: string }> {\n return {\n app: 'google_maps',\n };\n }\n\n async getPluginVersion(): Promise<{ version: string }> {\n return { version: 'web' };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport type {\n LaunchNavigatorPlugin,\n NavigateOptions,\n AvailableApp,\n GetAppIconsOptions,\n ProviderIcon,\n ProviderIconFailure,\n ProviderIconsResult,\n IconProvider,\n ClearIconCacheOptions,\n LaunchNavigatorPluginIcons,\n} from './definitions';\n\nconst DEFAULT_ICON_CACHE_MAX_AGE_MS = 24 * 60 * 60 * 1000;\nconst ICON_CACHE_NAME = 'capgo-launch-navigator-icons';\nconst ICON_METADATA_PREFIX = 'capgo-launch-navigator-icon:';\n\nconst BUILT_IN_ICON_PROVIDERS: IconProvider[] = [\n iconProvider('google_maps', 'Google Maps', 'https://www.google.com/maps'),\n iconProvider('waze', 'Waze', 'https://www.waze.com'),\n iconProvider('citymapper', 'Citymapper', 'https://citymapper.com'),\n iconProvider('uber', 'Uber', 'https://www.uber.com'),\n iconProvider('yandex', 'Yandex Navigator', 'https://yandex.com/maps'),\n iconProvider('sygic', 'Sygic', 'https://www.sygic.com/gps-navigation'),\n iconProvider('here', 'HERE Maps', 'https://wego.here.com'),\n iconProvider('moovit', 'Moovit', 'https://moovitapp.com'),\n iconProvider('lyft', 'Lyft', 'https://www.lyft.com'),\n iconProvider('mapsme', 'MAPS.ME', 'https://maps.me'),\n iconProvider('guru_maps', 'Guru Maps', 'https://gurumaps.app'),\n iconProvider('organic_maps', 'Organic Maps', 'https://organicmaps.app'),\n iconProvider('yandex_maps', 'Yandex Maps', 'https://yandex.com/maps'),\n iconProvider('mapy', 'Mapy.com', 'https://mapy.com'),\n iconProvider('2gis', '2GIS', 'https://2gis.com'),\n iconProvider('cabify', 'Cabify', 'https://cabify.com'),\n iconProvider('baidu', 'Baidu Maps', 'https://map.baidu.com'),\n iconProvider('gaode', 'Gaode Maps', 'https://www.amap.com'),\n iconProvider('tesla', 'Tesla', 'https://www.tesla.com'),\n iconProvider('apple_maps', 'Apple Maps', 'https://www.apple.com/maps/'),\n iconProvider('tomtom', 'TomTom', 'https://www.tomtom.com'),\n iconProvider('transit_app', 'Transit App', 'https://transitapp.com'),\n iconProvider('garmin_navigon', 'Garmin Navigon', 'https://www.garmin.com'),\n iconProvider('99taxi', '99 Taxi', 'https://99app.com'),\n];\n\nfunction iconProvider(app: string, name: string, url: string): IconProvider {\n return {\n app,\n name,\n url,\n iconUrl: `https://favicone.com/${new URL(url).hostname}?s=128`,\n };\n}\n\ninterface StoredIconMetadata {\n app: string;\n name?: string;\n sourceUrl: string;\n mimeType?: string;\n fetchedAt: number;\n}\n\ninterface CachedWebIcon {\n metadata: StoredIconMetadata;\n localUrl: string;\n}\n\nconst objectUrls = new Map<string, string>();\n\nexport class LaunchNavigatorWeb extends WebPlugin implements LaunchNavigatorPlugin, LaunchNavigatorPluginIcons {\n /**\n * Navigate to a location using latitude and longitude\n * Opens the location in the default map application or Google Maps web\n */\n async navigate(options: { destination: [number, number]; options?: NavigateOptions }): Promise<void> {\n const [lat, lon] = options.destination;\n const navOptions = options.options || {};\n\n let url: string;\n\n if (navOptions.start) {\n const [startLat, startLon] = navOptions.start;\n url = `https://www.google.com/maps/dir/${startLat},${startLon}/${lat},${lon}`;\n } else {\n url = `https://www.google.com/maps/search/?api=1&query=${lat},${lon}`;\n }\n\n if (navOptions.transportMode) {\n const modeMap: Record<string, string> = {\n driving: 'driving',\n walking: 'walking',\n bicycling: 'bicycling',\n transit: 'transit',\n };\n const mode = modeMap[navOptions.transportMode];\n if (mode && navOptions.start) {\n url += `&travelmode=${mode}`;\n }\n }\n\n window.open(url, '_blank');\n }\n\n /**\n * Check if a specific navigation app is available\n * Always returns false on web\n */\n async isAppAvailable(options: { app: string }): Promise<{ available: boolean }> {\n console.log('isAppAvailable called with app:', options.app);\n return { available: false };\n }\n\n /**\n * Get list of available navigation apps\n * Returns only Google Maps as available on web\n */\n async getAvailableApps(): Promise<{ apps: AvailableApp[] }> {\n return {\n apps: [\n {\n app: 'google_maps',\n name: 'Google Maps (Web)',\n available: true,\n },\n ],\n };\n }\n\n /**\n * Get list of supported apps for the current platform\n * Returns only Google Maps for web\n */\n async getSupportedApps(): Promise<{ apps: string[] }> {\n return {\n apps: ['google_maps'],\n };\n }\n\n /**\n * Get the default app for navigation\n * Returns Google Maps for web\n */\n async getDefaultApp(): Promise<{ app: string }> {\n return {\n app: 'google_maps',\n };\n }\n\n async getAppIcons(options: GetAppIconsOptions = {}): Promise<ProviderIconsResult> {\n const providers = resolveIconProviders(options);\n const maxAgeMs = normalizeMaxAge(options.maxAgeMs);\n const forceRefresh = options.forceRefresh === true;\n const icons: ProviderIcon[] = [];\n const failures: ProviderIconFailure[] = [];\n\n await Promise.all(\n providers.map(async (provider) => {\n try {\n icons.push(await this.getProviderIcon(provider, maxAgeMs, forceRefresh));\n } catch (error) {\n failures.push({\n app: String(provider.app),\n name: provider.name,\n sourceUrl: provider.iconUrl || provider.url,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }),\n );\n\n return { icons, failures };\n }\n\n async refreshAppIcons(options: GetAppIconsOptions = {}): Promise<ProviderIconsResult> {\n return this.getAppIcons({ ...options, forceRefresh: true });\n }\n\n async clearIconCache(options: ClearIconCacheOptions = {}): Promise<{ cleared: number }> {\n const appIds = options.apps?.map(String);\n const cache = await getCache();\n let cleared = 0;\n\n if (appIds && appIds.length > 0) {\n for (const app of appIds) {\n cleared += (await deleteCachedIcon(app, cache)) ? 1 : 0;\n }\n return { cleared };\n }\n\n const storedApps = await getStoredAppIds(cache);\n for (const app of storedApps) {\n cleared += (await deleteCachedIcon(app, cache)) ? 1 : 0;\n }\n\n return { cleared };\n }\n\n async getPluginVersion(): Promise<{ version: string }> {\n return { version: 'web' };\n }\n\n private async getProviderIcon(\n provider: IconProvider,\n maxAgeMs: number,\n forceRefresh: boolean,\n ): Promise<ProviderIcon> {\n const app = String(provider.app);\n const cached = await readCachedIcon(app);\n const now = Date.now();\n\n if (cached && !forceRefresh && now - cached.metadata.fetchedAt < maxAgeMs) {\n return toProviderIcon(cached, true, false);\n }\n\n try {\n const sourceUrl = provider.iconUrl\n ? absolutizeUrl(provider.iconUrl, provider.url)\n : await discoverIconUrl(provider);\n const response = await fetch(sourceUrl);\n if (!response.ok) {\n throw new Error(`Icon request failed with status ${response.status}`);\n }\n\n const blob = await response.blob();\n const mimeType = blob.type || response.headers.get('content-type') || undefined;\n const cache = await getCache();\n const metadata: StoredIconMetadata = {\n app,\n name: provider.name,\n sourceUrl,\n mimeType,\n fetchedAt: now,\n };\n const localUrl = URL.createObjectURL(blob);\n setObjectUrl(app, localUrl);\n\n if (cache) {\n try {\n await cache.put(\n cacheRequest(app),\n new Response(blob, { headers: mimeType ? { 'content-type': mimeType } : undefined }),\n );\n } catch (error) {\n console.warn('Unable to persist provider icon in Cache Storage', error);\n }\n }\n writeMetadata(metadata);\n\n return {\n app,\n name: metadata.name,\n localUrl,\n sourceUrl,\n mimeType,\n fetchedAt: metadata.fetchedAt,\n fromCache: false,\n stale: false,\n };\n } catch (error) {\n if (cached) {\n return toProviderIcon(cached, true, true);\n }\n throw error;\n }\n }\n}\n\nfunction resolveIconProviders(options: GetAppIconsOptions): IconProvider[] {\n const builtIns = new Map(BUILT_IN_ICON_PROVIDERS.map((provider) => [String(provider.app), provider]));\n const customProviders = options.providers || [];\n\n for (const provider of customProviders) {\n const app = String(provider.app);\n builtIns.set(app, { ...builtIns.get(app), ...provider, app });\n }\n\n if (options.apps && options.apps.length > 0) {\n return options.apps.map((app) => builtIns.get(String(app)) || { app: String(app) });\n }\n\n return Array.from(builtIns.values());\n}\n\nfunction normalizeMaxAge(maxAgeMs: number | undefined): number {\n if (typeof maxAgeMs !== 'number' || !Number.isFinite(maxAgeMs) || maxAgeMs < 0) {\n return DEFAULT_ICON_CACHE_MAX_AGE_MS;\n }\n return maxAgeMs;\n}\n\nasync function discoverIconUrl(provider: IconProvider): Promise<string> {\n if (!provider.url) {\n throw new Error('Provider url or iconUrl is required');\n }\n\n const response = await fetch(provider.url);\n if (!response.ok) {\n throw new Error(`Provider page request failed with status ${response.status}`);\n }\n\n const html = await response.text();\n const linkMatch = html.match(/<link\\s+[^>]*rel=[\"'][^\"']*(?:apple-touch-icon|icon)[^\"']*[\"'][^>]*>/i);\n const href = linkMatch?.[0].match(/\\shref=[\"']([^\"']+)[\"']/i)?.[1];\n\n if (href) {\n return absolutizeUrl(href, provider.url);\n }\n\n return absolutizeUrl('/favicon.ico', provider.url);\n}\n\nfunction absolutizeUrl(url: string, baseUrl?: string): string {\n try {\n return new URL(url, baseUrl).toString();\n } catch {\n throw new Error(`Invalid icon URL: ${url}`);\n }\n}\n\nasync function readCachedIcon(app: string): Promise<CachedWebIcon | undefined> {\n const metadata = readMetadata(app);\n const cachedObjectUrl = objectUrls.get(app);\n\n if (!metadata) {\n return undefined;\n }\n\n if (cachedObjectUrl) {\n return { metadata, localUrl: cachedObjectUrl };\n }\n\n const cache = await getCache();\n const response = await cache?.match(cacheRequest(app));\n if (!response) {\n return undefined;\n }\n\n const blob = await response.blob();\n const localUrl = URL.createObjectURL(blob);\n setObjectUrl(app, localUrl);\n return { metadata, localUrl };\n}\n\nfunction toProviderIcon(cached: CachedWebIcon, fromCache: boolean, stale: boolean): ProviderIcon {\n return {\n app: cached.metadata.app,\n name: cached.metadata.name,\n localUrl: cached.localUrl,\n sourceUrl: cached.metadata.sourceUrl,\n mimeType: cached.metadata.mimeType,\n fetchedAt: cached.metadata.fetchedAt,\n fromCache,\n stale,\n };\n}\n\nasync function getCache(): Promise<Cache | undefined> {\n if (!('caches' in window)) {\n return undefined;\n }\n try {\n return await caches.open(ICON_CACHE_NAME);\n } catch (error) {\n console.warn('Unable to open provider icon cache', error);\n return undefined;\n }\n}\n\nfunction cacheRequest(app: string): Request {\n return new Request(`https://capgo.local/launch-navigator-icons/${encodeURIComponent(app)}`);\n}\n\nfunction readMetadata(app: string): StoredIconMetadata | undefined {\n try {\n const raw = localStorage.getItem(metadataKey(app));\n return raw ? (JSON.parse(raw) as StoredIconMetadata) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeMetadata(metadata: StoredIconMetadata): void {\n try {\n localStorage.setItem(metadataKey(metadata.app), JSON.stringify(metadata));\n } catch (error) {\n console.warn('Unable to persist provider icon metadata', error);\n }\n}\n\nasync function getStoredAppIds(cache: Cache | undefined): Promise<string[]> {\n const apps = new Set<string>();\n try {\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(ICON_METADATA_PREFIX)) {\n apps.add(key.slice(ICON_METADATA_PREFIX.length));\n }\n }\n } catch (error) {\n console.warn('Unable to read provider icon metadata', error);\n }\n\n const cachesToRead = new Map<string, Cache>();\n if (cache) {\n cachesToRead.set(ICON_CACHE_NAME, cache);\n }\n\n try {\n if ('caches' in window) {\n const cacheNames = await caches.keys();\n for (const cacheName of cacheNames) {\n if (cacheName === ICON_CACHE_NAME && !cachesToRead.has(cacheName)) {\n cachesToRead.set(cacheName, await caches.open(cacheName));\n }\n }\n }\n } catch (error) {\n console.warn('Unable to enumerate provider icon caches', error);\n }\n\n try {\n for (const iconCache of cachesToRead.values()) {\n const requests = await iconCache.keys();\n for (const request of requests) {\n const app = appFromCacheRequest(request);\n if (app) {\n apps.add(app);\n }\n }\n }\n } catch (error) {\n console.warn('Unable to read provider icon cache entries', error);\n }\n\n return Array.from(apps);\n}\n\nasync function deleteCachedIcon(app: string, cache: Cache | undefined): Promise<boolean> {\n let hadMetadata = false;\n try {\n hadMetadata = localStorage.getItem(metadataKey(app)) !== null;\n localStorage.removeItem(metadataKey(app));\n } catch (error) {\n console.warn('Unable to clear provider icon metadata', error);\n }\n const objectUrl = objectUrls.get(app);\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n objectUrls.delete(app);\n }\n let deletedFromCache = false;\n try {\n deletedFromCache = (await cache?.delete(cacheRequest(app))) || false;\n } catch (error) {\n console.warn('Unable to clear provider icon cache entry', error);\n }\n return hadMetadata || deletedFromCache;\n}\n\nfunction metadataKey(app: string): string {\n return `${ICON_METADATA_PREFIX}${app}`;\n}\n\nfunction appFromCacheRequest(request: Request): string | undefined {\n try {\n const url = new URL(request.url);\n const prefix = '/launch-navigator-icons/';\n if (url.origin !== 'https://capgo.local' || !url.pathname.startsWith(prefix)) {\n return undefined;\n }\n\n const app = decodeURIComponent(url.pathname.slice(prefix.length));\n return app || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction setObjectUrl(app: string, url: string): void {\n const existing = objectUrls.get(app);\n if (existing) {\n URL.revokeObjectURL(existing);\n }\n objectUrls.set(app, url);\n}\n"]}
|