├── .editorconfig ├── .gitignore ├── CHANGELOG.md ├── README.md ├── documentation.json ├── elm.json ├── package.json ├── src ├── Erl.elm ├── Erl │ ├── DeadEnd.elm │ ├── Parsers.elm │ ├── ParsersTests.elm │ ├── Query.elm │ └── QueryTests.elm └── ErlTests.elm ├── support └── prepare_test.sh ├── tests ├── .gitignore ├── Main.elm └── elm-package.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | 8 | [*.elm] 9 | indent_style = space 10 | indent_size = 4 11 | 12 | [*.yml] 13 | indent_style = space 14 | indent_size = 2 15 | 16 | [Makefile] 17 | indent_style = tab 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | index.html 2 | elm-stuff 3 | elm.js 4 | node_modules 5 | .DS_Store 6 | yarn-error.log 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 14.0.0 4 | 5 | This version is a major re-write, it now uses `elm-tools/parser`. 6 | 7 | ### Changed 8 | 9 | - `parse` now returns a `Result` 10 | - `host` is now a string. 11 | - Renamed `path` to `pathname` 12 | - `pathname` is now a string. 13 | 14 | ### Removed 15 | 16 | - Path as `List String` 17 | - Path operations 18 | - Implicit ports based on the protocol 19 | - Decoding when parsing 20 | 21 | This version removes many features that the previous version had, please open issues if you consider any missing feature necessary. 22 | 23 | ## 13.0.1 24 | 25 | - Do not include port 443 (default) when protocol is https 26 | 27 | ## 13.0.1 28 | 29 | - Fix parsing bugs see https://github.com/sporto/erl/pull/20 30 | 31 | ## 13.0.0 32 | 33 | - Added `toAbsoluteString` 34 | - `queryToString` takes an url again as in v11 35 | - Added new module Erl.Query to handle the query 36 | 37 | ## 12.0.0 38 | 39 | - `queryToString` takes url.query instead of url 40 | 41 | ### 11.1.1 42 | 43 | - Extract Host without a TLD 44 | 45 | ### 11.1.0 46 | 47 | - Added `getQueryValuesForKey` 48 | 49 | ## 11.0.0 50 | 51 | - Change the query to `List (String, String)`. This allows the query string to hold duplicate values, which is valid. 52 | 53 | ### 10.0.2 54 | 55 | - Upgrade to Elm 0.18 56 | 57 | ### 10.0.1 58 | 59 | - `extractPort` attempts to add a default port if missing in the url 60 | 61 | ## 10.0.0 62 | 63 | - Added `hasLeadingSlash` 64 | 65 | ## 9.0.0 66 | 67 | - Added `hasTrailingSlash` 68 | 69 | ## 8.0.0 70 | 71 | - `hash` is a string, not a list anymore 72 | 73 | ### 7.3.0 74 | 75 | - Added `hashToString` 76 | 77 | ### 7.2.0 78 | 79 | - Added `queryToString` 80 | 81 | ### 7.1.0 82 | 83 | - Added `appendPathSegments` 84 | 85 | ## 7.0.0 86 | 87 | - Hash goes after query as per https://url.spec.whatwg.org/ 88 | 89 | ## 6.0.0 90 | 91 | - `setQuery` replaces the whole query, Added `addQuery` and `removeQuery` 92 | 93 | ### 5.0.1 94 | 95 | - `setQuery` removes the key when passed an empty value 96 | 97 | ## 5.0.0 98 | 99 | - Renamed `fragment` to `hash` to aling with the MDN documentation better -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Erl 2 | 3 | [ ![Codeship Status for sporto/erl](https://codeship.com/projects/74c708d0-6c07-0133-ba44-0e105eb8924a/status?branch=master)](https://codeship.com/projects/115393) 4 | 5 | A URL parsing and construction library for ELM 6 | 7 | ## elm/url/ 8 | 9 | As of Elm 0.19, Elm core has a package works very similarly to Erl. See . 10 | 11 | ## `parse` a url string 12 | 13 | ```elm 14 | -- Given a url string 15 | url = "http://sam:pass@api.example.com:3000/products/kids?color=red&age=10#toys/1" 16 | 17 | Erl.parse url 18 | 19 | -- Returns a Erl.Url record: 20 | 21 | { protocol = "http" 22 | , host = "api.example.com" 23 | , port_ = Just 3000 24 | , pathname = "/products/kids" 25 | , query = [ ( "color", "red" ), ( "age", "10") ] 26 | , hash = "#toys/1" 27 | } 28 | ``` 29 | 30 | See MDN for more details (https://developer.mozilla.org/en-US/docs/Web/API/Location). Note that in MDN `query` is called `search`. 31 | 32 | ## `toString` 33 | 34 | ```elm 35 | -- Given a Erl.Url record (url): 36 | 37 | Erl.toString url 38 | 39 | -- Returns the url as string: 40 | 41 | "http://www.foo.com:2000/users/1?k=2&q=1#a/b" 42 | ``` 43 | 44 | ## Query parsing 45 | 46 | There are many ways to parse query strings. E.g. an array might be `a[]=1&a[]=2` or `a=1&a=2` depending on the web framework or library. 47 | 48 | Erl parses the query into a `List (String, String)`. This is a bit more useful than just a string, but not as opinionated as other libraries. 49 | 50 | ## Documentation 51 | 52 | [Documentation at package.elm-lang.org](http://package.elm-lang.org/packages/sporto/erl/latest/Erl) 53 | 54 | ## Test 55 | 56 | ``` 57 | yarn install 58 | npm test 59 | ``` 60 | 61 | ## [Changelog](https://github.com/sporto/erl/blob/master/changelog.md) 62 | -------------------------------------------------------------------------------- /documentation.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Erl", 4 | "comment": " Library for parsing and constructing URLs\n\n\n# Types\n\n@docs Url\n\n# Parse\n\n@docs parse\n\n# Construct\n\n@docs new\n\n# Serialize\n\n@docs toString, toAbsoluteString\n\n# Serialization helpers\n\n@docs queryToString\n\n", 5 | "aliases": [ 6 | { 7 | "name": "Url", 8 | "comment": " Record that holds url attributes\n", 9 | "args": [], 10 | "type": "{ protocol : String , host : String , port_ : Maybe.Maybe Int , pathname : String , query : String , hash : String }" 11 | } 12 | ], 13 | "types": [], 14 | "values": [ 15 | { 16 | "name": "new", 17 | "comment": " Generate an empty Url record\n\n Erl.new ==\n\n { protocol = \"\"\n , host = \"\"\n , port_ = Nothing\n , pathname = \"\"\n , hash = \"\"\n , query = \"\"\n }\n\n", 18 | "type": "Erl.Url" 19 | }, 20 | { 21 | "name": "parse", 22 | "comment": " Parse an url into a Url record\n\n Erl.parse \"http://hello.com/users/1?k=1&q=2#a/b\"\n\n Ok\n { protocol = \"http\",\n , host = \"hello.com\",\n , port_ = 2000,\n , pathname = \"/users/1\",\n , hash = \"a/b\",\n , query = \"k=1&q=2\"\n }\n\n", 23 | "type": "String -> Result.Result Parser.Error Erl.Url" 24 | }, 25 | { 26 | "name": "queryToString", 27 | "comment": " Convert to a string the query component of an url, this includes '?'\n\n queryToString url == \"?k=1\"\n\n", 28 | "type": "Erl.Url -> String" 29 | }, 30 | { 31 | "name": "toAbsoluteString", 32 | "comment": " Generate a url that starts at the path\n\n url = { protocol = \"http\",\n , host = \"www.hello.com\",\n , port_ = 2000,\n , pathname = \"/users/1\",\n , hash = \"#a/b\",\n , query = \"?k=1&q=2\"\n }\n\n Erl.toAbsoluteString url == \"/users/1?k=1&q=2#a/b\"\n\n", 33 | "type": "Erl.Url -> String" 34 | }, 35 | { 36 | "name": "toString", 37 | "comment": " Generate a url string from an Url record\n\n url = { protocol = \"http\",\n , host = \"www.hello.com\",\n , port_ = 2000,\n , pathname = \"/users/1\",\n , hash = \"#a/b\",\n , query = \"?k=1&q=2\"\n }\n\n Erl.toString url == \"http://www.hello.com:2000/users/1?k=1&q=2#a/b\"\n\n", 38 | "type": "Erl.Url -> String" 39 | } 40 | ], 41 | "generated-with-elm-version": "0.18.0" 42 | } 43 | ] -------------------------------------------------------------------------------- /elm.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "package", 3 | "name": "sporto/erl", 4 | "summary": "Parse and construct URLs", 5 | "license": "MIT", 6 | "version": "14.0.0", 7 | "exposed-modules": [ 8 | "Erl", 9 | "Erl.Query" 10 | ], 11 | "elm-version": "0.19.0 <= v < 0.20.0", 12 | "dependencies": { 13 | "elm/core": "1.0.0 <= v < 2.0.0", 14 | "elm/http": "1.0.0 <= v < 2.0.0", 15 | "elm/parser": "1.1.0 <= v < 2.0.0", 16 | "elm/regex": "1.0.0 <= v < 2.0.0", 17 | "elm/url": "1.0.0 <= v < 2.0.0" 18 | }, 19 | "test-dependencies": { 20 | "elm-explorations/test": "1.1.0 <= v < 2.0.0" 21 | } 22 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "erl", 3 | "version": "1.0.0", 4 | "description": "A URL parsing library for ELM", 5 | "main": "elm.js", 6 | "scripts": { 7 | "test": "elm-test tests/Main.elm" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/sporto/erl.git" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "bugs": { 16 | "url": "https://github.com/sporto/erl/issues" 17 | }, 18 | "homepage": "https://github.com/sporto/erl#readme", 19 | "dependencies": {}, 20 | "devDependencies": { 21 | "elm-test": "0.19.0-beta4" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Erl.elm: -------------------------------------------------------------------------------- 1 | module Erl exposing 2 | ( Url 3 | , parse 4 | , new 5 | , toString, toAbsoluteString 6 | ) 7 | 8 | {-| Library for parsing and constructing URLs 9 | 10 | 11 | # Types 12 | 13 | @docs Url 14 | 15 | 16 | # Parse 17 | 18 | @docs parse 19 | 20 | 21 | # Construct 22 | 23 | @docs new 24 | 25 | 26 | # Serialize 27 | 28 | @docs toString, toAbsoluteString 29 | 30 | -} 31 | 32 | import Char 33 | import Erl.DeadEnd 34 | import Erl.Parsers exposing (..) 35 | import Erl.Query exposing (Query) 36 | import Http 37 | import Parser exposing (..) 38 | import Regex 39 | import String 40 | import Url 41 | 42 | 43 | 44 | -- TYPES 45 | 46 | 47 | {-| Record that holds url attributes 48 | -} 49 | type alias Url = 50 | { protocol : String 51 | , host : String 52 | , port_ : Maybe Int 53 | , pathname : String 54 | , query : Query 55 | , hash : String 56 | } 57 | 58 | 59 | {-| Parse an url into a Url record 60 | 61 | Erl.parse "http://hello.com/users/1?k=1&q=2#a/b" 62 | 63 | Ok 64 | { protocol = "http", 65 | , host = "hello.com", 66 | , port_ = Just 2000, 67 | , pathname = "/users/1", 68 | , query = [ ("k", "1"), ("q", "2") ] 69 | , hash = "a/b", 70 | } 71 | 72 | -} 73 | parse : String -> Result String Url 74 | parse input = 75 | run parser input 76 | |> Result.mapError Erl.DeadEnd.deadEndsToString 77 | 78 | 79 | parser : Parser Url 80 | parser = 81 | succeed Url 82 | |= protocolParser 83 | |= hostParser 84 | |= portParser 85 | |= pathnameParser 86 | |= Erl.Query.parser 87 | |= hashParser 88 | |. end 89 | 90 | 91 | 92 | -- TO STRING 93 | 94 | 95 | protocolToString : Url -> String 96 | protocolToString url = 97 | case url.protocol of 98 | "" -> 99 | "" 100 | 101 | _ -> 102 | url.protocol ++ "://" 103 | 104 | 105 | hostToString : Url -> String 106 | hostToString url = 107 | Url.percentEncode url.host 108 | 109 | 110 | portToString : Url -> String 111 | portToString url = 112 | case url.port_ of 113 | Nothing -> 114 | "" 115 | 116 | Just 80 -> 117 | "" 118 | 119 | Just 443 -> 120 | if url.protocol == "https" then 121 | "" 122 | 123 | else 124 | ":443" 125 | 126 | Just other -> 127 | ":" ++ String.fromInt other 128 | 129 | 130 | pathnameToString : Url -> String 131 | pathnameToString url = 132 | let 133 | encoded = 134 | url.pathname 135 | |> Url.percentEncode 136 | |> decodeSymbol "/" 137 | 138 | leadingSlash = 139 | if String.startsWith "/" url.pathname then 140 | "" 141 | 142 | else 143 | "/" 144 | in 145 | if String.isEmpty url.pathname then 146 | "" 147 | 148 | else 149 | leadingSlash ++ encoded 150 | 151 | 152 | {-| @priv 153 | Decode one symbol in a string 154 | 155 | 156 | # decodeSymbol ">" "hello%3Eworld" 157 | 158 | "hello>world" 159 | 160 | -} 161 | decodeSymbol : String -> String -> String 162 | decodeSymbol symbol = 163 | let 164 | encoded = 165 | Url.percentEncode symbol 166 | 167 | regex : Regex.Regex 168 | regex = 169 | Regex.fromString encoded 170 | |> Maybe.withDefault Regex.never 171 | in 172 | Regex.replace regex (\_ -> symbol) 173 | 174 | 175 | {-| Convert to a string the hash component of an url, this includes '#' 176 | 177 | hashToString url == "#a/b" 178 | 179 | -} 180 | hashToString : Url -> String 181 | hashToString url = 182 | if String.isEmpty url.hash then 183 | "" 184 | 185 | else if String.startsWith "#" url.hash then 186 | url.hash 187 | 188 | else 189 | "#" ++ url.hash 190 | 191 | 192 | {-| Convert to a string the query component of an url, this includes '?' 193 | 194 | queryToString url == "?k=1" 195 | 196 | -} 197 | queryToString : Url -> String 198 | queryToString url = 199 | let 200 | encoded = 201 | url.query 202 | |> List.map (\( k, v ) -> Url.percentEncode k ++ "=" ++ Url.percentEncode v) 203 | |> String.join "&" 204 | in 205 | if List.isEmpty url.query then 206 | "" 207 | 208 | else 209 | "?" ++ encoded 210 | 211 | 212 | {-| Generate an empty Url record 213 | 214 | Erl.new 215 | == { protocol = "" 216 | , host = "" 217 | , port_ = Nothing 218 | , pathname = "" 219 | , query = [] 220 | , hash = "" 221 | } 222 | 223 | -} 224 | new : Url 225 | new = 226 | { protocol = "" 227 | , host = "" 228 | , pathname = "" 229 | , port_ = Nothing 230 | , query = [] 231 | , hash = "" 232 | } 233 | 234 | 235 | {-| Generate a url string from an Url record 236 | 237 | url = { protocol = "http", 238 | , host = "www.hello.com", 239 | , port_ = Just 2000, 240 | , pathname = "/users/1", 241 | , query = [ ("k", "1"), ("q", "2") ] 242 | , hash = "a/b", 243 | } 244 | 245 | Erl.toString url == "http://www.hello.com:2000/users/1?k=1&q=2#a/b" 246 | 247 | -} 248 | toString : Url -> String 249 | toString url = 250 | protocolToString url 251 | ++ hostToString url 252 | ++ portToString url 253 | ++ toAbsoluteString url 254 | 255 | 256 | {-| Generate a url that starts at the path 257 | 258 | url = { protocol = "http", 259 | , host = "www.hello.com", 260 | , port_ = Just 2000, 261 | , pathname = "/users/1", 262 | , query = [ ("k", "1"), ("q", "2") ] 263 | , hash = "a/b", 264 | } 265 | 266 | Erl.toAbsoluteString url == "/users/1?k=1&q=2#a/b" 267 | 268 | -} 269 | toAbsoluteString : Url -> String 270 | toAbsoluteString url = 271 | pathnameToString url 272 | ++ queryToString url 273 | ++ hashToString url 274 | -------------------------------------------------------------------------------- /src/Erl/DeadEnd.elm: -------------------------------------------------------------------------------- 1 | module Erl.DeadEnd exposing (deadEndsToString) 2 | 3 | import Parser exposing (..) 4 | 5 | 6 | deadEndsToString : List DeadEnd -> String 7 | deadEndsToString deadEnds = 8 | String.concat (List.intersperse "; " (List.map deadEndToString deadEnds)) 9 | 10 | 11 | deadEndToString : DeadEnd -> String 12 | deadEndToString deadend = 13 | problemToString deadend.problem ++ " at row " ++ String.fromInt deadend.row ++ ", col " ++ String.fromInt deadend.col 14 | 15 | 16 | problemToString : Problem -> String 17 | problemToString p = 18 | case p of 19 | Expecting s -> 20 | "expecting '" ++ s ++ "'" 21 | 22 | ExpectingInt -> 23 | "expecting int" 24 | 25 | ExpectingHex -> 26 | "expecting hex" 27 | 28 | ExpectingOctal -> 29 | "expecting octal" 30 | 31 | ExpectingBinary -> 32 | "expecting binary" 33 | 34 | ExpectingFloat -> 35 | "expecting float" 36 | 37 | ExpectingNumber -> 38 | "expecting number" 39 | 40 | ExpectingVariable -> 41 | "expecting variable" 42 | 43 | ExpectingSymbol s -> 44 | "expecting symbol '" ++ s ++ "'" 45 | 46 | ExpectingKeyword s -> 47 | "expecting keyword '" ++ s ++ "'" 48 | 49 | ExpectingEnd -> 50 | "expecting end" 51 | 52 | UnexpectedChar -> 53 | "unexpected char" 54 | 55 | Problem s -> 56 | "problem " ++ s 57 | 58 | BadRepeat -> 59 | "bad repeat" 60 | -------------------------------------------------------------------------------- /src/Erl/Parsers.elm: -------------------------------------------------------------------------------- 1 | module Erl.Parsers exposing (hashParser, hostParser, pathnameParser, portParser, protocolParser) 2 | 3 | import Parser exposing (..) 4 | 5 | 6 | protocolParser : Parser String 7 | protocolParser = 8 | oneOf 9 | [ protocolPresentParser 10 | , succeed "" 11 | ] 12 | 13 | 14 | protocolPresentParser : Parser String 15 | protocolPresentParser = 16 | getChompedString <| 17 | succeed identity 18 | |. chompIf Char.isLower 19 | |. chompWhile Char.isLower 20 | |. chompUntil "://" 21 | 22 | 23 | hostParser : Parser String 24 | hostParser = 25 | oneOf 26 | [ hostPresentParser 27 | , succeed "" 28 | ] 29 | 30 | 31 | hostPresentParser : Parser String 32 | hostPresentParser = 33 | getChompedString <| 34 | chompWhile (\c -> c /= ':' && c /= '/' && c /= '?') 35 | 36 | 37 | portParser : Parser (Maybe Int) 38 | portParser = 39 | oneOf 40 | [ Parser.map Just <| portParserPreset 41 | , succeed Nothing 42 | ] 43 | 44 | 45 | portParserPreset : Parser Int 46 | portParserPreset = 47 | succeed identity 48 | |. symbol ":" 49 | |= int 50 | 51 | 52 | pathnameParser : Parser String 53 | pathnameParser = 54 | getChompedString <| chompWhile (\c -> c /= '#' && c /= '?') 55 | 56 | 57 | hashParser : Parser String 58 | hashParser = 59 | oneOf 60 | [ hashPresentParser 61 | , succeed "" 62 | ] 63 | 64 | 65 | hashPresentParser : Parser String 66 | hashPresentParser = 67 | succeed identity 68 | |. symbol "#" 69 | |= (getChompedString <| chompWhile (always True)) 70 | |. end 71 | -------------------------------------------------------------------------------- /src/Erl/ParsersTests.elm: -------------------------------------------------------------------------------- 1 | module Erl.ParsersTests exposing (all) 2 | 3 | import Erl.Parsers exposing (..) 4 | import Expect 5 | import Parser exposing (run) 6 | import Test exposing (..) 7 | 8 | 9 | discardError = 10 | Result.mapError (always ()) 11 | 12 | 13 | protocolParserTest testCase input expected = 14 | test testCase <| 15 | \_ -> 16 | Expect.equal 17 | (run protocolParser input |> discardError) 18 | expected 19 | 20 | 21 | protocolParserTests = 22 | describe "protocolParser" 23 | [ protocolParserTest 24 | "It parsers" 25 | "http://" 26 | (Ok "http") 27 | , protocolParserTest 28 | "It parsers nothing" 29 | "" 30 | (Ok "") 31 | , protocolParserTest 32 | "It fails" 33 | "http" 34 | (Err ()) 35 | ] 36 | 37 | 38 | 39 | -- Host 40 | 41 | 42 | hostParserTest testCase input expected = 43 | test testCase <| 44 | \_ -> 45 | Expect.equal 46 | (run hostParser input |> discardError) 47 | expected 48 | 49 | 50 | hostParserTests = 51 | describe "hostParser" 52 | [ hostParserTest 53 | "It parses" 54 | "example.com" 55 | (Ok "example.com") 56 | ] 57 | 58 | 59 | 60 | -- Port 61 | 62 | 63 | portParserTest testCase input expected = 64 | test testCase <| 65 | \_ -> 66 | Expect.equal 67 | (run portParser input |> discardError) 68 | expected 69 | 70 | 71 | portParserTests = 72 | describe "portParser" 73 | [ portParserTest 74 | "It parses" 75 | ":3000" 76 | (Ok (Just 3000)) 77 | , portParserTest 78 | "It fails without :" 79 | "3000" 80 | (Ok Nothing) 81 | ] 82 | 83 | 84 | 85 | -- Pathname 86 | 87 | 88 | pathnameParserTest testCase input expected = 89 | test testCase <| 90 | \_ -> 91 | Expect.equal 92 | (run pathnameParser input |> discardError) 93 | expected 94 | 95 | 96 | pathnameParserTests = 97 | describe "pathnameParser" 98 | [ pathnameParserTest 99 | "It parses" 100 | "/hello/world" 101 | (Ok "/hello/world") 102 | ] 103 | 104 | 105 | 106 | -- Hash 107 | 108 | 109 | hashParserTest testCase input expected = 110 | test testCase <| 111 | \_ -> 112 | Expect.equal 113 | (run hashParser input |> discardError) 114 | expected 115 | 116 | 117 | hashParserTests = 118 | describe "hashParser" 119 | [ hashParserTest 120 | "It parses" 121 | "#the-end" 122 | (Ok "the-end") 123 | ] 124 | 125 | 126 | all : Test 127 | all = 128 | describe "Parsers Tests" 129 | [ protocolParserTests 130 | , hostParserTests 131 | , portParserTests 132 | , pathnameParserTests 133 | , hashParserTests 134 | ] 135 | -------------------------------------------------------------------------------- /src/Erl/Query.elm: -------------------------------------------------------------------------------- 1 | module Erl.Query exposing 2 | ( Query 3 | , parse, parser 4 | , add, set, remove 5 | , toString 6 | , getValuesForKey 7 | ) 8 | 9 | {-| Functions to work with a Query record 10 | 11 | 12 | # Types 13 | 14 | @docs Query 15 | 16 | 17 | # Parse 18 | 19 | @docs parse, parser 20 | 21 | 22 | # Mutation helpers 23 | 24 | @docs add, set, remove 25 | 26 | 27 | # Serialize 28 | 29 | @docs toString 30 | 31 | 32 | # Other helpers 33 | 34 | @docs getValuesForKey 35 | 36 | -} 37 | 38 | import Http 39 | import Parser exposing (..) 40 | import String 41 | import Url 42 | 43 | 44 | {-| List holding query string values 45 | -} 46 | type alias Query = 47 | List ( String, String ) 48 | 49 | 50 | {-| Parse a query string 51 | 52 | Erl.Query.parse "?a=1&b=2&a=3" == [ ( "a", "1" ), ( "b", "2" ), ( "a", "1" ) ] 53 | 54 | -} 55 | parse : String -> Result String Query 56 | parse input = 57 | run parser input 58 | |> Result.mapError deadEndsToString 59 | 60 | 61 | {-| Query Parser 62 | -} 63 | parser : Parser Query 64 | parser = 65 | oneOf 66 | [ succeed identity 67 | |= sequence 68 | { start = "?" 69 | , separator = "&" 70 | , end = "" 71 | , spaces = spaces 72 | , item = kvParser 73 | , trailing = Optional 74 | } 75 | , succeed [] 76 | ] 77 | 78 | 79 | kvParser : Parser ( String, String ) 80 | kvParser = 81 | succeed (\a b -> ( a, b )) 82 | |= map decodeUri keyParser 83 | |. symbol "=" 84 | |= map decodeUri valueParser 85 | 86 | 87 | keyParser : Parser String 88 | keyParser = 89 | getChompedString <| chompWhile (\c -> c /= '=' && c /= '#') 90 | 91 | 92 | valueParser : Parser String 93 | valueParser = 94 | getChompedString <| chompWhile (\c -> c /= '&' && c /= '#') 95 | 96 | 97 | decodeUri : String -> String 98 | decodeUri = 99 | Url.percentDecode >> Maybe.withDefault "" 100 | 101 | 102 | {-| Convert to a string, this includes '?' 103 | 104 | Erl.Query.toString query == "?a=1&b=2" 105 | 106 | -} 107 | toString : Query -> String 108 | toString query = 109 | let 110 | encodedTuples = 111 | List.map (\( x, y ) -> ( Url.percentEncode x, Url.percentEncode y )) query 112 | 113 | parts = 114 | List.map (\( a, b ) -> a ++ "=" ++ b) encodedTuples 115 | in 116 | if List.isEmpty query then 117 | "" 118 | 119 | else 120 | "?" ++ String.join "&" parts 121 | 122 | 123 | {-| Adds key/value in query string 124 | 125 | Erl.Query.add key value query 126 | 127 | This doesn't replace existing keys, so if this is a duplicated this key is just added. 128 | 129 | -} 130 | add : String -> String -> Query -> Query 131 | add key val = 132 | List.reverse 133 | >> (::) ( key, val ) 134 | >> List.reverse 135 | 136 | 137 | {-| Set key/value in query string, removes any existing one if necessary. 138 | 139 | Erl.Query.set key value query 140 | 141 | -} 142 | set : String -> String -> Query -> Query 143 | set key val query = 144 | let 145 | without = 146 | remove key query 147 | in 148 | add key val without 149 | 150 | 151 | {-| Removes key from query string 152 | 153 | Erl.Query.remove key query 154 | 155 | -} 156 | remove : String -> Query -> Query 157 | remove key query = 158 | List.filter (\( k, v ) -> k /= key) query 159 | 160 | 161 | {-| Gets values for a key in the query 162 | 163 | url = Erl.parse "?a=1&b=2&a=3" 164 | 165 | Erl.Query.getQueryValuesForKey "a" url.query 166 | 167 | == ["1", "3"] 168 | 169 | -} 170 | getValuesForKey : String -> Query -> List String 171 | getValuesForKey key = 172 | List.filter (\( k, _ ) -> k == key) 173 | >> List.map Tuple.second 174 | -------------------------------------------------------------------------------- /src/Erl/QueryTests.elm: -------------------------------------------------------------------------------- 1 | module Erl.QueryTests exposing (all) 2 | 3 | import Erl.Query as Subject 4 | import Expect 5 | import Test exposing (..) 6 | 7 | 8 | parseTest testCase input expected = 9 | test testCase <| 10 | \_ -> 11 | Expect.equal 12 | (Subject.parse input) 13 | expected 14 | 15 | 16 | parseTests = 17 | describe "parse" 18 | [ parseTest 19 | "It parses" 20 | "?a=1&b=2" 21 | (Ok [ ( "a", "1" ), ( "b", "2" ) ]) 22 | , parseTest 23 | "I decodes" 24 | "?a%3F=1%26" 25 | (Ok [ ( "a?", "1&" ) ]) 26 | , parseTest 27 | "I parses same keys" 28 | "?a=1&a=2" 29 | (Ok [ ( "a", "1" ), ( "a", "2" ) ]) 30 | ] 31 | 32 | 33 | testAdd = 34 | let 35 | inputs = 36 | [ ( "1" 37 | , [] 38 | |> Subject.add "a" "1" 39 | |> Subject.add "b" "2" 40 | , [ ( "a", "1" ), ( "b", "2" ) ] 41 | ) 42 | , ( "2" 43 | , [] 44 | |> Subject.add "a" "1" 45 | |> Subject.add "a" "2" 46 | , [ ( "a", "1" ), ( "a", "2" ) ] 47 | ) 48 | ] 49 | 50 | run ( name, actual, expected ) = 51 | test ("add " ++ name) <| 52 | \() -> Expect.equal expected actual 53 | in 54 | describe "Adds to the query" 55 | (List.map run inputs) 56 | 57 | 58 | testSet = 59 | let 60 | inputs = 61 | [ ( [] 62 | |> Subject.add "a" "1" 63 | |> Subject.set "a" "2" 64 | , [ ( "a", "2" ) ] 65 | ) 66 | ] 67 | 68 | run ( actual, expected ) = 69 | test "set" <| 70 | \() -> Expect.equal expected actual 71 | in 72 | describe "Sets the query" 73 | (List.map run inputs) 74 | 75 | 76 | testRemove = 77 | let 78 | expected = 79 | [ ( "a", "1" ) ] 80 | 81 | actual = 82 | [] 83 | |> Subject.add "a" "1" 84 | |> Subject.add "b" "2" 85 | |> Subject.remove "b" 86 | in 87 | test "Removes the query" <| 88 | \() -> Expect.equal expected actual 89 | 90 | 91 | testGetQueryValuesForKey = 92 | let 93 | query = 94 | [ ( "a", "1" ), ( "b", "2" ), ( "a", "3" ) ] 95 | 96 | input = 97 | [ ( "a", [ "1", "3" ] ) 98 | , ( "c", [] ) 99 | ] 100 | 101 | run ( key, expected ) = 102 | let 103 | actual = 104 | Subject.getValuesForKey key query 105 | in 106 | test ("getValuesForKey " ++ key) <| 107 | \() -> Expect.equal expected actual 108 | in 109 | describe "Gets query values" <| List.map run input 110 | 111 | 112 | testToString = 113 | let 114 | inputs = 115 | [ ( "it converts to string" 116 | , [ ( "q", "1" ), ( "k", "2" ) ] 117 | , "?q=1&k=2" 118 | ) 119 | , ( "it doesn't add query when query is empty" 120 | , [] 121 | , "" 122 | ) 123 | , ( "it adds duplicate values in the query" 124 | , [ ( "a", "1" ), ( "a", "2" ) ] 125 | , "?a=1&a=2" 126 | ) 127 | , ( "encodes values" 128 | , [ ( "a/b", "c/d" ) ] 129 | , "?a%2Fb=c%2Fd" 130 | ) 131 | ] 132 | 133 | run ( testCase, input, expected ) = 134 | let 135 | actual = 136 | Subject.toString input 137 | 138 | result = 139 | Expect.equal expected actual 140 | in 141 | test testCase <| \() -> result 142 | in 143 | describe "toString" 144 | (List.map run inputs) 145 | 146 | 147 | all : Test 148 | all = 149 | describe "Query Tests" 150 | [ parseTests 151 | , testAdd 152 | , testGetQueryValuesForKey 153 | , testRemove 154 | , testSet 155 | , testToString 156 | ] 157 | -------------------------------------------------------------------------------- /src/ErlTests.elm: -------------------------------------------------------------------------------- 1 | module ErlTests exposing (all) 2 | 3 | import Dict 4 | import Erl 5 | import Expect 6 | import String 7 | import Test exposing (..) 8 | 9 | 10 | 11 | -- TO STRING 12 | 13 | 14 | url : Erl.Url 15 | url = 16 | { protocol = "http" 17 | , host = "www.hello.com" 18 | , port_ = Just 2000 19 | , pathname = "/users/1" 20 | , query = [ ( "k", "1" ) ] 21 | , hash = "a/b" 22 | } 23 | 24 | 25 | toStringTest testCase input expected = 26 | test testCase <| 27 | \_ -> 28 | Expect.equal (Erl.toString input) expected 29 | 30 | 31 | toStringTests = 32 | describe "toString" 33 | [ toStringTest 34 | "it converts to string" 35 | url 36 | "http://www.hello.com:2000/users/1?k=1#a/b" 37 | , toStringTest 38 | "it can have a trailing slash" 39 | { url | pathname = "/users/1/" } 40 | "http://www.hello.com:2000/users/1/?k=1#a/b" 41 | , toStringTest 42 | "it can be missing the leading /" 43 | { url | pathname = "users/1" } 44 | "http://www.hello.com:2000/users/1?k=1#a/b" 45 | , toStringTest 46 | "it can have an empty protocol" 47 | { url | protocol = "" } 48 | "www.hello.com:2000/users/1?k=1#a/b" 49 | , toStringTest 50 | "it doesn't include the port when it is 80" 51 | { url | port_ = Just 80 } 52 | "http://www.hello.com/users/1?k=1#a/b" 53 | , toStringTest 54 | "it doesn't include the port when it is 443 and the protocol is https" 55 | { url | protocol = "https", port_ = Just 443 } 56 | "https://www.hello.com/users/1?k=1#a/b" 57 | , toStringTest 58 | "it doesn't add # when hash is empty" 59 | { url | hash = "" } 60 | "http://www.hello.com:2000/users/1?k=1" 61 | , toStringTest "it doesn't add query when query is empty" 62 | { url | query = [] } 63 | "http://www.hello.com:2000/users/1#a/b" 64 | , -- 65 | toStringTest 66 | "it encodes values in host" 67 | { url | host = "aa/bb" } 68 | "http://aa%2Fbb:2000/users/1?k=1#a/b" 69 | , toStringTest 70 | "it encodes values in path" 71 | { url | pathname = "aa/b&b" } 72 | "http://www.hello.com:2000/aa/b%26b?k=1#a/b" 73 | , toStringTest 74 | "it encodes values in query" 75 | { url | query = [ ( "a/b", "c/d" ) ] } 76 | "http://www.hello.com:2000/users/1?a%2Fb=c%2Fd#a/b" 77 | , toStringTest 78 | "it handles localhost which has no ." 79 | { url | host = "localhost" } 80 | "http://localhost:2000/users/1?k=1#a/b" 81 | ] 82 | 83 | 84 | roundTripTest testCase input = 85 | test testCase <| 86 | \_ -> 87 | Expect.equal (input |> Erl.parse |> Result.withDefault Erl.new |> Erl.toString) input 88 | 89 | 90 | roundTripTests = 91 | describe "Round trip" 92 | [ roundTripTest "Just host" "http://example.com" 93 | , roundTripTest "Host with port" "http://example.com:2000" 94 | , roundTripTest "With path" "http://example.com/users" 95 | , roundTripTest "Path with trailing slash" "http://example.com/users/" 96 | , roundTripTest "Deeper path" "http://example.com/users/1" 97 | , roundTripTest "With query string" "http://example.com/users/1?color=red" 98 | , roundTripTest "With hash" "http://example.com/users/1#a/b" 99 | , roundTripTest "With query and hash" "http://example.com/users/1?color=red#a/b" 100 | ] 101 | 102 | 103 | parseTest testCase input expected = 104 | test (testCase ++ " - " ++ input) <| 105 | \_ -> 106 | Expect.equal (Erl.parse input) expected 107 | 108 | 109 | parseTests = 110 | describe "parse" 111 | [ parseTest 112 | "it works" 113 | "http://hello.com:3000" 114 | (Ok 115 | { protocol = "http" 116 | , host = "hello.com" 117 | , port_ = Just 3000 118 | , pathname = "" 119 | , query = [] 120 | , hash = "" 121 | } 122 | ) 123 | 124 | -- protocol 125 | , parseTest 126 | "it may have a protocol" 127 | "https://hello.com" 128 | (Ok 129 | { protocol = "https" 130 | , host = "hello.com" 131 | , port_ = Nothing 132 | , pathname = "" 133 | , query = [] 134 | , hash = "" 135 | } 136 | ) 137 | 138 | -- port 139 | , parseTest 140 | "it can have a port" 141 | "http://hello.com:3000" 142 | (Ok 143 | { protocol = "http" 144 | , host = "hello.com" 145 | , port_ = Just 3000 146 | , pathname = "" 147 | , query = [] 148 | , hash = "" 149 | } 150 | ) 151 | , parseTest 152 | "it can have a port before the path" 153 | "http://hello.com:3000/a" 154 | (Ok 155 | { protocol = "http" 156 | , host = "hello.com" 157 | , port_ = Just 3000 158 | , pathname = "/a" 159 | , query = [] 160 | , hash = "" 161 | } 162 | ) 163 | , parseTest 164 | "it may not have a port" 165 | "http://hello.com" 166 | (Ok 167 | { protocol = "http" 168 | , host = "hello.com" 169 | , port_ = Nothing 170 | , pathname = "" 171 | , query = [] 172 | , hash = "" 173 | } 174 | ) 175 | 176 | -- Path 177 | , parseTest 178 | "it can have a pathname" 179 | "http://hello.com/a/b/c" 180 | (Ok 181 | { protocol = "http" 182 | , host = "hello.com" 183 | , port_ = Nothing 184 | , pathname = "/a/b/c" 185 | , query = [] 186 | , hash = "" 187 | } 188 | ) 189 | , parseTest 190 | "it can have a pathname with extension" 191 | "http://hello.com/a/b/c.html" 192 | (Ok 193 | { protocol = "http" 194 | , host = "hello.com" 195 | , port_ = Nothing 196 | , pathname = "/a/b/c.html" 197 | , query = [] 198 | , hash = "" 199 | } 200 | ) 201 | , parseTest 202 | "it can get the file pathname" 203 | "file:///foo/bar" 204 | (Ok 205 | { protocol = "file" 206 | , host = "" 207 | , port_ = Nothing 208 | , pathname = "/foo/bar" 209 | , query = [] 210 | , hash = "" 211 | } 212 | ) 213 | , parseTest 214 | "it can have a trailing slash" 215 | "http://hello.com/a/b/" 216 | (Ok 217 | { protocol = "http" 218 | , host = "hello.com" 219 | , port_ = Nothing 220 | , pathname = "/a/b/" 221 | , query = [] 222 | , hash = "" 223 | } 224 | ) 225 | 226 | -- Query 227 | , parseTest 228 | "it can have a query" 229 | "http://hello.com/a?a=1&b=2" 230 | (Ok 231 | { protocol = "http" 232 | , host = "hello.com" 233 | , port_ = Nothing 234 | , pathname = "/a" 235 | , query = [ ( "a", "1" ), ( "b", "2" ) ] 236 | , hash = "" 237 | } 238 | ) 239 | , parseTest 240 | "query without path" 241 | "http://hello.com?a=1&b=2" 242 | (Ok 243 | { protocol = "http" 244 | , host = "hello.com" 245 | , port_ = Nothing 246 | , pathname = "" 247 | , query = [ ( "a", "1" ), ( "b", "2" ) ] 248 | , hash = "" 249 | } 250 | ) 251 | , parseTest 252 | "query without path with trailing /" 253 | "http://hello.com/?a=1&b=2" 254 | (Ok 255 | { protocol = "http" 256 | , host = "hello.com" 257 | , port_ = Nothing 258 | , pathname = "/" 259 | , query = [ ( "a", "1" ), ( "b", "2" ) ] 260 | , hash = "" 261 | } 262 | ) 263 | 264 | -- Hash 265 | , parseTest 266 | "it can have a hash" 267 | "http://hello.com/a?a=1#x=1" 268 | (Ok 269 | { protocol = "http" 270 | , host = "hello.com" 271 | , port_ = Nothing 272 | , pathname = "/a" 273 | , query = [ ( "a", "1" ) ] 274 | , hash = "x=1" 275 | } 276 | ) 277 | , parseTest 278 | "it can have a hash without query" 279 | "http://hello.com/a#x=1" 280 | (Ok 281 | { protocol = "http" 282 | , host = "hello.com" 283 | , port_ = Nothing 284 | , pathname = "/a" 285 | , query = [] 286 | , hash = "x=1" 287 | } 288 | ) 289 | , parseTest 290 | "it can have a missing host" 291 | "/a#x=1" 292 | (Ok 293 | { protocol = "" 294 | , host = "" 295 | , port_ = Nothing 296 | , pathname = "/a" 297 | , query = [] 298 | , hash = "x=1" 299 | } 300 | ) 301 | ] 302 | 303 | 304 | all : Test 305 | all = 306 | describe "Erl Tests" 307 | [ roundTripTests 308 | , toStringTests 309 | , parseTests 310 | ] 311 | -------------------------------------------------------------------------------- /support/prepare_test.sh: -------------------------------------------------------------------------------- 1 | # nvm use 4.0 # already done in CI 2 | node --version 3 | npm --version 4 | npm install -g elm 5 | cd test 6 | npm install 7 | elm-package install --yes -------------------------------------------------------------------------------- /tests/.gitignore: -------------------------------------------------------------------------------- 1 | /elm-stuff/ 2 | -------------------------------------------------------------------------------- /tests/Main.elm: -------------------------------------------------------------------------------- 1 | module Main exposing (all) 2 | 3 | import Erl.ParsersTests 4 | import Erl.QueryTests 5 | import ErlTests 6 | import Test exposing (..) 7 | 8 | 9 | all : Test 10 | all = 11 | describe "all" 12 | [ ErlTests.all 13 | , Erl.QueryTests.all 14 | , Erl.ParsersTests.all 15 | ] 16 | -------------------------------------------------------------------------------- /tests/elm-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.0", 3 | "summary": "Sample Elm Test", 4 | "repository": "https://github.com/user/project.git", 5 | "license": "BSD-3-Clause", 6 | "source-directories": [ 7 | ".", 8 | "../src" 9 | ], 10 | "exposed-modules": [], 11 | "dependencies": { 12 | "elm-community/elm-test": "4.0.0 <= v < 5.0.0", 13 | "elm-lang/core": "5.1.0 <= v < 6.0.0", 14 | "elm-lang/html": "2.0.0 <= v < 3.0.0", 15 | "elm-lang/http": "1.0.0 <= v < 2.0.0", 16 | "elm-tools/parser": "2.0.1 <= v < 3.0.0" 17 | }, 18 | "elm-version": "0.18.0 <= v < 0.19.0" 19 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abbrev@1: 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 8 | 9 | ajv@^4.9.1: 10 | version "4.11.8" 11 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 12 | dependencies: 13 | co "^4.6.0" 14 | json-stable-stringify "^1.0.1" 15 | 16 | ajv@^5.3.0: 17 | version "5.5.2" 18 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 19 | dependencies: 20 | co "^4.6.0" 21 | fast-deep-equal "^1.0.0" 22 | fast-json-stable-stringify "^2.0.0" 23 | json-schema-traverse "^0.3.0" 24 | 25 | ansi-regex@^2.0.0: 26 | version "2.1.1" 27 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 28 | 29 | ansi-regex@^3.0.0: 30 | version "3.0.0" 31 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 32 | 33 | ansi-styles@^2.2.1: 34 | version "2.2.1" 35 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 36 | 37 | ansi-styles@^3.1.0: 38 | version "3.2.1" 39 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 40 | dependencies: 41 | color-convert "^1.9.0" 42 | 43 | anymatch@^1.3.0: 44 | version "1.3.2" 45 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" 46 | dependencies: 47 | micromatch "^2.1.5" 48 | normalize-path "^2.0.0" 49 | 50 | aproba@^1.0.3: 51 | version "1.2.0" 52 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 53 | 54 | are-we-there-yet@~1.1.2: 55 | version "1.1.5" 56 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 57 | dependencies: 58 | delegates "^1.0.0" 59 | readable-stream "^2.0.6" 60 | 61 | arr-diff@^2.0.0: 62 | version "2.0.0" 63 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 64 | dependencies: 65 | arr-flatten "^1.0.1" 66 | 67 | arr-flatten@^1.0.1: 68 | version "1.1.0" 69 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 70 | 71 | array-unique@^0.2.1: 72 | version "0.2.1" 73 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 74 | 75 | asn1@~0.2.3: 76 | version "0.2.4" 77 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 78 | dependencies: 79 | safer-buffer "~2.1.0" 80 | 81 | assert-plus@1.0.0, assert-plus@^1.0.0: 82 | version "1.0.0" 83 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 84 | 85 | assert-plus@^0.2.0: 86 | version "0.2.0" 87 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 88 | 89 | async-each@^1.0.0: 90 | version "1.0.1" 91 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 92 | 93 | asynckit@^0.4.0: 94 | version "0.4.0" 95 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 96 | 97 | aws-sign2@~0.6.0: 98 | version "0.6.0" 99 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 100 | 101 | aws-sign2@~0.7.0: 102 | version "0.7.0" 103 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 104 | 105 | aws4@^1.2.1, aws4@^1.8.0: 106 | version "1.8.0" 107 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 108 | 109 | balanced-match@^1.0.0: 110 | version "1.0.0" 111 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 112 | 113 | bcrypt-pbkdf@^1.0.0: 114 | version "1.0.2" 115 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 116 | dependencies: 117 | tweetnacl "^0.14.3" 118 | 119 | binary-extensions@^1.0.0: 120 | version "1.11.0" 121 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" 122 | 123 | binary@^0.3.0: 124 | version "0.3.0" 125 | resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" 126 | dependencies: 127 | buffers "~0.1.1" 128 | chainsaw "~0.1.0" 129 | 130 | binstall@1.2.0: 131 | version "1.2.0" 132 | resolved "https://registry.yarnpkg.com/binstall/-/binstall-1.2.0.tgz#6b2c0f580b9e3c607f50ef7a22a54ce9fdc8d933" 133 | dependencies: 134 | request "2.79.0" 135 | tar "2.2.1" 136 | 137 | binwrap@^0.2.0-rc2: 138 | version "0.2.0" 139 | resolved "https://registry.yarnpkg.com/binwrap/-/binwrap-0.2.0.tgz#572d0f48c4e767d72d622f0b805ed7ce1db16f9a" 140 | dependencies: 141 | mustache "^2.3.0" 142 | request "^2.87.0" 143 | request-promise "^4.2.0" 144 | tar "^2.2.1" 145 | unzip-stream "^0.3.0" 146 | 147 | block-stream@*: 148 | version "0.0.9" 149 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 150 | dependencies: 151 | inherits "~2.0.0" 152 | 153 | bluebird@^3.5.0: 154 | version "3.5.1" 155 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" 156 | 157 | boom@2.x.x: 158 | version "2.10.1" 159 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 160 | dependencies: 161 | hoek "2.x.x" 162 | 163 | brace-expansion@^1.1.7: 164 | version "1.1.11" 165 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 166 | dependencies: 167 | balanced-match "^1.0.0" 168 | concat-map "0.0.1" 169 | 170 | braces@^1.8.2: 171 | version "1.8.5" 172 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 173 | dependencies: 174 | expand-range "^1.8.1" 175 | preserve "^0.2.0" 176 | repeat-element "^1.1.2" 177 | 178 | buffers@~0.1.1: 179 | version "0.1.1" 180 | resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" 181 | 182 | caseless@~0.11.0: 183 | version "0.11.0" 184 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 185 | 186 | caseless@~0.12.0: 187 | version "0.12.0" 188 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 189 | 190 | chainsaw@~0.1.0: 191 | version "0.1.0" 192 | resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" 193 | dependencies: 194 | traverse ">=0.3.0 <0.4" 195 | 196 | chalk@2.1.0: 197 | version "2.1.0" 198 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" 199 | dependencies: 200 | ansi-styles "^3.1.0" 201 | escape-string-regexp "^1.0.5" 202 | supports-color "^4.0.0" 203 | 204 | chalk@^1.1.1: 205 | version "1.1.3" 206 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 207 | dependencies: 208 | ansi-styles "^2.2.1" 209 | escape-string-regexp "^1.0.2" 210 | has-ansi "^2.0.0" 211 | strip-ansi "^3.0.0" 212 | supports-color "^2.0.0" 213 | 214 | chokidar@1.6.0: 215 | version "1.6.0" 216 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.0.tgz#90c32ad4802901d7713de532dc284e96a63ad058" 217 | dependencies: 218 | anymatch "^1.3.0" 219 | async-each "^1.0.0" 220 | glob-parent "^2.0.0" 221 | inherits "^2.0.1" 222 | is-binary-path "^1.0.0" 223 | is-glob "^2.0.0" 224 | path-is-absolute "^1.0.0" 225 | readdirp "^2.0.0" 226 | optionalDependencies: 227 | fsevents "^1.0.0" 228 | 229 | chownr@^1.0.1: 230 | version "1.0.1" 231 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" 232 | 233 | co@^4.6.0: 234 | version "4.6.0" 235 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 236 | 237 | code-point-at@^1.0.0: 238 | version "1.1.0" 239 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 240 | 241 | color-convert@^1.9.0: 242 | version "1.9.2" 243 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" 244 | dependencies: 245 | color-name "1.1.1" 246 | 247 | color-name@1.1.1: 248 | version "1.1.1" 249 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" 250 | 251 | combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5, combined-stream@~1.0.6: 252 | version "1.0.6" 253 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" 254 | dependencies: 255 | delayed-stream "~1.0.0" 256 | 257 | commander@^2.9.0: 258 | version "2.17.1" 259 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" 260 | 261 | concat-map@0.0.1: 262 | version "0.0.1" 263 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 264 | 265 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 266 | version "1.1.0" 267 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 268 | 269 | core-util-is@1.0.2, core-util-is@~1.0.0: 270 | version "1.0.2" 271 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 272 | 273 | cross-spawn@4.0.0: 274 | version "4.0.0" 275 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.0.tgz#8254774ab4786b8c5b3cf4dfba66ce563932c252" 276 | dependencies: 277 | lru-cache "^4.0.1" 278 | which "^1.2.9" 279 | 280 | cryptiles@2.x.x: 281 | version "2.0.5" 282 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 283 | dependencies: 284 | boom "2.x.x" 285 | 286 | dashdash@^1.12.0: 287 | version "1.14.1" 288 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 289 | dependencies: 290 | assert-plus "^1.0.0" 291 | 292 | debug@^2.1.2, debug@^2.2.0: 293 | version "2.6.9" 294 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 295 | dependencies: 296 | ms "2.0.0" 297 | 298 | deep-extend@^0.6.0: 299 | version "0.6.0" 300 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 301 | 302 | delayed-stream@~1.0.0: 303 | version "1.0.0" 304 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 305 | 306 | delegates@^1.0.0: 307 | version "1.0.0" 308 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 309 | 310 | detect-libc@^1.0.2: 311 | version "1.0.3" 312 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 313 | 314 | ecc-jsbn@~0.1.1: 315 | version "0.1.2" 316 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 317 | dependencies: 318 | jsbn "~0.1.0" 319 | safer-buffer "^2.1.0" 320 | 321 | elm-test@0.19.0-beta4: 322 | version "0.19.0-beta4" 323 | resolved "https://registry.yarnpkg.com/elm-test/-/elm-test-0.19.0-beta4.tgz#37eb3db57372ff6bd5949e911146ec5a6d1a52c9" 324 | dependencies: 325 | binstall "1.2.0" 326 | chalk "2.1.0" 327 | chokidar "1.6.0" 328 | cross-spawn "4.0.0" 329 | elmi-to-json "0.19.0-rc3" 330 | find-parent-dir "^0.3.0" 331 | firstline "1.2.1" 332 | fs-extra "0.30.0" 333 | glob "^7.1.1" 334 | lodash "4.13.1" 335 | minimist "^1.2.0" 336 | murmur-hash-js "1.0.0" 337 | node-elm-compiler "5.0.0-alpha1" 338 | split "^1.0.1" 339 | supports-color "4.2.0" 340 | xmlbuilder "^8.2.2" 341 | optionalDependencies: 342 | fsevents "1.1.2" 343 | 344 | elmi-to-json@0.19.0-rc3: 345 | version "0.19.0-rc3" 346 | resolved "https://registry.yarnpkg.com/elmi-to-json/-/elmi-to-json-0.19.0-rc3.tgz#bd69161dd38db6002c01cf2f230050ae75df48b3" 347 | dependencies: 348 | binwrap "^0.2.0-rc2" 349 | 350 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 351 | version "1.0.5" 352 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 353 | 354 | expand-brackets@^0.1.4: 355 | version "0.1.5" 356 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 357 | dependencies: 358 | is-posix-bracket "^0.1.0" 359 | 360 | expand-range@^1.8.1: 361 | version "1.8.2" 362 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 363 | dependencies: 364 | fill-range "^2.1.0" 365 | 366 | extend@~3.0.0, extend@~3.0.2: 367 | version "3.0.2" 368 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 369 | 370 | extglob@^0.3.1: 371 | version "0.3.2" 372 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 373 | dependencies: 374 | is-extglob "^1.0.0" 375 | 376 | extsprintf@1.3.0: 377 | version "1.3.0" 378 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 379 | 380 | extsprintf@^1.2.0: 381 | version "1.4.0" 382 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 383 | 384 | fast-deep-equal@^1.0.0: 385 | version "1.1.0" 386 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 387 | 388 | fast-json-stable-stringify@^2.0.0: 389 | version "2.0.0" 390 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 391 | 392 | filename-regex@^2.0.0: 393 | version "2.0.1" 394 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 395 | 396 | fill-range@^2.1.0: 397 | version "2.2.4" 398 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" 399 | dependencies: 400 | is-number "^2.1.0" 401 | isobject "^2.0.0" 402 | randomatic "^3.0.0" 403 | repeat-element "^1.1.2" 404 | repeat-string "^1.5.2" 405 | 406 | find-elm-dependencies@1.0.2: 407 | version "1.0.2" 408 | resolved "https://registry.yarnpkg.com/find-elm-dependencies/-/find-elm-dependencies-1.0.2.tgz#737adc0ce34dfde0c3bf85f568658555329e4953" 409 | dependencies: 410 | firstline "1.2.0" 411 | lodash "4.14.2" 412 | 413 | find-parent-dir@^0.3.0: 414 | version "0.3.0" 415 | resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" 416 | 417 | firstline@1.2.0: 418 | version "1.2.0" 419 | resolved "https://registry.yarnpkg.com/firstline/-/firstline-1.2.0.tgz#c9f4886e7f7fbf0afc12d71941dce06b192aea05" 420 | 421 | firstline@1.2.1: 422 | version "1.2.1" 423 | resolved "https://registry.yarnpkg.com/firstline/-/firstline-1.2.1.tgz#b88673c42009f8821fac2926e99720acee924fae" 424 | 425 | for-in@^1.0.1: 426 | version "1.0.2" 427 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 428 | 429 | for-own@^0.1.4: 430 | version "0.1.5" 431 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 432 | dependencies: 433 | for-in "^1.0.1" 434 | 435 | forever-agent@~0.6.1: 436 | version "0.6.1" 437 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 438 | 439 | form-data@~2.1.1: 440 | version "2.1.4" 441 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 442 | dependencies: 443 | asynckit "^0.4.0" 444 | combined-stream "^1.0.5" 445 | mime-types "^2.1.12" 446 | 447 | form-data@~2.3.2: 448 | version "2.3.2" 449 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" 450 | dependencies: 451 | asynckit "^0.4.0" 452 | combined-stream "1.0.6" 453 | mime-types "^2.1.12" 454 | 455 | fs-extra@0.30.0: 456 | version "0.30.0" 457 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" 458 | dependencies: 459 | graceful-fs "^4.1.2" 460 | jsonfile "^2.1.0" 461 | klaw "^1.0.0" 462 | path-is-absolute "^1.0.0" 463 | rimraf "^2.2.8" 464 | 465 | fs-minipass@^1.2.5: 466 | version "1.2.5" 467 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 468 | dependencies: 469 | minipass "^2.2.1" 470 | 471 | fs.realpath@^1.0.0: 472 | version "1.0.0" 473 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 474 | 475 | fsevents@1.1.2: 476 | version "1.1.2" 477 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" 478 | dependencies: 479 | nan "^2.3.0" 480 | node-pre-gyp "^0.6.36" 481 | 482 | fsevents@^1.0.0: 483 | version "1.2.4" 484 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" 485 | dependencies: 486 | nan "^2.9.2" 487 | node-pre-gyp "^0.10.0" 488 | 489 | fstream-ignore@^1.0.5: 490 | version "1.0.5" 491 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 492 | dependencies: 493 | fstream "^1.0.0" 494 | inherits "2" 495 | minimatch "^3.0.0" 496 | 497 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: 498 | version "1.0.11" 499 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 500 | dependencies: 501 | graceful-fs "^4.1.2" 502 | inherits "~2.0.0" 503 | mkdirp ">=0.5 0" 504 | rimraf "2" 505 | 506 | gauge@~2.7.3: 507 | version "2.7.4" 508 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 509 | dependencies: 510 | aproba "^1.0.3" 511 | console-control-strings "^1.0.0" 512 | has-unicode "^2.0.0" 513 | object-assign "^4.1.0" 514 | signal-exit "^3.0.0" 515 | string-width "^1.0.1" 516 | strip-ansi "^3.0.1" 517 | wide-align "^1.1.0" 518 | 519 | generate-function@^2.0.0: 520 | version "2.0.0" 521 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 522 | 523 | generate-object-property@^1.1.0: 524 | version "1.2.0" 525 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 526 | dependencies: 527 | is-property "^1.0.0" 528 | 529 | getpass@^0.1.1: 530 | version "0.1.7" 531 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 532 | dependencies: 533 | assert-plus "^1.0.0" 534 | 535 | glob-base@^0.3.0: 536 | version "0.3.0" 537 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 538 | dependencies: 539 | glob-parent "^2.0.0" 540 | is-glob "^2.0.0" 541 | 542 | glob-parent@^2.0.0: 543 | version "2.0.0" 544 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 545 | dependencies: 546 | is-glob "^2.0.0" 547 | 548 | glob@^7.0.5, glob@^7.1.1: 549 | version "7.1.2" 550 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 551 | dependencies: 552 | fs.realpath "^1.0.0" 553 | inflight "^1.0.4" 554 | inherits "2" 555 | minimatch "^3.0.4" 556 | once "^1.3.0" 557 | path-is-absolute "^1.0.0" 558 | 559 | graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: 560 | version "4.1.11" 561 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 562 | 563 | har-schema@^1.0.5: 564 | version "1.0.5" 565 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 566 | 567 | har-schema@^2.0.0: 568 | version "2.0.0" 569 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 570 | 571 | har-validator@~2.0.6: 572 | version "2.0.6" 573 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 574 | dependencies: 575 | chalk "^1.1.1" 576 | commander "^2.9.0" 577 | is-my-json-valid "^2.12.4" 578 | pinkie-promise "^2.0.0" 579 | 580 | har-validator@~4.2.1: 581 | version "4.2.1" 582 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 583 | dependencies: 584 | ajv "^4.9.1" 585 | har-schema "^1.0.5" 586 | 587 | har-validator@~5.1.0: 588 | version "5.1.0" 589 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" 590 | dependencies: 591 | ajv "^5.3.0" 592 | har-schema "^2.0.0" 593 | 594 | has-ansi@^2.0.0: 595 | version "2.0.0" 596 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 597 | dependencies: 598 | ansi-regex "^2.0.0" 599 | 600 | has-flag@^2.0.0: 601 | version "2.0.0" 602 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 603 | 604 | has-unicode@^2.0.0: 605 | version "2.0.1" 606 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 607 | 608 | hawk@3.1.3, hawk@~3.1.3: 609 | version "3.1.3" 610 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 611 | dependencies: 612 | boom "2.x.x" 613 | cryptiles "2.x.x" 614 | hoek "2.x.x" 615 | sntp "1.x.x" 616 | 617 | hoek@2.x.x: 618 | version "2.16.3" 619 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 620 | 621 | http-signature@~1.1.0: 622 | version "1.1.1" 623 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 624 | dependencies: 625 | assert-plus "^0.2.0" 626 | jsprim "^1.2.2" 627 | sshpk "^1.7.0" 628 | 629 | http-signature@~1.2.0: 630 | version "1.2.0" 631 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 632 | dependencies: 633 | assert-plus "^1.0.0" 634 | jsprim "^1.2.2" 635 | sshpk "^1.7.0" 636 | 637 | iconv-lite@^0.4.4: 638 | version "0.4.23" 639 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 640 | dependencies: 641 | safer-buffer ">= 2.1.2 < 3" 642 | 643 | ignore-walk@^3.0.1: 644 | version "3.0.1" 645 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 646 | dependencies: 647 | minimatch "^3.0.4" 648 | 649 | inflight@^1.0.4: 650 | version "1.0.6" 651 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 652 | dependencies: 653 | once "^1.3.0" 654 | wrappy "1" 655 | 656 | inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: 657 | version "2.0.3" 658 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 659 | 660 | ini@~1.3.0: 661 | version "1.3.5" 662 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 663 | 664 | is-binary-path@^1.0.0: 665 | version "1.0.1" 666 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 667 | dependencies: 668 | binary-extensions "^1.0.0" 669 | 670 | is-buffer@^1.1.5: 671 | version "1.1.6" 672 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 673 | 674 | is-dotfile@^1.0.0: 675 | version "1.0.3" 676 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 677 | 678 | is-equal-shallow@^0.1.3: 679 | version "0.1.3" 680 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 681 | dependencies: 682 | is-primitive "^2.0.0" 683 | 684 | is-extendable@^0.1.1: 685 | version "0.1.1" 686 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 687 | 688 | is-extglob@^1.0.0: 689 | version "1.0.0" 690 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 691 | 692 | is-fullwidth-code-point@^1.0.0: 693 | version "1.0.0" 694 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 695 | dependencies: 696 | number-is-nan "^1.0.0" 697 | 698 | is-fullwidth-code-point@^2.0.0: 699 | version "2.0.0" 700 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 701 | 702 | is-glob@^2.0.0, is-glob@^2.0.1: 703 | version "2.0.1" 704 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 705 | dependencies: 706 | is-extglob "^1.0.0" 707 | 708 | is-my-ip-valid@^1.0.0: 709 | version "1.0.0" 710 | resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" 711 | 712 | is-my-json-valid@^2.12.4: 713 | version "2.19.0" 714 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz#8fd6e40363cd06b963fa877d444bfb5eddc62175" 715 | dependencies: 716 | generate-function "^2.0.0" 717 | generate-object-property "^1.1.0" 718 | is-my-ip-valid "^1.0.0" 719 | jsonpointer "^4.0.0" 720 | xtend "^4.0.0" 721 | 722 | is-number@^2.1.0: 723 | version "2.1.0" 724 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 725 | dependencies: 726 | kind-of "^3.0.2" 727 | 728 | is-number@^4.0.0: 729 | version "4.0.0" 730 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" 731 | 732 | is-posix-bracket@^0.1.0: 733 | version "0.1.1" 734 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 735 | 736 | is-primitive@^2.0.0: 737 | version "2.0.0" 738 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 739 | 740 | is-property@^1.0.0: 741 | version "1.0.2" 742 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 743 | 744 | is-typedarray@~1.0.0: 745 | version "1.0.0" 746 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 747 | 748 | isarray@1.0.0, isarray@~1.0.0: 749 | version "1.0.0" 750 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 751 | 752 | isexe@^2.0.0: 753 | version "2.0.0" 754 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 755 | 756 | isobject@^2.0.0: 757 | version "2.1.0" 758 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 759 | dependencies: 760 | isarray "1.0.0" 761 | 762 | isstream@~0.1.2: 763 | version "0.1.2" 764 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 765 | 766 | jsbn@~0.1.0: 767 | version "0.1.1" 768 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 769 | 770 | json-schema-traverse@^0.3.0: 771 | version "0.3.1" 772 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 773 | 774 | json-schema@0.2.3: 775 | version "0.2.3" 776 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 777 | 778 | json-stable-stringify@^1.0.1: 779 | version "1.0.1" 780 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 781 | dependencies: 782 | jsonify "~0.0.0" 783 | 784 | json-stringify-safe@~5.0.1: 785 | version "5.0.1" 786 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 787 | 788 | jsonfile@^2.1.0: 789 | version "2.4.0" 790 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" 791 | optionalDependencies: 792 | graceful-fs "^4.1.6" 793 | 794 | jsonify@~0.0.0: 795 | version "0.0.0" 796 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 797 | 798 | jsonpointer@^4.0.0: 799 | version "4.0.1" 800 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 801 | 802 | jsprim@^1.2.2: 803 | version "1.4.1" 804 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 805 | dependencies: 806 | assert-plus "1.0.0" 807 | extsprintf "1.3.0" 808 | json-schema "0.2.3" 809 | verror "1.10.0" 810 | 811 | kind-of@^3.0.2: 812 | version "3.2.2" 813 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 814 | dependencies: 815 | is-buffer "^1.1.5" 816 | 817 | kind-of@^6.0.0: 818 | version "6.0.2" 819 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 820 | 821 | klaw@^1.0.0: 822 | version "1.3.1" 823 | resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" 824 | optionalDependencies: 825 | graceful-fs "^4.1.9" 826 | 827 | lodash@4.13.1: 828 | version "4.13.1" 829 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.13.1.tgz#83e4b10913f48496d4d16fec4a560af2ee744b68" 830 | 831 | lodash@4.14.2: 832 | version "4.14.2" 833 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.14.2.tgz#bbccce6373a400fbfd0a8c67ca42f6d1ef416432" 834 | 835 | lodash@^4.13.1: 836 | version "4.17.10" 837 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" 838 | 839 | lru-cache@^4.0.1: 840 | version "4.1.3" 841 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" 842 | dependencies: 843 | pseudomap "^1.0.2" 844 | yallist "^2.1.2" 845 | 846 | math-random@^1.0.1: 847 | version "1.0.1" 848 | resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" 849 | 850 | micromatch@^2.1.5: 851 | version "2.3.11" 852 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 853 | dependencies: 854 | arr-diff "^2.0.0" 855 | array-unique "^0.2.1" 856 | braces "^1.8.2" 857 | expand-brackets "^0.1.4" 858 | extglob "^0.3.1" 859 | filename-regex "^2.0.0" 860 | is-extglob "^1.0.0" 861 | is-glob "^2.0.1" 862 | kind-of "^3.0.2" 863 | normalize-path "^2.0.1" 864 | object.omit "^2.0.0" 865 | parse-glob "^3.0.4" 866 | regex-cache "^0.4.2" 867 | 868 | mime-db@~1.35.0: 869 | version "1.35.0" 870 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" 871 | 872 | mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.7: 873 | version "2.1.19" 874 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" 875 | dependencies: 876 | mime-db "~1.35.0" 877 | 878 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: 879 | version "3.0.4" 880 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 881 | dependencies: 882 | brace-expansion "^1.1.7" 883 | 884 | minimist@0.0.8: 885 | version "0.0.8" 886 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 887 | 888 | minimist@^1.2.0: 889 | version "1.2.0" 890 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 891 | 892 | minipass@^2.2.1, minipass@^2.3.3: 893 | version "2.3.4" 894 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" 895 | dependencies: 896 | safe-buffer "^5.1.2" 897 | yallist "^3.0.0" 898 | 899 | minizlib@^1.1.0: 900 | version "1.1.0" 901 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" 902 | dependencies: 903 | minipass "^2.2.1" 904 | 905 | "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: 906 | version "0.5.1" 907 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 908 | dependencies: 909 | minimist "0.0.8" 910 | 911 | ms@2.0.0: 912 | version "2.0.0" 913 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 914 | 915 | murmur-hash-js@1.0.0: 916 | version "1.0.0" 917 | resolved "https://registry.yarnpkg.com/murmur-hash-js/-/murmur-hash-js-1.0.0.tgz#5041049269c96633c866386960b2f4289e75e5b0" 918 | 919 | mustache@^2.3.0: 920 | version "2.3.2" 921 | resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" 922 | 923 | nan@^2.3.0, nan@^2.9.2: 924 | version "2.10.0" 925 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" 926 | 927 | needle@^2.2.1: 928 | version "2.2.2" 929 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418" 930 | dependencies: 931 | debug "^2.1.2" 932 | iconv-lite "^0.4.4" 933 | sax "^1.2.4" 934 | 935 | node-elm-compiler@5.0.0-alpha1: 936 | version "5.0.0-alpha1" 937 | resolved "https://registry.yarnpkg.com/node-elm-compiler/-/node-elm-compiler-5.0.0-alpha1.tgz#ddfd35788595e5c127039975b50096188d1ae4f6" 938 | dependencies: 939 | cross-spawn "4.0.0" 940 | find-elm-dependencies "1.0.2" 941 | lodash "4.14.2" 942 | temp "^0.8.3" 943 | 944 | node-pre-gyp@^0.10.0: 945 | version "0.10.3" 946 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" 947 | dependencies: 948 | detect-libc "^1.0.2" 949 | mkdirp "^0.5.1" 950 | needle "^2.2.1" 951 | nopt "^4.0.1" 952 | npm-packlist "^1.1.6" 953 | npmlog "^4.0.2" 954 | rc "^1.2.7" 955 | rimraf "^2.6.1" 956 | semver "^5.3.0" 957 | tar "^4" 958 | 959 | node-pre-gyp@^0.6.36: 960 | version "0.6.39" 961 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" 962 | dependencies: 963 | detect-libc "^1.0.2" 964 | hawk "3.1.3" 965 | mkdirp "^0.5.1" 966 | nopt "^4.0.1" 967 | npmlog "^4.0.2" 968 | rc "^1.1.7" 969 | request "2.81.0" 970 | rimraf "^2.6.1" 971 | semver "^5.3.0" 972 | tar "^2.2.1" 973 | tar-pack "^3.4.0" 974 | 975 | nopt@^4.0.1: 976 | version "4.0.1" 977 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 978 | dependencies: 979 | abbrev "1" 980 | osenv "^0.1.4" 981 | 982 | normalize-path@^2.0.0, normalize-path@^2.0.1: 983 | version "2.1.1" 984 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 985 | dependencies: 986 | remove-trailing-separator "^1.0.1" 987 | 988 | npm-bundled@^1.0.1: 989 | version "1.0.5" 990 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" 991 | 992 | npm-packlist@^1.1.6: 993 | version "1.1.11" 994 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" 995 | dependencies: 996 | ignore-walk "^3.0.1" 997 | npm-bundled "^1.0.1" 998 | 999 | npmlog@^4.0.2: 1000 | version "4.1.2" 1001 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1002 | dependencies: 1003 | are-we-there-yet "~1.1.2" 1004 | console-control-strings "~1.1.0" 1005 | gauge "~2.7.3" 1006 | set-blocking "~2.0.0" 1007 | 1008 | number-is-nan@^1.0.0: 1009 | version "1.0.1" 1010 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1011 | 1012 | oauth-sign@~0.8.1: 1013 | version "0.8.2" 1014 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1015 | 1016 | oauth-sign@~0.9.0: 1017 | version "0.9.0" 1018 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 1019 | 1020 | object-assign@^4.1.0: 1021 | version "4.1.1" 1022 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1023 | 1024 | object.omit@^2.0.0: 1025 | version "2.0.1" 1026 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1027 | dependencies: 1028 | for-own "^0.1.4" 1029 | is-extendable "^0.1.1" 1030 | 1031 | once@^1.3.0, once@^1.3.3: 1032 | version "1.4.0" 1033 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1034 | dependencies: 1035 | wrappy "1" 1036 | 1037 | os-homedir@^1.0.0: 1038 | version "1.0.2" 1039 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1040 | 1041 | os-tmpdir@^1.0.0: 1042 | version "1.0.2" 1043 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1044 | 1045 | osenv@^0.1.4: 1046 | version "0.1.5" 1047 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1048 | dependencies: 1049 | os-homedir "^1.0.0" 1050 | os-tmpdir "^1.0.0" 1051 | 1052 | parse-glob@^3.0.4: 1053 | version "3.0.4" 1054 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1055 | dependencies: 1056 | glob-base "^0.3.0" 1057 | is-dotfile "^1.0.0" 1058 | is-extglob "^1.0.0" 1059 | is-glob "^2.0.0" 1060 | 1061 | path-is-absolute@^1.0.0: 1062 | version "1.0.1" 1063 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1064 | 1065 | performance-now@^0.2.0: 1066 | version "0.2.0" 1067 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 1068 | 1069 | performance-now@^2.1.0: 1070 | version "2.1.0" 1071 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1072 | 1073 | pinkie-promise@^2.0.0: 1074 | version "2.0.1" 1075 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1076 | dependencies: 1077 | pinkie "^2.0.0" 1078 | 1079 | pinkie@^2.0.0: 1080 | version "2.0.4" 1081 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1082 | 1083 | preserve@^0.2.0: 1084 | version "0.2.0" 1085 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1086 | 1087 | process-nextick-args@~2.0.0: 1088 | version "2.0.0" 1089 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1090 | 1091 | pseudomap@^1.0.2: 1092 | version "1.0.2" 1093 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1094 | 1095 | psl@^1.1.24: 1096 | version "1.1.29" 1097 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" 1098 | 1099 | punycode@^1.4.1: 1100 | version "1.4.1" 1101 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1102 | 1103 | qs@~6.3.0: 1104 | version "6.3.2" 1105 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" 1106 | 1107 | qs@~6.4.0: 1108 | version "6.4.0" 1109 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 1110 | 1111 | qs@~6.5.2: 1112 | version "6.5.2" 1113 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1114 | 1115 | randomatic@^3.0.0: 1116 | version "3.1.0" 1117 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116" 1118 | dependencies: 1119 | is-number "^4.0.0" 1120 | kind-of "^6.0.0" 1121 | math-random "^1.0.1" 1122 | 1123 | rc@^1.1.7, rc@^1.2.7: 1124 | version "1.2.8" 1125 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1126 | dependencies: 1127 | deep-extend "^0.6.0" 1128 | ini "~1.3.0" 1129 | minimist "^1.2.0" 1130 | strip-json-comments "~2.0.1" 1131 | 1132 | readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: 1133 | version "2.3.6" 1134 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1135 | dependencies: 1136 | core-util-is "~1.0.0" 1137 | inherits "~2.0.3" 1138 | isarray "~1.0.0" 1139 | process-nextick-args "~2.0.0" 1140 | safe-buffer "~5.1.1" 1141 | string_decoder "~1.1.1" 1142 | util-deprecate "~1.0.1" 1143 | 1144 | readdirp@^2.0.0: 1145 | version "2.1.0" 1146 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1147 | dependencies: 1148 | graceful-fs "^4.1.2" 1149 | minimatch "^3.0.2" 1150 | readable-stream "^2.0.2" 1151 | set-immediate-shim "^1.0.1" 1152 | 1153 | regex-cache@^0.4.2: 1154 | version "0.4.4" 1155 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" 1156 | dependencies: 1157 | is-equal-shallow "^0.1.3" 1158 | 1159 | remove-trailing-separator@^1.0.1: 1160 | version "1.1.0" 1161 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 1162 | 1163 | repeat-element@^1.1.2: 1164 | version "1.1.3" 1165 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 1166 | 1167 | repeat-string@^1.5.2: 1168 | version "1.6.1" 1169 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1170 | 1171 | request-promise-core@1.1.1: 1172 | version "1.1.1" 1173 | resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" 1174 | dependencies: 1175 | lodash "^4.13.1" 1176 | 1177 | request-promise@^4.2.0: 1178 | version "4.2.2" 1179 | resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.2.tgz#d1ea46d654a6ee4f8ee6a4fea1018c22911904b4" 1180 | dependencies: 1181 | bluebird "^3.5.0" 1182 | request-promise-core "1.1.1" 1183 | stealthy-require "^1.1.0" 1184 | tough-cookie ">=2.3.3" 1185 | 1186 | request@2.79.0: 1187 | version "2.79.0" 1188 | resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" 1189 | dependencies: 1190 | aws-sign2 "~0.6.0" 1191 | aws4 "^1.2.1" 1192 | caseless "~0.11.0" 1193 | combined-stream "~1.0.5" 1194 | extend "~3.0.0" 1195 | forever-agent "~0.6.1" 1196 | form-data "~2.1.1" 1197 | har-validator "~2.0.6" 1198 | hawk "~3.1.3" 1199 | http-signature "~1.1.0" 1200 | is-typedarray "~1.0.0" 1201 | isstream "~0.1.2" 1202 | json-stringify-safe "~5.0.1" 1203 | mime-types "~2.1.7" 1204 | oauth-sign "~0.8.1" 1205 | qs "~6.3.0" 1206 | stringstream "~0.0.4" 1207 | tough-cookie "~2.3.0" 1208 | tunnel-agent "~0.4.1" 1209 | uuid "^3.0.0" 1210 | 1211 | request@2.81.0: 1212 | version "2.81.0" 1213 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 1214 | dependencies: 1215 | aws-sign2 "~0.6.0" 1216 | aws4 "^1.2.1" 1217 | caseless "~0.12.0" 1218 | combined-stream "~1.0.5" 1219 | extend "~3.0.0" 1220 | forever-agent "~0.6.1" 1221 | form-data "~2.1.1" 1222 | har-validator "~4.2.1" 1223 | hawk "~3.1.3" 1224 | http-signature "~1.1.0" 1225 | is-typedarray "~1.0.0" 1226 | isstream "~0.1.2" 1227 | json-stringify-safe "~5.0.1" 1228 | mime-types "~2.1.7" 1229 | oauth-sign "~0.8.1" 1230 | performance-now "^0.2.0" 1231 | qs "~6.4.0" 1232 | safe-buffer "^5.0.1" 1233 | stringstream "~0.0.4" 1234 | tough-cookie "~2.3.0" 1235 | tunnel-agent "^0.6.0" 1236 | uuid "^3.0.0" 1237 | 1238 | request@^2.87.0: 1239 | version "2.88.0" 1240 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 1241 | dependencies: 1242 | aws-sign2 "~0.7.0" 1243 | aws4 "^1.8.0" 1244 | caseless "~0.12.0" 1245 | combined-stream "~1.0.6" 1246 | extend "~3.0.2" 1247 | forever-agent "~0.6.1" 1248 | form-data "~2.3.2" 1249 | har-validator "~5.1.0" 1250 | http-signature "~1.2.0" 1251 | is-typedarray "~1.0.0" 1252 | isstream "~0.1.2" 1253 | json-stringify-safe "~5.0.1" 1254 | mime-types "~2.1.19" 1255 | oauth-sign "~0.9.0" 1256 | performance-now "^2.1.0" 1257 | qs "~6.5.2" 1258 | safe-buffer "^5.1.2" 1259 | tough-cookie "~2.4.3" 1260 | tunnel-agent "^0.6.0" 1261 | uuid "^3.3.2" 1262 | 1263 | rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: 1264 | version "2.6.2" 1265 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 1266 | dependencies: 1267 | glob "^7.0.5" 1268 | 1269 | rimraf@~2.2.6: 1270 | version "2.2.8" 1271 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" 1272 | 1273 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1274 | version "5.1.2" 1275 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1276 | 1277 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1278 | version "2.1.2" 1279 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1280 | 1281 | sax@^1.2.4: 1282 | version "1.2.4" 1283 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1284 | 1285 | semver@^5.3.0: 1286 | version "5.5.1" 1287 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" 1288 | 1289 | set-blocking@~2.0.0: 1290 | version "2.0.0" 1291 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1292 | 1293 | set-immediate-shim@^1.0.1: 1294 | version "1.0.1" 1295 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 1296 | 1297 | signal-exit@^3.0.0: 1298 | version "3.0.2" 1299 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1300 | 1301 | sntp@1.x.x: 1302 | version "1.0.9" 1303 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1304 | dependencies: 1305 | hoek "2.x.x" 1306 | 1307 | split@^1.0.1: 1308 | version "1.0.1" 1309 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" 1310 | dependencies: 1311 | through "2" 1312 | 1313 | sshpk@^1.7.0: 1314 | version "1.14.2" 1315 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" 1316 | dependencies: 1317 | asn1 "~0.2.3" 1318 | assert-plus "^1.0.0" 1319 | dashdash "^1.12.0" 1320 | getpass "^0.1.1" 1321 | safer-buffer "^2.0.2" 1322 | optionalDependencies: 1323 | bcrypt-pbkdf "^1.0.0" 1324 | ecc-jsbn "~0.1.1" 1325 | jsbn "~0.1.0" 1326 | tweetnacl "~0.14.0" 1327 | 1328 | stealthy-require@^1.1.0: 1329 | version "1.1.1" 1330 | resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" 1331 | 1332 | string-width@^1.0.1: 1333 | version "1.0.2" 1334 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1335 | dependencies: 1336 | code-point-at "^1.0.0" 1337 | is-fullwidth-code-point "^1.0.0" 1338 | strip-ansi "^3.0.0" 1339 | 1340 | "string-width@^1.0.2 || 2": 1341 | version "2.1.1" 1342 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1343 | dependencies: 1344 | is-fullwidth-code-point "^2.0.0" 1345 | strip-ansi "^4.0.0" 1346 | 1347 | string_decoder@~1.1.1: 1348 | version "1.1.1" 1349 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1350 | dependencies: 1351 | safe-buffer "~5.1.0" 1352 | 1353 | stringstream@~0.0.4: 1354 | version "0.0.6" 1355 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" 1356 | 1357 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1358 | version "3.0.1" 1359 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1360 | dependencies: 1361 | ansi-regex "^2.0.0" 1362 | 1363 | strip-ansi@^4.0.0: 1364 | version "4.0.0" 1365 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1366 | dependencies: 1367 | ansi-regex "^3.0.0" 1368 | 1369 | strip-json-comments@~2.0.1: 1370 | version "2.0.1" 1371 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1372 | 1373 | supports-color@4.2.0: 1374 | version "4.2.0" 1375 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.0.tgz#ad986dc7eb2315d009b4d77c8169c2231a684037" 1376 | dependencies: 1377 | has-flag "^2.0.0" 1378 | 1379 | supports-color@^2.0.0: 1380 | version "2.0.0" 1381 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1382 | 1383 | supports-color@^4.0.0: 1384 | version "4.5.0" 1385 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 1386 | dependencies: 1387 | has-flag "^2.0.0" 1388 | 1389 | tar-pack@^3.4.0: 1390 | version "3.4.1" 1391 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" 1392 | dependencies: 1393 | debug "^2.2.0" 1394 | fstream "^1.0.10" 1395 | fstream-ignore "^1.0.5" 1396 | once "^1.3.3" 1397 | readable-stream "^2.1.4" 1398 | rimraf "^2.5.1" 1399 | tar "^2.2.1" 1400 | uid-number "^0.0.6" 1401 | 1402 | tar@2.2.1, tar@^2.2.1: 1403 | version "2.2.1" 1404 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 1405 | dependencies: 1406 | block-stream "*" 1407 | fstream "^1.0.2" 1408 | inherits "2" 1409 | 1410 | tar@^4: 1411 | version "4.4.6" 1412 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" 1413 | dependencies: 1414 | chownr "^1.0.1" 1415 | fs-minipass "^1.2.5" 1416 | minipass "^2.3.3" 1417 | minizlib "^1.1.0" 1418 | mkdirp "^0.5.0" 1419 | safe-buffer "^5.1.2" 1420 | yallist "^3.0.2" 1421 | 1422 | temp@^0.8.3: 1423 | version "0.8.3" 1424 | resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" 1425 | dependencies: 1426 | os-tmpdir "^1.0.0" 1427 | rimraf "~2.2.6" 1428 | 1429 | through@2: 1430 | version "2.3.8" 1431 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1432 | 1433 | tough-cookie@>=2.3.3, tough-cookie@~2.4.3: 1434 | version "2.4.3" 1435 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 1436 | dependencies: 1437 | psl "^1.1.24" 1438 | punycode "^1.4.1" 1439 | 1440 | tough-cookie@~2.3.0: 1441 | version "2.3.4" 1442 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" 1443 | dependencies: 1444 | punycode "^1.4.1" 1445 | 1446 | "traverse@>=0.3.0 <0.4": 1447 | version "0.3.9" 1448 | resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" 1449 | 1450 | tunnel-agent@^0.6.0: 1451 | version "0.6.0" 1452 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1453 | dependencies: 1454 | safe-buffer "^5.0.1" 1455 | 1456 | tunnel-agent@~0.4.1: 1457 | version "0.4.3" 1458 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 1459 | 1460 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1461 | version "0.14.5" 1462 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1463 | 1464 | uid-number@^0.0.6: 1465 | version "0.0.6" 1466 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 1467 | 1468 | unzip-stream@^0.3.0: 1469 | version "0.3.0" 1470 | resolved "https://registry.yarnpkg.com/unzip-stream/-/unzip-stream-0.3.0.tgz#c30c054cd6b0d64b13a23cd3ece911eb0b2b52d8" 1471 | dependencies: 1472 | binary "^0.3.0" 1473 | mkdirp "^0.5.1" 1474 | 1475 | util-deprecate@~1.0.1: 1476 | version "1.0.2" 1477 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1478 | 1479 | uuid@^3.0.0, uuid@^3.3.2: 1480 | version "3.3.2" 1481 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 1482 | 1483 | verror@1.10.0: 1484 | version "1.10.0" 1485 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1486 | dependencies: 1487 | assert-plus "^1.0.0" 1488 | core-util-is "1.0.2" 1489 | extsprintf "^1.2.0" 1490 | 1491 | which@^1.2.9: 1492 | version "1.3.1" 1493 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1494 | dependencies: 1495 | isexe "^2.0.0" 1496 | 1497 | wide-align@^1.1.0: 1498 | version "1.1.3" 1499 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1500 | dependencies: 1501 | string-width "^1.0.2 || 2" 1502 | 1503 | wrappy@1: 1504 | version "1.0.2" 1505 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1506 | 1507 | xmlbuilder@^8.2.2: 1508 | version "8.2.2" 1509 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" 1510 | 1511 | xtend@^4.0.0: 1512 | version "4.0.1" 1513 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1514 | 1515 | yallist@^2.1.2: 1516 | version "2.1.2" 1517 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1518 | 1519 | yallist@^3.0.0, yallist@^3.0.2: 1520 | version "3.0.2" 1521 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" 1522 | --------------------------------------------------------------------------------