├── .circleci
└── config.yml
├── .gitignore
├── LICENSE
├── changelog.md
├── package-lock.json
├── package.json
├── readme.md
├── string-replace-to-array.d.ts
├── string-replace-to-array.js
└── test.js
/.circleci/config.yml:
--------------------------------------------------------------------------------
1 | # This config is equivalent to both the '.circleci/extended/orb-free.yml' and the base '.circleci/config.yml'
2 | version: 2.1
3 |
4 | orbs:
5 | node: circleci/node@4.1
6 |
7 | workflows:
8 | sample:
9 | jobs:
10 | - node/test:
11 | version: '15.1'
12 | # This is the node version to use for the `cimg/node` tag
13 | # Relevant tags can be found on the CircleCI Developer Hub
14 | # https://circleci.com/developer/images/image/cimg/node
15 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) Appfigures, Inc. (github.com/appfigures)
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
13 | all 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
21 | THE SOFTWARE.
--------------------------------------------------------------------------------
/changelog.md:
--------------------------------------------------------------------------------
1 | v2.1.1 - May 31, 2024
2 | - @seeden Fixed the `sideEffects` key in `package.json` to be a boolean instead of a string
3 |
4 | v2.1.0 - August 24, 2021
5 |
6 | - Fixed an issue where the offset provided to the replace function was not truly global and unique
7 |
8 | v2.0.0 - August 16, 2021
9 |
10 | - Removed all dependencies
11 | - Added Typescript definitions
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "string-replace-to-array",
3 | "version": "2.1.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@ungap/promise-all-settled": {
8 | "version": "1.1.2",
9 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
10 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
11 | "dev": true
12 | },
13 | "ansi-colors": {
14 | "version": "4.1.1",
15 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
16 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
17 | "dev": true
18 | },
19 | "ansi-regex": {
20 | "version": "3.0.0",
21 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
22 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
23 | "dev": true
24 | },
25 | "ansi-styles": {
26 | "version": "4.3.0",
27 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
28 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
29 | "dev": true,
30 | "requires": {
31 | "color-convert": "^2.0.1"
32 | }
33 | },
34 | "anymatch": {
35 | "version": "3.1.2",
36 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
37 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
38 | "dev": true,
39 | "requires": {
40 | "normalize-path": "^3.0.0",
41 | "picomatch": "^2.0.4"
42 | }
43 | },
44 | "argparse": {
45 | "version": "2.0.1",
46 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
47 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
48 | "dev": true
49 | },
50 | "assertion-error": {
51 | "version": "1.1.0",
52 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
53 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
54 | "dev": true
55 | },
56 | "balanced-match": {
57 | "version": "1.0.2",
58 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
59 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
60 | "dev": true
61 | },
62 | "binary-extensions": {
63 | "version": "2.2.0",
64 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
65 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
66 | "dev": true
67 | },
68 | "brace-expansion": {
69 | "version": "1.1.11",
70 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
71 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
72 | "dev": true,
73 | "requires": {
74 | "balanced-match": "^1.0.0",
75 | "concat-map": "0.0.1"
76 | }
77 | },
78 | "braces": {
79 | "version": "3.0.2",
80 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
81 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
82 | "dev": true,
83 | "requires": {
84 | "fill-range": "^7.0.1"
85 | }
86 | },
87 | "browser-stdout": {
88 | "version": "1.3.1",
89 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
90 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
91 | "dev": true
92 | },
93 | "camelcase": {
94 | "version": "6.2.0",
95 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
96 | "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
97 | "dev": true
98 | },
99 | "chai": {
100 | "version": "4.3.4",
101 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz",
102 | "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==",
103 | "dev": true,
104 | "requires": {
105 | "assertion-error": "^1.1.0",
106 | "check-error": "^1.0.2",
107 | "deep-eql": "^3.0.1",
108 | "get-func-name": "^2.0.0",
109 | "pathval": "^1.1.1",
110 | "type-detect": "^4.0.5"
111 | }
112 | },
113 | "chalk": {
114 | "version": "4.1.2",
115 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
116 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
117 | "dev": true,
118 | "requires": {
119 | "ansi-styles": "^4.1.0",
120 | "supports-color": "^7.1.0"
121 | },
122 | "dependencies": {
123 | "supports-color": {
124 | "version": "7.2.0",
125 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
126 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
127 | "dev": true,
128 | "requires": {
129 | "has-flag": "^4.0.0"
130 | }
131 | }
132 | }
133 | },
134 | "check-error": {
135 | "version": "1.0.2",
136 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
137 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
138 | "dev": true
139 | },
140 | "chokidar": {
141 | "version": "3.5.2",
142 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
143 | "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
144 | "dev": true,
145 | "requires": {
146 | "anymatch": "~3.1.2",
147 | "braces": "~3.0.2",
148 | "fsevents": "~2.3.2",
149 | "glob-parent": "~5.1.2",
150 | "is-binary-path": "~2.1.0",
151 | "is-glob": "~4.0.1",
152 | "normalize-path": "~3.0.0",
153 | "readdirp": "~3.6.0"
154 | }
155 | },
156 | "cliui": {
157 | "version": "7.0.4",
158 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
159 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
160 | "dev": true,
161 | "requires": {
162 | "string-width": "^4.2.0",
163 | "strip-ansi": "^6.0.0",
164 | "wrap-ansi": "^7.0.0"
165 | },
166 | "dependencies": {
167 | "ansi-regex": {
168 | "version": "5.0.0",
169 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
170 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
171 | "dev": true
172 | },
173 | "is-fullwidth-code-point": {
174 | "version": "3.0.0",
175 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
176 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
177 | "dev": true
178 | },
179 | "string-width": {
180 | "version": "4.2.2",
181 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
182 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
183 | "dev": true,
184 | "requires": {
185 | "emoji-regex": "^8.0.0",
186 | "is-fullwidth-code-point": "^3.0.0",
187 | "strip-ansi": "^6.0.0"
188 | }
189 | },
190 | "strip-ansi": {
191 | "version": "6.0.0",
192 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
193 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
194 | "dev": true,
195 | "requires": {
196 | "ansi-regex": "^5.0.0"
197 | }
198 | }
199 | }
200 | },
201 | "color-convert": {
202 | "version": "2.0.1",
203 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
204 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
205 | "dev": true,
206 | "requires": {
207 | "color-name": "~1.1.4"
208 | }
209 | },
210 | "color-name": {
211 | "version": "1.1.4",
212 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
213 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
214 | "dev": true
215 | },
216 | "concat-map": {
217 | "version": "0.0.1",
218 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
219 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
220 | "dev": true
221 | },
222 | "debug": {
223 | "version": "4.3.1",
224 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
225 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
226 | "dev": true,
227 | "requires": {
228 | "ms": "2.1.2"
229 | },
230 | "dependencies": {
231 | "ms": {
232 | "version": "2.1.2",
233 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
234 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
235 | "dev": true
236 | }
237 | }
238 | },
239 | "decamelize": {
240 | "version": "4.0.0",
241 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
242 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
243 | "dev": true
244 | },
245 | "deep-eql": {
246 | "version": "3.0.1",
247 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
248 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
249 | "dev": true,
250 | "requires": {
251 | "type-detect": "^4.0.0"
252 | }
253 | },
254 | "diff": {
255 | "version": "5.0.0",
256 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
257 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
258 | "dev": true
259 | },
260 | "emoji-regex": {
261 | "version": "8.0.0",
262 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
263 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
264 | "dev": true
265 | },
266 | "escalade": {
267 | "version": "3.1.1",
268 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
269 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
270 | "dev": true
271 | },
272 | "escape-string-regexp": {
273 | "version": "4.0.0",
274 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
275 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
276 | "dev": true
277 | },
278 | "fill-range": {
279 | "version": "7.0.1",
280 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
281 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
282 | "dev": true,
283 | "requires": {
284 | "to-regex-range": "^5.0.1"
285 | }
286 | },
287 | "find-up": {
288 | "version": "5.0.0",
289 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
290 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
291 | "dev": true,
292 | "requires": {
293 | "locate-path": "^6.0.0",
294 | "path-exists": "^4.0.0"
295 | }
296 | },
297 | "flat": {
298 | "version": "5.0.2",
299 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
300 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
301 | "dev": true
302 | },
303 | "fs.realpath": {
304 | "version": "1.0.0",
305 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
306 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
307 | "dev": true
308 | },
309 | "fsevents": {
310 | "version": "2.3.2",
311 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
312 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
313 | "dev": true,
314 | "optional": true
315 | },
316 | "get-caller-file": {
317 | "version": "2.0.5",
318 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
319 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
320 | "dev": true
321 | },
322 | "get-func-name": {
323 | "version": "2.0.0",
324 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
325 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
326 | "dev": true
327 | },
328 | "glob": {
329 | "version": "7.1.7",
330 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
331 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
332 | "dev": true,
333 | "requires": {
334 | "fs.realpath": "^1.0.0",
335 | "inflight": "^1.0.4",
336 | "inherits": "2",
337 | "minimatch": "^3.0.4",
338 | "once": "^1.3.0",
339 | "path-is-absolute": "^1.0.0"
340 | }
341 | },
342 | "glob-parent": {
343 | "version": "5.1.2",
344 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
345 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
346 | "dev": true,
347 | "requires": {
348 | "is-glob": "^4.0.1"
349 | }
350 | },
351 | "growl": {
352 | "version": "1.10.5",
353 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
354 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
355 | "dev": true
356 | },
357 | "has-flag": {
358 | "version": "4.0.0",
359 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
360 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
361 | "dev": true
362 | },
363 | "he": {
364 | "version": "1.2.0",
365 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
366 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
367 | "dev": true
368 | },
369 | "inflight": {
370 | "version": "1.0.6",
371 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
372 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
373 | "dev": true,
374 | "requires": {
375 | "once": "^1.3.0",
376 | "wrappy": "1"
377 | }
378 | },
379 | "inherits": {
380 | "version": "2.0.4",
381 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
382 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
383 | "dev": true
384 | },
385 | "is-binary-path": {
386 | "version": "2.1.0",
387 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
388 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
389 | "dev": true,
390 | "requires": {
391 | "binary-extensions": "^2.0.0"
392 | }
393 | },
394 | "is-extglob": {
395 | "version": "2.1.1",
396 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
397 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
398 | "dev": true
399 | },
400 | "is-fullwidth-code-point": {
401 | "version": "2.0.0",
402 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
403 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
404 | "dev": true
405 | },
406 | "is-glob": {
407 | "version": "4.0.1",
408 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
409 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
410 | "dev": true,
411 | "requires": {
412 | "is-extglob": "^2.1.1"
413 | }
414 | },
415 | "is-number": {
416 | "version": "7.0.0",
417 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
418 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
419 | "dev": true
420 | },
421 | "is-plain-obj": {
422 | "version": "2.1.0",
423 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
424 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
425 | "dev": true
426 | },
427 | "is-unicode-supported": {
428 | "version": "0.1.0",
429 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
430 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
431 | "dev": true
432 | },
433 | "isexe": {
434 | "version": "2.0.0",
435 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
436 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
437 | "dev": true
438 | },
439 | "js-yaml": {
440 | "version": "4.1.0",
441 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
442 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
443 | "dev": true,
444 | "requires": {
445 | "argparse": "^2.0.1"
446 | }
447 | },
448 | "locate-path": {
449 | "version": "6.0.0",
450 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
451 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
452 | "dev": true,
453 | "requires": {
454 | "p-locate": "^5.0.0"
455 | }
456 | },
457 | "log-symbols": {
458 | "version": "4.1.0",
459 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
460 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
461 | "dev": true,
462 | "requires": {
463 | "chalk": "^4.1.0",
464 | "is-unicode-supported": "^0.1.0"
465 | }
466 | },
467 | "minimatch": {
468 | "version": "3.0.4",
469 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
470 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
471 | "dev": true,
472 | "requires": {
473 | "brace-expansion": "^1.1.7"
474 | }
475 | },
476 | "mocha": {
477 | "version": "9.0.3",
478 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.0.3.tgz",
479 | "integrity": "sha512-hnYFrSefHxYS2XFGtN01x8un0EwNu2bzKvhpRFhgoybIvMaOkkL60IVPmkb5h6XDmUl4IMSB+rT5cIO4/4bJgg==",
480 | "dev": true,
481 | "requires": {
482 | "@ungap/promise-all-settled": "1.1.2",
483 | "ansi-colors": "4.1.1",
484 | "browser-stdout": "1.3.1",
485 | "chokidar": "3.5.2",
486 | "debug": "4.3.1",
487 | "diff": "5.0.0",
488 | "escape-string-regexp": "4.0.0",
489 | "find-up": "5.0.0",
490 | "glob": "7.1.7",
491 | "growl": "1.10.5",
492 | "he": "1.2.0",
493 | "js-yaml": "4.1.0",
494 | "log-symbols": "4.1.0",
495 | "minimatch": "3.0.4",
496 | "ms": "2.1.3",
497 | "nanoid": "3.1.23",
498 | "serialize-javascript": "6.0.0",
499 | "strip-json-comments": "3.1.1",
500 | "supports-color": "8.1.1",
501 | "which": "2.0.2",
502 | "wide-align": "1.1.3",
503 | "workerpool": "6.1.5",
504 | "yargs": "16.2.0",
505 | "yargs-parser": "20.2.4",
506 | "yargs-unparser": "2.0.0"
507 | }
508 | },
509 | "ms": {
510 | "version": "2.1.3",
511 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
512 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
513 | "dev": true
514 | },
515 | "nanoid": {
516 | "version": "3.1.23",
517 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
518 | "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
519 | "dev": true
520 | },
521 | "normalize-path": {
522 | "version": "3.0.0",
523 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
524 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
525 | "dev": true
526 | },
527 | "once": {
528 | "version": "1.4.0",
529 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
530 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
531 | "dev": true,
532 | "requires": {
533 | "wrappy": "1"
534 | }
535 | },
536 | "p-limit": {
537 | "version": "3.1.0",
538 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
539 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
540 | "dev": true,
541 | "requires": {
542 | "yocto-queue": "^0.1.0"
543 | }
544 | },
545 | "p-locate": {
546 | "version": "5.0.0",
547 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
548 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
549 | "dev": true,
550 | "requires": {
551 | "p-limit": "^3.0.2"
552 | }
553 | },
554 | "path-exists": {
555 | "version": "4.0.0",
556 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
557 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
558 | "dev": true
559 | },
560 | "path-is-absolute": {
561 | "version": "1.0.1",
562 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
563 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
564 | "dev": true
565 | },
566 | "pathval": {
567 | "version": "1.1.1",
568 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
569 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
570 | "dev": true
571 | },
572 | "picomatch": {
573 | "version": "2.3.0",
574 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
575 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
576 | "dev": true
577 | },
578 | "randombytes": {
579 | "version": "2.1.0",
580 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
581 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
582 | "dev": true,
583 | "requires": {
584 | "safe-buffer": "^5.1.0"
585 | }
586 | },
587 | "readdirp": {
588 | "version": "3.6.0",
589 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
590 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
591 | "dev": true,
592 | "requires": {
593 | "picomatch": "^2.2.1"
594 | }
595 | },
596 | "require-directory": {
597 | "version": "2.1.1",
598 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
599 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
600 | "dev": true
601 | },
602 | "safe-buffer": {
603 | "version": "5.2.1",
604 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
605 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
606 | "dev": true
607 | },
608 | "serialize-javascript": {
609 | "version": "6.0.0",
610 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
611 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
612 | "dev": true,
613 | "requires": {
614 | "randombytes": "^2.1.0"
615 | }
616 | },
617 | "string-width": {
618 | "version": "2.1.1",
619 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
620 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
621 | "dev": true,
622 | "requires": {
623 | "is-fullwidth-code-point": "^2.0.0",
624 | "strip-ansi": "^4.0.0"
625 | }
626 | },
627 | "strip-ansi": {
628 | "version": "4.0.0",
629 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
630 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
631 | "dev": true,
632 | "requires": {
633 | "ansi-regex": "^3.0.0"
634 | }
635 | },
636 | "strip-json-comments": {
637 | "version": "3.1.1",
638 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
639 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
640 | "dev": true
641 | },
642 | "supports-color": {
643 | "version": "8.1.1",
644 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
645 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
646 | "dev": true,
647 | "requires": {
648 | "has-flag": "^4.0.0"
649 | }
650 | },
651 | "to-regex-range": {
652 | "version": "5.0.1",
653 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
654 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
655 | "dev": true,
656 | "requires": {
657 | "is-number": "^7.0.0"
658 | }
659 | },
660 | "type-detect": {
661 | "version": "4.0.8",
662 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
663 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
664 | "dev": true
665 | },
666 | "which": {
667 | "version": "2.0.2",
668 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
669 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
670 | "dev": true,
671 | "requires": {
672 | "isexe": "^2.0.0"
673 | }
674 | },
675 | "wide-align": {
676 | "version": "1.1.3",
677 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
678 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
679 | "dev": true,
680 | "requires": {
681 | "string-width": "^1.0.2 || 2"
682 | }
683 | },
684 | "workerpool": {
685 | "version": "6.1.5",
686 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
687 | "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
688 | "dev": true
689 | },
690 | "wrap-ansi": {
691 | "version": "7.0.0",
692 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
693 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
694 | "dev": true,
695 | "requires": {
696 | "ansi-styles": "^4.0.0",
697 | "string-width": "^4.1.0",
698 | "strip-ansi": "^6.0.0"
699 | },
700 | "dependencies": {
701 | "ansi-regex": {
702 | "version": "5.0.0",
703 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
704 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
705 | "dev": true
706 | },
707 | "is-fullwidth-code-point": {
708 | "version": "3.0.0",
709 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
710 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
711 | "dev": true
712 | },
713 | "string-width": {
714 | "version": "4.2.2",
715 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
716 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
717 | "dev": true,
718 | "requires": {
719 | "emoji-regex": "^8.0.0",
720 | "is-fullwidth-code-point": "^3.0.0",
721 | "strip-ansi": "^6.0.0"
722 | }
723 | },
724 | "strip-ansi": {
725 | "version": "6.0.0",
726 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
727 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
728 | "dev": true,
729 | "requires": {
730 | "ansi-regex": "^5.0.0"
731 | }
732 | }
733 | }
734 | },
735 | "wrappy": {
736 | "version": "1.0.2",
737 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
738 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
739 | "dev": true
740 | },
741 | "y18n": {
742 | "version": "5.0.8",
743 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
744 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
745 | "dev": true
746 | },
747 | "yargs": {
748 | "version": "16.2.0",
749 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
750 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
751 | "dev": true,
752 | "requires": {
753 | "cliui": "^7.0.2",
754 | "escalade": "^3.1.1",
755 | "get-caller-file": "^2.0.5",
756 | "require-directory": "^2.1.1",
757 | "string-width": "^4.2.0",
758 | "y18n": "^5.0.5",
759 | "yargs-parser": "^20.2.2"
760 | },
761 | "dependencies": {
762 | "ansi-regex": {
763 | "version": "5.0.0",
764 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
765 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
766 | "dev": true
767 | },
768 | "is-fullwidth-code-point": {
769 | "version": "3.0.0",
770 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
771 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
772 | "dev": true
773 | },
774 | "string-width": {
775 | "version": "4.2.2",
776 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
777 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
778 | "dev": true,
779 | "requires": {
780 | "emoji-regex": "^8.0.0",
781 | "is-fullwidth-code-point": "^3.0.0",
782 | "strip-ansi": "^6.0.0"
783 | }
784 | },
785 | "strip-ansi": {
786 | "version": "6.0.0",
787 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
788 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
789 | "dev": true,
790 | "requires": {
791 | "ansi-regex": "^5.0.0"
792 | }
793 | }
794 | }
795 | },
796 | "yargs-parser": {
797 | "version": "20.2.4",
798 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
799 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
800 | "dev": true
801 | },
802 | "yargs-unparser": {
803 | "version": "2.0.0",
804 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
805 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
806 | "dev": true,
807 | "requires": {
808 | "camelcase": "^6.0.0",
809 | "decamelize": "^4.0.0",
810 | "flat": "^5.0.2",
811 | "is-plain-obj": "^2.1.0"
812 | }
813 | },
814 | "yocto-queue": {
815 | "version": "0.1.0",
816 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
817 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
818 | "dev": true
819 | }
820 | }
821 | }
822 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "string-replace-to-array",
3 | "version": "2.1.1",
4 | "description": "Works like String.prototype.replace but outputs an array. Useful for replacing parts of the string with objects of other types.",
5 | "main": "string-replace-to-array.js",
6 | "repository": {
7 | "type": "git",
8 | "url": "https://github.com/appfigures/string-replace-to-array"
9 | },
10 | "bugs": {
11 | "url": "https://github.com/appfigures/string-replace-to-array/issues"
12 | },
13 | "scripts": {
14 | "test": "mocha test.js"
15 | },
16 | "keywords": [
17 | "string",
18 | "replace",
19 | "array",
20 | "react",
21 | "emoji"
22 | ],
23 | "sideEffects": false,
24 | "author": "Oz Michaeli",
25 | "license": "MIT",
26 | "devDependencies": {
27 | "chai": "^4.3.4",
28 | "mocha": "^9.0.3"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # String replace to array
2 |
3 | [](https://www.npmjs.com/package/string-replace-to-array)
4 | [](https://www.npmjs.com/package/string-replace-to-array)
5 | [](https://circleci.com/gh/appfigures/string-replace-to-array)
6 | [](https://www.npmjs.com/package/string-replace-to-array)
7 | [](https://www.npmjs.com/package/string-replace-to-array)
8 |
9 | Works just like `String.prototype.replace` but outputs an array instead of a string. It's [tiny](https://bundlephobia.com/package/string-replace-to-array) (<1KB) and has no dependencies.
10 |
11 | ## Why?
12 |
13 | We built this for use with React, but it's very generic and doesn't depend on any environment. Consider the following scenario.
14 |
15 | Given this string:
16 |
17 | ```
18 | var content = 'Hello\nworld'
19 | ```
20 |
21 | and this React markup:
22 |
23 | ```
24 | { content }
25 | ```
26 |
27 | We'll get this output:
28 | ```
29 | Hello world
30 | ```
31 | _The newline character is ignored when the browser renders the resulting html._
32 |
33 | The solution is to replace `\n` with `
`:
34 |
35 | ```
36 | { replace(content, '\n',
) }
37 | ```
38 |
39 | and the output will be:
40 |
41 | ```
42 | Helloworld
43 | ```
44 | When rendered:
45 | ```
46 | Hello
47 | world
48 | ```
49 |
50 | Now the newline will be rendered properly. Yay!
51 |
52 | ## Example usage
53 |
54 | ### Simple example
55 |
56 | ```
57 | var replace = require('string-replace-to-array')
58 | replace('Hello Amy', 'Amy', { name: 'Amy' })
59 | // output: ['Hello ', { name: 'Amy' }]
60 | ```
61 |
62 | ### Full example
63 |
64 | ```
65 | replace(
66 | 'Hello Hermione Granger...',
67 | /(Hermione) (Granger)/g,
68 | function (fullName, firstName, lastName, offset, string) {
69 | return
70 | }
71 | )
72 |
73 | // output: ['Hello ', , ...]
74 | ```
75 |
76 | For a real-life example check out [react-easy-emoji](https://github.com/appfigures/react-easy-emoji), where this this is used to replace emoji unicode characters with `
` tags.
77 |
78 | ## Installation
79 |
80 | ```
81 | npm install --save string-replace-to-array
82 | ```
83 |
84 | ## API
85 |
86 | ```
87 | (string, regexp|substr, newValue|function) => array
88 | ```
89 |
90 | The API mimics [String.prototype.replace](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace). The only differences are:
91 |
92 | - The replacer (third parameter) doesn't have to be a string
93 | - Returns an array instead of a string
94 |
95 | ## Inspiration
96 |
97 | Mainly inspired by this conversation: https://github.com/facebook/react/issues/3386
98 |
99 | ### Why not use [react-replace-string](https://github.com/iansinnott/react-string-replace)?
100 |
101 | Because we needed the full API of `String.replace`, especially the regex match parameters which get passed to the replace function.
102 |
103 |
--------------------------------------------------------------------------------
/string-replace-to-array.d.ts:
--------------------------------------------------------------------------------
1 | interface StringReplacerFn {
2 | (match : string, offset : number, string : string) : T
3 | }
4 | interface RegExpReplacerFn {
5 | // Full signature: match, p1, p2, ..., pN, offset, string
6 | (match : string, ...args : any[]) : T
7 | }
8 |
9 | declare function stringReplaceToArray(string : string, pattern : string, replacer : StringReplacerFn | T) : (T | string)[]
10 | declare function stringReplaceToArray(string : string, pattern : RegExp, replacer : RegExpReplacerFn | T) : (T | string)[]
11 |
12 | export default stringReplaceToArray
--------------------------------------------------------------------------------
/string-replace-to-array.js:
--------------------------------------------------------------------------------
1 | // Inspiration: https://github.com/facebook/react/issues/3386
2 |
3 | function replace (string, regexpOrSubstr, newValueOrFn, globalOffset) {
4 | if (typeof string !== 'string') throw new Error('First param must be a string')
5 | if (typeof regexpOrSubstr !== 'string' && !(regexpOrSubstr instanceof RegExp)) throw new Error('Second param must be a string pattern or a regular expression')
6 |
7 | var fn = (typeof regexpOrSubstr === 'string') ? replaceUsingString : replaceUsingRegexp
8 |
9 | return fn(string, regexpOrSubstr, newValueOrFn, globalOffset)
10 | }
11 |
12 | function replaceUsingString (string, patternString, newValueOrFn, globalOffset) {
13 | var index = string.indexOf(patternString)
14 |
15 | if (index >= 0) {
16 | var arr = []
17 | var endIndex = index + patternString.length
18 |
19 | if (index > 0) {
20 | arr.push(string.substring(0, index))
21 | }
22 |
23 | arr.push(
24 | (typeof newValueOrFn === 'function') ?
25 | newValueOrFn(
26 | string.substring(index, endIndex),
27 | index + globalOffset,
28 | string
29 | ) :
30 | newValueOrFn
31 | )
32 |
33 | if (endIndex < string.length) {
34 | arr.push(string.substring(endIndex))
35 | }
36 |
37 | return arr
38 | } else {
39 | return [string]
40 | }
41 | }
42 |
43 | function replaceUsingRegexp (string, regexp, newValueOrFn, globalOffset) {
44 | var output = []
45 |
46 | var replacerIsFn = (typeof newValueOrFn === 'function')
47 |
48 | var storedLastIndex = regexp.lastIndex
49 | regexp.lastIndex = 0
50 |
51 | var result
52 | var lastIndex = 0
53 | while (result = regexp.exec(string)) {
54 | var index = result.index
55 |
56 | if (result[0] === '') {
57 | // When the regexp is an empty string
58 | // we still want to advance our cursor to the next item.
59 | // This is the behavior of String.replace.
60 | regexp.lastIndex++
61 | }
62 |
63 | if (index !== lastIndex) {
64 | output.push(string.substring(lastIndex, index))
65 | }
66 |
67 | var match = result[0]
68 | lastIndex = index + match.length
69 |
70 | var out = replacerIsFn ?
71 | newValueOrFn.apply(this, result.concat(index + globalOffset, result.input)) :
72 | newValueOrFn
73 | output.push(out)
74 |
75 | if (!regexp.global) {
76 | break
77 | }
78 | }
79 |
80 | if (lastIndex < string.length) {
81 | output.push(string.substring(lastIndex))
82 | }
83 |
84 | regexp.lastIndex = storedLastIndex
85 | return output
86 | }
87 |
88 | module.exports = function stringReplaceToArray (stringOrArray, regexpOrSubstr, newSubStrOrFn) {
89 | if (typeof stringOrArray === 'string') {
90 | return replace(stringOrArray, regexpOrSubstr, newSubStrOrFn, 0)
91 | } else if (!Array.isArray(stringOrArray) || !stringOrArray[0]) {
92 | throw new TypeError('First argument must be an array or non-empty string')
93 | } else {
94 | var len = stringOrArray.length
95 | var output = []
96 | var globalOffset = 0
97 | for (var i = 0; i < len; ++i) {
98 | var arrayItem = stringOrArray[i]
99 | if (typeof arrayItem === 'string') {
100 | output.push.apply(output, replace(arrayItem, regexpOrSubstr, newSubStrOrFn, globalOffset))
101 | globalOffset += arrayItem.length
102 | } else {
103 | output.push(arrayItem)
104 | }
105 | }
106 | return output
107 | }
108 | }
--------------------------------------------------------------------------------
/test.js:
--------------------------------------------------------------------------------
1 | var chai = require('chai')
2 |
3 | var should = chai.should()
4 |
5 | var replace = require('./')
6 |
7 | describe('string-replace-to-array', function () {
8 | describe('string pattern', function () {
9 | it ('should accept a string at the end', function () {
10 | replace('Hello world', 'world', 'k42f/(.123').should.eql(['Hello ', 'k42f/(.123'])
11 | })
12 |
13 | it ('should accept a string in the front', function () {
14 | replace('Hello world', 'Hello', 'k42f/(.123').should.eql(['k42f/(.123', ' world'])
15 | })
16 |
17 | it ('should accept a string in the middle', function () {
18 | replace('Hello', 'll', 4).should.eql(['He', 4, 'o'])
19 | replace('Hello there world', 'there', 'k42f/(.123').should.eql(['Hello ', 'k42f/(.123', ' world'])
20 | })
21 |
22 | it ('should use the replace function', function () {
23 | var newValue = {}
24 |
25 | function replacer (match, offset, string) {
26 | match.should.equal('Hello')
27 | offset.should.equal(0)
28 | string.should.equal('Hello world')
29 | return newValue
30 | }
31 |
32 | replace('Hello world', 'Hello', replacer).should.eql([newValue, ' world'])
33 | })
34 | })
35 | describe('regex pattern', function () {
36 | it ('should replace all occurences of a global regex pattern', function () {
37 | replace('Hello there world there world Hello', /Hello/g, 'replaced')
38 | .should.eql(['replaced', ' there world there world ', 'replaced'])
39 | })
40 |
41 | it ('should work with non-global regexps', function () {
42 | replace('Hello', /ll/, 4).should.eql(['He', 4, 'o'])
43 | })
44 |
45 | it ('should use the replace function', function () {
46 | var newValue = {}
47 |
48 | function replacer (match, a, offset, string) {
49 | match.should.include('He')
50 | a.should.include('ll')
51 | string.should.equal('Hello there world there world Hellllo')
52 | offset.should.be.a('number')
53 | return { inside: a }
54 | }
55 |
56 | replace('Hello there world there world Hellllo', /He(l+)o/g , replacer)
57 | .should.eql([{ inside: 'll' }, ' there world there world ', { inside: 'llll' }])
58 | })
59 |
60 | describe('String.replace equivalence', function () {
61 | it ('should handle an empty regexp', function () {
62 | 'Some string'.replace(new RegExp(''), 'New string').should.equal('New stringSome string')
63 | replace('Some string', new RegExp(''), 'New string')
64 | .should.eql(['New string', 'Some string'])
65 | })
66 |
67 | // Source: https://github.com/oztune/string-replace-to-array/issues/2
68 | it ('should handle an empty regexp with the g flag', function () {
69 | '1234'.replace(new RegExp('', 'g'), '|').should.equal('|1|2|3|4|')
70 | replace('1234', new RegExp('', 'g'), '|')
71 | .should.eql(['|', '1','|', '2', '|', '3', '|', '4', '|'])
72 | })
73 |
74 | it ('should handle an empty regexp with the g flag and an empty string input', function () {
75 | ''.replace(new RegExp('', 'g'), '|').should.equal('|')
76 | replace('', new RegExp('', 'g'), '|')
77 | .should.eql(['|'])
78 | })
79 | })
80 | })
81 | describe('flattening', function () {
82 | it ('should accept an array, and only replace the strings', function () {
83 | replace([{}, 'some string', {}], 'some', 'a')
84 | .should.eql([{}, 'a', ' string', {}])
85 | })
86 | // Source: https://github.com/appfigures/react-easy-emoji/issues/18
87 | it ('should provide a global offset when doing a string replace', function () {
88 | const result = replace(["🧡 abc", "🧡 xyz"], '🧡', (_match, offset, _string) => {
89 | return offset
90 | })
91 | result.should.eql([0, ' abc', 6, ' xyz'])
92 | })
93 | it ('should provide a global offset when doing a regex replace', function () {
94 | const result = replace(["🧡 abc", "🧡 xyz"], /🧡/g, (_match, offset, _string) => {
95 | return offset
96 | })
97 | result.should.eql([0, ' abc', 6, ' xyz'])
98 | })
99 | })
100 | })
--------------------------------------------------------------------------------