├── src ├── vite-env.d.ts ├── pin.ts ├── store.ts ├── typescript.svg ├── utils.ts ├── results.ts ├── editor.ts ├── compressors.ts ├── themeToggle.ts ├── main.ts ├── options.ts └── style.css ├── public ├── og.png ├── pin.svg └── zip.svg ├── .prettierrc ├── vite.config.ts ├── .gitignore ├── tsconfig.json ├── package.json ├── README.md ├── index.html └── pnpm-lock.yaml /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /public/og.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arrow-js/min-gzip/HEAD/public/og.png -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false, 4 | "semi": false, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import topLevelAwait from 'vite-plugin-top-level-await' 3 | 4 | export default defineConfig({ 5 | optimizeDeps: { 6 | exclude: ['brotli-wasm', 'brotli-wasm/pkg.bundler/brotli_wasm_bg.wasm'], 7 | }, 8 | plugins: [topLevelAwait()], 9 | }) 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /public/pin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ESNext", "DOM"], 7 | "moduleResolution": "Node", 8 | "strict": true, 9 | "resolveJsonModule": true, 10 | "isolatedModules": true, 11 | "esModuleInterop": true, 12 | "noEmit": true, 13 | "noUnusedLocals": true, 14 | "noUnusedParameters": true, 15 | "noImplicitReturns": true, 16 | "skipLibCheck": true 17 | }, 18 | "include": ["src"] 19 | } 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "min-gzip", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "devDependencies": { 12 | "typescript": "^4.9.3", 13 | "vite": "^4.2.0", 14 | "vite-plugin-top-level-await": "^1.3.0" 15 | }, 16 | "dependencies": { 17 | "@arrow-js/core": "^1.0.0-alpha.9", 18 | "@types/pako": "^2.0.0", 19 | "brotli-wasm": "^1.3.1", 20 | "install": "^0.13.0", 21 | "monaco-editor": "^0.36.1", 22 | "pako": "^2.1.0", 23 | "sucrase": "^3.31.0", 24 | "terser": "^5.16.8" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/pin.ts: -------------------------------------------------------------------------------- 1 | import store from './store' 2 | import { html } from '@arrow-js/core' 3 | 4 | export default function pin() { 5 | return html` 6 | 23 | ` 24 | } 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # min-gzip.com 2 | 3 | This is a simple web app that allows you to copy and paste Typescript or JavaScript and see the size of the file after it has been minified + gzipped/brotlied. Although the code needs to be valid in order to be minified, the Typescript typings are automatically striped — so you can count on the resulting calculated sizes to be accurate. 4 | 5 | This is particularly helpful when you are trying to optimize the size of your JavaScript bundle and need to understand which implementation techniques are the most size efficient when sent "over the wire". 6 | 7 | 👉 [min-gzip.com](https://min-gzip.com) 8 | 9 | ## How to use 10 | 11 | 1. Copy and paste your code into the text area. 12 | 2. Check the min/gzip size in the header. 13 | 14 | ## Things to know 15 | 16 | Gzip and Brotli gain in their compression efficiency the larger the artifact so often it is helpful to copy and paste your entire file and then make adjustments to see the impact on total size. 17 | -------------------------------------------------------------------------------- /src/store.ts: -------------------------------------------------------------------------------- 1 | import { reactive, watch } from '@arrow-js/core' 2 | 3 | const store = reactive({ 4 | code: `/** 5 | * Enter some JavaScript or TypeScript code into the editor to see how it 6 | * compresses with gzip, brotli, and minification. 7 | * 8 | * Typescript typings are automatically removed before minification allowing 9 | * for accurate compression results. 10 | */ 11 | `, 12 | gzip: 0, 13 | brotli: 0, 14 | min: 0, 15 | pin: false, 16 | pinnedResults: { 17 | gzip: 0, 18 | brotli: 0, 19 | min: 0, 20 | }, 21 | useGzip: true, 22 | useBrotli: true, 23 | useMinify: true, 24 | theme: 25 | localStorage.getItem('theme') || 26 | (window.matchMedia('(prefers-color-scheme: dark)').matches 27 | ? 'dark' 28 | : 'light'), 29 | }) 30 | 31 | watch( 32 | () => store.pin, 33 | () => { 34 | if (store.pin) { 35 | Object.assign(store.pinnedResults, { 36 | gzip: store.gzip, 37 | brotli: store.brotli, 38 | min: store.min, 39 | }) 40 | } 41 | } 42 | ) 43 | 44 | export default store 45 | -------------------------------------------------------------------------------- /public/zip.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/typescript.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import brotliPromise from 'brotli-wasm' 2 | 3 | export function formatBytes(bytes: number, decimals = 2) { 4 | if (!+bytes) return '0 b' 5 | 6 | const k = 1024 7 | const dm = decimals < 0 ? 0 : decimals 8 | const sizes = ['b', 'kb', 'mb'] 9 | 10 | const i = Math.floor(Math.log(bytes) / Math.log(k)) 11 | 12 | return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}` 13 | } 14 | 15 | export async function compressUrlCode(param: string, code: string) { 16 | if (!code) { 17 | const url = new URL(window.location.href) 18 | url.searchParams.delete(param) 19 | history.replaceState(null, '', url.toString()) 20 | return 21 | } 22 | const brotli = await brotliPromise 23 | const textEncoder = new TextEncoder() 24 | const compressed = brotli.compress(textEncoder.encode(code)) 25 | const url = new URL(window.location.href) 26 | url.searchParams.set(param, compressed.join('.')) 27 | history.replaceState(null, '', url.toString()) 28 | } 29 | 30 | export async function decompressUrlCode(param: string) { 31 | const brotli = await brotliPromise 32 | const textDecoder = new TextDecoder() 33 | const compressedString = new URLSearchParams(window.location.search).get( 34 | param 35 | ) 36 | if (!compressedString) return '' 37 | const compressed = Uint8Array.from( 38 | compressedString.split('.').map((n) => Number(n)) 39 | ) 40 | try { 41 | const decompressed = brotli.decompress(compressed) 42 | const code = textDecoder.decode(decompressed) 43 | return code 44 | } catch (error) { 45 | return '' 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | min-gzip | Quickly check how your code compresses with gzip, brotli, and 9 | minification. 10 | 11 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 36 | 37 | 38 | 43 | 44 | 45 | 46 |
47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/results.ts: -------------------------------------------------------------------------------- 1 | import store from './store' 2 | import { formatBytes } from './utils' 3 | import { html } from '@arrow-js/core' 4 | 5 | export default function () { 6 | return html` 7 | 56 | ` 57 | } 58 | -------------------------------------------------------------------------------- /src/editor.ts: -------------------------------------------------------------------------------- 1 | import { html, nextTick } from '@arrow-js/core' 2 | import store from './store' 3 | import { compressUrlCode, decompressUrlCode } from './utils' 4 | import * as monaco from 'monaco-editor' 5 | import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker' 6 | import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker' 7 | import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker' 8 | import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker' 9 | import * as editorApi from 'monaco-editor/esm/vs/editor/editor.api' 10 | // @ts-ignore 11 | self.MonacoEnvironment = { 12 | getWorker(_: any, label: string) { 13 | if (label === 'json') { 14 | return new jsonWorker() 15 | } 16 | if (label === 'html' || label === 'handlebars' || label === 'razor') { 17 | return new htmlWorker() 18 | } 19 | if (label === 'typescript' || label === 'javascript') { 20 | return new tsWorker() 21 | } 22 | return new editorWorker() 23 | }, 24 | } 25 | 26 | monaco.languages.typescript.typescriptDefaults.setEagerModelSync(true) 27 | 28 | export default async function editor() { 29 | const el = html`
` 30 | const code = await decompressUrlCode('editor') 31 | if (code) store.code = code 32 | let editorUpdateDebounce = 0 33 | 34 | nextTick(async () => { 35 | await new Promise((r) => setTimeout(r)) 36 | const editor = editorApi.editor.create(document.getElementById('editor')!, { 37 | language: 'typescript', 38 | value: store.code, 39 | automaticLayout: true, 40 | theme: store.theme === 'dark' ? 'vs-dark' : 'vs', 41 | }) 42 | editor.getModel()?.onDidChangeContent(() => { 43 | clearTimeout(editorUpdateDebounce) 44 | store.code = editor.getModel()?.getLinesContent().join('\n') ?? '' 45 | 46 | editorUpdateDebounce = setTimeout(() => { 47 | compressUrlCode('editor', store.code) 48 | }, 1000) 49 | }) 50 | 51 | store.$on('theme', () => { 52 | editor.updateOptions({ theme: store.theme === 'dark' ? 'vs-dark' : 'vs' }) 53 | }) 54 | }) 55 | 56 | return el 57 | } 58 | -------------------------------------------------------------------------------- /src/compressors.ts: -------------------------------------------------------------------------------- 1 | import store from './store' 2 | import { watch } from '@arrow-js/core' 3 | import { minify } from 'terser' 4 | import { transform } from 'sucrase' 5 | import { gzip } from 'pako' 6 | import brotliInit from 'brotli-wasm' 7 | 8 | let nonce: number = 0 9 | watch( 10 | async function compress(): Promise< 11 | [ 12 | results: { 13 | min: number 14 | gzip: number 15 | brotli: number 16 | }, 17 | nonce: number 18 | ] 19 | > { 20 | const results = { min: 0, gzip: 0, brotli: 0 } 21 | let code = store.code 22 | const localNonce = ++nonce 23 | try { 24 | code = transform(code, { transforms: ['typescript'] }).code 25 | } catch (error) { 26 | // squelch 27 | } 28 | const promises: Promise[] = [] 29 | if (store.useMinify) { 30 | promises.push( 31 | minify(code) 32 | .then((result) => { 33 | if (typeof result.code === 'string') { 34 | code = result.code 35 | results.min = code.length 36 | } 37 | }) 38 | .catch(() => { 39 | // squelch 40 | }) 41 | ) 42 | } 43 | 44 | if (store.useGzip) { 45 | function runGzip() { 46 | const compressed = gzip(code) 47 | if (compressed) { 48 | results.gzip = compressed.length 49 | } 50 | } 51 | if (promises.length === 1) { 52 | promises.push(promises[0].then(runGzip)) 53 | } else { 54 | runGzip() 55 | } 56 | } 57 | 58 | if (store.useBrotli) { 59 | promises.push( 60 | Promise.all(promises) 61 | .then(() => brotliInit) 62 | .then((brotli) => { 63 | const textEncoder = new TextEncoder() 64 | const compressed = brotli.compress(textEncoder.encode(code)) 65 | results.brotli = compressed.length 66 | }) 67 | ) 68 | } 69 | return Promise.all(promises).then(() => [results, localNonce]) 70 | }, 71 | async (willBeResults) => { 72 | const [results, localNonce] = await willBeResults 73 | if (localNonce === nonce) { 74 | Object.assign(store, results) 75 | } 76 | } 77 | ) 78 | -------------------------------------------------------------------------------- /src/themeToggle.ts: -------------------------------------------------------------------------------- 1 | import store from './store' 2 | import { html } from '@arrow-js/core' 3 | 4 | export default function () { 5 | // get theme from locolStorage or use system theme 6 | document.documentElement.setAttribute('data-theme', store.theme) 7 | 8 | store.$on('theme', () => { 9 | document.documentElement.setAttribute('data-theme', store.theme) 10 | localStorage.setItem('theme', store.theme) 11 | }) 12 | 13 | return html` 14 | 20 | ${() => { 21 | if (store.theme === 'light') { 22 | return html` 23 | 28 | 32 | 33 | ` 34 | } else { 35 | return html` 36 | 41 | 45 | 46 | ` 47 | } 48 | }} 49 | 50 | ` 51 | } 52 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import './style.css' 2 | import { html } from '@arrow-js/core' 3 | import editor from './editor' 4 | import results from './results' 5 | import themeToggle from './themeToggle' 6 | import './compressors' 7 | import pin from './pin' 8 | import options from './options' 9 | 10 | // add gitub star button after component loads 11 | setTimeout(() => { 12 | const script = document.createElement('script') 13 | script.src = 'https://buttons.github.io/buttons.js' 14 | document.head.appendChild(script) 15 | }, 100) 16 | 17 | html` 18 |
19 |

