├── .build ├── manifest.db └── workspace-state.json ├── .gitignore ├── .swift-version ├── .travis.yml ├── LICENSE ├── Package.swift ├── README.md ├── Sources ├── URLPatterns │ ├── Counted.swift │ ├── CountedMatching.swift │ ├── FoundationExtensions.swift │ ├── PatternMatching.swift │ └── Regex.swift └── URLPatternsTests │ └── CountedTests.swift ├── TODO.md ├── URLPatterns.podspec └── URLPatterns.xcodeproj ├── URLPatternsTests_Info.plist ├── URLPatterns_Info.plist ├── project.pbxproj ├── project.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ ├── IDEWorkspaceChecks.plist │ └── WorkspaceSettings.xcsettings └── xcshareddata └── xcschemes └── URLPatterns-Package.xcscheme /.build/manifest.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johnpatrickmorgan/URLPatterns/212873d950bdaf516b74c67b63c048f95378157a/.build/manifest.db -------------------------------------------------------------------------------- /.build/workspace-state.json: -------------------------------------------------------------------------------- 1 | {"dependencies": [], "object": {"artifacts": [], "dependencies": []}, "version": 4} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | Carthage 26 | 27 | Pods/ 28 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 5.3 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * http://www.objc.io/issue-6/travis-ci.html 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | language: objective-c 6 | # cache: cocoapods 7 | # podfile: Example/Podfile 8 | # before_install: 9 | # - gem install cocoapods # Since Travis is not always on latest version 10 | # - pod install --project-directory=Example 11 | script: 12 | - set -o pipefail && xcodebuild test -workspace Example/RoutePatterns.xcworkspace -scheme RoutePatterns-Example -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO | xcpretty 13 | - pod lib lint 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 johnmorgan 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:6.0 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "URLPatterns", 7 | products: [ 8 | .library(name: "URLPatterns", targets: ["URLPatterns"]), 9 | ], 10 | dependencies: [], 11 | targets: [ 12 | .target( 13 | name: "URLPatterns", 14 | dependencies: [] 15 | ), 16 | .testTarget( 17 | name: "URLPatternsTests", 18 | dependencies: ["URLPatterns"] 19 | ), 20 | ] 21 | ) 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🎯 URLPatterns 🎯 2 | 3 | [![Version](https://img.shields.io/cocoapods/v/URLPatterns.svg?style=flat)](http://cocoapods.org/pods/URLPatterns) 4 | [![License](https://img.shields.io/cocoapods/l/URLPatterns.svg?style=flat)](http://cocoapods.org/pods/URLPatterns) 5 | ![Swift](https://img.shields.io/badge/Swift-5.3-orange.svg) 6 | 7 | URLPatterns is a small library to enable more idiomatic Swift pattern matching of URL path elements. 8 | 9 | `URL` is extended with the method `countedPathElements()`, which converts the URL's' array of path elements into a `Counted` enum. Each case in `Counted` has a different number of associated values, which makes pattern-matching each element easy: 10 | 11 | ```swift 12 | if case .n4("user", let userId, "profile", _) = url.countedPathElements() { 13 | // show profile for userId 14 | } 15 | ``` 16 | 17 | `Counted` enables us to pattern match paths with any number of elements, and supports **expression**, **wildcard** and **value-binding** patterns for its associated values. It can match based on `Begins` and `Ends`, which match based on the first/ last elements only, and can even match a particular path element based on a regular expression. Here's an example of a `DeepLink` enum which has a failable initializer that takes a `URL`: 18 | 19 | 20 | ```swift 21 | enum DeepLink { 22 | 23 | case home, history, settings, terms, news, contact 24 | case chat(room: String) 25 | case profile(userId: String) 26 | } 27 | 28 | extension DeepLink { 29 | 30 | init?(url: URL) { 31 | 32 | guard url.scheme == "myscheme" else { return nil } 33 | guard url.host == "myhost" else { return nil } 34 | 35 | switch url.countedPathComponents() { 36 | 37 | case .n0, .n1(""): self = .home 38 | case .n1("history"): self = .history 39 | case .n2(_, "settings"): self = .settings 40 | case .n2("chat", let room): self = .chat(room: room) 41 | case .n3("users", let userId, "profile"): self = .profile(userId: userId) 42 | case .n1(Regex(contact.*)) self = .contact 43 | case Begins("news", "latest"): self = .news 44 | case Ends("terms"): self = .terms 45 | default: return nil 46 | } 47 | } 48 | } 49 | ``` 50 | 51 | ## Installation 52 | 53 | URLPatterns is available through [CocoaPods](http://cocoapods.org). To install 54 | it, simply add the following line to your Podfile: 55 | 56 | ```ruby 57 | pod "URLPatterns" 58 | ``` 59 | 60 | ## License 61 | 62 | URLPatterns is available under the MIT license. See the LICENSE file for more info. 63 | -------------------------------------------------------------------------------- /Sources/URLPatterns/Counted.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Counted.swift 3 | // Pods 4 | // 5 | // Created by John Morgan on 29/04/2016. 6 | // 7 | // 8 | 9 | public enum Counted { 10 | 11 | public typealias E = Element 12 | 13 | case n0 14 | case n1(E) 15 | case n2(E, E) 16 | case n3(E, E, E) 17 | case n4(E, E, E, E) 18 | case n5(E, E, E, E, E) 19 | case n6(E, E, E, E, E, E) 20 | case n7(E, E, E, E, E, E, E) 21 | case n8(E, E, E, E, E, E, E, E) 22 | case n9(E, E, E, E, E, E, E, E, E) 23 | 24 | indirect case n10(E, E, E, E, E, E, E, E, E, E, plus: Counted) 25 | 26 | public init(_ elements: [Element]) { 27 | 28 | let e = elements 29 | 30 | switch e.count { 31 | case 0: 32 | self = .n0 33 | case 1: 34 | self = .n1(e[0]) 35 | case 2: 36 | self = .n2(e[0], e[1]) 37 | case 3: 38 | self = .n3(e[0], e[1], e[2]) 39 | case 4: 40 | self = .n4(e[0], e[1], e[2], e[3]) 41 | case 5: 42 | self = .n5(e[0], e[1], e[2], e[3], e[4]) 43 | case 6: 44 | self = .n6(e[0], e[1], e[2], e[3], e[4], e[5]) 45 | case 7: 46 | self = .n7(e[0], e[1], e[2], e[3], e[4], e[5], e[6]) 47 | case 8: 48 | self = .n8(e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7]) 49 | case 9: 50 | self = .n9(e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8]) 51 | default: 52 | self = .n10(e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9], plus: Counted(Array(e[elements.indices.suffix(from: 10)]))) 53 | } 54 | } 55 | 56 | public init(elements: Element...) { 57 | 58 | self.init(elements) 59 | } 60 | 61 | public init(sequence: S) where S.Iterator.Element == Element { 62 | 63 | self.init(Array(sequence)) 64 | } 65 | 66 | public var elements: [Element] { 67 | 68 | switch self { 69 | case .n0: 70 | return [] 71 | case let .n1(e1): 72 | return [e1] 73 | case let .n2(e1, e2): 74 | return [e1, e2] 75 | case let .n3(e1, e2, e3): 76 | return [e1, e2, e3] 77 | case let .n4(e1, e2, e3, e4): 78 | return [e1, e2, e3, e4] 79 | case let .n5(e1, e2, e3, e4, e5): 80 | return [e1, e2, e3, e4, e5] 81 | case let .n6(e1, e2, e3, e4, e5, e6): 82 | return [e1, e2, e3, e4, e5, e6] 83 | case let .n7(e1, e2, e3, e4, e5, e6, e7): 84 | return [e1, e2, e3, e4, e5, e6, e7] 85 | case let .n8(e1, e2, e3, e4, e5, e6, e7, e8): 86 | return [e1, e2, e3, e4, e5, e6, e7, e8] 87 | case let .n9(e1, e2, e3, e4, e5, e6, e7, e8, e9): 88 | return [e1, e2, e3, e4, e5, e6, e7, e8, e9] 89 | case let .n10(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, remainder): 90 | return [e1, e2, e3, e4, e5, e6, e7, e8, e9, e10] + remainder.elements 91 | } 92 | } 93 | 94 | public mutating func append(_ x: Element) { 95 | 96 | self = Counted(elements + [x]) 97 | } 98 | 99 | public mutating func removeLast() -> Element? { 100 | 101 | switch self { 102 | case .n0: return nil 103 | default: 104 | var elements = self.elements 105 | let popped = elements.removeLast() 106 | self = Counted(elements) 107 | return popped 108 | } 109 | } 110 | 111 | public mutating func removeFirst() -> Element? { 112 | 113 | switch self { 114 | case .n0: return nil 115 | default: 116 | var elements = self.elements 117 | let popped = elements.removeFirst() 118 | self = Counted(elements) 119 | return popped 120 | } 121 | } 122 | 123 | public subscript(index: Int) -> Element { 124 | 125 | return elements[index] 126 | } 127 | } 128 | 129 | extension Counted: Sequence { 130 | 131 | public func makeIterator() -> AnyIterator { 132 | 133 | var current = self 134 | return AnyIterator { 135 | current.removeFirst() 136 | } 137 | } 138 | } 139 | 140 | extension Counted: ExpressibleByArrayLiteral { 141 | 142 | public init(arrayLiteral elements: Element...) { 143 | 144 | self.init(elements) 145 | } 146 | } 147 | 148 | extension Counted: Equatable where Element: Equatable { 149 | 150 | public static func == (lhs: Counted, rhs: Counted) -> Bool { 151 | return lhs.elements == rhs.elements 152 | } 153 | } 154 | 155 | extension Counted: Sendable where Element: Sendable {} 156 | -------------------------------------------------------------------------------- /Sources/URLPatterns/CountedMatching.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CountedMatching.swift 3 | // Pods 4 | // 5 | // Created by John Morgan on 14/05/2016. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | public protocol CountedMatching { 12 | 13 | associatedtype Value 14 | 15 | func matches(_ value: Counted) -> Bool 16 | } 17 | 18 | public func ~=(pattern: E, value: Counted) -> Bool where E.Value: PatternMatching { 19 | 20 | return pattern.matches(value) 21 | } 22 | 23 | public struct Begins: CountedMatching { 24 | 25 | var patternElements: [Element] 26 | 27 | public init(_ elements: Element...) { 28 | 29 | self.patternElements = elements 30 | } 31 | 32 | public func matches(_ value: Counted) -> Bool { 33 | 34 | return patternElements ~= Array(value.elements.prefix(patternElements.count)) 35 | } 36 | } 37 | 38 | public struct Ends: CountedMatching { 39 | 40 | var patternElements: [Element] 41 | 42 | public init(_ elements: Element...) { 43 | 44 | self.patternElements = elements 45 | } 46 | 47 | public func matches(_ value: Counted) -> Bool { 48 | 49 | return patternElements ~= Array(value.elements.suffix(patternElements.count)) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Sources/URLPatterns/FoundationExtensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FoundationExtensions.swift 3 | // Pods 4 | // 5 | // Created by John Morgan on 29/04/2016. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | extension URLComponents { 12 | 13 | public func queryArguments() -> [String : String?] { 14 | 15 | var arguments = [String : String?]() 16 | 17 | for item in queryItems ?? [] { 18 | arguments[item.name] = item.value 19 | } 20 | return arguments 21 | } 22 | 23 | public func flatQueryArguments() -> [String : String] { 24 | 25 | var arguments = [String : String]() 26 | 27 | for (key, value) in queryArguments() { 28 | if value != nil { 29 | arguments[key] = value 30 | } 31 | } 32 | return arguments 33 | } 34 | } 35 | 36 | extension URL { 37 | 38 | public func countedPathComponents(_ excludingLeadingBackslash: Bool = true) -> Counted { 39 | 40 | if let first = pathComponents.first , excludingLeadingBackslash && first == "/" { 41 | return Counted(sequence: pathComponents.dropFirst()) 42 | } 43 | return Counted(pathComponents) 44 | } 45 | } 46 | 47 | extension URL { 48 | 49 | public func queryArguments() -> [String : String?] { 50 | 51 | guard let components = URLComponents(url: self, resolvingAgainstBaseURL: true) else { return [:] } 52 | 53 | return components.queryArguments() 54 | } 55 | 56 | public func flatQueryArguments() -> [String : String] { 57 | 58 | guard let components = URLComponents(url: self, resolvingAgainstBaseURL: true) else { return [:] } 59 | 60 | return components.flatQueryArguments() 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Sources/URLPatterns/PatternMatching.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatternMatching.swift 3 | // Pods 4 | // 5 | // Created by John Morgan on 20/05/2016. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | public protocol PatternMatching { 12 | 13 | associatedtype MatchValue 14 | 15 | static func ~=(lhs: Self, rhs: MatchValue) -> Bool 16 | } 17 | 18 | public func ~=(patterns: [E], values: [E.MatchValue]) -> Bool { 19 | 20 | guard patterns.count == values.count else { return false } 21 | 22 | for (index, pattern) in patterns.enumerated() { 23 | if !(pattern ~= values[index]) { return false } 24 | } 25 | return true 26 | } 27 | 28 | extension String: PatternMatching { 29 | 30 | public typealias MatchValue = String 31 | } 32 | -------------------------------------------------------------------------------- /Sources/URLPatterns/Regex.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringMatching.swift 3 | // Pods 4 | // 5 | // Created by John Morgan on 20/05/2016. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | public func ~=(regex: Regex, string: String) -> Bool { 12 | 13 | return regex.matches(string, options: [.anchored]) 14 | } 15 | 16 | public struct Regex: PatternMatching { 17 | 18 | public typealias MatchValue = String 19 | 20 | public private(set) var regex: NSRegularExpression? 21 | 22 | public init(regExp: NSRegularExpression) { 23 | 24 | self.regex = regExp 25 | } 26 | 27 | public init(_ pattern: String, _ options: NSRegularExpression.Options = [.caseInsensitive]) { 28 | 29 | do { 30 | self.regex = try NSRegularExpression(pattern: pattern, options: options) 31 | } catch { 32 | assertionFailure("Invalid Regex: \(error)") 33 | } 34 | } 35 | 36 | func matches(_ string: String, options: NSRegularExpression.MatchingOptions = []) -> Bool { 37 | 38 | return regex?.matchesWhole(string, options: options) ?? false 39 | } 40 | } 41 | 42 | extension NSRegularExpression { 43 | 44 | func matchesWhole(_ string: String, options: NSRegularExpression.MatchingOptions = []) -> Bool { 45 | 46 | let length = (string as NSString).length 47 | var hit = false 48 | enumerateMatches(in: string, options: options, range: NSMakeRange(0, length)) { result, flags, stop in 49 | guard let match = result else { return } 50 | if match.range.location == 0 && match.range.length == length { 51 | hit = true 52 | stop.pointee = true 53 | } 54 | } 55 | return hit 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Sources/URLPatternsTests/CountedTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import URLPatterns 3 | 4 | class CountedTests: XCTestCase { 5 | 6 | func testCountedInstantiation() throws { 7 | let counted = Counted([1, 2, 3]) 8 | XCTAssert(counted == .n3(1, 2, 3)) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | ## TODO 2 | 3 | - Tests 4 | - Documentation 5 | - Make Counted conform to CollectionType? 6 | - Add matching for Contains? 7 | -------------------------------------------------------------------------------- /URLPatterns.podspec: -------------------------------------------------------------------------------- 1 | 2 | Pod::Spec.new do |s| 3 | s.name = "URLPatterns" 4 | s.version = "0.2.2" 5 | s.summary = "A small library to enable more idiomatic Swift pattern matching of URL path elements." 6 | 7 | s.description = <<-DESC 8 | URLPatterns is a small library to enable more idiomatic Swift pattern matching of URL path elements. 9 | `NSURL` is extended with the method `countedPathElements()`, which converts the URL's' array of path elements 10 | into a `Counted` enum. Each case in `Counted` has a different number of associated values, which makes 11 | pattern-matching each element easy, including wildcard, value-binding, begins and ends patterns. 12 | DESC 13 | 14 | s.homepage = "https://github.com/johnpatrickmorgan/URLPatterns" 15 | s.license = 'MIT' 16 | s.author = { "johnmorgan" => "johnpatrickmorganuk@gmail.com" } 17 | s.source = { :git => "https://github.com/johnpatrickmorgan/URLPatterns.git", :tag => s.version.to_s } 18 | s.social_media_url = 'https://twitter.com/jpmmusic' 19 | s.ios.deployment_target = '8.0' 20 | s.osx.deployment_target = '10.10' 21 | s.source_files = 'Sources/URLPatterns/**/*' 22 | end 23 | -------------------------------------------------------------------------------- /URLPatterns.xcodeproj/URLPatternsTests_Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | CFBundleDevelopmentRegion 5 | en 6 | CFBundleExecutable 7 | $(EXECUTABLE_NAME) 8 | CFBundleIdentifier 9 | $(PRODUCT_BUNDLE_IDENTIFIER) 10 | CFBundleInfoDictionaryVersion 11 | 6.0 12 | CFBundleName 13 | $(PRODUCT_NAME) 14 | CFBundlePackageType 15 | BNDL 16 | CFBundleShortVersionString 17 | 1.0 18 | CFBundleSignature 19 | ???? 20 | CFBundleVersion 21 | $(CURRENT_PROJECT_VERSION) 22 | NSPrincipalClass 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /URLPatterns.xcodeproj/URLPatterns_Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | CFBundleDevelopmentRegion 5 | en 6 | CFBundleExecutable 7 | $(EXECUTABLE_NAME) 8 | CFBundleIdentifier 9 | $(PRODUCT_BUNDLE_IDENTIFIER) 10 | CFBundleInfoDictionaryVersion 11 | 6.0 12 | CFBundleName 13 | $(PRODUCT_NAME) 14 | CFBundlePackageType 15 | FMWK 16 | CFBundleShortVersionString 17 | 1.0 18 | CFBundleSignature 19 | ???? 20 | CFBundleVersion 21 | $(CURRENT_PROJECT_VERSION) 22 | NSPrincipalClass 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /URLPatterns.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXAggregateTarget section */ 10 | "URLPatterns::URLPatternsPackageTests::ProductTarget" /* URLPatternsPackageTests */ = { 11 | isa = PBXAggregateTarget; 12 | buildConfigurationList = OBJ_42 /* Build configuration list for PBXAggregateTarget "URLPatternsPackageTests" */; 13 | buildPhases = ( 14 | ); 15 | dependencies = ( 16 | OBJ_45 /* PBXTargetDependency */, 17 | ); 18 | name = URLPatternsPackageTests; 19 | productName = URLPatternsPackageTests; 20 | }; 21 | /* End PBXAggregateTarget section */ 22 | 23 | /* Begin PBXBuildFile section */ 24 | OBJ_29 /* Counted.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_9 /* Counted.swift */; }; 25 | OBJ_30 /* CountedMatching.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* CountedMatching.swift */; }; 26 | OBJ_31 /* FoundationExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* FoundationExtensions.swift */; }; 27 | OBJ_32 /* PatternMatching.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* PatternMatching.swift */; }; 28 | OBJ_33 /* Regex.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_13 /* Regex.swift */; }; 29 | OBJ_40 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; }; 30 | OBJ_51 /* CountedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* CountedTests.swift */; }; 31 | OBJ_53 /* URLPatterns.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "URLPatterns::URLPatterns::Product" /* URLPatterns.framework */; }; 32 | /* End PBXBuildFile section */ 33 | 34 | /* Begin PBXContainerItemProxy section */ 35 | 52A703C32DF242A600AD23D2 /* PBXContainerItemProxy */ = { 36 | isa = PBXContainerItemProxy; 37 | containerPortal = OBJ_1 /* Project object */; 38 | proxyType = 1; 39 | remoteGlobalIDString = "URLPatterns::URLPatterns"; 40 | remoteInfo = URLPatterns; 41 | }; 42 | 52A703C42DF242A700AD23D2 /* PBXContainerItemProxy */ = { 43 | isa = PBXContainerItemProxy; 44 | containerPortal = OBJ_1 /* Project object */; 45 | proxyType = 1; 46 | remoteGlobalIDString = "URLPatterns::URLPatternsTests"; 47 | remoteInfo = URLPatternsTests; 48 | }; 49 | /* End PBXContainerItemProxy section */ 50 | 51 | /* Begin PBXFileReference section */ 52 | OBJ_10 /* CountedMatching.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountedMatching.swift; sourceTree = ""; }; 53 | OBJ_11 /* FoundationExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoundationExtensions.swift; sourceTree = ""; }; 54 | OBJ_12 /* PatternMatching.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PatternMatching.swift; sourceTree = ""; }; 55 | OBJ_13 /* Regex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Regex.swift; sourceTree = ""; }; 56 | OBJ_16 /* CountedTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountedTests.swift; sourceTree = ""; }; 57 | OBJ_20 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 58 | OBJ_21 /* URLPatterns.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = URLPatterns.podspec; sourceTree = ""; }; 59 | OBJ_22 /* TODO.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = TODO.md; sourceTree = ""; }; 60 | OBJ_23 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 61 | OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; 62 | OBJ_9 /* Counted.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Counted.swift; sourceTree = ""; }; 63 | "URLPatterns::URLPatterns::Product" /* URLPatterns.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = URLPatterns.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 64 | "URLPatterns::URLPatternsTests::Product" /* URLPatternsTests.xctest */ = {isa = PBXFileReference; lastKnownFileType = file; path = URLPatternsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | /* End PBXFileReference section */ 66 | 67 | /* Begin PBXFrameworksBuildPhase section */ 68 | OBJ_34 /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 0; 71 | files = ( 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | OBJ_52 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 0; 78 | files = ( 79 | OBJ_53 /* URLPatterns.framework in Frameworks */, 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | /* End PBXFrameworksBuildPhase section */ 84 | 85 | /* Begin PBXGroup section */ 86 | OBJ_14 /* Tests */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | OBJ_15 /* URLPatternsTests */, 90 | ); 91 | name = Tests; 92 | sourceTree = SOURCE_ROOT; 93 | }; 94 | OBJ_15 /* URLPatternsTests */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | OBJ_16 /* CountedTests.swift */, 98 | ); 99 | name = URLPatternsTests; 100 | path = Sources/URLPatternsTests; 101 | sourceTree = SOURCE_ROOT; 102 | }; 103 | OBJ_17 /* Products */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | "URLPatterns::URLPatternsTests::Product" /* URLPatternsTests.xctest */, 107 | "URLPatterns::URLPatterns::Product" /* URLPatterns.framework */, 108 | ); 109 | name = Products; 110 | sourceTree = BUILT_PRODUCTS_DIR; 111 | }; 112 | OBJ_5 /* */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | OBJ_6 /* Package.swift */, 116 | OBJ_7 /* Sources */, 117 | OBJ_14 /* Tests */, 118 | OBJ_17 /* Products */, 119 | OBJ_20 /* LICENSE */, 120 | OBJ_21 /* URLPatterns.podspec */, 121 | OBJ_22 /* TODO.md */, 122 | OBJ_23 /* README.md */, 123 | ); 124 | name = ""; 125 | sourceTree = ""; 126 | }; 127 | OBJ_7 /* Sources */ = { 128 | isa = PBXGroup; 129 | children = ( 130 | OBJ_8 /* URLPatterns */, 131 | ); 132 | name = Sources; 133 | sourceTree = SOURCE_ROOT; 134 | }; 135 | OBJ_8 /* URLPatterns */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | OBJ_9 /* Counted.swift */, 139 | OBJ_10 /* CountedMatching.swift */, 140 | OBJ_11 /* FoundationExtensions.swift */, 141 | OBJ_12 /* PatternMatching.swift */, 142 | OBJ_13 /* Regex.swift */, 143 | ); 144 | name = URLPatterns; 145 | path = Sources/URLPatterns; 146 | sourceTree = SOURCE_ROOT; 147 | }; 148 | /* End PBXGroup section */ 149 | 150 | /* Begin PBXNativeTarget section */ 151 | "URLPatterns::SwiftPMPackageDescription" /* URLPatternsPackageDescription */ = { 152 | isa = PBXNativeTarget; 153 | buildConfigurationList = OBJ_36 /* Build configuration list for PBXNativeTarget "URLPatternsPackageDescription" */; 154 | buildPhases = ( 155 | OBJ_39 /* Sources */, 156 | ); 157 | buildRules = ( 158 | ); 159 | dependencies = ( 160 | ); 161 | name = URLPatternsPackageDescription; 162 | productName = URLPatternsPackageDescription; 163 | productType = "com.apple.product-type.framework"; 164 | }; 165 | "URLPatterns::URLPatterns" /* URLPatterns */ = { 166 | isa = PBXNativeTarget; 167 | buildConfigurationList = OBJ_25 /* Build configuration list for PBXNativeTarget "URLPatterns" */; 168 | buildPhases = ( 169 | OBJ_28 /* Sources */, 170 | OBJ_34 /* Frameworks */, 171 | ); 172 | buildRules = ( 173 | ); 174 | dependencies = ( 175 | ); 176 | name = URLPatterns; 177 | productName = URLPatterns; 178 | productReference = "URLPatterns::URLPatterns::Product" /* URLPatterns.framework */; 179 | productType = "com.apple.product-type.framework"; 180 | }; 181 | "URLPatterns::URLPatternsTests" /* URLPatternsTests */ = { 182 | isa = PBXNativeTarget; 183 | buildConfigurationList = OBJ_47 /* Build configuration list for PBXNativeTarget "URLPatternsTests" */; 184 | buildPhases = ( 185 | OBJ_50 /* Sources */, 186 | OBJ_52 /* Frameworks */, 187 | ); 188 | buildRules = ( 189 | ); 190 | dependencies = ( 191 | OBJ_54 /* PBXTargetDependency */, 192 | ); 193 | name = URLPatternsTests; 194 | productName = URLPatternsTests; 195 | productReference = "URLPatterns::URLPatternsTests::Product" /* URLPatternsTests.xctest */; 196 | productType = "com.apple.product-type.bundle.unit-test"; 197 | }; 198 | /* End PBXNativeTarget section */ 199 | 200 | /* Begin PBXProject section */ 201 | OBJ_1 /* Project object */ = { 202 | isa = PBXProject; 203 | attributes = { 204 | LastSwiftMigration = 9999; 205 | LastUpgradeCheck = 9999; 206 | }; 207 | buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "URLPatterns" */; 208 | compatibilityVersion = "Xcode 3.2"; 209 | developmentRegion = en; 210 | hasScannedForEncodings = 0; 211 | knownRegions = ( 212 | en, 213 | ); 214 | mainGroup = OBJ_5 /* */; 215 | productRefGroup = OBJ_17 /* Products */; 216 | projectDirPath = ""; 217 | projectRoot = ""; 218 | targets = ( 219 | "URLPatterns::URLPatterns" /* URLPatterns */, 220 | "URLPatterns::SwiftPMPackageDescription" /* URLPatternsPackageDescription */, 221 | "URLPatterns::URLPatternsPackageTests::ProductTarget" /* URLPatternsPackageTests */, 222 | "URLPatterns::URLPatternsTests" /* URLPatternsTests */, 223 | ); 224 | }; 225 | /* End PBXProject section */ 226 | 227 | /* Begin PBXSourcesBuildPhase section */ 228 | OBJ_28 /* Sources */ = { 229 | isa = PBXSourcesBuildPhase; 230 | buildActionMask = 0; 231 | files = ( 232 | OBJ_29 /* Counted.swift in Sources */, 233 | OBJ_30 /* CountedMatching.swift in Sources */, 234 | OBJ_31 /* FoundationExtensions.swift in Sources */, 235 | OBJ_32 /* PatternMatching.swift in Sources */, 236 | OBJ_33 /* Regex.swift in Sources */, 237 | ); 238 | runOnlyForDeploymentPostprocessing = 0; 239 | }; 240 | OBJ_39 /* Sources */ = { 241 | isa = PBXSourcesBuildPhase; 242 | buildActionMask = 0; 243 | files = ( 244 | OBJ_40 /* Package.swift in Sources */, 245 | ); 246 | runOnlyForDeploymentPostprocessing = 0; 247 | }; 248 | OBJ_50 /* Sources */ = { 249 | isa = PBXSourcesBuildPhase; 250 | buildActionMask = 0; 251 | files = ( 252 | OBJ_51 /* CountedTests.swift in Sources */, 253 | ); 254 | runOnlyForDeploymentPostprocessing = 0; 255 | }; 256 | /* End PBXSourcesBuildPhase section */ 257 | 258 | /* Begin PBXTargetDependency section */ 259 | OBJ_45 /* PBXTargetDependency */ = { 260 | isa = PBXTargetDependency; 261 | target = "URLPatterns::URLPatternsTests" /* URLPatternsTests */; 262 | targetProxy = 52A703C42DF242A700AD23D2 /* PBXContainerItemProxy */; 263 | }; 264 | OBJ_54 /* PBXTargetDependency */ = { 265 | isa = PBXTargetDependency; 266 | target = "URLPatterns::URLPatterns" /* URLPatterns */; 267 | targetProxy = 52A703C32DF242A600AD23D2 /* PBXContainerItemProxy */; 268 | }; 269 | /* End PBXTargetDependency section */ 270 | 271 | /* Begin XCBuildConfiguration section */ 272 | OBJ_26 /* Debug */ = { 273 | isa = XCBuildConfiguration; 274 | buildSettings = { 275 | ENABLE_TESTABILITY = YES; 276 | FRAMEWORK_SEARCH_PATHS = ( 277 | "$(inherited)", 278 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 279 | ); 280 | HEADER_SEARCH_PATHS = "$(inherited)"; 281 | INFOPLIST_FILE = URLPatterns.xcodeproj/URLPatterns_Info.plist; 282 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 283 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; 284 | MACOSX_DEPLOYMENT_TARGET = 11.5; 285 | OTHER_CFLAGS = "$(inherited)"; 286 | OTHER_LDFLAGS = "$(inherited)"; 287 | OTHER_SWIFT_FLAGS = "$(inherited)"; 288 | PRODUCT_BUNDLE_IDENTIFIER = URLPatterns; 289 | PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; 290 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 291 | SKIP_INSTALL = YES; 292 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; 293 | SWIFT_VERSION = 5.0; 294 | TARGET_NAME = URLPatterns; 295 | TVOS_DEPLOYMENT_TARGET = 9.0; 296 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 297 | }; 298 | name = Debug; 299 | }; 300 | OBJ_27 /* Release */ = { 301 | isa = XCBuildConfiguration; 302 | buildSettings = { 303 | ENABLE_TESTABILITY = YES; 304 | FRAMEWORK_SEARCH_PATHS = ( 305 | "$(inherited)", 306 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 307 | ); 308 | HEADER_SEARCH_PATHS = "$(inherited)"; 309 | INFOPLIST_FILE = URLPatterns.xcodeproj/URLPatterns_Info.plist; 310 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 311 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; 312 | MACOSX_DEPLOYMENT_TARGET = 11.5; 313 | OTHER_CFLAGS = "$(inherited)"; 314 | OTHER_LDFLAGS = "$(inherited)"; 315 | OTHER_SWIFT_FLAGS = "$(inherited)"; 316 | PRODUCT_BUNDLE_IDENTIFIER = URLPatterns; 317 | PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; 318 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 319 | SKIP_INSTALL = YES; 320 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; 321 | SWIFT_VERSION = 5.0; 322 | TARGET_NAME = URLPatterns; 323 | TVOS_DEPLOYMENT_TARGET = 9.0; 324 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 325 | }; 326 | name = Release; 327 | }; 328 | OBJ_3 /* Debug */ = { 329 | isa = XCBuildConfiguration; 330 | buildSettings = { 331 | CLANG_ENABLE_OBJC_ARC = YES; 332 | COMBINE_HIDPI_IMAGES = YES; 333 | COPY_PHASE_STRIP = NO; 334 | DEBUG_INFORMATION_FORMAT = dwarf; 335 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 336 | ENABLE_NS_ASSERTIONS = YES; 337 | GCC_OPTIMIZATION_LEVEL = 0; 338 | GCC_PREPROCESSOR_DEFINITIONS = ( 339 | "$(inherited)", 340 | "SWIFT_PACKAGE=1", 341 | "DEBUG=1", 342 | ); 343 | MACOSX_DEPLOYMENT_TARGET = 10.10; 344 | ONLY_ACTIVE_ARCH = YES; 345 | OTHER_SWIFT_FLAGS = "$(inherited) -DXcode"; 346 | PRODUCT_NAME = "$(TARGET_NAME)"; 347 | SDKROOT = macosx; 348 | SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; 349 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE DEBUG"; 350 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 351 | USE_HEADERMAP = NO; 352 | }; 353 | name = Debug; 354 | }; 355 | OBJ_37 /* Debug */ = { 356 | isa = XCBuildConfiguration; 357 | buildSettings = { 358 | LD = /usr/bin/true; 359 | OTHER_SWIFT_FLAGS = "-swift-version 5 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -package-description-version 5.3.0"; 360 | SWIFT_VERSION = 5.0; 361 | }; 362 | name = Debug; 363 | }; 364 | OBJ_38 /* Release */ = { 365 | isa = XCBuildConfiguration; 366 | buildSettings = { 367 | LD = /usr/bin/true; 368 | OTHER_SWIFT_FLAGS = "-swift-version 5 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -package-description-version 5.3.0"; 369 | SWIFT_VERSION = 5.0; 370 | }; 371 | name = Release; 372 | }; 373 | OBJ_4 /* Release */ = { 374 | isa = XCBuildConfiguration; 375 | buildSettings = { 376 | CLANG_ENABLE_OBJC_ARC = YES; 377 | COMBINE_HIDPI_IMAGES = YES; 378 | COPY_PHASE_STRIP = YES; 379 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 380 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 381 | GCC_OPTIMIZATION_LEVEL = s; 382 | GCC_PREPROCESSOR_DEFINITIONS = ( 383 | "$(inherited)", 384 | "SWIFT_PACKAGE=1", 385 | ); 386 | MACOSX_DEPLOYMENT_TARGET = 10.10; 387 | OTHER_SWIFT_FLAGS = "$(inherited) -DXcode"; 388 | PRODUCT_NAME = "$(TARGET_NAME)"; 389 | SDKROOT = macosx; 390 | SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; 391 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE"; 392 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 393 | USE_HEADERMAP = NO; 394 | }; 395 | name = Release; 396 | }; 397 | OBJ_43 /* Debug */ = { 398 | isa = XCBuildConfiguration; 399 | buildSettings = { 400 | }; 401 | name = Debug; 402 | }; 403 | OBJ_44 /* Release */ = { 404 | isa = XCBuildConfiguration; 405 | buildSettings = { 406 | }; 407 | name = Release; 408 | }; 409 | OBJ_48 /* Debug */ = { 410 | isa = XCBuildConfiguration; 411 | buildSettings = { 412 | CLANG_ENABLE_MODULES = YES; 413 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; 414 | FRAMEWORK_SEARCH_PATHS = ( 415 | "$(inherited)", 416 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 417 | ); 418 | HEADER_SEARCH_PATHS = "$(inherited)"; 419 | INFOPLIST_FILE = URLPatterns.xcodeproj/URLPatternsTests_Info.plist; 420 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 421 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks @loader_path/Frameworks"; 422 | MACOSX_DEPLOYMENT_TARGET = 10.15; 423 | OTHER_CFLAGS = "$(inherited)"; 424 | OTHER_LDFLAGS = "$(inherited)"; 425 | OTHER_SWIFT_FLAGS = "$(inherited)"; 426 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; 427 | SWIFT_VERSION = 5.0; 428 | TARGET_NAME = URLPatternsTests; 429 | TVOS_DEPLOYMENT_TARGET = 9.0; 430 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 431 | }; 432 | name = Debug; 433 | }; 434 | OBJ_49 /* Release */ = { 435 | isa = XCBuildConfiguration; 436 | buildSettings = { 437 | CLANG_ENABLE_MODULES = YES; 438 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; 439 | FRAMEWORK_SEARCH_PATHS = ( 440 | "$(inherited)", 441 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 442 | ); 443 | HEADER_SEARCH_PATHS = "$(inherited)"; 444 | INFOPLIST_FILE = URLPatterns.xcodeproj/URLPatternsTests_Info.plist; 445 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 446 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks @loader_path/Frameworks"; 447 | MACOSX_DEPLOYMENT_TARGET = 10.15; 448 | OTHER_CFLAGS = "$(inherited)"; 449 | OTHER_LDFLAGS = "$(inherited)"; 450 | OTHER_SWIFT_FLAGS = "$(inherited)"; 451 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; 452 | SWIFT_VERSION = 5.0; 453 | TARGET_NAME = URLPatternsTests; 454 | TVOS_DEPLOYMENT_TARGET = 9.0; 455 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 456 | }; 457 | name = Release; 458 | }; 459 | /* End XCBuildConfiguration section */ 460 | 461 | /* Begin XCConfigurationList section */ 462 | OBJ_2 /* Build configuration list for PBXProject "URLPatterns" */ = { 463 | isa = XCConfigurationList; 464 | buildConfigurations = ( 465 | OBJ_3 /* Debug */, 466 | OBJ_4 /* Release */, 467 | ); 468 | defaultConfigurationIsVisible = 0; 469 | defaultConfigurationName = Release; 470 | }; 471 | OBJ_25 /* Build configuration list for PBXNativeTarget "URLPatterns" */ = { 472 | isa = XCConfigurationList; 473 | buildConfigurations = ( 474 | OBJ_26 /* Debug */, 475 | OBJ_27 /* Release */, 476 | ); 477 | defaultConfigurationIsVisible = 0; 478 | defaultConfigurationName = Release; 479 | }; 480 | OBJ_36 /* Build configuration list for PBXNativeTarget "URLPatternsPackageDescription" */ = { 481 | isa = XCConfigurationList; 482 | buildConfigurations = ( 483 | OBJ_37 /* Debug */, 484 | OBJ_38 /* Release */, 485 | ); 486 | defaultConfigurationIsVisible = 0; 487 | defaultConfigurationName = Release; 488 | }; 489 | OBJ_42 /* Build configuration list for PBXAggregateTarget "URLPatternsPackageTests" */ = { 490 | isa = XCConfigurationList; 491 | buildConfigurations = ( 492 | OBJ_43 /* Debug */, 493 | OBJ_44 /* Release */, 494 | ); 495 | defaultConfigurationIsVisible = 0; 496 | defaultConfigurationName = Release; 497 | }; 498 | OBJ_47 /* Build configuration list for PBXNativeTarget "URLPatternsTests" */ = { 499 | isa = XCConfigurationList; 500 | buildConfigurations = ( 501 | OBJ_48 /* Debug */, 502 | OBJ_49 /* Release */, 503 | ); 504 | defaultConfigurationIsVisible = 0; 505 | defaultConfigurationName = Release; 506 | }; 507 | /* End XCConfigurationList section */ 508 | }; 509 | rootObject = OBJ_1 /* Project object */; 510 | } 511 | -------------------------------------------------------------------------------- /URLPatterns.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /URLPatterns.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /URLPatterns.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | -------------------------------------------------------------------------------- /URLPatterns.xcodeproj/xcshareddata/xcschemes/URLPatterns-Package.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 54 | 60 | 61 | 63 | 64 | 67 | 68 | 69 | --------------------------------------------------------------------------------