├── .gitignore ├── LICENSE ├── README.md ├── elm.json ├── package.json ├── src ├── GraphQl.elm ├── GraphQl │ ├── Field.elm │ └── Http.elm └── Helpers.elm ├── tests └── Example.elm └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /elm-stuff 2 | .DS_Store 3 | node_modules/ 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Guillaume Hivert 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Elm GraphQL 2 | 3 | ## Opinion 4 | 5 | Just import GraphQL, and write queries and mutations! This package suppose your decoders are already written and do not write decoders, or that you want to keep control on the data received by GraphQL response. It only provides a nice syntax to do GraphQL queries and mutations, and decode the `"data"` at the root of standard GraphQL response for you as long as you use the HTTP wrapper. Just think on your schema, and don't bother with everything else. By not writing custom decoders, you can make multiple queries on the same data, with different schemas each times. They will always be converted to the same type, avoiding you to rewrote a type for each request like others can do. Moreover, it is purely written in Elm, avoiding you to think to recompile .graphql files. 6 | 7 | ## How to use? 8 | 9 | Basically, creates an object with `object`, add some fields with a list of `field`, and you're done! You can add some arguments, selectors or alias to the fields, by using the corresponding functions. The type system is here to protect you from doing anything crazy, so relax and enjoy GraphQL! 10 | 11 | Otherwise, a (huge) example: 12 | 13 | `Main.elm` 14 | ```elm 15 | module Main exposing (..) 16 | 17 | import Json.Encode as Encode 18 | import Json.Decode as Decode exposing (Decoder, field, maybe, int, string) 19 | import Http exposing (Error) 20 | import GraphQl exposing (Operation, Variables, Query, Named) 21 | 22 | type Msg 23 | = GraphQlMsg (Result Error NameAndAddress) 24 | 25 | type alias User = 26 | { id : Maybe Int 27 | , name : Maybe Name 28 | } 29 | 30 | type alias Name = 31 | { firstName : Maybe String 32 | , lastName : Maybe String 33 | } 34 | 35 | type alias Address = 36 | { street : Maybe String 37 | , town : Maybe String 38 | } 39 | 40 | type alias NameAndAddress = 41 | { user : User 42 | , address : Address 43 | } 44 | 45 | decodeName : Decoder Name 46 | decodeName = 47 | Decode.map2 Name 48 | (maybe (field "first_name" string)) 49 | (maybe (field "last_name" string)) 50 | 51 | decodeUser : Decoder User 52 | decodeUser = 53 | Decode.map2 User 54 | (maybe (field "id" int)) 55 | (maybe (field "name" decodeName)) 56 | 57 | decodeAddress : Decoder Address 58 | decodeAddress = 59 | Decode.map2 Address 60 | (maybe (field "street" string)) 61 | (maybe (field "town" string)) 62 | 63 | decodeNameAndAddress : Decoder NameAndAddress 64 | decodeNameAndAddress = 65 | Decode.map2 NameAndAddress 66 | (field "user" decodeUser) 67 | (field "address" decodeAddress) 68 | 69 | 70 | userRequest : Operation Query Variables 71 | userRequest = 72 | GraphQl.named "MySuperQuery" 73 | [ GraphQl.field "user" 74 | |> GraphQl.withArgument "id" (GraphQl.variable "id") 75 | |> GraphQl.withAlias "current_user" 76 | |> GraphQl.withSelectors 77 | [ GraphQl.field "id" 78 | , GraphQl.field "name" 79 | |> GraphQl.withSelectors 80 | [ GraphQl.field "first_name" 81 | , GraphQl.field "last_name" 82 | ] 83 | ] 84 | , GraphQl.field "address" 85 | |> GraphQl.withArgument "city" (GraphQl.string "Paris") 86 | |> GraphQl.withArgument "id" (GraphQl.int 12) 87 | |> GraphQl.withArgument "type" (GraphQl.type_ "LOFT") 88 | |> GraphQl.withSelectors 89 | [ GraphQl.field "street" 90 | , GraphQl.field "town" 91 | ] 92 | ] 93 | |> GraphQl.withVariables [ ("id", "123") ] 94 | 95 | sendRequest : Int -> Cmd Msg 96 | sendRequest id = 97 | GraphQl.query userRequest 98 | |> GraphQl.addVariables [ ("id", Encode.int id) ] 99 | |> GraphQl.send "https://example.com" GraphQlMsg decodeNameAndAddress 100 | ``` 101 | 102 | ## Want to contribute? 103 | 104 | If you think this package is good, or if you want to bugfix something, or just globally improve the package, feel free to contribute. Make a PR, open an issue, and I will gladly work on it to make it part of `elm-graphql`! 105 | 106 | ## Alternatives 107 | 108 | If you're searching a complete solution including Decoders implicitly defined with your query, take a look at [Elm GraphQL by Dillon Kearns](https://github.com/dillonkearns/elm-graphql) or maybe [Elm GraphQL in Elm](https://github.com/jamesmacaulay/elm-graphql), and if you're searching for converting .graphql files to Elm, take a look at [GraphQL to Elm](https://github.com/jahewson/elm-graphql)! 109 | -------------------------------------------------------------------------------- /elm.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "package", 3 | "name": "ghivert/elm-graphql", 4 | "summary": "GraphQL queries made easy in Elm!", 5 | "license": "MIT", 6 | "version": "5.0.0", 7 | "exposed-modules": [ 8 | "GraphQl", 9 | "GraphQl.Http" 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": "2.0.0 <= v < 3.0.0", 15 | "elm/json": "1.0.0 <= v < 2.0.0" 16 | }, 17 | "test-dependencies": { 18 | "elm-explorations/test": "1.2.2 <= v < 2.0.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "elm-graphql", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "repository": "git@github.com:ghivert/elm-graphql.git", 6 | "author": "Guillaume Hivert ", 7 | "license": "MIT", 8 | "scripts": { 9 | "test": "elm-test" 10 | }, 11 | "devDependencies": { 12 | "elm-test": "^0.19.1-revision2" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/GraphQl.elm: -------------------------------------------------------------------------------- 1 | module GraphQl 2 | exposing 3 | ( Operation, Field, Anonymous, Named, Variables, Mutation, Query, Request, Argument 4 | , query, mutation, addVariables 5 | , object, named, field 6 | , withArgument, withVariables, withSelectors, withAlias 7 | , variable, type_, int, float, bool, string, input, nestedInput 8 | , toJson 9 | ) 10 | 11 | {-| GraphQL queries and mutations made easy in Elm! 12 | This package provides an easier way to deal with GraphQL queries and mutations. 13 | This package is agnostic about how you send your requests through the wire. It 14 | could packages the request inside an HTTP post for you with `GraphQl.Http`, but 15 | also allows you to extract the JSON and send it through whatever way you want, 16 | WebSocket for example. 17 | 18 | ``` 19 | import GraphQl exposing (Mutation, Query, Variables, Named, Operation) 20 | import GraphQl.Http 21 | import Http 22 | import Json.Decode as Decode exposing (Decoder) 23 | import Json.Encode as Encode 24 | 25 | -- Define the request. 26 | userRequest : Operation Query Variables 27 | userRequest = 28 | GraphQl.named "MySuperQuery" 29 | [ GraphQl.field "user" 30 | |> GraphQl.withArgument "id" (GraphQl.variable "id") 31 | |> GraphQl.withSelectors 32 | [ GraphQl.field "id" 33 | , GraphQl.field "name" 34 | |> GraphQl.withSelectors 35 | [ GraphQl.field "first_name" 36 | , GraphQl.field "last_name" 37 | ] 38 | |> GraphQl.withArgument "id" (GraphQl.type_ "INT!") 39 | ] 40 | , GraphQl.field "address" 41 | |> GraphQl.withArgument "city" (GraphQl.string "Paris") 42 | |> GraphQl.withArgument "id" (GraphQl.int 12) 43 | |> GraphQl.withArgument "type" (GraphQl.type_ "LOFT") 44 | |> GraphQl.withSelectors 45 | [ GraphQl.field "street" 46 | , GraphQl.field "neighborhood" 47 | ] 48 | ] 49 | |> GraphQl.withVariables [ ("id", "INT!") ] 50 | 51 | userModifying : Operation Mutation Named 52 | userModifying = 53 | GraphQl.named "MySuperMutation" 54 | [ GraphQl.field "CreateUser" 55 | |> GraphQl.withArgument "user" 56 | (GraphQl.input 57 | [ ("first", GraphQl.string "John") 58 | , ("last", GraphQl.string "Doe") 59 | ] 60 | ) 61 | ] 62 | 63 | -- And Send It through HTTP! 64 | sendRequest : Int -> (Result Http.Error a -> msg) -> Decoder a -> Cmd msg 65 | sendRequest id msg decoder = 66 | GraphQl.query userRequest 67 | |> GraphQl.addVariables [ ("id", Encode.int id) ] 68 | |> GraphQl.Http.send "/example_endpoint" msg decoder 69 | ``` 70 | 71 | # Field 72 | @docs Operation 73 | @docs Field 74 | @docs Anonymous 75 | @docs Named 76 | @docs Variables 77 | @docs Mutation 78 | @docs Query 79 | 80 | # Constructors 81 | @docs object 82 | @docs named 83 | @docs field 84 | 85 | # Modifiers 86 | @docs withArgument 87 | @docs withVariables 88 | @docs withAlias 89 | @docs withSelectors 90 | 91 | # Arguments 92 | @docs Argument 93 | @docs int 94 | @docs bool 95 | @docs float 96 | @docs string 97 | @docs type_ 98 | @docs variable 99 | @docs input 100 | @docs nestedInput 101 | 102 | # Requests 103 | @docs Request 104 | @docs query 105 | @docs mutation 106 | @docs addVariables 107 | @docs toJson 108 | -} 109 | 110 | import Json.Encode as Encode 111 | import Json.Decode as Decode exposing (Decoder) 112 | import GraphQl.Field as Field 113 | import Helpers 114 | 115 | {-| Requests contains the query or the mutation and the variables of each GraphQL requests. 116 | The variables can't be used with an anonymous Request, due to the nature of GraphQL. 117 | -} 118 | type Request a b 119 | = Request OperationType (Operation a b) (Maybe (List (String, Encode.Value))) 120 | 121 | {-| Entry of every GraphQL query to turn them into requests, which can be launched! 122 | 123 | object [] 124 | |> query 125 | |> Http.send "https://example.com" msg decoder 126 | -} 127 | query : Operation Query a -> Request Query a 128 | query query_ = 129 | Request OperationQuery query_ Nothing 130 | 131 | {-| Entry of every GraphQL mutation to turn them into requests, which can be launched! 132 | 133 | object [] 134 | |> mutation 135 | |> Http.send "https://example.com" msg decoder 136 | -} 137 | mutation : Operation Mutation a -> Request Mutation a 138 | mutation query_ = 139 | Request OperationMutation query_ Nothing 140 | 141 | {-| Add variables to a request. Useful when defining variables in your GraphQL request. 142 | If no variables has been defined in your operation, no variables can be added: the 143 | compiler will reject it. 144 | 145 | named [ field "user" |> withArgument "id" (variable "id") ] 146 | |> withVariables [ ("id", "INT") ] 147 | |> query 148 | |> addVariables [ ("id", Encode.int 12) ] 149 | |> toJson 150 | -} 151 | addVariables : List (String, Encode.Value) -> Request a b -> Request a b 152 | addVariables variables (Request requestType operation _) = 153 | Request requestType operation (Just variables) 154 | 155 | type OperationType 156 | = OperationQuery 157 | | OperationMutation 158 | 159 | {-| -} 160 | type Query = Query 161 | 162 | {-| -} 163 | type Mutation = Mutation 164 | 165 | {-| -} 166 | type Anonymous = Anonymous 167 | 168 | {-| -} 169 | type Named = Named 170 | 171 | {-| -} 172 | type Variables = Variables 173 | 174 | {-| Handle GraphQL values. -} 175 | type alias Field a = Field.Field a 176 | 177 | {-| Handle GraphQL operations -} 178 | type Operation a b = Operation (Field.Field a) 179 | 180 | {-| Handle arguments on GraphQL fields. -} 181 | type Argument = Argument String 182 | 183 | {-| Generates a Field, from a list of fields. 184 | 185 | object 186 | [ field "user" ] 187 | 188 | Turns into: 189 | 190 | { 191 | user 192 | } 193 | -} 194 | object : List (Field a) -> Operation a Anonymous 195 | object = Field.addSelectorsIn Field.new >> Operation 196 | 197 | {-| Generates a Field with a name. 198 | 199 | named "MySuperRequest" 200 | [ field "user" ] 201 | 202 | Turns into: 203 | 204 | MySuperRequest { 205 | user 206 | } 207 | -} 208 | named : String -> List (Field a) -> Operation a Named 209 | named id = 210 | Field.addSelectorsIn Field.new 211 | >> Field.setId id 212 | >> Operation 213 | 214 | {-| Generates a field. -} 215 | field : String -> Field a 216 | field id = Field.setId id Field.new 217 | 218 | {-| Adds variables to an Operation. 219 | 220 | "UserRequest" [ field "user" ] 221 | |> withVariables [ ("id", "id") ] 222 | 223 | Turns into: 224 | 225 | query UserRequest(id: $id) { 226 | user 227 | } 228 | -} 229 | withVariables : List (String, String) -> Operation a Named -> Operation a Variables 230 | withVariables values (Operation value) = 231 | values 232 | |> List.map generateVariablePair 233 | |> List.foldr Field.addInFieldVariables value 234 | |> Operation 235 | 236 | generateVariablePair : (String, String) -> (String, String) 237 | generateVariablePair (name, content) = ("$" ++ name, content) 238 | 239 | {-| Adds selectors to a Field. 240 | 241 | field "user" 242 | |> withSelectors 243 | [ field "id" 244 | , field "first_name" 245 | , field "last_name" 246 | ] 247 | 248 | Turns into: 249 | 250 | user { 251 | id 252 | first_name 253 | last_name 254 | } 255 | -} 256 | withSelectors : List (Field a) -> Field a -> Field a 257 | withSelectors selectors value = Field.addSelectorsIn value selectors 258 | 259 | {-| Adds an alias to a Field. 260 | 261 | field "user" 262 | |> withAlias "currentUser" 263 | |> withSelectors 264 | [ field "id" 265 | , field "first_name" 266 | , field "last_name" 267 | ] 268 | 269 | Turns into: 270 | 271 | currentUser: user { 272 | id 273 | first_name 274 | last_name 275 | } 276 | -} 277 | withAlias : String -> Field a -> Field a 278 | withAlias alias_ value = Field.setAlias alias_ value 279 | 280 | {-| Adds an argument to a Field. 281 | 282 | field "user" 283 | |> withArgument "id" (GraphQl.string "12") 284 | |> withSelectors 285 | [ field "id" 286 | , field "first_name" 287 | , field "last_name" 288 | ] 289 | 290 | Turns into: 291 | 292 | user(id: "12") { 293 | id 294 | first_name 295 | last_name 296 | } 297 | -} 298 | withArgument : String -> Argument -> Field a -> Field a 299 | withArgument name (Argument content) value = 300 | Field.addInFieldArguments (name, content) value 301 | 302 | {-| Generates an argument, to use with `withArgument`. 303 | You don't have to handle the $ sign. 304 | 305 | field "user" 306 | |> withArgument "id" (GraphQl.variable "id") 307 | 308 | Turns into: 309 | 310 | user(id: $id) 311 | -} 312 | variable : String -> Argument 313 | variable name = Argument ("$" ++ name) 314 | 315 | {-| Generates an argument, to use with `withArgument`. 316 | 317 | field "user" 318 | |> withArgument "id" (GraphQl.int 12) 319 | 320 | Turns into: 321 | 322 | user(id: 12) 323 | -} 324 | int : Int -> Argument 325 | int = String.fromInt >> Argument 326 | 327 | {-| Generates an argument, to use with `withArgument`. 328 | 329 | field "user" 330 | |> withArgument "score" (GraphQl.float 12.1) 331 | 332 | Turns into: 333 | 334 | user(id: 12) 335 | -} 336 | float : Float -> Argument 337 | float = String.fromFloat >> Argument 338 | 339 | {-| Generates an argument, to use with `withArgument`. 340 | 341 | field "user" 342 | |> withArgument "admin" (GraphQl.bool False) 343 | 344 | Turns into: 345 | 346 | user(id: false) 347 | -} 348 | bool : Bool -> Argument 349 | bool value = 350 | Argument <| 351 | case value of 352 | True -> "true" 353 | False -> "false" 354 | 355 | {-| Generates an argument, to use with `withArgument`. 356 | 357 | field "user" 358 | |> withArgument "id" (GraphQl.string "12") 359 | 360 | Turns into: 361 | 362 | user(id: "12") 363 | -} 364 | string : String -> Argument 365 | string = Helpers.betweenQuotes >> Argument 366 | 367 | {-| Generates an argument, to use with `withArgument`. 368 | Generate a type in GraphQL. 369 | 370 | field "user" 371 | |> withArgument "id" (GraphQl.type_ "INT") 372 | 373 | Turns into: 374 | 375 | user(id: INT) 376 | -} 377 | type_ : String -> Argument 378 | type_ = Argument 379 | 380 | {-| Generates an argument, to use with 'withArgument'. 381 | 382 | field "CreateUser" 383 | |> withArgument "user" 384 | (GraphQl.input 385 | [ ("first", (GraphQl.string "John")) 386 | , ("last", (GraphQl.string "Doe")) 387 | ] 388 | ) 389 | 390 | Turns into: 391 | 392 | CreateUser(user: {first: "John", last: "Doe"}) 393 | -} 394 | input : List (String, Argument) -> Argument 395 | input = argsToString >> Argument 396 | 397 | {-| Generates an argument, to use with 'withArgument'. 398 | 399 | field "CreateUser" 400 | |> withArgument "users" 401 | (GraphQl.nestedInput 402 | [ [ ("first", (GraphQl.string "John")) 403 | , ("last", (GraphQl.string "Doe")) 404 | ] 405 | , [ ("first", (GraphQl.string "Jane")) 406 | , ("last", (GraphQl.string "Smith")) 407 | ] 408 | ] 409 | ) 410 | 411 | Turns into: 412 | 413 | CreateUsers(users: [ 414 | {first: "John", last: "Doe"}, 415 | {first: "Jane", last: "Smith"} 416 | ]) 417 | -} 418 | nestedInput : List (List (String, Argument)) -> Argument 419 | nestedInput = 420 | List.map argsToString 421 | >> String.join ", " 422 | >> Helpers.betweenBrackets 423 | >> Argument 424 | 425 | argsToString : List (String, Argument) -> String 426 | argsToString = 427 | List.map addArgField 428 | >> String.join ", " 429 | >> Helpers.betweenBraces 430 | 431 | addArgField : (String, Argument) -> String 432 | addArgField (param, Argument operation) = param ++ ": " ++ operation 433 | 434 | {-| Extract the JSON part of a `Request` to use it into your own requests. 435 | 436 | sendUserRequest : Cmd msg 437 | sendUserRequest = 438 | myAwesomeRequest 439 | |> toJson 440 | |> Json.Encode.encode 0 441 | |> WebSocket.send 442 | -} 443 | toJson : Request a b -> Encode.Value 444 | toJson (Request requestType operation variables) = 445 | operationToJson requestType operation variables 446 | 447 | operationToJson : OperationType -> Operation a b -> Maybe (List (String, Encode.Value)) -> Encode.Value 448 | operationToJson requestType value variables = 449 | Encode.object 450 | <| List.concat 451 | [ [ ("query", Encode.string <| encodeOperation requestType value) ] 452 | , variables 453 | |> Maybe.map Encode.object 454 | |> Maybe.map (Tuple.pair "variables") 455 | |> Maybe.map List.singleton 456 | |> Maybe.withDefault [] 457 | ] 458 | 459 | encodeOperation : OperationType -> Operation a b -> String 460 | encodeOperation requestType (Operation value) = 461 | value 462 | |> Field.encodeField 463 | |> (++) (operationToString requestType) 464 | 465 | operationToString : OperationType -> String 466 | operationToString requestType = 467 | case requestType of 468 | OperationMutation -> "mutation " 469 | OperationQuery -> "query " 470 | -------------------------------------------------------------------------------- /src/GraphQl/Field.elm: -------------------------------------------------------------------------------- 1 | module GraphQl.Field 2 | exposing 3 | ( Field 4 | , new 5 | , setId, setAlias, setArguments 6 | , addSelectorsIn 7 | , addInFieldArguments, addInFieldVariables 8 | , encodeField 9 | ) 10 | 11 | import Helpers 12 | 13 | 14 | 15 | type Field a 16 | = Field 17 | { id : Maybe String 18 | , alias : Maybe String 19 | , arguments : List (String, String) 20 | , variables : List (String, String) 21 | , selectors : List (Field a) 22 | } 23 | 24 | new : Field a 25 | new = 26 | Field 27 | { id = Nothing 28 | , alias = Nothing 29 | , arguments = [] 30 | , variables = [] 31 | , selectors = [] 32 | } 33 | 34 | setId : String -> Field a -> Field a 35 | setId id (Field value) = 36 | Field { value | id = Just id } 37 | 38 | setAlias : String -> Field a -> Field a 39 | setAlias alias (Field value) = 40 | Field { value | alias = Just alias } 41 | 42 | unsetAlias : Field a -> Field a 43 | unsetAlias (Field value) = 44 | Field { value | alias = Nothing } 45 | 46 | setArguments : List (String, String) -> Field a -> Field a 47 | setArguments arguments (Field value) = 48 | Field { value | arguments = arguments } 49 | 50 | setVariables : List (String, String) -> Field a -> Field a 51 | setVariables variables (Field value) = 52 | Field { value | variables = variables } 53 | 54 | addSelectorsIn : Field a -> List (Field a) -> Field a 55 | addSelectorsIn (Field value) selectors = 56 | Field { value | selectors = List.append selectors value.selectors } 57 | 58 | swapArgumentsAndVariables : Field a -> Field a 59 | swapArgumentsAndVariables (Field value) = 60 | Field { value | arguments = value.variables } 61 | 62 | addInFieldArguments : (String, String) -> Field a -> Field a 63 | addInFieldArguments arg (Field value) = 64 | setArguments (arg :: value.arguments) (Field value) 65 | 66 | addInFieldVariables : (String, String) -> Field a -> Field a 67 | addInFieldVariables var (Field value) = 68 | setVariables (var :: value.variables) (Field value) 69 | 70 | 71 | 72 | 73 | encodeField : Field a -> String 74 | encodeField value = 75 | value 76 | |> unsetAlias 77 | |> swapArgumentsAndVariables 78 | |> encodeFieldHelp 79 | 80 | encodeFieldHelp : Field a -> String 81 | encodeFieldHelp (Field value) = 82 | value.id 83 | |> Maybe.map (encodeName (Field value)) 84 | |> Maybe.withDefault "" 85 | |> Helpers.reverseAdd (addSelectors value.selectors) 86 | 87 | encodeName : Field a -> String -> String 88 | encodeName (Field value) id = 89 | addName value.alias ++ id 90 | |> Helpers.reverseAdd (addArguments value.arguments) 91 | 92 | addName : Maybe String -> String 93 | addName = 94 | Maybe.map (Helpers.reverseAdd ":") >> Maybe.withDefault "" 95 | 96 | addSelectors : List (Field a) -> String 97 | addSelectors selectors = 98 | if List.isEmpty selectors then 99 | "" 100 | else 101 | selectors 102 | |> List.map encodeFieldHelp 103 | |> String.join "\n" 104 | |> Helpers.betweenNewline 105 | |> Helpers.betweenBraces 106 | 107 | addArguments : List (String, String) -> String 108 | addArguments arguments = 109 | if List.isEmpty arguments then 110 | "" 111 | else 112 | arguments 113 | |> List.map joinGraphQlArgument 114 | |> String.join ", " 115 | |> Helpers.betweenParen 116 | 117 | joinGraphQlArgument : (String, String) -> String 118 | joinGraphQlArgument (param, value) = 119 | param ++ ": " ++ value 120 | -------------------------------------------------------------------------------- /src/GraphQl/Http.elm: -------------------------------------------------------------------------------- 1 | module GraphQl.Http exposing (Options, send) 2 | 3 | {-| This module provides helpers to directly deal with HTTP with GraphQL. 4 | 5 | @docs Options 6 | @docs send 7 | -} 8 | 9 | import GraphQl 10 | import Json.Decode as Decode exposing (Decoder) 11 | import Http exposing (Error) 12 | 13 | {-| Defines all the options for a GraphQl request. -} 14 | type alias Options = 15 | { url : String 16 | , headers : List Http.Header 17 | } 18 | 19 | {-| Send a GraphQL request directly through an HTTP post, directly decoding the 20 | `data` field in the response. 21 | 22 | graphQlRequestOptions : GraphQl.Options 23 | graphQlRequestOptions = 24 | { url = "/example_endpoint" 25 | , headers = [] 26 | } 27 | 28 | sendMyAwesomeRequest : (Result Http.Error a -> msg) -> Decoder a -> Cmd msg 29 | sendMyAwesomeRequest msg decoder = 30 | GraphQl.query myAwesomeRequest 31 | |> GraphQl.Http.send graphQlRequestOptions msg decoder 32 | -} 33 | send : Options -> (Result Error c -> msg) -> Decoder c -> GraphQl.Request a b -> Cmd msg 34 | send { url, headers } msg decoder body = 35 | { method = "POST" 36 | , headers = headers 37 | , url = url 38 | , body = Http.jsonBody (GraphQl.toJson body) 39 | , timeout = Nothing 40 | , tracker = Nothing 41 | , expect = Http.expectJson msg (Decode.field "data" decoder) 42 | } 43 | |> Http.request 44 | -------------------------------------------------------------------------------- /src/Helpers.elm: -------------------------------------------------------------------------------- 1 | module Helpers exposing (..) 2 | 3 | reverseAdd : String -> String -> String 4 | reverseAdd first second = 5 | second ++ first 6 | 7 | between : String -> String -> String 8 | between char string = 9 | char ++ string ++ char 10 | 11 | betweenQuotes : String -> String 12 | betweenQuotes = 13 | between "\"" 14 | 15 | betweenBraces : String -> String 16 | betweenBraces string = 17 | "{" ++ string ++ "}" 18 | 19 | betweenBrackets : String -> String 20 | betweenBrackets string = 21 | "[" ++ string ++ "]" 22 | 23 | betweenParen : String -> String 24 | betweenParen string = 25 | "(" ++ string ++ ")" 26 | 27 | betweenNewline : String -> String 28 | betweenNewline = 29 | between "\n" 30 | -------------------------------------------------------------------------------- /tests/Example.elm: -------------------------------------------------------------------------------- 1 | module Example exposing (..) 2 | 3 | import Test exposing (..) 4 | 5 | suite : Test 6 | suite = 7 | todo "Write tests..." 8 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/color-name@^1.1.1": 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 8 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 9 | 10 | ajv@^6.5.5: 11 | version "6.12.0" 12 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" 13 | integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== 14 | dependencies: 15 | fast-deep-equal "^3.1.1" 16 | fast-json-stable-stringify "^2.0.0" 17 | json-schema-traverse "^0.4.1" 18 | uri-js "^4.2.2" 19 | 20 | ansi-styles@^4.1.0: 21 | version "4.2.1" 22 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 23 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 24 | dependencies: 25 | "@types/color-name" "^1.1.1" 26 | color-convert "^2.0.1" 27 | 28 | anymatch@~3.1.1: 29 | version "3.1.1" 30 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 31 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 32 | dependencies: 33 | normalize-path "^3.0.0" 34 | picomatch "^2.0.4" 35 | 36 | asn1@~0.2.3: 37 | version "0.2.4" 38 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 39 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 40 | dependencies: 41 | safer-buffer "~2.1.0" 42 | 43 | assert-plus@1.0.0, assert-plus@^1.0.0: 44 | version "1.0.0" 45 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 46 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 47 | 48 | asynckit@^0.4.0: 49 | version "0.4.0" 50 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 51 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 52 | 53 | aws-sign2@~0.7.0: 54 | version "0.7.0" 55 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 56 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 57 | 58 | aws4@^1.8.0: 59 | version "1.9.1" 60 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" 61 | integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== 62 | 63 | balanced-match@^1.0.0: 64 | version "1.0.0" 65 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 66 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 67 | 68 | bcrypt-pbkdf@^1.0.0: 69 | version "1.0.2" 70 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 71 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 72 | dependencies: 73 | tweetnacl "^0.14.3" 74 | 75 | binary-extensions@^2.0.0: 76 | version "2.0.0" 77 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" 78 | integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== 79 | 80 | binary@^0.3.0: 81 | version "0.3.0" 82 | resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" 83 | integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= 84 | dependencies: 85 | buffers "~0.1.1" 86 | chainsaw "~0.1.0" 87 | 88 | binwrap@0.2.2: 89 | version "0.2.2" 90 | resolved "https://registry.yarnpkg.com/binwrap/-/binwrap-0.2.2.tgz#7d1ea74b28332f18dfdc75548aef993041ffafc9" 91 | integrity sha512-Y+Wvypk3JhH5GPZAvlwJAWOVH/OsOhQMSj37vySuWHwQivoALplPxfBA8b973rFJI7OS+O+1YmmYXIiEXVMAcw== 92 | dependencies: 93 | mustache "^3.0.1" 94 | request "^2.88.0" 95 | request-promise "^4.2.4" 96 | tar "^4.4.10" 97 | unzip-stream "^0.3.0" 98 | 99 | bluebird@^3.5.0: 100 | version "3.7.2" 101 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 102 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 103 | 104 | brace-expansion@^1.1.7: 105 | version "1.1.11" 106 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 107 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 108 | dependencies: 109 | balanced-match "^1.0.0" 110 | concat-map "0.0.1" 111 | 112 | braces@~3.0.2: 113 | version "3.0.2" 114 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 115 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 116 | dependencies: 117 | fill-range "^7.0.1" 118 | 119 | buffers@~0.1.1: 120 | version "0.1.1" 121 | resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" 122 | integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= 123 | 124 | caseless@~0.12.0: 125 | version "0.12.0" 126 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 127 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 128 | 129 | chainsaw@~0.1.0: 130 | version "0.1.0" 131 | resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" 132 | integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= 133 | dependencies: 134 | traverse ">=0.3.0 <0.4" 135 | 136 | chalk@3.0.0: 137 | version "3.0.0" 138 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 139 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 140 | dependencies: 141 | ansi-styles "^4.1.0" 142 | supports-color "^7.1.0" 143 | 144 | chokidar@3.3.0: 145 | version "3.3.0" 146 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" 147 | integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== 148 | dependencies: 149 | anymatch "~3.1.1" 150 | braces "~3.0.2" 151 | glob-parent "~5.1.0" 152 | is-binary-path "~2.1.0" 153 | is-glob "~4.0.1" 154 | normalize-path "~3.0.0" 155 | readdirp "~3.2.0" 156 | optionalDependencies: 157 | fsevents "~2.1.1" 158 | 159 | chownr@^1.1.1: 160 | version "1.1.4" 161 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 162 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 163 | 164 | color-convert@^2.0.1: 165 | version "2.0.1" 166 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 167 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 168 | dependencies: 169 | color-name "~1.1.4" 170 | 171 | color-name@~1.1.4: 172 | version "1.1.4" 173 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 174 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 175 | 176 | combined-stream@^1.0.6, combined-stream@~1.0.6: 177 | version "1.0.8" 178 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 179 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 180 | dependencies: 181 | delayed-stream "~1.0.0" 182 | 183 | concat-map@0.0.1: 184 | version "0.0.1" 185 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 186 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 187 | 188 | core-util-is@1.0.2: 189 | version "1.0.2" 190 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 191 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 192 | 193 | cross-spawn@6.0.5: 194 | version "6.0.5" 195 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 196 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 197 | dependencies: 198 | nice-try "^1.0.4" 199 | path-key "^2.0.1" 200 | semver "^5.5.0" 201 | shebang-command "^1.2.0" 202 | which "^1.2.9" 203 | 204 | cross-spawn@7.0.1: 205 | version "7.0.1" 206 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" 207 | integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== 208 | dependencies: 209 | path-key "^3.1.0" 210 | shebang-command "^2.0.0" 211 | which "^2.0.1" 212 | 213 | dashdash@^1.12.0: 214 | version "1.14.1" 215 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 216 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 217 | dependencies: 218 | assert-plus "^1.0.0" 219 | 220 | delayed-stream@~1.0.0: 221 | version "1.0.0" 222 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 223 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 224 | 225 | ecc-jsbn@~0.1.1: 226 | version "0.1.2" 227 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 228 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 229 | dependencies: 230 | jsbn "~0.1.0" 231 | safer-buffer "^2.1.0" 232 | 233 | elm-test@^0.19.1-revision2: 234 | version "0.19.1-revision2" 235 | resolved "https://registry.yarnpkg.com/elm-test/-/elm-test-0.19.1-revision2.tgz#e73a7240ac6fd997279c825b7dc342fb65349028" 236 | integrity sha512-zVs2mVeyIE+K9y7/8b333h5xRMDWAoqbBDm7ThLDhyTi7ICxeL3t5uOS4KZCrRk9+4sP6+voSbcBlgr46Q+GiQ== 237 | dependencies: 238 | chalk "3.0.0" 239 | chokidar "3.3.0" 240 | cross-spawn "7.0.1" 241 | elmi-to-json "1.3.0" 242 | find-parent-dir "^0.3.0" 243 | firstline "2.0.2" 244 | fs-extra "8.1.0" 245 | glob "7.1.6" 246 | lodash "4.17.15" 247 | minimist "^1.2.0" 248 | murmur-hash-js "1.0.0" 249 | node-elm-compiler "5.0.4" 250 | split "1.0.1" 251 | supports-color "7.1.0" 252 | temp "0.9.1" 253 | which "2.0.1" 254 | xmlbuilder "^13.0.2" 255 | 256 | elmi-to-json@1.3.0: 257 | version "1.3.0" 258 | resolved "https://registry.yarnpkg.com/elmi-to-json/-/elmi-to-json-1.3.0.tgz#9de59d66d1df50f775a83405610ad41861a4305a" 259 | integrity sha512-6m1D5/Pb5pUrSOOBgRG3fE2mK19nhmLgZ16jj2KWTVIhT+0GIBuDI1iV0Fee27CZH790J7uMcdGWJ7fnVvpsKg== 260 | dependencies: 261 | binwrap "0.2.2" 262 | 263 | extend@~3.0.2: 264 | version "3.0.2" 265 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 266 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 267 | 268 | extsprintf@1.3.0: 269 | version "1.3.0" 270 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 271 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 272 | 273 | extsprintf@^1.2.0: 274 | version "1.4.0" 275 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 276 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 277 | 278 | fast-deep-equal@^3.1.1: 279 | version "3.1.1" 280 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" 281 | integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== 282 | 283 | fast-json-stable-stringify@^2.0.0: 284 | version "2.1.0" 285 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 286 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 287 | 288 | fill-range@^7.0.1: 289 | version "7.0.1" 290 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 291 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 292 | dependencies: 293 | to-regex-range "^5.0.1" 294 | 295 | find-elm-dependencies@2.0.2: 296 | version "2.0.2" 297 | resolved "https://registry.yarnpkg.com/find-elm-dependencies/-/find-elm-dependencies-2.0.2.tgz#589a759a021e6e2f8f0df805f973313fc4b55693" 298 | integrity sha512-nM5UCbccD1G8CGK2GsM7ykG3ksOAl9E+34jiDfl07CAl2OPnLpBVWY2hlxEmIkSBfdJjSopEowWHrO0cI8RhxQ== 299 | dependencies: 300 | firstline "1.2.0" 301 | lodash "4.17.15" 302 | 303 | find-parent-dir@^0.3.0: 304 | version "0.3.0" 305 | resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" 306 | integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= 307 | 308 | firstline@1.2.0: 309 | version "1.2.0" 310 | resolved "https://registry.yarnpkg.com/firstline/-/firstline-1.2.0.tgz#c9f4886e7f7fbf0afc12d71941dce06b192aea05" 311 | integrity sha1-yfSIbn9/vwr8EtcZQdzgaxkq6gU= 312 | 313 | firstline@2.0.2: 314 | version "2.0.2" 315 | resolved "https://registry.yarnpkg.com/firstline/-/firstline-2.0.2.tgz#3fdfd894a80e181cd2fa478b07cadb8d446c53cd" 316 | integrity sha512-8KcmfI0jgSECnzdhucm0i7vrwef3BWwgjimW2YkRC5eSFwjb5DibVoA0YvgkYwwxuJi9c+7M7X3b3lX8o9B6wg== 317 | 318 | forever-agent@~0.6.1: 319 | version "0.6.1" 320 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 321 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 322 | 323 | form-data@~2.3.2: 324 | version "2.3.3" 325 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 326 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 327 | dependencies: 328 | asynckit "^0.4.0" 329 | combined-stream "^1.0.6" 330 | mime-types "^2.1.12" 331 | 332 | fs-extra@8.1.0: 333 | version "8.1.0" 334 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 335 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 336 | dependencies: 337 | graceful-fs "^4.2.0" 338 | jsonfile "^4.0.0" 339 | universalify "^0.1.0" 340 | 341 | fs-minipass@^1.2.5: 342 | version "1.2.7" 343 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" 344 | integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== 345 | dependencies: 346 | minipass "^2.6.0" 347 | 348 | fs.realpath@^1.0.0: 349 | version "1.0.0" 350 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 351 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 352 | 353 | fsevents@~2.1.1: 354 | version "2.1.2" 355 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" 356 | integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== 357 | 358 | getpass@^0.1.1: 359 | version "0.1.7" 360 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 361 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 362 | dependencies: 363 | assert-plus "^1.0.0" 364 | 365 | glob-parent@~5.1.0: 366 | version "5.1.0" 367 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" 368 | integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== 369 | dependencies: 370 | is-glob "^4.0.1" 371 | 372 | glob@7.1.6, glob@^7.1.3: 373 | version "7.1.6" 374 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 375 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 376 | dependencies: 377 | fs.realpath "^1.0.0" 378 | inflight "^1.0.4" 379 | inherits "2" 380 | minimatch "^3.0.4" 381 | once "^1.3.0" 382 | path-is-absolute "^1.0.0" 383 | 384 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 385 | version "4.2.3" 386 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" 387 | integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== 388 | 389 | har-schema@^2.0.0: 390 | version "2.0.0" 391 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 392 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 393 | 394 | har-validator@~5.1.3: 395 | version "5.1.3" 396 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 397 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 398 | dependencies: 399 | ajv "^6.5.5" 400 | har-schema "^2.0.0" 401 | 402 | has-flag@^4.0.0: 403 | version "4.0.0" 404 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 405 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 406 | 407 | http-signature@~1.2.0: 408 | version "1.2.0" 409 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 410 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 411 | dependencies: 412 | assert-plus "^1.0.0" 413 | jsprim "^1.2.2" 414 | sshpk "^1.7.0" 415 | 416 | inflight@^1.0.4: 417 | version "1.0.6" 418 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 419 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 420 | dependencies: 421 | once "^1.3.0" 422 | wrappy "1" 423 | 424 | inherits@2: 425 | version "2.0.4" 426 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 427 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 428 | 429 | is-binary-path@~2.1.0: 430 | version "2.1.0" 431 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 432 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 433 | dependencies: 434 | binary-extensions "^2.0.0" 435 | 436 | is-extglob@^2.1.1: 437 | version "2.1.1" 438 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 439 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 440 | 441 | is-glob@^4.0.1, is-glob@~4.0.1: 442 | version "4.0.1" 443 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 444 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 445 | dependencies: 446 | is-extglob "^2.1.1" 447 | 448 | is-number@^7.0.0: 449 | version "7.0.0" 450 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 451 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 452 | 453 | is-typedarray@~1.0.0: 454 | version "1.0.0" 455 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 456 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 457 | 458 | isexe@^2.0.0: 459 | version "2.0.0" 460 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 461 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 462 | 463 | isstream@~0.1.2: 464 | version "0.1.2" 465 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 466 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 467 | 468 | jsbn@~0.1.0: 469 | version "0.1.1" 470 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 471 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 472 | 473 | json-schema-traverse@^0.4.1: 474 | version "0.4.1" 475 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 476 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 477 | 478 | json-schema@0.2.3: 479 | version "0.2.3" 480 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 481 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 482 | 483 | json-stringify-safe@~5.0.1: 484 | version "5.0.1" 485 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 486 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 487 | 488 | jsonfile@^4.0.0: 489 | version "4.0.0" 490 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 491 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 492 | optionalDependencies: 493 | graceful-fs "^4.1.6" 494 | 495 | jsprim@^1.2.2: 496 | version "1.4.1" 497 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 498 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 499 | dependencies: 500 | assert-plus "1.0.0" 501 | extsprintf "1.3.0" 502 | json-schema "0.2.3" 503 | verror "1.10.0" 504 | 505 | lodash@4.17.15, lodash@^4.17.15: 506 | version "4.17.15" 507 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 508 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 509 | 510 | mime-db@1.43.0: 511 | version "1.43.0" 512 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" 513 | integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== 514 | 515 | mime-types@^2.1.12, mime-types@~2.1.19: 516 | version "2.1.26" 517 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" 518 | integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== 519 | dependencies: 520 | mime-db "1.43.0" 521 | 522 | minimatch@^3.0.4: 523 | version "3.0.4" 524 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 525 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 526 | dependencies: 527 | brace-expansion "^1.1.7" 528 | 529 | minimist@0.0.8: 530 | version "0.0.8" 531 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 532 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 533 | 534 | minimist@^1.2.0: 535 | version "1.2.0" 536 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 537 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 538 | 539 | minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: 540 | version "2.9.0" 541 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" 542 | integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== 543 | dependencies: 544 | safe-buffer "^5.1.2" 545 | yallist "^3.0.0" 546 | 547 | minizlib@^1.2.1: 548 | version "1.3.3" 549 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" 550 | integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== 551 | dependencies: 552 | minipass "^2.9.0" 553 | 554 | mkdirp@^0.5.0, mkdirp@^0.5.1: 555 | version "0.5.1" 556 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 557 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 558 | dependencies: 559 | minimist "0.0.8" 560 | 561 | murmur-hash-js@1.0.0: 562 | version "1.0.0" 563 | resolved "https://registry.yarnpkg.com/murmur-hash-js/-/murmur-hash-js-1.0.0.tgz#5041049269c96633c866386960b2f4289e75e5b0" 564 | integrity sha1-UEEEkmnJZjPIZjhpYLL0KJ515bA= 565 | 566 | mustache@^3.0.1: 567 | version "3.2.1" 568 | resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322" 569 | integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA== 570 | 571 | nice-try@^1.0.4: 572 | version "1.0.5" 573 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 574 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 575 | 576 | node-elm-compiler@5.0.4: 577 | version "5.0.4" 578 | resolved "https://registry.yarnpkg.com/node-elm-compiler/-/node-elm-compiler-5.0.4.tgz#e139c517c4b91f914cccb0a06e3329e3c49d02ac" 579 | integrity sha512-VQsT8QSierYGkHzRed+b4MnccQVF1+qPHunE8jBoU7jD6YpuRqCDPzEoC2zfyEJS80qVnlMZrqobLnyjzX9lJg== 580 | dependencies: 581 | cross-spawn "6.0.5" 582 | find-elm-dependencies "2.0.2" 583 | lodash "4.17.15" 584 | temp "^0.9.0" 585 | 586 | normalize-path@^3.0.0, normalize-path@~3.0.0: 587 | version "3.0.0" 588 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 589 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 590 | 591 | oauth-sign@~0.9.0: 592 | version "0.9.0" 593 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 594 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 595 | 596 | once@^1.3.0: 597 | version "1.4.0" 598 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 599 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 600 | dependencies: 601 | wrappy "1" 602 | 603 | path-is-absolute@^1.0.0: 604 | version "1.0.1" 605 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 606 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 607 | 608 | path-key@^2.0.1: 609 | version "2.0.1" 610 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 611 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 612 | 613 | path-key@^3.1.0: 614 | version "3.1.1" 615 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 616 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 617 | 618 | performance-now@^2.1.0: 619 | version "2.1.0" 620 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 621 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 622 | 623 | picomatch@^2.0.4: 624 | version "2.2.1" 625 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" 626 | integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== 627 | 628 | psl@^1.1.28: 629 | version "1.7.0" 630 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" 631 | integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== 632 | 633 | punycode@^2.1.0, punycode@^2.1.1: 634 | version "2.1.1" 635 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 636 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 637 | 638 | qs@~6.5.2: 639 | version "6.5.2" 640 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 641 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 642 | 643 | readdirp@~3.2.0: 644 | version "3.2.0" 645 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" 646 | integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== 647 | dependencies: 648 | picomatch "^2.0.4" 649 | 650 | request-promise-core@1.1.3: 651 | version "1.1.3" 652 | resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" 653 | integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== 654 | dependencies: 655 | lodash "^4.17.15" 656 | 657 | request-promise@^4.2.4: 658 | version "4.2.5" 659 | resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.5.tgz#186222c59ae512f3497dfe4d75a9c8461bd0053c" 660 | integrity sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg== 661 | dependencies: 662 | bluebird "^3.5.0" 663 | request-promise-core "1.1.3" 664 | stealthy-require "^1.1.1" 665 | tough-cookie "^2.3.3" 666 | 667 | request@^2.88.0: 668 | version "2.88.2" 669 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" 670 | integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== 671 | dependencies: 672 | aws-sign2 "~0.7.0" 673 | aws4 "^1.8.0" 674 | caseless "~0.12.0" 675 | combined-stream "~1.0.6" 676 | extend "~3.0.2" 677 | forever-agent "~0.6.1" 678 | form-data "~2.3.2" 679 | har-validator "~5.1.3" 680 | http-signature "~1.2.0" 681 | is-typedarray "~1.0.0" 682 | isstream "~0.1.2" 683 | json-stringify-safe "~5.0.1" 684 | mime-types "~2.1.19" 685 | oauth-sign "~0.9.0" 686 | performance-now "^2.1.0" 687 | qs "~6.5.2" 688 | safe-buffer "^5.1.2" 689 | tough-cookie "~2.5.0" 690 | tunnel-agent "^0.6.0" 691 | uuid "^3.3.2" 692 | 693 | rimraf@~2.6.2: 694 | version "2.6.3" 695 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 696 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 697 | dependencies: 698 | glob "^7.1.3" 699 | 700 | safe-buffer@^5.0.1, safe-buffer@^5.1.2: 701 | version "5.2.0" 702 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 703 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 704 | 705 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 706 | version "2.1.2" 707 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 708 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 709 | 710 | semver@^5.5.0: 711 | version "5.7.1" 712 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 713 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 714 | 715 | shebang-command@^1.2.0: 716 | version "1.2.0" 717 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 718 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 719 | dependencies: 720 | shebang-regex "^1.0.0" 721 | 722 | shebang-command@^2.0.0: 723 | version "2.0.0" 724 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 725 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 726 | dependencies: 727 | shebang-regex "^3.0.0" 728 | 729 | shebang-regex@^1.0.0: 730 | version "1.0.0" 731 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 732 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 733 | 734 | shebang-regex@^3.0.0: 735 | version "3.0.0" 736 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 737 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 738 | 739 | split@1.0.1: 740 | version "1.0.1" 741 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" 742 | integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== 743 | dependencies: 744 | through "2" 745 | 746 | sshpk@^1.7.0: 747 | version "1.16.1" 748 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 749 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 750 | dependencies: 751 | asn1 "~0.2.3" 752 | assert-plus "^1.0.0" 753 | bcrypt-pbkdf "^1.0.0" 754 | dashdash "^1.12.0" 755 | ecc-jsbn "~0.1.1" 756 | getpass "^0.1.1" 757 | jsbn "~0.1.0" 758 | safer-buffer "^2.0.2" 759 | tweetnacl "~0.14.0" 760 | 761 | stealthy-require@^1.1.1: 762 | version "1.1.1" 763 | resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" 764 | integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= 765 | 766 | supports-color@7.1.0, supports-color@^7.1.0: 767 | version "7.1.0" 768 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 769 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 770 | dependencies: 771 | has-flag "^4.0.0" 772 | 773 | tar@^4.4.10: 774 | version "4.4.13" 775 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" 776 | integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== 777 | dependencies: 778 | chownr "^1.1.1" 779 | fs-minipass "^1.2.5" 780 | minipass "^2.8.6" 781 | minizlib "^1.2.1" 782 | mkdirp "^0.5.0" 783 | safe-buffer "^5.1.2" 784 | yallist "^3.0.3" 785 | 786 | temp@0.9.1, temp@^0.9.0: 787 | version "0.9.1" 788 | resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.1.tgz#2d666114fafa26966cd4065996d7ceedd4dd4697" 789 | integrity sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA== 790 | dependencies: 791 | rimraf "~2.6.2" 792 | 793 | through@2: 794 | version "2.3.8" 795 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 796 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 797 | 798 | to-regex-range@^5.0.1: 799 | version "5.0.1" 800 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 801 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 802 | dependencies: 803 | is-number "^7.0.0" 804 | 805 | tough-cookie@^2.3.3, tough-cookie@~2.5.0: 806 | version "2.5.0" 807 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 808 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 809 | dependencies: 810 | psl "^1.1.28" 811 | punycode "^2.1.1" 812 | 813 | "traverse@>=0.3.0 <0.4": 814 | version "0.3.9" 815 | resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" 816 | integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= 817 | 818 | tunnel-agent@^0.6.0: 819 | version "0.6.0" 820 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 821 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 822 | dependencies: 823 | safe-buffer "^5.0.1" 824 | 825 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 826 | version "0.14.5" 827 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 828 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 829 | 830 | universalify@^0.1.0: 831 | version "0.1.2" 832 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 833 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 834 | 835 | unzip-stream@^0.3.0: 836 | version "0.3.0" 837 | resolved "https://registry.yarnpkg.com/unzip-stream/-/unzip-stream-0.3.0.tgz#c30c054cd6b0d64b13a23cd3ece911eb0b2b52d8" 838 | integrity sha512-NG1h/MdGIX3HzyqMjyj1laBCmlPYhcO4xEy7gEqqzGiSLw7XqDQCnY4nYSn5XSaH8mQ6TFkaujrO8d/PIZN85A== 839 | dependencies: 840 | binary "^0.3.0" 841 | mkdirp "^0.5.1" 842 | 843 | uri-js@^4.2.2: 844 | version "4.2.2" 845 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 846 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 847 | dependencies: 848 | punycode "^2.1.0" 849 | 850 | uuid@^3.3.2: 851 | version "3.4.0" 852 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 853 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 854 | 855 | verror@1.10.0: 856 | version "1.10.0" 857 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 858 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 859 | dependencies: 860 | assert-plus "^1.0.0" 861 | core-util-is "1.0.2" 862 | extsprintf "^1.2.0" 863 | 864 | which@2.0.1: 865 | version "2.0.1" 866 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.1.tgz#f1cf94d07a8e571b6ff006aeb91d0300c47ef0a4" 867 | integrity sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w== 868 | dependencies: 869 | isexe "^2.0.0" 870 | 871 | which@^1.2.9: 872 | version "1.3.1" 873 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 874 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 875 | dependencies: 876 | isexe "^2.0.0" 877 | 878 | which@^2.0.1: 879 | version "2.0.2" 880 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 881 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 882 | dependencies: 883 | isexe "^2.0.0" 884 | 885 | wrappy@1: 886 | version "1.0.2" 887 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 888 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 889 | 890 | xmlbuilder@^13.0.2: 891 | version "13.0.2" 892 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" 893 | integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== 894 | 895 | yallist@^3.0.0, yallist@^3.0.3: 896 | version "3.1.1" 897 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 898 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 899 | --------------------------------------------------------------------------------