├── .gitignore ├── .prettierignore ├── .prettierrc ├── src ├── Roboto-Thin.ttf ├── types.d.ts └── index.ts ├── .vscode └── settings.json ├── tsconfig.json ├── wrangler.toml ├── package.json ├── rollup.config.js ├── LICENSE ├── README.md └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | pnpm-lock.yaml 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } 5 | -------------------------------------------------------------------------------- /src/Roboto-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ssssota/svg2png-worker/HEAD/src/Roboto-Thin.ttf -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "editor.defaultFormatter": "esbenp.prettier-vscode" 4 | } 5 | -------------------------------------------------------------------------------- /src/types.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.wasm' { 2 | const wasm: WebAssembly.Module; 3 | export default wasm; 4 | } 5 | 6 | declare module '*.ttf' { 7 | const raw: ArrayBuffer; 8 | export default raw; 9 | } 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2020", 4 | "lib": ["DOM"], 5 | "module": "esnext", 6 | "rootDir": "./src", 7 | "esModuleInterop": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "strict": true, 10 | "skipLibCheck": true, 11 | "moduleResolution": "node" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /wrangler.toml: -------------------------------------------------------------------------------- 1 | name = "svg2png-worker" 2 | type = "javascript" 3 | route = '' 4 | zone_id = '' 5 | usage_model = '' 6 | workers_dev = true 7 | compatibility_date = "2021-08-27" # required 8 | compatibility_flags = [ "formdata_parser_supports_files" ] # required 9 | 10 | [build] 11 | command = "npm run build" 12 | 13 | [build.upload] 14 | dir = "dist" 15 | format = "modules" 16 | main = "./index.mjs" 17 | 18 | [[build.upload.rules]] 19 | globs = ["**/*.wasm"] 20 | type = "CompiledWasm" 21 | 22 | [[build.upload.rules]] 23 | globs = ["**/*.ttf"] 24 | type = "Data" 25 | 26 | # read more about configuring your Worker via wrangler.toml at: 27 | # https://developers.cloudflare.com/workers/cli-wrangler/configuration 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svg2png-worker", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "rollup -c", 8 | "clean": "rimraf dist" 9 | }, 10 | "author": "", 11 | "license": "MIT", 12 | "dependencies": { 13 | "marked": "^3.0.7", 14 | "svg2png-wasm": "^1.1.0" 15 | }, 16 | "devDependencies": { 17 | "@rollup/plugin-node-resolve": "^13.0.5", 18 | "@rollup/plugin-replace": "^3.0.0", 19 | "@rollup/plugin-typescript": "^8.3.0", 20 | "@types/marked": "^3.0.1", 21 | "prettier": "^2.4.1", 22 | "rimraf": "^3.0.2", 23 | "rollup": "^2.58.0", 24 | "rollup-plugin-copy": "^3.4.0", 25 | "tslib": "^2.3.1", 26 | "typescript": "^4.4.4" 27 | }, 28 | "type": "module" 29 | } 30 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import { nodeResolve } from '@rollup/plugin-node-resolve'; 2 | import typescript from '@rollup/plugin-typescript'; 3 | import { defineConfig } from 'rollup'; 4 | import copy from 'rollup-plugin-copy'; 5 | import replace from '@rollup/plugin-replace'; 6 | import { readFileSync } from 'fs'; 7 | 8 | const config = defineConfig({ 9 | input: 'src/index.ts', 10 | output: { 11 | file: 'dist/index.mjs', 12 | format: 'esm', 13 | }, 14 | plugins: [ 15 | replace({ 16 | 'process.env.README': JSON.stringify(readFileSync('README.md', 'utf8')), 17 | }), 18 | nodeResolve(), 19 | typescript(), 20 | copy({ 21 | targets: [ 22 | { 23 | src: 'node_modules/svg2png-wasm/svg2png_wasm_bg.wasm', 24 | dest: 'dist', 25 | }, 26 | { 27 | src: 'src/Roboto-Thin.ttf', 28 | dest: 'dist', 29 | }, 30 | ], 31 | }), 32 | ], 33 | external: [/.+\.wasm$/i, /.+\.ttf$/i], 34 | }); 35 | 36 | export default config; 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Sotaro Tommykawa 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 | # svg2png-worker 2 | 3 | svg2png-wasm demo with Cloudflare Workers. 4 | 5 | Convert online svg to png. 6 | 7 | ## Usage 8 | 9 | `https://svg2png-worker.ssssota.workers.dev/[svg url]` 10 | 11 | e.g. 12 | 13 | `https://svg2png-worker.ssssota.workers.dev/https://github.com/ssssota/svg2png-wasm/raw/main/logo.svg` 14 | 15 | ![](https://svg2png-worker.ssssota.workers.dev/https://github.com/ssssota/svg2png-wasm/raw/main/logo.svg) 16 | 17 | ### options 18 | 19 | #### `svg2png-scale=N` 20 | 21 | e.g. 22 | 23 | `https://svg2png-worker.ssssota.workers.dev/https://github.com/ssssota/svg2png-wasm/raw/main/logo.svg?svg2png-scale=10` 24 | 25 | ![](https://svg2png-worker.ssssota.workers.dev/https://github.com/ssssota/svg2png-wasm/raw/main/logo.svg?svg2png-scale=10) 26 | 27 | #### `svg2png-background=COLOR` 28 | 29 | e.g. 30 | 31 | `https://svg2png-worker.ssssota.workers.dev/https://github.com/ssssota/svg2png-wasm/raw/main/logo.svg?svg2png-background=black` 32 | 33 | ![](https://svg2png-worker.ssssota.workers.dev/https://github.com/ssssota/svg2png-wasm/raw/main/logo.svg?svg2png-background=black) 34 | 35 | `https://svg2png-worker.ssssota.workers.dev/https://github.com/ssssota/svg2png-wasm/raw/main/logo.svg?svg2png-background=rgba(127,127,127,0.5)` 36 | 37 | ![]() 38 | 39 | ## License 40 | 41 | MIT 42 | 43 | This project use [resvg](https://github.com/RazrFalcon/resvg) that project is licensed under the MPLv2.0. 44 | You can see resvg source from [here](https://github.com/RazrFalcon/resvg). 45 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ConverterOptions, 3 | ConvertOptions, 4 | initialize, 5 | svg2png, 6 | } from 'svg2png-wasm'; 7 | import marked from 'marked'; 8 | import wasm from './svg2png_wasm_bg.wasm'; 9 | import roboto from './Roboto-Thin.ttf'; 10 | 11 | const getOptionsFromUrl = (url: string): ConvertOptions => { 12 | try { 13 | const { searchParams } = new URL(url); 14 | const scale = Number(searchParams.get('svg2png-scale')) || 1; 15 | const backgroundColor = searchParams.get('svg2png-background') || undefined; 16 | return { scale, backgroundColor }; 17 | } catch (e) { 18 | return {}; 19 | } 20 | }; 21 | 22 | const getSvgUrl = (source: string): string | undefined => { 23 | try { 24 | const { href, origin } = new URL(source); 25 | const svgPath = new URL( 26 | href.substring(origin.length + 1).replace(/(https?:)\/\/?/, '$1//'), 27 | ); 28 | return svgPath.toString(); 29 | } catch (e) { 30 | return undefined; 31 | } 32 | }; 33 | 34 | const fetchSvg = async (svgUrl: string): Promise => { 35 | try { 36 | const response = await fetch(svgUrl); 37 | const body = await response.text(); 38 | if (response.ok) return body; 39 | return new Response(`SVGFetchError: ${body || response.statusText}`, { 40 | status: response.status, 41 | statusText: response.statusText, 42 | }); 43 | } catch (e) { 44 | return new Response(`${e}`, { status: 500 }); 45 | } 46 | }; 47 | 48 | const handleRequest = async (req: Request): Promise => { 49 | try { 50 | const svgUrl = getSvgUrl(req.url); 51 | if (svgUrl === undefined) { 52 | return new Response(marked(process.env.README ?? ''), { 53 | headers: { 'content-type': 'text/html' }, 54 | }); 55 | } 56 | 57 | const svg = await fetchSvg(svgUrl); 58 | if (svg instanceof Response) return svg; 59 | 60 | await initialize(wasm).catch(() => {}); 61 | const options: ConverterOptions & ConvertOptions = { 62 | ...getOptionsFromUrl(req.url), 63 | fonts: await Promise.all([new Uint8Array(roboto)]), 64 | defaultFontFamily: { 65 | sansSerifFamily: 'Roboto', 66 | serifFamily: 'Roboto', 67 | cursiveFamily: 'Roboto', 68 | fantasyFamily: 'Roboto', 69 | monospaceFamily: 'Roboto', 70 | }, 71 | }; 72 | 73 | const buf = await svg2png(svg, options); 74 | return new Response(buf, { headers: { 'content-type': 'image/png' } }); 75 | } catch (e) { 76 | return new Response(`${e}`, { status: 500 }); 77 | } 78 | }; 79 | export default { fetch: handleRequest }; 80 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@rollup/plugin-node-resolve': ^13.0.5 5 | '@rollup/plugin-replace': ^3.0.0 6 | '@rollup/plugin-typescript': ^8.3.0 7 | '@types/marked': ^3.0.1 8 | marked: ^3.0.7 9 | prettier: ^2.4.1 10 | rimraf: ^3.0.2 11 | rollup: ^2.58.0 12 | rollup-plugin-copy: ^3.4.0 13 | svg2png-wasm: ^1.1.0 14 | tslib: ^2.3.1 15 | typescript: ^4.4.4 16 | 17 | dependencies: 18 | marked: 3.0.7 19 | svg2png-wasm: 1.1.0 20 | 21 | devDependencies: 22 | '@rollup/plugin-node-resolve': 13.0.5_rollup@2.58.0 23 | '@rollup/plugin-replace': 3.0.0_rollup@2.58.0 24 | '@rollup/plugin-typescript': 8.3.0_11969cb7979bf76fd37eb17f863ea3c2 25 | '@types/marked': 3.0.1 26 | prettier: 2.4.1 27 | rimraf: 3.0.2 28 | rollup: 2.58.0 29 | rollup-plugin-copy: 3.4.0 30 | tslib: 2.3.1 31 | typescript: 4.4.4 32 | 33 | packages: 34 | 35 | /@nodelib/fs.scandir/2.1.5: 36 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 37 | engines: {node: '>= 8'} 38 | dependencies: 39 | '@nodelib/fs.stat': 2.0.5 40 | run-parallel: 1.2.0 41 | dev: true 42 | 43 | /@nodelib/fs.stat/2.0.5: 44 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 45 | engines: {node: '>= 8'} 46 | dev: true 47 | 48 | /@nodelib/fs.walk/1.2.8: 49 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 50 | engines: {node: '>= 8'} 51 | dependencies: 52 | '@nodelib/fs.scandir': 2.1.5 53 | fastq: 1.13.0 54 | dev: true 55 | 56 | /@rollup/plugin-node-resolve/13.0.5_rollup@2.58.0: 57 | resolution: {integrity: sha512-mVaw6uxtvuGx/XCI4qBQXsDZJUfyx5vp39iE0J/7Hd6wDhEbjHr6aES7Nr9yWbuE0BY+oKp6N7Bq6jX5NCGNmQ==} 58 | engines: {node: '>= 10.0.0'} 59 | peerDependencies: 60 | rollup: ^2.42.0 61 | dependencies: 62 | '@rollup/pluginutils': 3.1.0_rollup@2.58.0 63 | '@types/resolve': 1.17.1 64 | builtin-modules: 3.2.0 65 | deepmerge: 4.2.2 66 | is-module: 1.0.0 67 | resolve: 1.20.0 68 | rollup: 2.58.0 69 | dev: true 70 | 71 | /@rollup/plugin-replace/3.0.0_rollup@2.58.0: 72 | resolution: {integrity: sha512-3c7JCbMuYXM4PbPWT4+m/4Y6U60SgsnDT/cCyAyUKwFHg7pTSfsSQzIpETha3a3ig6OdOKzZz87D9ZXIK3qsDg==} 73 | peerDependencies: 74 | rollup: ^1.20.0 || ^2.0.0 75 | dependencies: 76 | '@rollup/pluginutils': 3.1.0_rollup@2.58.0 77 | magic-string: 0.25.7 78 | rollup: 2.58.0 79 | dev: true 80 | 81 | /@rollup/plugin-typescript/8.3.0_11969cb7979bf76fd37eb17f863ea3c2: 82 | resolution: {integrity: sha512-I5FpSvLbtAdwJ+naznv+B4sjXZUcIvLLceYpITAn7wAP8W0wqc5noLdGIp9HGVntNhRWXctwPYrSSFQxtl0FPA==} 83 | engines: {node: '>=8.0.0'} 84 | peerDependencies: 85 | rollup: ^2.14.0 86 | tslib: '*' 87 | typescript: '>=3.7.0' 88 | dependencies: 89 | '@rollup/pluginutils': 3.1.0_rollup@2.58.0 90 | resolve: 1.20.0 91 | rollup: 2.58.0 92 | tslib: 2.3.1 93 | typescript: 4.4.4 94 | dev: true 95 | 96 | /@rollup/pluginutils/3.1.0_rollup@2.58.0: 97 | resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} 98 | engines: {node: '>= 8.0.0'} 99 | peerDependencies: 100 | rollup: ^1.20.0||^2.0.0 101 | dependencies: 102 | '@types/estree': 0.0.39 103 | estree-walker: 1.0.1 104 | picomatch: 2.3.0 105 | rollup: 2.58.0 106 | dev: true 107 | 108 | /@types/estree/0.0.39: 109 | resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} 110 | dev: true 111 | 112 | /@types/fs-extra/8.1.2: 113 | resolution: {integrity: sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==} 114 | dependencies: 115 | '@types/node': 16.11.1 116 | dev: true 117 | 118 | /@types/glob/7.1.4: 119 | resolution: {integrity: sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==} 120 | dependencies: 121 | '@types/minimatch': 3.0.5 122 | '@types/node': 16.11.1 123 | dev: true 124 | 125 | /@types/marked/3.0.1: 126 | resolution: {integrity: sha512-jry/WUAC511P2NBCeiCkfTRCN2VXobeeQa8p8gImOYsRfnuIVfeEsqOJ1pk+CzCwfMCdv3dkTQRCYaNkkFGtxw==} 127 | dev: true 128 | 129 | /@types/minimatch/3.0.5: 130 | resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} 131 | dev: true 132 | 133 | /@types/node/16.11.1: 134 | resolution: {integrity: sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA==} 135 | dev: true 136 | 137 | /@types/resolve/1.17.1: 138 | resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} 139 | dependencies: 140 | '@types/node': 16.11.1 141 | dev: true 142 | 143 | /array-union/2.1.0: 144 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 145 | engines: {node: '>=8'} 146 | dev: true 147 | 148 | /balanced-match/1.0.2: 149 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 150 | dev: true 151 | 152 | /brace-expansion/1.1.11: 153 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 154 | dependencies: 155 | balanced-match: 1.0.2 156 | concat-map: 0.0.1 157 | dev: true 158 | 159 | /braces/3.0.2: 160 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 161 | engines: {node: '>=8'} 162 | dependencies: 163 | fill-range: 7.0.1 164 | dev: true 165 | 166 | /builtin-modules/3.2.0: 167 | resolution: {integrity: sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==} 168 | engines: {node: '>=6'} 169 | dev: true 170 | 171 | /colorette/1.4.0: 172 | resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} 173 | dev: true 174 | 175 | /concat-map/0.0.1: 176 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 177 | dev: true 178 | 179 | /deepmerge/4.2.2: 180 | resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} 181 | engines: {node: '>=0.10.0'} 182 | dev: true 183 | 184 | /dir-glob/3.0.1: 185 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 186 | engines: {node: '>=8'} 187 | dependencies: 188 | path-type: 4.0.0 189 | dev: true 190 | 191 | /estree-walker/1.0.1: 192 | resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} 193 | dev: true 194 | 195 | /fast-glob/3.2.7: 196 | resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} 197 | engines: {node: '>=8'} 198 | dependencies: 199 | '@nodelib/fs.stat': 2.0.5 200 | '@nodelib/fs.walk': 1.2.8 201 | glob-parent: 5.1.2 202 | merge2: 1.4.1 203 | micromatch: 4.0.4 204 | dev: true 205 | 206 | /fastq/1.13.0: 207 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 208 | dependencies: 209 | reusify: 1.0.4 210 | dev: true 211 | 212 | /fill-range/7.0.1: 213 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 214 | engines: {node: '>=8'} 215 | dependencies: 216 | to-regex-range: 5.0.1 217 | dev: true 218 | 219 | /fs-extra/8.1.0: 220 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 221 | engines: {node: '>=6 <7 || >=8'} 222 | dependencies: 223 | graceful-fs: 4.2.8 224 | jsonfile: 4.0.0 225 | universalify: 0.1.2 226 | dev: true 227 | 228 | /fs.realpath/1.0.0: 229 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 230 | dev: true 231 | 232 | /fsevents/2.3.2: 233 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 234 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 235 | os: [darwin] 236 | requiresBuild: true 237 | dev: true 238 | optional: true 239 | 240 | /function-bind/1.1.1: 241 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 242 | dev: true 243 | 244 | /glob-parent/5.1.2: 245 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 246 | engines: {node: '>= 6'} 247 | dependencies: 248 | is-glob: 4.0.3 249 | dev: true 250 | 251 | /glob/7.2.0: 252 | resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} 253 | dependencies: 254 | fs.realpath: 1.0.0 255 | inflight: 1.0.6 256 | inherits: 2.0.4 257 | minimatch: 3.0.4 258 | once: 1.4.0 259 | path-is-absolute: 1.0.1 260 | dev: true 261 | 262 | /globby/10.0.1: 263 | resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} 264 | engines: {node: '>=8'} 265 | dependencies: 266 | '@types/glob': 7.1.4 267 | array-union: 2.1.0 268 | dir-glob: 3.0.1 269 | fast-glob: 3.2.7 270 | glob: 7.2.0 271 | ignore: 5.1.8 272 | merge2: 1.4.1 273 | slash: 3.0.0 274 | dev: true 275 | 276 | /graceful-fs/4.2.8: 277 | resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} 278 | dev: true 279 | 280 | /has/1.0.3: 281 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 282 | engines: {node: '>= 0.4.0'} 283 | dependencies: 284 | function-bind: 1.1.1 285 | dev: true 286 | 287 | /ignore/5.1.8: 288 | resolution: {integrity: sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==} 289 | engines: {node: '>= 4'} 290 | dev: true 291 | 292 | /inflight/1.0.6: 293 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 294 | dependencies: 295 | once: 1.4.0 296 | wrappy: 1.0.2 297 | dev: true 298 | 299 | /inherits/2.0.4: 300 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 301 | dev: true 302 | 303 | /is-core-module/2.8.0: 304 | resolution: {integrity: sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==} 305 | dependencies: 306 | has: 1.0.3 307 | dev: true 308 | 309 | /is-extglob/2.1.1: 310 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 311 | engines: {node: '>=0.10.0'} 312 | dev: true 313 | 314 | /is-glob/4.0.3: 315 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 316 | engines: {node: '>=0.10.0'} 317 | dependencies: 318 | is-extglob: 2.1.1 319 | dev: true 320 | 321 | /is-module/1.0.0: 322 | resolution: {integrity: sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=} 323 | dev: true 324 | 325 | /is-number/7.0.0: 326 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 327 | engines: {node: '>=0.12.0'} 328 | dev: true 329 | 330 | /is-plain-object/3.0.1: 331 | resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} 332 | engines: {node: '>=0.10.0'} 333 | dev: true 334 | 335 | /jsonfile/4.0.0: 336 | resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=} 337 | optionalDependencies: 338 | graceful-fs: 4.2.8 339 | dev: true 340 | 341 | /magic-string/0.25.7: 342 | resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} 343 | dependencies: 344 | sourcemap-codec: 1.4.8 345 | dev: true 346 | 347 | /marked/3.0.7: 348 | resolution: {integrity: sha512-ctKqbnLuNbsHbI26cfMyOlKgXGfl1orOv1AvWWDX7AkgfMOwCWvmuYc+mVLeWhQ9W6hdWVBynOs96VkcscKo0Q==} 349 | engines: {node: '>= 12'} 350 | hasBin: true 351 | dev: false 352 | 353 | /merge2/1.4.1: 354 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 355 | engines: {node: '>= 8'} 356 | dev: true 357 | 358 | /micromatch/4.0.4: 359 | resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} 360 | engines: {node: '>=8.6'} 361 | dependencies: 362 | braces: 3.0.2 363 | picomatch: 2.3.0 364 | dev: true 365 | 366 | /minimatch/3.0.4: 367 | resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} 368 | dependencies: 369 | brace-expansion: 1.1.11 370 | dev: true 371 | 372 | /once/1.4.0: 373 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 374 | dependencies: 375 | wrappy: 1.0.2 376 | dev: true 377 | 378 | /path-is-absolute/1.0.1: 379 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 380 | engines: {node: '>=0.10.0'} 381 | dev: true 382 | 383 | /path-parse/1.0.7: 384 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 385 | dev: true 386 | 387 | /path-type/4.0.0: 388 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 389 | engines: {node: '>=8'} 390 | dev: true 391 | 392 | /picomatch/2.3.0: 393 | resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} 394 | engines: {node: '>=8.6'} 395 | dev: true 396 | 397 | /prettier/2.4.1: 398 | resolution: {integrity: sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==} 399 | engines: {node: '>=10.13.0'} 400 | hasBin: true 401 | dev: true 402 | 403 | /queue-microtask/1.2.3: 404 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 405 | dev: true 406 | 407 | /resolve/1.20.0: 408 | resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} 409 | dependencies: 410 | is-core-module: 2.8.0 411 | path-parse: 1.0.7 412 | dev: true 413 | 414 | /reusify/1.0.4: 415 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 416 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 417 | dev: true 418 | 419 | /rimraf/3.0.2: 420 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 421 | hasBin: true 422 | dependencies: 423 | glob: 7.2.0 424 | dev: true 425 | 426 | /rollup-plugin-copy/3.4.0: 427 | resolution: {integrity: sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==} 428 | engines: {node: '>=8.3'} 429 | dependencies: 430 | '@types/fs-extra': 8.1.2 431 | colorette: 1.4.0 432 | fs-extra: 8.1.0 433 | globby: 10.0.1 434 | is-plain-object: 3.0.1 435 | dev: true 436 | 437 | /rollup/2.58.0: 438 | resolution: {integrity: sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==} 439 | engines: {node: '>=10.0.0'} 440 | hasBin: true 441 | optionalDependencies: 442 | fsevents: 2.3.2 443 | dev: true 444 | 445 | /run-parallel/1.2.0: 446 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 447 | dependencies: 448 | queue-microtask: 1.2.3 449 | dev: true 450 | 451 | /slash/3.0.0: 452 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 453 | engines: {node: '>=8'} 454 | dev: true 455 | 456 | /sourcemap-codec/1.4.8: 457 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 458 | dev: true 459 | 460 | /svg2png-wasm/1.1.0: 461 | resolution: {integrity: sha512-KsTm5ymKnYqC0/SFPJ8yUM4gh0SZqodicKPEAEraQhtRdd4XQphtmFruVsCevQbNAPij8sOgnS8t5Tlm1Dofmw==} 462 | dev: false 463 | 464 | /to-regex-range/5.0.1: 465 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 466 | engines: {node: '>=8.0'} 467 | dependencies: 468 | is-number: 7.0.0 469 | dev: true 470 | 471 | /tslib/2.3.1: 472 | resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} 473 | dev: true 474 | 475 | /typescript/4.4.4: 476 | resolution: {integrity: sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==} 477 | engines: {node: '>=4.2.0'} 478 | hasBin: true 479 | dev: true 480 | 481 | /universalify/0.1.2: 482 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 483 | engines: {node: '>= 4.0.0'} 484 | dev: true 485 | 486 | /wrappy/1.0.2: 487 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 488 | dev: true 489 | --------------------------------------------------------------------------------