20 | 21 | 25 | 26 | min-gzip 27 |

28 | by ArrowJS 29 | 30 |
31 | Star 39 |
40 |
41 |
42 |
43 |
44 |
45 | 46 | 47 | 48 |
49 | ${options()} ${results()} ${pin()} ${themeToggle()} 50 |
51 |
52 |
${await editor()}
53 |
54 | 55 |
56 | © ${new Date().getFullYear()} | Built with 57 | ArrowJS 58 |
59 | `(document.getElementById('app')!) 60 | -------------------------------------------------------------------------------- /src/options.ts: -------------------------------------------------------------------------------- 1 | import store from './store' 2 | import { html, reactive, watch } from '@arrow-js/core' 3 | 4 | export default function options() { 5 | const data = reactive({ 6 | showOptions: false, 7 | }) 8 | 9 | const clickAway = (e: MouseEvent) => { 10 | if (e.target instanceof HTMLElement && !e.target.closest('.option-list')) { 11 | data.showOptions = false 12 | } 13 | } 14 | 15 | watch(() => { 16 | if (data.showOptions) { 17 | document.addEventListener('click', clickAway) 18 | } else { 19 | document.removeEventListener('click', clickAway) 20 | } 21 | }) 22 | 23 | const setOption = (option: string) => (e: InputEvent) => { 24 | store[option] = (e.target as HTMLInputElement).checked 25 | } 26 | 27 | return html` 28 |
29 | 55 |
    56 |
  • 57 | 64 | 65 |
  • 66 |
  • 67 | 74 | 75 |
  • 76 |
  • 77 | 84 | 85 |
  • 86 |
