├── .github └── workflows │ └── npm-publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── dist └── svelte.min.js ├── package-lock.json ├── package.json ├── rollup.config.js ├── src ├── browser.js ├── index.js └── svelte.js └── tests ├── 1-simple-component.svelte ├── 2-pngwn-example.svelte ├── 3-most-common-component.svelte ├── 4-js-testing.svelte ├── helpers ├── browser.js ├── snapshots.js ├── testing.js └── visual.js ├── snapshots ├── 1-simple-component.html ├── 2-pngwn-example.html ├── 3-most-common-component.html └── 4-js-testing.html └── test.js /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish on NPM 2 | 3 | on: 4 | push: 5 | paths: 6 | - '.github/workflows/npm-publish.yml' 7 | - 'package.json' 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-18.04 12 | steps: 13 | - uses: actions/checkout@v1 14 | - name: Setup Node 15 | uses: actions/setup-node@v1 16 | with: 17 | node-version: 12 18 | - name: Installing NPM deps 19 | run: npm install 20 | - name: Testing 21 | run: npm run test 22 | 23 | publish-npm: 24 | needs: test 25 | runs-on: ubuntu-18.04 26 | steps: 27 | - uses: actions/checkout@v1 28 | - name: Setup Node 29 | uses: actions/setup-node@v1 30 | with: 31 | node-version: 12 32 | registry-url: https://registry.npmjs.org/ 33 | - name: Installing NPM deps 34 | run: npm install 35 | - name: Building & publishing on NPM 36 | run: npm publish 37 | env: 38 | NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/index.* 2 | node_modules 3 | bundle* 4 | tests/visual 5 | tests/browser -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Alexey Schebelev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # highlightjs-svelte 2 | Svelte language definition for Highlight.js 3 | 4 | ## install 5 | ```bash 6 | npm i highlight.js highlightjs-svelte 7 | ``` 8 | 9 | ## usage 10 | 11 | ### browser 12 | 13 | ```html 14 | 15 | 16 | 19 |
Hello, {name}!
20 | ``` 21 | 22 | ### node 23 | ```javascript 24 | const hljs = require('highlight.js'); 25 | const hljs_svelte = require('highlightjs-svelte'); 26 | 27 | hljs_svelte(hljs); 28 | 29 | const highlighted = hljs.highlight('svelte', source).value; 30 | ``` 31 | 32 | -------------------------------------------------------------------------------- /dist/svelte.min.js: -------------------------------------------------------------------------------- 1 | !function(){"use strict";hljs.registerLanguage("svelte",(function(e){return{subLanguage:"xml",contains:[e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:/^(\s*)()/gm,end:/^(\s*)(<\/script>)/gm,subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,contains:[{begin:/^(\s*)(\$:)/gm,end:/(\s*)/gm,className:"keyword"}]},{begin:/^(\s*)()/gm,end:/^(\s*)(<\/style>)/gm,subLanguage:"css",excludeBegin:!0,excludeEnd:!0},{begin:/\{/gm,end:/\}/gm,subLanguage:"javascript",contains:[{begin:/[\{]/,end:/[\}]/,skip:!0},{begin:/([#:\/@])(if|else|each|await|then|catch|debug|html)/gm,className:"keyword",relevance:10}]}]}}))}(); 2 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "highlightjs-svelte", 3 | "version": "1.0.6", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.10.4", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 19 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.10.4", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 25 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.10.4", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "@rollup/plugin-commonjs": { 34 | "version": "11.1.0", 35 | "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz", 36 | "integrity": "sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA==", 37 | "dev": true, 38 | "requires": { 39 | "@rollup/pluginutils": "^3.0.8", 40 | "commondir": "^1.0.1", 41 | "estree-walker": "^1.0.1", 42 | "glob": "^7.1.2", 43 | "is-reference": "^1.1.2", 44 | "magic-string": "^0.25.2", 45 | "resolve": "^1.11.0" 46 | }, 47 | "dependencies": { 48 | "estree-walker": { 49 | "version": "1.0.1", 50 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", 51 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", 52 | "dev": true 53 | } 54 | } 55 | }, 56 | "@rollup/plugin-node-resolve": { 57 | "version": "7.1.3", 58 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", 59 | "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", 60 | "dev": true, 61 | "requires": { 62 | "@rollup/pluginutils": "^3.0.8", 63 | "@types/resolve": "0.0.8", 64 | "builtin-modules": "^3.1.0", 65 | "is-module": "^1.0.0", 66 | "resolve": "^1.14.2" 67 | }, 68 | "dependencies": { 69 | "resolve": { 70 | "version": "1.17.0", 71 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 72 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 73 | "dev": true, 74 | "requires": { 75 | "path-parse": "^1.0.6" 76 | } 77 | } 78 | } 79 | }, 80 | "@rollup/pluginutils": { 81 | "version": "3.0.10", 82 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.10.tgz", 83 | "integrity": "sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw==", 84 | "dev": true, 85 | "requires": { 86 | "@types/estree": "0.0.39", 87 | "estree-walker": "^1.0.1", 88 | "picomatch": "^2.2.2" 89 | }, 90 | "dependencies": { 91 | "@types/estree": { 92 | "version": "0.0.39", 93 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 94 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 95 | "dev": true 96 | }, 97 | "estree-walker": { 98 | "version": "1.0.1", 99 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", 100 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", 101 | "dev": true 102 | } 103 | } 104 | }, 105 | "@types/estree": { 106 | "version": "0.0.40", 107 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.40.tgz", 108 | "integrity": "sha512-p3KZgMto/JyxosKGmnLDJ/dG5wf+qTRMUjHJcspC2oQKa4jP7mz+tv0ND56lLBu3ojHlhzY33Ol+khLyNmilkA==", 109 | "dev": true 110 | }, 111 | "@types/node": { 112 | "version": "12.12.17", 113 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.17.tgz", 114 | "integrity": "sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA==", 115 | "dev": true 116 | }, 117 | "@types/resolve": { 118 | "version": "0.0.8", 119 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", 120 | "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", 121 | "dev": true, 122 | "requires": { 123 | "@types/node": "*" 124 | } 125 | }, 126 | "acorn": { 127 | "version": "7.1.1", 128 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", 129 | "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", 130 | "dev": true 131 | }, 132 | "ansi-regex": { 133 | "version": "2.1.1", 134 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 135 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 136 | "dev": true 137 | }, 138 | "ansi-styles": { 139 | "version": "3.2.1", 140 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 141 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 142 | "dev": true, 143 | "requires": { 144 | "color-convert": "^1.9.0" 145 | } 146 | }, 147 | "argparse": { 148 | "version": "1.0.10", 149 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 150 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 151 | "dev": true, 152 | "requires": { 153 | "sprintf-js": "~1.0.2" 154 | } 155 | }, 156 | "balanced-match": { 157 | "version": "1.0.0", 158 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 159 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 160 | "dev": true 161 | }, 162 | "brace-expansion": { 163 | "version": "1.1.11", 164 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 165 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 166 | "dev": true, 167 | "requires": { 168 | "balanced-match": "^1.0.0", 169 | "concat-map": "0.0.1" 170 | } 171 | }, 172 | "buffer-from": { 173 | "version": "1.1.1", 174 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 175 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 176 | "dev": true 177 | }, 178 | "builtin-modules": { 179 | "version": "3.1.0", 180 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", 181 | "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", 182 | "dev": true 183 | }, 184 | "chalk": { 185 | "version": "2.4.2", 186 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 187 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 188 | "dev": true, 189 | "requires": { 190 | "ansi-styles": "^3.2.1", 191 | "escape-string-regexp": "^1.0.5", 192 | "supports-color": "^5.3.0" 193 | } 194 | }, 195 | "color-convert": { 196 | "version": "1.9.3", 197 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 198 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 199 | "dev": true, 200 | "requires": { 201 | "color-name": "1.1.3" 202 | } 203 | }, 204 | "color-name": { 205 | "version": "1.1.3", 206 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 207 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 208 | "dev": true 209 | }, 210 | "commander": { 211 | "version": "2.20.3", 212 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 213 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 214 | "dev": true 215 | }, 216 | "commondir": { 217 | "version": "1.0.1", 218 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 219 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", 220 | "dev": true 221 | }, 222 | "concat-map": { 223 | "version": "0.0.1", 224 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 225 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 226 | "dev": true 227 | }, 228 | "concat-stream": { 229 | "version": "1.6.2", 230 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 231 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 232 | "dev": true, 233 | "requires": { 234 | "buffer-from": "^1.0.0", 235 | "inherits": "^2.0.3", 236 | "readable-stream": "^2.2.2", 237 | "typedarray": "^0.0.6" 238 | } 239 | }, 240 | "core-util-is": { 241 | "version": "1.0.2", 242 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 243 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 244 | "dev": true 245 | }, 246 | "cross-spawn": { 247 | "version": "5.1.0", 248 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 249 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 250 | "dev": true, 251 | "requires": { 252 | "lru-cache": "^4.0.1", 253 | "shebang-command": "^1.2.0", 254 | "which": "^1.2.9" 255 | } 256 | }, 257 | "deep-equal": { 258 | "version": "1.0.1", 259 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 260 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 261 | "dev": true 262 | }, 263 | "define-properties": { 264 | "version": "1.1.3", 265 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 266 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 267 | "dev": true, 268 | "requires": { 269 | "object-keys": "^1.0.12" 270 | } 271 | }, 272 | "defined": { 273 | "version": "1.0.0", 274 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 275 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 276 | "dev": true 277 | }, 278 | "diff": { 279 | "version": "4.0.1", 280 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", 281 | "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", 282 | "dev": true 283 | }, 284 | "duplexer": { 285 | "version": "0.1.1", 286 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 287 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 288 | "dev": true 289 | }, 290 | "es-abstract": { 291 | "version": "1.16.0", 292 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", 293 | "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", 294 | "dev": true, 295 | "requires": { 296 | "es-to-primitive": "^1.2.0", 297 | "function-bind": "^1.1.1", 298 | "has": "^1.0.3", 299 | "has-symbols": "^1.0.0", 300 | "is-callable": "^1.1.4", 301 | "is-regex": "^1.0.4", 302 | "object-inspect": "^1.6.0", 303 | "object-keys": "^1.1.1", 304 | "string.prototype.trimleft": "^2.1.0", 305 | "string.prototype.trimright": "^2.1.0" 306 | } 307 | }, 308 | "es-to-primitive": { 309 | "version": "1.2.1", 310 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 311 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 312 | "dev": true, 313 | "requires": { 314 | "is-callable": "^1.1.4", 315 | "is-date-object": "^1.0.1", 316 | "is-symbol": "^1.0.2" 317 | } 318 | }, 319 | "escape-string-regexp": { 320 | "version": "1.0.5", 321 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 322 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 323 | "dev": true 324 | }, 325 | "esprima": { 326 | "version": "4.0.1", 327 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 328 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 329 | "dev": true 330 | }, 331 | "events-to-array": { 332 | "version": "1.1.2", 333 | "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", 334 | "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", 335 | "dev": true 336 | }, 337 | "figures": { 338 | "version": "1.7.0", 339 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 340 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 341 | "dev": true, 342 | "requires": { 343 | "escape-string-regexp": "^1.0.5", 344 | "object-assign": "^4.1.0" 345 | } 346 | }, 347 | "for-each": { 348 | "version": "0.3.3", 349 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 350 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 351 | "dev": true, 352 | "requires": { 353 | "is-callable": "^1.1.3" 354 | } 355 | }, 356 | "fs-extra": { 357 | "version": "8.1.0", 358 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 359 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 360 | "dev": true, 361 | "requires": { 362 | "graceful-fs": "^4.2.0", 363 | "jsonfile": "^4.0.0", 364 | "universalify": "^0.1.0" 365 | } 366 | }, 367 | "fs.realpath": { 368 | "version": "1.0.0", 369 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 370 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 371 | "dev": true 372 | }, 373 | "function-bind": { 374 | "version": "1.1.1", 375 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 376 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 377 | "dev": true 378 | }, 379 | "glob": { 380 | "version": "7.1.6", 381 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 382 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 383 | "dev": true, 384 | "requires": { 385 | "fs.realpath": "^1.0.0", 386 | "inflight": "^1.0.4", 387 | "inherits": "2", 388 | "minimatch": "^3.0.4", 389 | "once": "^1.3.0", 390 | "path-is-absolute": "^1.0.0" 391 | } 392 | }, 393 | "graceful-fs": { 394 | "version": "4.2.3", 395 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 396 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", 397 | "dev": true 398 | }, 399 | "handlebars": { 400 | "version": "4.7.6", 401 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", 402 | "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", 403 | "dev": true, 404 | "requires": { 405 | "minimist": "^1.2.5", 406 | "neo-async": "^2.6.0", 407 | "source-map": "^0.6.1", 408 | "uglify-js": "^3.1.4", 409 | "wordwrap": "^1.0.0" 410 | } 411 | }, 412 | "has": { 413 | "version": "1.0.3", 414 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 415 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 416 | "dev": true, 417 | "requires": { 418 | "function-bind": "^1.1.1" 419 | } 420 | }, 421 | "has-ansi": { 422 | "version": "2.0.0", 423 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 424 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 425 | "dev": true, 426 | "requires": { 427 | "ansi-regex": "^2.0.0" 428 | } 429 | }, 430 | "has-flag": { 431 | "version": "3.0.0", 432 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 433 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 434 | "dev": true 435 | }, 436 | "has-symbols": { 437 | "version": "1.0.1", 438 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 439 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 440 | "dev": true 441 | }, 442 | "highlight.js": { 443 | "version": "9.17.0", 444 | "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.17.0.tgz", 445 | "integrity": "sha512-PyO7FK7z8ZC7FqBlmAxm4d+1DYaoS6+uaxt9KGkyP1AnmGRLnWmNod1yp9BFjUyHoDF00k+V57gF6X9ifY7f/A==", 446 | "dev": true, 447 | "requires": { 448 | "handlebars": "^4.5.3" 449 | } 450 | }, 451 | "inflight": { 452 | "version": "1.0.6", 453 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 454 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 455 | "dev": true, 456 | "requires": { 457 | "once": "^1.3.0", 458 | "wrappy": "1" 459 | } 460 | }, 461 | "inherits": { 462 | "version": "2.0.4", 463 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 464 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 465 | "dev": true 466 | }, 467 | "is-callable": { 468 | "version": "1.1.4", 469 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 470 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 471 | "dev": true 472 | }, 473 | "is-date-object": { 474 | "version": "1.0.1", 475 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 476 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 477 | "dev": true 478 | }, 479 | "is-finite": { 480 | "version": "1.0.2", 481 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 482 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 483 | "dev": true, 484 | "requires": { 485 | "number-is-nan": "^1.0.0" 486 | } 487 | }, 488 | "is-module": { 489 | "version": "1.0.0", 490 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 491 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", 492 | "dev": true 493 | }, 494 | "is-reference": { 495 | "version": "1.1.4", 496 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", 497 | "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", 498 | "dev": true, 499 | "requires": { 500 | "@types/estree": "0.0.39" 501 | }, 502 | "dependencies": { 503 | "@types/estree": { 504 | "version": "0.0.39", 505 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 506 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 507 | "dev": true 508 | } 509 | } 510 | }, 511 | "is-regex": { 512 | "version": "1.0.4", 513 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 514 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 515 | "dev": true, 516 | "requires": { 517 | "has": "^1.0.1" 518 | } 519 | }, 520 | "is-symbol": { 521 | "version": "1.0.3", 522 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 523 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 524 | "dev": true, 525 | "requires": { 526 | "has-symbols": "^1.0.1" 527 | } 528 | }, 529 | "isarray": { 530 | "version": "1.0.0", 531 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 532 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 533 | "dev": true 534 | }, 535 | "isexe": { 536 | "version": "2.0.0", 537 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 538 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 539 | "dev": true 540 | }, 541 | "jest-worker": { 542 | "version": "26.3.0", 543 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", 544 | "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", 545 | "dev": true, 546 | "requires": { 547 | "@types/node": "*", 548 | "merge-stream": "^2.0.0", 549 | "supports-color": "^7.0.0" 550 | }, 551 | "dependencies": { 552 | "has-flag": { 553 | "version": "4.0.0", 554 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 555 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 556 | "dev": true 557 | }, 558 | "supports-color": { 559 | "version": "7.1.0", 560 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 561 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 562 | "dev": true, 563 | "requires": { 564 | "has-flag": "^4.0.0" 565 | } 566 | } 567 | } 568 | }, 569 | "js-tokens": { 570 | "version": "4.0.0", 571 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 572 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 573 | "dev": true 574 | }, 575 | "js-yaml": { 576 | "version": "3.13.1", 577 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 578 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 579 | "dev": true, 580 | "requires": { 581 | "argparse": "^1.0.7", 582 | "esprima": "^4.0.0" 583 | } 584 | }, 585 | "jsonfile": { 586 | "version": "4.0.0", 587 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 588 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 589 | "dev": true, 590 | "requires": { 591 | "graceful-fs": "^4.1.6" 592 | } 593 | }, 594 | "lru-cache": { 595 | "version": "4.1.5", 596 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 597 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 598 | "dev": true, 599 | "requires": { 600 | "pseudomap": "^1.0.2", 601 | "yallist": "^2.1.2" 602 | } 603 | }, 604 | "magic-string": { 605 | "version": "0.25.7", 606 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 607 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 608 | "dev": true, 609 | "requires": { 610 | "sourcemap-codec": "^1.4.4" 611 | } 612 | }, 613 | "merge-stream": { 614 | "version": "2.0.0", 615 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 616 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 617 | "dev": true 618 | }, 619 | "minimatch": { 620 | "version": "3.0.4", 621 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 622 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 623 | "dev": true, 624 | "requires": { 625 | "brace-expansion": "^1.1.7" 626 | } 627 | }, 628 | "minimist": { 629 | "version": "1.2.5", 630 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 631 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 632 | "dev": true 633 | }, 634 | "neo-async": { 635 | "version": "2.6.2", 636 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 637 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 638 | "dev": true 639 | }, 640 | "number-is-nan": { 641 | "version": "1.0.1", 642 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 643 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 644 | "dev": true 645 | }, 646 | "object-assign": { 647 | "version": "4.1.1", 648 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 649 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 650 | "dev": true 651 | }, 652 | "object-inspect": { 653 | "version": "1.6.0", 654 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 655 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 656 | "dev": true 657 | }, 658 | "object-keys": { 659 | "version": "1.1.1", 660 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 661 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 662 | "dev": true 663 | }, 664 | "once": { 665 | "version": "1.4.0", 666 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 667 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 668 | "dev": true, 669 | "requires": { 670 | "wrappy": "1" 671 | } 672 | }, 673 | "os-shim": { 674 | "version": "0.1.3", 675 | "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", 676 | "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", 677 | "dev": true 678 | }, 679 | "parse-ms": { 680 | "version": "1.0.1", 681 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", 682 | "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", 683 | "dev": true 684 | }, 685 | "path-is-absolute": { 686 | "version": "1.0.1", 687 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 688 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 689 | "dev": true 690 | }, 691 | "path-parse": { 692 | "version": "1.0.6", 693 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 694 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 695 | "dev": true 696 | }, 697 | "picomatch": { 698 | "version": "2.2.2", 699 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 700 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 701 | "dev": true 702 | }, 703 | "plur": { 704 | "version": "1.0.0", 705 | "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", 706 | "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", 707 | "dev": true 708 | }, 709 | "pre-commit": { 710 | "version": "1.2.2", 711 | "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", 712 | "integrity": "sha1-287g7p3nI15X95xW186UZBpp7sY=", 713 | "dev": true, 714 | "requires": { 715 | "cross-spawn": "^5.0.1", 716 | "spawn-sync": "^1.0.15", 717 | "which": "1.2.x" 718 | } 719 | }, 720 | "pretty-ms": { 721 | "version": "2.1.0", 722 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", 723 | "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", 724 | "dev": true, 725 | "requires": { 726 | "is-finite": "^1.0.1", 727 | "parse-ms": "^1.0.0", 728 | "plur": "^1.0.0" 729 | } 730 | }, 731 | "process-nextick-args": { 732 | "version": "2.0.1", 733 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 734 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 735 | "dev": true 736 | }, 737 | "pseudomap": { 738 | "version": "1.0.2", 739 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 740 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 741 | "dev": true 742 | }, 743 | "randombytes": { 744 | "version": "2.1.0", 745 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 746 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 747 | "dev": true, 748 | "requires": { 749 | "safe-buffer": "^5.1.0" 750 | } 751 | }, 752 | "readable-stream": { 753 | "version": "2.3.6", 754 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 755 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 756 | "dev": true, 757 | "requires": { 758 | "core-util-is": "~1.0.0", 759 | "inherits": "~2.0.3", 760 | "isarray": "~1.0.0", 761 | "process-nextick-args": "~2.0.0", 762 | "safe-buffer": "~5.1.1", 763 | "string_decoder": "~1.1.1", 764 | "util-deprecate": "~1.0.1" 765 | } 766 | }, 767 | "resolve": { 768 | "version": "1.11.1", 769 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", 770 | "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", 771 | "dev": true, 772 | "requires": { 773 | "path-parse": "^1.0.6" 774 | } 775 | }, 776 | "resumer": { 777 | "version": "0.0.0", 778 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 779 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 780 | "dev": true, 781 | "requires": { 782 | "through": "~2.3.4" 783 | } 784 | }, 785 | "rollup": { 786 | "version": "1.27.11", 787 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.27.11.tgz", 788 | "integrity": "sha512-ENXdvXk8tjtkNTvIvjRzOEu+vv54va7PiDR7VwP8TD+In6J87gKzzFmQMawQixEL2y9rsPEgomUS7ZVkq47Tww==", 789 | "dev": true, 790 | "requires": { 791 | "@types/estree": "*", 792 | "@types/node": "*", 793 | "acorn": "^7.1.0" 794 | } 795 | }, 796 | "rollup-plugin-terser": { 797 | "version": "7.0.0", 798 | "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.0.tgz", 799 | "integrity": "sha512-p/N3lLiFusCjYTLfVkoaiRTOGr5AESEaljMPH12MhOtoMkmTBhIAfuadrcWy4am1U0vU4WTxO9fi0K09O4CboQ==", 800 | "dev": true, 801 | "requires": { 802 | "@babel/code-frame": "^7.10.4", 803 | "jest-worker": "^26.2.1", 804 | "serialize-javascript": "^4.0.0", 805 | "terser": "^5.0.0" 806 | } 807 | }, 808 | "safe-buffer": { 809 | "version": "5.1.2", 810 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 811 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 812 | "dev": true 813 | }, 814 | "serialize-javascript": { 815 | "version": "4.0.0", 816 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", 817 | "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", 818 | "dev": true, 819 | "requires": { 820 | "randombytes": "^2.1.0" 821 | } 822 | }, 823 | "shebang-command": { 824 | "version": "1.2.0", 825 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 826 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 827 | "dev": true, 828 | "requires": { 829 | "shebang-regex": "^1.0.0" 830 | } 831 | }, 832 | "shebang-regex": { 833 | "version": "1.0.0", 834 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 835 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 836 | "dev": true 837 | }, 838 | "source-map": { 839 | "version": "0.6.1", 840 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 841 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 842 | "dev": true 843 | }, 844 | "source-map-support": { 845 | "version": "0.5.19", 846 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 847 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 848 | "dev": true, 849 | "requires": { 850 | "buffer-from": "^1.0.0", 851 | "source-map": "^0.6.0" 852 | } 853 | }, 854 | "sourcemap-codec": { 855 | "version": "1.4.8", 856 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 857 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 858 | "dev": true 859 | }, 860 | "spawn-sync": { 861 | "version": "1.0.15", 862 | "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", 863 | "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", 864 | "dev": true, 865 | "requires": { 866 | "concat-stream": "^1.4.7", 867 | "os-shim": "^0.1.2" 868 | } 869 | }, 870 | "sprintf-js": { 871 | "version": "1.0.3", 872 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 873 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 874 | "dev": true 875 | }, 876 | "string.prototype.trim": { 877 | "version": "1.1.2", 878 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 879 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 880 | "dev": true, 881 | "requires": { 882 | "define-properties": "^1.1.2", 883 | "es-abstract": "^1.5.0", 884 | "function-bind": "^1.0.2" 885 | } 886 | }, 887 | "string.prototype.trimleft": { 888 | "version": "2.1.0", 889 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 890 | "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 891 | "dev": true, 892 | "requires": { 893 | "define-properties": "^1.1.3", 894 | "function-bind": "^1.1.1" 895 | } 896 | }, 897 | "string.prototype.trimright": { 898 | "version": "2.1.0", 899 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 900 | "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 901 | "dev": true, 902 | "requires": { 903 | "define-properties": "^1.1.3", 904 | "function-bind": "^1.1.1" 905 | } 906 | }, 907 | "string_decoder": { 908 | "version": "1.1.1", 909 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 910 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 911 | "dev": true, 912 | "requires": { 913 | "safe-buffer": "~5.1.0" 914 | } 915 | }, 916 | "strip-ansi": { 917 | "version": "3.0.1", 918 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 919 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 920 | "dev": true, 921 | "requires": { 922 | "ansi-regex": "^2.0.0" 923 | } 924 | }, 925 | "supports-color": { 926 | "version": "5.5.0", 927 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 928 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 929 | "dev": true, 930 | "requires": { 931 | "has-flag": "^3.0.0" 932 | } 933 | }, 934 | "tap-diff": { 935 | "version": "0.1.1", 936 | "resolved": "https://registry.npmjs.org/tap-diff/-/tap-diff-0.1.1.tgz", 937 | "integrity": "sha1-j78zM9hWQ/7qG/F1m5CCCwSjfd8=", 938 | "dev": true, 939 | "requires": { 940 | "chalk": "^1.1.1", 941 | "diff": "^2.2.1", 942 | "duplexer": "^0.1.1", 943 | "figures": "^1.4.0", 944 | "pretty-ms": "^2.1.0", 945 | "tap-parser": "^1.2.2", 946 | "through2": "^2.0.0" 947 | }, 948 | "dependencies": { 949 | "ansi-styles": { 950 | "version": "2.2.1", 951 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 952 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 953 | "dev": true 954 | }, 955 | "chalk": { 956 | "version": "1.1.3", 957 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 958 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 959 | "dev": true, 960 | "requires": { 961 | "ansi-styles": "^2.2.1", 962 | "escape-string-regexp": "^1.0.2", 963 | "has-ansi": "^2.0.0", 964 | "strip-ansi": "^3.0.0", 965 | "supports-color": "^2.0.0" 966 | } 967 | }, 968 | "diff": { 969 | "version": "2.2.3", 970 | "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", 971 | "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=", 972 | "dev": true 973 | }, 974 | "supports-color": { 975 | "version": "2.0.0", 976 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 977 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 978 | "dev": true 979 | } 980 | } 981 | }, 982 | "tap-parser": { 983 | "version": "1.3.2", 984 | "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-1.3.2.tgz", 985 | "integrity": "sha1-EgxQiciMPIp5PvKIhn3jIeGPjCI=", 986 | "dev": true, 987 | "requires": { 988 | "events-to-array": "^1.0.1", 989 | "inherits": "~2.0.1", 990 | "js-yaml": "^3.2.7", 991 | "readable-stream": "^2" 992 | } 993 | }, 994 | "tape": { 995 | "version": "4.11.0", 996 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.11.0.tgz", 997 | "integrity": "sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA==", 998 | "dev": true, 999 | "requires": { 1000 | "deep-equal": "~1.0.1", 1001 | "defined": "~1.0.0", 1002 | "for-each": "~0.3.3", 1003 | "function-bind": "~1.1.1", 1004 | "glob": "~7.1.4", 1005 | "has": "~1.0.3", 1006 | "inherits": "~2.0.4", 1007 | "minimist": "~1.2.0", 1008 | "object-inspect": "~1.6.0", 1009 | "resolve": "~1.11.1", 1010 | "resumer": "~0.0.0", 1011 | "string.prototype.trim": "~1.1.2", 1012 | "through": "~2.3.8" 1013 | } 1014 | }, 1015 | "terser": { 1016 | "version": "5.0.0", 1017 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.0.0.tgz", 1018 | "integrity": "sha512-olH2DwGINoSuEpSGd+BsPuAQaA3OrHnHnFL/rDB2TVNc3srUbz/rq/j2BlF4zDXI+JqAvGr86bIm1R2cJgZ3FA==", 1019 | "dev": true, 1020 | "requires": { 1021 | "commander": "^2.20.0", 1022 | "source-map": "~0.6.1", 1023 | "source-map-support": "~0.5.12" 1024 | } 1025 | }, 1026 | "through": { 1027 | "version": "2.3.8", 1028 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1029 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1030 | "dev": true 1031 | }, 1032 | "through2": { 1033 | "version": "2.0.5", 1034 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1035 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1036 | "dev": true, 1037 | "requires": { 1038 | "readable-stream": "~2.3.6", 1039 | "xtend": "~4.0.1" 1040 | } 1041 | }, 1042 | "typedarray": { 1043 | "version": "0.0.6", 1044 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1045 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1046 | "dev": true 1047 | }, 1048 | "uglify-js": { 1049 | "version": "3.10.1", 1050 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.1.tgz", 1051 | "integrity": "sha512-RjxApKkrPJB6kjJxQS3iZlf///REXWYxYJxO/MpmlQzVkDWVI3PSnCBWezMecmTU/TRkNxrl8bmsfFQCp+LO+Q==", 1052 | "dev": true, 1053 | "optional": true 1054 | }, 1055 | "universalify": { 1056 | "version": "0.1.2", 1057 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1058 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1059 | "dev": true 1060 | }, 1061 | "util-deprecate": { 1062 | "version": "1.0.2", 1063 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1064 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1065 | "dev": true 1066 | }, 1067 | "which": { 1068 | "version": "1.2.14", 1069 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", 1070 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", 1071 | "dev": true, 1072 | "requires": { 1073 | "isexe": "^2.0.0" 1074 | } 1075 | }, 1076 | "wordwrap": { 1077 | "version": "1.0.0", 1078 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1079 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1080 | "dev": true 1081 | }, 1082 | "wrappy": { 1083 | "version": "1.0.2", 1084 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1085 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1086 | "dev": true 1087 | }, 1088 | "xtend": { 1089 | "version": "4.0.2", 1090 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1091 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1092 | "dev": true 1093 | }, 1094 | "yallist": { 1095 | "version": "2.1.2", 1096 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1097 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1098 | "dev": true 1099 | } 1100 | } 1101 | } 1102 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "highlightjs-svelte", 3 | "version": "1.0.6", 4 | "description": "Svelte language definition for Highlight.js", 5 | "main": "dist/index.js", 6 | "module": "dist/index.mjs", 7 | "browser": "dist/svelte.min.js", 8 | "scripts": { 9 | "build": "rollup -c", 10 | "pretest": "npm run build", 11 | "test": "node tests/test.js | tap-diff", 12 | "test-update": "node tests/test.js update | tap-diff", 13 | "prepublishOnly": "npm run build" 14 | }, 15 | "pre-commit": [ 16 | "test" 17 | ], 18 | "devDependencies": { 19 | "@rollup/plugin-commonjs": "^11.1.0", 20 | "@rollup/plugin-node-resolve": "^7.1.3", 21 | "diff": "^4.0.1", 22 | "fs-extra": "^8.1.0", 23 | "highlight.js": "^9.17.0", 24 | "pre-commit": "^1.2.2", 25 | "rollup": "^1.27.11", 26 | "rollup-plugin-terser": "^7.0.0", 27 | "tap-diff": "^0.1.1", 28 | "tape": "^4.11.0" 29 | }, 30 | "repository": { 31 | "type": "git", 32 | "url": "git+https://github.com/AlexxNB/highlightjs-svelte.git" 33 | }, 34 | "keywords": [ 35 | "highlight.js", 36 | "svelte", 37 | "hljs" 38 | ], 39 | "author": "Alexey Schebelev", 40 | "license": "MIT", 41 | "bugs": { 42 | "url": "https://github.com/AlexxNB/highlightjs-svelte/issues" 43 | }, 44 | "homepage": "https://github.com/AlexxNB/highlightjs-svelte#readme", 45 | "dependencies": {}, 46 | "files": [ 47 | "dist" 48 | ] 49 | } 50 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import { terser } from "rollup-plugin-terser"; 2 | import commonjs from '@rollup/plugin-commonjs'; 3 | import resolve from '@rollup/plugin-node-resolve'; 4 | 5 | const pkg = require('./package.json'); 6 | 7 | export default [{ 8 | input: 'src/index.js', 9 | output: [ 10 | { file: pkg.main, format: 'cjs', exports: 'default' }, 11 | { file: pkg.module, format: 'es' } 12 | ], 13 | external: [ 14 | ...Object.keys(pkg.dependencies || {}), 15 | ...Object.keys(pkg.peerDependencies || {}), 16 | ], 17 | plugins: [terser()] 18 | }, 19 | { 20 | input: 'src/browser.js', 21 | output:{ 22 | file: pkg.browser, 23 | name: 'svelte', 24 | format: 'iife' 25 | }, 26 | external: false, 27 | plugins: [resolve(),commonjs(),terser()] 28 | } 29 | ] -------------------------------------------------------------------------------- /src/browser.js: -------------------------------------------------------------------------------- 1 | import {hljsDefineSvelte} from './svelte.js'; 2 | 3 | hljs.registerLanguage("svelte",hljsDefineSvelte); -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import {hljsDefineSvelte} from './svelte.js'; 2 | 3 | export default function(hljs) { 4 | hljs.registerLanguage("svelte", hljsDefineSvelte); 5 | }; -------------------------------------------------------------------------------- /src/svelte.js: -------------------------------------------------------------------------------- 1 | /* 2 | Language: Svelte.js 3 | Requires: xml.js, javascript.js, css.js 4 | Author: Alexey Schebelev 5 | Description: Components of Svelte Framework 6 | */ 7 | 8 | export function hljsDefineSvelte(hljs) { 9 | return { 10 | subLanguage: "xml", 11 | contains: [ 12 | hljs.COMMENT("", { 13 | relevance: 10, 14 | }), 15 | { 16 | begin: /^(\s*)()/gm, 17 | end: /^(\s*)(<\/script>)/gm, 18 | subLanguage: "javascript", 19 | excludeBegin: true, 20 | excludeEnd: true, 21 | contains:[ 22 | { 23 | begin: /^(\s*)(\$:)/gm, 24 | end: /(\s*)/gm, 25 | className: 'keyword' 26 | } 27 | ] 28 | }, 29 | { 30 | begin: /^(\s*)()/gm, 31 | end: /^(\s*)(<\/style>)/gm, 32 | subLanguage: "css", 33 | excludeBegin: true, 34 | excludeEnd: true, 35 | }, 36 | { 37 | begin: /\{/gm, 38 | end: /\}/gm, 39 | subLanguage: "javascript", 40 | contains:[ 41 | { 42 | begin: /[\{]/, 43 | end: /[\}]/, 44 | skip: true 45 | }, 46 | { 47 | begin: /([#:\/@])(if|else|each|await|then|catch|debug|html)/gm, 48 | className:'keyword', 49 | relevance: 10, 50 | } 51 | ], 52 | } 53 | ] 54 | } 55 | } -------------------------------------------------------------------------------- /tests/1-simple-component.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |

Hello, {name}!

6 | 7 | -------------------------------------------------------------------------------- /tests/2-pngwn-example.svelte: -------------------------------------------------------------------------------- 1 | {#each array.map(({a, b, c}) => ({ a: a+1, b, c})) as {a, b, c} } 2 | {name === undefined ? 'Anybody' : name} 3 | {/each} -------------------------------------------------------------------------------- /tests/3-most-common-component.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |

Hello, {name}!

8 | {#each list as item} 9 |

{ typeof item === 'str`===ing?' ? item.toUpperCase() : item}

