1   // Copyright 2015-present 650 Industries. All rights reserved.
2 
3 import Foundation
4 
5 @objc
6 public class EXDevLauncherUrl: NSObject {
7   @objc
8   public var url: URL
9 
10   @objc
11   public var queryParams: [String: String]
12 
13   @objc
14   public init(_ url: URL) {
15     self.queryParams = EXDevLauncherURLHelper.getQueryParamsForUrl(url)
16     self.url = url
17 
18     if (EXDevLauncherURLHelper.isDevLauncherURL(url)) {
19       if let urlParam = self.queryParams["url"] {
20         if let urlFromParam = URL.init(string: urlParam) {
21           self.url = EXDevLauncherURLHelper.replaceEXPScheme(urlFromParam, to: "http")
22         }
23       }
24     }
25 
26     super.init()
27   }
28 }
29 
30 @objc
31 public class EXDevLauncherURLHelper: NSObject {
32   @objc
33   public static func isDevLauncherURL(_ url: URL?) -> Bool {
34     return url?.host == "expo-development-client"
35   }
36 
37   @objc
38   public static func hasUrlQueryParam(_ url: URL) -> Bool {
39     var hasUrlQueryParam = false
40 
41     let components = URLComponents.init(url: url, resolvingAgainstBaseURL: false)
42 
43     for queryItem in components?.queryItems ?? [] {
44       if queryItem.name == "url" && queryItem.value != nil {
45         hasUrlQueryParam = true
46         break
47       }
48     }
49 
50     return hasUrlQueryParam
51   }
52 
53   @objc
54   public static func replaceEXPScheme(_ url: URL, to scheme: String) -> URL {
55     var components = URLComponents.init(url: url, resolvingAgainstBaseURL: false)!
56     if (components.scheme == "exp") {
57       components.scheme = scheme
58     }
59     return components.url!
60   }
61 
62   @objc
63   public static func getQueryParamsForUrl(_ url: URL) -> [String: String] {
64     let components = URLComponents.init(url: url, resolvingAgainstBaseURL: false)
65     var dict: [String: String] = [:]
66 
67     for parameter in components?.queryItems ?? [] {
68       dict[parameter.name] = parameter.value?.removingPercentEncoding ?? ""
69     }
70 
71     return dict
72   }
73 }
74