├── .gitignore ├── LICENSE ├── README.md ├── bower.json ├── package-lock.json ├── package.json ├── packages.dhall ├── spago.dhall ├── src └── Data │ ├── DotLang.purs │ └── DotLang │ ├── Attr.purs │ ├── Attr │ ├── Edge.purs │ ├── Global.purs │ └── Node.purs │ └── Class.purs ├── test.dhall └── test └── Main.purs /.gitignore: -------------------------------------------------------------------------------- 1 | /bower_components/ 2 | /node_modules/ 3 | /.pulp-cache/ 4 | /output/ 5 | /generated-docs/ 6 | /.psc-package/ 7 | /.psc* 8 | /.purs* 9 | /.psa* 10 | /.spago 11 | /generated-doctests -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 csicar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Dot-Lang 2 | ======== 3 | 4 | documentation can be found on [pursuit](https://pursuit.purescript.org/packages/purescript-dotlang/1.1.0/docs/Data.DotLang#t:DotLang) 5 | 6 | define your model like this: 7 | 8 | ```purescript run 9 | > import Data.DotLang 10 | > import Data.DotLang.Attr (FillStyle(..)) 11 | > import Data.DotLang.Attr.Node as Node 12 | > import Data.DotLang.Attr.Edge as Edge 13 | > import Color.Scheme.HTML (red) 14 | > exampleGraph = DiGraph [ 15 | node "a" [ Node.Shape Node.Diamond, Node.Style Filled, Node.FillColor red ], 16 | node "b" [], 17 | "a" ==> "b", 18 | "a" =*> "d" $ [ Edge.FillColor red ], 19 | Subgraph [ 20 | node "d" [] 21 | ] 22 | ] 23 | > -- can be turned into a dotlang using `toText` 24 | > import Data.DotLang.Class (toText) 25 | > toText exampleGraph 26 | "digraph {a [shape=diamond, style=filled, fillcolor=\"#ff0000\"]; b []; a -> b; a -> d [fillcolor=\"#ff0000\"]; subgraph { d []; }}" 27 | ``` 28 | 29 | ### Installation 30 | 31 | #### Spago 32 | 33 | ```dhall 34 | let additions = 35 | { dotlang = 36 | { dependencies = 37 | [ "colors" 38 | , "console" 39 | , "effect" 40 | , "generics-rep" 41 | , "prelude" 42 | , "psci-support" 43 | , "strings" 44 | , "test-unit" 45 | ] 46 | , repo = "https://github.com/csicar/purescript-dotlang.git" 47 | , version = "v2.0.0" 48 | } 49 | } 50 | ``` 51 | ```bash 52 | spago install dotlang 53 | ``` 54 | 55 | #### Bower 56 | 57 | ```bash 58 | bower i purescript-dotlang 59 | ``` 60 | 61 | 62 | 63 | Changelog 64 | ========= 65 | 66 | v3.0.0 67 | ------ 68 | 69 | Breaking Changes: 70 | 71 | - `Label` of `Edge` and `Node` now support HTML and no formatting: To **migrate** replace old calls to `Label` with calls to `label` -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "purescript-dotlang", 3 | "license": [ 4 | "MIT" 5 | ], 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/csicar/purescript-dotlang.git" 9 | }, 10 | "ignore": [ 11 | "**/.*", 12 | "node_modules", 13 | "bower_components", 14 | "output" 15 | ], 16 | "dependencies": { 17 | "purescript-arrays": "^v6.0.0", 18 | "purescript-colors": "^v6.0.0", 19 | "purescript-console": "^v5.0.0", 20 | "purescript-effect": "^v3.0.0", 21 | "purescript-maybe": "^v5.0.0", 22 | "purescript-prelude": "^v5.0.0", 23 | "purescript-psci-support": "^v5.0.0", 24 | "purescript-strings": "^v5.0.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "purescript-dotlang", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "JSONStream": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 10 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 11 | "requires": { 12 | "jsonparse": "^1.2.0", 13 | "through": ">=2.2.7 <3" 14 | } 15 | }, 16 | "acorn": { 17 | "version": "6.1.1", 18 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", 19 | "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" 20 | }, 21 | "acorn-dynamic-import": { 22 | "version": "4.0.0", 23 | "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", 24 | "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" 25 | }, 26 | "acorn-node": { 27 | "version": "1.7.0", 28 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.7.0.tgz", 29 | "integrity": "sha512-XhahLSsCB6X6CJbe+uNu3Mn9sJBNFxtBN9NLgAOQovfS6Kh0lDUtmlclhjn9CvEK7A7YyRU13PXlNcpSiLI9Yw==", 30 | "requires": { 31 | "acorn": "^6.1.1", 32 | "acorn-dynamic-import": "^4.0.0", 33 | "acorn-walk": "^6.1.1", 34 | "xtend": "^4.0.1" 35 | } 36 | }, 37 | "acorn-walk": { 38 | "version": "6.1.1", 39 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", 40 | "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" 41 | }, 42 | "ajv": { 43 | "version": "6.12.5", 44 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", 45 | "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", 46 | "requires": { 47 | "fast-deep-equal": "^3.1.1", 48 | "fast-json-stable-stringify": "^2.0.0", 49 | "json-schema-traverse": "^0.4.1", 50 | "uri-js": "^4.2.2" 51 | } 52 | }, 53 | "array-filter": { 54 | "version": "0.0.1", 55 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", 56 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" 57 | }, 58 | "array-map": { 59 | "version": "0.0.0", 60 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", 61 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" 62 | }, 63 | "array-reduce": { 64 | "version": "0.0.0", 65 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", 66 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" 67 | }, 68 | "asn1": { 69 | "version": "0.2.4", 70 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 71 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 72 | "requires": { 73 | "safer-buffer": "~2.1.0" 74 | } 75 | }, 76 | "asn1.js": { 77 | "version": "4.10.1", 78 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", 79 | "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", 80 | "requires": { 81 | "bn.js": "^4.0.0", 82 | "inherits": "^2.0.1", 83 | "minimalistic-assert": "^1.0.0" 84 | } 85 | }, 86 | "assert": { 87 | "version": "1.5.0", 88 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", 89 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", 90 | "requires": { 91 | "object-assign": "^4.1.1", 92 | "util": "0.10.3" 93 | }, 94 | "dependencies": { 95 | "inherits": { 96 | "version": "2.0.1", 97 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 98 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" 99 | }, 100 | "util": { 101 | "version": "0.10.3", 102 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 103 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 104 | "requires": { 105 | "inherits": "2.0.1" 106 | } 107 | } 108 | } 109 | }, 110 | "assert-plus": { 111 | "version": "1.0.0", 112 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 113 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 114 | }, 115 | "async": { 116 | "version": "1.5.2", 117 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 118 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 119 | }, 120 | "asynckit": { 121 | "version": "0.4.0", 122 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 123 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 124 | }, 125 | "aws-sign2": { 126 | "version": "0.7.0", 127 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 128 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 129 | }, 130 | "aws4": { 131 | "version": "1.10.1", 132 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", 133 | "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" 134 | }, 135 | "balanced-match": { 136 | "version": "1.0.0", 137 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 138 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 139 | }, 140 | "base64-js": { 141 | "version": "1.3.0", 142 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 143 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" 144 | }, 145 | "bcrypt-pbkdf": { 146 | "version": "1.0.2", 147 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 148 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 149 | "requires": { 150 | "tweetnacl": "^0.14.3" 151 | } 152 | }, 153 | "bn.js": { 154 | "version": "4.11.8", 155 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", 156 | "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" 157 | }, 158 | "brace-expansion": { 159 | "version": "1.1.11", 160 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 161 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 162 | "requires": { 163 | "balanced-match": "^1.0.0", 164 | "concat-map": "0.0.1" 165 | } 166 | }, 167 | "brorand": { 168 | "version": "1.1.0", 169 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 170 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" 171 | }, 172 | "browser-pack": { 173 | "version": "6.1.0", 174 | "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", 175 | "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", 176 | "requires": { 177 | "JSONStream": "^1.0.3", 178 | "combine-source-map": "~0.8.0", 179 | "defined": "^1.0.0", 180 | "safe-buffer": "^5.1.1", 181 | "through2": "^2.0.0", 182 | "umd": "^3.0.0" 183 | } 184 | }, 185 | "browser-resolve": { 186 | "version": "1.11.3", 187 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", 188 | "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", 189 | "requires": { 190 | "resolve": "1.1.7" 191 | }, 192 | "dependencies": { 193 | "resolve": { 194 | "version": "1.1.7", 195 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 196 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" 197 | } 198 | } 199 | }, 200 | "browserify": { 201 | "version": "16.2.3", 202 | "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", 203 | "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", 204 | "requires": { 205 | "JSONStream": "^1.0.3", 206 | "assert": "^1.4.0", 207 | "browser-pack": "^6.0.1", 208 | "browser-resolve": "^1.11.0", 209 | "browserify-zlib": "~0.2.0", 210 | "buffer": "^5.0.2", 211 | "cached-path-relative": "^1.0.0", 212 | "concat-stream": "^1.6.0", 213 | "console-browserify": "^1.1.0", 214 | "constants-browserify": "~1.0.0", 215 | "crypto-browserify": "^3.0.0", 216 | "defined": "^1.0.0", 217 | "deps-sort": "^2.0.0", 218 | "domain-browser": "^1.2.0", 219 | "duplexer2": "~0.1.2", 220 | "events": "^2.0.0", 221 | "glob": "^7.1.0", 222 | "has": "^1.0.0", 223 | "htmlescape": "^1.1.0", 224 | "https-browserify": "^1.0.0", 225 | "inherits": "~2.0.1", 226 | "insert-module-globals": "^7.0.0", 227 | "labeled-stream-splicer": "^2.0.0", 228 | "mkdirp": "^0.5.0", 229 | "module-deps": "^6.0.0", 230 | "os-browserify": "~0.3.0", 231 | "parents": "^1.0.1", 232 | "path-browserify": "~0.0.0", 233 | "process": "~0.11.0", 234 | "punycode": "^1.3.2", 235 | "querystring-es3": "~0.2.0", 236 | "read-only-stream": "^2.0.0", 237 | "readable-stream": "^2.0.2", 238 | "resolve": "^1.1.4", 239 | "shasum": "^1.0.0", 240 | "shell-quote": "^1.6.1", 241 | "stream-browserify": "^2.0.0", 242 | "stream-http": "^2.0.0", 243 | "string_decoder": "^1.1.1", 244 | "subarg": "^1.0.0", 245 | "syntax-error": "^1.1.1", 246 | "through2": "^2.0.0", 247 | "timers-browserify": "^1.0.1", 248 | "tty-browserify": "0.0.1", 249 | "url": "~0.11.0", 250 | "util": "~0.10.1", 251 | "vm-browserify": "^1.0.0", 252 | "xtend": "^4.0.0" 253 | }, 254 | "dependencies": { 255 | "concat-stream": { 256 | "version": "1.6.2", 257 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 258 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 259 | "requires": { 260 | "buffer-from": "^1.0.0", 261 | "inherits": "^2.0.3", 262 | "readable-stream": "^2.2.2", 263 | "typedarray": "^0.0.6" 264 | } 265 | } 266 | } 267 | }, 268 | "browserify-aes": { 269 | "version": "1.2.0", 270 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 271 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 272 | "requires": { 273 | "buffer-xor": "^1.0.3", 274 | "cipher-base": "^1.0.0", 275 | "create-hash": "^1.1.0", 276 | "evp_bytestokey": "^1.0.3", 277 | "inherits": "^2.0.1", 278 | "safe-buffer": "^5.0.1" 279 | } 280 | }, 281 | "browserify-cache-api": { 282 | "version": "3.0.1", 283 | "resolved": "https://registry.npmjs.org/browserify-cache-api/-/browserify-cache-api-3.0.1.tgz", 284 | "integrity": "sha1-liR+hT8Gj9bg1FzHPwuyzZd47wI=", 285 | "requires": { 286 | "async": "^1.5.2", 287 | "through2": "^2.0.0", 288 | "xtend": "^4.0.0" 289 | } 290 | }, 291 | "browserify-cipher": { 292 | "version": "1.0.1", 293 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 294 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 295 | "requires": { 296 | "browserify-aes": "^1.0.4", 297 | "browserify-des": "^1.0.0", 298 | "evp_bytestokey": "^1.0.0" 299 | } 300 | }, 301 | "browserify-des": { 302 | "version": "1.0.2", 303 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 304 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 305 | "requires": { 306 | "cipher-base": "^1.0.1", 307 | "des.js": "^1.0.0", 308 | "inherits": "^2.0.1", 309 | "safe-buffer": "^5.1.2" 310 | } 311 | }, 312 | "browserify-incremental": { 313 | "version": "3.1.1", 314 | "resolved": "https://registry.npmjs.org/browserify-incremental/-/browserify-incremental-3.1.1.tgz", 315 | "integrity": "sha1-BxPLdYckemMqnwjPG9FpuHi2Koo=", 316 | "requires": { 317 | "JSONStream": "^0.10.0", 318 | "browserify-cache-api": "^3.0.0", 319 | "through2": "^2.0.0", 320 | "xtend": "^4.0.0" 321 | }, 322 | "dependencies": { 323 | "JSONStream": { 324 | "version": "0.10.0", 325 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz", 326 | "integrity": "sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA=", 327 | "requires": { 328 | "jsonparse": "0.0.5", 329 | "through": ">=2.2.7 <3" 330 | } 331 | }, 332 | "jsonparse": { 333 | "version": "0.0.5", 334 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", 335 | "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=" 336 | } 337 | } 338 | }, 339 | "browserify-rsa": { 340 | "version": "4.0.1", 341 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", 342 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", 343 | "requires": { 344 | "bn.js": "^4.1.0", 345 | "randombytes": "^2.0.1" 346 | } 347 | }, 348 | "browserify-sign": { 349 | "version": "4.0.4", 350 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", 351 | "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", 352 | "requires": { 353 | "bn.js": "^4.1.1", 354 | "browserify-rsa": "^4.0.0", 355 | "create-hash": "^1.1.0", 356 | "create-hmac": "^1.1.2", 357 | "elliptic": "^6.0.0", 358 | "inherits": "^2.0.1", 359 | "parse-asn1": "^5.0.0" 360 | } 361 | }, 362 | "browserify-zlib": { 363 | "version": "0.2.0", 364 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 365 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 366 | "requires": { 367 | "pako": "~1.0.5" 368 | } 369 | }, 370 | "buffer": { 371 | "version": "5.2.1", 372 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", 373 | "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", 374 | "requires": { 375 | "base64-js": "^1.0.2", 376 | "ieee754": "^1.1.4" 377 | } 378 | }, 379 | "buffer-crc32": { 380 | "version": "0.2.13", 381 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 382 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 383 | }, 384 | "buffer-from": { 385 | "version": "1.1.1", 386 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 387 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 388 | }, 389 | "buffer-xor": { 390 | "version": "1.0.3", 391 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 392 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" 393 | }, 394 | "builtin-status-codes": { 395 | "version": "3.0.0", 396 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 397 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" 398 | }, 399 | "cached-path-relative": { 400 | "version": "1.0.2", 401 | "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", 402 | "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" 403 | }, 404 | "caseless": { 405 | "version": "0.12.0", 406 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 407 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 408 | }, 409 | "chownr": { 410 | "version": "1.1.1", 411 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", 412 | "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" 413 | }, 414 | "cipher-base": { 415 | "version": "1.0.4", 416 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 417 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 418 | "requires": { 419 | "inherits": "^2.0.1", 420 | "safe-buffer": "^5.0.1" 421 | } 422 | }, 423 | "colors": { 424 | "version": "1.3.3", 425 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", 426 | "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" 427 | }, 428 | "combine-source-map": { 429 | "version": "0.8.0", 430 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", 431 | "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", 432 | "requires": { 433 | "convert-source-map": "~1.1.0", 434 | "inline-source-map": "~0.6.0", 435 | "lodash.memoize": "~3.0.3", 436 | "source-map": "~0.5.3" 437 | } 438 | }, 439 | "combined-stream": { 440 | "version": "1.0.8", 441 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 442 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 443 | "requires": { 444 | "delayed-stream": "~1.0.0" 445 | } 446 | }, 447 | "concat-map": { 448 | "version": "0.0.1", 449 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 450 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 451 | }, 452 | "concat-stream": { 453 | "version": "2.0.0", 454 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 455 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 456 | "requires": { 457 | "buffer-from": "^1.0.0", 458 | "inherits": "^2.0.3", 459 | "readable-stream": "^3.0.2", 460 | "typedarray": "^0.0.6" 461 | }, 462 | "dependencies": { 463 | "readable-stream": { 464 | "version": "3.4.0", 465 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", 466 | "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", 467 | "requires": { 468 | "inherits": "^2.0.3", 469 | "string_decoder": "^1.1.1", 470 | "util-deprecate": "^1.0.1" 471 | } 472 | } 473 | } 474 | }, 475 | "console-browserify": { 476 | "version": "1.1.0", 477 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 478 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 479 | "requires": { 480 | "date-now": "^0.1.4" 481 | } 482 | }, 483 | "constants-browserify": { 484 | "version": "1.0.0", 485 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 486 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" 487 | }, 488 | "convert-source-map": { 489 | "version": "1.1.3", 490 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", 491 | "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" 492 | }, 493 | "core-util-is": { 494 | "version": "1.0.2", 495 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 496 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 497 | }, 498 | "create-ecdh": { 499 | "version": "4.0.3", 500 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", 501 | "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", 502 | "requires": { 503 | "bn.js": "^4.1.0", 504 | "elliptic": "^6.0.0" 505 | } 506 | }, 507 | "create-hash": { 508 | "version": "1.2.0", 509 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 510 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 511 | "requires": { 512 | "cipher-base": "^1.0.1", 513 | "inherits": "^2.0.1", 514 | "md5.js": "^1.3.4", 515 | "ripemd160": "^2.0.1", 516 | "sha.js": "^2.4.0" 517 | } 518 | }, 519 | "create-hmac": { 520 | "version": "1.1.7", 521 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 522 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 523 | "requires": { 524 | "cipher-base": "^1.0.3", 525 | "create-hash": "^1.1.0", 526 | "inherits": "^2.0.1", 527 | "ripemd160": "^2.0.0", 528 | "safe-buffer": "^5.0.1", 529 | "sha.js": "^2.4.8" 530 | } 531 | }, 532 | "crypto-browserify": { 533 | "version": "3.12.0", 534 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 535 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 536 | "requires": { 537 | "browserify-cipher": "^1.0.0", 538 | "browserify-sign": "^4.0.0", 539 | "create-ecdh": "^4.0.0", 540 | "create-hash": "^1.1.0", 541 | "create-hmac": "^1.1.0", 542 | "diffie-hellman": "^5.0.0", 543 | "inherits": "^2.0.1", 544 | "pbkdf2": "^3.0.3", 545 | "public-encrypt": "^4.0.0", 546 | "randombytes": "^2.0.0", 547 | "randomfill": "^1.0.3" 548 | } 549 | }, 550 | "dash-ast": { 551 | "version": "1.0.0", 552 | "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", 553 | "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" 554 | }, 555 | "dashdash": { 556 | "version": "1.14.1", 557 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 558 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 559 | "requires": { 560 | "assert-plus": "^1.0.0" 561 | } 562 | }, 563 | "date-now": { 564 | "version": "0.1.4", 565 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 566 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" 567 | }, 568 | "debug": { 569 | "version": "3.2.6", 570 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 571 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 572 | "requires": { 573 | "ms": "^2.1.1" 574 | } 575 | }, 576 | "defined": { 577 | "version": "1.0.0", 578 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 579 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 580 | }, 581 | "delayed-stream": { 582 | "version": "1.0.0", 583 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 584 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 585 | }, 586 | "deps-sort": { 587 | "version": "2.0.0", 588 | "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", 589 | "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", 590 | "requires": { 591 | "JSONStream": "^1.0.3", 592 | "shasum": "^1.0.0", 593 | "subarg": "^1.0.0", 594 | "through2": "^2.0.0" 595 | } 596 | }, 597 | "des.js": { 598 | "version": "1.0.0", 599 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", 600 | "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", 601 | "requires": { 602 | "inherits": "^2.0.1", 603 | "minimalistic-assert": "^1.0.0" 604 | } 605 | }, 606 | "detective": { 607 | "version": "5.2.0", 608 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", 609 | "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", 610 | "requires": { 611 | "acorn-node": "^1.6.1", 612 | "defined": "^1.0.0", 613 | "minimist": "^1.1.1" 614 | } 615 | }, 616 | "diffie-hellman": { 617 | "version": "5.0.3", 618 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 619 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 620 | "requires": { 621 | "bn.js": "^4.1.0", 622 | "miller-rabin": "^4.0.0", 623 | "randombytes": "^2.0.0" 624 | } 625 | }, 626 | "domain-browser": { 627 | "version": "1.2.0", 628 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 629 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" 630 | }, 631 | "duplexer2": { 632 | "version": "0.1.4", 633 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 634 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 635 | "requires": { 636 | "readable-stream": "^2.0.2" 637 | } 638 | }, 639 | "ecc-jsbn": { 640 | "version": "0.1.2", 641 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 642 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 643 | "requires": { 644 | "jsbn": "~0.1.0", 645 | "safer-buffer": "^2.1.0" 646 | } 647 | }, 648 | "elliptic": { 649 | "version": "6.4.1", 650 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", 651 | "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", 652 | "requires": { 653 | "bn.js": "^4.4.0", 654 | "brorand": "^1.0.1", 655 | "hash.js": "^1.0.0", 656 | "hmac-drbg": "^1.0.0", 657 | "inherits": "^2.0.1", 658 | "minimalistic-assert": "^1.0.0", 659 | "minimalistic-crypto-utils": "^1.0.0" 660 | } 661 | }, 662 | "es6-promise": { 663 | "version": "3.3.1", 664 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", 665 | "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" 666 | }, 667 | "events": { 668 | "version": "2.1.0", 669 | "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", 670 | "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" 671 | }, 672 | "evp_bytestokey": { 673 | "version": "1.0.3", 674 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 675 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 676 | "requires": { 677 | "md5.js": "^1.3.4", 678 | "safe-buffer": "^5.1.1" 679 | } 680 | }, 681 | "extend": { 682 | "version": "3.0.2", 683 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 684 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 685 | }, 686 | "extsprintf": { 687 | "version": "1.3.0", 688 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 689 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 690 | }, 691 | "fast-deep-equal": { 692 | "version": "3.1.3", 693 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 694 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 695 | }, 696 | "fast-json-stable-stringify": { 697 | "version": "2.1.0", 698 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 699 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 700 | }, 701 | "follow-redirects": { 702 | "version": "1.7.0", 703 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", 704 | "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", 705 | "requires": { 706 | "debug": "^3.2.6" 707 | } 708 | }, 709 | "forever-agent": { 710 | "version": "0.6.1", 711 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 712 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 713 | }, 714 | "form-data": { 715 | "version": "2.3.3", 716 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 717 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 718 | "requires": { 719 | "asynckit": "^0.4.0", 720 | "combined-stream": "^1.0.6", 721 | "mime-types": "^2.1.12" 722 | } 723 | }, 724 | "fs-minipass": { 725 | "version": "1.2.6", 726 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", 727 | "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", 728 | "requires": { 729 | "minipass": "^2.2.1" 730 | } 731 | }, 732 | "fs.realpath": { 733 | "version": "1.0.0", 734 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 735 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 736 | }, 737 | "function-bind": { 738 | "version": "1.1.1", 739 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 740 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 741 | }, 742 | "gaze": { 743 | "version": "1.1.3", 744 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", 745 | "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", 746 | "requires": { 747 | "globule": "^1.0.0" 748 | } 749 | }, 750 | "get-assigned-identifiers": { 751 | "version": "1.2.0", 752 | "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", 753 | "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" 754 | }, 755 | "getpass": { 756 | "version": "0.1.7", 757 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 758 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 759 | "requires": { 760 | "assert-plus": "^1.0.0" 761 | } 762 | }, 763 | "glob": { 764 | "version": "7.1.4", 765 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 766 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 767 | "requires": { 768 | "fs.realpath": "^1.0.0", 769 | "inflight": "^1.0.4", 770 | "inherits": "2", 771 | "minimatch": "^3.0.4", 772 | "once": "^1.3.0", 773 | "path-is-absolute": "^1.0.0" 774 | } 775 | }, 776 | "globule": { 777 | "version": "1.2.1", 778 | "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", 779 | "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", 780 | "requires": { 781 | "glob": "~7.1.1", 782 | "lodash": "~4.17.10", 783 | "minimatch": "~3.0.2" 784 | } 785 | }, 786 | "graceful-fs": { 787 | "version": "4.1.15", 788 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 789 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 790 | }, 791 | "har-schema": { 792 | "version": "2.0.0", 793 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 794 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 795 | }, 796 | "har-validator": { 797 | "version": "5.1.5", 798 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 799 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 800 | "requires": { 801 | "ajv": "^6.12.3", 802 | "har-schema": "^2.0.0" 803 | } 804 | }, 805 | "has": { 806 | "version": "1.0.3", 807 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 808 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 809 | "requires": { 810 | "function-bind": "^1.1.1" 811 | } 812 | }, 813 | "hash-base": { 814 | "version": "3.0.4", 815 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", 816 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", 817 | "requires": { 818 | "inherits": "^2.0.1", 819 | "safe-buffer": "^5.0.1" 820 | } 821 | }, 822 | "hash.js": { 823 | "version": "1.1.7", 824 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 825 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 826 | "requires": { 827 | "inherits": "^2.0.3", 828 | "minimalistic-assert": "^1.0.1" 829 | } 830 | }, 831 | "hmac-drbg": { 832 | "version": "1.0.1", 833 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 834 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 835 | "requires": { 836 | "hash.js": "^1.0.3", 837 | "minimalistic-assert": "^1.0.0", 838 | "minimalistic-crypto-utils": "^1.0.1" 839 | } 840 | }, 841 | "htmlescape": { 842 | "version": "1.1.1", 843 | "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", 844 | "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" 845 | }, 846 | "http-signature": { 847 | "version": "1.2.0", 848 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 849 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 850 | "requires": { 851 | "assert-plus": "^1.0.0", 852 | "jsprim": "^1.2.2", 853 | "sshpk": "^1.7.0" 854 | } 855 | }, 856 | "https-browserify": { 857 | "version": "1.0.0", 858 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 859 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" 860 | }, 861 | "ieee754": { 862 | "version": "1.1.13", 863 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 864 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 865 | }, 866 | "inflight": { 867 | "version": "1.0.6", 868 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 869 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 870 | "requires": { 871 | "once": "^1.3.0", 872 | "wrappy": "1" 873 | } 874 | }, 875 | "inherits": { 876 | "version": "2.0.3", 877 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 878 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 879 | }, 880 | "inline-source-map": { 881 | "version": "0.6.2", 882 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", 883 | "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", 884 | "requires": { 885 | "source-map": "~0.5.3" 886 | } 887 | }, 888 | "insert-module-globals": { 889 | "version": "7.2.0", 890 | "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", 891 | "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", 892 | "requires": { 893 | "JSONStream": "^1.0.3", 894 | "acorn-node": "^1.5.2", 895 | "combine-source-map": "^0.8.0", 896 | "concat-stream": "^1.6.1", 897 | "is-buffer": "^1.1.0", 898 | "path-is-absolute": "^1.0.1", 899 | "process": "~0.11.0", 900 | "through2": "^2.0.0", 901 | "undeclared-identifiers": "^1.1.2", 902 | "xtend": "^4.0.0" 903 | }, 904 | "dependencies": { 905 | "concat-stream": { 906 | "version": "1.6.2", 907 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 908 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 909 | "requires": { 910 | "buffer-from": "^1.0.0", 911 | "inherits": "^2.0.3", 912 | "readable-stream": "^2.2.2", 913 | "typedarray": "^0.0.6" 914 | } 915 | } 916 | } 917 | }, 918 | "interpret": { 919 | "version": "1.2.0", 920 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", 921 | "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" 922 | }, 923 | "is-buffer": { 924 | "version": "1.1.6", 925 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 926 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 927 | }, 928 | "is-typedarray": { 929 | "version": "1.0.0", 930 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 931 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 932 | }, 933 | "isarray": { 934 | "version": "1.0.0", 935 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 936 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 937 | }, 938 | "isexe": { 939 | "version": "2.0.0", 940 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 941 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 942 | }, 943 | "isstream": { 944 | "version": "0.1.2", 945 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 946 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 947 | }, 948 | "jsbn": { 949 | "version": "0.1.1", 950 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 951 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 952 | }, 953 | "json-schema": { 954 | "version": "0.2.3", 955 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 956 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 957 | }, 958 | "json-schema-traverse": { 959 | "version": "0.4.1", 960 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 961 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 962 | }, 963 | "json-stable-stringify": { 964 | "version": "0.0.1", 965 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", 966 | "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", 967 | "requires": { 968 | "jsonify": "~0.0.0" 969 | } 970 | }, 971 | "json-stringify-safe": { 972 | "version": "5.0.1", 973 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 974 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 975 | }, 976 | "jsonify": { 977 | "version": "0.0.0", 978 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 979 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 980 | }, 981 | "jsonparse": { 982 | "version": "1.3.1", 983 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 984 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" 985 | }, 986 | "jsprim": { 987 | "version": "1.4.1", 988 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 989 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 990 | "requires": { 991 | "assert-plus": "1.0.0", 992 | "extsprintf": "1.3.0", 993 | "json-schema": "0.2.3", 994 | "verror": "1.10.0" 995 | } 996 | }, 997 | "labeled-stream-splicer": { 998 | "version": "2.0.2", 999 | "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", 1000 | "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", 1001 | "requires": { 1002 | "inherits": "^2.0.1", 1003 | "stream-splicer": "^2.0.0" 1004 | } 1005 | }, 1006 | "lodash": { 1007 | "version": "4.17.11", 1008 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 1009 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 1010 | }, 1011 | "lodash.memoize": { 1012 | "version": "3.0.4", 1013 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", 1014 | "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" 1015 | }, 1016 | "md5.js": { 1017 | "version": "1.3.5", 1018 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 1019 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 1020 | "requires": { 1021 | "hash-base": "^3.0.0", 1022 | "inherits": "^2.0.1", 1023 | "safe-buffer": "^5.1.2" 1024 | } 1025 | }, 1026 | "miller-rabin": { 1027 | "version": "4.0.1", 1028 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 1029 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 1030 | "requires": { 1031 | "bn.js": "^4.0.0", 1032 | "brorand": "^1.0.1" 1033 | } 1034 | }, 1035 | "mime": { 1036 | "version": "1.6.0", 1037 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1038 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1039 | }, 1040 | "mime-db": { 1041 | "version": "1.44.0", 1042 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 1043 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 1044 | }, 1045 | "mime-types": { 1046 | "version": "2.1.27", 1047 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 1048 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 1049 | "requires": { 1050 | "mime-db": "1.44.0" 1051 | } 1052 | }, 1053 | "minimalistic-assert": { 1054 | "version": "1.0.1", 1055 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 1056 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 1057 | }, 1058 | "minimalistic-crypto-utils": { 1059 | "version": "1.0.1", 1060 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1061 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" 1062 | }, 1063 | "minimatch": { 1064 | "version": "3.0.4", 1065 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1066 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1067 | "requires": { 1068 | "brace-expansion": "^1.1.7" 1069 | } 1070 | }, 1071 | "minimist": { 1072 | "version": "1.2.0", 1073 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1074 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 1075 | }, 1076 | "minipass": { 1077 | "version": "2.3.5", 1078 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", 1079 | "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", 1080 | "requires": { 1081 | "safe-buffer": "^5.1.2", 1082 | "yallist": "^3.0.0" 1083 | } 1084 | }, 1085 | "minizlib": { 1086 | "version": "1.2.1", 1087 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", 1088 | "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", 1089 | "requires": { 1090 | "minipass": "^2.2.1" 1091 | } 1092 | }, 1093 | "mkdirp": { 1094 | "version": "0.5.1", 1095 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1096 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1097 | "requires": { 1098 | "minimist": "0.0.8" 1099 | }, 1100 | "dependencies": { 1101 | "minimist": { 1102 | "version": "0.0.8", 1103 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1104 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 1105 | } 1106 | } 1107 | }, 1108 | "module-deps": { 1109 | "version": "6.2.1", 1110 | "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz", 1111 | "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==", 1112 | "requires": { 1113 | "JSONStream": "^1.0.3", 1114 | "browser-resolve": "^1.7.0", 1115 | "cached-path-relative": "^1.0.2", 1116 | "concat-stream": "~1.6.0", 1117 | "defined": "^1.0.0", 1118 | "detective": "^5.0.2", 1119 | "duplexer2": "^0.1.2", 1120 | "inherits": "^2.0.1", 1121 | "parents": "^1.0.0", 1122 | "readable-stream": "^2.0.2", 1123 | "resolve": "^1.4.0", 1124 | "stream-combiner2": "^1.1.1", 1125 | "subarg": "^1.0.0", 1126 | "through2": "^2.0.0", 1127 | "xtend": "^4.0.0" 1128 | }, 1129 | "dependencies": { 1130 | "concat-stream": { 1131 | "version": "1.6.2", 1132 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 1133 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 1134 | "requires": { 1135 | "buffer-from": "^1.0.0", 1136 | "inherits": "^2.0.3", 1137 | "readable-stream": "^2.2.2", 1138 | "typedarray": "^0.0.6" 1139 | } 1140 | } 1141 | } 1142 | }, 1143 | "mold-source-map": { 1144 | "version": "0.4.0", 1145 | "resolved": "https://registry.npmjs.org/mold-source-map/-/mold-source-map-0.4.0.tgz", 1146 | "integrity": "sha1-z2fgsxxHq5uttcnCVlGGISe7gxc=", 1147 | "requires": { 1148 | "convert-source-map": "^1.1.0", 1149 | "through": "~2.2.7" 1150 | }, 1151 | "dependencies": { 1152 | "through": { 1153 | "version": "2.2.7", 1154 | "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", 1155 | "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=" 1156 | } 1157 | } 1158 | }, 1159 | "ms": { 1160 | "version": "2.1.2", 1161 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1162 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1163 | }, 1164 | "mute-stream": { 1165 | "version": "0.0.8", 1166 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1167 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 1168 | }, 1169 | "node-static": { 1170 | "version": "0.7.11", 1171 | "resolved": "https://registry.npmjs.org/node-static/-/node-static-0.7.11.tgz", 1172 | "integrity": "sha512-zfWC/gICcqb74D9ndyvxZWaI1jzcoHmf4UTHWQchBNuNMxdBLJMDiUgZ1tjGLEIe/BMhj2DxKD8HOuc2062pDQ==", 1173 | "requires": { 1174 | "colors": ">=0.6.0", 1175 | "mime": "^1.2.9", 1176 | "optimist": ">=0.3.4" 1177 | } 1178 | }, 1179 | "oauth-sign": { 1180 | "version": "0.9.0", 1181 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1182 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1183 | }, 1184 | "object-assign": { 1185 | "version": "4.1.1", 1186 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1187 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1188 | }, 1189 | "once": { 1190 | "version": "1.4.0", 1191 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1192 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1193 | "requires": { 1194 | "wrappy": "1" 1195 | } 1196 | }, 1197 | "optimist": { 1198 | "version": "0.6.1", 1199 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1200 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1201 | "requires": { 1202 | "minimist": "~0.0.1", 1203 | "wordwrap": "~0.0.2" 1204 | }, 1205 | "dependencies": { 1206 | "minimist": { 1207 | "version": "0.0.10", 1208 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 1209 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" 1210 | }, 1211 | "wordwrap": { 1212 | "version": "0.0.3", 1213 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 1214 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 1215 | } 1216 | } 1217 | }, 1218 | "os-browserify": { 1219 | "version": "0.3.0", 1220 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 1221 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" 1222 | }, 1223 | "pako": { 1224 | "version": "1.0.10", 1225 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", 1226 | "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" 1227 | }, 1228 | "parents": { 1229 | "version": "1.0.1", 1230 | "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", 1231 | "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", 1232 | "requires": { 1233 | "path-platform": "~0.11.15" 1234 | } 1235 | }, 1236 | "parse-asn1": { 1237 | "version": "5.1.4", 1238 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", 1239 | "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", 1240 | "requires": { 1241 | "asn1.js": "^4.0.0", 1242 | "browserify-aes": "^1.0.0", 1243 | "create-hash": "^1.1.0", 1244 | "evp_bytestokey": "^1.0.0", 1245 | "pbkdf2": "^3.0.3", 1246 | "safe-buffer": "^5.1.1" 1247 | } 1248 | }, 1249 | "path-browserify": { 1250 | "version": "0.0.1", 1251 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 1252 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" 1253 | }, 1254 | "path-is-absolute": { 1255 | "version": "1.0.1", 1256 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1257 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1258 | }, 1259 | "path-parse": { 1260 | "version": "1.0.6", 1261 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1262 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 1263 | }, 1264 | "path-platform": { 1265 | "version": "0.11.15", 1266 | "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", 1267 | "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" 1268 | }, 1269 | "pbkdf2": { 1270 | "version": "3.0.17", 1271 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", 1272 | "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", 1273 | "requires": { 1274 | "create-hash": "^1.1.2", 1275 | "create-hmac": "^1.1.4", 1276 | "ripemd160": "^2.0.1", 1277 | "safe-buffer": "^5.0.1", 1278 | "sha.js": "^2.4.8" 1279 | } 1280 | }, 1281 | "performance-now": { 1282 | "version": "2.1.0", 1283 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1284 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1285 | }, 1286 | "process": { 1287 | "version": "0.11.10", 1288 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1289 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" 1290 | }, 1291 | "process-nextick-args": { 1292 | "version": "2.0.0", 1293 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1294 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 1295 | }, 1296 | "psc-package": { 1297 | "version": "3.0.1", 1298 | "resolved": "https://registry.npmjs.org/psc-package/-/psc-package-3.0.1.tgz", 1299 | "integrity": "sha512-lBA0vXzxeoftzbtpfgZqr2t0rzzecQ9uCXCQOLd74t+5Z72/HP/u7MRNtx8gyBDdLccY90xdjRfSXYwVrdDvgQ==", 1300 | "requires": { 1301 | "follow-redirects": "^1.5.9", 1302 | "shelljs": "^0.8.2", 1303 | "tar": "^4.4.8" 1304 | } 1305 | }, 1306 | "psl": { 1307 | "version": "1.8.0", 1308 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1309 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 1310 | }, 1311 | "public-encrypt": { 1312 | "version": "4.0.3", 1313 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 1314 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 1315 | "requires": { 1316 | "bn.js": "^4.1.0", 1317 | "browserify-rsa": "^4.0.0", 1318 | "create-hash": "^1.1.0", 1319 | "parse-asn1": "^5.0.0", 1320 | "randombytes": "^2.0.1", 1321 | "safe-buffer": "^5.1.2" 1322 | } 1323 | }, 1324 | "pulp": { 1325 | "version": "13.0.0", 1326 | "resolved": "https://registry.npmjs.org/pulp/-/pulp-13.0.0.tgz", 1327 | "integrity": "sha512-wjjAVuN1Shx6783NvTd8aPwWZ1pE94+isiWtdAJhedvbLqJuwe8p5CSNul9FS0WvBz7ejdrW0vc6wLDLsKX7Yw==", 1328 | "requires": { 1329 | "browserify": "^16.2.3", 1330 | "browserify-incremental": "^3.1.1", 1331 | "concat-stream": "^2.0.0", 1332 | "gaze": "^1.1.3", 1333 | "glob": "^7.1.3", 1334 | "mold-source-map": "^0.4.0", 1335 | "node-static": "^0.7.11", 1336 | "read": "^1.0.7", 1337 | "sorcery": "^0.10.0", 1338 | "temp": "^0.9.0", 1339 | "through": "^2.3.8", 1340 | "tree-kill": "^1.2.1", 1341 | "which": "^1.3.1", 1342 | "wordwrap": "1.0.0" 1343 | } 1344 | }, 1345 | "punycode": { 1346 | "version": "1.4.1", 1347 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1348 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1349 | }, 1350 | "purescript-doctest": { 1351 | "version": "0.1.5", 1352 | "resolved": "https://registry.npmjs.org/purescript-doctest/-/purescript-doctest-0.1.5.tgz", 1353 | "integrity": "sha512-zDuokC2Si83xg6Ubz+0ZBwHMdVbcxoj1zDmoDx8XhjH3l1NZetzntV4RuExltU5zUhHyl+5NXAyIlB2zUY4GDQ==", 1354 | "requires": { 1355 | "request": "^2.88.0", 1356 | "tar": "^4.4.8" 1357 | } 1358 | }, 1359 | "purp": { 1360 | "version": "1.0.0", 1361 | "resolved": "https://registry.npmjs.org/purp/-/purp-1.0.0.tgz", 1362 | "integrity": "sha512-QKEvP17kuUp8BWw4ql4FH1oHC5RKRWwSKoDmas49hMH0+CrPmNaaqytsHNayKVHCC1o9zhTNlyQRSQuD1GOYJA==" 1363 | }, 1364 | "purty": { 1365 | "version": "6.2.0", 1366 | "resolved": "https://registry.npmjs.org/purty/-/purty-6.2.0.tgz", 1367 | "integrity": "sha512-JfT8kJHSyxuOFQtRiH2x55SiPxXZsSdedQlZap8JehQ7KzB49B5C9cWwVybtSB36BdADQcxPvtw8D52z4EPnBw==" 1368 | }, 1369 | "qs": { 1370 | "version": "6.5.2", 1371 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1372 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1373 | }, 1374 | "querystring": { 1375 | "version": "0.2.0", 1376 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1377 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" 1378 | }, 1379 | "querystring-es3": { 1380 | "version": "0.2.1", 1381 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 1382 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" 1383 | }, 1384 | "randombytes": { 1385 | "version": "2.1.0", 1386 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1387 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1388 | "requires": { 1389 | "safe-buffer": "^5.1.0" 1390 | } 1391 | }, 1392 | "randomfill": { 1393 | "version": "1.0.4", 1394 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 1395 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 1396 | "requires": { 1397 | "randombytes": "^2.0.5", 1398 | "safe-buffer": "^5.1.0" 1399 | } 1400 | }, 1401 | "read": { 1402 | "version": "1.0.7", 1403 | "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", 1404 | "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", 1405 | "requires": { 1406 | "mute-stream": "~0.0.4" 1407 | } 1408 | }, 1409 | "read-only-stream": { 1410 | "version": "2.0.0", 1411 | "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", 1412 | "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", 1413 | "requires": { 1414 | "readable-stream": "^2.0.2" 1415 | } 1416 | }, 1417 | "readable-stream": { 1418 | "version": "2.3.6", 1419 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1420 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1421 | "requires": { 1422 | "core-util-is": "~1.0.0", 1423 | "inherits": "~2.0.3", 1424 | "isarray": "~1.0.0", 1425 | "process-nextick-args": "~2.0.0", 1426 | "safe-buffer": "~5.1.1", 1427 | "string_decoder": "~1.1.1", 1428 | "util-deprecate": "~1.0.1" 1429 | }, 1430 | "dependencies": { 1431 | "string_decoder": { 1432 | "version": "1.1.1", 1433 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1434 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1435 | "requires": { 1436 | "safe-buffer": "~5.1.0" 1437 | } 1438 | } 1439 | } 1440 | }, 1441 | "rechoir": { 1442 | "version": "0.6.2", 1443 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1444 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 1445 | "requires": { 1446 | "resolve": "^1.1.6" 1447 | } 1448 | }, 1449 | "request": { 1450 | "version": "2.88.2", 1451 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1452 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1453 | "requires": { 1454 | "aws-sign2": "~0.7.0", 1455 | "aws4": "^1.8.0", 1456 | "caseless": "~0.12.0", 1457 | "combined-stream": "~1.0.6", 1458 | "extend": "~3.0.2", 1459 | "forever-agent": "~0.6.1", 1460 | "form-data": "~2.3.2", 1461 | "har-validator": "~5.1.3", 1462 | "http-signature": "~1.2.0", 1463 | "is-typedarray": "~1.0.0", 1464 | "isstream": "~0.1.2", 1465 | "json-stringify-safe": "~5.0.1", 1466 | "mime-types": "~2.1.19", 1467 | "oauth-sign": "~0.9.0", 1468 | "performance-now": "^2.1.0", 1469 | "qs": "~6.5.2", 1470 | "safe-buffer": "^5.1.2", 1471 | "tough-cookie": "~2.5.0", 1472 | "tunnel-agent": "^0.6.0", 1473 | "uuid": "^3.3.2" 1474 | } 1475 | }, 1476 | "resolve": { 1477 | "version": "1.11.0", 1478 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", 1479 | "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", 1480 | "requires": { 1481 | "path-parse": "^1.0.6" 1482 | } 1483 | }, 1484 | "rimraf": { 1485 | "version": "2.6.3", 1486 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1487 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1488 | "requires": { 1489 | "glob": "^7.1.3" 1490 | } 1491 | }, 1492 | "ripemd160": { 1493 | "version": "2.0.2", 1494 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 1495 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 1496 | "requires": { 1497 | "hash-base": "^3.0.0", 1498 | "inherits": "^2.0.1" 1499 | } 1500 | }, 1501 | "safe-buffer": { 1502 | "version": "5.1.2", 1503 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1504 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1505 | }, 1506 | "safer-buffer": { 1507 | "version": "2.1.2", 1508 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1509 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1510 | }, 1511 | "sander": { 1512 | "version": "0.5.1", 1513 | "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", 1514 | "integrity": "sha1-dB4kXiMfB8r7b98PEzrfohalAq0=", 1515 | "requires": { 1516 | "es6-promise": "^3.1.2", 1517 | "graceful-fs": "^4.1.3", 1518 | "mkdirp": "^0.5.1", 1519 | "rimraf": "^2.5.2" 1520 | } 1521 | }, 1522 | "sha.js": { 1523 | "version": "2.4.11", 1524 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1525 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1526 | "requires": { 1527 | "inherits": "^2.0.1", 1528 | "safe-buffer": "^5.0.1" 1529 | } 1530 | }, 1531 | "shasum": { 1532 | "version": "1.0.2", 1533 | "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", 1534 | "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", 1535 | "requires": { 1536 | "json-stable-stringify": "~0.0.0", 1537 | "sha.js": "~2.4.4" 1538 | } 1539 | }, 1540 | "shell-quote": { 1541 | "version": "1.6.1", 1542 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 1543 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 1544 | "requires": { 1545 | "array-filter": "~0.0.0", 1546 | "array-map": "~0.0.0", 1547 | "array-reduce": "~0.0.0", 1548 | "jsonify": "~0.0.0" 1549 | } 1550 | }, 1551 | "shelljs": { 1552 | "version": "0.8.3", 1553 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", 1554 | "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", 1555 | "requires": { 1556 | "glob": "^7.0.0", 1557 | "interpret": "^1.0.0", 1558 | "rechoir": "^0.6.2" 1559 | } 1560 | }, 1561 | "simple-concat": { 1562 | "version": "1.0.0", 1563 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 1564 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 1565 | }, 1566 | "sorcery": { 1567 | "version": "0.10.0", 1568 | "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", 1569 | "integrity": "sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=", 1570 | "requires": { 1571 | "buffer-crc32": "^0.2.5", 1572 | "minimist": "^1.2.0", 1573 | "sander": "^0.5.0", 1574 | "sourcemap-codec": "^1.3.0" 1575 | } 1576 | }, 1577 | "source-map": { 1578 | "version": "0.5.7", 1579 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1580 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 1581 | }, 1582 | "sourcemap-codec": { 1583 | "version": "1.4.4", 1584 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", 1585 | "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==" 1586 | }, 1587 | "sshpk": { 1588 | "version": "1.16.1", 1589 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1590 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1591 | "requires": { 1592 | "asn1": "~0.2.3", 1593 | "assert-plus": "^1.0.0", 1594 | "bcrypt-pbkdf": "^1.0.0", 1595 | "dashdash": "^1.12.0", 1596 | "ecc-jsbn": "~0.1.1", 1597 | "getpass": "^0.1.1", 1598 | "jsbn": "~0.1.0", 1599 | "safer-buffer": "^2.0.2", 1600 | "tweetnacl": "~0.14.0" 1601 | } 1602 | }, 1603 | "stream-browserify": { 1604 | "version": "2.0.2", 1605 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", 1606 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", 1607 | "requires": { 1608 | "inherits": "~2.0.1", 1609 | "readable-stream": "^2.0.2" 1610 | } 1611 | }, 1612 | "stream-combiner2": { 1613 | "version": "1.1.1", 1614 | "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", 1615 | "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", 1616 | "requires": { 1617 | "duplexer2": "~0.1.0", 1618 | "readable-stream": "^2.0.2" 1619 | } 1620 | }, 1621 | "stream-http": { 1622 | "version": "2.8.3", 1623 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", 1624 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", 1625 | "requires": { 1626 | "builtin-status-codes": "^3.0.0", 1627 | "inherits": "^2.0.1", 1628 | "readable-stream": "^2.3.6", 1629 | "to-arraybuffer": "^1.0.0", 1630 | "xtend": "^4.0.0" 1631 | } 1632 | }, 1633 | "stream-splicer": { 1634 | "version": "2.0.1", 1635 | "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", 1636 | "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", 1637 | "requires": { 1638 | "inherits": "^2.0.1", 1639 | "readable-stream": "^2.0.2" 1640 | } 1641 | }, 1642 | "string_decoder": { 1643 | "version": "1.2.0", 1644 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", 1645 | "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", 1646 | "requires": { 1647 | "safe-buffer": "~5.1.0" 1648 | } 1649 | }, 1650 | "subarg": { 1651 | "version": "1.0.0", 1652 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 1653 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", 1654 | "requires": { 1655 | "minimist": "^1.1.0" 1656 | } 1657 | }, 1658 | "syntax-error": { 1659 | "version": "1.4.0", 1660 | "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", 1661 | "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", 1662 | "requires": { 1663 | "acorn-node": "^1.2.0" 1664 | } 1665 | }, 1666 | "tar": { 1667 | "version": "4.4.10", 1668 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", 1669 | "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", 1670 | "requires": { 1671 | "chownr": "^1.1.1", 1672 | "fs-minipass": "^1.2.5", 1673 | "minipass": "^2.3.5", 1674 | "minizlib": "^1.2.1", 1675 | "mkdirp": "^0.5.0", 1676 | "safe-buffer": "^5.1.2", 1677 | "yallist": "^3.0.3" 1678 | } 1679 | }, 1680 | "temp": { 1681 | "version": "0.9.0", 1682 | "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.0.tgz", 1683 | "integrity": "sha512-YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ==", 1684 | "requires": { 1685 | "rimraf": "~2.6.2" 1686 | } 1687 | }, 1688 | "through": { 1689 | "version": "2.3.8", 1690 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1691 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1692 | }, 1693 | "through2": { 1694 | "version": "2.0.5", 1695 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1696 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1697 | "requires": { 1698 | "readable-stream": "~2.3.6", 1699 | "xtend": "~4.0.1" 1700 | } 1701 | }, 1702 | "timers-browserify": { 1703 | "version": "1.4.2", 1704 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", 1705 | "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", 1706 | "requires": { 1707 | "process": "~0.11.0" 1708 | } 1709 | }, 1710 | "to-arraybuffer": { 1711 | "version": "1.0.1", 1712 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 1713 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" 1714 | }, 1715 | "tough-cookie": { 1716 | "version": "2.5.0", 1717 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1718 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1719 | "requires": { 1720 | "psl": "^1.1.28", 1721 | "punycode": "^2.1.1" 1722 | }, 1723 | "dependencies": { 1724 | "punycode": { 1725 | "version": "2.1.1", 1726 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1727 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1728 | } 1729 | } 1730 | }, 1731 | "tree-kill": { 1732 | "version": "1.2.1", 1733 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", 1734 | "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==" 1735 | }, 1736 | "tty-browserify": { 1737 | "version": "0.0.1", 1738 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", 1739 | "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" 1740 | }, 1741 | "tunnel-agent": { 1742 | "version": "0.6.0", 1743 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1744 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1745 | "requires": { 1746 | "safe-buffer": "^5.0.1" 1747 | } 1748 | }, 1749 | "tweetnacl": { 1750 | "version": "0.14.5", 1751 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1752 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1753 | }, 1754 | "typedarray": { 1755 | "version": "0.0.6", 1756 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1757 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1758 | }, 1759 | "umd": { 1760 | "version": "3.0.3", 1761 | "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", 1762 | "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" 1763 | }, 1764 | "undeclared-identifiers": { 1765 | "version": "1.1.3", 1766 | "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", 1767 | "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", 1768 | "requires": { 1769 | "acorn-node": "^1.3.0", 1770 | "dash-ast": "^1.0.0", 1771 | "get-assigned-identifiers": "^1.2.0", 1772 | "simple-concat": "^1.0.0", 1773 | "xtend": "^4.0.1" 1774 | } 1775 | }, 1776 | "uri-js": { 1777 | "version": "4.4.0", 1778 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", 1779 | "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", 1780 | "requires": { 1781 | "punycode": "^2.1.0" 1782 | }, 1783 | "dependencies": { 1784 | "punycode": { 1785 | "version": "2.1.1", 1786 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1787 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1788 | } 1789 | } 1790 | }, 1791 | "url": { 1792 | "version": "0.11.0", 1793 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 1794 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 1795 | "requires": { 1796 | "punycode": "1.3.2", 1797 | "querystring": "0.2.0" 1798 | }, 1799 | "dependencies": { 1800 | "punycode": { 1801 | "version": "1.3.2", 1802 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1803 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" 1804 | } 1805 | } 1806 | }, 1807 | "util": { 1808 | "version": "0.10.4", 1809 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", 1810 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", 1811 | "requires": { 1812 | "inherits": "2.0.3" 1813 | } 1814 | }, 1815 | "util-deprecate": { 1816 | "version": "1.0.2", 1817 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1818 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1819 | }, 1820 | "uuid": { 1821 | "version": "3.4.0", 1822 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1823 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 1824 | }, 1825 | "verror": { 1826 | "version": "1.10.0", 1827 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1828 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1829 | "requires": { 1830 | "assert-plus": "^1.0.0", 1831 | "core-util-is": "1.0.2", 1832 | "extsprintf": "^1.2.0" 1833 | } 1834 | }, 1835 | "vm-browserify": { 1836 | "version": "1.1.0", 1837 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", 1838 | "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" 1839 | }, 1840 | "which": { 1841 | "version": "1.3.1", 1842 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1843 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1844 | "requires": { 1845 | "isexe": "^2.0.0" 1846 | } 1847 | }, 1848 | "wordwrap": { 1849 | "version": "1.0.0", 1850 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1851 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 1852 | }, 1853 | "wrappy": { 1854 | "version": "1.0.2", 1855 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1856 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1857 | }, 1858 | "xtend": { 1859 | "version": "4.0.1", 1860 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1861 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 1862 | }, 1863 | "yallist": { 1864 | "version": "3.0.3", 1865 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", 1866 | "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" 1867 | } 1868 | } 1869 | } 1870 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "purescript-dotlang", 3 | "version": "1.0.0", 4 | "description": "Dot-Lang", 5 | "directories": { 6 | "test": "test" 7 | }, 8 | "dependencies": { 9 | "psc-package": "^3.0.1", 10 | "pulp": "^13.0.0", 11 | "purescript-doctest": "^0.1.5", 12 | "purp": "^1.0.0", 13 | "purty": "^6.2.0" 14 | }, 15 | "devDependencies": {}, 16 | "scripts": { 17 | "test": "npm run doctest:gen && spago -x test.dhall test", 18 | "doctest:gen": "shopt -s globstar && purepur -o generated-doctests --src 'src/**/*.purs' --src './README.md' $(spago sources)" 19 | }, 20 | "repository": { 21 | "type": "git", 22 | "url": "git+https://github.com/csicar/purescript-dotlang.git" 23 | }, 24 | "author": "csicar", 25 | "license": "MIT", 26 | "bugs": { 27 | "url": "https://github.com/csicar/purescript-dotlang/issues" 28 | }, 29 | "homepage": "https://github.com/csicar/purescript-dotlang#readme" 30 | } -------------------------------------------------------------------------------- /packages.dhall: -------------------------------------------------------------------------------- 1 | let upstream = 2 | https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20221127/packages.dhall 3 | sha256:9619da55468363705b888350fdd38735a5e90dab101f8d9193057552c5efccad 4 | 5 | in upstream -------------------------------------------------------------------------------- /spago.dhall: -------------------------------------------------------------------------------- 1 | { name = "dotlang" 2 | , license = "MIT" 3 | , repository = "https://github.com/csicar/purescript-dotlang.git" 4 | , dependencies = 5 | [ "arrays" 6 | , "colors" 7 | , "console" 8 | , "effect" 9 | , "maybe" 10 | , "prelude" 11 | , "psci-support" 12 | , "spec" 13 | , "strings" 14 | ] 15 | , packages = ./packages.dhall 16 | , sources = [ "src/**/*.purs" ] 17 | } 18 | -------------------------------------------------------------------------------- /src/Data/DotLang.purs: -------------------------------------------------------------------------------- 1 | module Data.DotLang where 2 | 3 | import Data.Array (null) 4 | import Data.DotLang.Attr.Edge as Edge 5 | import Data.DotLang.Attr.Global as Global 6 | import Data.DotLang.Attr.Node as Node 7 | import Data.DotLang.Class (class DotLang, toText) 8 | import Data.Generic.Rep (class Generic) 9 | import Data.Maybe (Maybe(..)) 10 | import Data.Show.Generic (genericShow) 11 | import Data.String (joinWith) 12 | import Prelude (class Show, ($), (<$>), (<>)) 13 | 14 | -- | type alias for a Nodes Name 15 | type Id 16 | = String 17 | 18 | -- | Dot-Node 19 | --| ```purescript run 20 | --| > import Data.DotLang 21 | --| > import Data.DotLang.Class (toText) 22 | --| > import Data.DotLang.Attr.Node as Node 23 | --| > toText $ Node "e" [Node.Margin 3, Node.label "some label"] 24 | --| "e [margin=3, label=\"some label\"]" 25 | --| ``` 26 | data Node 27 | = Node Id (Array Node.Attr) 28 | 29 | -- | get a nodes id 30 | --| ```purescript run 31 | --| > nodeId (Node "e" [Node.label "foo"]) 32 | --| "e" 33 | --| ``` 34 | nodeId :: Node -> Id 35 | nodeId (Node id _) = id 36 | 37 | -- | change Nodes id to a new one; keeing the old id as the label 38 | --| ```purescript run 39 | --| > changeNodeId (_ <> "!") (Node "e" []) 40 | --| (Node "e!" [(Label (TextLabel "e"))]) 41 | --| ``` 42 | changeNodeId :: (Id -> Id) -> Node -> Node 43 | changeNodeId f (Node id attr) = Node (f id) $ attr <> [ Node.label id ] 44 | 45 | derive instance genericNode :: Generic Node _ 46 | 47 | instance showNode :: Show Node where 48 | show = genericShow 49 | 50 | instance nodeDotLang :: DotLang Node where 51 | toText (Node id attrs) = id <> " [" <> joinWith ", " (toText <$> attrs) <> "]" 52 | 53 | data EdgeType 54 | = Forward 55 | | Backward 56 | | NoDir 57 | 58 | derive instance genericEdgeType :: Generic EdgeType _ 59 | 60 | instance showEdgeType :: Show EdgeType where 61 | show = genericShow 62 | 63 | instance dotLangEdgeType :: DotLang EdgeType where 64 | toText Forward = "->" 65 | toText Backward = "<-" 66 | toText NoDir = "--" 67 | 68 | -- | egde from id to id 69 | --| ```purescript run 70 | --| > toText $ Edge Forward "a" "b" [] 71 | --| "a -> b" 72 | --| ``` 73 | -- | EdgeType determines the direction of the arrow 74 | data Edge 75 | = Edge EdgeType Id Id (Array Edge.Attr) 76 | 77 | derive instance genericEdge :: Generic Edge _ 78 | 79 | instance showEdge :: Show Edge where 80 | show = genericShow 81 | 82 | instance dotLangEdge :: DotLang Edge where 83 | toText (Edge e id id2 attrs) = id <> " " <> (toText e) <> " " <> id2 <> attrText 84 | where 85 | attrText = if null attrs then "" else " [" <> joinWith ", " (toText <$> attrs) <> "]" 86 | 87 | -- | definition in a graph 88 | data Definition 89 | = Global (Array Global.Attr) 90 | | NodeDef Node 91 | | EdgeDef Edge 92 | | Subgraph (Maybe Id) (Array Definition) 93 | 94 | -- | 95 | --| ```purescript run 96 | --| > import Data.DotLang.Attr.Global as Global 97 | --| > :t global [Global.RankDir Global.FromLeft] 98 | --| Definition 99 | --| ``` 100 | -- | 101 | -- | global as a part of a definition 102 | global :: Array Global.Attr -> Definition 103 | global = Global 104 | 105 | -- | 106 | --| ```purescript run 107 | --| > :t node "a" [] 108 | --| Definition 109 | --| ``` 110 | -- | node as a part of a definition 111 | node :: Id → Array Node.Attr → Definition 112 | node id attrs = NodeDef $ Node id attrs 113 | 114 | -- | 115 | --| ```purescript run 116 | --| > :t edge Forward "a" "b" [] 117 | --| Definition 118 | --| ``` 119 | -- | edge as a part of a definition. 120 | -- | `==>` and `=*>` can also be used for that purpose: 121 | -- | 122 | edge :: EdgeType → Id → Id → Array Edge.Attr → Definition 123 | edge t id id2 attrs = EdgeDef $ Edge t id id2 attrs 124 | 125 | forwardEdgeWithAttrs ∷ Id → Id → Array Edge.Attr → Definition 126 | forwardEdgeWithAttrs = edge Forward 127 | 128 | forwardEdge :: Id → Id → Definition 129 | forwardEdge l r = forwardEdgeWithAttrs l r [] 130 | 131 | backwardEdgeWithAttrs ∷ Id → Id → Array Edge.Attr → Definition 132 | backwardEdgeWithAttrs = edge Backward 133 | 134 | backwardEdge ∷ Id → Id → Definition 135 | backwardEdge l r = backwardEdgeWithAttrs l r [] 136 | 137 | normalEdgeWithAttrs ∷ Id → Id → Array Edge.Attr → Definition 138 | normalEdgeWithAttrs = edge NoDir 139 | 140 | normalEdge ∷ Id → Id → Definition 141 | normalEdge l r = normalEdgeWithAttrs l r [] 142 | 143 | -- | 144 | --| ```purescript run 145 | --| > :t "a" ==> "b" 146 | --| Definition 147 | --| ``` 148 | -- | Forward edge as as a definition 149 | infix 5 forwardEdge as ==> 150 | 151 | -- | 152 | --| ```purescript run 153 | --| > import Data.DotLang.Attr.Edge as Edge 154 | --| > import Color.Scheme.HTML (red) 155 | --| > toText $ "a" =*> "b" $ [ Edge.FillColor red ] 156 | --| "a -> b [fillcolor=\"#ff0000\"]; " 157 | --| ``` 158 | -- | Forward edge with attributes as a definition 159 | infix 5 forwardEdgeWithAttrs as =*> 160 | 161 | -- | 162 | --| ```purescript run 163 | --| > :t "a" <== "b" 164 | --| Definition 165 | --| ``` 166 | -- | Backward edge as a definition 167 | infix 5 backwardEdge as <== 168 | 169 | -- | 170 | --| ```purescript run 171 | --| > :t "a" <*= "b" $ [ Edge.FillColor red ] 172 | --| Definition 173 | --| ``` 174 | -- | Backward edge with attributes as a definition 175 | infix 5 backwardEdgeWithAttrs as <*= 176 | 177 | -- | 178 | --| ```purescript run 179 | --| > toText $ "a" -==- "b" 180 | --| "a -- b; " 181 | --| ``` 182 | -- | Normal edge as definition 183 | infix 5 normalEdge as -==- 184 | 185 | -- | 186 | --| ```purescript run 187 | --| > toText $ "a" =*= "b" $ [ Edge.FillColor red ] 188 | --| "a -- b [fillcolor=\"#ff0000\"]; " 189 | --| ``` 190 | -- | Normal edge with attibutes 191 | infix 5 normalEdgeWithAttrs as =*= 192 | 193 | instance definitionDotlang :: DotLang Definition where 194 | toText (Global attrs) = joinWith "; " (toText <$> attrs) <> "; " 195 | toText (NodeDef n) = toText n <> "; " 196 | toText (EdgeDef e) = toText e <> "; " 197 | toText (Subgraph maybeId defs) = "subgraph " <> toTextId maybeId <> "{ " <> (joinWith "" $ toText <$> defs) <> "}" 198 | where 199 | toTextId Nothing = "" 200 | toTextId (Just id) = "\"" <> id <> "\"" 201 | 202 | -- | graph can either be a graph or digraph 203 | data Graph 204 | = Graph (Array Definition) 205 | | DiGraph (Array Definition) 206 | 207 | instance graphDotLang :: DotLang Graph where 208 | toText (Graph defs) = "graph {" <> (joinWith "" $ toText <$> defs) <> "}" 209 | toText (DiGraph defs) = "digraph {" <> (joinWith "" $ toText <$> defs) <> "}" 210 | 211 | -- | create graph from Nodes and Edges 212 | --| ```purescript run 213 | --| > :t graphFromElements [Node "e" [], Node "d" []] [ Edge Forward "e" "f" []] 214 | --| Graph 215 | --| ``` 216 | -- | 217 | graphFromElements :: Array (Node) -> Array (Edge) -> Graph 218 | graphFromElements n e = DiGraph $ (NodeDef <$> n) <> (EdgeDef <$> e) 219 | 220 | -- | `a` is a type that can be represented by a Dot-Graph 221 | class GraphRepr a where 222 | toGraph :: a -> Graph 223 | -------------------------------------------------------------------------------- /src/Data/DotLang/Attr.purs: -------------------------------------------------------------------------------- 1 | module Data.DotLang.Attr where 2 | 3 | import Prelude 4 | 5 | import Data.DotLang.Class (class DotLang) 6 | import Data.Generic.Rep (class Generic) 7 | import Data.Show.Generic (genericShow) 8 | 9 | data FillStyle 10 | = Filled 11 | | Dotted 12 | | Invis 13 | 14 | derive instance genericFillStyle :: Generic FillStyle _ 15 | 16 | instance showFillStyle :: Show FillStyle where 17 | show = genericShow 18 | 19 | instance fillStyleDotLang :: DotLang FillStyle where 20 | toText Filled = "filled" 21 | toText Dotted = "dotted" 22 | toText Invis = "invis" 23 | 24 | -------------------------------------------------------------------------------- /src/Data/DotLang/Attr/Edge.purs: -------------------------------------------------------------------------------- 1 | module Data.DotLang.Attr.Edge where 2 | 3 | import Prelude 4 | import Color (Color, toHexString) 5 | import Data.DotLang.Attr (FillStyle) 6 | import Data.DotLang.Class (class DotLang, toText) 7 | import Data.Generic.Rep (class Generic) 8 | import Data.Show.Generic (genericShow) 9 | 10 | data LabelValue 11 | = TextLabel String 12 | | HtmlLabel String 13 | 14 | derive instance genericLabel :: Generic LabelValue _ 15 | 16 | instance showLabel :: Show LabelValue where 17 | show = genericShow 18 | 19 | data ArrowHeadStyle 20 | = Normal 21 | | Inv 22 | | Dot 23 | | InvDot 24 | | ODot 25 | | InvODot 26 | | None 27 | | Tee 28 | | Empty 29 | | InvEmpty 30 | | Diamond 31 | | ODiamond 32 | | EDiamond 33 | | Crow 34 | | Box 35 | | OBox 36 | | Open 37 | | HalfOpen 38 | | Vee 39 | 40 | derive instance genericArrowHeadStyle :: Generic ArrowHeadStyle _ 41 | 42 | instance showArrowHeadStyle :: Show ArrowHeadStyle where 43 | show = genericShow 44 | 45 | instance arrowHeadStyle :: DotLang ArrowHeadStyle where 46 | toText Normal = "normal" 47 | toText Inv = "inv" 48 | toText Dot = "dot" 49 | toText InvDot = "invdot" 50 | toText ODot = "odot" 51 | toText InvODot = "invodot" 52 | toText None = "none" 53 | toText Tee = "tee" 54 | toText Empty = "empty" 55 | toText InvEmpty = "invempty" 56 | toText Diamond = "diamond" 57 | toText ODiamond = "odiamond" 58 | toText EDiamond = "ediamond" 59 | toText Crow = "crow" 60 | toText Box = "box" 61 | toText OBox = "obox" 62 | toText Open = "open" 63 | toText HalfOpen = "halfopen" 64 | toText Vee = "vee" 65 | 66 | data Attr 67 | = Color Color 68 | | FontColor Color 69 | | FontSize Int 70 | | Label LabelValue 71 | | Style FillStyle 72 | | FillColor Color 73 | | PenWidth Number 74 | | ArrowHead ArrowHeadStyle 75 | 76 | derive instance genericAttr :: Generic Attr _ 77 | 78 | instance showAttr :: Show Attr where 79 | show = genericShow 80 | 81 | instance attrDotLang :: DotLang Attr where 82 | toText (Color s) = "color=\"" <> toHexString s <> "\"" 83 | toText (FontColor s) = "fontcolor=\"" <> toHexString s <> "\"" 84 | toText (FontSize i) = "fontsize=" <> show i 85 | toText (Style f) = "style=" <> toText f 86 | toText (Label (TextLabel t)) = "label=" <> show t 87 | toText (Label (HtmlLabel t)) = "label=" <> t 88 | toText (FillColor c) = "fillcolor=\"" <> toHexString c <> "\"" 89 | toText (PenWidth i) = "penwidth=" <> show i 90 | toText (ArrowHead s) = "arrowhead=" <> toText s 91 | 92 | -- | 93 | --| ```purescript run 94 | --| > import Data.DotLang.Attr.Edge 95 | --| > :t htmlLabel "
Label
" 96 | --| Attr 97 | --| ``` 98 | -- | htmlLabel as a part of an attribute of an edge. 99 | htmlLabel :: String -> Attr 100 | htmlLabel = HtmlLabel >>> Label 101 | 102 | -- | 103 | --| ```purescript run 104 | --| > :t label "..." 105 | --| Attr 106 | --| ``` 107 | -- | label as a part of an attribute of an edge. 108 | label :: String -> Attr 109 | label = TextLabel >>> Label 110 | -------------------------------------------------------------------------------- /src/Data/DotLang/Attr/Global.purs: -------------------------------------------------------------------------------- 1 | module Data.DotLang.Attr.Global where 2 | 3 | import Prelude 4 | 5 | import Data.DotLang.Class (class DotLang, toText) 6 | import Data.Generic.Rep (class Generic) 7 | import Data.Show.Generic (genericShow) 8 | 9 | data RankDirValue 10 | = FromTop 11 | | FromLeft 12 | | FromBottom 13 | | FromRight 14 | 15 | derive instance genericRankDirVal :: Generic RankDirValue _ 16 | 17 | instance showRankDirValue :: Show RankDirValue where 18 | show = genericShow 19 | 20 | instance rankDirValueDotLang :: DotLang RankDirValue where 21 | toText FromTop = "TB" 22 | toText FromLeft = "LR" 23 | toText FromBottom = "BT" 24 | toText FromRight = "RL" 25 | 26 | -- | Upper-case first character is major order; 27 | -- | lower-case second character is minor order. 28 | data PageDirValue = Bl | Br | Tl | Tr | Rb | Rt | Lb | Lt 29 | 30 | derive instance genericPageDirValue :: Generic PageDirValue _ 31 | 32 | instance showPageDirValue :: Show PageDirValue where 33 | show = genericShow 34 | 35 | instance pageDirValueDotLang :: DotLang PageDirValue where 36 | toText Bl = "BL" 37 | toText Br = "BR" 38 | toText Tl = "TL" 39 | toText Tr = "TR" 40 | toText Rb = "RB" 41 | toText Rt = "RT" 42 | toText Lb = "LB" 43 | toText Lt = "LT" 44 | 45 | data LabelJustValue = L | R 46 | 47 | derive instance Generic LabelJustValue _ 48 | 49 | instance Show LabelJustValue where 50 | show = genericShow 51 | 52 | instance DotLang LabelJustValue where 53 | toText L = "l" 54 | toText R = "r" 55 | 56 | data LabelLocValue = T | B 57 | 58 | derive instance Generic LabelLocValue _ 59 | 60 | instance Show LabelLocValue where 61 | show = genericShow 62 | 63 | instance DotLang LabelLocValue where 64 | toText T = "t" 65 | toText B = "b" 66 | 67 | data StyleValue = Filled | Striped | Rounded 68 | 69 | derive instance Generic StyleValue _ 70 | 71 | instance Show StyleValue where 72 | show = genericShow 73 | 74 | instance DotLang StyleValue where 75 | toText Filled = "filled" 76 | toText Striped = "striped" 77 | toText Rounded = "rounded" 78 | 79 | data Attr 80 | = RankDir RankDirValue 81 | | PageDir PageDirValue 82 | | Label String 83 | | LabelJust LabelJustValue 84 | | LabelLoc LabelLocValue 85 | | Compound Boolean 86 | | Style StyleValue 87 | 88 | derive instance genericAttr :: Generic Attr _ 89 | 90 | instance showAttr :: Show Attr where 91 | show = genericShow 92 | 93 | instance attrDotLang :: DotLang Attr where 94 | toText (RankDir dir) = "rankdir=" <> toText dir 95 | toText (PageDir dir) = "pagedir=" <> toText dir 96 | toText (Label val) = "label=" <> show val 97 | toText (LabelJust val) = "labeljust=" <> toText val 98 | toText (LabelLoc val) = "labelloc=" <> toText val 99 | toText (Compound val) = "compound=" <> show val 100 | toText (Style val) = "style=" <> toText val 101 | -------------------------------------------------------------------------------- /src/Data/DotLang/Attr/Node.purs: -------------------------------------------------------------------------------- 1 | module Data.DotLang.Attr.Node where 2 | 3 | import Prelude 4 | 5 | import Color (Color, toHexString) 6 | import Data.DotLang.Class (class DotLang, toText) 7 | import Data.Generic.Rep (class Generic) 8 | import Data.Maybe (Maybe(..), maybe) 9 | import Data.Show.Generic (genericShow) 10 | import Data.String (joinWith) 11 | 12 | data Style 13 | = Dashed 14 | | Dotted 15 | | Solid 16 | | Invis 17 | | Bold 18 | | Filled 19 | | Striped 20 | | Wedged 21 | | Diagonals 22 | | Rounded 23 | 24 | derive instance Generic Style _ 25 | 26 | instance Show Style where 27 | show = genericShow 28 | 29 | instance DotLang Style where 30 | toText Dashed = "dashed" 31 | toText Dotted = "dotted" 32 | toText Solid = "solid" 33 | toText Invis = "invis" 34 | toText Bold = "bold" 35 | toText Filled = "filled" 36 | toText Striped = "striped" 37 | toText Wedged = "wedged" 38 | toText Diagonals = "diagonals" 39 | toText Rounded = "rounded" 40 | 41 | data LabelValue 42 | = TextLabel String 43 | | HtmlLabel String 44 | | RecordLabel RecordLabelValue 45 | 46 | derive instance genericLabel :: Generic LabelValue _ 47 | 48 | instance showLabel :: Show LabelValue where 49 | show l = genericShow l 50 | 51 | renderLabel :: LabelValue -> String 52 | renderLabel = case _ of 53 | TextLabel t -> show t 54 | HtmlLabel t -> t 55 | RecordLabel recordValue -> show $ renderRecordLabelValue recordValue 56 | 57 | 58 | data RecordLabelValue 59 | = SubRecord (Array {fieldId:: Maybe String, value:: RecordLabelValue}) 60 | | Base String 61 | 62 | derive instance genericRecordLabelValue :: Generic RecordLabelValue _ 63 | 64 | instance showRecordLabelValue :: Show RecordLabelValue where 65 | show l = genericShow l 66 | 67 | renderRecordLabelValue :: RecordLabelValue -> String 68 | renderRecordLabelValue = case _ of 69 | SubRecord parts -> joinWith " | " $ map renderPart parts 70 | where 71 | renderPart {fieldId, value} = brace "{" "}" $ (maybe "" (brace "<" ">") fieldId) <> renderRecordLabelValue value 72 | brace left right str = left <> str <> right 73 | Base str -> str 74 | 75 | data Attr 76 | = Color Color 77 | | Margin Int 78 | | FontColor Color 79 | | FontSize Int 80 | | Width Int 81 | | Label LabelValue 82 | | Shape ShapeType 83 | | Style Style 84 | | FillColor Color 85 | | PenWidth Number 86 | 87 | derive instance genericAttr :: Generic Attr _ 88 | 89 | instance showAttr :: Show Attr where 90 | show = genericShow 91 | 92 | instance attrDotLang :: DotLang Attr where 93 | toText (Margin i) = "margin=" <> show i 94 | toText (Color s) = "color=\"" <> toHexString s <> "\"" 95 | toText (FontColor s) = "fontcolor=\"" <> toHexString s <> "\"" 96 | toText (FontSize i) = "fontsize=" <> show i 97 | toText (Width i) = "width=" <> show i 98 | toText (Shape t) = "shape=" <> toText t 99 | toText (Style f) = "style=" <> toText f 100 | toText (Label l) = "label=" <> renderLabel l 101 | toText (FillColor c) = "fillcolor=\"" <> toHexString c <> "\"" 102 | toText (PenWidth i) = "penwidth=" <> show i 103 | 104 | -- | possible node shapes 105 | data ShapeType 106 | = Box 107 | | Polygon 108 | | Ellipse 109 | | Oval 110 | | Circle 111 | | Point 112 | | Egg 113 | | Triangle 114 | | Plaintext 115 | | Plain 116 | | Diamond 117 | | Trapezium 118 | | Parallelogram 119 | | House 120 | | Pentagon 121 | | Hexagon 122 | | Septagon 123 | | Octagon 124 | | Doublecircle 125 | | Doubleoctagon 126 | | Tripleoctagon 127 | | Invtriangle 128 | | Invtrapezium 129 | | Invhouse 130 | | Mdiamond 131 | | Msquare 132 | | Mcircle 133 | | Rect 134 | | Rectangle 135 | | Square 136 | | Star 137 | | None 138 | | Underline 139 | | Cylinder 140 | | Note 141 | | Tab 142 | | Folder 143 | | Box3d 144 | | Component 145 | | Promoter 146 | | Cds 147 | | Terminator 148 | | Utr 149 | | Primersite 150 | | Restrictionsite 151 | | Fivepoverhang 152 | | Threepoverhang 153 | | Noverhang 154 | | Assembly 155 | | Signature 156 | | Insulator 157 | | Ribosite 158 | | Rnastab 159 | | Proteasesite 160 | | Proteinstab 161 | | Rpromoter 162 | | Rarrow 163 | | Larrow 164 | | Lpromoter 165 | | Record 166 | 167 | derive instance genericShapeType :: Generic ShapeType _ 168 | 169 | instance showShapeType :: Show ShapeType where 170 | show = genericShow 171 | 172 | instance dotLangShape :: DotLang ShapeType where 173 | toText Box = "box" 174 | toText Polygon = "polygon" 175 | toText Ellipse = "ellipse" 176 | toText Oval = "oval" 177 | toText Circle = "circle" 178 | toText Point = "point" 179 | toText Egg = "egg" 180 | toText Triangle = "triangle" 181 | toText Plaintext = "plaintext" 182 | toText Plain = "plain" 183 | toText Diamond = "diamond" 184 | toText Trapezium = "trapezium" 185 | toText Parallelogram = "parallelogram" 186 | toText House = "house" 187 | toText Pentagon = "pentagon" 188 | toText Hexagon = "hexagon" 189 | toText Septagon = "septagon" 190 | toText Octagon = "octagon" 191 | toText Doublecircle = "doublecircle" 192 | toText Doubleoctagon = "doubleoctagon" 193 | toText Tripleoctagon = "tripleoctagon" 194 | toText Invtriangle = "invtriangle" 195 | toText Invtrapezium = "invtrapezium" 196 | toText Invhouse = "invhouse" 197 | toText Mdiamond = "mdiamond" 198 | toText Msquare = "msquare" 199 | toText Mcircle = "mcircle" 200 | toText Rect = "rect" 201 | toText Rectangle = "rectangle" 202 | toText Square = "square" 203 | toText Star = "star" 204 | toText None = "none" 205 | toText Underline = "underline" 206 | toText Cylinder = "cylinder" 207 | toText Note = "note" 208 | toText Tab = "tab" 209 | toText Folder = "folder" 210 | toText Box3d = "box3d" 211 | toText Component = "component" 212 | toText Promoter = "promoter" 213 | toText Cds = "cds" 214 | toText Terminator = "terminator" 215 | toText Utr = "utr" 216 | toText Primersite = "primersite" 217 | toText Restrictionsite = "restrictionsite" 218 | toText Fivepoverhang = "fivepoverhang" 219 | toText Threepoverhang = "threepoverhang" 220 | toText Noverhang = "noverhang" 221 | toText Assembly = "assembly" 222 | toText Signature = "signature" 223 | toText Insulator = "insulator" 224 | toText Ribosite = "ribosite" 225 | toText Rnastab = "rnastab" 226 | toText Proteasesite = "proteasesite" 227 | toText Proteinstab = "proteinstab" 228 | toText Rpromoter = "rpromoter" 229 | toText Rarrow = "Rarrow" 230 | toText Larrow = "Larrow" 231 | toText Lpromoter = "Lpromoter" 232 | toText Record = "record" 233 | 234 | -- | 235 | --| ```purescript run 236 | --| > import Data.DotLang.Attr.Node 237 | --| > :t htmlLabel "
Label
" 238 | --| Attr 239 | --| ``` 240 | -- | htmlLabel as a part of an attribute of a node. 241 | htmlLabel :: String -> Attr 242 | htmlLabel = HtmlLabel >>> Label 243 | 244 | -- | 245 | --| ```purescript run 246 | --| > import Data.DotLang.Attr.Node 247 | --| > :t label "..." 248 | --| Attr 249 | --| ``` 250 | -- | label as a part of an attribute of a node. 251 | label :: String -> Attr 252 | label = TextLabel >>> Label 253 | 254 | --| ```purescript run 255 | --| > import Data.DotLang 256 | --| > import Data.DotLang.Class (toText) 257 | --| > toText $ node "a" [recordLabel [subId "test" $ subLabel "c", subLabel "d", subRecord [ subLabel "k", subLabel "l"]]] 258 | --| "a [label=\"{c} | {d} | {{k} | {l}}\"]; " 259 | --| ``` 260 | -- | 261 | recordLabel :: Array {fieldId:: Maybe String, value:: RecordLabelValue} -> Attr 262 | recordLabel = SubRecord >>> RecordLabel >>> Label 263 | 264 | subRecord :: Array {fieldId:: Maybe String, value:: RecordLabelValue} -> {fieldId:: Maybe String, value:: RecordLabelValue} 265 | subRecord v = {fieldId: Nothing, value: SubRecord v } 266 | 267 | subLabel :: String -> {fieldId :: Maybe String, value :: RecordLabelValue} 268 | subLabel value = {fieldId : Nothing, value: Base value } 269 | 270 | subId :: String -> {fieldId :: Maybe String, value :: RecordLabelValue} ->{fieldId :: Maybe String, value :: RecordLabelValue} 271 | subId str {value} = {fieldId: Just str, value: value} -------------------------------------------------------------------------------- /src/Data/DotLang/Class.purs: -------------------------------------------------------------------------------- 1 | module Data.DotLang.Class where 2 | 3 | -- | `a` is a type that has a representation in the dot language 4 | class DotLang a where 5 | toText :: a -> String 6 | -------------------------------------------------------------------------------- /test.dhall: -------------------------------------------------------------------------------- 1 | let conf = ./spago.dhall 2 | 3 | in conf // { 4 | sources = conf.sources # [ "test/**/*.purs", "generated-doctests/**/*.purs" ], 5 | dependencies = conf.dependencies # [ "spec" ] 6 | } -------------------------------------------------------------------------------- /test/Main.purs: -------------------------------------------------------------------------------- 1 | module Test.Main where 2 | 3 | import Prelude 4 | 5 | import Color.Scheme.MaterialDesign (red) 6 | import Data.DotLang (Definition(..), Graph(..), Edge(..), EdgeType(..), global, node, (==>), (=*>)) 7 | import Data.DotLang.Attr (FillStyle(..)) 8 | import Data.DotLang.Attr.Edge as Edge 9 | import Data.DotLang.Attr.Global (RankDirValue(..)) 10 | import Data.DotLang.Attr.Global as Global 11 | import Data.DotLang.Attr.Node (Attr(..), LabelValue(..), RecordLabelValue(..), ShapeType(..), label, recordLabel, subId, subLabel, subRecord) 12 | import Data.DotLang.Attr.Node as Node 13 | import Data.DotLang.Class (toText) 14 | import Data.Maybe (Maybe(..)) 15 | import DocTest as DocTest 16 | import Effect (Effect) 17 | import Effect.Aff (launchAff_) 18 | import Test.Spec (pending, describe, it) 19 | import Test.Spec.Assertions (shouldEqual) 20 | import Test.Spec.Reporter.Console (consoleReporter) 21 | import Test.Spec.Runner (run, runSpec) 22 | 23 | main ∷ Effect Unit 24 | main = 25 | launchAff_ 26 | $ do 27 | runSpec [ consoleReporter ] do 28 | DocTest.main 29 | describe "DotLang" do 30 | it "basic test" do 31 | let 32 | g = 33 | DiGraph 34 | [ global [ Global.RankDir FromLeft ] 35 | , node "a" [ Shape Diamond, Style Filled, Node.FillColor red ] 36 | , node "b" [] 37 | , "a" ==> "b" 38 | , "a" =*> "d" $ [ Edge.FillColor red ] 39 | , Subgraph 40 | [ node "d" [] 41 | ] 42 | ] 43 | toText g `shouldEqual` "digraph {rankdir=LR; a [shape=diamond, style=filled, fillcolor=\"#f44336\"]; b []; a -> b; a -> d [fillcolor=\"#f44336\"]; subgraph { d []; }}" 44 | it "examples from documentation" do 45 | toText (Edge Forward "a" "b" []) `shouldEqual` "a -> b" 46 | toText ("a" =*> "b" $ [ Edge.FillColor red ]) `shouldEqual` "a -> b [fillcolor=\"#f44336\"]; " 47 | it "ArrowHead" 48 | $ do 49 | (toText $ "a" =*> "b" $ [ Edge.ArrowHead Edge.None ]) `shouldEqual` "a -> b [arrowhead=none]; " 50 | it "record label" $ do 51 | toText (node "a" [recordLabel [subId "test" $ subLabel "c", subLabel "d", subRecord [ subLabel "k", subLabel "l"]]] ) 52 | `shouldEqual` """a [label="{c} | {d} | {{k} | {l}}"]; """ --------------------------------------------------------------------------------