10 | {:else} 11 |

No items...

12 | {/each} 13 | 14 | -------------------------------------------------------------------------------- /tests/4-js-testing.svelte: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/helpers/browser.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var fs = require('fs-extra'); 3 | 4 | const TESTS_DIR = path.resolve('tests'); 5 | const HTML_FILE = path.join(TESTS_DIR,'browser','index.html'); 6 | 7 | const HJS_FILE = 'https://unpkg.com/highlightjs'; 8 | const SVELTE_LANG_FILE = path.resolve(path.join('dist','svelte.min.js')); 9 | const CSS_FILE = path.resolve(path.join('node_modules','highlight.js','styles','rainbow.css')); 10 | 11 | module.exports.createBrowserTest = function(snaplist){ 12 | const body = snaplist.reduce((acc,snapshot)=>{ 13 | return acc + ` 14 |

${snapshot.name}

15 |
${snapshot.source.replace(//g,'>')}
16 |
17 | `; 18 | },''); 19 | 20 | 21 | fs.ensureFileSync(HTML_FILE); 22 | fs.writeFileSync(HTML_FILE,` 23 | 24 | 25 | 26 | Browser Test page 27 | 28 | 29 | 30 | 31 | 32 | 33 | ${body} 34 | 35 | 36 | `); 37 | 38 | console.log('Open browser test on: '+HTML_FILE); 39 | } 40 | -------------------------------------------------------------------------------- /tests/helpers/snapshots.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var fs = require('fs-extra'); 3 | 4 | const TESTS_DIR = path.resolve('tests'); 5 | const SNAPSHOTS_DIR = path.join(TESTS_DIR,'snapshots'); 6 | const TEST_EXT = '.svelte'; 7 | const SNAPSHOT_EXT = '.html'; 8 | 9 | module.exports.getSnaplist = function(handler,update=false){ 10 | 11 | if(update) fs.emptyDirSync(SNAPSHOTS_DIR); 12 | 13 | const files = fs.readdirSync(TESTS_DIR).filter(f => f.endsWith(TEST_EXT)); 14 | 15 | let snaplist = []; 16 | for(let i=0; i < files.length; i++){ 17 | const name = path.basename(files[i],TEST_EXT); 18 | const source = fs.readFileSync(path.join(TESTS_DIR,files[i]),'utf-8'); 19 | const result = handler(source); 20 | const snapshot = module.exports.getSnapshot(name,result); 21 | 22 | snaplist.push({name,source,result,snapshot}); 23 | } 24 | 25 | return snaplist; 26 | } 27 | 28 | module.exports.getSnapshot = function (name,initial){ 29 | const snapshot_file = path.join(SNAPSHOTS_DIR,name+SNAPSHOT_EXT); 30 | 31 | if(fs.existsSync(snapshot_file)) 32 | return fs.readFileSync(snapshot_file,'utf-8'); 33 | else 34 | return module.exports.updateSnapshot(name,initial); 35 | } 36 | 37 | module.exports.updateSnapshot = function (name,data){ 38 | const snapshot_file = path.join(SNAPSHOTS_DIR,name+SNAPSHOT_EXT); 39 | fs.ensureFileSync(snapshot_file); 40 | fs.writeFileSync(snapshot_file,data); 41 | return data; 42 | } -------------------------------------------------------------------------------- /tests/helpers/testing.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | 3 | module.exports.doTesting = function(snaplist){ 4 | snaplist.forEach(snapshot => { 5 | test(snapshot.name, function (t) { 6 | t.equal(snapshot.result,snapshot.snapshot); 7 | t.end(); 8 | }); 9 | }) 10 | } 11 | -------------------------------------------------------------------------------- /tests/helpers/visual.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var fs = require('fs-extra'); 3 | 4 | const TESTS_DIR = path.resolve('tests'); 5 | const HTML_FILE = path.join(TESTS_DIR,'visual','index.html'); 6 | const CSS_FILE = path.resolve(path.join('node_modules','highlight.js','styles','rainbow.css')); 7 | 8 | module.exports.createVisualTest = function(snaplist){ 9 | const body = snaplist.reduce((acc,snapshot)=>{ 10 | return acc + ` 11 |

${snapshot.name}

12 |
${snapshot.result}
13 |
14 | `; 15 | },''); 16 | 17 | const CSS = fs.readFileSync(CSS_FILE,'utf-8'); 18 | 19 | fs.ensureFileSync(HTML_FILE); 20 | fs.writeFileSync(HTML_FILE,` 21 | 22 | 23 | 24 | Visual Test page 25 | 26 | 29 | 30 | ${body} 31 | 32 | 33 | `); 34 | 35 | console.log('Open visual test on: '+HTML_FILE); 36 | } 37 | -------------------------------------------------------------------------------- /tests/snapshots/1-simple-component.html: -------------------------------------------------------------------------------- 1 | <script> 2 | export let name = 'world'; 3 | </script> 4 | 5 | <h1>Hello, {name}!</h1> 6 | 7 | <style> 8 | h1{ 9 | color:red; 10 | } 11 | </style> -------------------------------------------------------------------------------- /tests/snapshots/2-pngwn-example.html: -------------------------------------------------------------------------------- 1 | {#each array.map(({a, b, c}) => ({ a: a+1, b, c})) as {a, b, c} } 2 | {name === undefined ? 'Anybody' : name} 3 | {/each} -------------------------------------------------------------------------------- /tests/snapshots/3-most-common-component.html: -------------------------------------------------------------------------------- 1 | <script> 2 | export let list = ['item1','item2',`item${3}`,4]; 3 | export let name = 'World'; 4 | $: num = list.length; 5 | </script> 6 | 7 | <h1>Hello, {name}!</h1> 8 | {#each list as item} 9 | <p>{ typeof item === 'str`===ing?' ? item.toUpperCase() : item}</p> 10 | {:else} 11 | <p>No items...</p> 12 | {/each} 13 | 14 | <style> 15 | h1{color:red;} 16 | </style> -------------------------------------------------------------------------------- /tests/snapshots/4-js-testing.html: -------------------------------------------------------------------------------- 1 | <script> 2 | function $initHighlight(block, cls) { 3 | try { 4 | if (cls.search(/\bno\-highlight\b/) != -1) 5 | return process(block, true, 0x0F) + 6 | ` class="${cls}"`; 7 | } catch (e) { 8 | /* handle exception */ 9 | } 10 | for (var i = 0 / 2; i < classes.length; i++) { 11 | if (checkCondition(classes[i]) === undefined) 12 | console.log('undefined'); 13 | } 14 | 15 | return ( 16 | <div> 17 | <web-component>{block}</web-component> 18 | </div> 19 | ) 20 | } 21 | 22 | export $initHighlight; 23 | </script> -------------------------------------------------------------------------------- /tests/test.js: -------------------------------------------------------------------------------- 1 | const command = process.argv[2]; 2 | 3 | const {getSnaplist} = require('./helpers/snapshots'); 4 | const {createBrowserTest} = require('./helpers/browser'); 5 | const {createVisualTest} = require('./helpers/visual'); 6 | const {doTesting} = require('./helpers/testing'); 7 | 8 | const hljs = require('highlight.js'); 9 | const hljs_svelte = require('../dist/index.js'); 10 | hljs_svelte(hljs); 11 | 12 | 13 | function handleSource(source){ 14 | return hljs.highlight('svelte', source).value; 15 | } 16 | 17 | 18 | 19 | const snaplist = getSnaplist(handleSource,(command === 'update')); 20 | createBrowserTest(snaplist); 21 | createVisualTest(snaplist); 22 | doTesting(snaplist); 23 | 24 | --------------------------------------------------------------------------------