├── .gitignore ├── .travis.yml ├── LICENSE ├── package-lock.json ├── package.json ├── readme.md ├── src ├── main.spec.ts └── main.ts ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | *~ 4 | cjs 5 | esm 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "stable" 4 | sudo: false 5 | script: 6 | - npm run lint 7 | - npm test 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Ali Taheri Moghaddar, ali.taheri.m@gmail.com 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "normalize-scroll-left", 3 | "version": "0.2.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.10.4", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 19 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.10.4", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 25 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.10.4", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | }, 32 | "dependencies": { 33 | "ansi-styles": { 34 | "version": "3.2.1", 35 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 36 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 37 | "dev": true, 38 | "requires": { 39 | "color-convert": "^1.9.0" 40 | } 41 | }, 42 | "chalk": { 43 | "version": "2.4.2", 44 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 45 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 46 | "dev": true, 47 | "requires": { 48 | "ansi-styles": "^3.2.1", 49 | "escape-string-regexp": "^1.0.5", 50 | "supports-color": "^5.3.0" 51 | } 52 | }, 53 | "color-convert": { 54 | "version": "1.9.3", 55 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 56 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 57 | "dev": true, 58 | "requires": { 59 | "color-name": "1.1.3" 60 | } 61 | }, 62 | "color-name": { 63 | "version": "1.1.3", 64 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 65 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 66 | "dev": true 67 | }, 68 | "escape-string-regexp": { 69 | "version": "1.0.5", 70 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 71 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 72 | "dev": true 73 | }, 74 | "has-flag": { 75 | "version": "3.0.0", 76 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 77 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 78 | "dev": true 79 | }, 80 | "supports-color": { 81 | "version": "5.5.0", 82 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 83 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 84 | "dev": true, 85 | "requires": { 86 | "has-flag": "^3.0.0" 87 | } 88 | } 89 | } 90 | }, 91 | "@types/chai": { 92 | "version": "4.2.12", 93 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.12.tgz", 94 | "integrity": "sha512-aN5IAC8QNtSUdQzxu7lGBgYAOuU1tmRU4c9dIq5OKGf/SBVjXo+ffM2wEjudAWbgpOhy60nLoAGH1xm8fpCKFQ==", 95 | "dev": true 96 | }, 97 | "@types/color-name": { 98 | "version": "1.1.1", 99 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 100 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 101 | "dev": true 102 | }, 103 | "@types/mocha": { 104 | "version": "8.0.3", 105 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.3.tgz", 106 | "integrity": "sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg==", 107 | "dev": true 108 | }, 109 | "@types/node": { 110 | "version": "14.6.4", 111 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.4.tgz", 112 | "integrity": "sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==", 113 | "dev": true 114 | }, 115 | "ansi-colors": { 116 | "version": "4.1.1", 117 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 118 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 119 | "dev": true 120 | }, 121 | "ansi-regex": { 122 | "version": "3.0.0", 123 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 124 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 125 | "dev": true 126 | }, 127 | "ansi-styles": { 128 | "version": "4.2.1", 129 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 130 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 131 | "dev": true, 132 | "requires": { 133 | "@types/color-name": "^1.1.1", 134 | "color-convert": "^2.0.1" 135 | } 136 | }, 137 | "anymatch": { 138 | "version": "3.1.1", 139 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 140 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 141 | "dev": true, 142 | "requires": { 143 | "normalize-path": "^3.0.0", 144 | "picomatch": "^2.0.4" 145 | } 146 | }, 147 | "arg": { 148 | "version": "4.1.3", 149 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 150 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 151 | "dev": true 152 | }, 153 | "argparse": { 154 | "version": "1.0.10", 155 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 156 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 157 | "dev": true, 158 | "requires": { 159 | "sprintf-js": "~1.0.2" 160 | } 161 | }, 162 | "array.prototype.map": { 163 | "version": "1.0.2", 164 | "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", 165 | "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", 166 | "dev": true, 167 | "requires": { 168 | "define-properties": "^1.1.3", 169 | "es-abstract": "^1.17.0-next.1", 170 | "es-array-method-boxes-properly": "^1.0.0", 171 | "is-string": "^1.0.4" 172 | } 173 | }, 174 | "assertion-error": { 175 | "version": "1.1.0", 176 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 177 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 178 | "dev": true 179 | }, 180 | "balanced-match": { 181 | "version": "1.0.0", 182 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 183 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 184 | "dev": true 185 | }, 186 | "big.js": { 187 | "version": "5.2.2", 188 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 189 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", 190 | "dev": true 191 | }, 192 | "binary-extensions": { 193 | "version": "2.1.0", 194 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", 195 | "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", 196 | "dev": true 197 | }, 198 | "brace-expansion": { 199 | "version": "1.1.11", 200 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 201 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 202 | "dev": true, 203 | "requires": { 204 | "balanced-match": "^1.0.0", 205 | "concat-map": "0.0.1" 206 | } 207 | }, 208 | "braces": { 209 | "version": "3.0.2", 210 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 211 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 212 | "dev": true, 213 | "requires": { 214 | "fill-range": "^7.0.1" 215 | } 216 | }, 217 | "browser-stdout": { 218 | "version": "1.3.1", 219 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 220 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 221 | "dev": true 222 | }, 223 | "buffer-from": { 224 | "version": "1.1.1", 225 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 226 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 227 | "dev": true 228 | }, 229 | "builtin-modules": { 230 | "version": "1.1.1", 231 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 232 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 233 | "dev": true 234 | }, 235 | "camelcase": { 236 | "version": "5.3.1", 237 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 238 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 239 | "dev": true 240 | }, 241 | "chai": { 242 | "version": "4.2.0", 243 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", 244 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", 245 | "dev": true, 246 | "requires": { 247 | "assertion-error": "^1.1.0", 248 | "check-error": "^1.0.2", 249 | "deep-eql": "^3.0.1", 250 | "get-func-name": "^2.0.0", 251 | "pathval": "^1.1.0", 252 | "type-detect": "^4.0.5" 253 | } 254 | }, 255 | "chalk": { 256 | "version": "4.1.0", 257 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 258 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 259 | "dev": true, 260 | "requires": { 261 | "ansi-styles": "^4.1.0", 262 | "supports-color": "^7.1.0" 263 | } 264 | }, 265 | "check-error": { 266 | "version": "1.0.2", 267 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 268 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 269 | "dev": true 270 | }, 271 | "chokidar": { 272 | "version": "3.4.2", 273 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", 274 | "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", 275 | "dev": true, 276 | "requires": { 277 | "anymatch": "~3.1.1", 278 | "braces": "~3.0.2", 279 | "fsevents": "~2.1.2", 280 | "glob-parent": "~5.1.0", 281 | "is-binary-path": "~2.1.0", 282 | "is-glob": "~4.0.1", 283 | "normalize-path": "~3.0.0", 284 | "readdirp": "~3.4.0" 285 | } 286 | }, 287 | "cliui": { 288 | "version": "5.0.0", 289 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 290 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 291 | "dev": true, 292 | "requires": { 293 | "string-width": "^3.1.0", 294 | "strip-ansi": "^5.2.0", 295 | "wrap-ansi": "^5.1.0" 296 | }, 297 | "dependencies": { 298 | "ansi-regex": { 299 | "version": "4.1.0", 300 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 301 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 302 | "dev": true 303 | }, 304 | "string-width": { 305 | "version": "3.1.0", 306 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 307 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 308 | "dev": true, 309 | "requires": { 310 | "emoji-regex": "^7.0.1", 311 | "is-fullwidth-code-point": "^2.0.0", 312 | "strip-ansi": "^5.1.0" 313 | } 314 | }, 315 | "strip-ansi": { 316 | "version": "5.2.0", 317 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 318 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 319 | "dev": true, 320 | "requires": { 321 | "ansi-regex": "^4.1.0" 322 | } 323 | } 324 | } 325 | }, 326 | "color-convert": { 327 | "version": "2.0.1", 328 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 329 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 330 | "dev": true, 331 | "requires": { 332 | "color-name": "~1.1.4" 333 | } 334 | }, 335 | "color-name": { 336 | "version": "1.1.4", 337 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 338 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 339 | "dev": true 340 | }, 341 | "commander": { 342 | "version": "2.20.3", 343 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 344 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 345 | "dev": true 346 | }, 347 | "concat-map": { 348 | "version": "0.0.1", 349 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 350 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 351 | "dev": true 352 | }, 353 | "core-util-is": { 354 | "version": "1.0.2", 355 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 356 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 357 | "dev": true 358 | }, 359 | "debug": { 360 | "version": "4.1.1", 361 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 362 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 363 | "dev": true, 364 | "requires": { 365 | "ms": "^2.1.1" 366 | } 367 | }, 368 | "decamelize": { 369 | "version": "1.2.0", 370 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 371 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 372 | "dev": true 373 | }, 374 | "deep-eql": { 375 | "version": "3.0.1", 376 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 377 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 378 | "dev": true, 379 | "requires": { 380 | "type-detect": "^4.0.0" 381 | } 382 | }, 383 | "define-properties": { 384 | "version": "1.1.3", 385 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 386 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 387 | "dev": true, 388 | "requires": { 389 | "object-keys": "^1.0.12" 390 | } 391 | }, 392 | "diff": { 393 | "version": "4.0.2", 394 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 395 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 396 | "dev": true 397 | }, 398 | "doctrine": { 399 | "version": "0.7.2", 400 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", 401 | "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", 402 | "dev": true, 403 | "requires": { 404 | "esutils": "^1.1.6", 405 | "isarray": "0.0.1" 406 | }, 407 | "dependencies": { 408 | "esutils": { 409 | "version": "1.1.6", 410 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", 411 | "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", 412 | "dev": true 413 | }, 414 | "isarray": { 415 | "version": "0.0.1", 416 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 417 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 418 | "dev": true 419 | } 420 | } 421 | }, 422 | "emoji-regex": { 423 | "version": "7.0.3", 424 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 425 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 426 | "dev": true 427 | }, 428 | "emojis-list": { 429 | "version": "3.0.0", 430 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", 431 | "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", 432 | "dev": true 433 | }, 434 | "enhanced-resolve": { 435 | "version": "4.3.0", 436 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", 437 | "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", 438 | "dev": true, 439 | "requires": { 440 | "graceful-fs": "^4.1.2", 441 | "memory-fs": "^0.5.0", 442 | "tapable": "^1.0.0" 443 | } 444 | }, 445 | "errno": { 446 | "version": "0.1.7", 447 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", 448 | "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", 449 | "dev": true, 450 | "requires": { 451 | "prr": "~1.0.1" 452 | } 453 | }, 454 | "es-abstract": { 455 | "version": "1.17.6", 456 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", 457 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", 458 | "dev": true, 459 | "requires": { 460 | "es-to-primitive": "^1.2.1", 461 | "function-bind": "^1.1.1", 462 | "has": "^1.0.3", 463 | "has-symbols": "^1.0.1", 464 | "is-callable": "^1.2.0", 465 | "is-regex": "^1.1.0", 466 | "object-inspect": "^1.7.0", 467 | "object-keys": "^1.1.1", 468 | "object.assign": "^4.1.0", 469 | "string.prototype.trimend": "^1.0.1", 470 | "string.prototype.trimstart": "^1.0.1" 471 | } 472 | }, 473 | "es-array-method-boxes-properly": { 474 | "version": "1.0.0", 475 | "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", 476 | "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", 477 | "dev": true 478 | }, 479 | "es-get-iterator": { 480 | "version": "1.1.0", 481 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", 482 | "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", 483 | "dev": true, 484 | "requires": { 485 | "es-abstract": "^1.17.4", 486 | "has-symbols": "^1.0.1", 487 | "is-arguments": "^1.0.4", 488 | "is-map": "^2.0.1", 489 | "is-set": "^2.0.1", 490 | "is-string": "^1.0.5", 491 | "isarray": "^2.0.5" 492 | } 493 | }, 494 | "es-to-primitive": { 495 | "version": "1.2.1", 496 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 497 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 498 | "dev": true, 499 | "requires": { 500 | "is-callable": "^1.1.4", 501 | "is-date-object": "^1.0.1", 502 | "is-symbol": "^1.0.2" 503 | } 504 | }, 505 | "escape-string-regexp": { 506 | "version": "4.0.0", 507 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 508 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 509 | "dev": true 510 | }, 511 | "esprima": { 512 | "version": "4.0.1", 513 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 514 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 515 | "dev": true 516 | }, 517 | "fill-range": { 518 | "version": "7.0.1", 519 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 520 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 521 | "dev": true, 522 | "requires": { 523 | "to-regex-range": "^5.0.1" 524 | } 525 | }, 526 | "find-up": { 527 | "version": "5.0.0", 528 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 529 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 530 | "dev": true, 531 | "requires": { 532 | "locate-path": "^6.0.0", 533 | "path-exists": "^4.0.0" 534 | } 535 | }, 536 | "flat": { 537 | "version": "4.1.0", 538 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 539 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 540 | "dev": true, 541 | "requires": { 542 | "is-buffer": "~2.0.3" 543 | } 544 | }, 545 | "fs.realpath": { 546 | "version": "1.0.0", 547 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 548 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 549 | "dev": true 550 | }, 551 | "fsevents": { 552 | "version": "2.1.3", 553 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", 554 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", 555 | "dev": true, 556 | "optional": true 557 | }, 558 | "function-bind": { 559 | "version": "1.1.1", 560 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 561 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 562 | "dev": true 563 | }, 564 | "get-caller-file": { 565 | "version": "2.0.5", 566 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 567 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 568 | "dev": true 569 | }, 570 | "get-func-name": { 571 | "version": "2.0.0", 572 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 573 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 574 | "dev": true 575 | }, 576 | "glob": { 577 | "version": "7.1.6", 578 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 579 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 580 | "dev": true, 581 | "requires": { 582 | "fs.realpath": "^1.0.0", 583 | "inflight": "^1.0.4", 584 | "inherits": "2", 585 | "minimatch": "^3.0.4", 586 | "once": "^1.3.0", 587 | "path-is-absolute": "^1.0.0" 588 | } 589 | }, 590 | "glob-parent": { 591 | "version": "5.1.1", 592 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 593 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 594 | "dev": true, 595 | "requires": { 596 | "is-glob": "^4.0.1" 597 | } 598 | }, 599 | "graceful-fs": { 600 | "version": "4.2.4", 601 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 602 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 603 | "dev": true 604 | }, 605 | "growl": { 606 | "version": "1.10.5", 607 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 608 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 609 | "dev": true 610 | }, 611 | "has": { 612 | "version": "1.0.3", 613 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 614 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 615 | "dev": true, 616 | "requires": { 617 | "function-bind": "^1.1.1" 618 | } 619 | }, 620 | "has-flag": { 621 | "version": "4.0.0", 622 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 623 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 624 | "dev": true 625 | }, 626 | "has-symbols": { 627 | "version": "1.0.1", 628 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 629 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 630 | "dev": true 631 | }, 632 | "he": { 633 | "version": "1.2.0", 634 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 635 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 636 | "dev": true 637 | }, 638 | "inflight": { 639 | "version": "1.0.6", 640 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 641 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 642 | "dev": true, 643 | "requires": { 644 | "once": "^1.3.0", 645 | "wrappy": "1" 646 | } 647 | }, 648 | "inherits": { 649 | "version": "2.0.4", 650 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 651 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 652 | "dev": true 653 | }, 654 | "is-arguments": { 655 | "version": "1.0.4", 656 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 657 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", 658 | "dev": true 659 | }, 660 | "is-binary-path": { 661 | "version": "2.1.0", 662 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 663 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 664 | "dev": true, 665 | "requires": { 666 | "binary-extensions": "^2.0.0" 667 | } 668 | }, 669 | "is-buffer": { 670 | "version": "2.0.4", 671 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 672 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", 673 | "dev": true 674 | }, 675 | "is-callable": { 676 | "version": "1.2.0", 677 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", 678 | "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", 679 | "dev": true 680 | }, 681 | "is-date-object": { 682 | "version": "1.0.2", 683 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 684 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 685 | "dev": true 686 | }, 687 | "is-extglob": { 688 | "version": "2.1.1", 689 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 690 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 691 | "dev": true 692 | }, 693 | "is-fullwidth-code-point": { 694 | "version": "2.0.0", 695 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 696 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 697 | "dev": true 698 | }, 699 | "is-glob": { 700 | "version": "4.0.1", 701 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 702 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 703 | "dev": true, 704 | "requires": { 705 | "is-extglob": "^2.1.1" 706 | } 707 | }, 708 | "is-map": { 709 | "version": "2.0.1", 710 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", 711 | "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", 712 | "dev": true 713 | }, 714 | "is-number": { 715 | "version": "7.0.0", 716 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 717 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 718 | "dev": true 719 | }, 720 | "is-plain-obj": { 721 | "version": "1.1.0", 722 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 723 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", 724 | "dev": true 725 | }, 726 | "is-regex": { 727 | "version": "1.1.1", 728 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 729 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 730 | "dev": true, 731 | "requires": { 732 | "has-symbols": "^1.0.1" 733 | } 734 | }, 735 | "is-set": { 736 | "version": "2.0.1", 737 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", 738 | "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", 739 | "dev": true 740 | }, 741 | "is-string": { 742 | "version": "1.0.5", 743 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 744 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 745 | "dev": true 746 | }, 747 | "is-symbol": { 748 | "version": "1.0.3", 749 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 750 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 751 | "dev": true, 752 | "requires": { 753 | "has-symbols": "^1.0.1" 754 | } 755 | }, 756 | "isarray": { 757 | "version": "2.0.5", 758 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 759 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 760 | "dev": true 761 | }, 762 | "isexe": { 763 | "version": "2.0.0", 764 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 765 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 766 | "dev": true 767 | }, 768 | "iterate-iterator": { 769 | "version": "1.0.1", 770 | "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", 771 | "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", 772 | "dev": true 773 | }, 774 | "iterate-value": { 775 | "version": "1.0.2", 776 | "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", 777 | "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", 778 | "dev": true, 779 | "requires": { 780 | "es-get-iterator": "^1.0.2", 781 | "iterate-iterator": "^1.0.1" 782 | } 783 | }, 784 | "js-tokens": { 785 | "version": "4.0.0", 786 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 787 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 788 | "dev": true 789 | }, 790 | "js-yaml": { 791 | "version": "3.14.0", 792 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 793 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 794 | "dev": true, 795 | "requires": { 796 | "argparse": "^1.0.7", 797 | "esprima": "^4.0.0" 798 | } 799 | }, 800 | "json5": { 801 | "version": "1.0.1", 802 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 803 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 804 | "dev": true, 805 | "requires": { 806 | "minimist": "^1.2.0" 807 | } 808 | }, 809 | "loader-utils": { 810 | "version": "1.4.0", 811 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", 812 | "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", 813 | "dev": true, 814 | "requires": { 815 | "big.js": "^5.2.2", 816 | "emojis-list": "^3.0.0", 817 | "json5": "^1.0.1" 818 | } 819 | }, 820 | "locate-path": { 821 | "version": "6.0.0", 822 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 823 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 824 | "dev": true, 825 | "requires": { 826 | "p-locate": "^5.0.0" 827 | } 828 | }, 829 | "log-symbols": { 830 | "version": "4.0.0", 831 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", 832 | "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", 833 | "dev": true, 834 | "requires": { 835 | "chalk": "^4.0.0" 836 | } 837 | }, 838 | "make-error": { 839 | "version": "1.3.6", 840 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 841 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 842 | "dev": true 843 | }, 844 | "memory-fs": { 845 | "version": "0.5.0", 846 | "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", 847 | "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", 848 | "dev": true, 849 | "requires": { 850 | "errno": "^0.1.3", 851 | "readable-stream": "^2.0.1" 852 | } 853 | }, 854 | "micromatch": { 855 | "version": "4.0.2", 856 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", 857 | "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", 858 | "dev": true, 859 | "requires": { 860 | "braces": "^3.0.1", 861 | "picomatch": "^2.0.5" 862 | } 863 | }, 864 | "minimatch": { 865 | "version": "3.0.4", 866 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 867 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 868 | "dev": true, 869 | "requires": { 870 | "brace-expansion": "^1.1.7" 871 | } 872 | }, 873 | "minimist": { 874 | "version": "1.2.5", 875 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 876 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 877 | "dev": true 878 | }, 879 | "mkdirp": { 880 | "version": "0.5.5", 881 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 882 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 883 | "dev": true, 884 | "requires": { 885 | "minimist": "^1.2.5" 886 | } 887 | }, 888 | "mocha": { 889 | "version": "8.1.3", 890 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.3.tgz", 891 | "integrity": "sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw==", 892 | "dev": true, 893 | "requires": { 894 | "ansi-colors": "4.1.1", 895 | "browser-stdout": "1.3.1", 896 | "chokidar": "3.4.2", 897 | "debug": "4.1.1", 898 | "diff": "4.0.2", 899 | "escape-string-regexp": "4.0.0", 900 | "find-up": "5.0.0", 901 | "glob": "7.1.6", 902 | "growl": "1.10.5", 903 | "he": "1.2.0", 904 | "js-yaml": "3.14.0", 905 | "log-symbols": "4.0.0", 906 | "minimatch": "3.0.4", 907 | "ms": "2.1.2", 908 | "object.assign": "4.1.0", 909 | "promise.allsettled": "1.0.2", 910 | "serialize-javascript": "4.0.0", 911 | "strip-json-comments": "3.0.1", 912 | "supports-color": "7.1.0", 913 | "which": "2.0.2", 914 | "wide-align": "1.1.3", 915 | "workerpool": "6.0.0", 916 | "yargs": "13.3.2", 917 | "yargs-parser": "13.1.2", 918 | "yargs-unparser": "1.6.1" 919 | } 920 | }, 921 | "ms": { 922 | "version": "2.1.2", 923 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 924 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 925 | "dev": true 926 | }, 927 | "normalize-path": { 928 | "version": "3.0.0", 929 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 930 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 931 | "dev": true 932 | }, 933 | "object-inspect": { 934 | "version": "1.8.0", 935 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", 936 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", 937 | "dev": true 938 | }, 939 | "object-keys": { 940 | "version": "1.1.1", 941 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 942 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 943 | "dev": true 944 | }, 945 | "object.assign": { 946 | "version": "4.1.0", 947 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 948 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 949 | "dev": true, 950 | "requires": { 951 | "define-properties": "^1.1.2", 952 | "function-bind": "^1.1.1", 953 | "has-symbols": "^1.0.0", 954 | "object-keys": "^1.0.11" 955 | } 956 | }, 957 | "once": { 958 | "version": "1.4.0", 959 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 960 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 961 | "dev": true, 962 | "requires": { 963 | "wrappy": "1" 964 | } 965 | }, 966 | "p-limit": { 967 | "version": "3.0.2", 968 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", 969 | "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", 970 | "dev": true, 971 | "requires": { 972 | "p-try": "^2.0.0" 973 | } 974 | }, 975 | "p-locate": { 976 | "version": "5.0.0", 977 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 978 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 979 | "dev": true, 980 | "requires": { 981 | "p-limit": "^3.0.2" 982 | } 983 | }, 984 | "p-try": { 985 | "version": "2.2.0", 986 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 987 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 988 | "dev": true 989 | }, 990 | "path-exists": { 991 | "version": "4.0.0", 992 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 993 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 994 | "dev": true 995 | }, 996 | "path-is-absolute": { 997 | "version": "1.0.1", 998 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 999 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1000 | "dev": true 1001 | }, 1002 | "path-parse": { 1003 | "version": "1.0.6", 1004 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1005 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1006 | "dev": true 1007 | }, 1008 | "pathval": { 1009 | "version": "1.1.0", 1010 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 1011 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 1012 | "dev": true 1013 | }, 1014 | "picomatch": { 1015 | "version": "2.2.2", 1016 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 1017 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 1018 | "dev": true 1019 | }, 1020 | "process-nextick-args": { 1021 | "version": "2.0.1", 1022 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1023 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1024 | "dev": true 1025 | }, 1026 | "promise.allsettled": { 1027 | "version": "1.0.2", 1028 | "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", 1029 | "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", 1030 | "dev": true, 1031 | "requires": { 1032 | "array.prototype.map": "^1.0.1", 1033 | "define-properties": "^1.1.3", 1034 | "es-abstract": "^1.17.0-next.1", 1035 | "function-bind": "^1.1.1", 1036 | "iterate-value": "^1.0.0" 1037 | } 1038 | }, 1039 | "prr": { 1040 | "version": "1.0.1", 1041 | "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", 1042 | "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", 1043 | "dev": true 1044 | }, 1045 | "randombytes": { 1046 | "version": "2.1.0", 1047 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1048 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1049 | "dev": true, 1050 | "requires": { 1051 | "safe-buffer": "^5.1.0" 1052 | } 1053 | }, 1054 | "readable-stream": { 1055 | "version": "2.3.7", 1056 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1057 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1058 | "dev": true, 1059 | "requires": { 1060 | "core-util-is": "~1.0.0", 1061 | "inherits": "~2.0.3", 1062 | "isarray": "~1.0.0", 1063 | "process-nextick-args": "~2.0.0", 1064 | "safe-buffer": "~5.1.1", 1065 | "string_decoder": "~1.1.1", 1066 | "util-deprecate": "~1.0.1" 1067 | }, 1068 | "dependencies": { 1069 | "isarray": { 1070 | "version": "1.0.0", 1071 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1072 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1073 | "dev": true 1074 | }, 1075 | "safe-buffer": { 1076 | "version": "5.1.2", 1077 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1078 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1079 | "dev": true 1080 | } 1081 | } 1082 | }, 1083 | "readdirp": { 1084 | "version": "3.4.0", 1085 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", 1086 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", 1087 | "dev": true, 1088 | "requires": { 1089 | "picomatch": "^2.2.1" 1090 | } 1091 | }, 1092 | "require-directory": { 1093 | "version": "2.1.1", 1094 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1095 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1096 | "dev": true 1097 | }, 1098 | "require-main-filename": { 1099 | "version": "2.0.0", 1100 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1101 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 1102 | "dev": true 1103 | }, 1104 | "resolve": { 1105 | "version": "1.17.0", 1106 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 1107 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 1108 | "dev": true, 1109 | "requires": { 1110 | "path-parse": "^1.0.6" 1111 | } 1112 | }, 1113 | "rimraf": { 1114 | "version": "3.0.2", 1115 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1116 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1117 | "dev": true, 1118 | "requires": { 1119 | "glob": "^7.1.3" 1120 | } 1121 | }, 1122 | "safe-buffer": { 1123 | "version": "5.2.1", 1124 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1125 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1126 | "dev": true 1127 | }, 1128 | "semver": { 1129 | "version": "6.3.0", 1130 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1131 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1132 | "dev": true 1133 | }, 1134 | "serialize-javascript": { 1135 | "version": "4.0.0", 1136 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", 1137 | "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", 1138 | "dev": true, 1139 | "requires": { 1140 | "randombytes": "^2.1.0" 1141 | } 1142 | }, 1143 | "set-blocking": { 1144 | "version": "2.0.0", 1145 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1146 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1147 | "dev": true 1148 | }, 1149 | "source-map": { 1150 | "version": "0.6.1", 1151 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1152 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1153 | "dev": true 1154 | }, 1155 | "source-map-support": { 1156 | "version": "0.5.19", 1157 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 1158 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 1159 | "dev": true, 1160 | "requires": { 1161 | "buffer-from": "^1.0.0", 1162 | "source-map": "^0.6.0" 1163 | } 1164 | }, 1165 | "sprintf-js": { 1166 | "version": "1.0.3", 1167 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1168 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1169 | "dev": true 1170 | }, 1171 | "string-width": { 1172 | "version": "2.1.1", 1173 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1174 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1175 | "dev": true, 1176 | "requires": { 1177 | "is-fullwidth-code-point": "^2.0.0", 1178 | "strip-ansi": "^4.0.0" 1179 | } 1180 | }, 1181 | "string.prototype.trimend": { 1182 | "version": "1.0.1", 1183 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 1184 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 1185 | "dev": true, 1186 | "requires": { 1187 | "define-properties": "^1.1.3", 1188 | "es-abstract": "^1.17.5" 1189 | } 1190 | }, 1191 | "string.prototype.trimstart": { 1192 | "version": "1.0.1", 1193 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 1194 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 1195 | "dev": true, 1196 | "requires": { 1197 | "define-properties": "^1.1.3", 1198 | "es-abstract": "^1.17.5" 1199 | } 1200 | }, 1201 | "string_decoder": { 1202 | "version": "1.1.1", 1203 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1204 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1205 | "dev": true, 1206 | "requires": { 1207 | "safe-buffer": "~5.1.0" 1208 | }, 1209 | "dependencies": { 1210 | "safe-buffer": { 1211 | "version": "5.1.2", 1212 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1213 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1214 | "dev": true 1215 | } 1216 | } 1217 | }, 1218 | "strip-ansi": { 1219 | "version": "4.0.0", 1220 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1221 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1222 | "dev": true, 1223 | "requires": { 1224 | "ansi-regex": "^3.0.0" 1225 | } 1226 | }, 1227 | "strip-json-comments": { 1228 | "version": "3.0.1", 1229 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 1230 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 1231 | "dev": true 1232 | }, 1233 | "supports-color": { 1234 | "version": "7.1.0", 1235 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 1236 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 1237 | "dev": true, 1238 | "requires": { 1239 | "has-flag": "^4.0.0" 1240 | } 1241 | }, 1242 | "tapable": { 1243 | "version": "1.1.3", 1244 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", 1245 | "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", 1246 | "dev": true 1247 | }, 1248 | "to-regex-range": { 1249 | "version": "5.0.1", 1250 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1251 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1252 | "dev": true, 1253 | "requires": { 1254 | "is-number": "^7.0.0" 1255 | } 1256 | }, 1257 | "ts-loader": { 1258 | "version": "8.0.3", 1259 | "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.3.tgz", 1260 | "integrity": "sha512-wsqfnVdB7xQiqhqbz2ZPLGHLPZbHVV5Qn/MNFZkCFxRU1miDyxKORucDGxKtsQJ63Rfza0udiUxWF5nHY6bpdQ==", 1261 | "dev": true, 1262 | "requires": { 1263 | "chalk": "^2.3.0", 1264 | "enhanced-resolve": "^4.0.0", 1265 | "loader-utils": "^1.0.2", 1266 | "micromatch": "^4.0.0", 1267 | "semver": "^6.0.0" 1268 | }, 1269 | "dependencies": { 1270 | "ansi-styles": { 1271 | "version": "3.2.1", 1272 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1273 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1274 | "dev": true, 1275 | "requires": { 1276 | "color-convert": "^1.9.0" 1277 | } 1278 | }, 1279 | "chalk": { 1280 | "version": "2.4.2", 1281 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1282 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1283 | "dev": true, 1284 | "requires": { 1285 | "ansi-styles": "^3.2.1", 1286 | "escape-string-regexp": "^1.0.5", 1287 | "supports-color": "^5.3.0" 1288 | } 1289 | }, 1290 | "color-convert": { 1291 | "version": "1.9.3", 1292 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1293 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1294 | "dev": true, 1295 | "requires": { 1296 | "color-name": "1.1.3" 1297 | } 1298 | }, 1299 | "color-name": { 1300 | "version": "1.1.3", 1301 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1302 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1303 | "dev": true 1304 | }, 1305 | "escape-string-regexp": { 1306 | "version": "1.0.5", 1307 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1308 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1309 | "dev": true 1310 | }, 1311 | "has-flag": { 1312 | "version": "3.0.0", 1313 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1314 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1315 | "dev": true 1316 | }, 1317 | "supports-color": { 1318 | "version": "5.5.0", 1319 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1320 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1321 | "dev": true, 1322 | "requires": { 1323 | "has-flag": "^3.0.0" 1324 | } 1325 | } 1326 | } 1327 | }, 1328 | "ts-node": { 1329 | "version": "9.0.0", 1330 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", 1331 | "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", 1332 | "dev": true, 1333 | "requires": { 1334 | "arg": "^4.1.0", 1335 | "diff": "^4.0.1", 1336 | "make-error": "^1.1.1", 1337 | "source-map-support": "^0.5.17", 1338 | "yn": "3.1.1" 1339 | } 1340 | }, 1341 | "tslib": { 1342 | "version": "1.9.3", 1343 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 1344 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", 1345 | "dev": true 1346 | }, 1347 | "tslint": { 1348 | "version": "6.1.3", 1349 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", 1350 | "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", 1351 | "dev": true, 1352 | "requires": { 1353 | "@babel/code-frame": "^7.0.0", 1354 | "builtin-modules": "^1.1.1", 1355 | "chalk": "^2.3.0", 1356 | "commander": "^2.12.1", 1357 | "diff": "^4.0.1", 1358 | "glob": "^7.1.1", 1359 | "js-yaml": "^3.13.1", 1360 | "minimatch": "^3.0.4", 1361 | "mkdirp": "^0.5.3", 1362 | "resolve": "^1.3.2", 1363 | "semver": "^5.3.0", 1364 | "tslib": "^1.13.0", 1365 | "tsutils": "^2.29.0" 1366 | }, 1367 | "dependencies": { 1368 | "ansi-styles": { 1369 | "version": "3.2.1", 1370 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1371 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1372 | "dev": true, 1373 | "requires": { 1374 | "color-convert": "^1.9.0" 1375 | } 1376 | }, 1377 | "chalk": { 1378 | "version": "2.4.2", 1379 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1380 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1381 | "dev": true, 1382 | "requires": { 1383 | "ansi-styles": "^3.2.1", 1384 | "escape-string-regexp": "^1.0.5", 1385 | "supports-color": "^5.3.0" 1386 | } 1387 | }, 1388 | "color-convert": { 1389 | "version": "1.9.3", 1390 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1391 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1392 | "dev": true, 1393 | "requires": { 1394 | "color-name": "1.1.3" 1395 | } 1396 | }, 1397 | "color-name": { 1398 | "version": "1.1.3", 1399 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1400 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1401 | "dev": true 1402 | }, 1403 | "escape-string-regexp": { 1404 | "version": "1.0.5", 1405 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1406 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1407 | "dev": true 1408 | }, 1409 | "has-flag": { 1410 | "version": "3.0.0", 1411 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1412 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1413 | "dev": true 1414 | }, 1415 | "semver": { 1416 | "version": "5.7.1", 1417 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1418 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1419 | "dev": true 1420 | }, 1421 | "supports-color": { 1422 | "version": "5.5.0", 1423 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1424 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1425 | "dev": true, 1426 | "requires": { 1427 | "has-flag": "^3.0.0" 1428 | } 1429 | }, 1430 | "tslib": { 1431 | "version": "1.13.0", 1432 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 1433 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", 1434 | "dev": true 1435 | } 1436 | } 1437 | }, 1438 | "tslint-eslint-rules": { 1439 | "version": "5.4.0", 1440 | "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", 1441 | "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", 1442 | "dev": true, 1443 | "requires": { 1444 | "doctrine": "0.7.2", 1445 | "tslib": "1.9.0", 1446 | "tsutils": "^3.0.0" 1447 | }, 1448 | "dependencies": { 1449 | "tslib": { 1450 | "version": "1.9.0", 1451 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", 1452 | "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", 1453 | "dev": true 1454 | }, 1455 | "tsutils": { 1456 | "version": "3.13.0", 1457 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.13.0.tgz", 1458 | "integrity": "sha512-wRtEjVU8Su72sDIDoqno5Scwt8x4eaF0teKO3m4hu8K1QFPnIZMM88CLafs2tapUeWnY9SwwO3bWeOt2uauBcg==", 1459 | "dev": true, 1460 | "requires": { 1461 | "tslib": "^1.8.1" 1462 | } 1463 | } 1464 | } 1465 | }, 1466 | "tslint-microsoft-contrib": { 1467 | "version": "6.2.0", 1468 | "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-6.2.0.tgz", 1469 | "integrity": "sha512-6tfi/2tHqV/3CL77pULBcK+foty11Rr0idRDxKnteTaKm6gWF9qmaCNU17HVssOuwlYNyOmd9Jsmjd+1t3a3qw==", 1470 | "dev": true, 1471 | "requires": { 1472 | "tsutils": "^2.27.2 <2.29.0" 1473 | }, 1474 | "dependencies": { 1475 | "tsutils": { 1476 | "version": "2.28.0", 1477 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", 1478 | "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", 1479 | "dev": true, 1480 | "requires": { 1481 | "tslib": "^1.8.1" 1482 | } 1483 | } 1484 | } 1485 | }, 1486 | "tsutils": { 1487 | "version": "2.29.0", 1488 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 1489 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 1490 | "dev": true, 1491 | "requires": { 1492 | "tslib": "^1.8.1" 1493 | } 1494 | }, 1495 | "type-detect": { 1496 | "version": "4.0.8", 1497 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1498 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1499 | "dev": true 1500 | }, 1501 | "typescript": { 1502 | "version": "4.0.2", 1503 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", 1504 | "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", 1505 | "dev": true 1506 | }, 1507 | "util-deprecate": { 1508 | "version": "1.0.2", 1509 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1510 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1511 | "dev": true 1512 | }, 1513 | "which": { 1514 | "version": "2.0.2", 1515 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1516 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1517 | "dev": true, 1518 | "requires": { 1519 | "isexe": "^2.0.0" 1520 | } 1521 | }, 1522 | "which-module": { 1523 | "version": "2.0.0", 1524 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1525 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 1526 | "dev": true 1527 | }, 1528 | "wide-align": { 1529 | "version": "1.1.3", 1530 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1531 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1532 | "dev": true, 1533 | "requires": { 1534 | "string-width": "^1.0.2 || 2" 1535 | } 1536 | }, 1537 | "workerpool": { 1538 | "version": "6.0.0", 1539 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", 1540 | "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", 1541 | "dev": true 1542 | }, 1543 | "wrap-ansi": { 1544 | "version": "5.1.0", 1545 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 1546 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 1547 | "dev": true, 1548 | "requires": { 1549 | "ansi-styles": "^3.2.0", 1550 | "string-width": "^3.0.0", 1551 | "strip-ansi": "^5.0.0" 1552 | }, 1553 | "dependencies": { 1554 | "ansi-regex": { 1555 | "version": "4.1.0", 1556 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1557 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1558 | "dev": true 1559 | }, 1560 | "ansi-styles": { 1561 | "version": "3.2.1", 1562 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1563 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1564 | "dev": true, 1565 | "requires": { 1566 | "color-convert": "^1.9.0" 1567 | } 1568 | }, 1569 | "color-convert": { 1570 | "version": "1.9.3", 1571 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1572 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1573 | "dev": true, 1574 | "requires": { 1575 | "color-name": "1.1.3" 1576 | } 1577 | }, 1578 | "color-name": { 1579 | "version": "1.1.3", 1580 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1581 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1582 | "dev": true 1583 | }, 1584 | "string-width": { 1585 | "version": "3.1.0", 1586 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1587 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1588 | "dev": true, 1589 | "requires": { 1590 | "emoji-regex": "^7.0.1", 1591 | "is-fullwidth-code-point": "^2.0.0", 1592 | "strip-ansi": "^5.1.0" 1593 | } 1594 | }, 1595 | "strip-ansi": { 1596 | "version": "5.2.0", 1597 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1598 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1599 | "dev": true, 1600 | "requires": { 1601 | "ansi-regex": "^4.1.0" 1602 | } 1603 | } 1604 | } 1605 | }, 1606 | "wrappy": { 1607 | "version": "1.0.2", 1608 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1609 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1610 | "dev": true 1611 | }, 1612 | "y18n": { 1613 | "version": "4.0.0", 1614 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1615 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 1616 | "dev": true 1617 | }, 1618 | "yargs": { 1619 | "version": "13.3.2", 1620 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 1621 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 1622 | "dev": true, 1623 | "requires": { 1624 | "cliui": "^5.0.0", 1625 | "find-up": "^3.0.0", 1626 | "get-caller-file": "^2.0.1", 1627 | "require-directory": "^2.1.1", 1628 | "require-main-filename": "^2.0.0", 1629 | "set-blocking": "^2.0.0", 1630 | "string-width": "^3.0.0", 1631 | "which-module": "^2.0.0", 1632 | "y18n": "^4.0.0", 1633 | "yargs-parser": "^13.1.2" 1634 | }, 1635 | "dependencies": { 1636 | "ansi-regex": { 1637 | "version": "4.1.0", 1638 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1639 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1640 | "dev": true 1641 | }, 1642 | "find-up": { 1643 | "version": "3.0.0", 1644 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 1645 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 1646 | "dev": true, 1647 | "requires": { 1648 | "locate-path": "^3.0.0" 1649 | } 1650 | }, 1651 | "locate-path": { 1652 | "version": "3.0.0", 1653 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1654 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1655 | "dev": true, 1656 | "requires": { 1657 | "p-locate": "^3.0.0", 1658 | "path-exists": "^3.0.0" 1659 | } 1660 | }, 1661 | "p-limit": { 1662 | "version": "2.3.0", 1663 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1664 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1665 | "dev": true, 1666 | "requires": { 1667 | "p-try": "^2.0.0" 1668 | } 1669 | }, 1670 | "p-locate": { 1671 | "version": "3.0.0", 1672 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1673 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1674 | "dev": true, 1675 | "requires": { 1676 | "p-limit": "^2.0.0" 1677 | } 1678 | }, 1679 | "path-exists": { 1680 | "version": "3.0.0", 1681 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1682 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1683 | "dev": true 1684 | }, 1685 | "string-width": { 1686 | "version": "3.1.0", 1687 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1688 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1689 | "dev": true, 1690 | "requires": { 1691 | "emoji-regex": "^7.0.1", 1692 | "is-fullwidth-code-point": "^2.0.0", 1693 | "strip-ansi": "^5.1.0" 1694 | } 1695 | }, 1696 | "strip-ansi": { 1697 | "version": "5.2.0", 1698 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1699 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1700 | "dev": true, 1701 | "requires": { 1702 | "ansi-regex": "^4.1.0" 1703 | } 1704 | } 1705 | } 1706 | }, 1707 | "yargs-parser": { 1708 | "version": "13.1.2", 1709 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 1710 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 1711 | "dev": true, 1712 | "requires": { 1713 | "camelcase": "^5.0.0", 1714 | "decamelize": "^1.2.0" 1715 | } 1716 | }, 1717 | "yargs-unparser": { 1718 | "version": "1.6.1", 1719 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", 1720 | "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", 1721 | "dev": true, 1722 | "requires": { 1723 | "camelcase": "^5.3.1", 1724 | "decamelize": "^1.2.0", 1725 | "flat": "^4.1.0", 1726 | "is-plain-obj": "^1.1.0", 1727 | "yargs": "^14.2.3" 1728 | }, 1729 | "dependencies": { 1730 | "ansi-regex": { 1731 | "version": "4.1.0", 1732 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1733 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1734 | "dev": true 1735 | }, 1736 | "find-up": { 1737 | "version": "3.0.0", 1738 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 1739 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 1740 | "dev": true, 1741 | "requires": { 1742 | "locate-path": "^3.0.0" 1743 | } 1744 | }, 1745 | "locate-path": { 1746 | "version": "3.0.0", 1747 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1748 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1749 | "dev": true, 1750 | "requires": { 1751 | "p-locate": "^3.0.0", 1752 | "path-exists": "^3.0.0" 1753 | } 1754 | }, 1755 | "p-limit": { 1756 | "version": "2.3.0", 1757 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1758 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1759 | "dev": true, 1760 | "requires": { 1761 | "p-try": "^2.0.0" 1762 | } 1763 | }, 1764 | "p-locate": { 1765 | "version": "3.0.0", 1766 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1767 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1768 | "dev": true, 1769 | "requires": { 1770 | "p-limit": "^2.0.0" 1771 | } 1772 | }, 1773 | "path-exists": { 1774 | "version": "3.0.0", 1775 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1776 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1777 | "dev": true 1778 | }, 1779 | "string-width": { 1780 | "version": "3.1.0", 1781 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1782 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1783 | "dev": true, 1784 | "requires": { 1785 | "emoji-regex": "^7.0.1", 1786 | "is-fullwidth-code-point": "^2.0.0", 1787 | "strip-ansi": "^5.1.0" 1788 | } 1789 | }, 1790 | "strip-ansi": { 1791 | "version": "5.2.0", 1792 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1793 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1794 | "dev": true, 1795 | "requires": { 1796 | "ansi-regex": "^4.1.0" 1797 | } 1798 | }, 1799 | "yargs": { 1800 | "version": "14.2.3", 1801 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", 1802 | "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", 1803 | "dev": true, 1804 | "requires": { 1805 | "cliui": "^5.0.0", 1806 | "decamelize": "^1.2.0", 1807 | "find-up": "^3.0.0", 1808 | "get-caller-file": "^2.0.1", 1809 | "require-directory": "^2.1.1", 1810 | "require-main-filename": "^2.0.0", 1811 | "set-blocking": "^2.0.0", 1812 | "string-width": "^3.0.0", 1813 | "which-module": "^2.0.0", 1814 | "y18n": "^4.0.0", 1815 | "yargs-parser": "^15.0.1" 1816 | } 1817 | }, 1818 | "yargs-parser": { 1819 | "version": "15.0.1", 1820 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", 1821 | "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", 1822 | "dev": true, 1823 | "requires": { 1824 | "camelcase": "^5.0.0", 1825 | "decamelize": "^1.2.0" 1826 | } 1827 | } 1828 | } 1829 | }, 1830 | "yn": { 1831 | "version": "3.1.1", 1832 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1833 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1834 | "dev": true 1835 | } 1836 | } 1837 | } 1838 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "normalize-scroll-left", 3 | "description": "Utility library to determine and normalize Element.scrollLeft behavior", 4 | "version": "0.2.1", 5 | "author": { 6 | "name": "Ali Taheri Moghaddar", 7 | "email": "ali.taheri.m@gmail.com" 8 | }, 9 | "files": [ 10 | "cjs", 11 | "esm" 12 | ], 13 | "repository": { 14 | "type": "git", 15 | "url": "git@github.com:alitaheri/normalize-scroll-left.git" 16 | }, 17 | "keywords": [ 18 | "rtl", 19 | "dom", 20 | "scroll-left", 21 | "scrollLeft", 22 | "normalize", 23 | "browser", 24 | "element" 25 | ], 26 | "scripts": { 27 | "build": "rimraf cjs esm && tsc --module commonjs --outDir cjs && tsc --module es6 --outDir esm", 28 | "prepublishOnly": "npm run build", 29 | "lint": "tslint -e \"node_modules/**\" \"src/**/*.ts\"", 30 | "test": "mocha -r ts-node/register \"src/**/*.spec.ts\"" 31 | }, 32 | "license": "MIT", 33 | "main": "cjs/main.js", 34 | "module": "esm/main.js", 35 | "types": "cjs/main.d.ts", 36 | "devDependencies": { 37 | "@types/chai": "^4.2.12", 38 | "@types/mocha": "^8.0.3", 39 | "@types/node": "^14.6.4", 40 | "chai": "^4.2.0", 41 | "mocha": "^8.1.3", 42 | "rimraf": "^3.0.2", 43 | "ts-loader": "^8.0.3", 44 | "ts-node": "^9.0.0", 45 | "tslint": "^6.1.3", 46 | "tslint-eslint-rules": "^5.4.0", 47 | "tslint-microsoft-contrib": "^6.2.0", 48 | "typescript": "^4.0.2" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Normalize Scroll Left for Right-to-Left 2 | 3 | This library normalizes the `Element.scrollLeft` property when direction is `rtl`. 4 | 5 | All the hardwork are based on [this jquery plugin](https://github.com/othree/jquery.rtl-scroll-type) 6 | and [this stackoverflow answer](https://stackoverflow.com/a/24394376). 7 | 8 | Since `Element.scrollLeft`'s behavior with `dir="rtl"` is not defined in any spec we use 9 | a feature detection logic to determine the behavior of the current browser. 10 | 11 | Types of `scrollLeft` (`scrollWidth` = 100) (Copied from 12 | [here](https://github.com/othree/jquery.rtl-scroll-type#3-types-of-scrollleft-scrollwidth--100)) 13 | 14 | Browser | Type | Most Left | Most Right | Initial 15 | -------------- | ------------- | --------- | ---------- | ------- 16 | WebKit | default | 0 | 100 | 100 17 | Firefox/Opera | negative | -100 | 0 | 0 18 | IE/Edge | reverse | 100 | 0 | 0 19 | 20 | ## Installation 21 | 22 | You can install this package with the following command: 23 | 24 | ```sh 25 | npm install normalize-scroll-left 26 | ``` 27 | 28 | ## API 29 | 30 | This library exposes these methods: 31 | 32 | ### `detectScrollType` 33 | 34 | ```ts 35 | type ScrollType = 'indeterminate' | 'default' | 'negative' | 'reverse'; 36 | function detectScrollType(): ScrollType; 37 | ``` 38 | 39 | This function returns the scroll type detected, Keep in mind, this function 40 | caches the result as it should render a dummy on the DOM (which is expensive). 41 | Make sure the first invocation of this function happens **after** the body is loaded. 42 | 43 | **note**: To support server-side-rendering, it will output `indeterminate` if 44 | it detects a non-browser environment. 45 | 46 | ```javascript 47 | import { detectScrollType } from 'normalize-scroll-left'; 48 | 49 | const type = detectScrollType(); 50 | ``` 51 | 52 | The output is not based on the browser, but feature detection: 53 | 54 | Browser | Type 55 | -------------- | ------------- 56 | WebKit | `default` 57 | Firefox/Opera | `negative` 58 | IE/Edge | `reverse` 59 | Other/Server | `indeterminate` 60 | 61 | ### `getNormalizedScrollLeft` 62 | 63 | ```ts 64 | function getNormalizedScrollLeft(element: HTMLElement, direction: 'rtl' | 'ltr'): number; 65 | ``` 66 | 67 | You can use this method to get the normalized `scrollLeft` property of an element. 68 | You should explicitly pass the direction for the following reasons: 69 | 70 | 1. Querying the `getComputedStyle` is expensive and might cause a reflow. 71 | 2. The behavior shouldn't be changed when direction is `ltr`. 72 | 73 | The output is `NaN` on the server. Otherwise, it will mimic the behavior of 74 | `WebKit` as it's the esiest to work with. 75 | 76 | ```ts 77 | import { getNormalizedScrollLeft } from 'normalize-scroll-left'; 78 | 79 | const element = document.getElementById('my-scrollable-container'); 80 | 81 | // element.scrollWidth = 100; 82 | 83 | const scrollLeft = getNormalizedScrollLeft(element, 'rtl'); 84 | 85 | // scrollLeft will always be from 0 (Most Left) to 100 (Most Right). 86 | // It will initially be 100, That means the most right. 87 | ``` 88 | 89 | ### `setNormalizedScrollLeft` 90 | 91 | ```ts 92 | function setNormalizedScrollLeft( 93 | element: HTMLElement, 94 | scrollLeft: number, 95 | direction: 'rtl' | 'ltr', 96 | ): void; 97 | ``` 98 | 99 | You can use this method to set the `scrollLeft` property of an element as normalized. 100 | You should explicitly pass the direction for the same reasons as `getNormalizedScrollLeft`: 101 | 102 | For `scrollWidth = 100` the argument `scrollLeft` must be between `0` and `100`. This 103 | function will automatically convert it into something the current browser understands. 104 | 105 | ```ts 106 | import { setNormalizedScrollLeft } from 'normalize-scroll-left'; 107 | 108 | const element = document.getElementById('my-scrollable-container'); 109 | 110 | // element.scrollWidth = 100, element.clientWidth = 20; 111 | 112 | setNormalizedScrollLeft(element, 20, 'rtl'); 113 | 114 | // Will set element.scrollLeft to ... 115 | // 20 in WebKit (chrome) 116 | // -60 in Firefox/Opera 117 | // 60 in IE/Edge 118 | // Does nothing on the server 119 | ``` 120 | 121 | ## Typings 122 | 123 | The typescript type definitions are also available and are installed via npm. 124 | 125 | ## License 126 | This project is licensed under the 127 | [MIT license](https://github.com/alitaheri/normalize-scroll-left/blob/master/LICENSE). 128 | -------------------------------------------------------------------------------- /src/main.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { 3 | detectScrollType, 4 | _setScrollType, 5 | getNormalizedScrollLeft, 6 | setNormalizedScrollLeft, 7 | } from './main'; 8 | 9 | describe('detectScrollType', () => { 10 | 11 | it('should return indeterminate in node environment', () => { 12 | expect(detectScrollType()).to.be.equals('indeterminate'); 13 | }); 14 | 15 | }); 16 | 17 | describe('getNormalizedScrollLeft (scrollWidth=100, clientWidth=20)', () => { 18 | const mock: any = { scrollWidth: 100, clientWidth: 20, scrollLeft: 50 }; 19 | 20 | it('should get the original scroll left when direction=ltr despite of type', () => { 21 | _setScrollType('indeterminate'); 22 | expect(getNormalizedScrollLeft(mock, 'ltr')).to.be.equals(50); 23 | _setScrollType('default'); 24 | expect(getNormalizedScrollLeft(mock, 'ltr')).to.be.equals(50); 25 | _setScrollType('negative'); 26 | expect(getNormalizedScrollLeft(mock, 'ltr')).to.be.equals(50); 27 | _setScrollType('reverse'); 28 | expect(getNormalizedScrollLeft(mock, 'ltr')).to.be.equals(50); 29 | }); 30 | 31 | it('should return NaN when direction=rtl, type=indeterminate', () => { 32 | _setScrollType('indeterminate'); 33 | expect(getNormalizedScrollLeft(mock, 'rtl')).to.be.NaN; 34 | }); 35 | 36 | it('should return 30 when Element.scrollLeft=30, direction=rtl, type=default', () => { 37 | _setScrollType('default'); 38 | expect(getNormalizedScrollLeft({ ...mock, scrollLeft: 30 }, 'rtl')).to.be.equals(30); 39 | }); 40 | 41 | it('should return 30 when Element.scrollLeft=-50, direction=rtl, type=negative', () => { 42 | _setScrollType('negative'); 43 | expect(getNormalizedScrollLeft({ ...mock, scrollLeft: -50 }, 'rtl')).to.be.equals(30); 44 | }); 45 | 46 | it('should return 30 when Element.scrollLeft=50, direction=rtl, type=reverse', () => { 47 | _setScrollType('reverse'); 48 | expect(getNormalizedScrollLeft({ ...mock, scrollLeft: 50 }, 'rtl')).to.be.equals(30); 49 | }); 50 | 51 | }); 52 | 53 | describe('setNormalizedScrollLeft (scrollWidth=100, clientWidth=20)', () => { 54 | const makeMock: any = () => ({ scrollWidth: 100, clientWidth: 20, scrollLeft: 50 }); 55 | 56 | it('should set the original scroll left when direction=ltr despite of type', () => { 57 | _setScrollType('indeterminate'); 58 | let mock = makeMock(); 59 | setNormalizedScrollLeft(mock, 80, 'ltr'); 60 | expect(mock.scrollLeft).to.be.equals(80); 61 | 62 | _setScrollType('default'); 63 | mock = makeMock(); 64 | setNormalizedScrollLeft(mock, 80, 'ltr'); 65 | expect(mock.scrollLeft).to.be.equals(80); 66 | 67 | _setScrollType('negative'); 68 | mock = makeMock(); 69 | setNormalizedScrollLeft(mock, 80, 'ltr'); 70 | expect(mock.scrollLeft).to.be.equals(80); 71 | 72 | _setScrollType('reverse'); 73 | mock = makeMock(); 74 | setNormalizedScrollLeft(mock, 80, 'ltr'); 75 | expect(mock.scrollLeft).to.be.equals(80); 76 | }); 77 | 78 | it('should do nothing when direction=rtl, type=indeterminate', () => { 79 | _setScrollType('indeterminate'); 80 | const mock = makeMock(); 81 | setNormalizedScrollLeft(mock, 80, 'rtl'); 82 | expect(mock.scrollLeft).to.be.equals(50); 83 | }); 84 | 85 | it('should set Element.scrollLeft=30 when scrollLeft=30, direction=rtl, type=default', () => { 86 | _setScrollType('default'); 87 | const mock = { ...makeMock(), scrollLeft: 50 }; 88 | setNormalizedScrollLeft(mock, 30, 'rtl'); 89 | expect(mock.scrollLeft).to.be.equals(30); 90 | }); 91 | 92 | it('should set Element.scrollLeft=-50 when scrollLeft=30, direction=rtl, type=negative', () => { 93 | _setScrollType('negative'); 94 | const mock = { ...makeMock(), scrollLeft: -40 }; 95 | setNormalizedScrollLeft(mock, 30, 'rtl'); 96 | expect(mock.scrollLeft).to.be.equals(-50); 97 | }); 98 | 99 | it('should return Element.scrollLeft=50 when scrollLeft=30, direction=rtl, type=reverse', () => { 100 | _setScrollType('reverse'); 101 | const mock = { ...makeMock(), scrollLeft: 60 }; 102 | setNormalizedScrollLeft(mock, 30, 'rtl'); 103 | expect(mock.scrollLeft).to.be.equals(50); 104 | }); 105 | 106 | }); 107 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | export type ScrollType = 'indeterminate' | 'default' | 'negative' | 'reverse'; 2 | 3 | // Based on https://github.com/react-bootstrap/dom-helpers/blob/master/src/util/inDOM.js 4 | const inDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement); 5 | 6 | let cachedType: ScrollType; 7 | 8 | export function _setScrollType(type?: ScrollType): void { 9 | cachedType = type!; 10 | } 11 | 12 | // Based on the jquery plugin https://github.com/othree/jquery.rtl-scroll-type 13 | export function detectScrollType(): ScrollType { 14 | if (cachedType) { 15 | return cachedType; 16 | } 17 | 18 | if (!inDOM || !window.document.body) { 19 | return 'indeterminate'; 20 | } 21 | 22 | const dummy = window.document.createElement('div'); 23 | 24 | dummy.appendChild(document.createTextNode('ABCD')); 25 | dummy.dir = 'rtl'; 26 | dummy.style.fontSize = '14px'; 27 | dummy.style.width = '4px'; 28 | dummy.style.height = '1px'; 29 | dummy.style.position = 'absolute'; 30 | dummy.style.top = '-1000px'; 31 | dummy.style.overflow = 'scroll'; 32 | 33 | document.body.appendChild(dummy); 34 | 35 | cachedType = 'reverse'; 36 | 37 | if (dummy.scrollLeft > 0) { 38 | cachedType = 'default'; 39 | } else { 40 | dummy.scrollLeft = 2; 41 | if (dummy.scrollLeft < 2) { 42 | cachedType = 'negative'; 43 | } 44 | } 45 | 46 | document.body.removeChild(dummy); 47 | return cachedType; 48 | } 49 | 50 | // Based on https://stackoverflow.com/a/24394376 51 | export function getNormalizedScrollLeft(element: HTMLElement, direction: 'rtl' | 'ltr'): number { 52 | const scrollLeft = element.scrollLeft; 53 | 54 | // Perform the calculations only when direction is rtl to avoid messing up the ltr behavior 55 | if (direction !== 'rtl') { 56 | return scrollLeft; 57 | } 58 | 59 | const type = detectScrollType(); 60 | 61 | if (type === 'indeterminate') { 62 | return Number.NaN; 63 | } 64 | 65 | switch (type) { 66 | case 'negative': 67 | return element.scrollWidth - element.clientWidth + scrollLeft; 68 | case 'reverse': 69 | return element.scrollWidth - element.clientWidth - scrollLeft; 70 | } 71 | 72 | return scrollLeft; 73 | } 74 | 75 | export function setNormalizedScrollLeft( 76 | element: HTMLElement, 77 | scrollLeft: number, 78 | direction: 'rtl' | 'ltr', 79 | ): void { 80 | // Perform the calculations only when direction is rtl to avoid messing up the ltr behavior 81 | if (direction !== 'rtl') { 82 | element.scrollLeft = scrollLeft; 83 | return; 84 | } 85 | 86 | const type = detectScrollType(); 87 | 88 | if (type === 'indeterminate') { 89 | return; 90 | } 91 | 92 | switch (type) { 93 | case 'negative': 94 | element.scrollLeft = element.clientWidth - element.scrollWidth + scrollLeft; 95 | break; 96 | case 'reverse': 97 | element.scrollLeft = element.scrollWidth - element.clientWidth - scrollLeft; 98 | break; 99 | default: 100 | element.scrollLeft = scrollLeft; 101 | break; 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "rootDir": "src", 4 | "target": "es5", 5 | "alwaysStrict": true, 6 | "noEmitOnError": false, 7 | "strictNullChecks": true, 8 | "pretty": true, 9 | "noUnusedParameters": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "noImplicitAny": true, 12 | "allowSyntheticDefaultImports": true, 13 | "noFallthroughCasesInSwitch": true, 14 | "noImplicitReturns": true, 15 | "noImplicitThis": true, 16 | "noUnusedLocals": true, 17 | "declaration": true 18 | }, 19 | "files": [ 20 | "src/main.ts" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "node_modules/tslint-eslint-rules/dist/rules", 4 | "node_modules/tslint-microsoft-contrib" 5 | ], 6 | "rules": { 7 | "adjacent-overload-signatures": true, 8 | "align": [true, "parameters", "arguments", "statements"], 9 | "array-type": [true, "array"], 10 | "arrow-return-shorthand": true, 11 | "chai-prefer-contains-to-index-of": true, 12 | "class-name": true, 13 | "comment-format": [true, "check-space"], 14 | "curly": true, 15 | "eofline": true, 16 | "forin": true, 17 | "indent": [true, "spaces"], 18 | "jsdoc-format": true, 19 | "label-position": true, 20 | "max-line-length": [true, 100], 21 | "member-access": true, 22 | "member-ordering": [true, "private-before-public", "static-before-instance"], 23 | "mocha-avoid-only": true, 24 | "mocha-unneeded-done": true, 25 | "new-parens": true, 26 | "no-arg": true, 27 | "no-banned-terms": true, 28 | "no-bitwise": true, 29 | "no-conditional-assignment": true, 30 | "no-consecutive-blank-lines": [true, 1], 31 | "no-console": [ 32 | true, 33 | "log", 34 | "error", 35 | "debug", 36 | "info", 37 | "time", 38 | "timeEnd", 39 | "trace" 40 | ], 41 | "no-constant-condition": true, 42 | "no-construct": true, 43 | "no-control-regex": true, 44 | "no-debugger": true, 45 | "no-delete-expression": true, 46 | "no-duplicate-case": true, 47 | "no-duplicate-variable": true, 48 | "no-empty": true, 49 | "no-empty-character-class": true, 50 | "no-eval": true, 51 | "no-extra-boolean-cast": true, 52 | "no-extra-semi": true, 53 | "no-for-in": true, 54 | "no-inferrable-types": [true], 55 | "no-internal-module": true, 56 | "no-invalid-regexp": true, 57 | "no-invalid-this": true, 58 | "no-namespace": true, 59 | "no-reference": true, 60 | "no-regex-spaces": true, 61 | "no-sparse-arrays": true, 62 | "no-string-based-set-immediate": true, 63 | "no-string-based-set-interval": true, 64 | "no-string-based-set-timeout": true, 65 | "no-switch-case-fall-through": true, 66 | "no-string-throw": true, 67 | "no-trailing-whitespace": true, 68 | "no-unexpected-multiline": true, 69 | "no-unnecessary-bind": true, 70 | "no-unnecessary-field-initialization": true, 71 | "no-unnecessary-local-variable": true, 72 | "no-unnecessary-override": true, 73 | "no-unsafe-finally": true, 74 | "no-var-keyword": true, 75 | "object-literal-shorthand": true, 76 | "one-line": [ 77 | true, 78 | "check-catch", 79 | "check-finally", 80 | "check-else", 81 | "check-open-brace", 82 | "check-whitespace" 83 | ], 84 | "one-variable-per-declaration": [true], 85 | "prefer-array-literal": true, 86 | "prefer-const": true, 87 | "prefer-for-of": true, 88 | "prefer-type-cast": true, 89 | "quotemark": [true, "single", "jsx-double", "avoid-escape"], 90 | "radix": true, 91 | "semicolon": [true, "always"], 92 | "trailing-comma": [ 93 | true, 94 | { 95 | "multiline": "always", 96 | "singleline": "never" 97 | } 98 | ], 99 | "triple-equals": true, 100 | "typedef-whitespace": [ 101 | true, 102 | { 103 | "call-signature": "nospace", 104 | "index-signature": "nospace", 105 | "parameter": "nospace", 106 | "property-declaration": "nospace", 107 | "variable-declaration": "nospace" 108 | }, 109 | { 110 | "call-signature": "onespace", 111 | "index-signature": "onespace", 112 | "parameter": "onespace", 113 | "property-declaration": "onespace", 114 | "variable-declaration": "onespace" 115 | } 116 | ], 117 | "unified-signatures": true, 118 | "use-isnan": true, 119 | "variable-name": [ 120 | true, 121 | "ban-keywords", 122 | "check-format", 123 | "allow-leading-underscore", 124 | "allow-pascal-case" 125 | ], 126 | "whitespace": [ 127 | true, 128 | "check-branch", 129 | "check-decl", 130 | "check-operator", 131 | "check-module", 132 | "check-separator", 133 | "check-type" 134 | ] 135 | } 136 | } --------------------------------------------------------------------------------