├── .bowerrc ├── .gitignore ├── .purs-repl ├── .travis.yml ├── README.md ├── bower.json ├── package.json ├── packages.dhall ├── spago.dhall ├── src ├── QueryDsl.purs └── QueryDsl │ ├── Expressions.purs │ ├── SQLite3.js │ ├── SQLite3.purs │ └── SQLite3 │ └── Expressions.purs ├── test ├── Main.purs └── Test │ ├── QueryDsl.purs │ └── QueryDsl │ ├── Assertions.purs │ ├── Expressions.purs │ ├── SQLite3.purs │ └── SQLite3 │ └── Expressions.purs └── yarn.lock /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "allow_root": true 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bower_components 2 | node_modules 3 | output 4 | .psc-ide-port 5 | dump/* 6 | .psci_modules 7 | .spago 8 | generated-docs 9 | -------------------------------------------------------------------------------- /.purs-repl: -------------------------------------------------------------------------------- 1 | import Prelude 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 10 3 | cache: yarn 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Purescript QueryDsl [![Build Status](https://travis-ci.org/Dretch/purescript-querydsl.svg?branch=master)](https://travis-ci.org/Dretch/purescript-querydsl) [![Documentation](https://pursuit.purescript.org/packages/purescript-querydsl/badge)](https://pursuit.purescript.org/packages/purescript-querydsl) 2 | 3 | A SQL query builder for Purescript, very loosely based on Java's [Querydsl](http://www.querydsl.com/). 4 | 5 | ## Goals 6 | - Support standard SQL insert/update/delete/select queries. 7 | - Allow building queries in a mostly type-safe and composable way. 8 | - Generate reasonably readable SQL for monitoring and debugging. 9 | - Support multiple underlying database platforms. 10 | 11 | ## Non-Goals 12 | - Support create table syntax: these tend to be very database specific. 13 | 14 | ## Status 15 | - Experimental, pre-alpha, full of bugs, lacking in features, unstable, don't rely on this, etc. 16 | - Currently only SQLite is supported. 17 | - Consider using https://github.com/Kamirus/purescript-selda instead - as it is probably more mature and better maintained. 18 | 19 | ## Quick Example 20 | 21 | ```purescript 22 | import Prelude 23 | import Effect.Aff (Aff) 24 | import QueryDsl (Column, Table, makeTable, from, select, where_, orderBy, limit, asc) 25 | import QueryDsl.Expressions ((:==)) 26 | import QueryDsl.SQLite3 (runSelectManyQuery) 27 | import SQLite3 (DBConnection) 28 | import Type.Data.Boolean (False, True) 29 | 30 | customer = makeTable "customer" :: Table ( 31 | id :: Column Int False, 32 | firstName :: Column String True, 33 | lastName :: Column String True 34 | ) 35 | 36 | getLastNames :: DBConnection -> Aff (Array { lastName :: String }) 37 | getLastNames db = do 38 | runSelectManyQuery db do 39 | c <- from customer 40 | pure $ select { lastName: c.lastName } 41 | `where_` (c.firstName :== "Bob") 42 | `orderBy` [asc c.id] 43 | `limit` 10 44 | ``` 45 | 46 | ## Longer Example 47 | 48 | ### Defining Tables 49 | 50 | Querydsl requires that you call the [`makeTable`][QueryDsl.makeTable] function to create a value of type [`Table r`][QueryDsl.Table] for each table in your database. The row parameter `r` holds the types of the columns in the table, and must be given as a type assertion. 51 | 52 | ```purescript 53 | customer = makeTable "customer" :: Table ( 54 | id :: Column Int False, 55 | firstName :: Column String True, 56 | lastName :: Column String True 57 | ) 58 | ``` 59 | 60 | The first parameter to each [`Column`][QueryDsl.Column] is the Purescript version of the database type, and the second parameter says whether this column is required for inserts or not. In this example `id` is not required because we know it is an auto-generated primary key column. Where columns are nullable in the database then it also might make sense for them to have required as [`False`][Data.Type.Boolean.False]. 61 | 62 | ### Select Statements 63 | 64 | You can select rows from a table by creating a value of type [`SelectQuery`][QueryDsl.SelectQuery] and passing it to a database-specific run function ([`runSelectManyQuery`][QueryDsl.SQLite3.runSelectManyQuery] in this case). 65 | 66 | A monad is used to build the from-clause, and the value returned by the monad says what columns to select, and what where-clause/order-by/limit/etc to use. 67 | 68 | ```purescript 69 | runSelectManyQuery db do 70 | c <- from customer 71 | o <- innerJoin order (\o -> o.customer :== c.id) 72 | pure $ select {name: c.firstName, total: o.total} `where_` (o.total :>= 50) 73 | ``` 74 | 75 | ### Insert Statements 76 | 77 | For an insert you create an [`InsertQuery`][QueryDsl.insertQuery] by calling [`insertInto`][QueryDsl.insertInto] with a record containing a value of the correct type for each non-optional column in the table, and possibly also values for the optional columns. 78 | 79 | A database-specific run function is then used to execute the query ([`runQuery`][QueryDsl.SQLite3.runQuery] in this case). 80 | 81 | ```purescript 82 | runQuery db $ insertInto customer { firstName: "Jim", lastName: "Smith" } 83 | ``` 84 | 85 | ### Update Statements 86 | 87 | To update a table you need a give [`update`][QueryDsl.update] a record of expressions of the correct types for each column you want to update and a filtering expression that limits which rows are updated. If you want to update all rows then use [`alwaysTrue`][QueryDsl.alwaysTrue] as the filter. 88 | 89 | The [`columns`][QueryDsl.columns] function gives you access to expressions representing the columns of the table, if you need to refer to them in your update or filter expressions. 90 | 91 | ```purescript 92 | let c = columns customer in 93 | runQuery db $ update customer { lastName: "Smythe" } (c.lastName :== "Smith") 94 | ``` 95 | 96 | ### Delete Statements 97 | 98 | To delete rows from a table you must provide [`deleteFrom`][QueryDsl.deleteFrom] with a filtering expression that selects the rows to delete. 99 | 100 | ```purescript 101 | let c = columns customer in 102 | runQuery db $ deleteFrom customer (c.firstName :== "Paulo" :&& c.lastName :== "Coelho") 103 | ``` 104 | 105 | ## Installation 106 | - With Spago: `spago install querydsl`. 107 | - With Bower: `bower install purescript-querydsl --save`. 108 | - You will also need `yarn add sqlite3` to get the Node SQLite dependency. 109 | 110 | [Data.Type.Boolean.False]: https://pursuit.purescript.org/packages/purescript-typelevel-prelude/docs/Type.Data.Boolean#t:False 111 | [QueryDsl.Column]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl#t:Column 112 | [QueryDsl.InsertQuery]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl#t:InsertQuery 113 | [QueryDsl.SelectQuery]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl#t:SelectQuery 114 | [QueryDsl.Table]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl#t:Table 115 | [QueryDsl.alwaysTrue]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl#v:alwaysTrue 116 | [QueryDsl.columns]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl#v:columns 117 | [QueryDsl.deleteFrom]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl#v:deleteFrom 118 | [QueryDsl.insertInto]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl#v:insertInto 119 | [QueryDsl.makeTable]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl#v:makeTable 120 | [QueryDsl.update]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl#v:update 121 | [QueryDsl.SQLite3.runQuery]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl.SQLite3.#v:runQuery 122 | [QueryDsl.SQLite3.runSelectManyQuery]: https://pursuit.purescript.org/packages/purescript-querydsl/docs/QueryDsl.SQLite3.#v:runSelectManyQuery 123 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "purescript-querydsl", 3 | "license": [ 4 | "WTFPL" 5 | ], 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/Dretch/purescript-querydsl.git" 9 | }, 10 | "ignore": [ 11 | "**/.*", 12 | "node_modules", 13 | "bower_components", 14 | "output" 15 | ], 16 | "dependencies": { 17 | "purescript-arrays": "^v5.3.0", 18 | "purescript-datetime": "^v4.1.1", 19 | "purescript-effect": "^v2.0.1", 20 | "purescript-either": "^v4.1.1", 21 | "purescript-formatters": "^v4.0.1", 22 | "purescript-lists": "^v5.4.1", 23 | "purescript-node-buffer": "^v6.0.0", 24 | "purescript-node-sqlite3": "^v6.0.0", 25 | "purescript-nullable": "^v4.1.1", 26 | "purescript-prelude": "^v4.1.1", 27 | "purescript-psci-support": "^v4.0.0", 28 | "purescript-record": "^v2.0.1", 29 | "purescript-spec": "^v4.0.0", 30 | "purescript-strings": "^v4.0.1", 31 | "purescript-transformers": "^v4.2.0", 32 | "purescript-tuples": "^v5.1.0", 33 | "purescript-typelevel-prelude": "^v5.0.0" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "purescript-querydsl", 3 | "license": "WTFPL", 4 | "dependencies": { 5 | "sqlite3": "^4.0.8" 6 | }, 7 | "devDependencies": { 8 | "bower": "^1.8.8", 9 | "pulp": "^13.0.0", 10 | "purescript": "^0.13.4", 11 | "spago": "^0.9.0" 12 | }, 13 | "scripts": { 14 | "clean": "rm -rf .pulp-cache .spago bower_components node_modules output", 15 | "build": "spago build", 16 | "build:ide": "spago build -- --json-errors", 17 | "test": "spago test" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages.dhall: -------------------------------------------------------------------------------- 1 | {- 2 | Welcome to your new Dhall package-set! 3 | 4 | Below are instructions for how to edit this file for most use 5 | cases, so that you don't need to know Dhall to use it. 6 | 7 | ## Warning: Don't Move This Top-Level Comment! 8 | 9 | Due to how `dhall format` currently works, this comment's 10 | instructions cannot appear near corresponding sections below 11 | because `dhall format` will delete the comment. However, 12 | it will not delete a top-level comment like this one. 13 | 14 | ## Use Cases 15 | 16 | Most will want to do one or both of these options: 17 | 1. Override/Patch a package's dependency 18 | 2. Add a package not already in the default package set 19 | 20 | This file will continue to work whether you use one or both options. 21 | Instructions for each option are explained below. 22 | 23 | ### Overriding/Patching a package 24 | 25 | Purpose: 26 | - Change a package's dependency to a newer/older release than the 27 | default package set's release 28 | - Use your own modified version of some dependency that may 29 | include new API, changed API, removed API by 30 | using your custom git repo of the library rather than 31 | the package set's repo 32 | 33 | Syntax: 34 | Replace the overrides' "{=}" (an empty record) with the following idea 35 | The "//" or "⫽" means "merge these two records and 36 | when they have the same value, use the one on the right:" 37 | ------------------------------- 38 | let override = 39 | { packageName = 40 | upstream.packageName // { updateEntity1 = "new value", updateEntity2 = "new value" } 41 | , packageName = 42 | upstream.packageName // { version = "v4.0.0" } 43 | , packageName = 44 | upstream.packageName // { repo = "https://www.example.com/path/to/new/repo.git" } 45 | } 46 | ------------------------------- 47 | 48 | Example: 49 | ------------------------------- 50 | let overrides = 51 | { halogen = 52 | upstream.halogen // { version = "master" } 53 | , halogen-vdom = 54 | upstream.halogen-vdom // { version = "v4.0.0" } 55 | } 56 | ------------------------------- 57 | 58 | ### Additions 59 | 60 | Purpose: 61 | - Add packages that aren't already included in the default package set 62 | 63 | Syntax: 64 | Replace the additions' "{=}" (an empty record) with the following idea: 65 | ------------------------------- 66 | let additions = 67 | { "package-name" = 68 | mkPackage 69 | [ "dependency1" 70 | , "dependency2" 71 | ] 72 | "https://example.com/path/to/git/repo.git" 73 | "tag ('v4.0.0') or branch ('master')" 74 | , "package-name" = 75 | mkPackage 76 | [ "dependency1" 77 | , "dependency2" 78 | ] 79 | "https://example.com/path/to/git/repo.git" 80 | "tag ('v4.0.0') or branch ('master')" 81 | , etc. 82 | } 83 | ------------------------------- 84 | 85 | Example: 86 | ------------------------------- 87 | let additions = 88 | { benchotron = 89 | mkPackage 90 | [ "arrays" 91 | , "exists" 92 | , "profunctor" 93 | , "strings" 94 | , "quickcheck" 95 | , "lcg" 96 | , "transformers" 97 | , "foldable-traversable" 98 | , "exceptions" 99 | , "node-fs" 100 | , "node-buffer" 101 | , "node-readline" 102 | , "datetime" 103 | , "now" 104 | ] 105 | "https://github.com/hdgarrood/purescript-benchotron.git" 106 | "v7.0.0" 107 | } 108 | ------------------------------- 109 | -} 110 | 111 | let upstream = 112 | https://github.com/purescript/package-sets/releases/download/psc-0.13.3-20191004/packages.dhall sha256:5c8381e8a4623730fd2c5da7220dbfbd6153efa7267fa03977a347ea3ca63ff2 113 | 114 | let overrides = {=} 115 | 116 | let additions = {=} 117 | 118 | in upstream // overrides // additions 119 | -------------------------------------------------------------------------------- /spago.dhall: -------------------------------------------------------------------------------- 1 | { name = 2 | "querydsl" 3 | , dependencies = 4 | [ "prelude" 5 | , "effect" 6 | , "arrays" 7 | , "lists" 8 | , "record" 9 | , "strings" 10 | , "tuples" 11 | , "typelevel-prelude" 12 | , "either" 13 | , "transformers" 14 | , "node-sqlite3" 15 | , "datetime" 16 | , "formatters" 17 | , "node-buffer" 18 | , "nullable" 19 | , "spec" 20 | , "psci-support" 21 | ] 22 | , sources = 23 | [ "src/**/*.purs", "test/**/*.purs" ] 24 | , packages = 25 | ./packages.dhall 26 | , license = 27 | "WTFPL" 28 | , repository = 29 | "https://github.com/Dretch/purescript-querydsl.git" 30 | } 31 | -------------------------------------------------------------------------------- /src/QueryDsl.purs: -------------------------------------------------------------------------------- 1 | -- | A type-safe and composable SQL query builder. 2 | module QueryDsl ( 3 | Constant(..), 4 | class SqlType, 5 | toConstant, 6 | fromConstant, 7 | FromConstantConfig, 8 | defaultFromConstantConfig, 9 | Table, 10 | TableName, 11 | Column, 12 | ColumnName, 13 | SelectQuery, 14 | SelectTableBuilder, 15 | SelectEndpoint, 16 | UpdateQuery, 17 | InsertQuery, 18 | DeleteQuery, 19 | Expression, 20 | UntypedExpression, 21 | class ToExpression, 22 | BinaryOperator, 23 | UnaryOperator, 24 | ParameterizedSql(..), 25 | ErrorMessage, 26 | toExpression, 27 | alwaysTrue, 28 | class TableColumns, 29 | getTableColumns, 30 | class ApplyTableColumns, 31 | getTableColumns', 32 | makeTable, 33 | from, 34 | innerJoin, 35 | leftJoin, 36 | crossJoin, 37 | select, 38 | where_, 39 | limit, 40 | offset, 41 | OrderingExpression, 42 | asc, 43 | desc, 44 | orderBy, 45 | groupBy, 46 | having, 47 | update, 48 | insertInto, 49 | deleteFrom, 50 | class InsertExpressions, 51 | getInsertExpressions, 52 | class ApplyInsertExpressions, 53 | getInsertExpressions', 54 | class SelectExpressions, 55 | getSelectExpressions, 56 | class ApplySelectExpressions, 57 | getSelectExpressions', 58 | class UpdateExpressions, 59 | getUpdateExpressions, 60 | class ApplyUpdateExpressions, 61 | getUpdateExpressions', 62 | prefixOperator, 63 | postfixOperator, 64 | binaryOperator, 65 | unaryAggregateFunction, 66 | nullaryFunction, 67 | columns, 68 | class Query, 69 | toSql, 70 | expressionSql, 71 | class ConstantsToRecord, 72 | constantsToRecord, 73 | class ApplyConstantsToRecord, 74 | constantsToRecord') where 75 | 76 | import Prelude 77 | 78 | import Control.Monad.State (State, runState, get, put) 79 | import Control.Monad.Writer (Writer, runWriter, tell) 80 | import Data.Array as Array 81 | import Data.DateTime (DateTime) 82 | import Data.Either (Either(..)) 83 | import Data.Foldable (class Foldable) 84 | import Data.Int as Int 85 | import Data.List (List(..), (:)) 86 | import Data.List as List 87 | import Data.Map (Map) 88 | import Data.Map as Map 89 | import Data.Maybe (Maybe(..)) 90 | import Data.String (joinWith) 91 | import Data.String.CodeUnits (charAt, singleton) 92 | import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol) 93 | import Data.Traversable (traverse) 94 | import Data.Tuple (Tuple(..), fst, snd, uncurry) 95 | import Node.Buffer.Immutable (ImmutableBuffer) 96 | import Prim.Row (class Cons, class Lacks) 97 | import Record as Record 98 | import Record.Builder (Builder) 99 | import Record.Builder as RB 100 | import Type.Data.Boolean (kind Boolean, False, True) 101 | import Type.Row (RProxy(..)) 102 | import Type.RowList (class RowToList, Cons, Nil, RLProxy(..), kind RowList) 103 | 104 | -- | Values that can be stored in database columns 105 | data Constant = StringConstant String 106 | | IntConstant Int 107 | | NumberConstant Number 108 | | DateTimeConstant DateTime 109 | | BufferConstant ImmutableBuffer 110 | | NullConstant 111 | 112 | derive instance eqConstant :: Eq Constant 113 | 114 | instance showConstant :: Show Constant where 115 | show (StringConstant s) = show s 116 | show (IntConstant i) = show i 117 | show (NumberConstant f) = show f 118 | show (DateTimeConstant dt) = show dt 119 | show (BufferConstant b) = show b 120 | show NullConstant = "null" 121 | 122 | -- | Passed to `fromConstant` to configure how values are converted from constants. 123 | type FromConstantConfig = { unformatDateTime :: String -> Maybe DateTime } 124 | 125 | -- | The default configuration does nothing. 126 | defaultFromConstantConfig :: FromConstantConfig 127 | defaultFromConstantConfig = { unformatDateTime : const Nothing } 128 | 129 | -- | Types that can be converted to/from Constant values 130 | class SqlType t where 131 | toConstant :: t -> Constant 132 | fromConstant :: FromConstantConfig -> Constant -> Maybe t 133 | 134 | instance sqlTypeString :: SqlType String where 135 | toConstant = StringConstant 136 | fromConstant _ (StringConstant s) = Just s 137 | fromConstant _ _ = Nothing 138 | 139 | instance sqlTypeInt :: SqlType Int where 140 | toConstant = IntConstant 141 | fromConstant _ (IntConstant n) = Just n 142 | fromConstant _ _ = Nothing 143 | 144 | instance sqlTypeNumber :: SqlType Number where 145 | toConstant = NumberConstant 146 | fromConstant _ (NumberConstant n) = Just n 147 | fromConstant _ (IntConstant n) = Just $ Int.toNumber n 148 | fromConstant _ _ = Nothing 149 | 150 | instance sqlTypeBoolean :: SqlType Boolean where 151 | toConstant true = IntConstant 1 152 | toConstant false = IntConstant 0 153 | fromConstant _ (IntConstant 0) = Just false 154 | fromConstant _ (IntConstant _) = Just true 155 | fromConstant _ _ = Nothing 156 | 157 | instance sqlTypeDateTime :: SqlType DateTime where 158 | toConstant = DateTimeConstant 159 | fromConstant _ (DateTimeConstant dt) = Just dt 160 | fromConstant { unformatDateTime } (StringConstant s) = unformatDateTime s 161 | fromConstant _ _ = Nothing 162 | 163 | instance sqlTypeMaybe :: SqlType a => SqlType (Maybe a) where 164 | toConstant (Just x) = toConstant x 165 | toConstant Nothing = NullConstant 166 | fromConstant _ NullConstant = Just Nothing 167 | fromConstant config c = Just <$> fromConstant config c 168 | 169 | instance sqlTypeBuffer :: SqlType ImmutableBuffer where 170 | toConstant = BufferConstant 171 | fromConstant _ (BufferConstant b) = Just b 172 | fromConstant _ _ = Nothing 173 | 174 | newtype TableName = TableName String 175 | 176 | derive newtype instance eqTableName :: Eq TableName 177 | 178 | newtype ColumnName = ColumnName String 179 | 180 | derive newtype instance eqColumnName :: Eq ColumnName 181 | 182 | -- | A table definition, with a row-type parameter that captures the types of the columns in the table. 183 | data Table (cols :: #Type) = Table TableName (TableName -> { | cols }) 184 | 185 | data UnTypedColumn = UnTypedColumn TableName ColumnName 186 | 187 | -- | A column within a table, with the column type and optionality represented in the type of the Column 188 | newtype Column typ (required :: Boolean) = Column UnTypedColumn 189 | 190 | -- | A query that selects data, with the type of the columns in the result represented in the type of the SelectQuery 191 | type SelectQuery results = SelectTableBuilder (SelectEndpoint results) 192 | 193 | -- | A Monad for constructing a SQL from/join clause 194 | newtype SelectTableBuilder a = SelectTableBuilder (State (List SelectTable) a) 195 | 196 | derive newtype instance functorSelectTableBuilder :: Functor SelectTableBuilder 197 | derive newtype instance applySelectTableBuilder :: Apply SelectTableBuilder 198 | derive newtype instance applicativeSelectTableBuilder :: Applicative SelectTableBuilder 199 | derive newtype instance bindSelectTableBuilder :: Bind SelectTableBuilder 200 | 201 | type SelectTable = { 202 | table :: TableName, 203 | alias :: TableName, 204 | join :: Join 205 | } 206 | 207 | data Join = Initial 208 | | InnerJoin (Expression Boolean) 209 | | LeftOuterJoin (Expression Boolean) 210 | | CrossJoin 211 | 212 | -- | The select columns and the where-clause/order-by/limit/etc part of a select query 213 | data SelectEndpoint (results :: #Type) = SelectEndpoint { 214 | columns :: List (Tuple ColumnName UntypedExpression), 215 | where_ :: Expression Boolean, 216 | orderBy :: Array OrderingExpression, 217 | groupBy :: Array UntypedExpression, 218 | having :: Expression Boolean, 219 | limit :: Maybe Int, 220 | offset :: Maybe Int 221 | } 222 | 223 | -- | An expression that determines how the results are ordered. 224 | data OrderingExpression = Asc UntypedExpression 225 | | Desc UntypedExpression 226 | 227 | data UpdateQuery = UpdateQuery TableName (List (Tuple ColumnName UntypedExpression)) (Expression Boolean) 228 | 229 | -- | A query that deletes data from a table 230 | data DeleteQuery = DeleteQuery TableName (Expression Boolean) 231 | 232 | data InsertQuery = InsertQuery TableName (List (Tuple ColumnName Constant)) 233 | 234 | data UntypedExpression = PrefixOperatorExpr String UntypedExpression 235 | | PostfixOperatorExpr String UntypedExpression 236 | | BinaryOperatorExpr String UntypedExpression UntypedExpression 237 | | UnaryAggregateFunctionExpr String Boolean UntypedExpression 238 | | NullaryFunctionExpr String 239 | | ConstantExpr Constant 240 | | ColumnExpr UnTypedColumn 241 | | AlwaysTrueExpr 242 | 243 | newtype Expression result = Expression UntypedExpression 244 | 245 | class ToExpression a result | a -> result where 246 | toExpression :: a -> Expression result 247 | 248 | instance toExpressionColumn :: ToExpression (Column typ required) typ where 249 | toExpression (Column c) = Expression (ColumnExpr c) 250 | 251 | else instance toExpressionExpression :: ToExpression (Expression result) result where 252 | toExpression e = e 253 | 254 | else instance toExpressionConstant :: SqlType a => ToExpression a a where 255 | toExpression s = Expression (ConstantExpr $ toConstant s) 256 | 257 | type UnaryOperator a input result = 258 | ToExpression a input => 259 | a -> Expression result 260 | 261 | type BinaryOperator a b input result = 262 | ToExpression a input => 263 | ToExpression b input => 264 | a -> b -> Expression result 265 | 266 | data ParameterizedSql = ParameterizedSql String (Array Constant) 267 | 268 | type ErrorMessage = String 269 | 270 | derive instance eqParameterizedSql :: Eq ParameterizedSql 271 | 272 | instance showParameterizedSql :: Show ParameterizedSql where 273 | show (ParameterizedSql sql parameters) = show sql <> " with " <> show parameters 274 | 275 | -- | An expression that always evaluates to `true`. This is useful when a filtering 276 | -- | expression argument is required but you don't want to actually filter the result. 277 | alwaysTrue :: Expression Boolean 278 | alwaysTrue = Expression AlwaysTrueExpr 279 | 280 | -- | An instance of this type class is automatically derived by the compiler for 281 | -- | rows where each field in the row matches `name: Column typ required`, representing 282 | -- | a database table column called `name`, having a database type compatible with 283 | -- | the Purescript type `typ`, and being required or optional on insert according to `required` 284 | class TableColumns (cols :: #Type) where 285 | getTableColumns :: RProxy cols -> TableName -> { | cols } 286 | 287 | instance tableColumnsImpl 288 | :: ( RowToList colsR colsRL 289 | , ApplyTableColumns colsRL colsR ) => TableColumns colsR 290 | where 291 | getTableColumns rProxy tName = 292 | let builder = getTableColumns' (RLProxy :: RLProxy colsRL) rProxy tName 293 | in RB.build builder {} 294 | 295 | class ApplyTableColumns (colsRL :: RowList) (colsR :: #Type) | colsRL -> colsR where 296 | getTableColumns' :: RLProxy colsRL -> RProxy colsR -> TableName -> Builder {} { | colsR } 297 | 298 | instance applyTableColumnsNil :: ApplyTableColumns Nil () where 299 | getTableColumns' _ _ _ = identity 300 | 301 | instance applyTableColumnsCons 302 | :: ( ApplyTableColumns colsRLTail colsRTail 303 | , SqlType typ 304 | , IsSymbol name 305 | , Cons name (Column typ required) colsRTail colsR 306 | , Lacks name colsRTail ) => 307 | ApplyTableColumns (Cons name (Column typ required) colsRLTail) colsR 308 | where 309 | getTableColumns' _ _ tName = 310 | RB.insert nameProxy col <<< tail 311 | where 312 | nameProxy = SProxy :: SProxy name 313 | cName = ColumnName $ reflectSymbol nameProxy 314 | col = Column $ UnTypedColumn tName cName 315 | tail = getTableColumns' 316 | (RLProxy :: RLProxy colsRLTail) 317 | (RProxy :: RProxy colsRTail) 318 | tName 319 | 320 | -- | Makes a table with a given name, taking the column information from the declared type. 321 | makeTable :: forall cols. TableColumns cols => String -> Table cols 322 | makeTable name = 323 | Table (TableName name) (getTableColumns (RProxy :: RProxy cols)) 324 | 325 | -- | Gets the columns associated with a table. 326 | columns :: forall cols. Table cols -> { | cols } 327 | columns (Table name rec) = rec name 328 | 329 | -- | Create an OrderingExpression that says to order by the given expression in ascending order 330 | asc :: forall a b. ToExpression a b => a -> OrderingExpression 331 | asc e = Asc $ untypeExpression $ toExpression e 332 | 333 | -- | Create an OrderingExpression that says to order by the given expression in descending order 334 | desc :: forall a b. ToExpression a b => a -> OrderingExpression 335 | desc e = Desc $ untypeExpression $ toExpression e 336 | 337 | -- | Starts a SelectTableBuilder by specifying the initial table. 338 | from :: forall cols. Table cols -> SelectTableBuilder { | cols } 339 | from table = addTable table (const Initial) 340 | 341 | -- | Extends a SelectTableBuilder by specifying an (inner) join table. 342 | innerJoin :: forall cols. Table cols -> ({ | cols } -> Expression Boolean) -> SelectTableBuilder { | cols } 343 | innerJoin table expr = addTable table (expr >>> InnerJoin) 344 | 345 | -- | Extends a SelectTableBuilder by specifying a (left outer) join table. 346 | leftJoin :: forall cols. Table cols -> ({ | cols } -> Expression Boolean) -> SelectTableBuilder { | cols } 347 | leftJoin table expr = addTable table (expr >>> LeftOuterJoin) 348 | 349 | -- | Extends a SelectTableBuilder by specifying a (cross) join table. 350 | crossJoin :: forall cols. Table cols -> SelectTableBuilder { | cols } 351 | crossJoin table = addTable table (const CrossJoin) 352 | 353 | addTable :: forall cols. Table cols -> ({ | cols } -> Join) -> SelectTableBuilder { | cols } 354 | addTable (Table table cols) getJoin = SelectTableBuilder do 355 | tables <- get 356 | let alias = makeAlias (List.length tables) 357 | cols' = cols alias 358 | put $ { table, alias, join: getJoin cols' } : tables 359 | pure cols' 360 | 361 | class SelectExpressions (exprs :: #Type) (result :: #Type) | exprs -> result where 362 | getSelectExpressions :: { | exprs } -> List (Tuple ColumnName UntypedExpression) 363 | 364 | instance selectExpressionsImpl 365 | :: ( RowToList exprsR exprsRL 366 | , RowToList resultsR resultsRL 367 | , ApplySelectExpressions exprsRL exprsR resultsRL ) => SelectExpressions exprsR resultsR 368 | where 369 | getSelectExpressions exprs = getSelectExpressions' 370 | (RLProxy :: RLProxy exprsRL) exprs (RLProxy :: RLProxy resultsRL) 371 | 372 | class ApplySelectExpressions (exprsRL :: RowList) (exprsR :: #Type) (resultsRL :: RowList) where 373 | getSelectExpressions' :: RLProxy exprsRL -> { | exprsR } -> RLProxy resultsRL -> List (Tuple ColumnName UntypedExpression) 374 | 375 | instance applySelectExpressionsNil 376 | :: ApplySelectExpressions Nil exprsR Nil 377 | where 378 | getSelectExpressions' _ _ _ = Nil 379 | 380 | instance applySelectExpressionsCons 381 | :: ( ApplySelectExpressions exprsRLTail exprsRTail resultsRLTail 382 | , IsSymbol name 383 | , ToExpression toExpr typ 384 | , Cons name toExpr exprsRTail exprsR 385 | , Lacks name exprsRTail ) => 386 | ApplySelectExpressions (Cons name toExpr exprsRLTail) exprsR (Cons name typ resultsRLTail) 387 | where 388 | getSelectExpressions' _ exprs _ = 389 | Tuple cName uExpr : tail 390 | where 391 | nameProxy = SProxy :: SProxy name 392 | cName = ColumnName $ reflectSymbol nameProxy 393 | uExpr = untypeExpression $ toExpression $ Record.get nameProxy exprs 394 | tailExprs = Record.delete nameProxy exprs 395 | tail = getSelectExpressions' 396 | (RLProxy :: RLProxy exprsRLTail) 397 | (tailExprs :: { | exprsRTail }) 398 | (RLProxy :: RLProxy resultsRLTail) 399 | 400 | -- | Creates a new SelectEndpoint with the given selected columns 401 | select :: forall exprs results. SelectExpressions exprs results => { | exprs } -> SelectEndpoint results 402 | select exprs = SelectEndpoint { 403 | columns: getSelectExpressions exprs, 404 | where_: alwaysTrue, 405 | orderBy: [], 406 | groupBy: [], 407 | having: alwaysTrue, 408 | limit: Nothing, 409 | offset: Nothing 410 | } 411 | 412 | -- | Sets the where clause to use on the SelectEndpoint 413 | where_ :: forall results. SelectEndpoint results -> Expression Boolean -> SelectEndpoint results 414 | where_ (SelectEndpoint se) filter = 415 | SelectEndpoint $ se { where_ = filter } 416 | 417 | -- | Sets the ordering to use on the SelectEndpoint 418 | orderBy :: forall results. SelectEndpoint results -> Array OrderingExpression -> SelectEndpoint results 419 | orderBy (SelectEndpoint se) orderBy' = 420 | SelectEndpoint $ se { orderBy = orderBy' } 421 | 422 | -- | Adds a column to the group by clause - note this function is cumulative: 423 | -- | call it multiple times to group by more than one expression. 424 | groupBy :: forall results a b. ToExpression a b => SelectEndpoint results -> a -> SelectEndpoint results 425 | groupBy (SelectEndpoint se) e = 426 | SelectEndpoint $ se { groupBy = se.groupBy <> [untypeExpression $ toExpression e] } 427 | 428 | -- | Sets the having expression to use on the SelectEndpoint. 429 | having :: forall results. SelectEndpoint results -> Expression Boolean -> SelectEndpoint results 430 | having (SelectEndpoint se) filter = 431 | SelectEndpoint $ se { having = filter } 432 | 433 | -- | Sets the limit (maximum number of rows in the result) to use on the SelectEndpoint. 434 | limit :: forall results. SelectEndpoint results -> Int -> SelectEndpoint results 435 | limit (SelectEndpoint se) n = 436 | SelectEndpoint $ se { limit = Just n } 437 | 438 | -- | Sets the offset (how many rows to skip from the result) to use on the SelectEndpoint. 439 | offset :: forall results. SelectEndpoint results -> Int -> SelectEndpoint results 440 | offset (SelectEndpoint se) n = 441 | SelectEndpoint $ se { offset = Just n } 442 | 443 | -- | Instances of this type class are automatically derived by the compiler for 444 | -- | pairs of row types where each field in `exprs` matches a column in `cols` 445 | class InsertExpressions (cols :: #Type) (exprs :: #Type) | cols -> exprs, exprs -> cols where 446 | getInsertExpressions :: { | exprs } -> List (Tuple ColumnName Constant) 447 | 448 | instance insertExpressionsImpl 449 | :: ( RowToList colsR colsRL 450 | , RowToList exprsR exprsRL 451 | , ApplyInsertExpressions colsRL exprsRL exprsR ) => InsertExpressions colsR exprsR 452 | where 453 | getInsertExpressions rec = getInsertExpressions' 454 | (RLProxy :: RLProxy colsRL) 455 | (RLProxy :: RLProxy exprsRL) 456 | (RProxy :: RProxy exprsR) 457 | rec 458 | 459 | class ApplyInsertExpressions (colsRL :: RowList) (exprsRL :: RowList) (exprsR :: #Type) 460 | where 461 | getInsertExpressions' :: RLProxy colsRL -> RLProxy exprsRL -> RProxy exprsR -> { | exprsR } -> List (Tuple ColumnName Constant) 462 | 463 | instance applyInsertExpressionsNil 464 | :: ApplyInsertExpressions Nil Nil exprsR 465 | where 466 | getInsertExpressions' _ _ _ _ = Nil 467 | 468 | else instance applyInsertExpressionsOptionalValueGiven 469 | :: ( ApplyInsertExpressions colsRLTail exprsRLTail exprsRTail 470 | , IsSymbol name 471 | , SqlType typ 472 | , Cons name typ exprsRTail exprsR 473 | , Lacks name exprsRTail ) => 474 | ApplyInsertExpressions (Cons name (Column typ False) colsRLTail) (Cons name typ exprsRLTail) exprsR 475 | where 476 | getInsertExpressions' _ _ _ rec = 477 | Tuple cName cValue : tail 478 | where 479 | nameProxy = SProxy :: SProxy name 480 | cName = ColumnName $ reflectSymbol nameProxy 481 | cValue = toConstant $ Record.get nameProxy rec 482 | tailRec = Record.delete nameProxy rec 483 | tail = getInsertExpressions' 484 | (RLProxy :: RLProxy colsRLTail) 485 | (RLProxy :: RLProxy exprsRLTail) 486 | (RProxy :: RProxy exprsRTail) 487 | tailRec 488 | 489 | else instance applyInsertExpressionsOptionalValueNotGiven 490 | :: ApplyInsertExpressions colsRLTail exprsRL exprsR => 491 | ApplyInsertExpressions (Cons name (Column typ False) colsRLTail) exprsRL exprsR 492 | where 493 | getInsertExpressions' _ exprsRLProxy exprsRProxy exprsR = 494 | getInsertExpressions' (RLProxy :: RLProxy colsRLTail) exprsRLProxy exprsRProxy exprsR 495 | 496 | else instance applyInsertExpressionsRequiredValue 497 | :: ( ApplyInsertExpressions colsRLTail exprsRLTail exprsRTail 498 | , IsSymbol name 499 | , SqlType typ 500 | , Cons name typ exprsRTail exprsR 501 | , Lacks name exprsRTail ) => 502 | ApplyInsertExpressions (Cons name (Column typ True) colsRLTail) (Cons name typ exprsRLTail) exprsR 503 | where 504 | getInsertExpressions' _ _ _ rec = 505 | Tuple cName cValue : tail 506 | where 507 | nameProxy = SProxy :: SProxy name 508 | cName = ColumnName $ reflectSymbol nameProxy 509 | cValue = toConstant $ Record.get nameProxy rec 510 | tailRec = Record.delete nameProxy rec 511 | tail = getInsertExpressions' 512 | (RLProxy :: RLProxy colsRLTail) 513 | (RLProxy :: RLProxy exprsRLTail) 514 | (RProxy :: RProxy exprsRTail) 515 | tailRec 516 | 517 | insertInto :: forall cols exprs. InsertExpressions cols exprs => Table cols -> { | exprs } -> InsertQuery 518 | insertInto (Table tName _) exprs = 519 | InsertQuery tName $ List.reverse $ getInsertExpressions exprs 520 | 521 | -- | An instance of this type class is automatically derived by the compiler when 522 | -- | each item in `exprs` matches a column of the same name and type in `cols`. 523 | class UpdateExpressions (cols :: #Type) (exprs :: #Type) where 524 | getUpdateExpressions :: { | cols } -> { | exprs } -> List (Tuple ColumnName UntypedExpression) 525 | 526 | instance updateExpressionsImpl 527 | :: ( RowToList colsR colsRL 528 | , RowToList exprsR exprsRL 529 | , ApplyUpdateExpressions colsRL exprsRL exprsR ) => UpdateExpressions colsR exprsR 530 | where 531 | getUpdateExpressions cols exprs = getUpdateExpressions' 532 | (RLProxy :: RLProxy colsRL) (RLProxy :: RLProxy exprsRL) exprs 533 | 534 | class ApplyUpdateExpressions (colsRL :: RowList) (exprsRL :: RowList) (exprsR :: #Type) where 535 | getUpdateExpressions' :: RLProxy colsRL -> RLProxy exprsRL -> { | exprsR } -> List (Tuple ColumnName UntypedExpression) 536 | 537 | instance applyUpdateExpressionsNil 538 | :: ApplyUpdateExpressions colsRL Nil exprsR 539 | where 540 | getUpdateExpressions' _ _ _ = Nil 541 | 542 | else instance applyUpdateExpressionsCons 543 | :: ( ApplyUpdateExpressions colsRLTail exprsRLTail exprsRTail 544 | , IsSymbol name 545 | , ToExpression toExpr typ 546 | , Cons name toExpr exprsRTail exprsR 547 | , Lacks name exprsRTail ) => 548 | ApplyUpdateExpressions (Cons name (Column typ required) colsRLTail) (Cons name toExpr exprsRLTail) exprsR 549 | where 550 | getUpdateExpressions' _ _ exprs = 551 | Tuple cName uExpr : tail 552 | where 553 | nameProxy = SProxy :: SProxy name 554 | cName = ColumnName $ reflectSymbol nameProxy 555 | uExpr = untypeExpression $ toExpression $ Record.get nameProxy exprs 556 | tailExprs = Record.delete nameProxy exprs 557 | tail = getUpdateExpressions' 558 | (RLProxy :: RLProxy colsRLTail) 559 | (RLProxy :: RLProxy exprsRLTail) 560 | (tailExprs :: { | exprsRTail }) 561 | 562 | update :: forall cols exprs. UpdateExpressions cols exprs => Table cols -> { | exprs } -> Expression Boolean -> UpdateQuery 563 | update (Table tName cols) exprs filter = 564 | UpdateQuery tName (getUpdateExpressions (cols tName) exprs) filter 565 | 566 | deleteFrom :: forall cols. Table cols -> Expression Boolean -> DeleteQuery 567 | deleteFrom (Table tName _) filter' = DeleteQuery tName filter' 568 | 569 | untypeExpression :: forall a. Expression a -> UntypedExpression 570 | untypeExpression (Expression ut) = ut 571 | 572 | prefixOperator :: forall a input result. String -> UnaryOperator a input result 573 | prefixOperator op a = Expression $ PrefixOperatorExpr op (untypeExpression $ toExpression a) 574 | 575 | postfixOperator :: forall a input result. String -> UnaryOperator a input result 576 | postfixOperator op a = Expression $ PostfixOperatorExpr op (untypeExpression $ toExpression a) 577 | 578 | binaryOperator :: forall a b input result. String -> BinaryOperator a b input result 579 | binaryOperator op a b = Expression $ BinaryOperatorExpr op (untypeExpression $ toExpression a) (untypeExpression $ toExpression b) 580 | 581 | unaryAggregateFunction :: forall a input result. String -> Boolean -> UnaryOperator a input result 582 | unaryAggregateFunction op distinct a = Expression $ UnaryAggregateFunctionExpr op distinct (untypeExpression $ toExpression a) 583 | 584 | nullaryFunction :: forall result. String -> Expression result 585 | nullaryFunction op = Expression $ NullaryFunctionExpr op 586 | 587 | class Query t where 588 | -- | Gets some SQL to be run against an actual database. 589 | toSql :: t -> Either ErrorMessage ParameterizedSql 590 | 591 | type SqlWriter = Writer (Array Constant) String 592 | 593 | instance querySelectQuery :: Query (SelectTableBuilder (SelectEndpoint results)) where 594 | toSql (SelectTableBuilder builder) = do 595 | writer <- uncurry toWriter $ runState builder Nil 596 | Right $ uncurry ParameterizedSql $ runWriter writer 597 | where 598 | toWriter :: SelectEndpoint results -> List SelectTable -> Either ErrorMessage SqlWriter 599 | toWriter endpoint tables = 600 | toWriter' endpoint <$> checkTables (List.reverse tables) 601 | 602 | checkTables :: List SelectTable -> Either ErrorMessage (List SelectTable) 603 | checkTables ts = case ts of 604 | Nil -> Right ts 605 | { join: Initial } : _ -> Right ts 606 | { join: _ } : _ -> Left "A join condition cannot be supplied for the first table in the from clause" 607 | 608 | toWriter' :: SelectEndpoint results -> List SelectTable -> SqlWriter 609 | toWriter' (SelectEndpoint endpoint) tables = do 610 | sc <- selectClause 611 | fc <- fromClause 612 | wc <- whereClauseSql endpoint.where_ 613 | gb <- groupByClause 614 | hv <- havingClause 615 | ob <- orderByClause 616 | lc <- limitClause 617 | pure $ "select " <> sc <> fc <> wc <> gb <> hv <> ob <> lc 618 | where 619 | selectClause = joinCsv <$> traverse selectCol endpoint.columns 620 | 621 | selectCol (Tuple cName (ColumnExpr (UnTypedColumn tName' cName'))) = 622 | let start = tableColumnNameSql tName' cName' 623 | in pure $ if cName == cName' 624 | then start 625 | else start <> " as " <> columnNameSql cName 626 | selectCol (Tuple cName expr) = do 627 | sql <- untypedExpressionSql expr 628 | pure $ sql <> " as " <> columnNameSql cName 629 | 630 | fromClause = case tables of 631 | Nil -> 632 | pure "" 633 | rootTable : joinedTables -> do 634 | jc <- joinSpace <$> traverse joinClause joinedTables 635 | pure $ " from " <> aliasSql rootTable.table rootTable.alias <> jc 636 | 637 | joinClause {table, alias, join: Initial} = 638 | pure $ " cross join " <> aliasSql table alias 639 | joinClause {table, alias, join: CrossJoin} = 640 | pure $ " cross join " <> aliasSql table alias 641 | joinClause {table, alias, join: InnerJoin expr'} = do 642 | e <- expressionSql' expr' 643 | pure $ " join " <> aliasSql table alias <> " on " <> e 644 | joinClause {table, alias, join: LeftOuterJoin expr'} = do 645 | e <- expressionSql' expr' 646 | pure $ " left join " <> aliasSql table alias <> " on " <> e 647 | 648 | groupByClause = case endpoint.groupBy of 649 | [] -> pure "" 650 | exprs -> (" group by " <> _) <$> joinCsv <$> traverse untypedExpressionSql exprs 651 | 652 | havingClause = case endpoint.having of 653 | Expression AlwaysTrueExpr -> pure "" 654 | expr -> (" having " <> _) <$> expressionSql' expr 655 | 656 | orderByClause = case endpoint.orderBy of 657 | [] -> pure "" 658 | exprs -> (" order by " <> _) <$> joinCsv <$> traverse orderByExpr exprs 659 | 660 | orderByExpr (Asc e) = (_ <> " asc") <$> untypedExpressionSql e 661 | orderByExpr (Desc e) = (_ <> " desc") <$> untypedExpressionSql e 662 | 663 | limitClause = case endpoint.limit, endpoint.offset of 664 | Just l, Just o -> do 665 | tell [IntConstant l, IntConstant o] 666 | pure " limit ? offset ?" 667 | Just l, Nothing -> do 668 | tell [IntConstant l] 669 | pure " limit ?" 670 | Nothing, Just o -> do 671 | tell [IntConstant o] 672 | pure " limit -1 offset ?" 673 | Nothing, Nothing -> 674 | pure "" 675 | 676 | aliasSql name alias = 677 | tableNameSql name <> " as " <> tableNameSql alias 678 | 679 | makeAlias :: Int -> TableName 680 | makeAlias i = 681 | case charAt i "abcdefghijklmnopqrstuvwxyz" of 682 | Just c -> TableName $ singleton c 683 | Nothing -> TableName $ "_" <> show i 684 | 685 | instance queryDeleteQuery :: Query DeleteQuery where 686 | toSql (DeleteQuery tName filter) = 687 | let Tuple sql parameters = runWriter $ whereClauseSql filter in 688 | Right $ ParameterizedSql ("delete from " <> tableNameSql tName <> sql) parameters 689 | 690 | instance queryInsertQuery :: Query InsertQuery where 691 | toSql (InsertQuery tName columnValues) = 692 | Right $ uncurry ParameterizedSql $ runWriter writeSql 693 | where 694 | writeSql = do 695 | vs <- joinCsv <$> traverse (snd >>> constantSql) columnValues 696 | pure $ "insert into " <> tableNameSql tName <> " (" <> colsSql <> ") values (" <> vs <> ")" 697 | 698 | colsSql = joinCsv $ (fst >>> columnNameSql) <$> columnValues 699 | 700 | instance queryUpdateQuery :: Query UpdateQuery where 701 | toSql (UpdateQuery tName columnValues filter) = 702 | Right $ uncurry ParameterizedSql $ runWriter writeSql 703 | where 704 | writeSql = do 705 | c <- colsSql 706 | wc <- whereClauseSql filter 707 | pure $ "update " <> tableNameSql tName <> " set " <> c <> wc 708 | 709 | colsSql = joinCsv <$> traverse colSql columnValues 710 | 711 | colSql (Tuple cName expr) = do 712 | e <- untypedExpressionSql expr 713 | pure $ columnNameSql cName <> " = " <> e 714 | 715 | tableNameSql :: TableName -> String 716 | tableNameSql (TableName name) = name -- TODO: quote if neccessary 717 | 718 | columnNameSql :: ColumnName -> String 719 | columnNameSql (ColumnName name) = name -- TODO: quote if neccessary 720 | 721 | tableColumnNameSql :: TableName -> ColumnName -> String 722 | tableColumnNameSql tName cName = 723 | tableNameSql tName <> "." <> columnNameSql cName 724 | 725 | expressionSql :: forall result. Expression result -> Either ErrorMessage ParameterizedSql 726 | expressionSql e = 727 | Right $ uncurry ParameterizedSql $ runWriter (expressionSql' e) 728 | 729 | expressionSql' :: forall result. Expression result -> SqlWriter 730 | expressionSql' (Expression e) = untypedExpressionSql e 731 | 732 | untypedExpressionSql :: UntypedExpression -> SqlWriter 733 | untypedExpressionSql (PrefixOperatorExpr op a) = do 734 | sql <- untypedExpressionSql a 735 | pure $ "(" <> op <> " " <> sql <> ")" 736 | untypedExpressionSql (PostfixOperatorExpr op a) = do 737 | sql <- untypedExpressionSql a 738 | pure $ "(" <> sql <> " " <> op <> ")" 739 | untypedExpressionSql (BinaryOperatorExpr op a b) = do 740 | sqlA <- untypedExpressionSql a 741 | sqlB <- untypedExpressionSql b 742 | pure $ "(" <> sqlA <> " " <> op <> " " <> sqlB <> ")" 743 | untypedExpressionSql (UnaryAggregateFunctionExpr op distinct a) = do 744 | sqlA <- untypedExpressionSql a 745 | let prefix = if distinct then "distinct " else "" 746 | pure $ op <> "(" <> prefix <> sqlA <> ")" 747 | untypedExpressionSql (NullaryFunctionExpr op) = 748 | pure op 749 | untypedExpressionSql (ConstantExpr c) = 750 | constantSql c 751 | untypedExpressionSql (ColumnExpr (UnTypedColumn tName cName)) = 752 | pure $ tableColumnNameSql tName cName 753 | untypedExpressionSql AlwaysTrueExpr = 754 | pure "(1 = 1)" 755 | 756 | constantSql :: Constant -> SqlWriter 757 | constantSql c = tell [c] $> "?" 758 | 759 | whereClauseSql :: Expression Boolean -> SqlWriter 760 | whereClauseSql (Expression AlwaysTrueExpr) = pure "" 761 | whereClauseSql expr = (" where " <> _) <$> expressionSql' expr 762 | 763 | class ConstantsToRecord (r :: #Type) where 764 | -- | Create a Record value of the required type from a dynamically typed 765 | -- | Map of fields (e.g. returned from running a database query), if possible, 766 | -- | otherwise provide an error message. 767 | constantsToRecord :: RProxy r -> FromConstantConfig -> Map String Constant -> Either ErrorMessage { | r } 768 | 769 | instance constantsToRecordImpl 770 | :: ( RowToList r rl 771 | , ApplyConstantsToRecord r rl ) => ConstantsToRecord r where 772 | constantsToRecord r config constants = do 773 | builder <- constantsToRecord' (RLProxy :: RLProxy rl) config constants 774 | pure $ RB.build builder {} 775 | 776 | class ApplyConstantsToRecord (r :: #Type) (rl :: RowList) | rl -> r where 777 | constantsToRecord' :: RLProxy rl -> FromConstantConfig -> Map String Constant -> Either ErrorMessage (Builder {} { | r }) 778 | 779 | instance applyConstantsToRecordNil :: ApplyConstantsToRecord () Nil where 780 | constantsToRecord' _ _ cols = 781 | case Map.findMin cols of 782 | Nothing -> Right identity 783 | Just {key, value} -> Left $ "Value supplied for unknown field: " <> key <> " = " <> show value 784 | 785 | instance applyConstantsToRecordCons 786 | :: ( ApplyConstantsToRecord rTail rlTail 787 | , IsSymbol name 788 | , SqlType typ 789 | , Cons name typ rTail r 790 | , Lacks name rTail ) => ApplyConstantsToRecord r (Cons name typ rlTail) 791 | where 792 | constantsToRecord' _ config cols = 793 | case Map.pop name cols of 794 | Nothing -> 795 | Left $ "No value found for required field: " <> name 796 | Just (Tuple c tailMap) -> 797 | case fromConstant config c of 798 | Nothing -> 799 | Left $ "Value has incorrect type for field " <> name <> ", unable to convert: " <> show c 800 | Just v -> do 801 | tail <- constantsToRecord' tailRLProxy config tailMap 802 | Right $ RB.insert nameProxy v <<< tail 803 | where 804 | nameProxy = SProxy :: SProxy name 805 | name = reflectSymbol nameProxy 806 | tailRLProxy = RLProxy :: RLProxy rlTail 807 | 808 | joinSpace :: forall f. Foldable f => f String -> String 809 | joinSpace = Array.fromFoldable >>> joinWith " " 810 | 811 | joinCsv :: forall f. Foldable f => f String -> String 812 | joinCsv = Array.fromFoldable >>> joinWith ", " 813 | -------------------------------------------------------------------------------- /src/QueryDsl/Expressions.purs: -------------------------------------------------------------------------------- 1 | -- | Some operators for building where clauses and other expressions. 2 | -- | 3 | -- | The operator precedence used here is designed to match the normal purescript operators. 4 | module QueryDsl.Expressions ( 5 | eq, 6 | (:==), 7 | ne, 8 | (:/=), 9 | and, 10 | (:&&), 11 | or, 12 | (:||), 13 | not, 14 | plus, 15 | (:+), 16 | minus, 17 | (:-), 18 | multiply, 19 | (:*), 20 | divide, 21 | (:/), 22 | negate, 23 | lt, 24 | (:<), 25 | le, 26 | (:<=), 27 | gt, 28 | (:>), 29 | ge, 30 | (:>=), 31 | is, 32 | isNot, 33 | isNull, 34 | isNotNull, 35 | avg, 36 | avgDistinct, 37 | count, 38 | countDistinct, 39 | countAll, 40 | min, 41 | max, 42 | sum, 43 | sumDistinct) where 44 | 45 | import QueryDsl (Expression, BinaryOperator, UnaryOperator, binaryOperator, postfixOperator, prefixOperator, unaryAggregateFunction, nullaryFunction) 46 | 47 | eq :: forall a b c. BinaryOperator a b c Boolean 48 | eq = binaryOperator "=" 49 | 50 | infixl 4 eq as :== 51 | 52 | ne :: forall a b c. BinaryOperator a b c Boolean 53 | ne = binaryOperator "<>" 54 | 55 | infixl 4 ne as :/= 56 | 57 | and :: forall a b. BinaryOperator a b Boolean Boolean 58 | and = binaryOperator "and" 59 | 60 | infixl 3 and as :&& 61 | 62 | or :: forall a b. BinaryOperator a b Boolean Boolean 63 | or = binaryOperator "or" 64 | 65 | infixl 2 or as :|| 66 | 67 | not :: forall a. UnaryOperator a Boolean Boolean 68 | not = prefixOperator "not" 69 | 70 | plus :: forall a b c. BinaryOperator a b c c 71 | plus = binaryOperator "+" 72 | 73 | infixl 6 plus as :+ 74 | 75 | minus :: forall a b c. BinaryOperator a b c c 76 | minus = binaryOperator "-" 77 | 78 | infixl 6 minus as :- 79 | 80 | multiply :: forall a b c. BinaryOperator a b c c 81 | multiply = binaryOperator "*" 82 | 83 | infixl 7 multiply as :* 84 | 85 | divide :: forall a b c. BinaryOperator a b c c 86 | divide = binaryOperator "/" 87 | 88 | infixl 7 divide as :/ 89 | 90 | negate :: forall a b. UnaryOperator a b b 91 | negate = prefixOperator "-" 92 | 93 | lt :: forall a b c. BinaryOperator a b c Boolean 94 | lt = binaryOperator "<" 95 | 96 | infixl 4 lt as :< 97 | 98 | le :: forall a b c. BinaryOperator a b c Boolean 99 | le = binaryOperator "<=" 100 | 101 | infixl 4 le as :<= 102 | 103 | gt :: forall a b c. BinaryOperator a b c Boolean 104 | gt = binaryOperator ">" 105 | 106 | infixl 4 gt as :> 107 | 108 | ge :: forall a b c. BinaryOperator a b c Boolean 109 | ge = binaryOperator ">=" 110 | 111 | infixl 4 ge as :>= 112 | 113 | is :: forall a b c. BinaryOperator a b c Boolean 114 | is = binaryOperator "is" 115 | 116 | isNot :: forall a b c. BinaryOperator a b c Boolean 117 | isNot = binaryOperator "is not" 118 | 119 | isNull :: forall a b. UnaryOperator a b Boolean 120 | isNull = postfixOperator "is null" 121 | 122 | isNotNull :: forall a b. UnaryOperator a b Boolean 123 | isNotNull = postfixOperator "is not null" 124 | 125 | avg :: forall a b. UnaryOperator a b Number 126 | avg = unaryAggregateFunction "avg" false 127 | 128 | avgDistinct :: forall a b. UnaryOperator a b Number 129 | avgDistinct = unaryAggregateFunction "avg" true 130 | 131 | count :: forall a b. UnaryOperator a b Int 132 | count = unaryAggregateFunction "count" false 133 | 134 | countDistinct :: forall a b. UnaryOperator a b Int 135 | countDistinct = unaryAggregateFunction "count" true 136 | 137 | countAll :: Expression Int 138 | countAll = nullaryFunction "count(*)" 139 | 140 | min :: forall a b. UnaryOperator a b b 141 | min = unaryAggregateFunction "min" false 142 | 143 | max :: forall a b. UnaryOperator a b b 144 | max = unaryAggregateFunction "max" false 145 | 146 | sum :: forall a b. UnaryOperator a b b 147 | sum = unaryAggregateFunction "sum" false 148 | 149 | sumDistinct :: forall a b. UnaryOperator a b b 150 | sumDistinct = unaryAggregateFunction "sum" true 151 | -------------------------------------------------------------------------------- /src/QueryDsl/SQLite3.js: -------------------------------------------------------------------------------- 1 | 2 | exports.decodeQueryResponse = (addString, addInt, addNumber, addBuffer, addNull, empty, results) => { 3 | return results.map(result => { 4 | 5 | let decoded = empty; 6 | Object.keys(result).forEach(key => { 7 | 8 | const value = result[key]; 9 | 10 | if (typeof value === 'string') { 11 | decoded = addString(key, value, decoded); 12 | } 13 | else if (typeof value === 'number') { 14 | const add = Number.isInteger(value) ? addInt : addNumber; 15 | decoded = add(key, value, decoded); 16 | } 17 | else if (value instanceof Buffer) { 18 | decoded = addBuffer(key, value, decoded); 19 | } 20 | else if (!value) { 21 | decoded = addNull(key, decoded); 22 | } 23 | else { 24 | throw new Error(`Unable to decode value (typeof value === '${typeof value}'): ${value}`); 25 | } 26 | }); 27 | return decoded; 28 | }); 29 | }; 30 | -------------------------------------------------------------------------------- /src/QueryDsl/SQLite3.purs: -------------------------------------------------------------------------------- 1 | -- | Allows running Querydsl queries against SQLite3 databases. 2 | -- | 3 | -- | DateTime values are represented in the database as text columns in ISO8601 format (YYYY-MM-DDTHH:mm:ss.SSSZ) 4 | module QueryDsl.SQLite3 ( 5 | dateTimeFormatter, 6 | runQuery, 7 | runSelectManyQuery, 8 | runSelectOneQuery, 9 | runSelectMaybeQuery 10 | ) where 11 | 12 | import Prelude 13 | 14 | import Data.Array as Array 15 | import Data.Either (Either(..), hush) 16 | import Data.Formatter.DateTime (Formatter, format, parseFormatString, unformat) 17 | import Data.Function.Uncurried as U 18 | import Data.Map (Map) 19 | import Data.Map as Map 20 | import Data.Maybe (Maybe(..), fromJust) 21 | import Data.Nullable as Nullable 22 | import Data.Traversable (traverse) 23 | import Effect.Aff (Aff, error, throwError) 24 | import Foreign (Foreign, unsafeToForeign) 25 | import Node.Buffer.Immutable (ImmutableBuffer) 26 | import Partial.Unsafe (unsafePartial) 27 | import QueryDsl (class ConstantsToRecord, class Query, Constant(..), ParameterizedSql(..), SelectQuery, constantsToRecord, toSql) 28 | import SQLite3 (DBConnection) 29 | import SQLite3 as SQLite3 30 | import Type.Row (RProxy(..)) 31 | 32 | dateTimeFormatter :: Formatter 33 | dateTimeFormatter = 34 | unsafePartial $ fromJust $ hush $ parseFormatString "YYYY-MM-DDTHH:mm:ss.SSSZ" 35 | 36 | constantToForeign :: Constant -> Aff Foreign 37 | constantToForeign (StringConstant s) = 38 | pure $ unsafeToForeign s 39 | constantToForeign (IntConstant i) = 40 | pure $ unsafeToForeign i 41 | constantToForeign (NumberConstant n) = 42 | pure $ unsafeToForeign n 43 | constantToForeign (DateTimeConstant dt) = 44 | pure $ unsafeToForeign $ format dateTimeFormatter dt 45 | constantToForeign (BufferConstant b) = 46 | pure $ unsafeToForeign b 47 | constantToForeign NullConstant = 48 | pure $ unsafeToForeign $ Nullable.toNullable Nothing 49 | 50 | foreign import decodeQueryResponse 51 | :: forall result. U.Fn7 52 | (U.Fn3 String String result result) 53 | (U.Fn3 String Int result result) 54 | (U.Fn3 String Number result result) 55 | (U.Fn3 String ImmutableBuffer result result) 56 | (U.Fn2 String result result) 57 | result 58 | Foreign 59 | (Array result) 60 | 61 | decodeQueryResponseHelper :: Foreign -> Array (Map String Constant) 62 | decodeQueryResponseHelper = 63 | U.runFn7 decodeQueryResponse 64 | (U.mkFn3 \k v -> Map.insert k (StringConstant v)) 65 | (U.mkFn3 \k v -> Map.insert k (IntConstant v)) 66 | (U.mkFn3 \k v -> Map.insert k (NumberConstant v)) 67 | (U.mkFn3 \k v -> Map.insert k (BufferConstant v)) 68 | (U.mkFn2 \k -> Map.insert k NullConstant) 69 | Map.empty 70 | 71 | runQueryInternal :: forall q. Query q => DBConnection -> q -> Aff Foreign 72 | runQueryInternal conn q = 73 | case toSql q of 74 | Left msg -> 75 | throwError $ error msg 76 | Right (ParameterizedSql sql constants) -> do 77 | foreigns <- traverse constantToForeign constants 78 | SQLite3.queryDB conn sql foreigns 79 | 80 | -- | Run a query and ignore any results. 81 | runQuery :: forall q. Query q => DBConnection -> q -> Aff Unit 82 | runQuery conn q = void $ runQueryInternal conn q 83 | 84 | -- | Run a `SelectQuery` and return all the results. 85 | runSelectManyQuery :: forall cols. ConstantsToRecord cols => DBConnection -> SelectQuery cols -> Aff (Array { | cols }) 86 | runSelectManyQuery conn q = do 87 | res <- runQueryInternal conn q 88 | let resMaps = decodeQueryResponseHelper res 89 | config = { unformatDateTime: unformat dateTimeFormatter >>> hush } 90 | toRecord = constantsToRecord (RProxy :: RProxy cols) config 91 | case traverse toRecord resMaps of 92 | Left msg -> throwError $ error msg 93 | Right recs -> pure recs 94 | 95 | -- | Run a `SelectQuery` and either return the single result, or throw an error 96 | -- | if there is more than one result or none at all. 97 | runSelectOneQuery :: forall cols. ConstantsToRecord cols => DBConnection -> SelectQuery cols -> Aff { | cols } 98 | runSelectOneQuery conn q = do 99 | many <- runSelectManyQuery conn q 100 | case many of 101 | [result] -> pure result 102 | rs -> throwError $ error $ "Expected one result, but got " <> show (Array.length rs) 103 | 104 | -- | Run a `SelectQuery` and either return `Nothing`, if there are no results, 105 | -- | `Just result` if there is a single result, or otherwise throw an error. 106 | runSelectMaybeQuery :: forall cols. ConstantsToRecord cols => DBConnection -> SelectQuery cols -> Aff (Maybe { | cols }) 107 | runSelectMaybeQuery conn q = do 108 | many <- runSelectManyQuery conn q 109 | case many of 110 | [] -> pure Nothing 111 | [result] -> pure $ Just result 112 | rs -> throwError $ error $ "Expected one or zero results, but got " <> show (Array.length rs) 113 | -------------------------------------------------------------------------------- /src/QueryDsl/SQLite3/Expressions.purs: -------------------------------------------------------------------------------- 1 | -- | SQLite-specific functions and operators. 2 | module QueryDsl.SQLite3.Expressions 3 | ( random 4 | , rank 5 | , match ) where 6 | 7 | import QueryDsl (BinaryOperator, Expression, binaryOperator, nullaryFunction) 8 | 9 | random :: Expression Int 10 | random = nullaryFunction "random()" 11 | 12 | rank :: Expression Number 13 | rank = nullaryFunction "rank" 14 | 15 | match :: forall a b. BinaryOperator a b String Boolean 16 | match = binaryOperator "match" 17 | -------------------------------------------------------------------------------- /test/Main.purs: -------------------------------------------------------------------------------- 1 | module Test.Main where 2 | 3 | import Prelude 4 | 5 | import Effect (Effect) 6 | import Effect.Aff (launchAff_) 7 | import Test.QueryDsl as QueryDsl 8 | import Test.Spec.Reporter.Console (consoleReporter) 9 | import Test.Spec.Runner (runSpec) 10 | 11 | main :: Effect Unit 12 | main = launchAff_ $ runSpec [consoleReporter] do 13 | QueryDsl.test 14 | -------------------------------------------------------------------------------- /test/Test/QueryDsl.purs: -------------------------------------------------------------------------------- 1 | module Test.QueryDsl (test) where 2 | 3 | import QueryDsl 4 | 5 | import Data.DateTime (DateTime) 6 | import Data.DateTime.Instant (instant, toDateTime) 7 | import Data.Either (Either(..)) 8 | import Data.Map as Map 9 | import Data.Maybe (Maybe(..), fromJust) 10 | import Data.Time.Duration (Milliseconds(..)) 11 | import Node.Buffer.Immutable as ImmutableBuffer 12 | import Node.Buffer.Immutable (ImmutableBuffer) 13 | import Partial.Unsafe (unsafePartial) 14 | import Prelude (Unit, bind, discard, pure, ($), negate, (==)) 15 | import QueryDsl.Expressions (countAll, (:*), (:+), (:==), (:>=)) 16 | import Test.QueryDsl.Assertions (shouldBeSql) 17 | import Test.QueryDsl.Expressions as Expressions 18 | import Test.QueryDsl.SQLite3 as SQLite3 19 | import Test.Spec (Spec, describe, it) 20 | import Test.Spec.Assertions (shouldEqual) 21 | import Type.Data.Boolean (False, True) 22 | import Type.Row (RProxy(..)) 23 | 24 | c :: forall t. SqlType t => t -> Constant 25 | c = toConstant 26 | 27 | testTable = makeTable "test" :: Table ( 28 | id :: Column String False, 29 | count :: Column Int True, 30 | description :: Column (Maybe String) False 31 | ) 32 | 33 | testChildTable = makeTable "child" :: Table ( 34 | id :: Column String True, 35 | extra :: Column String True 36 | ) 37 | 38 | simpleSelectQuery :: SelectQuery (id :: String, count :: Int) 39 | simpleSelectQuery = do 40 | t <- from testTable 41 | pure $ select {id: t.id, count: t.count} 42 | 43 | filteredSelectQuery :: SelectQuery (id :: String) 44 | filteredSelectQuery = do 45 | t <- from testTable 46 | pure $ select {id: t.id} `where_` (t.id :== "abc") 47 | 48 | selectQueryWithLimit :: SelectQuery (id :: String) 49 | selectQueryWithLimit = do 50 | t <- from testTable 51 | pure $ select {id: t.id} `limit` 10 52 | 53 | selectQueryWithOffset :: SelectQuery (id :: String) 54 | selectQueryWithOffset = do 55 | t <- from testTable 56 | pure $ select {id: t.id} `offset` 50 57 | 58 | selectQueryWithLimitAndOffset :: SelectQuery (id :: String) 59 | selectQueryWithLimitAndOffset = do 60 | t <- from testTable 61 | pure $ select {id: t.id} `limit` 10 `offset` 50 62 | 63 | expressiveSelectQuery :: SelectQuery (id :: String, count :: Int) 64 | expressiveSelectQuery = do 65 | t <- from testTable 66 | pure $ select {id: t.id, count: t.count :+ 1} 67 | 68 | simpleJoinSelectQuery :: SelectQuery (jId :: String, tId :: String, extra :: String) 69 | simpleJoinSelectQuery = do 70 | t <- from testTable 71 | j <- innerJoin testChildTable (\j -> j.id :== t.id) 72 | pure $ select {tId: t.id, jId: j.id, extra: j.extra} 73 | 74 | leftJoinSelectQuery :: SelectQuery (jId :: String, tId :: String, extra :: String) 75 | leftJoinSelectQuery = do 76 | t <- from testTable 77 | j <- leftJoin testChildTable (\j -> j.id :== t.id) 78 | pure $ select {tId: t.id, jId: j.id, extra: j.extra} 79 | 80 | crossJoinSelectQuery :: SelectQuery (jId :: String, tId :: String, extra :: String) 81 | crossJoinSelectQuery = do 82 | t <- from testTable 83 | j <- crossJoin testChildTable 84 | pure $ select {tId: t.id, jId: j.id, extra: j.extra} 85 | 86 | selectQueryWithOrderBy :: SelectQuery (id :: String) 87 | selectQueryWithOrderBy = do 88 | t <- from testTable 89 | pure $ select {id: t.id} `orderBy` [asc t.description, desc t.id] 90 | 91 | selectQueryWithGroupBy :: SelectQuery (id :: String, n :: Int) 92 | selectQueryWithGroupBy = do 93 | t <- from testTable 94 | pure $ select {id: t.id, n: countAll} `groupBy` t.description 95 | 96 | selectQueryWithTwoGroupBys :: SelectQuery (id :: String, n :: Int) 97 | selectQueryWithTwoGroupBys = do 98 | t <- from testTable 99 | pure $ select {id: t.id, n: countAll} `groupBy` t.description `groupBy` t.id 100 | 101 | selectQueryWithGroupByHaving :: SelectQuery (id :: String, n :: Int) 102 | selectQueryWithGroupByHaving = do 103 | t <- from testTable 104 | pure $ select {id: t.id, n: countAll} `groupBy` t.description `having` (countAll :>= 5) 105 | 106 | selectQueryWithNoFrom :: SelectQuery (int :: Int, string :: String) 107 | selectQueryWithNoFrom = 108 | pure $ select {int: 123, string: "abc"} 109 | 110 | selectQueryWithFirstTableAsJoin :: SelectQuery (id :: String) 111 | selectQueryWithFirstTableAsJoin = do 112 | t <- innerJoin testTable (\t -> t.id :== "abc") 113 | pure $ select {id: t.id} 114 | 115 | selfJoinSelectQuery :: SelectQuery (aId :: String, bId ::String) 116 | selfJoinSelectQuery = do 117 | a <- from testTable 118 | b <- innerJoin testTable (\b -> b.id :== a.id) 119 | pure $ select {aId: a.id, bId: b.id} 120 | 121 | filteredUpdateQuery :: UpdateQuery 122 | filteredUpdateQuery = 123 | let t = columns testTable in 124 | update testTable {count: t.count :* 2} (t.id :== "abc") 125 | 126 | filteredDeleteQuery :: DeleteQuery 127 | filteredDeleteQuery = 128 | let t = columns testTable in 129 | deleteFrom testTable (t.id :== "abc") 130 | 131 | insertQuery :: InsertQuery 132 | insertQuery = 133 | insertInto testTable {id: "abc", count: 123, description: Nothing :: Maybe String} 134 | 135 | insertQueryWithRequiredFieldsOnly :: InsertQuery 136 | insertQueryWithRequiredFieldsOnly = 137 | insertInto testTable {count: 123} 138 | 139 | sqlType :: Spec Unit 140 | sqlType = do 141 | describe "SqlType" do 142 | 143 | let testDateString = "1832-01-27T14:00:20.012Z" 144 | testDate = toDateTime $ unsafePartial $ fromJust $ instant $ Milliseconds $ -4352608779988.0 145 | dfcc = defaultFromConstantConfig 146 | 147 | describe "String" do 148 | it "toConstant" do 149 | toConstant "abc" `shouldEqual` StringConstant "abc" 150 | it "fromConstant" do 151 | fromConstant dfcc (StringConstant "abc") `shouldEqual` Just "abc" 152 | fromConstant dfcc (IntConstant 123) `shouldEqual` (Nothing :: Maybe String) 153 | fromConstant dfcc (NumberConstant 123.0) `shouldEqual` (Nothing :: Maybe String) 154 | fromConstant dfcc (DateTimeConstant testDate) `shouldEqual` (Nothing :: Maybe String) 155 | fromConstant dfcc NullConstant `shouldEqual` (Nothing :: Maybe String) 156 | 157 | describe "Int" do 158 | it "toConstant" do 159 | toConstant 123 `shouldEqual` IntConstant 123 160 | it "fromConstant" do 161 | fromConstant dfcc (IntConstant 123) `shouldEqual` Just 123 162 | fromConstant dfcc (StringConstant "abc") `shouldEqual` (Nothing :: Maybe Int) 163 | fromConstant dfcc (NumberConstant 123.0) `shouldEqual` (Nothing :: Maybe Int) 164 | fromConstant dfcc (DateTimeConstant testDate) `shouldEqual` (Nothing :: Maybe Int) 165 | fromConstant dfcc NullConstant `shouldEqual` (Nothing :: Maybe Int) 166 | 167 | describe "Number" do 168 | it "toConstant" do 169 | toConstant 123.456 `shouldEqual` NumberConstant 123.456 170 | it "fromConstant" do 171 | fromConstant dfcc (NumberConstant 123.0) `shouldEqual` Just 123.0 172 | fromConstant dfcc (IntConstant 123) `shouldEqual` Just 123.0 173 | fromConstant dfcc (StringConstant "abc") `shouldEqual` (Nothing :: Maybe Number) 174 | fromConstant dfcc (DateTimeConstant testDate) `shouldEqual` (Nothing :: Maybe Number) 175 | fromConstant dfcc NullConstant `shouldEqual` (Nothing :: Maybe Number) 176 | 177 | describe "Boolean" do 178 | it "toConstant" do 179 | toConstant false `shouldEqual` IntConstant 0 180 | toConstant true `shouldEqual` IntConstant 1 181 | it "fromConstant" do 182 | fromConstant dfcc (NumberConstant 123.0) `shouldEqual` (Nothing :: Maybe Boolean) 183 | fromConstant dfcc (StringConstant "abc") `shouldEqual` (Nothing :: Maybe Boolean) 184 | fromConstant dfcc (IntConstant 0) `shouldEqual` Just false 185 | fromConstant dfcc (IntConstant 1) `shouldEqual` Just true 186 | fromConstant dfcc (IntConstant 42) `shouldEqual` Just true 187 | fromConstant dfcc (DateTimeConstant testDate) `shouldEqual` (Nothing :: Maybe Boolean) 188 | fromConstant dfcc NullConstant `shouldEqual` (Nothing :: Maybe Boolean) 189 | 190 | describe "Maybe" do 191 | it "toConstant" do 192 | toConstant (Nothing :: Maybe Int) `shouldEqual` NullConstant 193 | toConstant (Just 1) `shouldEqual` IntConstant 1 194 | it "fromConstant" do 195 | fromConstant dfcc NullConstant `shouldEqual` Just (Nothing :: Maybe Int) 196 | fromConstant dfcc (IntConstant 123) `shouldEqual` Just (Just 123) 197 | fromConstant dfcc (StringConstant "abc") `shouldEqual` (Nothing :: Maybe Int) 198 | 199 | describe "DateTime" do 200 | it "toConstant" do 201 | toConstant testDate `shouldEqual` DateTimeConstant testDate 202 | it "fromConstant - default config" do 203 | fromConstant dfcc (DateTimeConstant testDate) `shouldEqual` Just testDate 204 | fromConstant dfcc (StringConstant testDateString) `shouldEqual` (Nothing :: Maybe DateTime) 205 | fromConstant dfcc (NumberConstant 123.0) `shouldEqual` (Nothing :: Maybe DateTime) 206 | fromConstant dfcc (IntConstant 123) `shouldEqual` (Nothing :: Maybe DateTime) 207 | fromConstant dfcc NullConstant `shouldEqual` (Nothing :: Maybe DateTime) 208 | 209 | it "fromConstant - with custom unformatDateTime config" do 210 | let config = { unformatDateTime: \s -> if s == "a" then Just testDate else Nothing } 211 | fromConstant config (StringConstant "a") `shouldEqual` Just testDate 212 | fromConstant config (StringConstant "b") `shouldEqual` (Nothing :: Maybe DateTime) 213 | 214 | describe "ImmutableBuffer" do 215 | let buffer = ImmutableBuffer.fromArray [1, 2, 3] 216 | it "toConstant" do 217 | toConstant buffer `shouldEqual` BufferConstant buffer 218 | it "fromConstant" do 219 | fromConstant dfcc (BufferConstant buffer) `shouldEqual` Just buffer 220 | fromConstant dfcc (StringConstant "abc") `shouldEqual` (Nothing :: Maybe ImmutableBuffer) 221 | 222 | sqlGeneration :: Spec Unit 223 | sqlGeneration = do 224 | describe "toSql" do 225 | 226 | it "simpleSelectQuery" do 227 | toSql simpleSelectQuery `shouldBeSql` ParameterizedSql 228 | "select a.count, a.id from test as a" [] 229 | 230 | it "filteredSelectQuery" do 231 | toSql filteredSelectQuery `shouldBeSql` ParameterizedSql 232 | "select a.id from test as a where (a.id = ?)" [ c "abc" ] 233 | 234 | it "expressiveSelectQuery" do 235 | toSql expressiveSelectQuery `shouldBeSql` ParameterizedSql 236 | "select (a.count + ?) as count, a.id from test as a" [ c 1 ] 237 | 238 | it "simpleJoinSelectQuery" do 239 | toSql simpleJoinSelectQuery `shouldBeSql` ParameterizedSql 240 | "select b.extra, b.id as jId, a.id as tId from test as a join child as b on (b.id = a.id)" 241 | [] 242 | 243 | it "leftJoinSelectQuery" do 244 | toSql leftJoinSelectQuery `shouldBeSql` ParameterizedSql 245 | "select b.extra, b.id as jId, a.id as tId from test as a left join child as b on (b.id = a.id)" 246 | [] 247 | 248 | it "crossJoinSelectQuery" do 249 | toSql crossJoinSelectQuery `shouldBeSql` ParameterizedSql 250 | "select b.extra, b.id as jId, a.id as tId from test as a cross join child as b" 251 | [] 252 | 253 | it "selfJoinSelectQuery" do 254 | toSql selfJoinSelectQuery `shouldBeSql` ParameterizedSql 255 | "select a.id as aId, b.id as bId from test as a join test as b on (b.id = a.id)" [] 256 | 257 | it "selectQueryWithOrderBy" do 258 | toSql selectQueryWithOrderBy `shouldBeSql` ParameterizedSql 259 | "select a.id from test as a order by a.description asc, a.id desc" [] 260 | 261 | it "selectQueryWithGroupBy" do 262 | toSql selectQueryWithGroupBy `shouldBeSql` ParameterizedSql 263 | "select a.id, count(*) as n from test as a group by a.description" [] 264 | 265 | it "selectQueryWithTwoGroupBys" do 266 | toSql selectQueryWithTwoGroupBys `shouldBeSql` ParameterizedSql 267 | "select a.id, count(*) as n from test as a group by a.description, a.id" [] 268 | 269 | it "selectQueryWithGroupByHaving" do 270 | toSql selectQueryWithGroupByHaving `shouldBeSql` ParameterizedSql 271 | "select a.id, count(*) as n from test as a group by a.description having (count(*) >= ?)" [c 5] 272 | 273 | it "selectQueryWithLimit" do 274 | toSql selectQueryWithLimit `shouldBeSql` ParameterizedSql 275 | "select a.id from test as a limit ?" [c 10] 276 | 277 | it "selectQueryWithOffset" do 278 | toSql selectQueryWithOffset `shouldBeSql` ParameterizedSql 279 | "select a.id from test as a limit -1 offset ?" [c 50] 280 | 281 | it "selectQueryWithLimitAndOffset" do 282 | toSql selectQueryWithLimitAndOffset `shouldBeSql` ParameterizedSql 283 | "select a.id from test as a limit ? offset ?" [c 10, c 50] 284 | 285 | it "selectQueryWithNoFrom" do 286 | toSql selectQueryWithNoFrom `shouldBeSql` ParameterizedSql 287 | "select ? as int, ? as string" [c 123, c "abc"] 288 | 289 | it "selectQueryWithFirstTableAsJoin" do 290 | toSql selectQueryWithFirstTableAsJoin `shouldEqual` 291 | Left "A join condition cannot be supplied for the first table in the from clause" 292 | 293 | it "filteredDeleteQuery" do 294 | toSql filteredDeleteQuery `shouldBeSql` ParameterizedSql 295 | "delete from test where (test.id = ?)" [ c "abc" ] 296 | 297 | it "insertQuery" do 298 | toSql insertQuery `shouldBeSql` ParameterizedSql 299 | "insert into test (id, description, count) values (?, ?, ?)" 300 | [ c "abc", NullConstant, c 123 ] 301 | 302 | it "insertQueryWithRequiredFieldsOnly" do 303 | toSql insertQueryWithRequiredFieldsOnly `shouldBeSql` ParameterizedSql 304 | "insert into test (count) values (?)" 305 | [ c 123 ] 306 | 307 | it "filteredUpdateQuery" do 308 | toSql filteredUpdateQuery `shouldBeSql` ParameterizedSql 309 | "update test set count = (test.count * ?) where (test.id = ?)" 310 | [ c 2, c "abc" ] 311 | 312 | resultGeneration :: Spec Unit 313 | resultGeneration = do 314 | describe "constantsToRecord" do 315 | 316 | let idProxy = RProxy :: RProxy (id :: Int) 317 | idNameProxy = RProxy :: RProxy (id :: Int, name :: String) 318 | dfcc = defaultFromConstantConfig 319 | 320 | it "fields match" do 321 | constantsToRecord idNameProxy dfcc (Map.insert "id" (c 123) $ Map.singleton "name" (c "abc")) 322 | `shouldEqual` Right {id: 123, name: "abc"} 323 | 324 | it "extra field value supplied" do 325 | constantsToRecord idProxy dfcc (Map.insert "id" (c 123) $ Map.singleton "extra" (c 456)) 326 | `shouldEqual` Left "Value supplied for unknown field: extra = 456" 327 | 328 | it "expected field value missing" do 329 | constantsToRecord idNameProxy dfcc (Map.singleton "id" (c 123)) 330 | `shouldEqual` Left "No value found for required field: name" 331 | 332 | it "field value with incorrect type" do 333 | constantsToRecord idProxy dfcc (Map.singleton "id" (c "123")) 334 | `shouldEqual` Left "Value has incorrect type for field id, unable to convert: \"123\"" 335 | 336 | test :: Spec Unit 337 | test = do 338 | describe "QueryDsl" do 339 | sqlGeneration 340 | resultGeneration 341 | sqlType 342 | Expressions.test 343 | SQLite3.test 344 | -------------------------------------------------------------------------------- /test/Test/QueryDsl/Assertions.purs: -------------------------------------------------------------------------------- 1 | module Test.QueryDsl.Assertions (shouldBeSql) where 2 | 3 | import Prelude (Unit) 4 | import Data.Either (Either(..)) 5 | import Effect.Aff (Aff) 6 | import QueryDsl (ParameterizedSql) 7 | import Test.Spec.Assertions (shouldEqual) 8 | 9 | shouldBeSql :: Either String ParameterizedSql -> ParameterizedSql -> Aff Unit 10 | shouldBeSql actual expected = actual `shouldEqual` Right expected 11 | -------------------------------------------------------------------------------- /test/Test/QueryDsl/Expressions.purs: -------------------------------------------------------------------------------- 1 | module Test.QueryDsl.Expressions (test) where 2 | 3 | import Data.Maybe (Maybe(..)) 4 | import Prelude (Unit, discard) 5 | import QueryDsl (class SqlType, Constant(..), ParameterizedSql(..), expressionSql, toConstant) 6 | import QueryDsl.Expressions (avg, avgDistinct, count, countAll, countDistinct, is, isNot, isNotNull, isNull, max, min, negate, not, sum, sumDistinct, (:&&), (:*), (:+), (:-), (:/), (:/=), (:<), (:<=), (:==), (:>), (:>=), (:||)) 7 | import Test.QueryDsl.Assertions (shouldBeSql) 8 | import Test.Spec (Spec, describe, it) 9 | 10 | c :: forall t. SqlType t => t -> Constant 11 | c = toConstant 12 | 13 | test :: Spec Unit 14 | test = do 15 | describe "Expressions" do 16 | 17 | it "equality" do 18 | expressionSql (1 :== 1 :&& 2 :/= 3) `shouldBeSql` ParameterizedSql 19 | "((? = ?) and (? <> ?))" [ c 1, c 1, c 2, c 3 ] 20 | 21 | it "null-safe equality" do 22 | let sql = expressionSql (Just 1 `is` Nothing :&& Nothing `isNot` Just 1) 23 | sql `shouldBeSql` ParameterizedSql 24 | "((? is ?) and (? is not ?))" [ c 1, NullConstant, NullConstant, c 1] 25 | 26 | it "nullability" do 27 | let sql = expressionSql (isNull 4 :|| isNotNull false) 28 | sql `shouldBeSql` ParameterizedSql 29 | "((? is null) or (? is not null))" [ c 4, c 0 ] 30 | 31 | it "booleans" do 32 | expressionSql (true :|| false :&& true) `shouldBeSql` ParameterizedSql 33 | "(? or (? and ?))" [ c 1, c 0, c 1 ] 34 | expressionSql (not true) `shouldBeSql` ParameterizedSql 35 | "(not ?)" [ c 1 ] 36 | 37 | it "basic arithmetic" do 38 | let sql = expressionSql (1.0 :+ 3.0 :* 4.0 :- 3.0 :/ 2.0) 39 | sql `shouldBeSql` ParameterizedSql 40 | "((? + (? * ?)) - (? / ?))" 41 | [ c 1.0, c 3.0, c 4.0, c 3.0, c 2.0 ] 42 | 43 | it "negation" do 44 | expressionSql (negate 12) `shouldBeSql` ParameterizedSql 45 | "(- ?)" [ c 12 ] 46 | 47 | it "orderings" do 48 | let sql = expressionSql (1 :< 2 :&& 2 :<= 3 :&& 4 :> 2 :&& 4 :>= 4) 49 | sql `shouldBeSql` ParameterizedSql 50 | "((((? < ?) and (? <= ?)) and (? > ?)) and (? >= ?))" 51 | [ c 1, c 2, c 2, c 3, c 4, c 2, c 4, c 4 ] 52 | 53 | describe "Aggregate functions" do 54 | 55 | it "avg" do 56 | let sql = expressionSql (avg 1 :+ avgDistinct 2 :+ 3.0) 57 | sql `shouldBeSql` ParameterizedSql 58 | "((avg(?) + avg(distinct ?)) + ?)" [c 1, c 2, c 3.0] 59 | 60 | it "count" do 61 | let sql = expressionSql (count 1 :+ countDistinct 2 :+ countAll) 62 | sql `shouldBeSql` ParameterizedSql 63 | "((count(?) + count(distinct ?)) + count(*))" [c 1, c 2] 64 | 65 | it "min-max" do 66 | let sql = expressionSql (min "a" :< max "b") 67 | sql `shouldBeSql` ParameterizedSql 68 | "(min(?) < max(?))" [c "a", c "b"] 69 | 70 | it "sum" do 71 | let sql = expressionSql (sum 1 :* sumDistinct 2) 72 | sql `shouldBeSql` ParameterizedSql 73 | "(sum(?) * sum(distinct ?))" [c 1, c 2] 74 | -------------------------------------------------------------------------------- /test/Test/QueryDsl/SQLite3.purs: -------------------------------------------------------------------------------- 1 | module Test.QueryDsl.SQLite3 (test) where 2 | 3 | import Prelude 4 | 5 | import Data.DateTime (DateTime) 6 | import Data.DateTime.Instant (instant, toDateTime) 7 | import Data.Maybe (Maybe(..), fromJust) 8 | import Data.Time.Duration (Milliseconds(..)) 9 | import Effect.Aff (bracket) 10 | import Node.Buffer.Immutable (ImmutableBuffer) 11 | import Node.Buffer.Immutable as ImmutableBuffer 12 | import Partial.Unsafe (unsafePartial) 13 | import QueryDsl (Column, SelectQuery, Table, columns, deleteFrom, from, insertInto, makeTable, select, update, where_) 14 | import QueryDsl.Expressions ((:+), (:==), sum) 15 | import QueryDsl.SQLite3 (runQuery, runSelectOneQuery, runSelectMaybeQuery) 16 | import SQLite3 as SQLite3 17 | import Test.QueryDsl.SQLite3.Expressions as Expressions 18 | import Test.Spec (Spec, describe, it) 19 | import Test.Spec.Assertions (shouldEqual) 20 | import Type.Data.Boolean (False, True) 21 | 22 | createTableSql :: String 23 | createTableSql = """ 24 | create table test ( 25 | id integer not null primary key autoincrement, 26 | name text not null, 27 | count int not null 28 | ) 29 | """ 30 | 31 | testTable = makeTable "test" :: Table ( 32 | id :: Column Int False, 33 | name :: Column String True, 34 | count :: Column Int True 35 | ) 36 | 37 | selectCount :: SelectQuery (n :: Int) 38 | selectCount = do 39 | t <- from testTable 40 | pure $ select {n: sum t.count} 41 | 42 | selectNamedCount :: String -> SelectQuery (n :: Int) 43 | selectNamedCount name = do 44 | t <- from testTable 45 | pure $ select {n: t.count} `where_` (t.name :== name) 46 | 47 | test :: Spec Unit 48 | test = do 49 | describe "Sqlite" do 50 | 51 | let withMemoryDb = bracket (SQLite3.newDB ":memory:") SQLite3.closeDB 52 | 53 | it "CRUD" do 54 | withMemoryDb \db -> do 55 | 56 | void $ SQLite3.queryDB db createTableSql [] 57 | 58 | let t = columns testTable 59 | 60 | runQuery db $ insertInto testTable {name: "jim", count: 5} 61 | runQuery db $ insertInto testTable {name: "jane", count: 42} 62 | runQuery db $ insertInto testTable {name: "jean", count: 7} 63 | 64 | count <- runSelectOneQuery db selectCount 65 | count.n `shouldEqual` 54 66 | 67 | runQuery db $ update testTable {count: t.count :+ 1} (t.name :== "jim") 68 | 69 | count' <- runSelectOneQuery db selectCount 70 | count'.n `shouldEqual` 55 71 | 72 | runQuery db $ deleteFrom testTable (t.name :== "jean") 73 | 74 | count'' <- runSelectOneQuery db selectCount 75 | count''.n `shouldEqual` 48 76 | 77 | jimCount <- runSelectMaybeQuery db $ selectNamedCount "jim" 78 | jimCount `shouldEqual` Just {n: 6} 79 | 80 | joeCount <- runSelectMaybeQuery db $ selectNamedCount "joe" 81 | joeCount `shouldEqual` Nothing 82 | 83 | describe "Datatypes" do 84 | 85 | it "DateTime" do 86 | withMemoryDb \db -> do 87 | let testDateTime = toDateTime $ unsafePartial $ fromJust $ instant $ Milliseconds $ 123.0 88 | query = pure (select { dt: testDateTime }) :: SelectQuery (dt :: DateTime) 89 | result <- runSelectOneQuery db query 90 | result.dt `shouldEqual` testDateTime 91 | 92 | it "ImmutableBuffer" do 93 | withMemoryDb \db -> do 94 | let buf = ImmutableBuffer.fromArray [1, 2, 3] 95 | query = pure (select { a: buf }) :: SelectQuery (a :: ImmutableBuffer) 96 | result <- runSelectOneQuery db query 97 | result.a `shouldEqual` buf 98 | 99 | Expressions.test 100 | -------------------------------------------------------------------------------- /test/Test/QueryDsl/SQLite3/Expressions.purs: -------------------------------------------------------------------------------- 1 | module Test.QueryDsl.SQLite3.Expressions (test) where 2 | 3 | import Prelude 4 | 5 | import QueryDsl (class SqlType, Constant, ParameterizedSql(..), expressionSql, toConstant) 6 | import QueryDsl.SQLite3.Expressions (random, rank, match) 7 | import Test.QueryDsl.Assertions (shouldBeSql) 8 | import Test.Spec (Spec, describe, it) 9 | 10 | c :: forall t. SqlType t => t -> Constant 11 | c = toConstant 12 | 13 | test :: Spec Unit 14 | test = do 15 | describe "Expressions" do 16 | 17 | it "random" do 18 | expressionSql random `shouldBeSql` ParameterizedSql "random()" [] 19 | 20 | it "match" do 21 | expressionSql ("abc" `match` "a") `shouldBeSql` ParameterizedSql "(? match ?)" 22 | [ c "abc", c "a" ] 23 | 24 | it "rank" do 25 | expressionSql rank `shouldBeSql` ParameterizedSql "rank" [] 26 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | JSONStream@^0.10.0: 6 | version "0.10.0" 7 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.10.0.tgz#74349d0d89522b71f30f0a03ff9bd20ca6f12ac0" 8 | integrity sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA= 9 | dependencies: 10 | jsonparse "0.0.5" 11 | through ">=2.2.7 <3" 12 | 13 | JSONStream@^1.0.3: 14 | version "1.3.5" 15 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" 16 | integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== 17 | dependencies: 18 | jsonparse "^1.2.0" 19 | through ">=2.2.7 <3" 20 | 21 | abbrev@1: 22 | version "1.1.1" 23 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 24 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 25 | 26 | acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: 27 | version "1.8.2" 28 | resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" 29 | integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== 30 | dependencies: 31 | acorn "^7.0.0" 32 | acorn-walk "^7.0.0" 33 | xtend "^4.0.2" 34 | 35 | acorn-walk@^7.0.0: 36 | version "7.0.0" 37 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.0.0.tgz#c8ba6f0f1aac4b0a9e32d1f0af12be769528f36b" 38 | integrity sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg== 39 | 40 | acorn@^7.0.0: 41 | version "7.1.1" 42 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" 43 | integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== 44 | 45 | ajv@^6.5.5: 46 | version "6.10.2" 47 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" 48 | integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== 49 | dependencies: 50 | fast-deep-equal "^2.0.1" 51 | fast-json-stable-stringify "^2.0.0" 52 | json-schema-traverse "^0.4.1" 53 | uri-js "^4.2.2" 54 | 55 | ansi-escapes@^3.2.0: 56 | version "3.2.0" 57 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" 58 | integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== 59 | 60 | ansi-regex@^2.0.0: 61 | version "2.1.1" 62 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 63 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 64 | 65 | ansi-regex@^3.0.0: 66 | version "3.0.0" 67 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 68 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 69 | 70 | ansi-regex@^4.1.0: 71 | version "4.1.0" 72 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 73 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 74 | 75 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 76 | version "3.2.1" 77 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 78 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 79 | dependencies: 80 | color-convert "^1.9.0" 81 | 82 | aproba@^1.0.3, aproba@^1.1.1: 83 | version "1.2.0" 84 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 85 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 86 | 87 | arch@^2.1.1: 88 | version "2.1.1" 89 | resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" 90 | integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== 91 | 92 | are-we-there-yet@~1.1.2: 93 | version "1.1.5" 94 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 95 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 96 | dependencies: 97 | delegates "^1.0.0" 98 | readable-stream "^2.0.6" 99 | 100 | asn1.js@^4.0.0: 101 | version "4.10.1" 102 | resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" 103 | integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== 104 | dependencies: 105 | bn.js "^4.0.0" 106 | inherits "^2.0.1" 107 | minimalistic-assert "^1.0.0" 108 | 109 | asn1@~0.2.3: 110 | version "0.2.4" 111 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 112 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 113 | dependencies: 114 | safer-buffer "~2.1.0" 115 | 116 | assert-plus@1.0.0, assert-plus@^1.0.0: 117 | version "1.0.0" 118 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 119 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 120 | 121 | assert@^1.4.0: 122 | version "1.5.0" 123 | resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" 124 | integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== 125 | dependencies: 126 | object-assign "^4.1.1" 127 | util "0.10.3" 128 | 129 | async@^1.5.2: 130 | version "1.5.2" 131 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 132 | integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= 133 | 134 | asynckit@^0.4.0: 135 | version "0.4.0" 136 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 137 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 138 | 139 | aws-sign2@~0.7.0: 140 | version "0.7.0" 141 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 142 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 143 | 144 | aws4@^1.8.0: 145 | version "1.8.0" 146 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 147 | integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== 148 | 149 | balanced-match@^1.0.0: 150 | version "1.0.0" 151 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 152 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 153 | 154 | base64-js@^1.0.2: 155 | version "1.3.1" 156 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" 157 | integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== 158 | 159 | bcrypt-pbkdf@^1.0.0: 160 | version "1.0.2" 161 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 162 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 163 | dependencies: 164 | tweetnacl "^0.14.3" 165 | 166 | bluebird@^3.5.5: 167 | version "3.5.5" 168 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" 169 | integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== 170 | 171 | bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9: 172 | version "4.12.0" 173 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" 174 | integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== 175 | 176 | bower@^1.8.8: 177 | version "1.8.8" 178 | resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.8.tgz#82544be34a33aeae7efb8bdf9905247b2cffa985" 179 | integrity sha512-1SrJnXnkP9soITHptSO+ahx3QKp3cVzn8poI6ujqc5SeOkg5iqM1pK9H+DSc2OQ8SnO0jC/NG4Ur/UIwy7574A== 180 | 181 | brace-expansion@^1.1.7: 182 | version "1.1.11" 183 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 184 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 185 | dependencies: 186 | balanced-match "^1.0.0" 187 | concat-map "0.0.1" 188 | 189 | brorand@^1.0.1, brorand@^1.1.0: 190 | version "1.1.0" 191 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 192 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= 193 | 194 | browser-pack@^6.0.1: 195 | version "6.1.0" 196 | resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" 197 | integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== 198 | dependencies: 199 | JSONStream "^1.0.3" 200 | combine-source-map "~0.8.0" 201 | defined "^1.0.0" 202 | safe-buffer "^5.1.1" 203 | through2 "^2.0.0" 204 | umd "^3.0.0" 205 | 206 | browser-resolve@^1.11.0, browser-resolve@^1.7.0: 207 | version "1.11.3" 208 | resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" 209 | integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== 210 | dependencies: 211 | resolve "1.1.7" 212 | 213 | browserify-aes@^1.0.0, browserify-aes@^1.0.4: 214 | version "1.2.0" 215 | resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" 216 | integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== 217 | dependencies: 218 | buffer-xor "^1.0.3" 219 | cipher-base "^1.0.0" 220 | create-hash "^1.1.0" 221 | evp_bytestokey "^1.0.3" 222 | inherits "^2.0.1" 223 | safe-buffer "^5.0.1" 224 | 225 | browserify-cache-api@^3.0.0: 226 | version "3.0.1" 227 | resolved "https://registry.yarnpkg.com/browserify-cache-api/-/browserify-cache-api-3.0.1.tgz#96247e853f068fd6e0d45cc73f0bb2cd9778ef02" 228 | integrity sha1-liR+hT8Gj9bg1FzHPwuyzZd47wI= 229 | dependencies: 230 | async "^1.5.2" 231 | through2 "^2.0.0" 232 | xtend "^4.0.0" 233 | 234 | browserify-cipher@^1.0.0: 235 | version "1.0.1" 236 | resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" 237 | integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== 238 | dependencies: 239 | browserify-aes "^1.0.4" 240 | browserify-des "^1.0.0" 241 | evp_bytestokey "^1.0.0" 242 | 243 | browserify-des@^1.0.0: 244 | version "1.0.2" 245 | resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" 246 | integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== 247 | dependencies: 248 | cipher-base "^1.0.1" 249 | des.js "^1.0.0" 250 | inherits "^2.0.1" 251 | safe-buffer "^5.1.2" 252 | 253 | browserify-incremental@^3.1.1: 254 | version "3.1.1" 255 | resolved "https://registry.yarnpkg.com/browserify-incremental/-/browserify-incremental-3.1.1.tgz#0713cb7587247a632a9f08cf1bd169b878b62a8a" 256 | integrity sha1-BxPLdYckemMqnwjPG9FpuHi2Koo= 257 | dependencies: 258 | JSONStream "^0.10.0" 259 | browserify-cache-api "^3.0.0" 260 | through2 "^2.0.0" 261 | xtend "^4.0.0" 262 | 263 | browserify-rsa@^4.0.0: 264 | version "4.0.1" 265 | resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" 266 | integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= 267 | dependencies: 268 | bn.js "^4.1.0" 269 | randombytes "^2.0.1" 270 | 271 | browserify-sign@^4.0.0: 272 | version "4.0.4" 273 | resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" 274 | integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= 275 | dependencies: 276 | bn.js "^4.1.1" 277 | browserify-rsa "^4.0.0" 278 | create-hash "^1.1.0" 279 | create-hmac "^1.1.2" 280 | elliptic "^6.0.0" 281 | inherits "^2.0.1" 282 | parse-asn1 "^5.0.0" 283 | 284 | browserify-zlib@~0.2.0: 285 | version "0.2.0" 286 | resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" 287 | integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== 288 | dependencies: 289 | pako "~1.0.5" 290 | 291 | browserify@^16.2.3: 292 | version "16.5.0" 293 | resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.0.tgz#a1c2bc0431bec11fd29151941582e3f645ede881" 294 | integrity sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw== 295 | dependencies: 296 | JSONStream "^1.0.3" 297 | assert "^1.4.0" 298 | browser-pack "^6.0.1" 299 | browser-resolve "^1.11.0" 300 | browserify-zlib "~0.2.0" 301 | buffer "^5.0.2" 302 | cached-path-relative "^1.0.0" 303 | concat-stream "^1.6.0" 304 | console-browserify "^1.1.0" 305 | constants-browserify "~1.0.0" 306 | crypto-browserify "^3.0.0" 307 | defined "^1.0.0" 308 | deps-sort "^2.0.0" 309 | domain-browser "^1.2.0" 310 | duplexer2 "~0.1.2" 311 | events "^2.0.0" 312 | glob "^7.1.0" 313 | has "^1.0.0" 314 | htmlescape "^1.1.0" 315 | https-browserify "^1.0.0" 316 | inherits "~2.0.1" 317 | insert-module-globals "^7.0.0" 318 | labeled-stream-splicer "^2.0.0" 319 | mkdirp "^0.5.0" 320 | module-deps "^6.0.0" 321 | os-browserify "~0.3.0" 322 | parents "^1.0.1" 323 | path-browserify "~0.0.0" 324 | process "~0.11.0" 325 | punycode "^1.3.2" 326 | querystring-es3 "~0.2.0" 327 | read-only-stream "^2.0.0" 328 | readable-stream "^2.0.2" 329 | resolve "^1.1.4" 330 | shasum "^1.0.0" 331 | shell-quote "^1.6.1" 332 | stream-browserify "^2.0.0" 333 | stream-http "^3.0.0" 334 | string_decoder "^1.1.1" 335 | subarg "^1.0.0" 336 | syntax-error "^1.1.1" 337 | through2 "^2.0.0" 338 | timers-browserify "^1.0.1" 339 | tty-browserify "0.0.1" 340 | url "~0.11.0" 341 | util "~0.10.1" 342 | vm-browserify "^1.0.0" 343 | xtend "^4.0.0" 344 | 345 | buffer-crc32@^0.2.5: 346 | version "0.2.13" 347 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 348 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 349 | 350 | buffer-from@^1.0.0: 351 | version "1.1.1" 352 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 353 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 354 | 355 | buffer-xor@^1.0.3: 356 | version "1.0.3" 357 | resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" 358 | integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= 359 | 360 | buffer@^5.0.2: 361 | version "5.4.3" 362 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" 363 | integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== 364 | dependencies: 365 | base64-js "^1.0.2" 366 | ieee754 "^1.1.4" 367 | 368 | builtin-status-codes@^3.0.0: 369 | version "3.0.0" 370 | resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" 371 | integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= 372 | 373 | byline@^5.0.0: 374 | version "5.0.0" 375 | resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" 376 | integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= 377 | 378 | cacache@^11.3.2: 379 | version "11.3.3" 380 | resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" 381 | integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== 382 | dependencies: 383 | bluebird "^3.5.5" 384 | chownr "^1.1.1" 385 | figgy-pudding "^3.5.1" 386 | glob "^7.1.4" 387 | graceful-fs "^4.1.15" 388 | lru-cache "^5.1.1" 389 | mississippi "^3.0.0" 390 | mkdirp "^0.5.1" 391 | move-concurrently "^1.0.1" 392 | promise-inflight "^1.0.1" 393 | rimraf "^2.6.3" 394 | ssri "^6.0.1" 395 | unique-filename "^1.1.1" 396 | y18n "^4.0.0" 397 | 398 | cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: 399 | version "1.0.2" 400 | resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" 401 | integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== 402 | 403 | caseless@~0.12.0: 404 | version "0.12.0" 405 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 406 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 407 | 408 | chalk@^2.4.2: 409 | version "2.4.2" 410 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 411 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 412 | dependencies: 413 | ansi-styles "^3.2.1" 414 | escape-string-regexp "^1.0.5" 415 | supports-color "^5.3.0" 416 | 417 | chownr@^1.1.1: 418 | version "1.1.2" 419 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" 420 | integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== 421 | 422 | cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: 423 | version "1.0.4" 424 | resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" 425 | integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== 426 | dependencies: 427 | inherits "^2.0.1" 428 | safe-buffer "^5.0.1" 429 | 430 | cli-cursor@^2.1.0: 431 | version "2.1.0" 432 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 433 | integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= 434 | dependencies: 435 | restore-cursor "^2.0.0" 436 | 437 | code-point-at@^1.0.0: 438 | version "1.1.0" 439 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 440 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 441 | 442 | color-convert@^1.9.0: 443 | version "1.9.3" 444 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 445 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 446 | dependencies: 447 | color-name "1.1.3" 448 | 449 | color-name@1.1.3: 450 | version "1.1.3" 451 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 452 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 453 | 454 | colors@>=0.6.0: 455 | version "1.3.3" 456 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" 457 | integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== 458 | 459 | combine-source-map@^0.8.0, combine-source-map@~0.8.0: 460 | version "0.8.0" 461 | resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" 462 | integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos= 463 | dependencies: 464 | convert-source-map "~1.1.0" 465 | inline-source-map "~0.6.0" 466 | lodash.memoize "~3.0.3" 467 | source-map "~0.5.3" 468 | 469 | combined-stream@^1.0.6, combined-stream@~1.0.6: 470 | version "1.0.8" 471 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 472 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 473 | dependencies: 474 | delayed-stream "~1.0.0" 475 | 476 | concat-map@0.0.1: 477 | version "0.0.1" 478 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 479 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 480 | 481 | concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: 482 | version "1.6.2" 483 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 484 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 485 | dependencies: 486 | buffer-from "^1.0.0" 487 | inherits "^2.0.3" 488 | readable-stream "^2.2.2" 489 | typedarray "^0.0.6" 490 | 491 | concat-stream@^2.0.0: 492 | version "2.0.0" 493 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" 494 | integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== 495 | dependencies: 496 | buffer-from "^1.0.0" 497 | inherits "^2.0.3" 498 | readable-stream "^3.0.2" 499 | typedarray "^0.0.6" 500 | 501 | console-browserify@^1.1.0: 502 | version "1.1.0" 503 | resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" 504 | integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= 505 | dependencies: 506 | date-now "^0.1.4" 507 | 508 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 509 | version "1.1.0" 510 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 511 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 512 | 513 | constants-browserify@~1.0.0: 514 | version "1.0.0" 515 | resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" 516 | integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= 517 | 518 | convert-source-map@^1.1.0: 519 | version "1.6.0" 520 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" 521 | integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== 522 | dependencies: 523 | safe-buffer "~5.1.1" 524 | 525 | convert-source-map@~1.1.0: 526 | version "1.1.3" 527 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" 528 | integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= 529 | 530 | copy-concurrently@^1.0.0: 531 | version "1.0.5" 532 | resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" 533 | integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== 534 | dependencies: 535 | aproba "^1.1.1" 536 | fs-write-stream-atomic "^1.0.8" 537 | iferr "^0.1.5" 538 | mkdirp "^0.5.1" 539 | rimraf "^2.5.4" 540 | run-queue "^1.0.0" 541 | 542 | core-util-is@1.0.2, core-util-is@~1.0.0: 543 | version "1.0.2" 544 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 545 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 546 | 547 | create-ecdh@^4.0.0: 548 | version "4.0.3" 549 | resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" 550 | integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== 551 | dependencies: 552 | bn.js "^4.1.0" 553 | elliptic "^6.0.0" 554 | 555 | create-hash@^1.1.0, create-hash@^1.1.2: 556 | version "1.2.0" 557 | resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" 558 | integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== 559 | dependencies: 560 | cipher-base "^1.0.1" 561 | inherits "^2.0.1" 562 | md5.js "^1.3.4" 563 | ripemd160 "^2.0.1" 564 | sha.js "^2.4.0" 565 | 566 | create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: 567 | version "1.1.7" 568 | resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" 569 | integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== 570 | dependencies: 571 | cipher-base "^1.0.3" 572 | create-hash "^1.1.0" 573 | inherits "^2.0.1" 574 | ripemd160 "^2.0.0" 575 | safe-buffer "^5.0.1" 576 | sha.js "^2.4.8" 577 | 578 | cross-spawn@^6.0.5: 579 | version "6.0.5" 580 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 581 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 582 | dependencies: 583 | nice-try "^1.0.4" 584 | path-key "^2.0.1" 585 | semver "^5.5.0" 586 | shebang-command "^1.2.0" 587 | which "^1.2.9" 588 | 589 | crypto-browserify@^3.0.0: 590 | version "3.12.0" 591 | resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" 592 | integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== 593 | dependencies: 594 | browserify-cipher "^1.0.0" 595 | browserify-sign "^4.0.0" 596 | create-ecdh "^4.0.0" 597 | create-hash "^1.1.0" 598 | create-hmac "^1.1.0" 599 | diffie-hellman "^5.0.0" 600 | inherits "^2.0.1" 601 | pbkdf2 "^3.0.3" 602 | public-encrypt "^4.0.0" 603 | randombytes "^2.0.0" 604 | randomfill "^1.0.3" 605 | 606 | cyclist@^1.0.1: 607 | version "1.0.1" 608 | resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" 609 | integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= 610 | 611 | dash-ast@^1.0.0: 612 | version "1.0.0" 613 | resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" 614 | integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== 615 | 616 | dashdash@^1.12.0: 617 | version "1.14.1" 618 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 619 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 620 | dependencies: 621 | assert-plus "^1.0.0" 622 | 623 | date-now@^0.1.4: 624 | version "0.1.4" 625 | resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" 626 | integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= 627 | 628 | debug@^3.0.0, debug@^3.2.6: 629 | version "3.2.6" 630 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 631 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 632 | dependencies: 633 | ms "^2.1.1" 634 | 635 | deep-extend@^0.6.0: 636 | version "0.6.0" 637 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 638 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 639 | 640 | defined@^1.0.0: 641 | version "1.0.0" 642 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 643 | integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= 644 | 645 | delayed-stream@~1.0.0: 646 | version "1.0.0" 647 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 648 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 649 | 650 | delegates@^1.0.0: 651 | version "1.0.0" 652 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 653 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 654 | 655 | deps-sort@^2.0.0: 656 | version "2.0.0" 657 | resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" 658 | integrity sha1-CRckkC6EZYJg65EHSMzNGvbiH7U= 659 | dependencies: 660 | JSONStream "^1.0.3" 661 | shasum "^1.0.0" 662 | subarg "^1.0.0" 663 | through2 "^2.0.0" 664 | 665 | des.js@^1.0.0: 666 | version "1.0.0" 667 | resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" 668 | integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= 669 | dependencies: 670 | inherits "^2.0.1" 671 | minimalistic-assert "^1.0.0" 672 | 673 | detect-libc@^1.0.2: 674 | version "1.0.3" 675 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 676 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 677 | 678 | detective@^5.0.2: 679 | version "5.2.0" 680 | resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" 681 | integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== 682 | dependencies: 683 | acorn-node "^1.6.1" 684 | defined "^1.0.0" 685 | minimist "^1.1.1" 686 | 687 | diffie-hellman@^5.0.0: 688 | version "5.0.3" 689 | resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" 690 | integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== 691 | dependencies: 692 | bn.js "^4.1.0" 693 | miller-rabin "^4.0.0" 694 | randombytes "^2.0.0" 695 | 696 | domain-browser@^1.2.0: 697 | version "1.2.0" 698 | resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" 699 | integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== 700 | 701 | duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: 702 | version "0.1.4" 703 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" 704 | integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= 705 | dependencies: 706 | readable-stream "^2.0.2" 707 | 708 | duplexify@^3.4.2, duplexify@^3.6.0: 709 | version "3.7.1" 710 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" 711 | integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== 712 | dependencies: 713 | end-of-stream "^1.0.0" 714 | inherits "^2.0.1" 715 | readable-stream "^2.0.0" 716 | stream-shift "^1.0.0" 717 | 718 | ecc-jsbn@~0.1.1: 719 | version "0.1.2" 720 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 721 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 722 | dependencies: 723 | jsbn "~0.1.0" 724 | safer-buffer "^2.1.0" 725 | 726 | elliptic@^6.0.0: 727 | version "6.5.4" 728 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" 729 | integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== 730 | dependencies: 731 | bn.js "^4.11.9" 732 | brorand "^1.1.0" 733 | hash.js "^1.0.0" 734 | hmac-drbg "^1.0.1" 735 | inherits "^2.0.4" 736 | minimalistic-assert "^1.0.1" 737 | minimalistic-crypto-utils "^1.0.1" 738 | 739 | emoji-regex@^7.0.1: 740 | version "7.0.3" 741 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 742 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 743 | 744 | end-of-stream@^1.0.0, end-of-stream@^1.1.0: 745 | version "1.4.1" 746 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 747 | integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== 748 | dependencies: 749 | once "^1.4.0" 750 | 751 | env-paths@^2.2.0: 752 | version "2.2.0" 753 | resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" 754 | integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== 755 | 756 | es6-promise@^3.1.2: 757 | version "3.3.1" 758 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" 759 | integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= 760 | 761 | escape-string-regexp@^1.0.5: 762 | version "1.0.5" 763 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 764 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 765 | 766 | events@^2.0.0: 767 | version "2.1.0" 768 | resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" 769 | integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== 770 | 771 | evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: 772 | version "1.0.3" 773 | resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" 774 | integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== 775 | dependencies: 776 | md5.js "^1.3.4" 777 | safe-buffer "^5.1.1" 778 | 779 | execa@^2.0.3: 780 | version "2.0.4" 781 | resolved "https://registry.yarnpkg.com/execa/-/execa-2.0.4.tgz#2f5cc589c81db316628627004ea4e37b93391d8e" 782 | integrity sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ== 783 | dependencies: 784 | cross-spawn "^6.0.5" 785 | get-stream "^5.0.0" 786 | is-stream "^2.0.0" 787 | merge-stream "^2.0.0" 788 | npm-run-path "^3.0.0" 789 | onetime "^5.1.0" 790 | p-finally "^2.0.0" 791 | signal-exit "^3.0.2" 792 | strip-final-newline "^2.0.0" 793 | 794 | extend@~3.0.2: 795 | version "3.0.2" 796 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 797 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 798 | 799 | extsprintf@1.3.0: 800 | version "1.3.0" 801 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 802 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 803 | 804 | extsprintf@^1.2.0: 805 | version "1.4.0" 806 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 807 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 808 | 809 | fast-deep-equal@^2.0.1: 810 | version "2.0.1" 811 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 812 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 813 | 814 | fast-json-stable-stringify@^2.0.0: 815 | version "2.0.0" 816 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 817 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 818 | 819 | figgy-pudding@^3.5.1: 820 | version "3.5.1" 821 | resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" 822 | integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== 823 | 824 | filesize@^4.1.2: 825 | version "4.2.0" 826 | resolved "https://registry.yarnpkg.com/filesize/-/filesize-4.2.0.tgz#a8c989a179ca3a895cc32eab4abc64ebf6d34d44" 827 | integrity sha512-bdS2UP98MZzLyTZzhuSH5ctAWyDt81n5xMti9BSdmgPXjjENLDz5Bmbk2R7ATVw/HRysZzWA2JIPgcSAOimWpw== 828 | 829 | flush-write-stream@^1.0.0: 830 | version "1.1.1" 831 | resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" 832 | integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== 833 | dependencies: 834 | inherits "^2.0.3" 835 | readable-stream "^2.3.6" 836 | 837 | follow-redirects@^1.7.0: 838 | version "1.9.0" 839 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f" 840 | integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A== 841 | dependencies: 842 | debug "^3.0.0" 843 | 844 | forever-agent@~0.6.1: 845 | version "0.6.1" 846 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 847 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 848 | 849 | form-data@~2.3.2: 850 | version "2.3.3" 851 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 852 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 853 | dependencies: 854 | asynckit "^0.4.0" 855 | combined-stream "^1.0.6" 856 | mime-types "^2.1.12" 857 | 858 | from2@^2.1.0: 859 | version "2.3.0" 860 | resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" 861 | integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= 862 | dependencies: 863 | inherits "^2.0.1" 864 | readable-stream "^2.0.0" 865 | 866 | fs-minipass@^1.2.5: 867 | version "1.2.6" 868 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" 869 | integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== 870 | dependencies: 871 | minipass "^2.2.1" 872 | 873 | fs-write-stream-atomic@^1.0.8: 874 | version "1.0.10" 875 | resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" 876 | integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= 877 | dependencies: 878 | graceful-fs "^4.1.2" 879 | iferr "^0.1.5" 880 | imurmurhash "^0.1.4" 881 | readable-stream "1 || 2" 882 | 883 | fs.realpath@^1.0.0: 884 | version "1.0.0" 885 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 886 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 887 | 888 | function-bind@^1.1.1: 889 | version "1.1.1" 890 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 891 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 892 | 893 | gauge@~2.7.3: 894 | version "2.7.4" 895 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 896 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 897 | dependencies: 898 | aproba "^1.0.3" 899 | console-control-strings "^1.0.0" 900 | has-unicode "^2.0.0" 901 | object-assign "^4.1.0" 902 | signal-exit "^3.0.0" 903 | string-width "^1.0.1" 904 | strip-ansi "^3.0.1" 905 | wide-align "^1.1.0" 906 | 907 | gaze@^1.1.3: 908 | version "1.1.3" 909 | resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" 910 | integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== 911 | dependencies: 912 | globule "^1.0.0" 913 | 914 | get-assigned-identifiers@^1.2.0: 915 | version "1.2.0" 916 | resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" 917 | integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== 918 | 919 | get-stream@^5.0.0: 920 | version "5.1.0" 921 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" 922 | integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== 923 | dependencies: 924 | pump "^3.0.0" 925 | 926 | getpass@^0.1.1: 927 | version "0.1.7" 928 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 929 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 930 | dependencies: 931 | assert-plus "^1.0.0" 932 | 933 | glob@^7.1.0, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: 934 | version "7.1.4" 935 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 936 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 937 | dependencies: 938 | fs.realpath "^1.0.0" 939 | inflight "^1.0.4" 940 | inherits "2" 941 | minimatch "^3.0.4" 942 | once "^1.3.0" 943 | path-is-absolute "^1.0.0" 944 | 945 | globule@^1.0.0: 946 | version "1.2.1" 947 | resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" 948 | integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== 949 | dependencies: 950 | glob "~7.1.1" 951 | lodash "~4.17.10" 952 | minimatch "~3.0.2" 953 | 954 | graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3: 955 | version "4.2.2" 956 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" 957 | integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== 958 | 959 | har-schema@^2.0.0: 960 | version "2.0.0" 961 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 962 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 963 | 964 | har-validator@~5.1.0: 965 | version "5.1.3" 966 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 967 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 968 | dependencies: 969 | ajv "^6.5.5" 970 | har-schema "^2.0.0" 971 | 972 | has-flag@^3.0.0: 973 | version "3.0.0" 974 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 975 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 976 | 977 | has-unicode@^2.0.0: 978 | version "2.0.1" 979 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 980 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 981 | 982 | has@^1.0.0: 983 | version "1.0.3" 984 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 985 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 986 | dependencies: 987 | function-bind "^1.1.1" 988 | 989 | hash-base@^3.0.0: 990 | version "3.0.4" 991 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" 992 | integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= 993 | dependencies: 994 | inherits "^2.0.1" 995 | safe-buffer "^5.0.1" 996 | 997 | hash.js@^1.0.0, hash.js@^1.0.3: 998 | version "1.1.7" 999 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 1000 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 1001 | dependencies: 1002 | inherits "^2.0.3" 1003 | minimalistic-assert "^1.0.1" 1004 | 1005 | hmac-drbg@^1.0.1: 1006 | version "1.0.1" 1007 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 1008 | integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= 1009 | dependencies: 1010 | hash.js "^1.0.3" 1011 | minimalistic-assert "^1.0.0" 1012 | minimalistic-crypto-utils "^1.0.1" 1013 | 1014 | htmlescape@^1.1.0: 1015 | version "1.1.1" 1016 | resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" 1017 | integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= 1018 | 1019 | http-signature@~1.2.0: 1020 | version "1.2.0" 1021 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 1022 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 1023 | dependencies: 1024 | assert-plus "^1.0.0" 1025 | jsprim "^1.2.2" 1026 | sshpk "^1.7.0" 1027 | 1028 | https-browserify@^1.0.0: 1029 | version "1.0.0" 1030 | resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" 1031 | integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= 1032 | 1033 | iconv-lite@^0.4.4: 1034 | version "0.4.24" 1035 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1036 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1037 | dependencies: 1038 | safer-buffer ">= 2.1.2 < 3" 1039 | 1040 | ieee754@^1.1.4: 1041 | version "1.1.13" 1042 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 1043 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 1044 | 1045 | iferr@^0.1.5: 1046 | version "0.1.5" 1047 | resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" 1048 | integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= 1049 | 1050 | ignore-walk@^3.0.1: 1051 | version "3.0.2" 1052 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.2.tgz#99d83a246c196ea5c93ef9315ad7b0819c35069b" 1053 | integrity sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw== 1054 | dependencies: 1055 | minimatch "^3.0.4" 1056 | 1057 | imurmurhash@^0.1.4: 1058 | version "0.1.4" 1059 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1060 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1061 | 1062 | inflight@^1.0.4: 1063 | version "1.0.6" 1064 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1065 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1066 | dependencies: 1067 | once "^1.3.0" 1068 | wrappy "1" 1069 | 1070 | inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: 1071 | version "2.0.4" 1072 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1073 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1074 | 1075 | inherits@2.0.1: 1076 | version "2.0.1" 1077 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 1078 | integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= 1079 | 1080 | inherits@2.0.3: 1081 | version "2.0.3" 1082 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1083 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1084 | 1085 | ini@~1.3.0: 1086 | version "1.3.7" 1087 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" 1088 | integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== 1089 | 1090 | inline-source-map@~0.6.0: 1091 | version "0.6.2" 1092 | resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" 1093 | integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU= 1094 | dependencies: 1095 | source-map "~0.5.3" 1096 | 1097 | insert-module-globals@^7.0.0: 1098 | version "7.2.0" 1099 | resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba" 1100 | integrity sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw== 1101 | dependencies: 1102 | JSONStream "^1.0.3" 1103 | acorn-node "^1.5.2" 1104 | combine-source-map "^0.8.0" 1105 | concat-stream "^1.6.1" 1106 | is-buffer "^1.1.0" 1107 | path-is-absolute "^1.0.1" 1108 | process "~0.11.0" 1109 | through2 "^2.0.0" 1110 | undeclared-identifiers "^1.1.2" 1111 | xtend "^4.0.0" 1112 | 1113 | is-buffer@^1.1.0: 1114 | version "1.1.6" 1115 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1116 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 1117 | 1118 | is-fullwidth-code-point@^1.0.0: 1119 | version "1.0.0" 1120 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1121 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 1122 | dependencies: 1123 | number-is-nan "^1.0.0" 1124 | 1125 | is-fullwidth-code-point@^2.0.0: 1126 | version "2.0.0" 1127 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1128 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1129 | 1130 | is-plain-obj@^2.0.0: 1131 | version "2.0.0" 1132 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.0.0.tgz#7fd1a7f1b69e160cde9181d2313f445c68aa2679" 1133 | integrity sha512-EYisGhpgSCwspmIuRHGjROWTon2Xp8Z7U03Wubk/bTL5TTRC5R1rGVgyjzBrk9+ULdH6cRD06KRcw/xfqhVYKQ== 1134 | 1135 | is-stream@^2.0.0: 1136 | version "2.0.0" 1137 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 1138 | integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== 1139 | 1140 | is-typedarray@~1.0.0: 1141 | version "1.0.0" 1142 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1143 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 1144 | 1145 | isarray@~1.0.0: 1146 | version "1.0.0" 1147 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1148 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1149 | 1150 | isexe@^2.0.0: 1151 | version "2.0.0" 1152 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1153 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1154 | 1155 | isstream@~0.1.2: 1156 | version "0.1.2" 1157 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1158 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 1159 | 1160 | jsbn@~0.1.0: 1161 | version "0.1.1" 1162 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1163 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 1164 | 1165 | json-schema-traverse@^0.4.1: 1166 | version "0.4.1" 1167 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1168 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1169 | 1170 | json-schema@0.2.3: 1171 | version "0.2.3" 1172 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1173 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 1174 | 1175 | json-stable-stringify@~0.0.0: 1176 | version "0.0.1" 1177 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" 1178 | integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U= 1179 | dependencies: 1180 | jsonify "~0.0.0" 1181 | 1182 | json-stringify-safe@~5.0.1: 1183 | version "5.0.1" 1184 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1185 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 1186 | 1187 | jsonify@~0.0.0: 1188 | version "0.0.0" 1189 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1190 | integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= 1191 | 1192 | jsonparse@0.0.5: 1193 | version "0.0.5" 1194 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64" 1195 | integrity sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ= 1196 | 1197 | jsonparse@^1.2.0: 1198 | version "1.3.1" 1199 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 1200 | integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= 1201 | 1202 | jsprim@^1.2.2: 1203 | version "1.4.1" 1204 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1205 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 1206 | dependencies: 1207 | assert-plus "1.0.0" 1208 | extsprintf "1.3.0" 1209 | json-schema "0.2.3" 1210 | verror "1.10.0" 1211 | 1212 | labeled-stream-splicer@^2.0.0: 1213 | version "2.0.2" 1214 | resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" 1215 | integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== 1216 | dependencies: 1217 | inherits "^2.0.1" 1218 | stream-splicer "^2.0.0" 1219 | 1220 | lodash.memoize@~3.0.3: 1221 | version "3.0.4" 1222 | resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" 1223 | integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= 1224 | 1225 | lodash@~4.17.10: 1226 | version "4.17.19" 1227 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" 1228 | integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== 1229 | 1230 | log-symbols@^3.0.0: 1231 | version "3.0.0" 1232 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" 1233 | integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== 1234 | dependencies: 1235 | chalk "^2.4.2" 1236 | 1237 | log-update@^3.2.0: 1238 | version "3.3.0" 1239 | resolved "https://registry.yarnpkg.com/log-update/-/log-update-3.3.0.tgz#3b0501815123f66cb33f300e3dac2a2b6ad3fdf5" 1240 | integrity sha512-YSKm5n+YjZoGZT5lfmOqasVH1fIH9xQA9A81Y48nZ99PxAP62vdCCtua+Gcu6oTn0nqtZd/LwRV+Vflo53ZDWA== 1241 | dependencies: 1242 | ansi-escapes "^3.2.0" 1243 | cli-cursor "^2.1.0" 1244 | wrap-ansi "^5.0.0" 1245 | 1246 | lru-cache@^5.1.1: 1247 | version "5.1.1" 1248 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 1249 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1250 | dependencies: 1251 | yallist "^3.0.2" 1252 | 1253 | md5.js@^1.3.4: 1254 | version "1.3.5" 1255 | resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" 1256 | integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== 1257 | dependencies: 1258 | hash-base "^3.0.0" 1259 | inherits "^2.0.1" 1260 | safe-buffer "^5.1.2" 1261 | 1262 | merge-stream@^2.0.0: 1263 | version "2.0.0" 1264 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1265 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1266 | 1267 | miller-rabin@^4.0.0: 1268 | version "4.0.1" 1269 | resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" 1270 | integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== 1271 | dependencies: 1272 | bn.js "^4.0.0" 1273 | brorand "^1.0.1" 1274 | 1275 | mime-db@1.40.0: 1276 | version "1.40.0" 1277 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" 1278 | integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== 1279 | 1280 | mime-types@^2.1.12, mime-types@~2.1.19: 1281 | version "2.1.24" 1282 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" 1283 | integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== 1284 | dependencies: 1285 | mime-db "1.40.0" 1286 | 1287 | mime@^1.2.9: 1288 | version "1.6.0" 1289 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1290 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1291 | 1292 | mimic-fn@^1.0.0: 1293 | version "1.2.0" 1294 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 1295 | integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== 1296 | 1297 | mimic-fn@^2.1.0: 1298 | version "2.1.0" 1299 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1300 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1301 | 1302 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 1303 | version "1.0.1" 1304 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 1305 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 1306 | 1307 | minimalistic-crypto-utils@^1.0.1: 1308 | version "1.0.1" 1309 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 1310 | integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 1311 | 1312 | minimatch@^3.0.4, minimatch@~3.0.2: 1313 | version "3.0.4" 1314 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1315 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1316 | dependencies: 1317 | brace-expansion "^1.1.7" 1318 | 1319 | minimist@0.0.8: 1320 | version "0.0.8" 1321 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1322 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 1323 | 1324 | minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: 1325 | version "1.2.0" 1326 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1327 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 1328 | 1329 | minimist@~0.0.1: 1330 | version "0.0.10" 1331 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 1332 | integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= 1333 | 1334 | minipass@^2.2.1, minipass@^2.3.5: 1335 | version "2.5.1" 1336 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.5.1.tgz#cf435a9bf9408796ca3a3525a8b851464279c9b8" 1337 | integrity sha512-dmpSnLJtNQioZFI5HfQ55Ad0DzzsMAb+HfokwRTNXwEQjepbTkl5mtIlSVxGIkOkxlpX7wIn5ET/oAd9fZ/Y/Q== 1338 | dependencies: 1339 | safe-buffer "^5.1.2" 1340 | yallist "^3.0.0" 1341 | 1342 | minizlib@^1.2.1: 1343 | version "1.2.2" 1344 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.2.tgz#6f0ccc82fa53e1bf2ff145f220d2da9fa6e3a166" 1345 | integrity sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ== 1346 | dependencies: 1347 | minipass "^2.2.1" 1348 | 1349 | mississippi@^3.0.0: 1350 | version "3.0.0" 1351 | resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" 1352 | integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== 1353 | dependencies: 1354 | concat-stream "^1.5.0" 1355 | duplexify "^3.4.2" 1356 | end-of-stream "^1.1.0" 1357 | flush-write-stream "^1.0.0" 1358 | from2 "^2.1.0" 1359 | parallel-transform "^1.1.0" 1360 | pump "^3.0.0" 1361 | pumpify "^1.3.3" 1362 | stream-each "^1.1.0" 1363 | through2 "^2.0.0" 1364 | 1365 | mkdirp@^0.5.0, mkdirp@^0.5.1: 1366 | version "0.5.1" 1367 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1368 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1369 | dependencies: 1370 | minimist "0.0.8" 1371 | 1372 | module-deps@^6.0.0: 1373 | version "6.2.1" 1374 | resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.1.tgz#cfe558784060e926824f474b4e647287837cda50" 1375 | integrity sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A== 1376 | dependencies: 1377 | JSONStream "^1.0.3" 1378 | browser-resolve "^1.7.0" 1379 | cached-path-relative "^1.0.2" 1380 | concat-stream "~1.6.0" 1381 | defined "^1.0.0" 1382 | detective "^5.0.2" 1383 | duplexer2 "^0.1.2" 1384 | inherits "^2.0.1" 1385 | parents "^1.0.0" 1386 | readable-stream "^2.0.2" 1387 | resolve "^1.4.0" 1388 | stream-combiner2 "^1.1.1" 1389 | subarg "^1.0.0" 1390 | through2 "^2.0.0" 1391 | xtend "^4.0.0" 1392 | 1393 | mold-source-map@^0.4.0: 1394 | version "0.4.0" 1395 | resolved "https://registry.yarnpkg.com/mold-source-map/-/mold-source-map-0.4.0.tgz#cf67e0b31c47ab9badb5c9c25651862127bb8317" 1396 | integrity sha1-z2fgsxxHq5uttcnCVlGGISe7gxc= 1397 | dependencies: 1398 | convert-source-map "^1.1.0" 1399 | through "~2.2.7" 1400 | 1401 | move-concurrently@^1.0.1: 1402 | version "1.0.1" 1403 | resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" 1404 | integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= 1405 | dependencies: 1406 | aproba "^1.1.1" 1407 | copy-concurrently "^1.0.0" 1408 | fs-write-stream-atomic "^1.0.8" 1409 | mkdirp "^0.5.1" 1410 | rimraf "^2.5.4" 1411 | run-queue "^1.0.3" 1412 | 1413 | ms@^2.1.1, ms@^2.1.2: 1414 | version "2.1.2" 1415 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1416 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1417 | 1418 | mute-stream@~0.0.4: 1419 | version "0.0.8" 1420 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 1421 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 1422 | 1423 | nan@^2.12.1: 1424 | version "2.14.0" 1425 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" 1426 | integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== 1427 | 1428 | needle@^2.2.1: 1429 | version "2.4.0" 1430 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" 1431 | integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== 1432 | dependencies: 1433 | debug "^3.2.6" 1434 | iconv-lite "^0.4.4" 1435 | sax "^1.2.4" 1436 | 1437 | nice-try@^1.0.4: 1438 | version "1.0.5" 1439 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1440 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1441 | 1442 | node-pre-gyp@^0.11.0: 1443 | version "0.11.0" 1444 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" 1445 | integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== 1446 | dependencies: 1447 | detect-libc "^1.0.2" 1448 | mkdirp "^0.5.1" 1449 | needle "^2.2.1" 1450 | nopt "^4.0.1" 1451 | npm-packlist "^1.1.6" 1452 | npmlog "^4.0.2" 1453 | rc "^1.2.7" 1454 | rimraf "^2.6.1" 1455 | semver "^5.3.0" 1456 | tar "^4" 1457 | 1458 | node-static@^0.7.11: 1459 | version "0.7.11" 1460 | resolved "https://registry.yarnpkg.com/node-static/-/node-static-0.7.11.tgz#60120d349f3cef533e4e820670057eb631882e7f" 1461 | integrity sha512-zfWC/gICcqb74D9ndyvxZWaI1jzcoHmf4UTHWQchBNuNMxdBLJMDiUgZ1tjGLEIe/BMhj2DxKD8HOuc2062pDQ== 1462 | dependencies: 1463 | colors ">=0.6.0" 1464 | mime "^1.2.9" 1465 | optimist ">=0.3.4" 1466 | 1467 | nopt@^4.0.1: 1468 | version "4.0.1" 1469 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1470 | integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= 1471 | dependencies: 1472 | abbrev "1" 1473 | osenv "^0.1.4" 1474 | 1475 | npm-bundled@^1.0.1: 1476 | version "1.0.6" 1477 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" 1478 | integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== 1479 | 1480 | npm-packlist@^1.1.6: 1481 | version "1.4.4" 1482 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" 1483 | integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== 1484 | dependencies: 1485 | ignore-walk "^3.0.1" 1486 | npm-bundled "^1.0.1" 1487 | 1488 | npm-run-path@^3.0.0: 1489 | version "3.1.0" 1490 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" 1491 | integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== 1492 | dependencies: 1493 | path-key "^3.0.0" 1494 | 1495 | npmlog@^4.0.2: 1496 | version "4.1.2" 1497 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1498 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1499 | dependencies: 1500 | are-we-there-yet "~1.1.2" 1501 | console-control-strings "~1.1.0" 1502 | gauge "~2.7.3" 1503 | set-blocking "~2.0.0" 1504 | 1505 | number-is-nan@^1.0.0: 1506 | version "1.0.1" 1507 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1508 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1509 | 1510 | oauth-sign@~0.9.0: 1511 | version "0.9.0" 1512 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 1513 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 1514 | 1515 | object-assign@^4.1.0, object-assign@^4.1.1: 1516 | version "4.1.1" 1517 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1518 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1519 | 1520 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1521 | version "1.4.0" 1522 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1523 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1524 | dependencies: 1525 | wrappy "1" 1526 | 1527 | onetime@^2.0.0: 1528 | version "2.0.1" 1529 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1530 | integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= 1531 | dependencies: 1532 | mimic-fn "^1.0.0" 1533 | 1534 | onetime@^5.1.0: 1535 | version "5.1.0" 1536 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 1537 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 1538 | dependencies: 1539 | mimic-fn "^2.1.0" 1540 | 1541 | optimist@>=0.3.4: 1542 | version "0.6.1" 1543 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1544 | integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= 1545 | dependencies: 1546 | minimist "~0.0.1" 1547 | wordwrap "~0.0.2" 1548 | 1549 | os-browserify@~0.3.0: 1550 | version "0.3.0" 1551 | resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" 1552 | integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= 1553 | 1554 | os-homedir@^1.0.0: 1555 | version "1.0.2" 1556 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1557 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1558 | 1559 | os-tmpdir@^1.0.0: 1560 | version "1.0.2" 1561 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1562 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1563 | 1564 | osenv@^0.1.4: 1565 | version "0.1.5" 1566 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1567 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1568 | dependencies: 1569 | os-homedir "^1.0.0" 1570 | os-tmpdir "^1.0.0" 1571 | 1572 | p-finally@^2.0.0: 1573 | version "2.0.1" 1574 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" 1575 | integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== 1576 | 1577 | pako@~1.0.5: 1578 | version "1.0.10" 1579 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" 1580 | integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== 1581 | 1582 | parallel-transform@^1.1.0: 1583 | version "1.2.0" 1584 | resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" 1585 | integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== 1586 | dependencies: 1587 | cyclist "^1.0.1" 1588 | inherits "^2.0.3" 1589 | readable-stream "^2.1.5" 1590 | 1591 | parents@^1.0.0, parents@^1.0.1: 1592 | version "1.0.1" 1593 | resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" 1594 | integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= 1595 | dependencies: 1596 | path-platform "~0.11.15" 1597 | 1598 | parse-asn1@^5.0.0: 1599 | version "5.1.4" 1600 | resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" 1601 | integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== 1602 | dependencies: 1603 | asn1.js "^4.0.0" 1604 | browserify-aes "^1.0.0" 1605 | create-hash "^1.1.0" 1606 | evp_bytestokey "^1.0.0" 1607 | pbkdf2 "^3.0.3" 1608 | safe-buffer "^5.1.1" 1609 | 1610 | path-browserify@~0.0.0: 1611 | version "0.0.1" 1612 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" 1613 | integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== 1614 | 1615 | path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 1616 | version "1.0.1" 1617 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1618 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1619 | 1620 | path-key@^2.0.1: 1621 | version "2.0.1" 1622 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1623 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1624 | 1625 | path-key@^3.0.0: 1626 | version "3.1.0" 1627 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" 1628 | integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== 1629 | 1630 | path-parse@^1.0.6: 1631 | version "1.0.6" 1632 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1633 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1634 | 1635 | path-platform@~0.11.15: 1636 | version "0.11.15" 1637 | resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" 1638 | integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= 1639 | 1640 | pbkdf2@^3.0.3: 1641 | version "3.0.17" 1642 | resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" 1643 | integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== 1644 | dependencies: 1645 | create-hash "^1.1.2" 1646 | create-hmac "^1.1.4" 1647 | ripemd160 "^2.0.1" 1648 | safe-buffer "^5.0.1" 1649 | sha.js "^2.4.8" 1650 | 1651 | performance-now@^2.1.0: 1652 | version "2.1.0" 1653 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1654 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 1655 | 1656 | process-nextick-args@~2.0.0: 1657 | version "2.0.1" 1658 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1659 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1660 | 1661 | process@~0.11.0: 1662 | version "0.11.10" 1663 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 1664 | integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 1665 | 1666 | promise-inflight@^1.0.1: 1667 | version "1.0.1" 1668 | resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" 1669 | integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= 1670 | 1671 | psl@^1.1.24: 1672 | version "1.4.0" 1673 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" 1674 | integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== 1675 | 1676 | public-encrypt@^4.0.0: 1677 | version "4.0.3" 1678 | resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" 1679 | integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== 1680 | dependencies: 1681 | bn.js "^4.1.0" 1682 | browserify-rsa "^4.0.0" 1683 | create-hash "^1.1.0" 1684 | parse-asn1 "^5.0.0" 1685 | randombytes "^2.0.1" 1686 | safe-buffer "^5.1.2" 1687 | 1688 | pulp@^13.0.0: 1689 | version "13.0.0" 1690 | resolved "https://registry.yarnpkg.com/pulp/-/pulp-13.0.0.tgz#ed7f4dd0e0ae20a79d4ac3621e387b4ebae4bf18" 1691 | integrity sha512-wjjAVuN1Shx6783NvTd8aPwWZ1pE94+isiWtdAJhedvbLqJuwe8p5CSNul9FS0WvBz7ejdrW0vc6wLDLsKX7Yw== 1692 | dependencies: 1693 | browserify "^16.2.3" 1694 | browserify-incremental "^3.1.1" 1695 | concat-stream "^2.0.0" 1696 | gaze "^1.1.3" 1697 | glob "^7.1.3" 1698 | mold-source-map "^0.4.0" 1699 | node-static "^0.7.11" 1700 | read "^1.0.7" 1701 | sorcery "^0.10.0" 1702 | temp "^0.9.0" 1703 | through "^2.3.8" 1704 | tree-kill "^1.2.1" 1705 | which "^1.3.1" 1706 | wordwrap "1.0.0" 1707 | 1708 | pump@^2.0.0: 1709 | version "2.0.1" 1710 | resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" 1711 | integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== 1712 | dependencies: 1713 | end-of-stream "^1.1.0" 1714 | once "^1.3.1" 1715 | 1716 | pump@^3.0.0: 1717 | version "3.0.0" 1718 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1719 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1720 | dependencies: 1721 | end-of-stream "^1.1.0" 1722 | once "^1.3.1" 1723 | 1724 | pumpify@^1.3.3: 1725 | version "1.5.1" 1726 | resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" 1727 | integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== 1728 | dependencies: 1729 | duplexify "^3.6.0" 1730 | inherits "^2.0.3" 1731 | pump "^2.0.0" 1732 | 1733 | punycode@1.3.2: 1734 | version "1.3.2" 1735 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 1736 | integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 1737 | 1738 | punycode@^1.3.2, punycode@^1.4.1: 1739 | version "1.4.1" 1740 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1741 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 1742 | 1743 | punycode@^2.1.0: 1744 | version "2.1.1" 1745 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1746 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1747 | 1748 | purescript-installer@^0.2.0: 1749 | version "0.2.5" 1750 | resolved "https://registry.yarnpkg.com/purescript-installer/-/purescript-installer-0.2.5.tgz#a52a7394c73402b2792fa4d7a8704a694c9fd5ad" 1751 | integrity sha512-fQAWWP5a7scuchXecjpU4r4KEgSPuS6bBnaP01k9f71qqD28HaJ2m4PXHFkhkR4oATAxTPIGCtmTwtVoiBOHog== 1752 | dependencies: 1753 | arch "^2.1.1" 1754 | byline "^5.0.0" 1755 | cacache "^11.3.2" 1756 | chalk "^2.4.2" 1757 | env-paths "^2.2.0" 1758 | execa "^2.0.3" 1759 | filesize "^4.1.2" 1760 | is-plain-obj "^2.0.0" 1761 | log-symbols "^3.0.0" 1762 | log-update "^3.2.0" 1763 | minimist "^1.2.0" 1764 | mkdirp "^0.5.1" 1765 | ms "^2.1.2" 1766 | once "^1.4.0" 1767 | pump "^3.0.0" 1768 | request "^2.88.0" 1769 | rimraf "^2.6.3" 1770 | tar "^4.4.6" 1771 | which "^1.3.1" 1772 | zen-observable "^0.8.14" 1773 | 1774 | purescript@^0.13.4: 1775 | version "0.13.4" 1776 | resolved "https://registry.yarnpkg.com/purescript/-/purescript-0.13.4.tgz#8f61e54d8fb3be80e3666f443a463bec1a7a28b7" 1777 | integrity sha512-wVvmdHpBJaxkqigkCNEmxvKElech8V+NWQtj0hQdL0Vhcd3SUFKbdIul9sN4ABOsfYIobKk/foI1VZbUuTJZEw== 1778 | dependencies: 1779 | purescript-installer "^0.2.0" 1780 | 1781 | qs@~6.5.2: 1782 | version "6.5.2" 1783 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1784 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 1785 | 1786 | querystring-es3@~0.2.0: 1787 | version "0.2.1" 1788 | resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" 1789 | integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= 1790 | 1791 | querystring@0.2.0: 1792 | version "0.2.0" 1793 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 1794 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 1795 | 1796 | randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: 1797 | version "2.1.0" 1798 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1799 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1800 | dependencies: 1801 | safe-buffer "^5.1.0" 1802 | 1803 | randomfill@^1.0.3: 1804 | version "1.0.4" 1805 | resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" 1806 | integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== 1807 | dependencies: 1808 | randombytes "^2.0.5" 1809 | safe-buffer "^5.1.0" 1810 | 1811 | rc@^1.2.7: 1812 | version "1.2.8" 1813 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1814 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1815 | dependencies: 1816 | deep-extend "^0.6.0" 1817 | ini "~1.3.0" 1818 | minimist "^1.2.0" 1819 | strip-json-comments "~2.0.1" 1820 | 1821 | read-only-stream@^2.0.0: 1822 | version "2.0.0" 1823 | resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" 1824 | integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A= 1825 | dependencies: 1826 | readable-stream "^2.0.2" 1827 | 1828 | read@^1.0.7: 1829 | version "1.0.7" 1830 | resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" 1831 | integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= 1832 | dependencies: 1833 | mute-stream "~0.0.4" 1834 | 1835 | "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: 1836 | version "2.3.6" 1837 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1838 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1839 | dependencies: 1840 | core-util-is "~1.0.0" 1841 | inherits "~2.0.3" 1842 | isarray "~1.0.0" 1843 | process-nextick-args "~2.0.0" 1844 | safe-buffer "~5.1.1" 1845 | string_decoder "~1.1.1" 1846 | util-deprecate "~1.0.1" 1847 | 1848 | readable-stream@^3.0.2, readable-stream@^3.0.6: 1849 | version "3.4.0" 1850 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" 1851 | integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== 1852 | dependencies: 1853 | inherits "^2.0.3" 1854 | string_decoder "^1.1.1" 1855 | util-deprecate "^1.0.1" 1856 | 1857 | request@^2.87.0, request@^2.88.0: 1858 | version "2.88.0" 1859 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 1860 | integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== 1861 | dependencies: 1862 | aws-sign2 "~0.7.0" 1863 | aws4 "^1.8.0" 1864 | caseless "~0.12.0" 1865 | combined-stream "~1.0.6" 1866 | extend "~3.0.2" 1867 | forever-agent "~0.6.1" 1868 | form-data "~2.3.2" 1869 | har-validator "~5.1.0" 1870 | http-signature "~1.2.0" 1871 | is-typedarray "~1.0.0" 1872 | isstream "~0.1.2" 1873 | json-stringify-safe "~5.0.1" 1874 | mime-types "~2.1.19" 1875 | oauth-sign "~0.9.0" 1876 | performance-now "^2.1.0" 1877 | qs "~6.5.2" 1878 | safe-buffer "^5.1.2" 1879 | tough-cookie "~2.4.3" 1880 | tunnel-agent "^0.6.0" 1881 | uuid "^3.3.2" 1882 | 1883 | resolve@1.1.7: 1884 | version "1.1.7" 1885 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 1886 | integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= 1887 | 1888 | resolve@^1.1.4, resolve@^1.4.0: 1889 | version "1.12.0" 1890 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" 1891 | integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== 1892 | dependencies: 1893 | path-parse "^1.0.6" 1894 | 1895 | restore-cursor@^2.0.0: 1896 | version "2.0.0" 1897 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1898 | integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= 1899 | dependencies: 1900 | onetime "^2.0.0" 1901 | signal-exit "^3.0.2" 1902 | 1903 | rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: 1904 | version "2.7.1" 1905 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 1906 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 1907 | dependencies: 1908 | glob "^7.1.3" 1909 | 1910 | rimraf@~2.6.2: 1911 | version "2.6.3" 1912 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1913 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1914 | dependencies: 1915 | glob "^7.1.3" 1916 | 1917 | ripemd160@^2.0.0, ripemd160@^2.0.1: 1918 | version "2.0.2" 1919 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" 1920 | integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== 1921 | dependencies: 1922 | hash-base "^3.0.0" 1923 | inherits "^2.0.1" 1924 | 1925 | run-queue@^1.0.0, run-queue@^1.0.3: 1926 | version "1.0.3" 1927 | resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" 1928 | integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= 1929 | dependencies: 1930 | aproba "^1.1.1" 1931 | 1932 | safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: 1933 | version "5.2.0" 1934 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 1935 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1936 | 1937 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1938 | version "5.1.2" 1939 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1940 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1941 | 1942 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1943 | version "2.1.2" 1944 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1945 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1946 | 1947 | sander@^0.5.0: 1948 | version "0.5.1" 1949 | resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" 1950 | integrity sha1-dB4kXiMfB8r7b98PEzrfohalAq0= 1951 | dependencies: 1952 | es6-promise "^3.1.2" 1953 | graceful-fs "^4.1.3" 1954 | mkdirp "^0.5.1" 1955 | rimraf "^2.5.2" 1956 | 1957 | sax@^1.2.4: 1958 | version "1.2.4" 1959 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1960 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1961 | 1962 | semver@^5.3.0, semver@^5.5.0: 1963 | version "5.7.1" 1964 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1965 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1966 | 1967 | set-blocking@~2.0.0: 1968 | version "2.0.0" 1969 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1970 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1971 | 1972 | sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: 1973 | version "2.4.11" 1974 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 1975 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 1976 | dependencies: 1977 | inherits "^2.0.1" 1978 | safe-buffer "^5.0.1" 1979 | 1980 | shasum@^1.0.0: 1981 | version "1.0.2" 1982 | resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" 1983 | integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8= 1984 | dependencies: 1985 | json-stable-stringify "~0.0.0" 1986 | sha.js "~2.4.4" 1987 | 1988 | shebang-command@^1.2.0: 1989 | version "1.2.0" 1990 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1991 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1992 | dependencies: 1993 | shebang-regex "^1.0.0" 1994 | 1995 | shebang-regex@^1.0.0: 1996 | version "1.0.0" 1997 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1998 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1999 | 2000 | shell-quote@^1.6.1: 2001 | version "1.7.2" 2002 | resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" 2003 | integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== 2004 | 2005 | signal-exit@^3.0.0, signal-exit@^3.0.2: 2006 | version "3.0.2" 2007 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2008 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 2009 | 2010 | simple-concat@^1.0.0: 2011 | version "1.0.0" 2012 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" 2013 | integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= 2014 | 2015 | sorcery@^0.10.0: 2016 | version "0.10.0" 2017 | resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.10.0.tgz#8ae90ad7d7cb05fc59f1ab0c637845d5c15a52b7" 2018 | integrity sha1-iukK19fLBfxZ8asMY3hF1cFaUrc= 2019 | dependencies: 2020 | buffer-crc32 "^0.2.5" 2021 | minimist "^1.2.0" 2022 | sander "^0.5.0" 2023 | sourcemap-codec "^1.3.0" 2024 | 2025 | source-map@~0.5.3: 2026 | version "0.5.7" 2027 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2028 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 2029 | 2030 | sourcemap-codec@^1.3.0: 2031 | version "1.4.6" 2032 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" 2033 | integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg== 2034 | 2035 | spago@^0.9.0: 2036 | version "0.9.0" 2037 | resolved "https://registry.yarnpkg.com/spago/-/spago-0.9.0.tgz#9d7002c3f5b66f7f95182a5de9e642f385d1e995" 2038 | integrity sha512-c+I5wbPYOSBSwK0XOu39jHRfi5X8CTG/VvuHB4A92F4j1kDtCQxxJjLsl686OZeNek1bwbz9CyBOIR3tR26b4w== 2039 | dependencies: 2040 | follow-redirects "^1.7.0" 2041 | tar "^4.4.8" 2042 | 2043 | sqlite3@^4.0.8: 2044 | version "4.1.0" 2045 | resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.1.0.tgz#e051fb9c133be15726322a69e2e37ec560368380" 2046 | integrity sha512-RvqoKxq+8pDHsJo7aXxsFR18i+dU2Wp5o12qAJOV5LNcDt+fgJsc2QKKg3sIRfXrN9ZjzY1T7SNe/DFVqAXjaw== 2047 | dependencies: 2048 | nan "^2.12.1" 2049 | node-pre-gyp "^0.11.0" 2050 | request "^2.87.0" 2051 | 2052 | sshpk@^1.7.0: 2053 | version "1.16.1" 2054 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 2055 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 2056 | dependencies: 2057 | asn1 "~0.2.3" 2058 | assert-plus "^1.0.0" 2059 | bcrypt-pbkdf "^1.0.0" 2060 | dashdash "^1.12.0" 2061 | ecc-jsbn "~0.1.1" 2062 | getpass "^0.1.1" 2063 | jsbn "~0.1.0" 2064 | safer-buffer "^2.0.2" 2065 | tweetnacl "~0.14.0" 2066 | 2067 | ssri@^6.0.1: 2068 | version "6.0.1" 2069 | resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" 2070 | integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== 2071 | dependencies: 2072 | figgy-pudding "^3.5.1" 2073 | 2074 | stream-browserify@^2.0.0: 2075 | version "2.0.2" 2076 | resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" 2077 | integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== 2078 | dependencies: 2079 | inherits "~2.0.1" 2080 | readable-stream "^2.0.2" 2081 | 2082 | stream-combiner2@^1.1.1: 2083 | version "1.1.1" 2084 | resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" 2085 | integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= 2086 | dependencies: 2087 | duplexer2 "~0.1.0" 2088 | readable-stream "^2.0.2" 2089 | 2090 | stream-each@^1.1.0: 2091 | version "1.2.3" 2092 | resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" 2093 | integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== 2094 | dependencies: 2095 | end-of-stream "^1.1.0" 2096 | stream-shift "^1.0.0" 2097 | 2098 | stream-http@^3.0.0: 2099 | version "3.1.0" 2100 | resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.0.tgz#22fb33fe9b4056b4eccf58bd8f400c4b993ffe57" 2101 | integrity sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw== 2102 | dependencies: 2103 | builtin-status-codes "^3.0.0" 2104 | inherits "^2.0.1" 2105 | readable-stream "^3.0.6" 2106 | xtend "^4.0.0" 2107 | 2108 | stream-shift@^1.0.0: 2109 | version "1.0.0" 2110 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 2111 | integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= 2112 | 2113 | stream-splicer@^2.0.0: 2114 | version "2.0.1" 2115 | resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" 2116 | integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== 2117 | dependencies: 2118 | inherits "^2.0.1" 2119 | readable-stream "^2.0.2" 2120 | 2121 | string-width@^1.0.1: 2122 | version "1.0.2" 2123 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2124 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 2125 | dependencies: 2126 | code-point-at "^1.0.0" 2127 | is-fullwidth-code-point "^1.0.0" 2128 | strip-ansi "^3.0.0" 2129 | 2130 | "string-width@^1.0.2 || 2": 2131 | version "2.1.1" 2132 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2133 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 2134 | dependencies: 2135 | is-fullwidth-code-point "^2.0.0" 2136 | strip-ansi "^4.0.0" 2137 | 2138 | string-width@^3.0.0: 2139 | version "3.1.0" 2140 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 2141 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 2142 | dependencies: 2143 | emoji-regex "^7.0.1" 2144 | is-fullwidth-code-point "^2.0.0" 2145 | strip-ansi "^5.1.0" 2146 | 2147 | string_decoder@^1.1.1: 2148 | version "1.3.0" 2149 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2150 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 2151 | dependencies: 2152 | safe-buffer "~5.2.0" 2153 | 2154 | string_decoder@~1.1.1: 2155 | version "1.1.1" 2156 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2157 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2158 | dependencies: 2159 | safe-buffer "~5.1.0" 2160 | 2161 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2162 | version "3.0.1" 2163 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2164 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 2165 | dependencies: 2166 | ansi-regex "^2.0.0" 2167 | 2168 | strip-ansi@^4.0.0: 2169 | version "4.0.0" 2170 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2171 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 2172 | dependencies: 2173 | ansi-regex "^3.0.0" 2174 | 2175 | strip-ansi@^5.0.0, strip-ansi@^5.1.0: 2176 | version "5.2.0" 2177 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 2178 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 2179 | dependencies: 2180 | ansi-regex "^4.1.0" 2181 | 2182 | strip-final-newline@^2.0.0: 2183 | version "2.0.0" 2184 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 2185 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 2186 | 2187 | strip-json-comments@~2.0.1: 2188 | version "2.0.1" 2189 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2190 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2191 | 2192 | subarg@^1.0.0: 2193 | version "1.0.0" 2194 | resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" 2195 | integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= 2196 | dependencies: 2197 | minimist "^1.1.0" 2198 | 2199 | supports-color@^5.3.0: 2200 | version "5.5.0" 2201 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2202 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2203 | dependencies: 2204 | has-flag "^3.0.0" 2205 | 2206 | syntax-error@^1.1.1: 2207 | version "1.4.0" 2208 | resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" 2209 | integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== 2210 | dependencies: 2211 | acorn-node "^1.2.0" 2212 | 2213 | tar@^4, tar@^4.4.6, tar@^4.4.8: 2214 | version "4.4.10" 2215 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" 2216 | integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== 2217 | dependencies: 2218 | chownr "^1.1.1" 2219 | fs-minipass "^1.2.5" 2220 | minipass "^2.3.5" 2221 | minizlib "^1.2.1" 2222 | mkdirp "^0.5.0" 2223 | safe-buffer "^5.1.2" 2224 | yallist "^3.0.3" 2225 | 2226 | temp@^0.9.0: 2227 | version "0.9.0" 2228 | resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.0.tgz#61391795a11bd9738d4c4d7f55f012cb8f55edaa" 2229 | integrity sha512-YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ== 2230 | dependencies: 2231 | rimraf "~2.6.2" 2232 | 2233 | through2@^2.0.0: 2234 | version "2.0.5" 2235 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" 2236 | integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== 2237 | dependencies: 2238 | readable-stream "~2.3.6" 2239 | xtend "~4.0.1" 2240 | 2241 | "through@>=2.2.7 <3", through@^2.3.8: 2242 | version "2.3.8" 2243 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2244 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 2245 | 2246 | through@~2.2.7: 2247 | version "2.2.7" 2248 | resolved "https://registry.yarnpkg.com/through/-/through-2.2.7.tgz#6e8e21200191d4eb6a99f6f010df46aa1c6eb2bd" 2249 | integrity sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0= 2250 | 2251 | timers-browserify@^1.0.1: 2252 | version "1.4.2" 2253 | resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" 2254 | integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0= 2255 | dependencies: 2256 | process "~0.11.0" 2257 | 2258 | tough-cookie@~2.4.3: 2259 | version "2.4.3" 2260 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 2261 | integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== 2262 | dependencies: 2263 | psl "^1.1.24" 2264 | punycode "^1.4.1" 2265 | 2266 | tree-kill@^1.2.1: 2267 | version "1.2.2" 2268 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 2269 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 2270 | 2271 | tty-browserify@0.0.1: 2272 | version "0.0.1" 2273 | resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" 2274 | integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== 2275 | 2276 | tunnel-agent@^0.6.0: 2277 | version "0.6.0" 2278 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2279 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 2280 | dependencies: 2281 | safe-buffer "^5.0.1" 2282 | 2283 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2284 | version "0.14.5" 2285 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2286 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 2287 | 2288 | typedarray@^0.0.6: 2289 | version "0.0.6" 2290 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2291 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 2292 | 2293 | umd@^3.0.0: 2294 | version "3.0.3" 2295 | resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" 2296 | integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== 2297 | 2298 | undeclared-identifiers@^1.1.2: 2299 | version "1.1.3" 2300 | resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" 2301 | integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== 2302 | dependencies: 2303 | acorn-node "^1.3.0" 2304 | dash-ast "^1.0.0" 2305 | get-assigned-identifiers "^1.2.0" 2306 | simple-concat "^1.0.0" 2307 | xtend "^4.0.1" 2308 | 2309 | unique-filename@^1.1.1: 2310 | version "1.1.1" 2311 | resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" 2312 | integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== 2313 | dependencies: 2314 | unique-slug "^2.0.0" 2315 | 2316 | unique-slug@^2.0.0: 2317 | version "2.0.2" 2318 | resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" 2319 | integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== 2320 | dependencies: 2321 | imurmurhash "^0.1.4" 2322 | 2323 | uri-js@^4.2.2: 2324 | version "4.2.2" 2325 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 2326 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 2327 | dependencies: 2328 | punycode "^2.1.0" 2329 | 2330 | url@~0.11.0: 2331 | version "0.11.0" 2332 | resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" 2333 | integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= 2334 | dependencies: 2335 | punycode "1.3.2" 2336 | querystring "0.2.0" 2337 | 2338 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 2339 | version "1.0.2" 2340 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2341 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2342 | 2343 | util@0.10.3: 2344 | version "0.10.3" 2345 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 2346 | integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= 2347 | dependencies: 2348 | inherits "2.0.1" 2349 | 2350 | util@~0.10.1: 2351 | version "0.10.4" 2352 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" 2353 | integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== 2354 | dependencies: 2355 | inherits "2.0.3" 2356 | 2357 | uuid@^3.3.2: 2358 | version "3.3.3" 2359 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" 2360 | integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== 2361 | 2362 | verror@1.10.0: 2363 | version "1.10.0" 2364 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2365 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 2366 | dependencies: 2367 | assert-plus "^1.0.0" 2368 | core-util-is "1.0.2" 2369 | extsprintf "^1.2.0" 2370 | 2371 | vm-browserify@^1.0.0: 2372 | version "1.1.0" 2373 | resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" 2374 | integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== 2375 | 2376 | which@^1.2.9, which@^1.3.1: 2377 | version "1.3.1" 2378 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2379 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2380 | dependencies: 2381 | isexe "^2.0.0" 2382 | 2383 | wide-align@^1.1.0: 2384 | version "1.1.3" 2385 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 2386 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 2387 | dependencies: 2388 | string-width "^1.0.2 || 2" 2389 | 2390 | wordwrap@1.0.0: 2391 | version "1.0.0" 2392 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2393 | integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= 2394 | 2395 | wordwrap@~0.0.2: 2396 | version "0.0.3" 2397 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 2398 | integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= 2399 | 2400 | wrap-ansi@^5.0.0: 2401 | version "5.1.0" 2402 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 2403 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 2404 | dependencies: 2405 | ansi-styles "^3.2.0" 2406 | string-width "^3.0.0" 2407 | strip-ansi "^5.0.0" 2408 | 2409 | wrappy@1: 2410 | version "1.0.2" 2411 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2412 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2413 | 2414 | xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: 2415 | version "4.0.2" 2416 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 2417 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 2418 | 2419 | y18n@^4.0.0: 2420 | version "4.0.0" 2421 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 2422 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 2423 | 2424 | yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: 2425 | version "3.0.3" 2426 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" 2427 | integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== 2428 | 2429 | zen-observable@^0.8.14: 2430 | version "0.8.14" 2431 | resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.14.tgz#d33058359d335bc0db1f0af66158b32872af3bf7" 2432 | integrity sha512-kQz39uonEjEESwh+qCi83kcC3rZJGh4mrZW7xjkSQYXkq//JZHTtKo+6yuVloTgMtzsIWOJrjIrKvk/dqm0L5g== 2433 | --------------------------------------------------------------------------------