├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .npmignore ├── .prettierignore ├── .prettierrc ├── LICENSE.md ├── README.md ├── package-lock.json ├── package.json ├── src ├── index.ts ├── modules │ ├── adaptiveImage.ts │ ├── imageSizeResolver.ts │ ├── imageWrapper.ts │ └── scaledImageResolver.ts └── options.json └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 2 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | **/node_modules/ 2 | lib 3 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | "es6": true, 5 | "browser": true 6 | }, 7 | "plugins": ["prettier"], 8 | "extends": [ 9 | "eslint:recommended", 10 | "plugin:prettier/recommended" 11 | ], 12 | "parserOptions": { 13 | "ecmaVersion": 2018, // Allows for the parsing of modern ECMAScript features 14 | "sourceType": "module", // Allows for the use of imports 15 | "ecmaFeatures": { 16 | "jsx": true 17 | } 18 | }, 19 | "rules": { 20 | // Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs 21 | // e.g. "@typescript-eslint/explicit-function-return-type": "off", 22 | "linebreak-style": ["error", "unix"] 23 | }, 24 | "overrides": [ 25 | { 26 | "files": ["*.ts", "*.tsx"], 27 | "parser": "@typescript-eslint/parser", // Specifies the ESLint parser 28 | "plugins": ["@typescript-eslint", "prettier"], 29 | "extends": [ 30 | "eslint:recommended", 31 | "plugin:@typescript-eslint/recommended", // Uses the recommended rules from the @typescript-eslint/eslint-plugin 32 | "plugin:prettier/recommended", 33 | "prettier/@typescript-eslint" 34 | ], 35 | "rules": { 36 | "linebreak-style": ["error", "unix"], 37 | "@typescript-eslint/explicit-function-return-type": "off", 38 | "@typescript-eslint/no-non-null-assertion": "off" 39 | } 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 18 | .grunt 19 | 20 | # node-waf configuration 21 | .lock-wscript 22 | 23 | # Compiled binary addons (http://nodejs.org/api/addons.html) 24 | build/Release 25 | 26 | # Dependency directory 27 | # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git 28 | node_modules 29 | 30 | lib 31 | 32 | .DS_Store -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | * 2 | !lib/** 3 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | lib 2 | node_modules 3 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": false, 4 | "trailingComma": "es5" 5 | } 6 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2017 Józsa Péter 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React Native Web Image Loader 2 | 3 | Using this loader will automatically bundle scaled counterparts too. Since Image component of react-native-web accepts objects as value of its source property it is possible to display scaled images based on device pixel ratio. 4 | 5 | This loader will inject an AdaptiveImage class into your bundle. Everywhere you require an image an instance of AdaptiveImage will be returned. 6 | 7 | This is my first node.js package so every recommendation is welcome. :smile: 8 | 9 | ## Installation 10 | 11 | Install it via npm: 12 | 13 | ```terminal 14 | $ npm install --save-dev react-native-web-image-loader 15 | ``` 16 | 17 | ## Usage 18 | 19 | In your webpack config use it as a loader for images: 20 | 21 | ```javascript 22 | { 23 | ..., 24 | module: { 25 | rules: [ 26 | { 27 | test: /\.(png|jpe?g|gif)$/, 28 | options: { 29 | name: 'static/media/[name].[hash:8].[ext]', 30 | // publicPath: 'https://cdn.example.com/', // uncomment to override webpack public path 31 | // esModule: true 32 | scalings: { '@2x': 2, '@3x': 3 }, 33 | }, 34 | loader: 'react-native-web-image-loader', 35 | }, 36 | ] 37 | } 38 | } 39 | ``` 40 | 41 | You're done. 42 | 43 | ## Configuration 44 | 45 | The following configuration variables can be defined in the `options` object: 46 | 47 | - `name` The name template of the output files. (default: `[hash].[ext]`) You can use the following placeholders: 48 | - `[ext]` the extension of the resource 49 | - `[name]` the basename of the resource 50 | - `[path]` the path of the resource relative to the `context` query parameter or option. 51 | - `[hash]` the hash of the content, `hex`-encoded `md5` by default 52 | - `scalings` is an object where the keys are the possible filename suffixes and values are the amount of scale. (Default is `{"@2x": 2, "@3x": 3}`, which means filenames ending with "@2x" will be used on devices where the pixel-ratio is 2) 53 | - `imageClassPath` the path of image class that should be used instead of AdaptiveImage. This gives you the possibility to use your own image class representation. 54 | - `publicPath` Specifies a custom public path for the target file(s). Default: `__webpack_public_path__ + outputPath`. You dynamically set custom public path by passing a function. 55 | - `outputPath` Specify a filesystem path where the target file(s) will be placed. 56 | - `esModule` By default, `react-native-web-image-loader` generates JS modules that use the ES modules syntax. You can disable it by setting its value to `false`. 57 | 58 | ## Examples 59 | 60 | We have the following files: 61 | 62 | ``` 63 | |--assets/ 64 | |-- pic1.png 65 | |-- pic1@2x.png 66 | |-- pic1-3x.png 67 | |--index.js 68 | ``` 69 | 70 | webpack.config.js 71 | 72 | ```javascript 73 | module.exports = { 74 | ..., 75 | module: { 76 | rules: [ 77 | { 78 | test: /\.(png|jpe?g|gif)$/, 79 | options: { 80 | name: 'static/media/[name].[hash:8].[ext]', 81 | scalings: { '@2x': 2, '@3x': 3 }, 82 | }, 83 | loader: 'react-native-web-image-loader', 84 | }, 85 | ] 86 | } 87 | } 88 | ``` 89 | 90 | index.js 91 | 92 | ```javascript 93 | import React from 'react' 94 | import { Image } from 'react-native-web' 95 | 96 | export default class Picture extends React.Component { 97 | render() { 98 | return 99 | } 100 | } 101 | ``` 102 | 103 | Value of source property looks like this: 104 | 105 | ```javascript 106 | AdaptiveImage { 107 | "data": { 108 | "uri": "static/media/pic1.abcd1234.png", 109 | "uri@2x": "static/media/pic1@2x.4321dcba.png", 110 | "uri@3x": "static/media/pic1-3x.efgh5678.png", 111 | "width": 128, 112 | "height": 64 113 | }, 114 | get uri(), // returns uri based on pixel ratio 115 | get width(), // returns this.data.width 116 | get height(), // returns this.data.height 117 | } 118 | ``` 119 | 120 | So when Image component resolves source it will treat it as a normal object. But value of uri is dynamically returned according to current device pixel ratio. 121 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-web-image-loader", 3 | "version": "0.1.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.8.3", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 10 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.8.3" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.9.5", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", 19 | "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.9.0", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", 25 | "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.9.0", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "@types/color-name": { 34 | "version": "1.1.1", 35 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 36 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 37 | "dev": true 38 | }, 39 | "@types/eslint-visitor-keys": { 40 | "version": "1.0.0", 41 | "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 42 | "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", 43 | "dev": true 44 | }, 45 | "@types/json-schema": { 46 | "version": "7.0.4", 47 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", 48 | "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", 49 | "dev": true 50 | }, 51 | "@types/node": { 52 | "version": "13.13.1", 53 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.1.tgz", 54 | "integrity": "sha512-uysqysLJ+As9jqI5yqjwP3QJrhOcUwBjHUlUxPxjbplwKoILvXVsmYWEhfmAQlrPfbRZmhJB007o4L9sKqtHqQ==", 55 | "dev": true 56 | }, 57 | "@typescript-eslint/eslint-plugin": { 58 | "version": "2.29.0", 59 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.29.0.tgz", 60 | "integrity": "sha512-X/YAY7azKirENm4QRpT7OVmzok02cSkqeIcLmdz6gXUQG4Hk0Fi9oBAynSAyNXeGdMRuZvjBa0c1Lu0dn/u6VA==", 61 | "dev": true, 62 | "requires": { 63 | "@typescript-eslint/experimental-utils": "2.29.0", 64 | "functional-red-black-tree": "^1.0.1", 65 | "regexpp": "^3.0.0", 66 | "tsutils": "^3.17.1" 67 | } 68 | }, 69 | "@typescript-eslint/experimental-utils": { 70 | "version": "2.29.0", 71 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.29.0.tgz", 72 | "integrity": "sha512-H/6VJr6eWYstyqjWXBP2Nn1hQJyvJoFdDtsHxGiD+lEP7piGnGpb/ZQd+z1ZSB1F7dN+WsxUDh8+S4LwI+f3jw==", 73 | "dev": true, 74 | "requires": { 75 | "@types/json-schema": "^7.0.3", 76 | "@typescript-eslint/typescript-estree": "2.29.0", 77 | "eslint-scope": "^5.0.0", 78 | "eslint-utils": "^2.0.0" 79 | } 80 | }, 81 | "@typescript-eslint/parser": { 82 | "version": "2.29.0", 83 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.29.0.tgz", 84 | "integrity": "sha512-H78M+jcu5Tf6m/5N8iiFblUUv+HJDguMSdFfzwa6vSg9lKR8Mk9BsgeSjO8l2EshKnJKcbv0e8IDDOvSNjl0EA==", 85 | "dev": true, 86 | "requires": { 87 | "@types/eslint-visitor-keys": "^1.0.0", 88 | "@typescript-eslint/experimental-utils": "2.29.0", 89 | "@typescript-eslint/typescript-estree": "2.29.0", 90 | "eslint-visitor-keys": "^1.1.0" 91 | } 92 | }, 93 | "@typescript-eslint/typescript-estree": { 94 | "version": "2.29.0", 95 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.29.0.tgz", 96 | "integrity": "sha512-3YGbtnWy4az16Egy5Fj5CckkVlpIh0MADtAQza+jiMADRSKkjdpzZp/5WuvwK/Qib3Z0HtzrDFeWanS99dNhnA==", 97 | "dev": true, 98 | "requires": { 99 | "debug": "^4.1.1", 100 | "eslint-visitor-keys": "^1.1.0", 101 | "glob": "^7.1.6", 102 | "is-glob": "^4.0.1", 103 | "lodash": "^4.17.15", 104 | "semver": "^6.3.0", 105 | "tsutils": "^3.17.1" 106 | }, 107 | "dependencies": { 108 | "glob": { 109 | "version": "7.1.6", 110 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 111 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 112 | "dev": true, 113 | "requires": { 114 | "fs.realpath": "^1.0.0", 115 | "inflight": "^1.0.4", 116 | "inherits": "2", 117 | "minimatch": "^3.0.4", 118 | "once": "^1.3.0", 119 | "path-is-absolute": "^1.0.0" 120 | } 121 | } 122 | } 123 | }, 124 | "acorn": { 125 | "version": "7.1.1", 126 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", 127 | "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", 128 | "dev": true 129 | }, 130 | "acorn-jsx": { 131 | "version": "5.2.0", 132 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", 133 | "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", 134 | "dev": true 135 | }, 136 | "ajv": { 137 | "version": "6.12.2", 138 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", 139 | "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", 140 | "requires": { 141 | "fast-deep-equal": "^3.1.1", 142 | "fast-json-stable-stringify": "^2.0.0", 143 | "json-schema-traverse": "^0.4.1", 144 | "uri-js": "^4.2.2" 145 | } 146 | }, 147 | "ajv-keywords": { 148 | "version": "3.4.1", 149 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", 150 | "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" 151 | }, 152 | "ansi-escapes": { 153 | "version": "4.3.1", 154 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", 155 | "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", 156 | "dev": true, 157 | "requires": { 158 | "type-fest": "^0.11.0" 159 | }, 160 | "dependencies": { 161 | "type-fest": { 162 | "version": "0.11.0", 163 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", 164 | "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", 165 | "dev": true 166 | } 167 | } 168 | }, 169 | "ansi-regex": { 170 | "version": "5.0.0", 171 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 172 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 173 | "dev": true 174 | }, 175 | "ansi-styles": { 176 | "version": "3.2.1", 177 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 178 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 179 | "dev": true, 180 | "requires": { 181 | "color-convert": "^1.9.0" 182 | } 183 | }, 184 | "argparse": { 185 | "version": "1.0.10", 186 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 187 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 188 | "dev": true, 189 | "requires": { 190 | "sprintf-js": "~1.0.2" 191 | } 192 | }, 193 | "astral-regex": { 194 | "version": "1.0.0", 195 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 196 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 197 | "dev": true 198 | }, 199 | "balanced-match": { 200 | "version": "1.0.0", 201 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 202 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 203 | "dev": true 204 | }, 205 | "big.js": { 206 | "version": "5.2.2", 207 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 208 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" 209 | }, 210 | "brace-expansion": { 211 | "version": "1.1.11", 212 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 213 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 214 | "dev": true, 215 | "requires": { 216 | "balanced-match": "^1.0.0", 217 | "concat-map": "0.0.1" 218 | } 219 | }, 220 | "callsites": { 221 | "version": "3.1.0", 222 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 223 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 224 | "dev": true 225 | }, 226 | "chalk": { 227 | "version": "2.4.2", 228 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 229 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 230 | "dev": true, 231 | "requires": { 232 | "ansi-styles": "^3.2.1", 233 | "escape-string-regexp": "^1.0.5", 234 | "supports-color": "^5.3.0" 235 | } 236 | }, 237 | "chardet": { 238 | "version": "0.7.0", 239 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 240 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 241 | "dev": true 242 | }, 243 | "cli-cursor": { 244 | "version": "3.1.0", 245 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 246 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 247 | "dev": true, 248 | "requires": { 249 | "restore-cursor": "^3.1.0" 250 | } 251 | }, 252 | "cli-width": { 253 | "version": "2.2.1", 254 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 255 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 256 | "dev": true 257 | }, 258 | "color-convert": { 259 | "version": "1.9.3", 260 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 261 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 262 | "dev": true, 263 | "requires": { 264 | "color-name": "1.1.3" 265 | } 266 | }, 267 | "color-name": { 268 | "version": "1.1.3", 269 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 270 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 271 | "dev": true 272 | }, 273 | "commondir": { 274 | "version": "1.0.1", 275 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 276 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", 277 | "dev": true 278 | }, 279 | "concat-map": { 280 | "version": "0.0.1", 281 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 282 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 283 | "dev": true 284 | }, 285 | "cross-spawn": { 286 | "version": "6.0.5", 287 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 288 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 289 | "dev": true, 290 | "requires": { 291 | "nice-try": "^1.0.4", 292 | "path-key": "^2.0.1", 293 | "semver": "^5.5.0", 294 | "shebang-command": "^1.2.0", 295 | "which": "^1.2.9" 296 | }, 297 | "dependencies": { 298 | "semver": { 299 | "version": "5.7.1", 300 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 301 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 302 | "dev": true 303 | } 304 | } 305 | }, 306 | "debug": { 307 | "version": "4.1.1", 308 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 309 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 310 | "dev": true, 311 | "requires": { 312 | "ms": "^2.1.1" 313 | } 314 | }, 315 | "deep-is": { 316 | "version": "0.1.3", 317 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 318 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 319 | "dev": true 320 | }, 321 | "doctrine": { 322 | "version": "3.0.0", 323 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 324 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 325 | "dev": true, 326 | "requires": { 327 | "esutils": "^2.0.2" 328 | } 329 | }, 330 | "emoji-regex": { 331 | "version": "8.0.0", 332 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 333 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 334 | "dev": true 335 | }, 336 | "emojis-list": { 337 | "version": "3.0.0", 338 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", 339 | "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" 340 | }, 341 | "escape-string-regexp": { 342 | "version": "1.0.5", 343 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 344 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 345 | "dev": true 346 | }, 347 | "eslint": { 348 | "version": "6.8.0", 349 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", 350 | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", 351 | "dev": true, 352 | "requires": { 353 | "@babel/code-frame": "^7.0.0", 354 | "ajv": "^6.10.0", 355 | "chalk": "^2.1.0", 356 | "cross-spawn": "^6.0.5", 357 | "debug": "^4.0.1", 358 | "doctrine": "^3.0.0", 359 | "eslint-scope": "^5.0.0", 360 | "eslint-utils": "^1.4.3", 361 | "eslint-visitor-keys": "^1.1.0", 362 | "espree": "^6.1.2", 363 | "esquery": "^1.0.1", 364 | "esutils": "^2.0.2", 365 | "file-entry-cache": "^5.0.1", 366 | "functional-red-black-tree": "^1.0.1", 367 | "glob-parent": "^5.0.0", 368 | "globals": "^12.1.0", 369 | "ignore": "^4.0.6", 370 | "import-fresh": "^3.0.0", 371 | "imurmurhash": "^0.1.4", 372 | "inquirer": "^7.0.0", 373 | "is-glob": "^4.0.0", 374 | "js-yaml": "^3.13.1", 375 | "json-stable-stringify-without-jsonify": "^1.0.1", 376 | "levn": "^0.3.0", 377 | "lodash": "^4.17.14", 378 | "minimatch": "^3.0.4", 379 | "mkdirp": "^0.5.1", 380 | "natural-compare": "^1.4.0", 381 | "optionator": "^0.8.3", 382 | "progress": "^2.0.0", 383 | "regexpp": "^2.0.1", 384 | "semver": "^6.1.2", 385 | "strip-ansi": "^5.2.0", 386 | "strip-json-comments": "^3.0.1", 387 | "table": "^5.2.3", 388 | "text-table": "^0.2.0", 389 | "v8-compile-cache": "^2.0.3" 390 | }, 391 | "dependencies": { 392 | "eslint-utils": { 393 | "version": "1.4.3", 394 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 395 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 396 | "dev": true, 397 | "requires": { 398 | "eslint-visitor-keys": "^1.1.0" 399 | } 400 | }, 401 | "regexpp": { 402 | "version": "2.0.1", 403 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 404 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 405 | "dev": true 406 | } 407 | } 408 | }, 409 | "eslint-config-prettier": { 410 | "version": "6.10.1", 411 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz", 412 | "integrity": "sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ==", 413 | "dev": true, 414 | "requires": { 415 | "get-stdin": "^6.0.0" 416 | } 417 | }, 418 | "eslint-loader": { 419 | "version": "3.0.4", 420 | "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.4.tgz", 421 | "integrity": "sha512-I496aBd+Hi23Y0Cx+sKvw+VwlJre4ScIRlkrvTO6Scq68X/UXbN6F3lAhN8b0Zv8atAyprkyrA42K5QBJtCyaw==", 422 | "dev": true, 423 | "requires": { 424 | "fs-extra": "^8.1.0", 425 | "loader-fs-cache": "^1.0.3", 426 | "loader-utils": "^1.2.3", 427 | "object-hash": "^2.0.3", 428 | "schema-utils": "^2.6.5" 429 | }, 430 | "dependencies": { 431 | "big.js": { 432 | "version": "5.2.2", 433 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 434 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", 435 | "dev": true 436 | }, 437 | "emojis-list": { 438 | "version": "3.0.0", 439 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", 440 | "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", 441 | "dev": true 442 | }, 443 | "json5": { 444 | "version": "1.0.1", 445 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 446 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 447 | "dev": true, 448 | "requires": { 449 | "minimist": "^1.2.0" 450 | } 451 | }, 452 | "loader-utils": { 453 | "version": "1.4.0", 454 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", 455 | "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", 456 | "dev": true, 457 | "requires": { 458 | "big.js": "^5.2.2", 459 | "emojis-list": "^3.0.0", 460 | "json5": "^1.0.1" 461 | } 462 | } 463 | } 464 | }, 465 | "eslint-plugin-prettier": { 466 | "version": "3.1.3", 467 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz", 468 | "integrity": "sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ==", 469 | "dev": true, 470 | "requires": { 471 | "prettier-linter-helpers": "^1.0.0" 472 | } 473 | }, 474 | "eslint-scope": { 475 | "version": "5.0.0", 476 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 477 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 478 | "dev": true, 479 | "requires": { 480 | "esrecurse": "^4.1.0", 481 | "estraverse": "^4.1.1" 482 | } 483 | }, 484 | "eslint-utils": { 485 | "version": "2.0.0", 486 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", 487 | "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", 488 | "dev": true, 489 | "requires": { 490 | "eslint-visitor-keys": "^1.1.0" 491 | } 492 | }, 493 | "eslint-visitor-keys": { 494 | "version": "1.1.0", 495 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 496 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 497 | "dev": true 498 | }, 499 | "espree": { 500 | "version": "6.2.1", 501 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", 502 | "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", 503 | "dev": true, 504 | "requires": { 505 | "acorn": "^7.1.1", 506 | "acorn-jsx": "^5.2.0", 507 | "eslint-visitor-keys": "^1.1.0" 508 | } 509 | }, 510 | "esprima": { 511 | "version": "4.0.1", 512 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 513 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 514 | "dev": true 515 | }, 516 | "esquery": { 517 | "version": "1.3.1", 518 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", 519 | "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", 520 | "dev": true, 521 | "requires": { 522 | "estraverse": "^5.1.0" 523 | }, 524 | "dependencies": { 525 | "estraverse": { 526 | "version": "5.1.0", 527 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", 528 | "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", 529 | "dev": true 530 | } 531 | } 532 | }, 533 | "esrecurse": { 534 | "version": "4.2.1", 535 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 536 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 537 | "dev": true, 538 | "requires": { 539 | "estraverse": "^4.1.0" 540 | } 541 | }, 542 | "estraverse": { 543 | "version": "4.3.0", 544 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 545 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 546 | "dev": true 547 | }, 548 | "esutils": { 549 | "version": "2.0.3", 550 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 551 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 552 | "dev": true 553 | }, 554 | "external-editor": { 555 | "version": "3.1.0", 556 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 557 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 558 | "dev": true, 559 | "requires": { 560 | "chardet": "^0.7.0", 561 | "iconv-lite": "^0.4.24", 562 | "tmp": "^0.0.33" 563 | } 564 | }, 565 | "fast-deep-equal": { 566 | "version": "3.1.1", 567 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 568 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" 569 | }, 570 | "fast-diff": { 571 | "version": "1.2.0", 572 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", 573 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", 574 | "dev": true 575 | }, 576 | "fast-json-stable-stringify": { 577 | "version": "2.1.0", 578 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 579 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 580 | }, 581 | "fast-levenshtein": { 582 | "version": "2.0.6", 583 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 584 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 585 | "dev": true 586 | }, 587 | "figures": { 588 | "version": "3.2.0", 589 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 590 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 591 | "dev": true, 592 | "requires": { 593 | "escape-string-regexp": "^1.0.5" 594 | } 595 | }, 596 | "file-entry-cache": { 597 | "version": "5.0.1", 598 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 599 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 600 | "dev": true, 601 | "requires": { 602 | "flat-cache": "^2.0.1" 603 | } 604 | }, 605 | "find-cache-dir": { 606 | "version": "0.1.1", 607 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", 608 | "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", 609 | "dev": true, 610 | "requires": { 611 | "commondir": "^1.0.1", 612 | "mkdirp": "^0.5.1", 613 | "pkg-dir": "^1.0.0" 614 | } 615 | }, 616 | "find-up": { 617 | "version": "1.1.2", 618 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 619 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 620 | "dev": true, 621 | "requires": { 622 | "path-exists": "^2.0.0", 623 | "pinkie-promise": "^2.0.0" 624 | } 625 | }, 626 | "flat-cache": { 627 | "version": "2.0.1", 628 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 629 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 630 | "dev": true, 631 | "requires": { 632 | "flatted": "^2.0.0", 633 | "rimraf": "2.6.3", 634 | "write": "1.0.3" 635 | }, 636 | "dependencies": { 637 | "rimraf": { 638 | "version": "2.6.3", 639 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 640 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 641 | "dev": true, 642 | "requires": { 643 | "glob": "^7.1.3" 644 | } 645 | } 646 | } 647 | }, 648 | "flatted": { 649 | "version": "2.0.2", 650 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 651 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 652 | "dev": true 653 | }, 654 | "fs-extra": { 655 | "version": "8.1.0", 656 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 657 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 658 | "dev": true, 659 | "requires": { 660 | "graceful-fs": "^4.2.0", 661 | "jsonfile": "^4.0.0", 662 | "universalify": "^0.1.0" 663 | } 664 | }, 665 | "fs.realpath": { 666 | "version": "1.0.0", 667 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 668 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 669 | "dev": true 670 | }, 671 | "functional-red-black-tree": { 672 | "version": "1.0.1", 673 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 674 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 675 | "dev": true 676 | }, 677 | "get-stdin": { 678 | "version": "6.0.0", 679 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", 680 | "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", 681 | "dev": true 682 | }, 683 | "glob": { 684 | "version": "7.1.3", 685 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 686 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 687 | "dev": true, 688 | "requires": { 689 | "fs.realpath": "^1.0.0", 690 | "inflight": "^1.0.4", 691 | "inherits": "2", 692 | "minimatch": "^3.0.4", 693 | "once": "^1.3.0", 694 | "path-is-absolute": "^1.0.0" 695 | } 696 | }, 697 | "glob-parent": { 698 | "version": "5.1.1", 699 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 700 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 701 | "dev": true, 702 | "requires": { 703 | "is-glob": "^4.0.1" 704 | } 705 | }, 706 | "globals": { 707 | "version": "12.4.0", 708 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 709 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 710 | "dev": true, 711 | "requires": { 712 | "type-fest": "^0.8.1" 713 | } 714 | }, 715 | "graceful-fs": { 716 | "version": "4.2.3", 717 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 718 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", 719 | "dev": true 720 | }, 721 | "has-flag": { 722 | "version": "3.0.0", 723 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 724 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 725 | "dev": true 726 | }, 727 | "iconv-lite": { 728 | "version": "0.4.24", 729 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 730 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 731 | "dev": true, 732 | "requires": { 733 | "safer-buffer": ">= 2.1.2 < 3" 734 | } 735 | }, 736 | "ignore": { 737 | "version": "4.0.6", 738 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 739 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 740 | "dev": true 741 | }, 742 | "image-size": { 743 | "version": "0.5.5", 744 | "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", 745 | "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=" 746 | }, 747 | "import-fresh": { 748 | "version": "3.2.1", 749 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 750 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 751 | "dev": true, 752 | "requires": { 753 | "parent-module": "^1.0.0", 754 | "resolve-from": "^4.0.0" 755 | } 756 | }, 757 | "imurmurhash": { 758 | "version": "0.1.4", 759 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 760 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 761 | "dev": true 762 | }, 763 | "inflight": { 764 | "version": "1.0.6", 765 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 766 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 767 | "dev": true, 768 | "requires": { 769 | "once": "^1.3.0", 770 | "wrappy": "1" 771 | } 772 | }, 773 | "inherits": { 774 | "version": "2.0.3", 775 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 776 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 777 | "dev": true 778 | }, 779 | "inquirer": { 780 | "version": "7.1.0", 781 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", 782 | "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", 783 | "dev": true, 784 | "requires": { 785 | "ansi-escapes": "^4.2.1", 786 | "chalk": "^3.0.0", 787 | "cli-cursor": "^3.1.0", 788 | "cli-width": "^2.0.0", 789 | "external-editor": "^3.0.3", 790 | "figures": "^3.0.0", 791 | "lodash": "^4.17.15", 792 | "mute-stream": "0.0.8", 793 | "run-async": "^2.4.0", 794 | "rxjs": "^6.5.3", 795 | "string-width": "^4.1.0", 796 | "strip-ansi": "^6.0.0", 797 | "through": "^2.3.6" 798 | }, 799 | "dependencies": { 800 | "ansi-styles": { 801 | "version": "4.2.1", 802 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 803 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 804 | "dev": true, 805 | "requires": { 806 | "@types/color-name": "^1.1.1", 807 | "color-convert": "^2.0.1" 808 | } 809 | }, 810 | "chalk": { 811 | "version": "3.0.0", 812 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 813 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 814 | "dev": true, 815 | "requires": { 816 | "ansi-styles": "^4.1.0", 817 | "supports-color": "^7.1.0" 818 | } 819 | }, 820 | "color-convert": { 821 | "version": "2.0.1", 822 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 823 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 824 | "dev": true, 825 | "requires": { 826 | "color-name": "~1.1.4" 827 | } 828 | }, 829 | "color-name": { 830 | "version": "1.1.4", 831 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 832 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 833 | "dev": true 834 | }, 835 | "has-flag": { 836 | "version": "4.0.0", 837 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 838 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 839 | "dev": true 840 | }, 841 | "strip-ansi": { 842 | "version": "6.0.0", 843 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 844 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 845 | "dev": true, 846 | "requires": { 847 | "ansi-regex": "^5.0.0" 848 | } 849 | }, 850 | "supports-color": { 851 | "version": "7.1.0", 852 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 853 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 854 | "dev": true, 855 | "requires": { 856 | "has-flag": "^4.0.0" 857 | } 858 | } 859 | } 860 | }, 861 | "is-extglob": { 862 | "version": "2.1.1", 863 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 864 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 865 | "dev": true 866 | }, 867 | "is-fullwidth-code-point": { 868 | "version": "3.0.0", 869 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 870 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 871 | "dev": true 872 | }, 873 | "is-glob": { 874 | "version": "4.0.1", 875 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 876 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 877 | "dev": true, 878 | "requires": { 879 | "is-extglob": "^2.1.1" 880 | } 881 | }, 882 | "is-promise": { 883 | "version": "2.1.0", 884 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 885 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 886 | "dev": true 887 | }, 888 | "isexe": { 889 | "version": "2.0.0", 890 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 891 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 892 | "dev": true 893 | }, 894 | "js-tokens": { 895 | "version": "4.0.0", 896 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 897 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 898 | "dev": true 899 | }, 900 | "js-yaml": { 901 | "version": "3.13.1", 902 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 903 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 904 | "dev": true, 905 | "requires": { 906 | "argparse": "^1.0.7", 907 | "esprima": "^4.0.0" 908 | } 909 | }, 910 | "json-schema-traverse": { 911 | "version": "0.4.1", 912 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 913 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 914 | }, 915 | "json-stable-stringify-without-jsonify": { 916 | "version": "1.0.1", 917 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 918 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 919 | "dev": true 920 | }, 921 | "json5": { 922 | "version": "2.1.3", 923 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", 924 | "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", 925 | "requires": { 926 | "minimist": "^1.2.5" 927 | } 928 | }, 929 | "jsonfile": { 930 | "version": "4.0.0", 931 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 932 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 933 | "dev": true, 934 | "requires": { 935 | "graceful-fs": "^4.1.6" 936 | } 937 | }, 938 | "levn": { 939 | "version": "0.3.0", 940 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 941 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 942 | "dev": true, 943 | "requires": { 944 | "prelude-ls": "~1.1.2", 945 | "type-check": "~0.3.2" 946 | } 947 | }, 948 | "loader-fs-cache": { 949 | "version": "1.0.3", 950 | "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", 951 | "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", 952 | "dev": true, 953 | "requires": { 954 | "find-cache-dir": "^0.1.1", 955 | "mkdirp": "^0.5.1" 956 | } 957 | }, 958 | "loader-utils": { 959 | "version": "2.0.0", 960 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", 961 | "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", 962 | "requires": { 963 | "big.js": "^5.2.2", 964 | "emojis-list": "^3.0.0", 965 | "json5": "^2.1.2" 966 | } 967 | }, 968 | "lodash": { 969 | "version": "4.17.15", 970 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 971 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 972 | "dev": true 973 | }, 974 | "mimic-fn": { 975 | "version": "2.1.0", 976 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 977 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 978 | "dev": true 979 | }, 980 | "minimatch": { 981 | "version": "3.0.4", 982 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 983 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 984 | "dev": true, 985 | "requires": { 986 | "brace-expansion": "^1.1.7" 987 | } 988 | }, 989 | "minimist": { 990 | "version": "1.2.5", 991 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 992 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 993 | }, 994 | "mkdirp": { 995 | "version": "0.5.5", 996 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 997 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 998 | "dev": true, 999 | "requires": { 1000 | "minimist": "^1.2.5" 1001 | } 1002 | }, 1003 | "ms": { 1004 | "version": "2.1.2", 1005 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1006 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1007 | "dev": true 1008 | }, 1009 | "mute-stream": { 1010 | "version": "0.0.8", 1011 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1012 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1013 | "dev": true 1014 | }, 1015 | "natural-compare": { 1016 | "version": "1.4.0", 1017 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1018 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1019 | "dev": true 1020 | }, 1021 | "nice-try": { 1022 | "version": "1.0.5", 1023 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1024 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1025 | "dev": true 1026 | }, 1027 | "object-hash": { 1028 | "version": "2.0.3", 1029 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", 1030 | "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", 1031 | "dev": true 1032 | }, 1033 | "once": { 1034 | "version": "1.4.0", 1035 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1036 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1037 | "dev": true, 1038 | "requires": { 1039 | "wrappy": "1" 1040 | } 1041 | }, 1042 | "onetime": { 1043 | "version": "5.1.0", 1044 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 1045 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 1046 | "dev": true, 1047 | "requires": { 1048 | "mimic-fn": "^2.1.0" 1049 | } 1050 | }, 1051 | "optionator": { 1052 | "version": "0.8.3", 1053 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1054 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1055 | "dev": true, 1056 | "requires": { 1057 | "deep-is": "~0.1.3", 1058 | "fast-levenshtein": "~2.0.6", 1059 | "levn": "~0.3.0", 1060 | "prelude-ls": "~1.1.2", 1061 | "type-check": "~0.3.2", 1062 | "word-wrap": "~1.2.3" 1063 | } 1064 | }, 1065 | "os-tmpdir": { 1066 | "version": "1.0.2", 1067 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1068 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1069 | "dev": true 1070 | }, 1071 | "parent-module": { 1072 | "version": "1.0.1", 1073 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1074 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1075 | "dev": true, 1076 | "requires": { 1077 | "callsites": "^3.0.0" 1078 | } 1079 | }, 1080 | "path-exists": { 1081 | "version": "2.1.0", 1082 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1083 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1084 | "dev": true, 1085 | "requires": { 1086 | "pinkie-promise": "^2.0.0" 1087 | } 1088 | }, 1089 | "path-is-absolute": { 1090 | "version": "1.0.1", 1091 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1092 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1093 | "dev": true 1094 | }, 1095 | "path-key": { 1096 | "version": "2.0.1", 1097 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1098 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1099 | "dev": true 1100 | }, 1101 | "pinkie": { 1102 | "version": "2.0.4", 1103 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1104 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1105 | "dev": true 1106 | }, 1107 | "pinkie-promise": { 1108 | "version": "2.0.1", 1109 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1110 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1111 | "dev": true, 1112 | "requires": { 1113 | "pinkie": "^2.0.0" 1114 | } 1115 | }, 1116 | "pkg-dir": { 1117 | "version": "1.0.0", 1118 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", 1119 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", 1120 | "dev": true, 1121 | "requires": { 1122 | "find-up": "^1.0.0" 1123 | } 1124 | }, 1125 | "prelude-ls": { 1126 | "version": "1.1.2", 1127 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1128 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1129 | "dev": true 1130 | }, 1131 | "prettier": { 1132 | "version": "2.0.4", 1133 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.4.tgz", 1134 | "integrity": "sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w==", 1135 | "dev": true 1136 | }, 1137 | "prettier-linter-helpers": { 1138 | "version": "1.0.0", 1139 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 1140 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 1141 | "dev": true, 1142 | "requires": { 1143 | "fast-diff": "^1.1.2" 1144 | } 1145 | }, 1146 | "progress": { 1147 | "version": "2.0.3", 1148 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1149 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1150 | "dev": true 1151 | }, 1152 | "punycode": { 1153 | "version": "2.1.1", 1154 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1155 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1156 | }, 1157 | "regexpp": { 1158 | "version": "3.1.0", 1159 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 1160 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 1161 | "dev": true 1162 | }, 1163 | "resolve-from": { 1164 | "version": "4.0.0", 1165 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1166 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1167 | "dev": true 1168 | }, 1169 | "restore-cursor": { 1170 | "version": "3.1.0", 1171 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1172 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1173 | "dev": true, 1174 | "requires": { 1175 | "onetime": "^5.1.0", 1176 | "signal-exit": "^3.0.2" 1177 | } 1178 | }, 1179 | "rimraf": { 1180 | "version": "2.6.2", 1181 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1182 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1183 | "dev": true, 1184 | "requires": { 1185 | "glob": "^7.0.5" 1186 | } 1187 | }, 1188 | "run-async": { 1189 | "version": "2.4.0", 1190 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", 1191 | "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", 1192 | "dev": true, 1193 | "requires": { 1194 | "is-promise": "^2.1.0" 1195 | } 1196 | }, 1197 | "rxjs": { 1198 | "version": "6.5.5", 1199 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", 1200 | "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", 1201 | "dev": true, 1202 | "requires": { 1203 | "tslib": "^1.9.0" 1204 | } 1205 | }, 1206 | "safer-buffer": { 1207 | "version": "2.1.2", 1208 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1209 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1210 | "dev": true 1211 | }, 1212 | "schema-utils": { 1213 | "version": "2.6.6", 1214 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", 1215 | "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", 1216 | "requires": { 1217 | "ajv": "^6.12.0", 1218 | "ajv-keywords": "^3.4.1" 1219 | } 1220 | }, 1221 | "semver": { 1222 | "version": "6.3.0", 1223 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1224 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1225 | "dev": true 1226 | }, 1227 | "shebang-command": { 1228 | "version": "1.2.0", 1229 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1230 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1231 | "dev": true, 1232 | "requires": { 1233 | "shebang-regex": "^1.0.0" 1234 | } 1235 | }, 1236 | "shebang-regex": { 1237 | "version": "1.0.0", 1238 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1239 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1240 | "dev": true 1241 | }, 1242 | "signal-exit": { 1243 | "version": "3.0.3", 1244 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1245 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 1246 | "dev": true 1247 | }, 1248 | "slice-ansi": { 1249 | "version": "2.1.0", 1250 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1251 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1252 | "dev": true, 1253 | "requires": { 1254 | "ansi-styles": "^3.2.0", 1255 | "astral-regex": "^1.0.0", 1256 | "is-fullwidth-code-point": "^2.0.0" 1257 | }, 1258 | "dependencies": { 1259 | "is-fullwidth-code-point": { 1260 | "version": "2.0.0", 1261 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1262 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1263 | "dev": true 1264 | } 1265 | } 1266 | }, 1267 | "sprintf-js": { 1268 | "version": "1.0.3", 1269 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1270 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1271 | "dev": true 1272 | }, 1273 | "string-width": { 1274 | "version": "4.2.0", 1275 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1276 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1277 | "dev": true, 1278 | "requires": { 1279 | "emoji-regex": "^8.0.0", 1280 | "is-fullwidth-code-point": "^3.0.0", 1281 | "strip-ansi": "^6.0.0" 1282 | }, 1283 | "dependencies": { 1284 | "strip-ansi": { 1285 | "version": "6.0.0", 1286 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1287 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1288 | "dev": true, 1289 | "requires": { 1290 | "ansi-regex": "^5.0.0" 1291 | } 1292 | } 1293 | } 1294 | }, 1295 | "strip-ansi": { 1296 | "version": "5.2.0", 1297 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1298 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1299 | "dev": true, 1300 | "requires": { 1301 | "ansi-regex": "^4.1.0" 1302 | }, 1303 | "dependencies": { 1304 | "ansi-regex": { 1305 | "version": "4.1.0", 1306 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1307 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1308 | "dev": true 1309 | } 1310 | } 1311 | }, 1312 | "strip-json-comments": { 1313 | "version": "3.1.0", 1314 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", 1315 | "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", 1316 | "dev": true 1317 | }, 1318 | "supports-color": { 1319 | "version": "5.5.0", 1320 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1321 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1322 | "dev": true, 1323 | "requires": { 1324 | "has-flag": "^3.0.0" 1325 | } 1326 | }, 1327 | "table": { 1328 | "version": "5.4.6", 1329 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1330 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1331 | "dev": true, 1332 | "requires": { 1333 | "ajv": "^6.10.2", 1334 | "lodash": "^4.17.14", 1335 | "slice-ansi": "^2.1.0", 1336 | "string-width": "^3.0.0" 1337 | }, 1338 | "dependencies": { 1339 | "emoji-regex": { 1340 | "version": "7.0.3", 1341 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1342 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 1343 | "dev": true 1344 | }, 1345 | "is-fullwidth-code-point": { 1346 | "version": "2.0.0", 1347 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1348 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1349 | "dev": true 1350 | }, 1351 | "string-width": { 1352 | "version": "3.1.0", 1353 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1354 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1355 | "dev": true, 1356 | "requires": { 1357 | "emoji-regex": "^7.0.1", 1358 | "is-fullwidth-code-point": "^2.0.0", 1359 | "strip-ansi": "^5.1.0" 1360 | } 1361 | } 1362 | } 1363 | }, 1364 | "text-table": { 1365 | "version": "0.2.0", 1366 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1367 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1368 | "dev": true 1369 | }, 1370 | "through": { 1371 | "version": "2.3.8", 1372 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1373 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1374 | "dev": true 1375 | }, 1376 | "tmp": { 1377 | "version": "0.0.33", 1378 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1379 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1380 | "dev": true, 1381 | "requires": { 1382 | "os-tmpdir": "~1.0.2" 1383 | } 1384 | }, 1385 | "tslib": { 1386 | "version": "1.11.1", 1387 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", 1388 | "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", 1389 | "dev": true 1390 | }, 1391 | "tsutils": { 1392 | "version": "3.17.1", 1393 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", 1394 | "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", 1395 | "dev": true, 1396 | "requires": { 1397 | "tslib": "^1.8.1" 1398 | } 1399 | }, 1400 | "type-check": { 1401 | "version": "0.3.2", 1402 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1403 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1404 | "dev": true, 1405 | "requires": { 1406 | "prelude-ls": "~1.1.2" 1407 | } 1408 | }, 1409 | "type-fest": { 1410 | "version": "0.8.1", 1411 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1412 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 1413 | "dev": true 1414 | }, 1415 | "typescript": { 1416 | "version": "3.8.3", 1417 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", 1418 | "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", 1419 | "dev": true 1420 | }, 1421 | "universalify": { 1422 | "version": "0.1.2", 1423 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1424 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1425 | "dev": true 1426 | }, 1427 | "uri-js": { 1428 | "version": "4.2.2", 1429 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1430 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1431 | "requires": { 1432 | "punycode": "^2.1.0" 1433 | } 1434 | }, 1435 | "v8-compile-cache": { 1436 | "version": "2.1.0", 1437 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 1438 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 1439 | "dev": true 1440 | }, 1441 | "which": { 1442 | "version": "1.3.1", 1443 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1444 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1445 | "dev": true, 1446 | "requires": { 1447 | "isexe": "^2.0.0" 1448 | } 1449 | }, 1450 | "word-wrap": { 1451 | "version": "1.2.3", 1452 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1453 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1454 | "dev": true 1455 | }, 1456 | "wrappy": { 1457 | "version": "1.0.2", 1458 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1459 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1460 | "dev": true 1461 | }, 1462 | "write": { 1463 | "version": "1.0.3", 1464 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1465 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1466 | "dev": true, 1467 | "requires": { 1468 | "mkdirp": "^0.5.1" 1469 | } 1470 | } 1471 | } 1472 | } 1473 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-web-image-loader", 3 | "version": "0.1.1", 4 | "description": "react-native-web-image-loader", 5 | "main": "lib/index.js", 6 | "scripts": { 7 | "build": "rimraf lib/* && tsc -b", 8 | "dev": "tsc -b -w", 9 | "prepublish": "npm run build" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/peter-jozsa/react-native-web-image-loader.git" 14 | }, 15 | "keywords": [ 16 | "webpack", 17 | "react", 18 | "native", 19 | "image", 20 | "loader", 21 | "web" 22 | ], 23 | "author": "Józsa Péter", 24 | "license": "MIT", 25 | "bugs": { 26 | "url": "https://github.com/peter-jozsa/react-native-web-image-loader/issues" 27 | }, 28 | "homepage": "https://github.com/peter-jozsa/react-native-web-image-loader#readme", 29 | "devDependencies": { 30 | "@types/node": "^13.13.1", 31 | "@typescript-eslint/eslint-plugin": "^2.27.0", 32 | "@typescript-eslint/parser": "^2.27.0", 33 | "eslint": "^6.8.0", 34 | "eslint-config-prettier": "^6.10.1", 35 | "eslint-loader": "^3.0.3", 36 | "eslint-plugin-prettier": "^3.1.2", 37 | "prettier": "^2.0.2", 38 | "rimraf": "^2.5.4", 39 | "typescript": "^3.8.3" 40 | }, 41 | "dependencies": { 42 | "image-size": "^0.5.1", 43 | "loader-utils": "^2.0.0", 44 | "schema-utils": "^2.6.6" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import fs from 'fs' 3 | import { promisify } from 'util' 4 | import loaderUtils from 'loader-utils' 5 | import validateSchema from 'schema-utils' 6 | import ImageSizeResolver from './modules/imageSizeResolver' 7 | import resolveScaledImages from './modules/scaledImageResolver' 8 | import { createImageWrapper, ScaledSourceImages } from './modules/imageWrapper' 9 | import schema from './options.json' 10 | 11 | const readFileAsync = promisify(fs.readFile) 12 | 13 | const DEFAULT_IMAGE_CLASS_PATH = require.resolve('./modules/adaptiveImage') 14 | const DEFAULT_IMAGE_NAME_FORMAT = '[hash].[ext]' 15 | const DEFAULT_SCALINGS = { '@2x': 2, '@3x': 3 } 16 | 17 | export default async function (content: Buffer) { 18 | const callback = this.async() 19 | // if (this.cacheable) this.cacheable() // TODO 20 | 21 | const options = loaderUtils.getOptions(this) 22 | 23 | validateSchema(schema as any, options, { 24 | name: 'React Native Web Image Loader', 25 | baseDataPath: 'options', 26 | }) 27 | 28 | const esModule = 29 | typeof options.esModule !== 'undefined' ? options.esModule : true 30 | const nameFormat = options.name || DEFAULT_IMAGE_NAME_FORMAT 31 | const scalings = options.scalings || DEFAULT_SCALINGS 32 | const size = ImageSizeResolver(this.resourcePath) 33 | const wrapImage = createImageWrapper( 34 | loaderUtils.stringifyRequest( 35 | this, 36 | options.imageClassPath || DEFAULT_IMAGE_CLASS_PATH 37 | ), 38 | esModule 39 | ) 40 | const url = loaderUtils.interpolateName(this, nameFormat, { 41 | context: this.context, 42 | content, 43 | }) 44 | 45 | let outputPath = url 46 | if (options.outputPath) { 47 | outputPath = path.posix.join(options.outputPath, url) 48 | } 49 | 50 | const imgUrls = { 51 | '@1x': { url, outputPath }, 52 | } 53 | 54 | this.emitFile(outputPath, content) 55 | 56 | try { 57 | const resolvedFiles = await resolveScaledImages(this.resourcePath, scalings) 58 | 59 | await Promise.all( 60 | Object.keys(resolvedFiles).map(async (key) => { 61 | const fileContent = await readFileAsync(resolvedFiles[key]) 62 | const fileName = loaderUtils.interpolateName(this, nameFormat, { 63 | context: this.context, 64 | content: fileContent, 65 | }) 66 | 67 | let outputPath = fileName 68 | if (options.outputPath) { 69 | outputPath = path.posix.join(options.outputPath, fileName) 70 | } 71 | 72 | this.emitFile(outputPath, fileContent) 73 | imgUrls[`@${scalings[key]}x`] = { url: fileName, outputPath } 74 | }) 75 | ) 76 | } catch (e) { 77 | console.error(e) 78 | } 79 | 80 | const publicImagePaths = {} 81 | 82 | for (const key in imgUrls) { 83 | const { url, outputPath } = imgUrls[key] 84 | let publicPath = `__webpack_public_path__ + ${JSON.stringify(outputPath)}` 85 | if (options.publicPath) { 86 | if (typeof options.publicPath === 'function') { 87 | publicPath = options.publicPath(url, this.resourcePath) 88 | } else { 89 | publicPath = `${ 90 | options.publicPath.endsWith('/') 91 | ? options.publicPath 92 | : `${options.publicPath}/` 93 | }${url}` 94 | } 95 | 96 | publicPath = JSON.stringify(publicPath) 97 | } 98 | 99 | publicImagePaths[key] = publicPath 100 | } 101 | 102 | const result = wrapImage(size, publicImagePaths as ScaledSourceImages) 103 | 104 | callback(null, result) 105 | } 106 | 107 | export const raw = true 108 | -------------------------------------------------------------------------------- /src/modules/adaptiveImage.ts: -------------------------------------------------------------------------------- 1 | class AdaptiveImage { 2 | protected data 3 | 4 | constructor(img) { 5 | this.data = img 6 | } 7 | 8 | get uri() { 9 | if ( 10 | typeof window !== 'undefined' && 11 | typeof window.devicePixelRatio !== 'undefined' 12 | ) { 13 | if (window.devicePixelRatio > 2 && this.data['uri@3x']) { 14 | return this.data['uri@3x'] 15 | } else if (window.devicePixelRatio > 1 && this.data['uri@2x']) { 16 | return this.data['uri@2x'] 17 | } 18 | } 19 | 20 | return this.data.uri 21 | } 22 | 23 | get width() { 24 | return this.data.width 25 | } 26 | 27 | get height() { 28 | return this.data.height 29 | } 30 | 31 | toString() { 32 | return this.uri 33 | } 34 | } 35 | 36 | export default AdaptiveImage 37 | -------------------------------------------------------------------------------- /src/modules/imageSizeResolver.ts: -------------------------------------------------------------------------------- 1 | import sizeOf from 'image-size' 2 | 3 | export default function (path: string): { width: number; height: number } { 4 | return sizeOf(path) 5 | } 6 | -------------------------------------------------------------------------------- /src/modules/imageWrapper.ts: -------------------------------------------------------------------------------- 1 | export type ScaledSourceImages = { 2 | '@1x': string 3 | '@2x'?: string 4 | '@3x'?: string 5 | } 6 | 7 | export const createImageWrapper = (classPath: string, esModule = false) => ( 8 | size: { width: number; height: number }, 9 | images: ScaledSourceImages 10 | ) => { 11 | const uri = `${images['@1x']}` 12 | 13 | delete images['@1x'] 14 | 15 | const scalings = [] 16 | 17 | for (const scaling in images) { 18 | scalings.push(`"uri${scaling}": ${images[scaling]},`) 19 | } 20 | 21 | return `${ 22 | esModule 23 | ? `import AdaptiveImage from ${classPath}` 24 | : `var AdaptiveImage = require(${classPath}).default` 25 | }; 26 | 27 | ${esModule ? 'export default' : 'module.exports ='} new AdaptiveImage({ 28 | uri: ${uri},${scalings.join('')} 29 | width: ${size.width}, 30 | height: ${size.height} 31 | });` 32 | } 33 | -------------------------------------------------------------------------------- /src/modules/scaledImageResolver.ts: -------------------------------------------------------------------------------- 1 | import { stat } from 'fs' 2 | import { promisify } from 'util' 3 | import path from 'path' 4 | 5 | const statAsync = promisify(stat) 6 | 7 | export default async function ( 8 | resource: string, 9 | scalings: { [key: string]: number } 10 | ) { 11 | const fileData = path.parse(resource) 12 | const suffixes = Object.keys(scalings) 13 | const result = {} 14 | for (let i = 0; i < suffixes.length; i++) { 15 | const suffix = suffixes[i] 16 | try { 17 | const filePath = path.join( 18 | fileData.dir, 19 | `${fileData.name}${suffix}${fileData.ext}` 20 | ) 21 | const stats = await statAsync(filePath) 22 | 23 | if (stats.isFile()) { 24 | result[suffix] = filePath 25 | } 26 | } catch (e) { 27 | // Do nothing 28 | } 29 | } 30 | 31 | return result 32 | } 33 | -------------------------------------------------------------------------------- /src/options.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "additionalProperties": false, 4 | "properties": { 5 | "name": { 6 | "description": "The filename template for the target file(s).", 7 | "type": "string" 8 | }, 9 | "imageClassPath": { 10 | "description": "The path of image class that should be used instead of built-in AdaptiveImage.", 11 | "type": "string" 12 | }, 13 | "scalings": { 14 | "description": "An object where the keys are the possible filename suffixes and values are the amount of scale", 15 | "type": "object" 16 | }, 17 | "publicPath": { 18 | "description": "A custom public path for the target file(s).", 19 | "anyOf": [ 20 | { 21 | "type": "string" 22 | }, 23 | { 24 | "instanceof": "Function" 25 | } 26 | ] 27 | }, 28 | "outputPath": { 29 | "description": "A filesystem path where the target file(s) will be placed.", 30 | "type": "string" 31 | }, 32 | "esModule": { 33 | "description": "By default, react-native-web-image-loader generates JS modules that use the ES modules syntax.", 34 | "type": "boolean" 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "outDir": "lib/", 5 | "moduleResolution": "node", 6 | "esModuleInterop": true, 7 | "target": "es5", 8 | "module": "commonjs", 9 | "removeComments": true, 10 | "resolveJsonModule": true 11 | }, 12 | "include": ["src/**/*"] 13 | } 14 | --------------------------------------------------------------------------------