87 |
88 | ` 89 | } 90 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --text: #0b1b50; 3 | --link: #e19a00; 4 | --editor-bg: #fff; 5 | --border: rgba(0, 0, 0, 0.1); 6 | --bg-transparent: rgba(0, 0, 0, 0.05); 7 | --header-height: 2em; 8 | --inset: 2em; 9 | --ui-color: #0275ff; 10 | } 11 | 12 | @media (min-width: 45em) { 13 | :root { 14 | --inset: 4em; 15 | } 16 | } 17 | 18 | @media (min-width: 55em) { 19 | :root { 20 | --inset: 6em; 21 | } 22 | } 23 | 24 | html[data-theme='dark'] { 25 | --text: #e8eaee; 26 | --link: #ffb000; 27 | --editor-bg: #242426; 28 | --border: rgba(255, 255, 255, 0.1); 29 | --bg-transparent: rgba(255, 255, 255, 0.05); 30 | } 31 | 32 | html, 33 | body { 34 | font-family: sans-serif; 35 | margin: 0; 36 | padding: 0; 37 | height: 100%; 38 | background: linear-gradient(to right, #f5fafc, #e9f9ff, #d8f2fc); 39 | } 40 | 41 | html[data-theme='dark'], 42 | html[data-theme='dark'] body { 43 | background: linear-gradient(to right, #0f2027, #203a43, #2c5364); 44 | } 45 | 46 | #app { 47 | min-height: 100%; 48 | display: flex; 49 | flex-direction: column; 50 | align-items: center; 51 | } 52 | 53 | .branding { 54 | width: calc(100% - var(--inset)); 55 | color: var(--text); 56 | display: flex; 57 | align-items: flex-end; 58 | padding: 1em 0; 59 | } 60 | 61 | .branding h1 { 62 | margin: 0; 63 | display: flex; 64 | white-space: nowrap; 65 | } 66 | .branding h1 svg { 67 | width: 0.75em; 68 | margin-right: 0.25em; 69 | } 70 | .branding a { 71 | margin-left: 0.5em; 72 | font-size: 0.75em; 73 | margin-bottom: 0.33em; 74 | color: var(--link); 75 | } 76 | .branding .github-star { 77 | margin-left: auto; 78 | } 79 | 80 | header { 81 | height: var(--header-height); 82 | color: var(--text); 83 | border-bottom: rgba(0, 0, 0, 0.1) 1px solid; 84 | display: flex; 85 | align-items: center; 86 | -ms-overflow-style: none; 87 | scrollbar-width: none; 88 | } 89 | 90 | header::-webkit-scrollbar { 91 | display: none; 92 | } 93 | 94 | .header-container { 95 | display: flex; 96 | font-size: 0.875em; 97 | justify-content: flex-end; 98 | align-items: center; 99 | width: 100%; 100 | padding: 0 .5em; 101 | } 102 | 103 | @media (min-width: 30em) { 104 | .header-container { 105 | padding: 0 1em; 106 | } 107 | } 108 | 109 | main { 110 | height: calc(100% - var(--header-height)); 111 | display: flex; 112 | align-items: center; 113 | justify-content: center; 114 | border-radius: 0 0 0.75em 0.75em; 115 | overflow: hidden; 116 | } 117 | 118 | footer { 119 | padding: 1em; 120 | color: var(--text); 121 | font-size: 0.8em; 122 | opacity: 0.75; 123 | } 124 | footer:hover { 125 | opacity: 1; 126 | } 127 | footer a { 128 | color: var(--link); 129 | } 130 | 131 | .container { 132 | width: calc(100% - var(--inset)); 133 | height: calc(100vh - (6em + var(--header-height))); 134 | margin: 0 auto; 135 | background-color: var(--editor-bg); 136 | border: var(--border) 1px solid; 137 | border-radius: 0.75em; 138 | box-shadow: rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, 139 | rgba(0, 0, 0, 0.05) 0px 4px 6px -2px; 140 | } 141 | 142 | .os-controls { 143 | display: none; 144 | align-items: center; 145 | justify-content: space-between; 146 | padding: 0.5em 1em; 147 | margin-left: -1em; 148 | } 149 | 150 | @media (min-width: 51em) { 151 | .os-controls { 152 | display: flex; 153 | } 154 | } 155 | 156 | .os-controls span { 157 | width: 0.75em; 158 | height: 0.75em; 159 | margin-right: 0.5em; 160 | background: rgba(0, 0, 0, 0.1); 161 | border: rgba(0, 0, 0, 0.1) 1px solid; 162 | border-radius: 50%; 163 | } 164 | .os-controls span:first-child { 165 | background: #ff5f56; 166 | } 167 | .os-controls span:nth-child(2) { 168 | background: #ffbd2e; 169 | } 170 | .os-controls span:last-child { 171 | background: #27c93f; 172 | } 173 | 174 | .options { 175 | display: flex; 176 | } 177 | 178 | .form-element { 179 | display: flex; 180 | align-items: center; 181 | user-select: none; 182 | } 183 | 184 | .form-element label { 185 | margin-right: 0.5em; 186 | margin-left: 0.15em; 187 | font-weight: 600; 188 | } 189 | 190 | @media (min-width: 41em) { 191 | .form-element:first-child label { 192 | border-right: var(--border) 1px solid; 193 | padding-right: 0.5em; 194 | } 195 | 196 | .form-element label { 197 | margin-right: 0.5em; 198 | margin-left: 0.15em; 199 | font-weight: 400; 200 | font-size: .875em; 201 | } 202 | } 203 | 204 | @media (min-width: 55em) { 205 | .form-element label { 206 | font-weight: 600; 207 | font-size: 1em; 208 | } 209 | } 210 | 211 | .theme-toggle { 212 | display: block; 213 | margin-left: 1em; 214 | cursor: pointer; 215 | } 216 | .theme-toggle svg { 217 | width: 1.1em; 218 | height: 1.1em; 219 | fill: var(--text); 220 | margin-top: 0.33em; 221 | } 222 | 223 | .editor { 224 | width: 100%; 225 | height: 100%; 226 | } 227 | 228 | .results { 229 | display: flex; 230 | list-style-type: none; 231 | margin-top: 0; 232 | margin-bottom: 0; 233 | padding-left: .5em; 234 | margin-left: auto; 235 | } 236 | .results li { 237 | margin-left: 1em; 238 | padding-right: 0.5em; 239 | background: var(--bg-transparent); 240 | display: flex; 241 | align-items: center; 242 | border-radius: 0.5em; 243 | border: var(--border) 1px solid; 244 | font-family: monospace; 245 | letter-spacing: -0.05em; 246 | white-space: nowrap; 247 | position: relative; 248 | font-size: 10px; 249 | } 250 | 251 | .results li[data-smaller] { 252 | background-color: rgba(0, 255, 0, .1); 253 | } 254 | .results li[data-larger] { 255 | background-color: rgba(255, 0, 0, .1); 256 | } 257 | 258 | .results li:first-child { 259 | margin-left: 0; 260 | } 261 | .results li span { 262 | padding: 0.25em 0.5em; 263 | margin-right: 0.5em; 264 | font-weight: 600; 265 | font-family: sans-serif; 266 | letter-spacing: 0.035em; 267 | background: var(--bg-transparent); 268 | border-right: var(--border) 1px solid; 269 | font-size: 10px; 270 | } 271 | 272 | @media (min-width: 36em) { 273 | .results li { 274 | font-size: 12px; 275 | } 276 | .results li span { 277 | font-size: 12px; 278 | } 279 | } 280 | 281 | .results li[data-pin]::before { 282 | content: attr(data-pin); 283 | display: block; 284 | position: absolute; 285 | padding: .25em .5em; 286 | border-radius: .5em; 287 | color: white; 288 | background-color: var(--ui-color); 289 | bottom: calc(100% + .5em); 290 | box-shadow: 0 0 0 1px var(--border); 291 | right: 0; 292 | } 293 | .results li[data-pin]::after { 294 | content: ''; 295 | display: block; 296 | position: absolute; 297 | bottom: calc(100% - .3em); 298 | width: 0; 299 | height: 0; 300 | border: 0.5em solid transparent; 301 | border-top-color: var(--ui-color); 302 | right: .3em; 303 | } 304 | .button { 305 | appearance: none; 306 | border: 0; 307 | background: none; 308 | padding: 0; 309 | } 310 | .pin { 311 | width: 1.1em; 312 | display: flex; 313 | align-items: center; 314 | cursor: pointer; 315 | margin-left: 1em; 316 | color: var(--text); 317 | } 318 | .pin[data-active] { 319 | color: var(--ui-color); 320 | } 321 | 322 | .pin svg { 323 | width: 1.1em; 324 | cursor: pointer; 325 | position: relative; 326 | top: 1px; 327 | } 328 | 329 | .option-toggle { 330 | display: flex; 331 | cursor: pointer; 332 | align-items: center; 333 | color: var(--text); 334 | } 335 | 336 | .option-toggle span { 337 | margin-right: .25em; 338 | display: none; 339 | } 340 | 341 | .option-toggle .down-arrow { 342 | display: none; 343 | } 344 | 345 | @media (min-width: 30em) { 346 | .option-toggle span { 347 | display: inline; 348 | } 349 | .option-toggle .down-arrow { 350 | display: block; 351 | } 352 | .option-toggle .kebab { 353 | display: none; 354 | } 355 | } 356 | 357 | 358 | .option-toggle svg { 359 | width: 1.25em; 360 | position: relative; 361 | top: 1px; 362 | } 363 | 364 | @media (min-width: 41em) { 365 | .option-toggle { 366 | display: none; 367 | } 368 | } 369 | 370 | .options { 371 | position: relative; 372 | } 373 | 374 | .option-list { 375 | position: absolute; 376 | z-index: 10; 377 | top: calc(100% + 0.75em); 378 | left: 0; 379 | background-color: var(--editor-bg); 380 | border-radius: .25em; 381 | padding: 1em; 382 | box-shadow: 0 0 1.5em rgba(0, 0, 0, .2); 383 | margin: 0; 384 | display: none; 385 | } 386 | 387 | 388 | .option-list[data-show-options] { 389 | display: block; 390 | } 391 | 392 | .option-list li { 393 | margin-bottom: .5em; 394 | color: var(--text); 395 | } 396 | .option-list li:last-child { 397 | margin-bottom: 0; 398 | } 399 | 400 | @media (min-width: 41em) { 401 | .option-list { 402 | display: flex; 403 | background: transparent; 404 | position: static; 405 | padding: 0; 406 | box-shadow: none; 407 | } 408 | 409 | .option-list[data-show-options] { 410 | display: flex; 411 | } 412 | 413 | .option-list li { 414 | margin-right: .5em; 415 | margin-bottom: 0; 416 | } 417 | } 418 | 419 | @media (min-width: 55em) { 420 | .option-list li { 421 | margin-right: 1em; 422 | } 423 | } 424 | 425 | .option-list::before { 426 | content: ''; 427 | display: block; 428 | position: absolute; 429 | width: 0; 430 | border: .5em solid transparent; 431 | border-bottom-color: var(--editor-bg); 432 | bottom: 100%; 433 | left: 1em 434 | } -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@arrow-js/core': ^1.0.0-alpha.9 5 | '@types/pako': ^2.0.0 6 | brotli-wasm: ^1.3.1 7 | install: ^0.13.0 8 | monaco-editor: ^0.36.1 9 | pako: ^2.1.0 10 | sucrase: ^3.31.0 11 | terser: ^5.16.8 12 | typescript: ^4.9.3 13 | vite: ^4.2.0 14 | vite-plugin-top-level-await: ^1.3.0 15 | 16 | dependencies: 17 | '@arrow-js/core': 1.0.0-alpha.9 18 | '@types/pako': 2.0.0 19 | brotli-wasm: 1.3.1 20 | install: 0.13.0 21 | monaco-editor: 0.36.1 22 | pako: 2.1.0 23 | sucrase: 3.31.0 24 | terser: 5.16.8 25 | 26 | devDependencies: 27 | typescript: 4.9.5 28 | vite: 4.2.1_terser@5.16.8 29 | vite-plugin-top-level-await: 1.3.0_vite@4.2.1 30 | 31 | packages: 32 | 33 | /@arrow-js/core/1.0.0-alpha.9: 34 | resolution: {integrity: sha512-Yf8UM15AJaUn/6MUxpVjQiSVZMDksvh66TAnaPx4YhaDlcrE0Nn5jx0nMJ4k0JPTpWNmCkF9ank3faJgY6nCVw==} 35 | engines: {node: '>=14.0.0'} 36 | dev: false 37 | 38 | /@esbuild/android-arm/0.17.14: 39 | resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} 40 | engines: {node: '>=12'} 41 | cpu: [arm] 42 | os: [android] 43 | requiresBuild: true 44 | dev: true 45 | optional: true 46 | 47 | /@esbuild/android-arm64/0.17.14: 48 | resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} 49 | engines: {node: '>=12'} 50 | cpu: [arm64] 51 | os: [android] 52 | requiresBuild: true 53 | dev: true 54 | optional: true 55 | 56 | /@esbuild/android-x64/0.17.14: 57 | resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} 58 | engines: {node: '>=12'} 59 | cpu: [x64] 60 | os: [android] 61 | requiresBuild: true 62 | dev: true 63 | optional: true 64 | 65 | /@esbuild/darwin-arm64/0.17.14: 66 | resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} 67 | engines: {node: '>=12'} 68 | cpu: [arm64] 69 | os: [darwin] 70 | requiresBuild: true 71 | dev: true 72 | optional: true 73 | 74 | /@esbuild/darwin-x64/0.17.14: 75 | resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} 76 | engines: {node: '>=12'} 77 | cpu: [x64] 78 | os: [darwin] 79 | requiresBuild: true 80 | dev: true 81 | optional: true 82 | 83 | /@esbuild/freebsd-arm64/0.17.14: 84 | resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} 85 | engines: {node: '>=12'} 86 | cpu: [arm64] 87 | os: [freebsd] 88 | requiresBuild: true 89 | dev: true 90 | optional: true 91 | 92 | /@esbuild/freebsd-x64/0.17.14: 93 | resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} 94 | engines: {node: '>=12'} 95 | cpu: [x64] 96 | os: [freebsd] 97 | requiresBuild: true 98 | dev: true 99 | optional: true 100 | 101 | /@esbuild/linux-arm/0.17.14: 102 | resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} 103 | engines: {node: '>=12'} 104 | cpu: [arm] 105 | os: [linux] 106 | requiresBuild: true 107 | dev: true 108 | optional: true 109 | 110 | /@esbuild/linux-arm64/0.17.14: 111 | resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} 112 | engines: {node: '>=12'} 113 | cpu: [arm64] 114 | os: [linux] 115 | requiresBuild: true 116 | dev: true 117 | optional: true 118 | 119 | /@esbuild/linux-ia32/0.17.14: 120 | resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} 121 | engines: {node: '>=12'} 122 | cpu: [ia32] 123 | os: [linux] 124 | requiresBuild: true 125 | dev: true 126 | optional: true 127 | 128 | /@esbuild/linux-loong64/0.17.14: 129 | resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} 130 | engines: {node: '>=12'} 131 | cpu: [loong64] 132 | os: [linux] 133 | requiresBuild: true 134 | dev: true 135 | optional: true 136 | 137 | /@esbuild/linux-mips64el/0.17.14: 138 | resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} 139 | engines: {node: '>=12'} 140 | cpu: [mips64el] 141 | os: [linux] 142 | requiresBuild: true 143 | dev: true 144 | optional: true 145 | 146 | /@esbuild/linux-ppc64/0.17.14: 147 | resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} 148 | engines: {node: '>=12'} 149 | cpu: [ppc64] 150 | os: [linux] 151 | requiresBuild: true 152 | dev: true 153 | optional: true 154 | 155 | /@esbuild/linux-riscv64/0.17.14: 156 | resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} 157 | engines: {node: '>=12'} 158 | cpu: [riscv64] 159 | os: [linux] 160 | requiresBuild: true 161 | dev: true 162 | optional: true 163 | 164 | /@esbuild/linux-s390x/0.17.14: 165 | resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} 166 | engines: {node: '>=12'} 167 | cpu: [s390x] 168 | os: [linux] 169 | requiresBuild: true 170 | dev: true 171 | optional: true 172 | 173 | /@esbuild/linux-x64/0.17.14: 174 | resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==} 175 | engines: {node: '>=12'} 176 | cpu: [x64] 177 | os: [linux] 178 | requiresBuild: true 179 | dev: true 180 | optional: true 181 | 182 | /@esbuild/netbsd-x64/0.17.14: 183 | resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} 184 | engines: {node: '>=12'} 185 | cpu: [x64] 186 | os: [netbsd] 187 | requiresBuild: true 188 | dev: true 189 | optional: true 190 | 191 | /@esbuild/openbsd-x64/0.17.14: 192 | resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} 193 | engines: {node: '>=12'} 194 | cpu: [x64] 195 | os: [openbsd] 196 | requiresBuild: true 197 | dev: true 198 | optional: true 199 | 200 | /@esbuild/sunos-x64/0.17.14: 201 | resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} 202 | engines: {node: '>=12'} 203 | cpu: [x64] 204 | os: [sunos] 205 | requiresBuild: true 206 | dev: true 207 | optional: true 208 | 209 | /@esbuild/win32-arm64/0.17.14: 210 | resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} 211 | engines: {node: '>=12'} 212 | cpu: [arm64] 213 | os: [win32] 214 | requiresBuild: true 215 | dev: true 216 | optional: true 217 | 218 | /@esbuild/win32-ia32/0.17.14: 219 | resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} 220 | engines: {node: '>=12'} 221 | cpu: [ia32] 222 | os: [win32] 223 | requiresBuild: true 224 | dev: true 225 | optional: true 226 | 227 | /@esbuild/win32-x64/0.17.14: 228 | resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} 229 | engines: {node: '>=12'} 230 | cpu: [x64] 231 | os: [win32] 232 | requiresBuild: true 233 | dev: true 234 | optional: true 235 | 236 | /@jridgewell/gen-mapping/0.3.2: 237 | resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} 238 | engines: {node: '>=6.0.0'} 239 | dependencies: 240 | '@jridgewell/set-array': 1.1.2 241 | '@jridgewell/sourcemap-codec': 1.4.14 242 | '@jridgewell/trace-mapping': 0.3.17 243 | 244 | /@jridgewell/resolve-uri/3.1.0: 245 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 246 | engines: {node: '>=6.0.0'} 247 | 248 | /@jridgewell/set-array/1.1.2: 249 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 250 | engines: {node: '>=6.0.0'} 251 | 252 | /@jridgewell/source-map/0.3.2: 253 | resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} 254 | dependencies: 255 | '@jridgewell/gen-mapping': 0.3.2 256 | '@jridgewell/trace-mapping': 0.3.17 257 | 258 | /@jridgewell/sourcemap-codec/1.4.14: 259 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 260 | 261 | /@jridgewell/trace-mapping/0.3.17: 262 | resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} 263 | dependencies: 264 | '@jridgewell/resolve-uri': 3.1.0 265 | '@jridgewell/sourcemap-codec': 1.4.14 266 | 267 | /@rollup/plugin-virtual/3.0.1: 268 | resolution: {integrity: sha512-fK8O0IL5+q+GrsMLuACVNk2x21g3yaw+sG2qn16SnUd3IlBsQyvWxLMGHmCmXRMecPjGRSZ/1LmZB4rjQm68og==} 269 | engines: {node: '>=14.0.0'} 270 | peerDependencies: 271 | rollup: ^1.20.0||^2.0.0||^3.0.0 272 | peerDependenciesMeta: 273 | rollup: 274 | optional: true 275 | dev: true 276 | 277 | /@swc/core-darwin-arm64/1.3.42: 278 | resolution: {integrity: sha512-hM6RrZFyoCM9mX3cj/zM5oXwhAqjUdOCLXJx7KTQps7NIkv/Qjvobgvyf2gAb89j3ARNo9NdIoLjTjJ6oALtiA==} 279 | engines: {node: '>=10'} 280 | cpu: [arm64] 281 | os: [darwin] 282 | requiresBuild: true 283 | dev: true 284 | optional: true 285 | 286 | /@swc/core-darwin-x64/1.3.42: 287 | resolution: {integrity: sha512-bjsWtHMb6wJK1+RGlBs2USvgZ0txlMk11y0qBLKo32gLKTqzUwRw0Fmfzuf6Ue2a/w//7eqMlPFEre4LvJajGw==} 288 | engines: {node: '>=10'} 289 | cpu: [x64] 290 | os: [darwin] 291 | requiresBuild: true 292 | dev: true 293 | optional: true 294 | 295 | /@swc/core-linux-arm-gnueabihf/1.3.42: 296 | resolution: {integrity: sha512-Oe0ggMz3MyqXNfeVmY+bBTL0hFSNY3bx8dhcqsh4vXk/ZVGse94QoC4dd92LuPHmKT0x6nsUzB86x2jU9QHW5g==} 297 | engines: {node: '>=10'} 298 | cpu: [arm] 299 | os: [linux] 300 | requiresBuild: true 301 | dev: true 302 | optional: true 303 | 304 | /@swc/core-linux-arm64-gnu/1.3.42: 305 | resolution: {integrity: sha512-ZJsa8NIW1RLmmHGTJCbM7OPSbBZ9rOMrLqDtUOGrT0uoJXZnnQqolflamB5wviW0X6h3Z3/PSTNGNDCJ3u3Lqg==} 306 | engines: {node: '>=10'} 307 | cpu: [arm64] 308 | os: [linux] 309 | requiresBuild: true 310 | dev: true 311 | optional: true 312 | 313 | /@swc/core-linux-arm64-musl/1.3.42: 314 | resolution: {integrity: sha512-YpZwlFAfOp5vkm/uVUJX1O7N3yJDO1fDQRWqsOPPNyIJkI2ydlRQtgN6ZylC159Qv+TimfXnGTlNr7o3iBAqjg==} 315 | engines: {node: '>=10'} 316 | cpu: [arm64] 317 | os: [linux] 318 | requiresBuild: true 319 | dev: true 320 | optional: true 321 | 322 | /@swc/core-linux-x64-gnu/1.3.42: 323 | resolution: {integrity: sha512-0ccpKnsZbyHBzaQFdP8U9i29nvOfKitm6oJfdJzlqsY/jCqwvD8kv2CAKSK8WhJz//ExI2LqNrDI0yazx5j7+A==} 324 | engines: {node: '>=10'} 325 | cpu: [x64] 326 | os: [linux] 327 | requiresBuild: true 328 | dev: true 329 | optional: true 330 | 331 | /@swc/core-linux-x64-musl/1.3.42: 332 | resolution: {integrity: sha512-7eckRRuTZ6+3K21uyfXXgc2ZCg0mSWRRNwNT3wap2bYkKPeqTgb8pm8xYSZNEiMuDonHEat6XCCV36lFY6kOdQ==} 333 | engines: {node: '>=10'} 334 | cpu: [x64] 335 | os: [linux] 336 | requiresBuild: true 337 | dev: true 338 | optional: true 339 | 340 | /@swc/core-win32-arm64-msvc/1.3.42: 341 | resolution: {integrity: sha512-t27dJkdw0GWANdN4TV0lY/V5vTYSx5SRjyzzZolep358ueCGuN1XFf1R0JcCbd1ojosnkQg2L7A7991UjXingg==} 342 | engines: {node: '>=10'} 343 | cpu: [arm64] 344 | os: [win32] 345 | requiresBuild: true 346 | dev: true 347 | optional: true 348 | 349 | /@swc/core-win32-ia32-msvc/1.3.42: 350 | resolution: {integrity: sha512-xfpc/Zt/aMILX4IX0e3loZaFyrae37u3MJCv1gJxgqrpeLi7efIQr3AmERkTK3mxTO6R5urSliWw2W3FyZ7D3Q==} 351 | engines: {node: '>=10'} 352 | cpu: [ia32] 353 | os: [win32] 354 | requiresBuild: true 355 | dev: true 356 | optional: true 357 | 358 | /@swc/core-win32-x64-msvc/1.3.42: 359 | resolution: {integrity: sha512-ra2K4Tu++EJLPhzZ6L8hWUsk94TdK/2UKhL9dzCBhtzKUixsGCEqhtqH1zISXNvW8qaVLFIMUP37ULe80/IJaA==} 360 | engines: {node: '>=10'} 361 | cpu: [x64] 362 | os: [win32] 363 | requiresBuild: true 364 | dev: true 365 | optional: true 366 | 367 | /@swc/core/1.3.42: 368 | resolution: {integrity: sha512-nVFUd5+7tGniM2cT3LXaqnu3735Cu4az8A9gAKK+8sdpASI52SWuqfDBmjFCK9xG90MiVDVp2PTZr0BWqCIzpw==} 369 | engines: {node: '>=10'} 370 | requiresBuild: true 371 | optionalDependencies: 372 | '@swc/core-darwin-arm64': 1.3.42 373 | '@swc/core-darwin-x64': 1.3.42 374 | '@swc/core-linux-arm-gnueabihf': 1.3.42 375 | '@swc/core-linux-arm64-gnu': 1.3.42 376 | '@swc/core-linux-arm64-musl': 1.3.42 377 | '@swc/core-linux-x64-gnu': 1.3.42 378 | '@swc/core-linux-x64-musl': 1.3.42 379 | '@swc/core-win32-arm64-msvc': 1.3.42 380 | '@swc/core-win32-ia32-msvc': 1.3.42 381 | '@swc/core-win32-x64-msvc': 1.3.42 382 | dev: true 383 | 384 | /@types/pako/2.0.0: 385 | resolution: {integrity: sha512-10+iaz93qR5WYxTo+PMifD5TSxiOtdRaxBf7INGGXMQgTCu8Z/7GYWYFUOS3q/G0nE5boj1r4FEB+WSy7s5gbA==} 386 | dev: false 387 | 388 | /acorn/8.8.2: 389 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 390 | engines: {node: '>=0.4.0'} 391 | hasBin: true 392 | 393 | /any-promise/1.3.0: 394 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 395 | dev: false 396 | 397 | /balanced-match/1.0.2: 398 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 399 | dev: false 400 | 401 | /brace-expansion/1.1.11: 402 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 403 | dependencies: 404 | balanced-match: 1.0.2 405 | concat-map: 0.0.1 406 | dev: false 407 | 408 | /brotli-wasm/1.3.1: 409 | resolution: {integrity: sha512-Vp+v3QXddvy39Ycbmvd3/Y1kUvKhwtnprzeABcKWN4jmyg6W3W5MhGPCfXBMHeSQnizgpV59iWmkSRp7ykOnDQ==} 410 | dev: false 411 | 412 | /buffer-from/1.1.2: 413 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 414 | 415 | /commander/2.20.3: 416 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 417 | 418 | /commander/4.1.1: 419 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 420 | engines: {node: '>= 6'} 421 | dev: false 422 | 423 | /concat-map/0.0.1: 424 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 425 | dev: false 426 | 427 | /esbuild/0.17.14: 428 | resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} 429 | engines: {node: '>=12'} 430 | hasBin: true 431 | requiresBuild: true 432 | optionalDependencies: 433 | '@esbuild/android-arm': 0.17.14 434 | '@esbuild/android-arm64': 0.17.14 435 | '@esbuild/android-x64': 0.17.14 436 | '@esbuild/darwin-arm64': 0.17.14 437 | '@esbuild/darwin-x64': 0.17.14 438 | '@esbuild/freebsd-arm64': 0.17.14 439 | '@esbuild/freebsd-x64': 0.17.14 440 | '@esbuild/linux-arm': 0.17.14 441 | '@esbuild/linux-arm64': 0.17.14 442 | '@esbuild/linux-ia32': 0.17.14 443 | '@esbuild/linux-loong64': 0.17.14 444 | '@esbuild/linux-mips64el': 0.17.14 445 | '@esbuild/linux-ppc64': 0.17.14 446 | '@esbuild/linux-riscv64': 0.17.14 447 | '@esbuild/linux-s390x': 0.17.14 448 | '@esbuild/linux-x64': 0.17.14 449 | '@esbuild/netbsd-x64': 0.17.14 450 | '@esbuild/openbsd-x64': 0.17.14 451 | '@esbuild/sunos-x64': 0.17.14 452 | '@esbuild/win32-arm64': 0.17.14 453 | '@esbuild/win32-ia32': 0.17.14 454 | '@esbuild/win32-x64': 0.17.14 455 | dev: true 456 | 457 | /fs.realpath/1.0.0: 458 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 459 | dev: false 460 | 461 | /fsevents/2.3.2: 462 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 463 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 464 | os: [darwin] 465 | requiresBuild: true 466 | dev: true 467 | optional: true 468 | 469 | /function-bind/1.1.1: 470 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 471 | dev: true 472 | 473 | /glob/7.1.6: 474 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} 475 | dependencies: 476 | fs.realpath: 1.0.0 477 | inflight: 1.0.6 478 | inherits: 2.0.4 479 | minimatch: 3.1.2 480 | once: 1.4.0 481 | path-is-absolute: 1.0.1 482 | dev: false 483 | 484 | /has/1.0.3: 485 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 486 | engines: {node: '>= 0.4.0'} 487 | dependencies: 488 | function-bind: 1.1.1 489 | dev: true 490 | 491 | /inflight/1.0.6: 492 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 493 | dependencies: 494 | once: 1.4.0 495 | wrappy: 1.0.2 496 | dev: false 497 | 498 | /inherits/2.0.4: 499 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 500 | dev: false 501 | 502 | /install/0.13.0: 503 | resolution: {integrity: sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==} 504 | engines: {node: '>= 0.10'} 505 | dev: false 506 | 507 | /is-core-module/2.11.0: 508 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 509 | dependencies: 510 | has: 1.0.3 511 | dev: true 512 | 513 | /lines-and-columns/1.2.4: 514 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 515 | dev: false 516 | 517 | /minimatch/3.1.2: 518 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 519 | dependencies: 520 | brace-expansion: 1.1.11 521 | dev: false 522 | 523 | /monaco-editor/0.36.1: 524 | resolution: {integrity: sha512-/CaclMHKQ3A6rnzBzOADfwdSJ25BFoFT0Emxsc4zYVyav5SkK9iA6lEtIeuN/oRYbwPgviJT+t3l+sjFa28jYg==} 525 | dev: false 526 | 527 | /mz/2.7.0: 528 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 529 | dependencies: 530 | any-promise: 1.3.0 531 | object-assign: 4.1.1 532 | thenify-all: 1.6.0 533 | dev: false 534 | 535 | /nanoid/3.3.6: 536 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 537 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 538 | hasBin: true 539 | dev: true 540 | 541 | /object-assign/4.1.1: 542 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 543 | engines: {node: '>=0.10.0'} 544 | dev: false 545 | 546 | /once/1.4.0: 547 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 548 | dependencies: 549 | wrappy: 1.0.2 550 | dev: false 551 | 552 | /pako/2.1.0: 553 | resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} 554 | dev: false 555 | 556 | /path-is-absolute/1.0.1: 557 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 558 | engines: {node: '>=0.10.0'} 559 | dev: false 560 | 561 | /path-parse/1.0.7: 562 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 563 | dev: true 564 | 565 | /picocolors/1.0.0: 566 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 567 | dev: true 568 | 569 | /pirates/4.0.5: 570 | resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} 571 | engines: {node: '>= 6'} 572 | dev: false 573 | 574 | /postcss/8.4.21: 575 | resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} 576 | engines: {node: ^10 || ^12 || >=14} 577 | dependencies: 578 | nanoid: 3.3.6 579 | picocolors: 1.0.0 580 | source-map-js: 1.0.2 581 | dev: true 582 | 583 | /resolve/1.22.1: 584 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 585 | hasBin: true 586 | dependencies: 587 | is-core-module: 2.11.0 588 | path-parse: 1.0.7 589 | supports-preserve-symlinks-flag: 1.0.0 590 | dev: true 591 | 592 | /rollup/3.20.2: 593 | resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} 594 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 595 | hasBin: true 596 | optionalDependencies: 597 | fsevents: 2.3.2 598 | dev: true 599 | 600 | /source-map-js/1.0.2: 601 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 602 | engines: {node: '>=0.10.0'} 603 | dev: true 604 | 605 | /source-map-support/0.5.21: 606 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 607 | dependencies: 608 | buffer-from: 1.1.2 609 | source-map: 0.6.1 610 | 611 | /source-map/0.6.1: 612 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 613 | engines: {node: '>=0.10.0'} 614 | 615 | /sucrase/3.31.0: 616 | resolution: {integrity: sha512-6QsHnkqyVEzYcaiHsOKkzOtOgdJcb8i54x6AV2hDwyZcY9ZyykGZVw6L/YN98xC0evwTP6utsWWrKRaa8QlfEQ==} 617 | engines: {node: '>=8'} 618 | hasBin: true 619 | dependencies: 620 | commander: 4.1.1 621 | glob: 7.1.6 622 | lines-and-columns: 1.2.4 623 | mz: 2.7.0 624 | pirates: 4.0.5 625 | ts-interface-checker: 0.1.13 626 | dev: false 627 | 628 | /supports-preserve-symlinks-flag/1.0.0: 629 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 630 | engines: {node: '>= 0.4'} 631 | dev: true 632 | 633 | /terser/5.16.8: 634 | resolution: {integrity: sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==} 635 | engines: {node: '>=10'} 636 | hasBin: true 637 | dependencies: 638 | '@jridgewell/source-map': 0.3.2 639 | acorn: 8.8.2 640 | commander: 2.20.3 641 | source-map-support: 0.5.21 642 | 643 | /thenify-all/1.6.0: 644 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 645 | engines: {node: '>=0.8'} 646 | dependencies: 647 | thenify: 3.3.1 648 | dev: false 649 | 650 | /thenify/3.3.1: 651 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 652 | dependencies: 653 | any-promise: 1.3.0 654 | dev: false 655 | 656 | /ts-interface-checker/0.1.13: 657 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 658 | dev: false 659 | 660 | /typescript/4.9.5: 661 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 662 | engines: {node: '>=4.2.0'} 663 | hasBin: true 664 | dev: true 665 | 666 | /uuid/9.0.0: 667 | resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} 668 | hasBin: true 669 | dev: true 670 | 671 | /vite-plugin-top-level-await/1.3.0_vite@4.2.1: 672 | resolution: {integrity: sha512-owIfsgWudMlQODWJSwp0sQB3AZZu3qsMygeBjZy8CyjEk6OB9AGd8lHqmgwrcEqgvy9N58lYxSBLVk3/4ejEiA==} 673 | peerDependencies: 674 | vite: '>=2.8' 675 | dependencies: 676 | '@rollup/plugin-virtual': 3.0.1 677 | '@swc/core': 1.3.42 678 | uuid: 9.0.0 679 | vite: 4.2.1_terser@5.16.8 680 | transitivePeerDependencies: 681 | - rollup 682 | dev: true 683 | 684 | /vite/4.2.1_terser@5.16.8: 685 | resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} 686 | engines: {node: ^14.18.0 || >=16.0.0} 687 | hasBin: true 688 | peerDependencies: 689 | '@types/node': '>= 14' 690 | less: '*' 691 | sass: '*' 692 | stylus: '*' 693 | sugarss: '*' 694 | terser: ^5.4.0 695 | peerDependenciesMeta: 696 | '@types/node': 697 | optional: true 698 | less: 699 | optional: true 700 | sass: 701 | optional: true 702 | stylus: 703 | optional: true 704 | sugarss: 705 | optional: true 706 | terser: 707 | optional: true 708 | dependencies: 709 | esbuild: 0.17.14 710 | postcss: 8.4.21 711 | resolve: 1.22.1 712 | rollup: 3.20.2 713 | terser: 5.16.8 714 | optionalDependencies: 715 | fsevents: 2.3.2 716 | dev: true 717 | 718 | /wrappy/1.0.2: 719 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 720 | dev: false 721 | --------------------------------------------------------------------------------