├── .appcast.xml
├── .gitignore
├── README.md
├── assets
├── icon.png
├── package-lock.json
└── package.json
├── package-lock.json
├── package.json
├── plugin-view.png
└── src
├── copy-svg-as-react-component.js
├── copy-svg-as-rn-component.js
├── export-svg-with-react-component.js
├── helpers.js
├── manifest.json
└── messages.js
/.appcast.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
6 |
7 | -
8 |
9 |
10 | -
11 |
12 |
13 | -
14 |
15 |
16 | -
17 |
18 |
19 | -
20 |
21 |
22 | -
23 |
24 |
25 | -
26 |
27 |
28 | -
29 |
30 |
31 | -
32 |
33 |
34 | -
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # build artifacts
2 | sketch-svg-to-react-component.sketchplugin/**/*
3 |
4 | # npm
5 | node_modules
6 | .npm
7 | npm-debug.log
8 | **/*.js.map
9 |
10 | # mac
11 | .DS_Store
12 |
13 | # WebStorm
14 | .idea
15 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # sketch-svg-to-react-component
2 |
3 | The sketch plugin which can transform svg to react or react native svg component.
4 |
5 | ## Install
6 |
7 | The most recent version you can find here: [Download the latest Sketch-Svg-to-React-Component](https://github.com/reeli/sketch-svg-to-react-component/releases)
8 |
9 | ## Usage
10 |
11 | - Copy sketch selected layers as React Component: `cmd + option + r`
12 | - Copy sketch selected layers as RN Component: `cmd + option + n`
13 | - Export multiple svg as React Component
14 |
15 |
16 |
17 |
18 |
19 | ## Upcoming soon
20 |
21 | - Export multiple svg as RN Component
22 |
23 | ## Road Map
24 |
25 | - Format copied string by prettier
26 | - Remove specific characters in filename like @2x, otherwise will cause error
27 | - Replace svgr by simplify-svg
28 | - Add outline for svg
29 | - Export react components with customized template
30 |
31 | ## Publish
32 |
33 | - rm assets/node_modules before publish
--------------------------------------------------------------------------------
/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reeli/sketch-svg-to-react-component/f03be86f7230f988226f98e04a8995e5d8509cca/assets/icon.png
--------------------------------------------------------------------------------
/assets/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "sketch-svg-to-react-component-in-typescript-assets",
3 | "requires": true,
4 | "lockfileVersion": 1,
5 | "dependencies": {
6 | "@svgr/cli": {
7 | "version": "3.1.0",
8 | "resolved": "https://registry.npmjs.org/@svgr/cli/-/cli-3.1.0.tgz",
9 | "integrity": "sha512-IRTmF3EpL/uGkFS1F9aNZ0OoI4n68barpO3lS+lg10h4eXyPpopTYSWtQY/QDL/N1vATeCHAm+2t5ellxb/kuw==",
10 | "requires": {
11 | "@svgr/core": "^3.1.0",
12 | "camelcase": "^5.0.0",
13 | "chalk": "^2.4.1",
14 | "commander": "^2.18.0",
15 | "dashify": "^1.0.0",
16 | "glob": "^7.1.3",
17 | "output-file-sync": "^2.0.1",
18 | "recursive-readdir": "^2.2.2"
19 | }
20 | },
21 | "@svgr/core": {
22 | "version": "3.1.0",
23 | "resolved": "https://registry.npmjs.org/@svgr/core/-/core-3.1.0.tgz",
24 | "integrity": "sha512-597mHNBnMiNaGB26WqlLqJcKKvExFHjszUO+O+a6s+UNzbmIysMl94mI0JgaS8R18fxR+C61/KCIhr7pBOxsgw==",
25 | "requires": {
26 | "camelcase": "^5.0.0",
27 | "cosmiconfig": "^5.0.6",
28 | "h2x-core": "^1.1.1",
29 | "h2x-plugin-jsx": "^1.2.0",
30 | "merge-deep": "^3.0.2",
31 | "prettier": "^1.14.3",
32 | "svgo": "^1.1.1"
33 | }
34 | },
35 | "abab": {
36 | "version": "2.0.0",
37 | "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz",
38 | "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w=="
39 | },
40 | "acorn": {
41 | "version": "6.0.2",
42 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz",
43 | "integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg=="
44 | },
45 | "acorn-globals": {
46 | "version": "4.3.0",
47 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz",
48 | "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==",
49 | "requires": {
50 | "acorn": "^6.0.1",
51 | "acorn-walk": "^6.0.1"
52 | }
53 | },
54 | "acorn-walk": {
55 | "version": "6.1.0",
56 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.0.tgz",
57 | "integrity": "sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg=="
58 | },
59 | "ajv": {
60 | "version": "5.5.2",
61 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
62 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
63 | "requires": {
64 | "co": "^4.6.0",
65 | "fast-deep-equal": "^1.0.0",
66 | "fast-json-stable-stringify": "^2.0.0",
67 | "json-schema-traverse": "^0.3.0"
68 | }
69 | },
70 | "ansi-styles": {
71 | "version": "3.2.1",
72 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
73 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
74 | "requires": {
75 | "color-convert": "^1.9.0"
76 | }
77 | },
78 | "argparse": {
79 | "version": "1.0.10",
80 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
81 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
82 | "requires": {
83 | "sprintf-js": "~1.0.2"
84 | }
85 | },
86 | "arr-union": {
87 | "version": "3.1.0",
88 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
89 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
90 | },
91 | "array-equal": {
92 | "version": "1.0.0",
93 | "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
94 | "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
95 | },
96 | "asn1": {
97 | "version": "0.2.4",
98 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
99 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
100 | "requires": {
101 | "safer-buffer": "~2.1.0"
102 | }
103 | },
104 | "assert-plus": {
105 | "version": "1.0.0",
106 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
107 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
108 | },
109 | "async-limiter": {
110 | "version": "1.0.0",
111 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
112 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
113 | },
114 | "asynckit": {
115 | "version": "0.4.0",
116 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
117 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
118 | },
119 | "aws-sign2": {
120 | "version": "0.7.0",
121 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
122 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
123 | },
124 | "aws4": {
125 | "version": "1.8.0",
126 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
127 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
128 | },
129 | "balanced-match": {
130 | "version": "1.0.0",
131 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
132 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
133 | },
134 | "bcrypt-pbkdf": {
135 | "version": "1.0.2",
136 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
137 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
138 | "requires": {
139 | "tweetnacl": "^0.14.3"
140 | }
141 | },
142 | "boolbase": {
143 | "version": "1.0.0",
144 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
145 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
146 | },
147 | "brace-expansion": {
148 | "version": "1.1.11",
149 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
150 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
151 | "requires": {
152 | "balanced-match": "^1.0.0",
153 | "concat-map": "0.0.1"
154 | }
155 | },
156 | "browser-process-hrtime": {
157 | "version": "0.1.3",
158 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz",
159 | "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw=="
160 | },
161 | "camelcase": {
162 | "version": "5.0.0",
163 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
164 | "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA=="
165 | },
166 | "caseless": {
167 | "version": "0.12.0",
168 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
169 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
170 | },
171 | "chalk": {
172 | "version": "2.4.1",
173 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
174 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
175 | "requires": {
176 | "ansi-styles": "^3.2.1",
177 | "escape-string-regexp": "^1.0.5",
178 | "supports-color": "^5.3.0"
179 | }
180 | },
181 | "clone-deep": {
182 | "version": "0.2.4",
183 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
184 | "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=",
185 | "requires": {
186 | "for-own": "^0.1.3",
187 | "is-plain-object": "^2.0.1",
188 | "kind-of": "^3.0.2",
189 | "lazy-cache": "^1.0.3",
190 | "shallow-clone": "^0.1.2"
191 | }
192 | },
193 | "co": {
194 | "version": "4.6.0",
195 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
196 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
197 | },
198 | "coa": {
199 | "version": "2.0.1",
200 | "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz",
201 | "integrity": "sha512-5wfTTO8E2/ja4jFSxePXlG5nRu5bBtL/r1HCIpJW/lzT6yDtKl0u0Z4o/Vpz32IpKmBn7HerheEZQgA9N2DarQ==",
202 | "requires": {
203 | "q": "^1.1.2"
204 | }
205 | },
206 | "color-convert": {
207 | "version": "1.9.3",
208 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
209 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
210 | "requires": {
211 | "color-name": "1.1.3"
212 | }
213 | },
214 | "color-name": {
215 | "version": "1.1.3",
216 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
217 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
218 | },
219 | "colors": {
220 | "version": "1.1.2",
221 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
222 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
223 | },
224 | "combined-stream": {
225 | "version": "1.0.7",
226 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
227 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
228 | "requires": {
229 | "delayed-stream": "~1.0.0"
230 | }
231 | },
232 | "commander": {
233 | "version": "2.19.0",
234 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
235 | "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
236 | },
237 | "concat-map": {
238 | "version": "0.0.1",
239 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
240 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
241 | },
242 | "core-util-is": {
243 | "version": "1.0.2",
244 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
245 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
246 | },
247 | "cosmiconfig": {
248 | "version": "5.0.6",
249 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz",
250 | "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==",
251 | "requires": {
252 | "is-directory": "^0.3.1",
253 | "js-yaml": "^3.9.0",
254 | "parse-json": "^4.0.0"
255 | }
256 | },
257 | "css-select": {
258 | "version": "2.0.0",
259 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.0.tgz",
260 | "integrity": "sha512-MGhoq1S9EyPgZIGnts8Yz5WwUOyHmPMdlqeifsYs/xFX7AAm3hY0RJe1dqVlXtYPI66Nsk39R/sa5/ree6L2qg==",
261 | "requires": {
262 | "boolbase": "^1.0.0",
263 | "css-what": "2.1",
264 | "domutils": "^1.7.0",
265 | "nth-check": "^1.0.1"
266 | }
267 | },
268 | "css-select-base-adapter": {
269 | "version": "0.1.0",
270 | "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz",
271 | "integrity": "sha1-AQKz0UYw34bD65+p9UVicBBs+ZA="
272 | },
273 | "css-tree": {
274 | "version": "1.0.0-alpha.28",
275 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz",
276 | "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==",
277 | "requires": {
278 | "mdn-data": "~1.1.0",
279 | "source-map": "^0.5.3"
280 | }
281 | },
282 | "css-url-regex": {
283 | "version": "1.1.0",
284 | "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz",
285 | "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w="
286 | },
287 | "css-what": {
288 | "version": "2.1.0",
289 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
290 | "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0="
291 | },
292 | "csso": {
293 | "version": "3.5.1",
294 | "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz",
295 | "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==",
296 | "requires": {
297 | "css-tree": "1.0.0-alpha.29"
298 | },
299 | "dependencies": {
300 | "css-tree": {
301 | "version": "1.0.0-alpha.29",
302 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz",
303 | "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==",
304 | "requires": {
305 | "mdn-data": "~1.1.0",
306 | "source-map": "^0.5.3"
307 | }
308 | }
309 | }
310 | },
311 | "cssom": {
312 | "version": "0.3.4",
313 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz",
314 | "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog=="
315 | },
316 | "cssstyle": {
317 | "version": "1.1.1",
318 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz",
319 | "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==",
320 | "requires": {
321 | "cssom": "0.3.x"
322 | }
323 | },
324 | "dashdash": {
325 | "version": "1.14.1",
326 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
327 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
328 | "requires": {
329 | "assert-plus": "^1.0.0"
330 | }
331 | },
332 | "dashify": {
333 | "version": "1.0.0",
334 | "resolved": "https://registry.npmjs.org/dashify/-/dashify-1.0.0.tgz",
335 | "integrity": "sha512-3uyC9AzRYm/9u2nqD8BpIBKsvHg/OfW3FLKS97mJPil2KzFNHgKta3yL2NfzMDY+0ArSLbKfgNXhgq0FyjOhoA=="
336 | },
337 | "data-urls": {
338 | "version": "1.0.1",
339 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz",
340 | "integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==",
341 | "requires": {
342 | "abab": "^2.0.0",
343 | "whatwg-mimetype": "^2.1.0",
344 | "whatwg-url": "^7.0.0"
345 | }
346 | },
347 | "deep-is": {
348 | "version": "0.1.3",
349 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
350 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
351 | },
352 | "define-properties": {
353 | "version": "1.1.3",
354 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
355 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
356 | "requires": {
357 | "object-keys": "^1.0.12"
358 | }
359 | },
360 | "delayed-stream": {
361 | "version": "1.0.0",
362 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
363 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
364 | },
365 | "dom-serializer": {
366 | "version": "0.1.0",
367 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
368 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
369 | "requires": {
370 | "domelementtype": "~1.1.1",
371 | "entities": "~1.1.1"
372 | },
373 | "dependencies": {
374 | "domelementtype": {
375 | "version": "1.1.3",
376 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
377 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
378 | }
379 | }
380 | },
381 | "domelementtype": {
382 | "version": "1.3.0",
383 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
384 | "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI="
385 | },
386 | "domexception": {
387 | "version": "1.0.1",
388 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
389 | "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
390 | "requires": {
391 | "webidl-conversions": "^4.0.2"
392 | }
393 | },
394 | "domutils": {
395 | "version": "1.7.0",
396 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
397 | "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
398 | "requires": {
399 | "dom-serializer": "0",
400 | "domelementtype": "1"
401 | }
402 | },
403 | "ecc-jsbn": {
404 | "version": "0.1.2",
405 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
406 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
407 | "requires": {
408 | "jsbn": "~0.1.0",
409 | "safer-buffer": "^2.1.0"
410 | }
411 | },
412 | "entities": {
413 | "version": "1.1.1",
414 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
415 | "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA="
416 | },
417 | "error-ex": {
418 | "version": "1.3.2",
419 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
420 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
421 | "requires": {
422 | "is-arrayish": "^0.2.1"
423 | }
424 | },
425 | "es-abstract": {
426 | "version": "1.12.0",
427 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
428 | "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
429 | "requires": {
430 | "es-to-primitive": "^1.1.1",
431 | "function-bind": "^1.1.1",
432 | "has": "^1.0.1",
433 | "is-callable": "^1.1.3",
434 | "is-regex": "^1.0.4"
435 | }
436 | },
437 | "es-to-primitive": {
438 | "version": "1.2.0",
439 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
440 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
441 | "requires": {
442 | "is-callable": "^1.1.4",
443 | "is-date-object": "^1.0.1",
444 | "is-symbol": "^1.0.2"
445 | }
446 | },
447 | "escape-string-regexp": {
448 | "version": "1.0.5",
449 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
450 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
451 | },
452 | "escodegen": {
453 | "version": "1.11.0",
454 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz",
455 | "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==",
456 | "requires": {
457 | "esprima": "^3.1.3",
458 | "estraverse": "^4.2.0",
459 | "esutils": "^2.0.2",
460 | "optionator": "^0.8.1",
461 | "source-map": "~0.6.1"
462 | },
463 | "dependencies": {
464 | "esprima": {
465 | "version": "3.1.3",
466 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
467 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
468 | },
469 | "source-map": {
470 | "version": "0.6.1",
471 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
472 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
473 | "optional": true
474 | }
475 | }
476 | },
477 | "esprima": {
478 | "version": "4.0.1",
479 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
480 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
481 | },
482 | "estraverse": {
483 | "version": "4.2.0",
484 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
485 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
486 | },
487 | "esutils": {
488 | "version": "2.0.2",
489 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
490 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
491 | },
492 | "extend": {
493 | "version": "3.0.2",
494 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
495 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
496 | },
497 | "extsprintf": {
498 | "version": "1.3.0",
499 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
500 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
501 | },
502 | "fast-deep-equal": {
503 | "version": "1.1.0",
504 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
505 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
506 | },
507 | "fast-json-stable-stringify": {
508 | "version": "2.0.0",
509 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
510 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
511 | },
512 | "fast-levenshtein": {
513 | "version": "2.0.6",
514 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
515 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
516 | },
517 | "for-in": {
518 | "version": "1.0.2",
519 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
520 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
521 | },
522 | "for-own": {
523 | "version": "0.1.5",
524 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
525 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
526 | "requires": {
527 | "for-in": "^1.0.1"
528 | }
529 | },
530 | "forever-agent": {
531 | "version": "0.6.1",
532 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
533 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
534 | },
535 | "form-data": {
536 | "version": "2.3.2",
537 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
538 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
539 | "requires": {
540 | "asynckit": "^0.4.0",
541 | "combined-stream": "1.0.6",
542 | "mime-types": "^2.1.12"
543 | },
544 | "dependencies": {
545 | "combined-stream": {
546 | "version": "1.0.6",
547 | "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
548 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
549 | "requires": {
550 | "delayed-stream": "~1.0.0"
551 | }
552 | }
553 | }
554 | },
555 | "fs.realpath": {
556 | "version": "1.0.0",
557 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
558 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
559 | },
560 | "function-bind": {
561 | "version": "1.1.1",
562 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
563 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
564 | },
565 | "getpass": {
566 | "version": "0.1.7",
567 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
568 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
569 | "requires": {
570 | "assert-plus": "^1.0.0"
571 | }
572 | },
573 | "glob": {
574 | "version": "7.1.3",
575 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
576 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
577 | "requires": {
578 | "fs.realpath": "^1.0.0",
579 | "inflight": "^1.0.4",
580 | "inherits": "2",
581 | "minimatch": "^3.0.4",
582 | "once": "^1.3.0",
583 | "path-is-absolute": "^1.0.0"
584 | }
585 | },
586 | "graceful-fs": {
587 | "version": "4.1.11",
588 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
589 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
590 | },
591 | "h2x-core": {
592 | "version": "1.1.1",
593 | "resolved": "https://registry.npmjs.org/h2x-core/-/h2x-core-1.1.1.tgz",
594 | "integrity": "sha512-LdXe4Irs731knLtHgLyFrnJCumfiqXXQwKN1IMUhi37li29PLfLbMDvfK7Rk4wmgHLKP+sIITT1mcJV4QsC3nw==",
595 | "requires": {
596 | "h2x-generate": "^1.1.0",
597 | "h2x-parse": "^1.1.1",
598 | "h2x-traverse": "^1.1.0"
599 | }
600 | },
601 | "h2x-generate": {
602 | "version": "1.1.0",
603 | "resolved": "https://registry.npmjs.org/h2x-generate/-/h2x-generate-1.1.0.tgz",
604 | "integrity": "sha512-L7Hym0yb20QIjvqeULUPOeh/cyvScdOAyJ6oRlh5dF0+w92hf3OiTk1q15KBijde7jGEe+0R4aOmtW8gkPNIzg==",
605 | "requires": {
606 | "h2x-traverse": "^1.1.0"
607 | }
608 | },
609 | "h2x-parse": {
610 | "version": "1.1.1",
611 | "resolved": "https://registry.npmjs.org/h2x-parse/-/h2x-parse-1.1.1.tgz",
612 | "integrity": "sha512-WRSmPF+tIWuUXVEZaYRhcZx/JGEJx8LjZpDDtrvMr5m/GTR0NerydCik5dRzcKXPWCtfXxuJRLR4v2P4HB2B1A==",
613 | "requires": {
614 | "h2x-types": "^1.1.0",
615 | "jsdom": ">=11.0.0"
616 | }
617 | },
618 | "h2x-plugin-jsx": {
619 | "version": "1.2.0",
620 | "resolved": "https://registry.npmjs.org/h2x-plugin-jsx/-/h2x-plugin-jsx-1.2.0.tgz",
621 | "integrity": "sha512-a7Vb3BHhJJq0dPDNdqguEyQirENkVsFtvM2YkiaT5h/fmGhmM1nDy3BLeJeSKi2tL2g9v4ykm2Z+GG9QrhDgPA==",
622 | "requires": {
623 | "h2x-types": "^1.1.0"
624 | }
625 | },
626 | "h2x-traverse": {
627 | "version": "1.1.0",
628 | "resolved": "https://registry.npmjs.org/h2x-traverse/-/h2x-traverse-1.1.0.tgz",
629 | "integrity": "sha512-1ND8ZbISLSUgpLHYJRvhvElITvs0g44L7RxjeXViz5XP6rooa+FtXTFLByl2Yg01zj2txubifHIuU4pgvj8l+A==",
630 | "requires": {
631 | "h2x-types": "^1.1.0"
632 | }
633 | },
634 | "h2x-types": {
635 | "version": "1.1.0",
636 | "resolved": "https://registry.npmjs.org/h2x-types/-/h2x-types-1.1.0.tgz",
637 | "integrity": "sha512-QdH5qfLcdF209UsCdM0ZNZ9Dwm2PHvMfeLZtivBrjX3Y/df4US2pwsUC4HBfWhye/mx/t6puODeC7Oacb/Ol8g=="
638 | },
639 | "har-schema": {
640 | "version": "2.0.0",
641 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
642 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
643 | },
644 | "har-validator": {
645 | "version": "5.1.0",
646 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
647 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
648 | "requires": {
649 | "ajv": "^5.3.0",
650 | "har-schema": "^2.0.0"
651 | }
652 | },
653 | "has": {
654 | "version": "1.0.3",
655 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
656 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
657 | "requires": {
658 | "function-bind": "^1.1.1"
659 | }
660 | },
661 | "has-flag": {
662 | "version": "3.0.0",
663 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
664 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
665 | },
666 | "has-symbols": {
667 | "version": "1.0.0",
668 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
669 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q="
670 | },
671 | "html-encoding-sniffer": {
672 | "version": "1.0.2",
673 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
674 | "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
675 | "requires": {
676 | "whatwg-encoding": "^1.0.1"
677 | }
678 | },
679 | "http-signature": {
680 | "version": "1.2.0",
681 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
682 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
683 | "requires": {
684 | "assert-plus": "^1.0.0",
685 | "jsprim": "^1.2.2",
686 | "sshpk": "^1.7.0"
687 | }
688 | },
689 | "iconv-lite": {
690 | "version": "0.4.24",
691 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
692 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
693 | "requires": {
694 | "safer-buffer": ">= 2.1.2 < 3"
695 | }
696 | },
697 | "inflight": {
698 | "version": "1.0.6",
699 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
700 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
701 | "requires": {
702 | "once": "^1.3.0",
703 | "wrappy": "1"
704 | }
705 | },
706 | "inherits": {
707 | "version": "2.0.3",
708 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
709 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
710 | },
711 | "is-arrayish": {
712 | "version": "0.2.1",
713 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
714 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
715 | },
716 | "is-buffer": {
717 | "version": "1.1.6",
718 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
719 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
720 | },
721 | "is-callable": {
722 | "version": "1.1.4",
723 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
724 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA=="
725 | },
726 | "is-date-object": {
727 | "version": "1.0.1",
728 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
729 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY="
730 | },
731 | "is-directory": {
732 | "version": "0.3.1",
733 | "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
734 | "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
735 | },
736 | "is-extendable": {
737 | "version": "0.1.1",
738 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
739 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
740 | },
741 | "is-plain-obj": {
742 | "version": "1.1.0",
743 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
744 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
745 | },
746 | "is-plain-object": {
747 | "version": "2.0.4",
748 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
749 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
750 | "requires": {
751 | "isobject": "^3.0.1"
752 | }
753 | },
754 | "is-regex": {
755 | "version": "1.0.4",
756 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
757 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
758 | "requires": {
759 | "has": "^1.0.1"
760 | }
761 | },
762 | "is-symbol": {
763 | "version": "1.0.2",
764 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
765 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
766 | "requires": {
767 | "has-symbols": "^1.0.0"
768 | }
769 | },
770 | "is-typedarray": {
771 | "version": "1.0.0",
772 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
773 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
774 | },
775 | "isobject": {
776 | "version": "3.0.1",
777 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
778 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
779 | },
780 | "isstream": {
781 | "version": "0.1.2",
782 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
783 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
784 | },
785 | "js-yaml": {
786 | "version": "3.12.0",
787 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
788 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
789 | "requires": {
790 | "argparse": "^1.0.7",
791 | "esprima": "^4.0.0"
792 | }
793 | },
794 | "jsbn": {
795 | "version": "0.1.1",
796 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
797 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
798 | },
799 | "jsdom": {
800 | "version": "12.2.0",
801 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-12.2.0.tgz",
802 | "integrity": "sha512-QPOggIJ8fquWPLaYYMoh+zqUmdphDtu1ju0QGTitZT1Yd8I5qenPpXM1etzUegu3MjVp8XPzgZxdn8Yj7e40ig==",
803 | "requires": {
804 | "abab": "^2.0.0",
805 | "acorn": "^6.0.2",
806 | "acorn-globals": "^4.3.0",
807 | "array-equal": "^1.0.0",
808 | "cssom": "^0.3.4",
809 | "cssstyle": "^1.1.1",
810 | "data-urls": "^1.0.1",
811 | "domexception": "^1.0.1",
812 | "escodegen": "^1.11.0",
813 | "html-encoding-sniffer": "^1.0.2",
814 | "nwsapi": "^2.0.9",
815 | "parse5": "5.1.0",
816 | "pn": "^1.1.0",
817 | "request": "^2.88.0",
818 | "request-promise-native": "^1.0.5",
819 | "saxes": "^3.1.3",
820 | "symbol-tree": "^3.2.2",
821 | "tough-cookie": "^2.4.3",
822 | "w3c-hr-time": "^1.0.1",
823 | "webidl-conversions": "^4.0.2",
824 | "whatwg-encoding": "^1.0.5",
825 | "whatwg-mimetype": "^2.2.0",
826 | "whatwg-url": "^7.0.0",
827 | "ws": "^6.1.0",
828 | "xml-name-validator": "^3.0.0"
829 | }
830 | },
831 | "json-parse-better-errors": {
832 | "version": "1.0.2",
833 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
834 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
835 | },
836 | "json-schema": {
837 | "version": "0.2.3",
838 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
839 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
840 | },
841 | "json-schema-traverse": {
842 | "version": "0.3.1",
843 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
844 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
845 | },
846 | "json-stringify-safe": {
847 | "version": "5.0.1",
848 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
849 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
850 | },
851 | "jsprim": {
852 | "version": "1.4.1",
853 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
854 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
855 | "requires": {
856 | "assert-plus": "1.0.0",
857 | "extsprintf": "1.3.0",
858 | "json-schema": "0.2.3",
859 | "verror": "1.10.0"
860 | }
861 | },
862 | "kind-of": {
863 | "version": "3.2.2",
864 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
865 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
866 | "requires": {
867 | "is-buffer": "^1.1.5"
868 | }
869 | },
870 | "lazy-cache": {
871 | "version": "1.0.4",
872 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
873 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
874 | },
875 | "levn": {
876 | "version": "0.3.0",
877 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
878 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
879 | "requires": {
880 | "prelude-ls": "~1.1.2",
881 | "type-check": "~0.3.2"
882 | }
883 | },
884 | "lodash": {
885 | "version": "4.17.11",
886 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
887 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
888 | },
889 | "lodash.sortby": {
890 | "version": "4.7.0",
891 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
892 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
893 | },
894 | "mdn-data": {
895 | "version": "1.1.4",
896 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz",
897 | "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA=="
898 | },
899 | "merge-deep": {
900 | "version": "3.0.2",
901 | "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz",
902 | "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==",
903 | "requires": {
904 | "arr-union": "^3.1.0",
905 | "clone-deep": "^0.2.4",
906 | "kind-of": "^3.0.2"
907 | }
908 | },
909 | "mime-db": {
910 | "version": "1.36.0",
911 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
912 | "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw=="
913 | },
914 | "mime-types": {
915 | "version": "2.1.20",
916 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
917 | "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
918 | "requires": {
919 | "mime-db": "~1.36.0"
920 | }
921 | },
922 | "minimatch": {
923 | "version": "3.0.4",
924 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
925 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
926 | "requires": {
927 | "brace-expansion": "^1.1.7"
928 | }
929 | },
930 | "minimist": {
931 | "version": "0.0.8",
932 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
933 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
934 | },
935 | "mixin-object": {
936 | "version": "2.0.1",
937 | "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
938 | "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
939 | "requires": {
940 | "for-in": "^0.1.3",
941 | "is-extendable": "^0.1.1"
942 | },
943 | "dependencies": {
944 | "for-in": {
945 | "version": "0.1.8",
946 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
947 | "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE="
948 | }
949 | }
950 | },
951 | "mkdirp": {
952 | "version": "0.5.1",
953 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
954 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
955 | "requires": {
956 | "minimist": "0.0.8"
957 | }
958 | },
959 | "nth-check": {
960 | "version": "1.0.1",
961 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
962 | "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
963 | "requires": {
964 | "boolbase": "~1.0.0"
965 | }
966 | },
967 | "nwsapi": {
968 | "version": "2.0.9",
969 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz",
970 | "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ=="
971 | },
972 | "oauth-sign": {
973 | "version": "0.9.0",
974 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
975 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
976 | },
977 | "object-keys": {
978 | "version": "1.0.12",
979 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
980 | "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag=="
981 | },
982 | "object.getownpropertydescriptors": {
983 | "version": "2.0.3",
984 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
985 | "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
986 | "requires": {
987 | "define-properties": "^1.1.2",
988 | "es-abstract": "^1.5.1"
989 | }
990 | },
991 | "object.values": {
992 | "version": "1.0.4",
993 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz",
994 | "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=",
995 | "requires": {
996 | "define-properties": "^1.1.2",
997 | "es-abstract": "^1.6.1",
998 | "function-bind": "^1.1.0",
999 | "has": "^1.0.1"
1000 | }
1001 | },
1002 | "once": {
1003 | "version": "1.4.0",
1004 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1005 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1006 | "requires": {
1007 | "wrappy": "1"
1008 | }
1009 | },
1010 | "optionator": {
1011 | "version": "0.8.2",
1012 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
1013 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
1014 | "requires": {
1015 | "deep-is": "~0.1.3",
1016 | "fast-levenshtein": "~2.0.4",
1017 | "levn": "~0.3.0",
1018 | "prelude-ls": "~1.1.2",
1019 | "type-check": "~0.3.2",
1020 | "wordwrap": "~1.0.0"
1021 | }
1022 | },
1023 | "output-file-sync": {
1024 | "version": "2.0.1",
1025 | "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz",
1026 | "integrity": "sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==",
1027 | "requires": {
1028 | "graceful-fs": "^4.1.11",
1029 | "is-plain-obj": "^1.1.0",
1030 | "mkdirp": "^0.5.1"
1031 | }
1032 | },
1033 | "parse-json": {
1034 | "version": "4.0.0",
1035 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
1036 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
1037 | "requires": {
1038 | "error-ex": "^1.3.1",
1039 | "json-parse-better-errors": "^1.0.1"
1040 | }
1041 | },
1042 | "parse5": {
1043 | "version": "5.1.0",
1044 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
1045 | "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ=="
1046 | },
1047 | "path-is-absolute": {
1048 | "version": "1.0.1",
1049 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1050 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1051 | },
1052 | "performance-now": {
1053 | "version": "2.1.0",
1054 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1055 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
1056 | },
1057 | "pn": {
1058 | "version": "1.1.0",
1059 | "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
1060 | "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
1061 | },
1062 | "prelude-ls": {
1063 | "version": "1.1.2",
1064 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
1065 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
1066 | },
1067 | "prettier": {
1068 | "version": "1.14.3",
1069 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.14.3.tgz",
1070 | "integrity": "sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg=="
1071 | },
1072 | "psl": {
1073 | "version": "1.1.29",
1074 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
1075 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ=="
1076 | },
1077 | "punycode": {
1078 | "version": "2.1.1",
1079 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1080 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
1081 | },
1082 | "q": {
1083 | "version": "1.5.1",
1084 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
1085 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
1086 | },
1087 | "qs": {
1088 | "version": "6.5.2",
1089 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
1090 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
1091 | },
1092 | "recursive-readdir": {
1093 | "version": "2.2.2",
1094 | "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
1095 | "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
1096 | "requires": {
1097 | "minimatch": "3.0.4"
1098 | }
1099 | },
1100 | "request": {
1101 | "version": "2.88.0",
1102 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
1103 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
1104 | "requires": {
1105 | "aws-sign2": "~0.7.0",
1106 | "aws4": "^1.8.0",
1107 | "caseless": "~0.12.0",
1108 | "combined-stream": "~1.0.6",
1109 | "extend": "~3.0.2",
1110 | "forever-agent": "~0.6.1",
1111 | "form-data": "~2.3.2",
1112 | "har-validator": "~5.1.0",
1113 | "http-signature": "~1.2.0",
1114 | "is-typedarray": "~1.0.0",
1115 | "isstream": "~0.1.2",
1116 | "json-stringify-safe": "~5.0.1",
1117 | "mime-types": "~2.1.19",
1118 | "oauth-sign": "~0.9.0",
1119 | "performance-now": "^2.1.0",
1120 | "qs": "~6.5.2",
1121 | "safe-buffer": "^5.1.2",
1122 | "tough-cookie": "~2.4.3",
1123 | "tunnel-agent": "^0.6.0",
1124 | "uuid": "^3.3.2"
1125 | }
1126 | },
1127 | "request-promise-core": {
1128 | "version": "1.1.1",
1129 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
1130 | "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
1131 | "requires": {
1132 | "lodash": "^4.13.1"
1133 | }
1134 | },
1135 | "request-promise-native": {
1136 | "version": "1.0.5",
1137 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz",
1138 | "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=",
1139 | "requires": {
1140 | "request-promise-core": "1.1.1",
1141 | "stealthy-require": "^1.1.0",
1142 | "tough-cookie": ">=2.3.3"
1143 | }
1144 | },
1145 | "safe-buffer": {
1146 | "version": "5.1.2",
1147 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1148 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1149 | },
1150 | "safer-buffer": {
1151 | "version": "2.1.2",
1152 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1153 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1154 | },
1155 | "sax": {
1156 | "version": "1.2.4",
1157 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
1158 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
1159 | },
1160 | "saxes": {
1161 | "version": "3.1.3",
1162 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.3.tgz",
1163 | "integrity": "sha512-Nc5DXc5A+m3rUDtkS+vHlBWKT7mCKjJPyia7f8YMW773hsXVv2wEHQZGE0zs4+5PLwz9U5Sbl/94Cnd9vHV7Bg==",
1164 | "requires": {
1165 | "xmlchars": "^1.3.1"
1166 | }
1167 | },
1168 | "shallow-clone": {
1169 | "version": "0.1.2",
1170 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
1171 | "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=",
1172 | "requires": {
1173 | "is-extendable": "^0.1.1",
1174 | "kind-of": "^2.0.1",
1175 | "lazy-cache": "^0.2.3",
1176 | "mixin-object": "^2.0.1"
1177 | },
1178 | "dependencies": {
1179 | "kind-of": {
1180 | "version": "2.0.1",
1181 | "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
1182 | "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=",
1183 | "requires": {
1184 | "is-buffer": "^1.0.2"
1185 | }
1186 | },
1187 | "lazy-cache": {
1188 | "version": "0.2.7",
1189 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
1190 | "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U="
1191 | }
1192 | }
1193 | },
1194 | "source-map": {
1195 | "version": "0.5.7",
1196 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
1197 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
1198 | },
1199 | "sprintf-js": {
1200 | "version": "1.0.3",
1201 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1202 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
1203 | },
1204 | "sshpk": {
1205 | "version": "1.15.1",
1206 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz",
1207 | "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==",
1208 | "requires": {
1209 | "asn1": "~0.2.3",
1210 | "assert-plus": "^1.0.0",
1211 | "bcrypt-pbkdf": "^1.0.0",
1212 | "dashdash": "^1.12.0",
1213 | "ecc-jsbn": "~0.1.1",
1214 | "getpass": "^0.1.1",
1215 | "jsbn": "~0.1.0",
1216 | "safer-buffer": "^2.0.2",
1217 | "tweetnacl": "~0.14.0"
1218 | }
1219 | },
1220 | "stable": {
1221 | "version": "0.1.8",
1222 | "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
1223 | "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
1224 | },
1225 | "stealthy-require": {
1226 | "version": "1.1.1",
1227 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
1228 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
1229 | },
1230 | "supports-color": {
1231 | "version": "5.5.0",
1232 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1233 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1234 | "requires": {
1235 | "has-flag": "^3.0.0"
1236 | }
1237 | },
1238 | "svgo": {
1239 | "version": "1.1.1",
1240 | "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.1.1.tgz",
1241 | "integrity": "sha512-GBkJbnTuFpM4jFbiERHDWhZc/S/kpHToqmZag3aEBjPYK44JAN2QBjvrGIxLOoCyMZjuFQIfTO2eJd8uwLY/9g==",
1242 | "requires": {
1243 | "coa": "~2.0.1",
1244 | "colors": "~1.1.2",
1245 | "css-select": "^2.0.0",
1246 | "css-select-base-adapter": "~0.1.0",
1247 | "css-tree": "1.0.0-alpha.28",
1248 | "css-url-regex": "^1.1.0",
1249 | "csso": "^3.5.0",
1250 | "js-yaml": "^3.12.0",
1251 | "mkdirp": "~0.5.1",
1252 | "object.values": "^1.0.4",
1253 | "sax": "~1.2.4",
1254 | "stable": "~0.1.6",
1255 | "unquote": "~1.1.1",
1256 | "util.promisify": "~1.0.0"
1257 | }
1258 | },
1259 | "symbol-tree": {
1260 | "version": "3.2.2",
1261 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
1262 | "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
1263 | },
1264 | "tough-cookie": {
1265 | "version": "2.4.3",
1266 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
1267 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
1268 | "requires": {
1269 | "psl": "^1.1.24",
1270 | "punycode": "^1.4.1"
1271 | },
1272 | "dependencies": {
1273 | "punycode": {
1274 | "version": "1.4.1",
1275 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1276 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
1277 | }
1278 | }
1279 | },
1280 | "tr46": {
1281 | "version": "1.0.1",
1282 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
1283 | "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
1284 | "requires": {
1285 | "punycode": "^2.1.0"
1286 | }
1287 | },
1288 | "tunnel-agent": {
1289 | "version": "0.6.0",
1290 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1291 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1292 | "requires": {
1293 | "safe-buffer": "^5.0.1"
1294 | }
1295 | },
1296 | "tweetnacl": {
1297 | "version": "0.14.5",
1298 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1299 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
1300 | },
1301 | "type-check": {
1302 | "version": "0.3.2",
1303 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1304 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
1305 | "requires": {
1306 | "prelude-ls": "~1.1.2"
1307 | }
1308 | },
1309 | "unquote": {
1310 | "version": "1.1.1",
1311 | "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
1312 | "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ="
1313 | },
1314 | "util.promisify": {
1315 | "version": "1.0.0",
1316 | "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
1317 | "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
1318 | "requires": {
1319 | "define-properties": "^1.1.2",
1320 | "object.getownpropertydescriptors": "^2.0.3"
1321 | }
1322 | },
1323 | "uuid": {
1324 | "version": "3.3.2",
1325 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
1326 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
1327 | },
1328 | "verror": {
1329 | "version": "1.10.0",
1330 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1331 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1332 | "requires": {
1333 | "assert-plus": "^1.0.0",
1334 | "core-util-is": "1.0.2",
1335 | "extsprintf": "^1.2.0"
1336 | }
1337 | },
1338 | "w3c-hr-time": {
1339 | "version": "1.0.1",
1340 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz",
1341 | "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=",
1342 | "requires": {
1343 | "browser-process-hrtime": "^0.1.2"
1344 | }
1345 | },
1346 | "webidl-conversions": {
1347 | "version": "4.0.2",
1348 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
1349 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
1350 | },
1351 | "whatwg-encoding": {
1352 | "version": "1.0.5",
1353 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
1354 | "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
1355 | "requires": {
1356 | "iconv-lite": "0.4.24"
1357 | }
1358 | },
1359 | "whatwg-mimetype": {
1360 | "version": "2.2.0",
1361 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz",
1362 | "integrity": "sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw=="
1363 | },
1364 | "whatwg-url": {
1365 | "version": "7.0.0",
1366 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz",
1367 | "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==",
1368 | "requires": {
1369 | "lodash.sortby": "^4.7.0",
1370 | "tr46": "^1.0.1",
1371 | "webidl-conversions": "^4.0.2"
1372 | }
1373 | },
1374 | "wordwrap": {
1375 | "version": "1.0.0",
1376 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1377 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
1378 | },
1379 | "wrappy": {
1380 | "version": "1.0.2",
1381 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1382 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1383 | },
1384 | "ws": {
1385 | "version": "6.1.0",
1386 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.0.tgz",
1387 | "integrity": "sha512-H3dGVdGvW2H8bnYpIDc3u3LH8Wue3Qh+Zto6aXXFzvESkTVT6rAfKR6tR/+coaUvxs8yHtmNV0uioBF62ZGSTg==",
1388 | "requires": {
1389 | "async-limiter": "~1.0.0"
1390 | }
1391 | },
1392 | "xml-name-validator": {
1393 | "version": "3.0.0",
1394 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
1395 | "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
1396 | },
1397 | "xmlchars": {
1398 | "version": "1.3.1",
1399 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz",
1400 | "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw=="
1401 | }
1402 | }
1403 | }
1404 |
--------------------------------------------------------------------------------
/assets/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "sketch-svg-to-react-component-in-typescript-assets",
3 | "dependencies": {
4 | "@svgr/cli": "^3.1.0"
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "sketch-svg-to-react-component",
3 | "version": "1.0.0",
4 | "license": "MIT",
5 | "description": "Sketch plugin to compress SVG and transform it to React (include React Native) components. By copy React component directly to you clipboard or export as files.",
6 | "repository": "https://github.com/reeli/sketch-svg-to-react-component.git",
7 | "engines": {
8 | "sketch": ">=3.0"
9 | },
10 | "skpm": {
11 | "name": "SVG to React Component",
12 | "manifest": "src/manifest.json",
13 | "main": "sketch-svg-to-react-component.sketchplugin",
14 | "assets": [
15 | "assets/**/*"
16 | ]
17 | },
18 | "scripts": {
19 | "build": "skpm-build",
20 | "watch": "skpm-build --watch",
21 | "start": "skpm-build --watch --run",
22 | "postinstall": "cd assets && npm i && cd .. && npm run build && skpm-link"
23 | },
24 | "devDependencies": {
25 | "@skpm/builder": "^0.5.2"
26 | },
27 | "author": "reeli ",
28 | "dependencies": {
29 | "@skpm/fs": "^0.2.0",
30 | "@skpm/os": "0.1.1",
31 | "@skpm/path": "^0.1.1",
32 | "@skpm/child_process": "^0.2.3",
33 | "sketch-utils": "^0.1.2"
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/plugin-view.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reeli/sketch-svg-to-react-component/f03be86f7230f988226f98e04a8995e5d8509cca/plugin-view.png
--------------------------------------------------------------------------------
/src/copy-svg-as-react-component.js:
--------------------------------------------------------------------------------
1 | import {
2 | copyStrToClipboard,
3 | exportSelectedLayersAsSvg,
4 | getSvgrPathByContext,
5 | transformSvgToReactComponent,
6 | showMessage
7 | } from "./helpers";
8 | import {MESSAGES} from "./messages";
9 |
10 | export default function (context) {
11 | try {
12 | // export selected layers as svg
13 | const targetDesc = exportSelectedLayersAsSvg();
14 | showMessage(MESSAGES.TRANSFORMING);
15 | const result = transformSvgToReactComponent(targetDesc, getSvgrPathByContext(context));
16 |
17 | // copy result to clipboard
18 | copyStrToClipboard(result);
19 | result
20 | ? showMessage(MESSAGES.COPY_TO_CLIPBOARD_SUCCESS)
21 | : showMessage(MESSAGES.COPY_TO_CLIPBOARD_FAILED);
22 | } catch (e) {
23 | showMessage(MESSAGES.GENERAL_ERROR);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/copy-svg-as-rn-component.js:
--------------------------------------------------------------------------------
1 | import {
2 | copyStrToClipboard,
3 | exportSelectedLayersAsSvg,
4 | getSvgrPathByContext,
5 | transformSvgToRNComponent,
6 | showMessage
7 | } from "./helpers";
8 | import {MESSAGES} from "./messages";
9 |
10 | export default function (context) {
11 | try {
12 | // export selected layers as svg
13 | const targetDesc = exportSelectedLayersAsSvg();
14 | showMessage(MESSAGES.TRANSFORMING);
15 | const result = transformSvgToRNComponent(targetDesc, getSvgrPathByContext(context));
16 |
17 | // copy result to clipboard
18 | copyStrToClipboard(result);
19 | result
20 | ? showMessage(MESSAGES.COPY_TO_CLIPBOARD_SUCCESS)
21 | : showMessage(MESSAGES.COPY_TO_CLIPBOARD_FAILED);
22 | } catch (e) {
23 | showMessage(MESSAGES.GENERAL_ERROR);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/export-svg-with-react-component.js:
--------------------------------------------------------------------------------
1 | import {
2 | getExportedSvgPathsByContext,
3 | getSvgrPathByContext,
4 | showMessage,
5 | transformSvgsToReactComponent
6 | } from "./helpers";
7 | import {MESSAGES} from "./messages";
8 | import path from "@skpm/path";
9 |
10 | export function onExportSlices(context) {
11 | const svgPaths = getExportedSvgPathsByContext(context);
12 |
13 | if (svgPaths.length === 0) {
14 | return showMessage(MESSAGES.NO_SVG_EXPORTED);
15 | }
16 |
17 | const dirname = path.dirname(svgPaths[0]);
18 | showMessage(MESSAGES.TRANSFORMING);
19 |
20 | const result = transformSvgsToReactComponent(svgPaths, getSvgrPathByContext(context), dirname);
21 | result
22 | ? showMessage(MESSAGES.EXPORT_SUCCESS)
23 | : showMessage(MESSAGES.EXPORT_FAILED);
24 | }
25 |
--------------------------------------------------------------------------------
/src/helpers.js:
--------------------------------------------------------------------------------
1 | import sketch, {Document, Group} from "sketch/dom";
2 | import UI from 'sketch/ui';
3 | import {MESSAGES} from "./messages";
4 | import os from "@skpm/os";
5 |
6 | const {execSync} = require('@skpm/child_process');
7 | const toArray = require('sketch-utils/to-array');
8 |
9 | export const showMessage = (str) => {
10 | UI.message(str);
11 | };
12 |
13 | export const getDuplicateSelection = (selection) => {
14 | const duplicateSelection = [];
15 | selection.forEach(layer => {
16 | const duplicatedLayer = layer.duplicate();
17 | duplicateSelection.push(duplicatedLayer);
18 | });
19 | return duplicateSelection;
20 | };
21 |
22 | export const copyStrToClipboard = (str) => {
23 | const pasteboard = NSPasteboard.generalPasteboard();
24 | pasteboard.clearContents();
25 | pasteboard.writeObjects([`${str}`]);
26 | };
27 |
28 | export const createWrapper = (svgString) => {
29 | return `
30 | import * as React from "react";
31 |
32 | export const IconSvg:React.SFC = (props) => (
33 | ${svgString}
34 | )
35 | `;
36 | };
37 |
38 | export function transformSvgToReactComponent(svgPath, svgrPath) {
39 | return execSync(`"${svgrPath}" "${svgPath}"`);
40 | }
41 |
42 | export function transformSvgToRNComponent(svgPath, svgrPath) {
43 | return execSync(`"${svgrPath}" --native "${svgPath}"`);
44 | }
45 |
46 | export function transformSvgsToReactComponent(svgPaths, svgrPath, targetDesc) {
47 | return execSync(`"${svgrPath}" --ext=tsx --out-dir="${targetDesc}"` + " " + `"${svgPaths.join('" "')}"`);
48 | }
49 |
50 | export const getSvgrPathByContext = (context) => {
51 | return context.plugin
52 | .urlForResourceNamed('node_modules/@svgr/cli/bin/svgr')
53 | .path();
54 | };
55 |
56 | export const exportSelectedLayersAsSvg = () => {
57 | const name = "sketch-selected-svg";
58 | const document = Document.getSelectedDocument();
59 | const page = document.selectedPage;
60 |
61 | // get selected layers
62 | const selection = document.selectedLayers;
63 | if (selection.isEmpty) {
64 | return showMessage(MESSAGES.NO_LAYER_SELECTED);
65 | }
66 |
67 | // duplicate selected layers and group them
68 | const duplicateSelection = getDuplicateSelection(selection);
69 | const group = new Group({
70 | name,
71 | layers: duplicateSelection,
72 | parent: page
73 | });
74 |
75 | group.adjustToFit();
76 |
77 | // export group to svg file
78 | const homeDir = os.homedir();
79 | const targetPath = "/Documents/SketchExports";
80 | const targetDesc = `${homeDir}${targetPath}/${name}.svg`;
81 | sketch.export(group, {
82 | formats: "svg",
83 | output: `~/Documents/SketchExports`,
84 | });
85 |
86 | // remove the group after we exported it to svg, otherwise it still shows in the sketch file
87 | group.remove();
88 | return targetDesc;
89 | };
90 |
91 | export const getExportedSvgPathsByContext = (context) => {
92 | const exportRequests = toArray(context.actionContext.exports);
93 |
94 | return exportRequests
95 | .filter(currentExport => {
96 | // can not use "===" here, case the type of "currentExport.request.format()" is object
97 | return currentExport.request.format() == "svg";
98 | })
99 | .map(currentExport => {
100 | return currentExport.path;
101 | });
102 | };
--------------------------------------------------------------------------------
/src/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "compatibleVersion": 3,
3 | "bundleVersion": 1,
4 | "icon": "icon.png",
5 | "commands": [
6 | {
7 | "name": "Copy React Component",
8 | "identifier": "opy-svg-as-react-component",
9 | "script": "./copy-svg-as-react-component.js",
10 | "shortcut": "cmd control r"
11 | },
12 | {
13 | "name": "Copy RN Component",
14 | "identifier": "copy-svg-as-rn-component",
15 | "script": "./copy-svg-as-rn-component.js",
16 | "shortcut": "cmd control n"
17 | },
18 | {
19 | "name": "Export React Component",
20 | "identifier": "export-svg-with-react-component",
21 | "script": "./export-svg-with-react-component.js",
22 | "handlers": {
23 | "actions": {
24 | "ExportSlices": "onExportSlices"
25 | }
26 | }
27 | }
28 | ],
29 | "menu": {
30 | "title": "sketch-svg-to-react-component",
31 | "items": [
32 | "opy-svg-as-react-component",
33 | "copy-svg-as-rn-component",
34 | "export-svg-with-react-component"
35 | ]
36 | }
37 | }
--------------------------------------------------------------------------------
/src/messages.js:
--------------------------------------------------------------------------------
1 | export const MESSAGES = {
2 | NO_LAYER_SELECTED: "Please select a layer!",
3 | GENERAL_ERROR: "Something went wrong!",
4 | COPY_TO_CLIPBOARD_SUCCESS: "Copy svg to clipboard successfully!",
5 | COPY_TO_CLIPBOARD_FAILED: "Copy svg to clipboard failed!",
6 | TRANSFORMING: "Transforming...",
7 | EXPORT_SUCCESS: "Export successfully!",
8 | EXPORT_FAILED: "Export failed!",
9 | NO_SVG_EXPORTED: "No svg exported!"
10 | };
11 |
12 |
--------------------------------------------------------------------------------