├── .editorconfig ├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── src ├── Resource.ts ├── StyleSheet.ts ├── base64.ts ├── browser.ts ├── csp.ts ├── cssomKeyToCssKey.ts ├── htmlToSvg.ts ├── index.ts ├── inlineStyles.ts ├── support.ts ├── temporaryDom.ts └── withLoadedImage.ts ├── test ├── stand.html └── world.png ├── tsconfig.json ├── tslint.json └── webpack.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root=true 2 | 3 | [*.{ts,json}] 4 | indent_size = 4 5 | indent_style = space 6 | insert_final_newline = true 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Carbonite 2 | 3 | > Library for client-side HTML to PNG rendering. 4 | 5 | Extracted from [Yandex.Maps API](https://tech.yandex.com/maps/mapsapi/). 6 | 7 | ## Usage 8 | 9 | Carbonite is using UMD pattern, so you can use it with require.js or SystemJS, or any other module system which supports UMD. 10 | 11 | ```html 12 | 13 | 23 | ``` 24 | 25 | ## Documentation 26 | 27 | ```typescript 28 | /** 29 | * Renders element from document into image. 30 | */ 31 | function render(node: HTMLElement, options?: RenderOptions): Promise; 32 | 33 | interface RenderOptions { 34 | /** Desired type of rendered image. */ 35 | type?: ResourceType; 36 | 37 | /** Desired mime type of rendered image. */ 38 | mime?: string; 39 | 40 | /** Size of element. */ 41 | size?: { width: number; height: number; }; 42 | 43 | /** Content Security Policy options. */ 44 | csp?: Csp; 45 | } 46 | 47 | /** 48 | * Type of the resource. 49 | */ 50 | type ResourceType = 'data-url' | 'blob'; 51 | 52 | /** 53 | * Resource with url that can be destroyed. 54 | */ 55 | interface Resource { 56 | /** Type of the resource. */ 57 | readonly type: Type; 58 | 59 | /** Mime type of the resource. */ 60 | readonly mime: string; 61 | 62 | /** Url of the resource. */ 63 | readonly url: string; 64 | 65 | /** Destroys resource. */ 66 | destroy(): void; 67 | } 68 | 69 | /** 70 | * Holds information about Content Security Policy on page. 71 | */ 72 | interface Csp { 73 | /** Whether CSP is enabled. */ 74 | enabled: boolean; 75 | 76 | /** Nonce value for styles from 'style-src'. */ 77 | styleNonce?: string | null; 78 | 79 | /** Whether blob: images are allowed (i.e. 'img-src' has 'blob:'). */ 80 | imageBlob?: boolean; 81 | } 82 | ``` 83 | 84 | ## Developing 85 | 86 | Carbonite is extracted from Maps API and should be written to allow simple integration back into it. Since Maps API still supports browsers like Internet Explorer 8 and Opera 12 and browsers with ES3 only there're some quirks you should follow: 87 | 88 | - Library should not produce `SyntaxError`s during parsing in IE 8 and Opera 12 89 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "carbonite", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.1.2", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", 10 | "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", 11 | "dev": true 12 | }, 13 | "acorn-dynamic-import": { 14 | "version": "2.0.2", 15 | "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", 16 | "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", 17 | "dev": true, 18 | "requires": { 19 | "acorn": "4.0.13" 20 | }, 21 | "dependencies": { 22 | "acorn": { 23 | "version": "4.0.13", 24 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", 25 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", 26 | "dev": true 27 | } 28 | } 29 | }, 30 | "ajv": { 31 | "version": "5.2.2", 32 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", 33 | "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", 34 | "dev": true, 35 | "requires": { 36 | "co": "4.6.0", 37 | "fast-deep-equal": "1.0.0", 38 | "json-schema-traverse": "0.3.1", 39 | "json-stable-stringify": "1.0.1" 40 | } 41 | }, 42 | "ajv-keywords": { 43 | "version": "2.1.0", 44 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", 45 | "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", 46 | "dev": true 47 | }, 48 | "align-text": { 49 | "version": "0.1.4", 50 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 51 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 52 | "dev": true, 53 | "requires": { 54 | "kind-of": "3.2.2", 55 | "longest": "1.0.1", 56 | "repeat-string": "1.6.1" 57 | } 58 | }, 59 | "ansi-regex": { 60 | "version": "2.1.1", 61 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 62 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 63 | "dev": true 64 | }, 65 | "ansi-styles": { 66 | "version": "3.2.0", 67 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", 68 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", 69 | "dev": true, 70 | "requires": { 71 | "color-convert": "1.9.0" 72 | } 73 | }, 74 | "anymatch": { 75 | "version": "1.3.2", 76 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", 77 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", 78 | "dev": true, 79 | "requires": { 80 | "micromatch": "2.3.11", 81 | "normalize-path": "2.1.1" 82 | } 83 | }, 84 | "arr-diff": { 85 | "version": "2.0.0", 86 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 87 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 88 | "dev": true, 89 | "requires": { 90 | "arr-flatten": "1.1.0" 91 | } 92 | }, 93 | "arr-flatten": { 94 | "version": "1.1.0", 95 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 96 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 97 | "dev": true 98 | }, 99 | "array-unique": { 100 | "version": "0.2.1", 101 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 102 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 103 | "dev": true 104 | }, 105 | "asn1.js": { 106 | "version": "4.9.1", 107 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", 108 | "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", 109 | "dev": true, 110 | "requires": { 111 | "bn.js": "4.11.8", 112 | "inherits": "2.0.3", 113 | "minimalistic-assert": "1.0.0" 114 | } 115 | }, 116 | "assert": { 117 | "version": "1.4.1", 118 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", 119 | "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", 120 | "dev": true, 121 | "requires": { 122 | "util": "0.10.3" 123 | } 124 | }, 125 | "async": { 126 | "version": "2.5.0", 127 | "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", 128 | "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", 129 | "dev": true, 130 | "requires": { 131 | "lodash": "4.17.4" 132 | } 133 | }, 134 | "async-each": { 135 | "version": "1.0.1", 136 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", 137 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", 138 | "dev": true 139 | }, 140 | "babel-code-frame": { 141 | "version": "6.26.0", 142 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 143 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 144 | "dev": true, 145 | "requires": { 146 | "chalk": "1.1.3", 147 | "esutils": "2.0.2", 148 | "js-tokens": "3.0.2" 149 | }, 150 | "dependencies": { 151 | "ansi-styles": { 152 | "version": "2.2.1", 153 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 154 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 155 | "dev": true 156 | }, 157 | "chalk": { 158 | "version": "1.1.3", 159 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 160 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 161 | "dev": true, 162 | "requires": { 163 | "ansi-styles": "2.2.1", 164 | "escape-string-regexp": "1.0.5", 165 | "has-ansi": "2.0.0", 166 | "strip-ansi": "3.0.1", 167 | "supports-color": "2.0.0" 168 | } 169 | }, 170 | "supports-color": { 171 | "version": "2.0.0", 172 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 173 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 174 | "dev": true 175 | } 176 | } 177 | }, 178 | "balanced-match": { 179 | "version": "1.0.0", 180 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 181 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 182 | "dev": true 183 | }, 184 | "base64-js": { 185 | "version": "1.2.1", 186 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", 187 | "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", 188 | "dev": true 189 | }, 190 | "big.js": { 191 | "version": "3.1.3", 192 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", 193 | "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", 194 | "dev": true 195 | }, 196 | "binary-extensions": { 197 | "version": "1.10.0", 198 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", 199 | "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", 200 | "dev": true 201 | }, 202 | "bn.js": { 203 | "version": "4.11.8", 204 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", 205 | "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", 206 | "dev": true 207 | }, 208 | "brace-expansion": { 209 | "version": "1.1.8", 210 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 211 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 212 | "dev": true, 213 | "requires": { 214 | "balanced-match": "1.0.0", 215 | "concat-map": "0.0.1" 216 | } 217 | }, 218 | "braces": { 219 | "version": "1.8.5", 220 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 221 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 222 | "dev": true, 223 | "requires": { 224 | "expand-range": "1.8.2", 225 | "preserve": "0.2.0", 226 | "repeat-element": "1.1.2" 227 | } 228 | }, 229 | "brorand": { 230 | "version": "1.1.0", 231 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 232 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", 233 | "dev": true 234 | }, 235 | "browserify-aes": { 236 | "version": "1.0.8", 237 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.8.tgz", 238 | "integrity": "sha512-WYCMOT/PtGTlpOKFht0YJFYcPy6pLCR98CtWfzK13zoynLlBMvAdEMSRGmgnJCw2M2j/5qxBkinZQFobieM8dQ==", 239 | "dev": true, 240 | "requires": { 241 | "buffer-xor": "1.0.3", 242 | "cipher-base": "1.0.4", 243 | "create-hash": "1.1.3", 244 | "evp_bytestokey": "1.0.3", 245 | "inherits": "2.0.3", 246 | "safe-buffer": "5.1.1" 247 | } 248 | }, 249 | "browserify-cipher": { 250 | "version": "1.0.0", 251 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", 252 | "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", 253 | "dev": true, 254 | "requires": { 255 | "browserify-aes": "1.0.8", 256 | "browserify-des": "1.0.0", 257 | "evp_bytestokey": "1.0.3" 258 | } 259 | }, 260 | "browserify-des": { 261 | "version": "1.0.0", 262 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", 263 | "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", 264 | "dev": true, 265 | "requires": { 266 | "cipher-base": "1.0.4", 267 | "des.js": "1.0.0", 268 | "inherits": "2.0.3" 269 | } 270 | }, 271 | "browserify-rsa": { 272 | "version": "4.0.1", 273 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", 274 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", 275 | "dev": true, 276 | "requires": { 277 | "bn.js": "4.11.8", 278 | "randombytes": "2.0.5" 279 | } 280 | }, 281 | "browserify-sign": { 282 | "version": "4.0.4", 283 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", 284 | "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", 285 | "dev": true, 286 | "requires": { 287 | "bn.js": "4.11.8", 288 | "browserify-rsa": "4.0.1", 289 | "create-hash": "1.1.3", 290 | "create-hmac": "1.1.6", 291 | "elliptic": "6.4.0", 292 | "inherits": "2.0.3", 293 | "parse-asn1": "5.1.0" 294 | } 295 | }, 296 | "browserify-zlib": { 297 | "version": "0.1.4", 298 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", 299 | "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", 300 | "dev": true, 301 | "requires": { 302 | "pako": "0.2.9" 303 | } 304 | }, 305 | "buffer": { 306 | "version": "4.9.1", 307 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 308 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 309 | "dev": true, 310 | "requires": { 311 | "base64-js": "1.2.1", 312 | "ieee754": "1.1.8", 313 | "isarray": "1.0.0" 314 | } 315 | }, 316 | "buffer-xor": { 317 | "version": "1.0.3", 318 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 319 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", 320 | "dev": true 321 | }, 322 | "builtin-modules": { 323 | "version": "1.1.1", 324 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 325 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 326 | "dev": true 327 | }, 328 | "builtin-status-codes": { 329 | "version": "3.0.0", 330 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 331 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", 332 | "dev": true 333 | }, 334 | "camelcase": { 335 | "version": "1.2.1", 336 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 337 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 338 | "dev": true 339 | }, 340 | "center-align": { 341 | "version": "0.1.3", 342 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 343 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 344 | "dev": true, 345 | "requires": { 346 | "align-text": "0.1.4", 347 | "lazy-cache": "1.0.4" 348 | } 349 | }, 350 | "chalk": { 351 | "version": "2.1.0", 352 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", 353 | "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", 354 | "dev": true, 355 | "requires": { 356 | "ansi-styles": "3.2.0", 357 | "escape-string-regexp": "1.0.5", 358 | "supports-color": "4.4.0" 359 | } 360 | }, 361 | "chokidar": { 362 | "version": "1.7.0", 363 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", 364 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", 365 | "dev": true, 366 | "requires": { 367 | "anymatch": "1.3.2", 368 | "async-each": "1.0.1", 369 | "glob-parent": "2.0.0", 370 | "inherits": "2.0.3", 371 | "is-binary-path": "1.0.1", 372 | "is-glob": "2.0.1", 373 | "path-is-absolute": "1.0.1", 374 | "readdirp": "2.1.0" 375 | } 376 | }, 377 | "cipher-base": { 378 | "version": "1.0.4", 379 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 380 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 381 | "dev": true, 382 | "requires": { 383 | "inherits": "2.0.3", 384 | "safe-buffer": "5.1.1" 385 | } 386 | }, 387 | "cliui": { 388 | "version": "2.1.0", 389 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 390 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 391 | "dev": true, 392 | "requires": { 393 | "center-align": "0.1.3", 394 | "right-align": "0.1.3", 395 | "wordwrap": "0.0.2" 396 | } 397 | }, 398 | "co": { 399 | "version": "4.6.0", 400 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 401 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 402 | "dev": true 403 | }, 404 | "code-point-at": { 405 | "version": "1.1.0", 406 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 407 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 408 | "dev": true 409 | }, 410 | "color-convert": { 411 | "version": "1.9.0", 412 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", 413 | "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", 414 | "dev": true, 415 | "requires": { 416 | "color-name": "1.1.3" 417 | } 418 | }, 419 | "color-name": { 420 | "version": "1.1.3", 421 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 422 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 423 | "dev": true 424 | }, 425 | "colors": { 426 | "version": "1.1.2", 427 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 428 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", 429 | "dev": true 430 | }, 431 | "commander": { 432 | "version": "2.11.0", 433 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 434 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 435 | "dev": true 436 | }, 437 | "concat-map": { 438 | "version": "0.0.1", 439 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 440 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 441 | "dev": true 442 | }, 443 | "console-browserify": { 444 | "version": "1.1.0", 445 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 446 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 447 | "dev": true, 448 | "requires": { 449 | "date-now": "0.1.4" 450 | } 451 | }, 452 | "constants-browserify": { 453 | "version": "1.0.0", 454 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 455 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", 456 | "dev": true 457 | }, 458 | "core-util-is": { 459 | "version": "1.0.2", 460 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 461 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 462 | "dev": true 463 | }, 464 | "create-ecdh": { 465 | "version": "4.0.0", 466 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", 467 | "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", 468 | "dev": true, 469 | "requires": { 470 | "bn.js": "4.11.8", 471 | "elliptic": "6.4.0" 472 | } 473 | }, 474 | "create-hash": { 475 | "version": "1.1.3", 476 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", 477 | "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", 478 | "dev": true, 479 | "requires": { 480 | "cipher-base": "1.0.4", 481 | "inherits": "2.0.3", 482 | "ripemd160": "2.0.1", 483 | "sha.js": "2.4.8" 484 | } 485 | }, 486 | "create-hmac": { 487 | "version": "1.1.6", 488 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", 489 | "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", 490 | "dev": true, 491 | "requires": { 492 | "cipher-base": "1.0.4", 493 | "create-hash": "1.1.3", 494 | "inherits": "2.0.3", 495 | "ripemd160": "2.0.1", 496 | "safe-buffer": "5.1.1", 497 | "sha.js": "2.4.8" 498 | } 499 | }, 500 | "cross-spawn": { 501 | "version": "5.1.0", 502 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 503 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 504 | "dev": true, 505 | "requires": { 506 | "lru-cache": "4.1.1", 507 | "shebang-command": "1.2.0", 508 | "which": "1.3.0" 509 | } 510 | }, 511 | "crypto-browserify": { 512 | "version": "3.11.1", 513 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", 514 | "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", 515 | "dev": true, 516 | "requires": { 517 | "browserify-cipher": "1.0.0", 518 | "browserify-sign": "4.0.4", 519 | "create-ecdh": "4.0.0", 520 | "create-hash": "1.1.3", 521 | "create-hmac": "1.1.6", 522 | "diffie-hellman": "5.0.2", 523 | "inherits": "2.0.3", 524 | "pbkdf2": "3.0.14", 525 | "public-encrypt": "4.0.0", 526 | "randombytes": "2.0.5" 527 | } 528 | }, 529 | "d": { 530 | "version": "1.0.0", 531 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", 532 | "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", 533 | "dev": true, 534 | "requires": { 535 | "es5-ext": "0.10.30" 536 | } 537 | }, 538 | "date-now": { 539 | "version": "0.1.4", 540 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 541 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 542 | "dev": true 543 | }, 544 | "decamelize": { 545 | "version": "1.2.0", 546 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 547 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 548 | "dev": true 549 | }, 550 | "des.js": { 551 | "version": "1.0.0", 552 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", 553 | "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", 554 | "dev": true, 555 | "requires": { 556 | "inherits": "2.0.3", 557 | "minimalistic-assert": "1.0.0" 558 | } 559 | }, 560 | "diff": { 561 | "version": "3.3.1", 562 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", 563 | "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", 564 | "dev": true 565 | }, 566 | "diffie-hellman": { 567 | "version": "5.0.2", 568 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", 569 | "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", 570 | "dev": true, 571 | "requires": { 572 | "bn.js": "4.11.8", 573 | "miller-rabin": "4.0.0", 574 | "randombytes": "2.0.5" 575 | } 576 | }, 577 | "domain-browser": { 578 | "version": "1.1.7", 579 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", 580 | "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", 581 | "dev": true 582 | }, 583 | "elliptic": { 584 | "version": "6.4.0", 585 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", 586 | "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", 587 | "dev": true, 588 | "requires": { 589 | "bn.js": "4.11.8", 590 | "brorand": "1.1.0", 591 | "hash.js": "1.1.3", 592 | "hmac-drbg": "1.0.1", 593 | "inherits": "2.0.3", 594 | "minimalistic-assert": "1.0.0", 595 | "minimalistic-crypto-utils": "1.0.1" 596 | } 597 | }, 598 | "emojis-list": { 599 | "version": "2.1.0", 600 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", 601 | "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", 602 | "dev": true 603 | }, 604 | "enhanced-resolve": { 605 | "version": "3.4.1", 606 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", 607 | "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", 608 | "dev": true, 609 | "requires": { 610 | "graceful-fs": "4.1.11", 611 | "memory-fs": "0.4.1", 612 | "object-assign": "4.1.1", 613 | "tapable": "0.2.8" 614 | } 615 | }, 616 | "errno": { 617 | "version": "0.1.4", 618 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", 619 | "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", 620 | "dev": true, 621 | "requires": { 622 | "prr": "0.0.0" 623 | } 624 | }, 625 | "error-ex": { 626 | "version": "1.3.1", 627 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 628 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 629 | "dev": true, 630 | "requires": { 631 | "is-arrayish": "0.2.1" 632 | } 633 | }, 634 | "es5-ext": { 635 | "version": "0.10.30", 636 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", 637 | "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", 638 | "dev": true, 639 | "requires": { 640 | "es6-iterator": "2.0.1", 641 | "es6-symbol": "3.1.1" 642 | } 643 | }, 644 | "es6-iterator": { 645 | "version": "2.0.1", 646 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", 647 | "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", 648 | "dev": true, 649 | "requires": { 650 | "d": "1.0.0", 651 | "es5-ext": "0.10.30", 652 | "es6-symbol": "3.1.1" 653 | } 654 | }, 655 | "es6-map": { 656 | "version": "0.1.5", 657 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", 658 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", 659 | "dev": true, 660 | "requires": { 661 | "d": "1.0.0", 662 | "es5-ext": "0.10.30", 663 | "es6-iterator": "2.0.1", 664 | "es6-set": "0.1.5", 665 | "es6-symbol": "3.1.1", 666 | "event-emitter": "0.3.5" 667 | } 668 | }, 669 | "es6-set": { 670 | "version": "0.1.5", 671 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", 672 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", 673 | "dev": true, 674 | "requires": { 675 | "d": "1.0.0", 676 | "es5-ext": "0.10.30", 677 | "es6-iterator": "2.0.1", 678 | "es6-symbol": "3.1.1", 679 | "event-emitter": "0.3.5" 680 | } 681 | }, 682 | "es6-symbol": { 683 | "version": "3.1.1", 684 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", 685 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", 686 | "dev": true, 687 | "requires": { 688 | "d": "1.0.0", 689 | "es5-ext": "0.10.30" 690 | } 691 | }, 692 | "es6-weak-map": { 693 | "version": "2.0.2", 694 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", 695 | "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", 696 | "dev": true, 697 | "requires": { 698 | "d": "1.0.0", 699 | "es5-ext": "0.10.30", 700 | "es6-iterator": "2.0.1", 701 | "es6-symbol": "3.1.1" 702 | } 703 | }, 704 | "escape-string-regexp": { 705 | "version": "1.0.5", 706 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 707 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 708 | "dev": true 709 | }, 710 | "escope": { 711 | "version": "3.6.0", 712 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", 713 | "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", 714 | "dev": true, 715 | "requires": { 716 | "es6-map": "0.1.5", 717 | "es6-weak-map": "2.0.2", 718 | "esrecurse": "4.2.0", 719 | "estraverse": "4.2.0" 720 | } 721 | }, 722 | "esrecurse": { 723 | "version": "4.2.0", 724 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", 725 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 726 | "dev": true, 727 | "requires": { 728 | "estraverse": "4.2.0", 729 | "object-assign": "4.1.1" 730 | } 731 | }, 732 | "estraverse": { 733 | "version": "4.2.0", 734 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 735 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 736 | "dev": true 737 | }, 738 | "esutils": { 739 | "version": "2.0.2", 740 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 741 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 742 | "dev": true 743 | }, 744 | "event-emitter": { 745 | "version": "0.3.5", 746 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 747 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 748 | "dev": true, 749 | "requires": { 750 | "d": "1.0.0", 751 | "es5-ext": "0.10.30" 752 | } 753 | }, 754 | "events": { 755 | "version": "1.1.1", 756 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 757 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", 758 | "dev": true 759 | }, 760 | "evp_bytestokey": { 761 | "version": "1.0.3", 762 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 763 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 764 | "dev": true, 765 | "requires": { 766 | "md5.js": "1.3.4", 767 | "safe-buffer": "5.1.1" 768 | } 769 | }, 770 | "execa": { 771 | "version": "0.7.0", 772 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", 773 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 774 | "dev": true, 775 | "requires": { 776 | "cross-spawn": "5.1.0", 777 | "get-stream": "3.0.0", 778 | "is-stream": "1.1.0", 779 | "npm-run-path": "2.0.2", 780 | "p-finally": "1.0.0", 781 | "signal-exit": "3.0.2", 782 | "strip-eof": "1.0.0" 783 | } 784 | }, 785 | "expand-brackets": { 786 | "version": "0.1.5", 787 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 788 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 789 | "dev": true, 790 | "requires": { 791 | "is-posix-bracket": "0.1.1" 792 | } 793 | }, 794 | "expand-range": { 795 | "version": "1.8.2", 796 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 797 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 798 | "dev": true, 799 | "requires": { 800 | "fill-range": "2.2.3" 801 | } 802 | }, 803 | "extglob": { 804 | "version": "0.3.2", 805 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 806 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 807 | "dev": true, 808 | "requires": { 809 | "is-extglob": "1.0.0" 810 | } 811 | }, 812 | "fast-deep-equal": { 813 | "version": "1.0.0", 814 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", 815 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", 816 | "dev": true 817 | }, 818 | "filename-regex": { 819 | "version": "2.0.1", 820 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 821 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 822 | "dev": true 823 | }, 824 | "fill-range": { 825 | "version": "2.2.3", 826 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", 827 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", 828 | "dev": true, 829 | "requires": { 830 | "is-number": "2.1.0", 831 | "isobject": "2.1.0", 832 | "randomatic": "1.1.7", 833 | "repeat-element": "1.1.2", 834 | "repeat-string": "1.6.1" 835 | } 836 | }, 837 | "find-up": { 838 | "version": "2.1.0", 839 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 840 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 841 | "dev": true, 842 | "requires": { 843 | "locate-path": "2.0.0" 844 | } 845 | }, 846 | "for-in": { 847 | "version": "1.0.2", 848 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 849 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 850 | "dev": true 851 | }, 852 | "for-own": { 853 | "version": "0.1.5", 854 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 855 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 856 | "dev": true, 857 | "requires": { 858 | "for-in": "1.0.2" 859 | } 860 | }, 861 | "fs.realpath": { 862 | "version": "1.0.0", 863 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 864 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 865 | "dev": true 866 | }, 867 | "get-caller-file": { 868 | "version": "1.0.2", 869 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", 870 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", 871 | "dev": true 872 | }, 873 | "get-stream": { 874 | "version": "3.0.0", 875 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 876 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 877 | "dev": true 878 | }, 879 | "glob": { 880 | "version": "7.1.2", 881 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 882 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 883 | "dev": true, 884 | "requires": { 885 | "fs.realpath": "1.0.0", 886 | "inflight": "1.0.6", 887 | "inherits": "2.0.3", 888 | "minimatch": "3.0.4", 889 | "once": "1.4.0", 890 | "path-is-absolute": "1.0.1" 891 | } 892 | }, 893 | "glob-base": { 894 | "version": "0.3.0", 895 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 896 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 897 | "dev": true, 898 | "requires": { 899 | "glob-parent": "2.0.0", 900 | "is-glob": "2.0.1" 901 | } 902 | }, 903 | "glob-parent": { 904 | "version": "2.0.0", 905 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 906 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 907 | "dev": true, 908 | "requires": { 909 | "is-glob": "2.0.1" 910 | } 911 | }, 912 | "graceful-fs": { 913 | "version": "4.1.11", 914 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 915 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 916 | "dev": true 917 | }, 918 | "has-ansi": { 919 | "version": "2.0.0", 920 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 921 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 922 | "dev": true, 923 | "requires": { 924 | "ansi-regex": "2.1.1" 925 | } 926 | }, 927 | "has-flag": { 928 | "version": "2.0.0", 929 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 930 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 931 | "dev": true 932 | }, 933 | "hash-base": { 934 | "version": "2.0.2", 935 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", 936 | "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", 937 | "dev": true, 938 | "requires": { 939 | "inherits": "2.0.3" 940 | } 941 | }, 942 | "hash.js": { 943 | "version": "1.1.3", 944 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", 945 | "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", 946 | "dev": true, 947 | "requires": { 948 | "inherits": "2.0.3", 949 | "minimalistic-assert": "1.0.0" 950 | } 951 | }, 952 | "hmac-drbg": { 953 | "version": "1.0.1", 954 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 955 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 956 | "dev": true, 957 | "requires": { 958 | "hash.js": "1.1.3", 959 | "minimalistic-assert": "1.0.0", 960 | "minimalistic-crypto-utils": "1.0.1" 961 | } 962 | }, 963 | "hosted-git-info": { 964 | "version": "2.5.0", 965 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", 966 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", 967 | "dev": true 968 | }, 969 | "https-browserify": { 970 | "version": "0.0.1", 971 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", 972 | "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", 973 | "dev": true 974 | }, 975 | "ieee754": { 976 | "version": "1.1.8", 977 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", 978 | "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", 979 | "dev": true 980 | }, 981 | "indexof": { 982 | "version": "0.0.1", 983 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 984 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", 985 | "dev": true 986 | }, 987 | "inflight": { 988 | "version": "1.0.6", 989 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 990 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 991 | "dev": true, 992 | "requires": { 993 | "once": "1.4.0", 994 | "wrappy": "1.0.2" 995 | } 996 | }, 997 | "inherits": { 998 | "version": "2.0.3", 999 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1000 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1001 | "dev": true 1002 | }, 1003 | "interpret": { 1004 | "version": "1.0.3", 1005 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", 1006 | "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", 1007 | "dev": true 1008 | }, 1009 | "invert-kv": { 1010 | "version": "1.0.0", 1011 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 1012 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", 1013 | "dev": true 1014 | }, 1015 | "is-arrayish": { 1016 | "version": "0.2.1", 1017 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1018 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1019 | "dev": true 1020 | }, 1021 | "is-binary-path": { 1022 | "version": "1.0.1", 1023 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 1024 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 1025 | "dev": true, 1026 | "requires": { 1027 | "binary-extensions": "1.10.0" 1028 | } 1029 | }, 1030 | "is-buffer": { 1031 | "version": "1.1.5", 1032 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", 1033 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", 1034 | "dev": true 1035 | }, 1036 | "is-builtin-module": { 1037 | "version": "1.0.0", 1038 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 1039 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 1040 | "dev": true, 1041 | "requires": { 1042 | "builtin-modules": "1.1.1" 1043 | } 1044 | }, 1045 | "is-dotfile": { 1046 | "version": "1.0.3", 1047 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 1048 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 1049 | "dev": true 1050 | }, 1051 | "is-equal-shallow": { 1052 | "version": "0.1.3", 1053 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 1054 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 1055 | "dev": true, 1056 | "requires": { 1057 | "is-primitive": "2.0.0" 1058 | } 1059 | }, 1060 | "is-extendable": { 1061 | "version": "0.1.1", 1062 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1063 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 1064 | "dev": true 1065 | }, 1066 | "is-extglob": { 1067 | "version": "1.0.0", 1068 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1069 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 1070 | "dev": true 1071 | }, 1072 | "is-fullwidth-code-point": { 1073 | "version": "1.0.0", 1074 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1075 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1076 | "dev": true, 1077 | "requires": { 1078 | "number-is-nan": "1.0.1" 1079 | } 1080 | }, 1081 | "is-glob": { 1082 | "version": "2.0.1", 1083 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1084 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 1085 | "dev": true, 1086 | "requires": { 1087 | "is-extglob": "1.0.0" 1088 | } 1089 | }, 1090 | "is-number": { 1091 | "version": "2.1.0", 1092 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 1093 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 1094 | "dev": true, 1095 | "requires": { 1096 | "kind-of": "3.2.2" 1097 | } 1098 | }, 1099 | "is-posix-bracket": { 1100 | "version": "0.1.1", 1101 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 1102 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 1103 | "dev": true 1104 | }, 1105 | "is-primitive": { 1106 | "version": "2.0.0", 1107 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 1108 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 1109 | "dev": true 1110 | }, 1111 | "is-stream": { 1112 | "version": "1.1.0", 1113 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1114 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 1115 | "dev": true 1116 | }, 1117 | "isarray": { 1118 | "version": "1.0.0", 1119 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1120 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1121 | "dev": true 1122 | }, 1123 | "isexe": { 1124 | "version": "2.0.0", 1125 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1126 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1127 | "dev": true 1128 | }, 1129 | "isobject": { 1130 | "version": "2.1.0", 1131 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1132 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 1133 | "dev": true, 1134 | "requires": { 1135 | "isarray": "1.0.0" 1136 | } 1137 | }, 1138 | "js-tokens": { 1139 | "version": "3.0.2", 1140 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1141 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1142 | "dev": true 1143 | }, 1144 | "json-loader": { 1145 | "version": "0.5.7", 1146 | "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", 1147 | "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", 1148 | "dev": true 1149 | }, 1150 | "json-schema-traverse": { 1151 | "version": "0.3.1", 1152 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1153 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 1154 | "dev": true 1155 | }, 1156 | "json-stable-stringify": { 1157 | "version": "1.0.1", 1158 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 1159 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 1160 | "dev": true, 1161 | "requires": { 1162 | "jsonify": "0.0.0" 1163 | } 1164 | }, 1165 | "json5": { 1166 | "version": "0.5.1", 1167 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", 1168 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", 1169 | "dev": true 1170 | }, 1171 | "jsonify": { 1172 | "version": "0.0.0", 1173 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1174 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 1175 | "dev": true 1176 | }, 1177 | "kind-of": { 1178 | "version": "3.2.2", 1179 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1180 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1181 | "dev": true, 1182 | "requires": { 1183 | "is-buffer": "1.1.5" 1184 | } 1185 | }, 1186 | "lazy-cache": { 1187 | "version": "1.0.4", 1188 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1189 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 1190 | "dev": true 1191 | }, 1192 | "lcid": { 1193 | "version": "1.0.0", 1194 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 1195 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 1196 | "dev": true, 1197 | "requires": { 1198 | "invert-kv": "1.0.0" 1199 | } 1200 | }, 1201 | "load-json-file": { 1202 | "version": "2.0.0", 1203 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1204 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1205 | "dev": true, 1206 | "requires": { 1207 | "graceful-fs": "4.1.11", 1208 | "parse-json": "2.2.0", 1209 | "pify": "2.3.0", 1210 | "strip-bom": "3.0.0" 1211 | } 1212 | }, 1213 | "loader-runner": { 1214 | "version": "2.3.0", 1215 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", 1216 | "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", 1217 | "dev": true 1218 | }, 1219 | "loader-utils": { 1220 | "version": "1.1.0", 1221 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", 1222 | "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", 1223 | "dev": true, 1224 | "requires": { 1225 | "big.js": "3.1.3", 1226 | "emojis-list": "2.1.0", 1227 | "json5": "0.5.1" 1228 | } 1229 | }, 1230 | "locate-path": { 1231 | "version": "2.0.0", 1232 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1233 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1234 | "dev": true, 1235 | "requires": { 1236 | "p-locate": "2.0.0", 1237 | "path-exists": "3.0.0" 1238 | } 1239 | }, 1240 | "lodash": { 1241 | "version": "4.17.4", 1242 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1243 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 1244 | "dev": true 1245 | }, 1246 | "longest": { 1247 | "version": "1.0.1", 1248 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1249 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 1250 | "dev": true 1251 | }, 1252 | "lru-cache": { 1253 | "version": "4.1.1", 1254 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", 1255 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", 1256 | "dev": true, 1257 | "requires": { 1258 | "pseudomap": "1.0.2", 1259 | "yallist": "2.1.2" 1260 | } 1261 | }, 1262 | "md5.js": { 1263 | "version": "1.3.4", 1264 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", 1265 | "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", 1266 | "dev": true, 1267 | "requires": { 1268 | "hash-base": "3.0.4", 1269 | "inherits": "2.0.3" 1270 | }, 1271 | "dependencies": { 1272 | "hash-base": { 1273 | "version": "3.0.4", 1274 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", 1275 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", 1276 | "dev": true, 1277 | "requires": { 1278 | "inherits": "2.0.3", 1279 | "safe-buffer": "5.1.1" 1280 | } 1281 | } 1282 | } 1283 | }, 1284 | "mem": { 1285 | "version": "1.1.0", 1286 | "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", 1287 | "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", 1288 | "dev": true, 1289 | "requires": { 1290 | "mimic-fn": "1.1.0" 1291 | } 1292 | }, 1293 | "memory-fs": { 1294 | "version": "0.4.1", 1295 | "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", 1296 | "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", 1297 | "dev": true, 1298 | "requires": { 1299 | "errno": "0.1.4", 1300 | "readable-stream": "2.3.3" 1301 | } 1302 | }, 1303 | "micromatch": { 1304 | "version": "2.3.11", 1305 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1306 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 1307 | "dev": true, 1308 | "requires": { 1309 | "arr-diff": "2.0.0", 1310 | "array-unique": "0.2.1", 1311 | "braces": "1.8.5", 1312 | "expand-brackets": "0.1.5", 1313 | "extglob": "0.3.2", 1314 | "filename-regex": "2.0.1", 1315 | "is-extglob": "1.0.0", 1316 | "is-glob": "2.0.1", 1317 | "kind-of": "3.2.2", 1318 | "normalize-path": "2.1.1", 1319 | "object.omit": "2.0.1", 1320 | "parse-glob": "3.0.4", 1321 | "regex-cache": "0.4.4" 1322 | } 1323 | }, 1324 | "miller-rabin": { 1325 | "version": "4.0.0", 1326 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", 1327 | "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", 1328 | "dev": true, 1329 | "requires": { 1330 | "bn.js": "4.11.8", 1331 | "brorand": "1.1.0" 1332 | } 1333 | }, 1334 | "mimic-fn": { 1335 | "version": "1.1.0", 1336 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", 1337 | "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", 1338 | "dev": true 1339 | }, 1340 | "minimalistic-assert": { 1341 | "version": "1.0.0", 1342 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", 1343 | "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", 1344 | "dev": true 1345 | }, 1346 | "minimalistic-crypto-utils": { 1347 | "version": "1.0.1", 1348 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1349 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", 1350 | "dev": true 1351 | }, 1352 | "minimatch": { 1353 | "version": "3.0.4", 1354 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1355 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1356 | "dev": true, 1357 | "requires": { 1358 | "brace-expansion": "1.1.8" 1359 | } 1360 | }, 1361 | "minimist": { 1362 | "version": "0.0.8", 1363 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1364 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1365 | "dev": true 1366 | }, 1367 | "mkdirp": { 1368 | "version": "0.5.1", 1369 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1370 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1371 | "dev": true, 1372 | "requires": { 1373 | "minimist": "0.0.8" 1374 | } 1375 | }, 1376 | "node-libs-browser": { 1377 | "version": "2.0.0", 1378 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", 1379 | "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", 1380 | "dev": true, 1381 | "requires": { 1382 | "assert": "1.4.1", 1383 | "browserify-zlib": "0.1.4", 1384 | "buffer": "4.9.1", 1385 | "console-browserify": "1.1.0", 1386 | "constants-browserify": "1.0.0", 1387 | "crypto-browserify": "3.11.1", 1388 | "domain-browser": "1.1.7", 1389 | "events": "1.1.1", 1390 | "https-browserify": "0.0.1", 1391 | "os-browserify": "0.2.1", 1392 | "path-browserify": "0.0.0", 1393 | "process": "0.11.10", 1394 | "punycode": "1.4.1", 1395 | "querystring-es3": "0.2.1", 1396 | "readable-stream": "2.3.3", 1397 | "stream-browserify": "2.0.1", 1398 | "stream-http": "2.7.2", 1399 | "string_decoder": "0.10.31", 1400 | "timers-browserify": "2.0.4", 1401 | "tty-browserify": "0.0.0", 1402 | "url": "0.11.0", 1403 | "util": "0.10.3", 1404 | "vm-browserify": "0.0.4" 1405 | }, 1406 | "dependencies": { 1407 | "string_decoder": { 1408 | "version": "0.10.31", 1409 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1410 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1411 | "dev": true 1412 | } 1413 | } 1414 | }, 1415 | "normalize-package-data": { 1416 | "version": "2.4.0", 1417 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 1418 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 1419 | "dev": true, 1420 | "requires": { 1421 | "hosted-git-info": "2.5.0", 1422 | "is-builtin-module": "1.0.0", 1423 | "semver": "5.4.1", 1424 | "validate-npm-package-license": "3.0.1" 1425 | } 1426 | }, 1427 | "normalize-path": { 1428 | "version": "2.1.1", 1429 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1430 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1431 | "dev": true, 1432 | "requires": { 1433 | "remove-trailing-separator": "1.1.0" 1434 | } 1435 | }, 1436 | "npm-run-path": { 1437 | "version": "2.0.2", 1438 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1439 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1440 | "dev": true, 1441 | "requires": { 1442 | "path-key": "2.0.1" 1443 | } 1444 | }, 1445 | "number-is-nan": { 1446 | "version": "1.0.1", 1447 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1448 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1449 | "dev": true 1450 | }, 1451 | "object-assign": { 1452 | "version": "4.1.1", 1453 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1454 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1455 | "dev": true 1456 | }, 1457 | "object.omit": { 1458 | "version": "2.0.1", 1459 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1460 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 1461 | "dev": true, 1462 | "requires": { 1463 | "for-own": "0.1.5", 1464 | "is-extendable": "0.1.1" 1465 | } 1466 | }, 1467 | "once": { 1468 | "version": "1.4.0", 1469 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1470 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1471 | "dev": true, 1472 | "requires": { 1473 | "wrappy": "1.0.2" 1474 | } 1475 | }, 1476 | "os-browserify": { 1477 | "version": "0.2.1", 1478 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", 1479 | "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", 1480 | "dev": true 1481 | }, 1482 | "os-locale": { 1483 | "version": "2.1.0", 1484 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", 1485 | "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", 1486 | "dev": true, 1487 | "requires": { 1488 | "execa": "0.7.0", 1489 | "lcid": "1.0.0", 1490 | "mem": "1.1.0" 1491 | } 1492 | }, 1493 | "p-finally": { 1494 | "version": "1.0.0", 1495 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1496 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1497 | "dev": true 1498 | }, 1499 | "p-limit": { 1500 | "version": "1.1.0", 1501 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", 1502 | "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", 1503 | "dev": true 1504 | }, 1505 | "p-locate": { 1506 | "version": "2.0.0", 1507 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1508 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1509 | "dev": true, 1510 | "requires": { 1511 | "p-limit": "1.1.0" 1512 | } 1513 | }, 1514 | "pako": { 1515 | "version": "0.2.9", 1516 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", 1517 | "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", 1518 | "dev": true 1519 | }, 1520 | "parse-asn1": { 1521 | "version": "5.1.0", 1522 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", 1523 | "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", 1524 | "dev": true, 1525 | "requires": { 1526 | "asn1.js": "4.9.1", 1527 | "browserify-aes": "1.0.8", 1528 | "create-hash": "1.1.3", 1529 | "evp_bytestokey": "1.0.3", 1530 | "pbkdf2": "3.0.14" 1531 | } 1532 | }, 1533 | "parse-glob": { 1534 | "version": "3.0.4", 1535 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 1536 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 1537 | "dev": true, 1538 | "requires": { 1539 | "glob-base": "0.3.0", 1540 | "is-dotfile": "1.0.3", 1541 | "is-extglob": "1.0.0", 1542 | "is-glob": "2.0.1" 1543 | } 1544 | }, 1545 | "parse-json": { 1546 | "version": "2.2.0", 1547 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1548 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1549 | "dev": true, 1550 | "requires": { 1551 | "error-ex": "1.3.1" 1552 | } 1553 | }, 1554 | "path-browserify": { 1555 | "version": "0.0.0", 1556 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", 1557 | "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", 1558 | "dev": true 1559 | }, 1560 | "path-exists": { 1561 | "version": "3.0.0", 1562 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1563 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1564 | "dev": true 1565 | }, 1566 | "path-is-absolute": { 1567 | "version": "1.0.1", 1568 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1569 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1570 | "dev": true 1571 | }, 1572 | "path-key": { 1573 | "version": "2.0.1", 1574 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1575 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1576 | "dev": true 1577 | }, 1578 | "path-parse": { 1579 | "version": "1.0.5", 1580 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1581 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1582 | "dev": true 1583 | }, 1584 | "path-type": { 1585 | "version": "2.0.0", 1586 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1587 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1588 | "dev": true, 1589 | "requires": { 1590 | "pify": "2.3.0" 1591 | } 1592 | }, 1593 | "pbkdf2": { 1594 | "version": "3.0.14", 1595 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", 1596 | "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", 1597 | "dev": true, 1598 | "requires": { 1599 | "create-hash": "1.1.3", 1600 | "create-hmac": "1.1.6", 1601 | "ripemd160": "2.0.1", 1602 | "safe-buffer": "5.1.1", 1603 | "sha.js": "2.4.8" 1604 | } 1605 | }, 1606 | "pify": { 1607 | "version": "2.3.0", 1608 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1609 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1610 | "dev": true 1611 | }, 1612 | "preserve": { 1613 | "version": "0.2.0", 1614 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 1615 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 1616 | "dev": true 1617 | }, 1618 | "process": { 1619 | "version": "0.11.10", 1620 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1621 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 1622 | "dev": true 1623 | }, 1624 | "process-nextick-args": { 1625 | "version": "1.0.7", 1626 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1627 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1628 | "dev": true 1629 | }, 1630 | "prr": { 1631 | "version": "0.0.0", 1632 | "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", 1633 | "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", 1634 | "dev": true 1635 | }, 1636 | "pseudomap": { 1637 | "version": "1.0.2", 1638 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1639 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1640 | "dev": true 1641 | }, 1642 | "public-encrypt": { 1643 | "version": "4.0.0", 1644 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", 1645 | "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", 1646 | "dev": true, 1647 | "requires": { 1648 | "bn.js": "4.11.8", 1649 | "browserify-rsa": "4.0.1", 1650 | "create-hash": "1.1.3", 1651 | "parse-asn1": "5.1.0", 1652 | "randombytes": "2.0.5" 1653 | } 1654 | }, 1655 | "punycode": { 1656 | "version": "1.4.1", 1657 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1658 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 1659 | "dev": true 1660 | }, 1661 | "querystring": { 1662 | "version": "0.2.0", 1663 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1664 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 1665 | "dev": true 1666 | }, 1667 | "querystring-es3": { 1668 | "version": "0.2.1", 1669 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 1670 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", 1671 | "dev": true 1672 | }, 1673 | "randomatic": { 1674 | "version": "1.1.7", 1675 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", 1676 | "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", 1677 | "dev": true, 1678 | "requires": { 1679 | "is-number": "3.0.0", 1680 | "kind-of": "4.0.0" 1681 | }, 1682 | "dependencies": { 1683 | "is-number": { 1684 | "version": "3.0.0", 1685 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1686 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1687 | "dev": true, 1688 | "requires": { 1689 | "kind-of": "3.2.2" 1690 | }, 1691 | "dependencies": { 1692 | "kind-of": { 1693 | "version": "3.2.2", 1694 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1695 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1696 | "dev": true, 1697 | "requires": { 1698 | "is-buffer": "1.1.5" 1699 | } 1700 | } 1701 | } 1702 | }, 1703 | "kind-of": { 1704 | "version": "4.0.0", 1705 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1706 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1707 | "dev": true, 1708 | "requires": { 1709 | "is-buffer": "1.1.5" 1710 | } 1711 | } 1712 | } 1713 | }, 1714 | "randombytes": { 1715 | "version": "2.0.5", 1716 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", 1717 | "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", 1718 | "dev": true, 1719 | "requires": { 1720 | "safe-buffer": "5.1.1" 1721 | } 1722 | }, 1723 | "read-pkg": { 1724 | "version": "2.0.0", 1725 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1726 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1727 | "dev": true, 1728 | "requires": { 1729 | "load-json-file": "2.0.0", 1730 | "normalize-package-data": "2.4.0", 1731 | "path-type": "2.0.0" 1732 | } 1733 | }, 1734 | "read-pkg-up": { 1735 | "version": "2.0.0", 1736 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1737 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1738 | "dev": true, 1739 | "requires": { 1740 | "find-up": "2.1.0", 1741 | "read-pkg": "2.0.0" 1742 | } 1743 | }, 1744 | "readable-stream": { 1745 | "version": "2.3.3", 1746 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1747 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 1748 | "dev": true, 1749 | "requires": { 1750 | "core-util-is": "1.0.2", 1751 | "inherits": "2.0.3", 1752 | "isarray": "1.0.0", 1753 | "process-nextick-args": "1.0.7", 1754 | "safe-buffer": "5.1.1", 1755 | "string_decoder": "1.0.3", 1756 | "util-deprecate": "1.0.2" 1757 | } 1758 | }, 1759 | "readdirp": { 1760 | "version": "2.1.0", 1761 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", 1762 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", 1763 | "dev": true, 1764 | "requires": { 1765 | "graceful-fs": "4.1.11", 1766 | "minimatch": "3.0.4", 1767 | "readable-stream": "2.3.3", 1768 | "set-immediate-shim": "1.0.1" 1769 | } 1770 | }, 1771 | "regex-cache": { 1772 | "version": "0.4.4", 1773 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 1774 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 1775 | "dev": true, 1776 | "requires": { 1777 | "is-equal-shallow": "0.1.3" 1778 | } 1779 | }, 1780 | "remove-trailing-separator": { 1781 | "version": "1.1.0", 1782 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1783 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 1784 | "dev": true 1785 | }, 1786 | "repeat-element": { 1787 | "version": "1.1.2", 1788 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 1789 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", 1790 | "dev": true 1791 | }, 1792 | "repeat-string": { 1793 | "version": "1.6.1", 1794 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1795 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1796 | "dev": true 1797 | }, 1798 | "require-directory": { 1799 | "version": "2.1.1", 1800 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1801 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1802 | "dev": true 1803 | }, 1804 | "require-main-filename": { 1805 | "version": "1.0.1", 1806 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 1807 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", 1808 | "dev": true 1809 | }, 1810 | "resolve": { 1811 | "version": "1.4.0", 1812 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", 1813 | "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", 1814 | "dev": true, 1815 | "requires": { 1816 | "path-parse": "1.0.5" 1817 | } 1818 | }, 1819 | "right-align": { 1820 | "version": "0.1.3", 1821 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 1822 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 1823 | "dev": true, 1824 | "requires": { 1825 | "align-text": "0.1.4" 1826 | } 1827 | }, 1828 | "ripemd160": { 1829 | "version": "2.0.1", 1830 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", 1831 | "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", 1832 | "dev": true, 1833 | "requires": { 1834 | "hash-base": "2.0.2", 1835 | "inherits": "2.0.3" 1836 | } 1837 | }, 1838 | "safe-buffer": { 1839 | "version": "5.1.1", 1840 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1841 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 1842 | "dev": true 1843 | }, 1844 | "semver": { 1845 | "version": "5.4.1", 1846 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 1847 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 1848 | "dev": true 1849 | }, 1850 | "set-blocking": { 1851 | "version": "2.0.0", 1852 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1853 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1854 | "dev": true 1855 | }, 1856 | "set-immediate-shim": { 1857 | "version": "1.0.1", 1858 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 1859 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", 1860 | "dev": true 1861 | }, 1862 | "setimmediate": { 1863 | "version": "1.0.5", 1864 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 1865 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", 1866 | "dev": true 1867 | }, 1868 | "sha.js": { 1869 | "version": "2.4.8", 1870 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", 1871 | "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", 1872 | "dev": true, 1873 | "requires": { 1874 | "inherits": "2.0.3" 1875 | } 1876 | }, 1877 | "shebang-command": { 1878 | "version": "1.2.0", 1879 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1880 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1881 | "dev": true, 1882 | "requires": { 1883 | "shebang-regex": "1.0.0" 1884 | } 1885 | }, 1886 | "shebang-regex": { 1887 | "version": "1.0.0", 1888 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1889 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1890 | "dev": true 1891 | }, 1892 | "signal-exit": { 1893 | "version": "3.0.2", 1894 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1895 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1896 | "dev": true 1897 | }, 1898 | "source-list-map": { 1899 | "version": "2.0.0", 1900 | "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", 1901 | "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", 1902 | "dev": true 1903 | }, 1904 | "source-map": { 1905 | "version": "0.5.7", 1906 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1907 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1908 | "dev": true 1909 | }, 1910 | "spdx-correct": { 1911 | "version": "1.0.2", 1912 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 1913 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", 1914 | "dev": true, 1915 | "requires": { 1916 | "spdx-license-ids": "1.2.2" 1917 | } 1918 | }, 1919 | "spdx-expression-parse": { 1920 | "version": "1.0.4", 1921 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", 1922 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", 1923 | "dev": true 1924 | }, 1925 | "spdx-license-ids": { 1926 | "version": "1.2.2", 1927 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 1928 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 1929 | "dev": true 1930 | }, 1931 | "stream-browserify": { 1932 | "version": "2.0.1", 1933 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", 1934 | "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", 1935 | "dev": true, 1936 | "requires": { 1937 | "inherits": "2.0.3", 1938 | "readable-stream": "2.3.3" 1939 | } 1940 | }, 1941 | "stream-http": { 1942 | "version": "2.7.2", 1943 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", 1944 | "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", 1945 | "dev": true, 1946 | "requires": { 1947 | "builtin-status-codes": "3.0.0", 1948 | "inherits": "2.0.3", 1949 | "readable-stream": "2.3.3", 1950 | "to-arraybuffer": "1.0.1", 1951 | "xtend": "4.0.1" 1952 | } 1953 | }, 1954 | "string-width": { 1955 | "version": "2.1.1", 1956 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1957 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1958 | "dev": true, 1959 | "requires": { 1960 | "is-fullwidth-code-point": "2.0.0", 1961 | "strip-ansi": "4.0.0" 1962 | }, 1963 | "dependencies": { 1964 | "ansi-regex": { 1965 | "version": "3.0.0", 1966 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1967 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1968 | "dev": true 1969 | }, 1970 | "is-fullwidth-code-point": { 1971 | "version": "2.0.0", 1972 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1973 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1974 | "dev": true 1975 | }, 1976 | "strip-ansi": { 1977 | "version": "4.0.0", 1978 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1979 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1980 | "dev": true, 1981 | "requires": { 1982 | "ansi-regex": "3.0.0" 1983 | } 1984 | } 1985 | } 1986 | }, 1987 | "string_decoder": { 1988 | "version": "1.0.3", 1989 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 1990 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 1991 | "dev": true, 1992 | "requires": { 1993 | "safe-buffer": "5.1.1" 1994 | } 1995 | }, 1996 | "strip-ansi": { 1997 | "version": "3.0.1", 1998 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1999 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2000 | "dev": true, 2001 | "requires": { 2002 | "ansi-regex": "2.1.1" 2003 | } 2004 | }, 2005 | "strip-bom": { 2006 | "version": "3.0.0", 2007 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 2008 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 2009 | "dev": true 2010 | }, 2011 | "strip-eof": { 2012 | "version": "1.0.0", 2013 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 2014 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 2015 | "dev": true 2016 | }, 2017 | "supports-color": { 2018 | "version": "4.4.0", 2019 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 2020 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 2021 | "dev": true, 2022 | "requires": { 2023 | "has-flag": "2.0.0" 2024 | } 2025 | }, 2026 | "tapable": { 2027 | "version": "0.2.8", 2028 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", 2029 | "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", 2030 | "dev": true 2031 | }, 2032 | "timers-browserify": { 2033 | "version": "2.0.4", 2034 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", 2035 | "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", 2036 | "dev": true, 2037 | "requires": { 2038 | "setimmediate": "1.0.5" 2039 | } 2040 | }, 2041 | "to-arraybuffer": { 2042 | "version": "1.0.1", 2043 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 2044 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", 2045 | "dev": true 2046 | }, 2047 | "ts-loader": { 2048 | "version": "2.3.7", 2049 | "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-2.3.7.tgz", 2050 | "integrity": "sha512-8t3bu2FcEkXb+D4L+Cn8qiK2E2C6Ms4/GQChvz6IMbVurcFHLXrhW4EMtfaol1a1ASQACZGDUGit4NHnX9g7hQ==", 2051 | "dev": true, 2052 | "requires": { 2053 | "chalk": "2.1.0", 2054 | "enhanced-resolve": "3.4.1", 2055 | "loader-utils": "1.1.0", 2056 | "semver": "5.4.1" 2057 | } 2058 | }, 2059 | "tslib": { 2060 | "version": "1.7.1", 2061 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", 2062 | "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=", 2063 | "dev": true 2064 | }, 2065 | "tslint": { 2066 | "version": "5.7.0", 2067 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.7.0.tgz", 2068 | "integrity": "sha1-wl4NDJL6EgHCvDDoROCOaCtPNVI=", 2069 | "dev": true, 2070 | "requires": { 2071 | "babel-code-frame": "6.26.0", 2072 | "colors": "1.1.2", 2073 | "commander": "2.11.0", 2074 | "diff": "3.3.1", 2075 | "glob": "7.1.2", 2076 | "minimatch": "3.0.4", 2077 | "resolve": "1.4.0", 2078 | "semver": "5.4.1", 2079 | "tslib": "1.7.1", 2080 | "tsutils": "2.8.2" 2081 | } 2082 | }, 2083 | "tsutils": { 2084 | "version": "2.8.2", 2085 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.8.2.tgz", 2086 | "integrity": "sha1-LBSGukMSYIRbCsb5Aq/Z1wio6mo=", 2087 | "dev": true, 2088 | "requires": { 2089 | "tslib": "1.7.1" 2090 | } 2091 | }, 2092 | "tty-browserify": { 2093 | "version": "0.0.0", 2094 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 2095 | "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", 2096 | "dev": true 2097 | }, 2098 | "typescript": { 2099 | "version": "2.5.2", 2100 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.2.tgz", 2101 | "integrity": "sha1-A4qV99m7tCCxvzW6MdTFwd0//jQ=", 2102 | "dev": true 2103 | }, 2104 | "uglify-js": { 2105 | "version": "2.8.29", 2106 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 2107 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 2108 | "dev": true, 2109 | "requires": { 2110 | "source-map": "0.5.7", 2111 | "uglify-to-browserify": "1.0.2", 2112 | "yargs": "3.10.0" 2113 | }, 2114 | "dependencies": { 2115 | "yargs": { 2116 | "version": "3.10.0", 2117 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 2118 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 2119 | "dev": true, 2120 | "requires": { 2121 | "camelcase": "1.2.1", 2122 | "cliui": "2.1.0", 2123 | "decamelize": "1.2.0", 2124 | "window-size": "0.1.0" 2125 | } 2126 | } 2127 | } 2128 | }, 2129 | "uglify-to-browserify": { 2130 | "version": "1.0.2", 2131 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 2132 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 2133 | "dev": true, 2134 | "optional": true 2135 | }, 2136 | "uglifyjs-webpack-plugin": { 2137 | "version": "0.4.6", 2138 | "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", 2139 | "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", 2140 | "dev": true, 2141 | "requires": { 2142 | "source-map": "0.5.7", 2143 | "uglify-js": "2.8.29", 2144 | "webpack-sources": "1.0.1" 2145 | } 2146 | }, 2147 | "url": { 2148 | "version": "0.11.0", 2149 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 2150 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 2151 | "dev": true, 2152 | "requires": { 2153 | "punycode": "1.3.2", 2154 | "querystring": "0.2.0" 2155 | }, 2156 | "dependencies": { 2157 | "punycode": { 2158 | "version": "1.3.2", 2159 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 2160 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 2161 | "dev": true 2162 | } 2163 | } 2164 | }, 2165 | "util": { 2166 | "version": "0.10.3", 2167 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 2168 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 2169 | "dev": true, 2170 | "requires": { 2171 | "inherits": "2.0.1" 2172 | }, 2173 | "dependencies": { 2174 | "inherits": { 2175 | "version": "2.0.1", 2176 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 2177 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 2178 | "dev": true 2179 | } 2180 | } 2181 | }, 2182 | "util-deprecate": { 2183 | "version": "1.0.2", 2184 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2185 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2186 | "dev": true 2187 | }, 2188 | "validate-npm-package-license": { 2189 | "version": "3.0.1", 2190 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 2191 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", 2192 | "dev": true, 2193 | "requires": { 2194 | "spdx-correct": "1.0.2", 2195 | "spdx-expression-parse": "1.0.4" 2196 | } 2197 | }, 2198 | "vm-browserify": { 2199 | "version": "0.0.4", 2200 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", 2201 | "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", 2202 | "dev": true, 2203 | "requires": { 2204 | "indexof": "0.0.1" 2205 | } 2206 | }, 2207 | "watchpack": { 2208 | "version": "1.4.0", 2209 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", 2210 | "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", 2211 | "dev": true, 2212 | "requires": { 2213 | "async": "2.5.0", 2214 | "chokidar": "1.7.0", 2215 | "graceful-fs": "4.1.11" 2216 | } 2217 | }, 2218 | "webpack": { 2219 | "version": "3.5.6", 2220 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.5.6.tgz", 2221 | "integrity": "sha512-sXnxfx6KoZVrFAGLjdhCCwDtDwkYMfwm8mJjkQv3thr5pjTlbxopVlr/kJwc9Bz317gL+gNjvz++ir9TgG1MDg==", 2222 | "dev": true, 2223 | "requires": { 2224 | "acorn": "5.1.2", 2225 | "acorn-dynamic-import": "2.0.2", 2226 | "ajv": "5.2.2", 2227 | "ajv-keywords": "2.1.0", 2228 | "async": "2.5.0", 2229 | "enhanced-resolve": "3.4.1", 2230 | "escope": "3.6.0", 2231 | "interpret": "1.0.3", 2232 | "json-loader": "0.5.7", 2233 | "json5": "0.5.1", 2234 | "loader-runner": "2.3.0", 2235 | "loader-utils": "1.1.0", 2236 | "memory-fs": "0.4.1", 2237 | "mkdirp": "0.5.1", 2238 | "node-libs-browser": "2.0.0", 2239 | "source-map": "0.5.7", 2240 | "supports-color": "4.4.0", 2241 | "tapable": "0.2.8", 2242 | "uglifyjs-webpack-plugin": "0.4.6", 2243 | "watchpack": "1.4.0", 2244 | "webpack-sources": "1.0.1", 2245 | "yargs": "8.0.2" 2246 | } 2247 | }, 2248 | "webpack-sources": { 2249 | "version": "1.0.1", 2250 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", 2251 | "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", 2252 | "dev": true, 2253 | "requires": { 2254 | "source-list-map": "2.0.0", 2255 | "source-map": "0.5.7" 2256 | } 2257 | }, 2258 | "which": { 2259 | "version": "1.3.0", 2260 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 2261 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 2262 | "dev": true, 2263 | "requires": { 2264 | "isexe": "2.0.0" 2265 | } 2266 | }, 2267 | "which-module": { 2268 | "version": "2.0.0", 2269 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2270 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 2271 | "dev": true 2272 | }, 2273 | "window-size": { 2274 | "version": "0.1.0", 2275 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 2276 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 2277 | "dev": true 2278 | }, 2279 | "wordwrap": { 2280 | "version": "0.0.2", 2281 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 2282 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 2283 | "dev": true 2284 | }, 2285 | "wrap-ansi": { 2286 | "version": "2.1.0", 2287 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 2288 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 2289 | "dev": true, 2290 | "requires": { 2291 | "string-width": "1.0.2", 2292 | "strip-ansi": "3.0.1" 2293 | }, 2294 | "dependencies": { 2295 | "string-width": { 2296 | "version": "1.0.2", 2297 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2298 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2299 | "dev": true, 2300 | "requires": { 2301 | "code-point-at": "1.1.0", 2302 | "is-fullwidth-code-point": "1.0.0", 2303 | "strip-ansi": "3.0.1" 2304 | } 2305 | } 2306 | } 2307 | }, 2308 | "wrappy": { 2309 | "version": "1.0.2", 2310 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2311 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2312 | "dev": true 2313 | }, 2314 | "xtend": { 2315 | "version": "4.0.1", 2316 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2317 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 2318 | "dev": true 2319 | }, 2320 | "y18n": { 2321 | "version": "3.2.1", 2322 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 2323 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", 2324 | "dev": true 2325 | }, 2326 | "yallist": { 2327 | "version": "2.1.2", 2328 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2329 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 2330 | "dev": true 2331 | }, 2332 | "yargs": { 2333 | "version": "8.0.2", 2334 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", 2335 | "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", 2336 | "dev": true, 2337 | "requires": { 2338 | "camelcase": "4.1.0", 2339 | "cliui": "3.2.0", 2340 | "decamelize": "1.2.0", 2341 | "get-caller-file": "1.0.2", 2342 | "os-locale": "2.1.0", 2343 | "read-pkg-up": "2.0.0", 2344 | "require-directory": "2.1.1", 2345 | "require-main-filename": "1.0.1", 2346 | "set-blocking": "2.0.0", 2347 | "string-width": "2.1.1", 2348 | "which-module": "2.0.0", 2349 | "y18n": "3.2.1", 2350 | "yargs-parser": "7.0.0" 2351 | }, 2352 | "dependencies": { 2353 | "camelcase": { 2354 | "version": "4.1.0", 2355 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 2356 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", 2357 | "dev": true 2358 | }, 2359 | "cliui": { 2360 | "version": "3.2.0", 2361 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 2362 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 2363 | "dev": true, 2364 | "requires": { 2365 | "string-width": "1.0.2", 2366 | "strip-ansi": "3.0.1", 2367 | "wrap-ansi": "2.1.0" 2368 | }, 2369 | "dependencies": { 2370 | "string-width": { 2371 | "version": "1.0.2", 2372 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2373 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2374 | "dev": true, 2375 | "requires": { 2376 | "code-point-at": "1.1.0", 2377 | "is-fullwidth-code-point": "1.0.0", 2378 | "strip-ansi": "3.0.1" 2379 | } 2380 | } 2381 | } 2382 | } 2383 | } 2384 | }, 2385 | "yargs-parser": { 2386 | "version": "7.0.0", 2387 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", 2388 | "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", 2389 | "dev": true, 2390 | "requires": { 2391 | "camelcase": "4.1.0" 2392 | }, 2393 | "dependencies": { 2394 | "camelcase": { 2395 | "version": "4.1.0", 2396 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 2397 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", 2398 | "dev": true 2399 | } 2400 | } 2401 | } 2402 | } 2403 | } 2404 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "carbonite", 3 | "version": "0.1.0", 4 | "description": "", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1", 7 | "build": "webpack && webpack --optimize-minimize --output-filename 'carbonite.min.js'", 8 | "build:watch": "webpack --watch", 9 | "lint": "tslint -p ." 10 | }, 11 | "author": "Andrey Roenko ", 12 | "devDependencies": { 13 | "ts-loader": "^2.3.7", 14 | "tslint": "^5.7.0", 15 | "typescript": "^2.5.2", 16 | "webpack": "^3.5.6" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Resource.ts: -------------------------------------------------------------------------------- 1 | import {Csp} from './csp'; 2 | import {URL, areBlobsSupported} from './support'; 3 | import * as base64 from './base64'; 4 | import * as browser from './browser'; 5 | 6 | /** 7 | * Type of the resource. 8 | */ 9 | export type ResourceType = 'data-url' | 'blob'; 10 | 11 | export function getDefaultType(csp: Csp): ResourceType { 12 | return areBlobsSupported(csp) ? 'blob' : 'data-url'; 13 | } 14 | 15 | /** 16 | * Resource with url that can be destroyed. 17 | */ 18 | export interface Resource { 19 | /** Type of the resource. */ 20 | readonly type: ResourceType; 21 | 22 | /** Mime type of the resource. */ 23 | readonly mime: string; 24 | 25 | /** Url of the resource. */ 26 | readonly url: string; 27 | 28 | /** Destroys resource. */ 29 | destroy(): void; 30 | } 31 | 32 | /** 33 | * Create resource from data url. 34 | */ 35 | export function createResourceFromDataUrl(url: string): Resource { 36 | return { 37 | type: 'data-url', 38 | mime: (url.match(/^data:(.*?);/) || ['', ''])[1], 39 | url: url, 40 | destroy() { /* nop */ } 41 | }; 42 | } 43 | 44 | /** 45 | * Create resource from Blob. 46 | */ 47 | export function createResourceFromBlob(blob: Blob): Resource { 48 | const url = URL.createObjectURL(blob); 49 | 50 | return { 51 | type: 'blob', 52 | mime: (blob.type.match(/^([^/]*\/[^;]*)/) || ['', ''])[1], 53 | url: url, 54 | destroy() { 55 | URL.revokeObjectURL(url); 56 | } 57 | }; 58 | } 59 | 60 | /** 61 | * Create resource from string with specified mime type. 62 | */ 63 | export function createResourceFromString(str: string, mime: string, type: ResourceType): Resource { 64 | switch (type) { 65 | case 'blob': 66 | return createResourceFromBlob(new Blob([str], { type: `${mime};charset=utf-8` })); 67 | 68 | case 'data-url': 69 | const dataUrl = `data:${mime};base64,${base64.encode(str)}`; 70 | 71 | return createResourceFromDataUrl(dataUrl); 72 | } 73 | } 74 | 75 | /** 76 | * Create resource from canvas with specified mime type. 77 | */ 78 | export function createResourceFromCanvas( 79 | canvas: HTMLCanvasElement, 80 | mime: string, 81 | type: ResourceType 82 | ): Promise { 83 | // HACK: integrating with old vow Promises in debug mode for easier integration with Maps API 84 | try { 85 | switch (type) { 86 | case 'blob': 87 | return new Promise((resolve, reject) => { 88 | canvas.toBlob((blob) => { 89 | if (blob) { 90 | resolve(createResourceFromBlob(blob)); 91 | } else { 92 | reject(new Error('carbonite: cannot render canvas')); 93 | } 94 | }, mime); 95 | }); 96 | 97 | case 'data-url': 98 | return Promise.resolve(createResourceFromDataUrl(canvas.toDataURL(mime))); 99 | } 100 | } catch (e) { 101 | return Promise.reject(e); 102 | } 103 | 104 | // TypeScript's return type analyzer doesn't fully understand construction above. 105 | return null; 106 | } 107 | 108 | /** 109 | * Get resource type for rendering svg on canvas. 110 | */ 111 | export function getResourceTypeForForeignObjectSvg(csp: Csp): ResourceType { 112 | // We require data: in image-src, but not blob:. 113 | if (csp.enabled && !csp.imageBlob) { 114 | return 'data-url'; 115 | } 116 | 117 | // Chromiums taint canvas after rendering blobs with . Data URI is fine though. 118 | // https://bugs.chromium.org/p/chromium/issues/detail?id=294129 119 | if (browser.isChromium) { 120 | return 'data-url'; 121 | } 122 | 123 | return areBlobsSupported(csp) ? 'blob' : 'data-url'; 124 | } 125 | 126 | /** 127 | * Checks whether passed string is a valid resource type. 128 | */ 129 | export function isValidResourceType(type: string) { 130 | return type === 'blob' || type === 'data-url'; 131 | } 132 | -------------------------------------------------------------------------------- /src/StyleSheet.ts: -------------------------------------------------------------------------------- 1 | import {convertCssOmKeyToCssKey} from './cssomKeyToCssKey'; 2 | 3 | function joinRules(rules: Record): string { 4 | return Object.keys(rules) 5 | .map((rule) => `${convertCssOmKeyToCssKey(rule)}: ${rules[rule]};`) 6 | .join(''); 7 | } 8 | 9 | /** 10 | * Append-only CSS style sheet. 11 | */ 12 | export class StyleSheet { 13 | private _styles: string[] = []; 14 | private _counter: number = 0; 15 | 16 | /** 17 | * Creates class with passed rules and returns its name. 18 | */ 19 | createClass(rules: Record | string): string { 20 | const className = 'x' + this._counter++; 21 | 22 | const style = typeof rules === 'string' ? rules : joinRules(rules); 23 | this._styles.push(`.${className} { ${style} }`); 24 | 25 | return className; 26 | } 27 | 28 | /** 29 | * Combines all created classes into one css string. 30 | */ 31 | combine(): string { 32 | return this._styles.join(''); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/base64.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Encodes string as base64. 3 | */ 4 | export function encode(str: string): string { 5 | // Since DOMStrings are 16-bit-encoded strings, in most browsers 6 | // calling window.btoa on a Unicode string will cause 7 | // a Character Out Of Range exception if a character exceeds 8 | // the range of a 8-bit byte (0x00~0xFF). 9 | // https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem 10 | 11 | str = encodeURIComponent(str) 12 | .replace(/%([0-9A-F]{2})/g, (_, byte) => String.fromCharCode(parseInt(byte, 16))); 13 | 14 | return btoa(str); 15 | } 16 | -------------------------------------------------------------------------------- /src/browser.ts: -------------------------------------------------------------------------------- 1 | const ua = navigator.userAgent; 2 | 3 | export const engine = /WebKit\//.test(ua) ? 'webkit' : 4 | /Gecko\//.test(ua) ? 'gecko' : 5 | /Opera\//.test(ua) ? 'presto' : 6 | /Trident\//.test(ua) ? 'trident' : 7 | 'unknown'; 8 | 9 | export const isChromium = /(Chromium|Chrome|Ya(ndex)?Browser)\//.test(ua); 10 | 11 | export const isSafari = /Safari\//.test(ua) && !isChromium; 12 | 13 | export const isFirefox = /(Firefox|Fennec|Gecko)\//.test(ua); 14 | 15 | export const isIE = /MSIE/.test(ua); 16 | 17 | export const isEdge = /Edge/.test(ua); 18 | 19 | export const isOldOpera = /Opera[/ ]/.test(ua) && 20 | !isChromium && 21 | extractVersion(/(?:Version|Opera[/ ])\/([0-9][0-9\.]*)/) <= 12; 22 | 23 | // In summary, we recommend looking for the string “Mobi” 24 | // anywhere in the User Agent to detect a mobile device. 25 | // https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent 26 | export const isMobile = /Mobi/.test(ua); 27 | 28 | function extractVersion(regex: RegExp) { 29 | const match = ua.match(regex); 30 | return match ? parseInt(match[1], 10) : 0; 31 | } 32 | -------------------------------------------------------------------------------- /src/csp.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Holds information about Content Security Policy on page. 3 | */ 4 | export interface Csp { 5 | /** Whether CSP is enabled. */ 6 | enabled: boolean; 7 | 8 | /** Nonce value for styles from 'style-src'. */ 9 | styleNonce?: string | null; 10 | 11 | /** Whether blob: images are allowed (i.e. 'img-src' has 'blob:'). */ 12 | imageBlob?: boolean; 13 | } 14 | -------------------------------------------------------------------------------- /src/cssomKeyToCssKey.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Converts CSS Object Model key to CSS key. 3 | */ 4 | export function convertCssOmKeyToCssKey(cssomKey: string): string { 5 | if (cssomKey === 'cssFloat') { 6 | return 'float'; 7 | } 8 | 9 | return cssomKey 10 | .replace(/([A-Z])/g, '-$&') 11 | .replace(/^(webkit|ms|moz)/, '-') 12 | .toLowerCase(); 13 | } 14 | -------------------------------------------------------------------------------- /src/htmlToSvg.ts: -------------------------------------------------------------------------------- 1 | import {Csp} from './csp'; 2 | import {StyleSheet} from './StyleSheet'; 3 | 4 | const xmlSerializer = new XMLSerializer(); 5 | 6 | export interface Size { 7 | width: number; 8 | height: number; 9 | } 10 | 11 | /** 12 | * Wraps html into svg image. 13 | */ 14 | export function wrapHtmlInSvg( 15 | node: HTMLElement, 16 | stylesheet: StyleSheet, 17 | size: Size, 18 | csp: Csp 19 | ): string { 20 | const rootStyle = stylesheet.createClass({ 21 | position: 'relative', 22 | width: '100%', 23 | height: '100%', 24 | margin: '0', 25 | padding: '0', 26 | overflow: 'hidden' 27 | }); 28 | 29 | const style = document.createElement('style'); 30 | if (csp.enabled && csp.styleNonce) { 31 | style.setAttribute('none', csp.styleNonce); 32 | } 33 | style.innerHTML = stylesheet.combine(); 34 | 35 | return ` 36 | 37 | ${xmlSerializer.serializeToString(style)} 38 | 39 | 40 | ${xmlSerializer.serializeToString(node)} 41 | 42 | 43 | 44 | `; 45 | } 46 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import {Csp} from './csp'; 2 | import { 3 | createResourceFromCanvas, 4 | createResourceFromString, 5 | getResourceTypeForForeignObjectSvg, 6 | Resource, 7 | ResourceType, 8 | getDefaultType, 9 | isValidResourceType 10 | } from './Resource'; 11 | import {inlineStyles} from './inlineStyles'; 12 | import {withLoadedImage} from './withLoadedImage'; 13 | import {StyleSheet} from './StyleSheet'; 14 | import {wrapHtmlInSvg} from './htmlToSvg'; 15 | import {isSupported, isNonSvgSupported, areBlobsSupported} from './support'; 16 | 17 | export interface RenderOptions { 18 | /** Desired type of rendered image. */ 19 | type?: ResourceType; 20 | 21 | /** Desired mime type of rendered image. */ 22 | mime?: string; 23 | 24 | /** Size of element. */ 25 | size?: { width: number; height: number; }; 26 | 27 | /** Content Security Policy options. */ 28 | csp?: Csp; 29 | } 30 | 31 | /** 32 | * Renders element from document into image. 33 | */ 34 | export function render(node: HTMLElement, options?: RenderOptions): Promise { 35 | options = options || {}; 36 | 37 | const csp = options.csp || { enabled: false }; 38 | 39 | if (!isSupported(csp)) { 40 | return Promise.reject(new Error('carbonite: render is not supported')); 41 | } 42 | 43 | const nonSvgSupported = isNonSvgSupported(csp); 44 | 45 | const size = options.size || node.getBoundingClientRect(); 46 | const type = options.type || getDefaultType(csp); 47 | const mime = options.mime || (nonSvgSupported ? 'image/png' : 'image/svg+xml'); 48 | 49 | if (!isValidResourceType(type)) { 50 | return Promise.reject(new Error("carbonite: only 'blob' and 'data-url' types are supported")); 51 | } 52 | 53 | if (type === 'blob' && !areBlobsSupported(csp)) { 54 | return Promise.reject(new Error('carbonite: blobs are not supported')); 55 | } 56 | 57 | if (mime !== 'image/svg+xml' && !nonSvgSupported) { 58 | return Promise.reject(new Error("carbonite: only 'image/svg+xml' mime is supported")); 59 | } 60 | 61 | if (!size || !size.width || !size.height) { 62 | return Promise.reject(new Error('carbonite: both width and height must be non-zero')); 63 | } 64 | 65 | if (!document.body.contains(node)) { 66 | return Promise.reject(new Error('carbonite: node must be in document')); 67 | } 68 | 69 | const stylesheet = new StyleSheet(); 70 | 71 | return inlineStyles(node, stylesheet) 72 | .then((inlined) => { 73 | const svg = wrapHtmlInSvg( inlined, stylesheet, size, csp); 74 | 75 | return mime === 'image/svg+xml' ? 76 | createResourceFromString(svg, mime, type) : 77 | rasterizeSvg(svg, { mime, type, size, csp }); 78 | }); 79 | } 80 | 81 | function rasterizeSvg(svg: string, options: RenderOptions): Promise { 82 | const svgType = getResourceTypeForForeignObjectSvg(options.csp!); 83 | const svgResource = createResourceFromString(svg, 'image/svg+xml', svgType); 84 | const canvas = document.createElement('canvas'); 85 | const ctx = canvas.getContext('2d')!; 86 | 87 | canvas.width = options.size!.width; 88 | canvas.height = options.size!.height; 89 | 90 | return withLoadedImage(svgResource.url, (img) => ctx.drawImage(img, 0, 0)) 91 | .then(() => { 92 | svgResource.destroy(); 93 | return createResourceFromCanvas(canvas, options.mime!, options.type!); 94 | }); 95 | } 96 | -------------------------------------------------------------------------------- /src/inlineStyles.ts: -------------------------------------------------------------------------------- 1 | import {StyleSheet} from './StyleSheet'; 2 | import {convertCssOmKeyToCssKey} from './cssomKeyToCssKey'; 3 | import * as browser from './browser'; 4 | import * as temporaryDom from './temporaryDom'; 5 | import {withLoadedImage} from './withLoadedImage'; 6 | 7 | // Css rules that cannot be cut off. 8 | // transform-origin is buggy in Chromiums. 9 | const forcedStyles = /^transform-origin^/; 10 | 11 | // Ignored styles. They won't add anything to render. 12 | const ignoredStyles = /^(transition|cursor|animation|userSelect)/; 13 | 14 | // Partial styles to skip while inlining for webkit browsers. 15 | // For example, the value of borderTop is already contained in border. 16 | // Adding it will just make the style longer. 17 | // Firefox doesn't build the full style, so for the example above, only borderTop will be set. 18 | const partialStyles = browser.engine !== 'webkit' 19 | ? /^(?=a)b/ // Dummy regex that fails on any string. 20 | : /^(background|outline|border(?!Radius)|webkitBorder(Before|After|End|Start))[A-Z]/; 21 | 22 | /** 23 | * Clone node hierarchy and inline all styles. 24 | */ 25 | export function inlineStyles(node: Node, stylesheet: StyleSheet): Promise { 26 | if (!node) { 27 | throw new Error(`inlineStyles: node must be not null`); 28 | } 29 | 30 | if (node.nodeType === Node.TEXT_NODE) { 31 | return Promise.resolve(document.createTextNode(node.textContent || '')); 32 | } 33 | 34 | if (node.nodeType !== Node.ELEMENT_NODE) { 35 | return Promise.resolve(null); 36 | } 37 | 38 | return inlineElementStyles(node as HTMLElement, stylesheet); 39 | } 40 | 41 | function inlineElementStyles(node: HTMLElement, stylesheet: StyleSheet): Promise { 42 | if (node.style.display === 'none') { 43 | return Promise.resolve(document.createComment(`<${node.tagName}> with display: none`)); 44 | } 45 | 46 | const tagName = node.tagName.toLowerCase(); 47 | const newTagName = /^(canvas|img)$/.test(tagName) ? 'div' : tagName; 48 | const newNode = document.createElement(newTagName); 49 | const desiredStyle = getComputedStyle(node); 50 | 51 | // getComputedStyle requires the node to be in the document. 52 | const tempDom = temporaryDom.append(newNode); 53 | 54 | // Create a copy of the default style, because CSSStyleDeclaration auto updates itself. 55 | const defaultStyle = clone(getComputedStyle(newNode)); 56 | tempDom.dispose(); 57 | 58 | const styles: Record = {}; 59 | 60 | // tslint:disable-next-line:prefer-for-of 61 | for (let i = 0; i < desiredStyle.length; i++) { 62 | const key = desiredStyle.item(i); 63 | 64 | // Skip JavaScript stuff. 65 | if (/^(\d+|length|cssText)$/.test(key)) { 66 | continue; 67 | } 68 | 69 | if (ignoredStyles.test(key) || partialStyles.test(key)) { 70 | continue; 71 | } 72 | 73 | const desiredValue = desiredStyle.getPropertyValue(key); 74 | 75 | let value = desiredValue; 76 | const type = typeof value; 77 | 78 | // Skip more JavaScript stuff. 79 | if (type === 'function' || type === 'undefined' || value == null) { 80 | continue; 81 | } 82 | 83 | const forced = forcedStyles.test(key); 84 | 85 | // Skip styles that are already implicitly applied to the node. 86 | if (defaultStyle[key] === desiredValue && !forced) { 87 | continue; 88 | } 89 | 90 | // Skip empty styles. 91 | value = String(value); 92 | if (value === '' && !forced) { 93 | continue; 94 | } 95 | 96 | styles[key] = value; 97 | } 98 | 99 | // Try to save data from canvas. 100 | if (tagName === 'canvas') { 101 | try { 102 | const dataUrl = (node as HTMLCanvasElement).toDataURL(); 103 | styles.backgroundImage = `url("${dataUrl}")`; 104 | } catch (e) { 105 | // nop 106 | } 107 | } 108 | 109 | let done = Promise.resolve(); 110 | 111 | // Try to save data from image. 112 | if (tagName === 'img') { 113 | styles.display = 'block'; 114 | done = loadImageAsDataUrl(node as HTMLImageElement) 115 | .then((dataUrl) => { 116 | if (dataUrl) { 117 | styles.backgroundImage = `url("${dataUrl}")`; 118 | } 119 | }) 120 | .catch((e) => { /* ignore */ }); 121 | } 122 | 123 | return done.then(() => { 124 | const className = node.getAttribute('class') || ''; 125 | if (className) { 126 | newNode.setAttribute('data-carbonite-class', className); 127 | } 128 | 129 | // setAttribute('style', ...) triggers CSP warnings everywhere. 130 | // Setting CSSOM value directly makes XMLSerializer output them in style attribute. 131 | // This works in Chromiums, but Firefox fails to render foreignObject with style attributes. 132 | // https://bugzilla.mozilla.org/show_bug.cgi?id=1358106 133 | newNode.className = stylesheet.createClass(styles); 134 | 135 | // Create inlined versions of child nodes and append them. 136 | const childPromises = []; 137 | 138 | // tslint:disable-next-line:prefer-for-of 139 | for (let i = 0; i < node.childNodes.length; i++) { 140 | const child = node.childNodes[i]; 141 | childPromises.push(inlineStyles(child, stylesheet)); 142 | } 143 | 144 | return Promise.all(childPromises) 145 | .then((children) => { 146 | for (const child of children) { 147 | if (child) { 148 | newNode.appendChild(child); 149 | } 150 | } 151 | 152 | return newNode; 153 | }); 154 | }); 155 | } 156 | 157 | const hop = ({}).hasOwnProperty; 158 | function clone(object: Record) { 159 | const result: Record = {}; 160 | 161 | for (const key in object) { 162 | if (hop.call(object, key)) { 163 | result[key] = object[key]; 164 | } 165 | } 166 | 167 | return result; 168 | } 169 | 170 | function getComputedStyle(e: HTMLElement) { 171 | return e.ownerDocument.defaultView.getComputedStyle(e); 172 | } 173 | 174 | function loadImageAsDataUrl(node: HTMLImageElement): Promise { 175 | const { width, height, src } = node; 176 | if (!width || !height || !src) { 177 | return Promise.resolve(null); 178 | } 179 | 180 | return withLoadedImage(src, (img) => { 181 | // TODO: cache canvases 182 | const canvas = document.createElement('canvas'); 183 | canvas.width = width; 184 | canvas.height = height; 185 | 186 | canvas.getContext('2d')!.drawImage(img, 0, 0); 187 | return canvas.toDataURL(); 188 | }); 189 | } 190 | -------------------------------------------------------------------------------- /src/support.ts: -------------------------------------------------------------------------------- 1 | import * as browser from './browser'; 2 | import {Csp} from './csp'; 3 | 4 | export const URL = window.URL || 5 | ( window).webkitURL || 6 | ( window).mozURL || 7 | window; 8 | 9 | export const isSupported = (csp: Csp) => 10 | // IE doesn't support foreignObject. 11 | !browser.isIE && 12 | // TODO: test on mobile browsers. 13 | !browser.isMobile && 14 | // No way to make Firefox load svg with styles inside into if 15 | // we don't have 'nonce-...' in style-src. 16 | // TODO: maybe detect style-src 'unsafe-inline' somehow and then use 17 | // style attributes? 18 | // https://bugzilla.mozilla.org/show_bug.cgi?id=1358106 19 | !(browser.isFirefox && csp.enabled && !csp.styleNonce) && 20 | typeof XMLSerializer !== 'undefined'; 21 | 22 | export const isNonSvgSupported = (csp: Csp) => 23 | isSupported(csp) && 24 | // Safari and old versions of Opera have trouble rendering foreignObject. 25 | !browser.isSafari && 26 | !browser.isOldOpera && 27 | // Edge silently fails to drawImage SVG after onload. 28 | // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/4411619/ 29 | !browser.isEdge; 30 | 31 | export const areBlobsSupported = (csp: Csp) => 32 | typeof Blob !== 'undefined' && 33 | URL.createObjectURL && 34 | // Safari doesn't want to load SVG blobs with foreignObject inside. 35 | // Also, Safari can't render anything, so blobs are useless for a canvas too. 36 | !browser.isSafari; 37 | -------------------------------------------------------------------------------- /src/temporaryDom.ts: -------------------------------------------------------------------------------- 1 | let container: HTMLElement|null = null; 2 | let refCount = 0; 3 | 4 | /** 5 | * Temporarily appends node to DOM. 6 | */ 7 | export function append(node: HTMLElement): { dispose(): void; } { 8 | refCount++; 9 | if (!container) { 10 | container = document.createElement('div'); 11 | container.style.position = 'absolute'; 12 | container.style.left = '-99999px'; 13 | container.style.top = '-99999px'; 14 | document.body.appendChild(container); 15 | } 16 | 17 | container.appendChild(node); 18 | 19 | const savedContainer = container; 20 | let disposed = false; 21 | 22 | return { 23 | dispose() { 24 | if (disposed) { 25 | return; 26 | } 27 | 28 | disposed = true; 29 | savedContainer.removeChild(node); 30 | if (--refCount === 0) { 31 | savedContainer.parentElement!.removeChild(savedContainer); 32 | container = null; 33 | } 34 | } 35 | }; 36 | } 37 | -------------------------------------------------------------------------------- /src/withLoadedImage.ts: -------------------------------------------------------------------------------- 1 | import * as temporaryDom from './temporaryDom'; 2 | 3 | /** 4 | * Loads image into DOM, applies callback to it, then frees image. 5 | */ 6 | export function withLoadedImage(url: string, callback: (img: HTMLImageElement) => T): Promise { 7 | const img = new Image(); 8 | const tempDom = temporaryDom.append(img); 9 | 10 | const loaded = new Promise((resolve, reject) => { 11 | img.onload = () => resolve(); 12 | img.onerror = () => { 13 | const shortUrl = url.length <= 64 ? url : url.substr(0, 61) + '...'; 14 | reject(new Error(`carbonite: failed to load image ${shortUrl}`)); 15 | }; 16 | 17 | img.src = url; 18 | }); 19 | 20 | return loaded 21 | .then(() => callback(img)) 22 | .then( 23 | (value) => { 24 | tempDom.dispose(); 25 | return value; 26 | }, 27 | (error) => { 28 | tempDom.dispose(); 29 | return Promise.reject(error); 30 | }); 31 | } 32 | -------------------------------------------------------------------------------- /test/stand.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Carbonite test stand 8 | 9 | 10 | 42 | 43 | 44 |
45 | 46 |
47 |
48 | 53 | 60 | 61 |
62 | 63 |
64 |
65 |
66 |
67 |
68 | 69 |
70 |

result

71 | 72 |
73 | 74 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /test/world.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flapenguin/carbonite/b4d56b2de4f95965cf8168f9e4d4ee1e689411ac/test/world.png -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es3", 4 | "module": "commonjs", 5 | "rootDir": "./src", 6 | "lib": [ 7 | "es5", 8 | "dom", 9 | "es2015.promise" 10 | ], 11 | "strict": true 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": {}, 7 | "rules": { 8 | "quotemark": [true, "single", "avoid-escape"], 9 | "ordered-imports": false, 10 | "object-literal-sort-keys": false, 11 | "object-literal-shorthand": false, 12 | "trailing-comma": false, 13 | "no-angle-bracket-type-assertion": false, 14 | "variable-name": [true, "allow-leading-underscore"], 15 | "member-access": [true, "no-public"], 16 | "interface-name": false 17 | }, 18 | "rulesDirectory": [] 19 | } 20 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = { 4 | entry: './src/index.ts', 5 | module: { 6 | rules: [ 7 | { 8 | test: /\.ts$/, 9 | use: 'ts-loader', 10 | exclude: /node_modules/ 11 | } 12 | ] 13 | }, 14 | resolve: { 15 | extensions: [".ts"] 16 | }, 17 | output: { 18 | filename: 'carbonite.js', 19 | path: path.resolve(__dirname, 'dist'), 20 | library: 'carbonite', 21 | libraryTarget: 'umd' 22 | } 23 | }; 24 | --------------------------------------------------------------------------------