├── .editorconfig ├── .github └── .kodiak.toml ├── .gitignore ├── LICENSE ├── README.md ├── docs ├── PHP.md └── phpinfo.png ├── examples ├── php │ ├── cgi.php │ ├── cli.php │ ├── fpm.php │ ├── index.php │ ├── now.json │ ├── php72.php │ ├── php73.php │ ├── php74.php │ └── server.php └── pure │ ├── index.js │ └── now.json └── runtimes ├── caddy ├── .gitignore ├── Makefile ├── native │ ├── Caddyfile │ └── caddy ├── package-lock.json ├── package.json ├── src │ ├── helpers.ts │ ├── index.ts │ ├── launcher.ts │ └── types.d.ts ├── test │ └── spec │ │ └── helpers.js └── tsconfig.json ├── debug ├── .gitignore ├── package-lock.json ├── package.json ├── src │ ├── index.ts │ └── launcher.ts └── tsconfig.json ├── md ├── .gitignore ├── package-lock.json ├── package.json ├── src │ └── index.ts └── tsconfig.json └── plain ├── .gitignore ├── package-lock.json ├── package.json ├── src └── index.ts └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.{md,html}] 12 | indent_style = tab 13 | indent_size = tab 14 | tab_width = 4 15 | 16 | [*.{js}] 17 | indent_style = space 18 | indent_size = 2 19 | 20 | [{composer.json,package.json,.travis.yml}] 21 | indent_style = space 22 | indent_size = 2 23 | -------------------------------------------------------------------------------- /.github/.kodiak.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | [merge] 4 | automerge_label = "automerge" 5 | blacklist_title_regex = "^WIP.*" 6 | blacklist_labels = ["WIP"] 7 | method = "rebase" 8 | delete_branch_on_merge = true 9 | notify_on_conflict = true 10 | optimistic_updates = false 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Node 2 | node_modules 3 | 4 | # Temp 5 | tmp 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Juicy(fx) 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 |

Vercel Runtimes

2 | 3 |

4 | The main goal is to dig deeper into Vercel Runtimes.
5 | The development started with PHP builder, which has been separated into vercel-php.
6 | At this time this repository contains a testing versions of various runtimes. 7 |

8 | 9 |

10 | 🕹 f3l1x.io | 💻 f3l1x | 🐦 @xf3l1x 11 |

12 | 13 | ## Builders 14 | 15 | ### Plain 16 | 17 | ```json 18 | { 19 | "builds": [ 20 | { "src": "file.txt", "use": "vercel-plain@0.0.2" } 21 | ] 22 | } 23 | ``` 24 | 25 | ### [🐘 PHP](https://github.com/vercel-community/php) 26 | 27 | ```json 28 | { 29 | "builds": [ 30 | { "src": "index.php", "use": "vercel-php@0.5.2" } 31 | ] 32 | } 33 | ``` 34 | 35 | ### Markdown 36 | 37 | ```json 38 | { 39 | "builds": [ 40 | { 41 | "src": "**/*.md", 42 | "use": "vercel-md@0.0.5", 43 | "config": { 44 | "title": "Demo Project", 45 | "css": [ 46 | "https://CDN/lib.css", 47 | "/dist/theme.css" 48 | ], 49 | "js": [ 50 | "https://CDN/lib.js", 51 | "/dist/main.js" 52 | ] 53 | } 54 | } 55 | ] 56 | } 57 | ``` 58 | 59 | ### Debug 60 | 61 | ```json 62 | { 63 | "builds": [ 64 | { "src": "file.txt", "use": "vercel-debug@0.0.1" } 65 | ] 66 | ``` 67 | 68 | ## 📝 License 69 | 70 | Copyright © 2019 [f3l1x](https://github.com/f3l1x). 71 | This project is [MIT](LICENSE) licensed. 72 | -------------------------------------------------------------------------------- /docs/PHP.md: -------------------------------------------------------------------------------- 1 | # 🐘 PHP 2 | 3 | > ❗️PHP builder was separated into solo repository [juicyfx/now-php](https://github.com/juicyfx/now-php) and builder renamed to now-php.❗️ 4 | 5 | **Builders** 6 | 7 | - Server ✅ (PHP Development Server) 8 | - CGI ✅ (Common Gateway Interface) 9 | - CLI ✅ (Command-line interface) 10 | - FPM ✅🐥 (PHP-FPM) 11 | - Bref ✅ ([Bref.sh](https://github.com/brefphp/bref/)) 12 | - FPM ✅🐥 ([Caddy server](https://github.com/caddyserver/caddy) + FPM) 13 | 14 | **PHP versions** 15 | 16 | - PHP 7.2 ✅ 17 | - PHP 7.3 ✅ 18 | - PHP 7.4 ✅ 19 | - PHP 8.0 🔥 20 | 21 | > PHP 5.5, 5.6, 7.0 or 7.1 are not supported. 22 | 23 | **Extensions** 24 | 25 | Preinstalled: apcu, bcmath, bz2, calendar, Core, ctype, curl, date, dom, ds, exif, fileinfo, filter, ftp, gettext, hash, iconv, json, libxml, mbstring, mysqli, mysqlnd, openssl, pcntl, pcre, PDO, pdo_mysql, pdo_pgsql, pdo_sqlite, phalcon (< 7.4), Phar, readline, Reflection, session, SimpleXML, soap, sockets, sodium, SPL, sqlite3, ssh2, standard, swoole, tokenizer, xml, xmlreader, xmlrpc, xmlwriter, xsl, Zend OPcache, zlib 26 | 27 | > List of all installable extensions is on this page https://blog.remirepo.net/pages/PECL-extensions-RPM-status. 28 | 29 | ## 📦 Packages 30 | 31 | **PHP builders** 32 | 33 | | Package | Stable | Canary | Description | 34 | |---------|--------|--------|-------------| 35 | | [`@juicyfx/php`](src/php)| `0.0.7` | `@canary` | Final PHP builder. | 36 | | [`@juicyfx/php-bridge`](src/php-bridge)| `0.0.2` | `@canary` | PHP builder bridge with DevServer, FPM, CGI and CLI. | 37 | | [`@juicyfx/php-bref`](src/php-bref)| `0.0.1` | `@canary` | Final PHP builder with Bref.sh. (Only with PHP 7.2) | 38 | | [`@juicyfx/php-caddy`](src/php-caddy)| `0.0.1` | `@canary` | Final PHP builder with Caddy server with FASTCGI. | 39 | 40 | **PHP libraries** 41 | 42 | | Package | Stable | Canary | Description | 43 | |---------|--------|--------|-------------| 44 | | [`@juicyfx/php-lib-72`](src/php-lib-71) | `0.0.5` | `@canary` | PHP 7.2 binaries and shared libraries. | 45 | | [`@juicyfx/php-lib-73`](src/php-lib-72) | `0.0.5` | `@canary` | PHP 7.3 binaries and shared libraries. | 46 | | [`@juicyfx/php-lib-74`](src/php-lib-74) | `0.0.5` | `@canary` | PHP 7.4 binaries and shared libraries. | 47 | 48 | **Speed** 49 | 50 | | Builder | Cold | Warm | 51 | |---------|------|------| 52 | | `@juicyfx/php` (mode:server) | ~250ms | ~5ms | 53 | | `@juicyfx/php` (mode:cgi) | ~220ms | ~40ms | 54 | | `@juicyfx/php` (mode:cli) | ~220ms | ~35ms | 55 | | `@juicyfx/php` (mode:fpm) | ~170ms | ~160ms | 56 | | `@juicyfx/php-caddy` | ~450ms | ~5ms | 57 | | `@juicyfx/php-bref` | ~255ms | ~2ms | 58 | 59 | ## ⚙️ Usage 60 | 61 | There is prepared builder for your PHP lambdas `@juicyfx/php`. 62 | 63 | **Minimal** 64 | 65 | ``` 66 | { 67 | "version": 2, 68 | "builds": [ 69 | { 70 | "src": "index.php", 71 | "use": "@juicyfx/php", 72 | } 73 | ] 74 | } 75 | ``` 76 | 77 | > 🚧Everything is HOT right now, so you should rather test the `@juicyfx/php@canary` version. 78 | 79 | **Config** 80 | 81 | ``` 82 | { 83 | "version": 2, 84 | "builds": [ 85 | { 86 | "src": "index.php", 87 | "use": "@juicyfx/php", 88 | "config": { 89 | "v": "7.3" 90 | "mode": "server", 91 | } 92 | } 93 | ] 94 | } 95 | ``` 96 | 97 | - `v` [optional] 98 | - Set the PHP version. 99 | - Type: string 100 | - Default: 7.3 101 | - Values: 7.2 | 7.3 | 7.4 102 | - `mode` [optional] 103 | - Set the PHP launcher (bridge). 104 | - Type: string 105 | - Default: server 106 | - Values: server | cgi | cli | fpm 107 | - `composer` [optional] 108 | - Call composer install. 109 | - Type: boolean 110 | - Default: false 111 | - Values: true/false 112 | - Warning: Only supported on PHP 7.2, 7.3 113 | 114 | ## 🤗Features 115 | 116 | - multiple PHP versions 117 | - multiple running modes (server, cgi, cli, fpm) 118 | - install dependencies via Composer 119 | 120 | ## 🚀 Roadmap 121 | 122 | - Support `now dev` 123 | - Resolve known issues (**HELP WANTED**) 124 | 125 | ## 🤔 Known Issues 126 | 127 | - PHP-FPM - Uncaught Exception - socket hang up 128 | - This is known issue and I would apreaciate any help. 129 | 130 | ``` 131 | START RequestId: 1811b891-d871-4260-9ea3-1277c24a2d59 Version: $LATEST 132 | 2019-06-22T16:50:54.848Z 1811b891-d871-4260-9ea3-1277c24a2d59 INFO Starting PHP 133 | 2019-06-22T16:50:55.076Z 1811b891-d871-4260-9ea3-1277c24a2d59 ERROR Uncaught Exception {"errorType":"Error","errorMessage":"socket hang up","code":"ECONNRESET","stack":["Error: socket hang up"," at createHangUpError (_http_client.js:323:15)"," at Socket.socketOnEnd (_http_client.js:426:23)"," at Socket.emit (events.js:194:15)"," at endReadableNT (_stream_readable.js:1125:12)"," at process._tickCallback (internal/process/next_tick.js:63:19)"]} 134 | END RequestId: 1811b891-d871-4260-9ea3-1277c24a2d59 135 | REPORT RequestId: 1811b891-d871-4260-9ea3-1277c24a2d59 136 | Duration: 270.75 ms Billed Duration: 300 ms Memory Size: 3008 MB Max Memory Used: 115 MB 137 | RequestId: 1811b891-d871-4260-9ea3-1277c24a2d59 Process exited before completing request 138 | ``` 139 | 140 | ## 👀 Examples 141 | 142 | **Server** 143 | 144 | - phpinfo - https://now-builders-php-server-f3l1x.juicyfx1.now.sh/ 145 | - hello - https://now-builders-php-server-f3l1x.juicyfx1.now.sh/hello.php 146 | - test - https://now-builders-php-server-f3l1x.juicyfx1.now.sh/test.php 147 | 148 | **CGI** 149 | 150 | - phpinfo - https://now-builders-php-cli-f3l1x.juicyfx1.now.sh/ 151 | - hello - https://now-builders-php-cli-f3l1x.juicyfx1.now.sh/hello.php 152 | - test - https://now-builders-php-cli-f3l1x.juicyfx1.now.sh/test.php 153 | 154 | **CLI** 155 | 156 | - phpinfo - https://now-builders-php-cli-f3l1x.juicyfx1.now.sh/ 157 | - hello - https://now-builders-php-cli-f3l1x.juicyfx1.now.sh/hello.php 158 | - test - https://now-builders-php-cli-f3l1x.juicyfx1.now.sh/test.php 159 | 160 | **FPM** 161 | 162 | - phpinfo - https://now-builders-php-fpm-f3l1x.juicyfx1.now.sh/ 163 | - hello - https://now-builders-php-fpm-f3l1x.juicyfx1.now.sh/hello.php 164 | - test - https://now-builders-php-fpm-f3l1x.juicyfx1.now.sh/test.php 165 | 166 | **Extensions** 167 | 168 | - ds - https://now-builders-php-ext-f3l1x.juicyfx1.now.sh/ds.php 169 | - phalcon - https://now-builders-php-ext-f3l1x.juicyfx1.now.sh/phalcon.php 170 | 171 | **Versions** 172 | 173 | - PHP versions - https://now-builders-php-version-f3l1x.juicyfx1.now.sh/ 174 | 175 | **Nette** 176 | 177 | - guide - https://now-builders-php-nette-f3l1x.juicyfx1.now.sh/ 178 | - phpinfo - https://now-builders-php-nette-f3l1x.juicyfx1.now.sh/phpinfo.php 179 | - dump - https://now-builders-php-nette-f3l1x.juicyfx1.now.sh/debp.php 180 | - Tracy Debugger - https://now-builders-php-nette-f3l1x.juicyfx1.now.sh/tracy.php 181 | - Nette Checker - https://now-builders-php-nette-f3l1x.juicyfx1.now.sh/checker.php 182 | 183 | **Bref** 184 | 185 | - phpinfo - https://now-builders-php-bref-f3l1x.juicyfx1.now.sh/ 186 | - Nette Framework - https://now-builders-php-bref-nette-f3l1x.juicyfx1.now.sh/ 187 | 188 | ![](./phpinfo.png) 189 | -------------------------------------------------------------------------------- /docs/phpinfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/contributte/vercel-runtimes/a9beeca1d03afb2c02cc606413376021cbccb944/docs/phpinfo.png -------------------------------------------------------------------------------- /examples/php/cgi.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | juicyfx/now-builders 8 | 9 | 10 |

Multiple PHP versions

11 | 12 | 17 | 18 |

Multiple PHP running modes

19 | 20 | 26 | 27 |

now-php

28 | 29 |

Take a look at new community builder now-php

30 | 31 |
32 | 33 | Copyright © | f3l1x 34 | 35 | 36 | -------------------------------------------------------------------------------- /examples/php/now.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "name": "now-builders-php", 4 | "scope": "juicyfx", 5 | "regions": ["all"], 6 | "public": true, 7 | "builds": [ 8 | { "src": "index.php", "use": "@juicyfx/php@canary"}, 9 | { "src": "php72.php", "use": "@juicyfx/php@canary", "config": { "v": "7.2" }}, 10 | { "src": "php73.php", "use": "@juicyfx/php@canary", "config": { "v": "7.3" }}, 11 | { "src": "php74.php", "use": "@juicyfx/php@canary", "config": { "v": "7.4" }}, 12 | { "src": "cgi.php", "use": "@juicyfx/php@canary", "config": { "v": "7.3", "mode": "cgi" }}, 13 | { "src": "cli.php", "use": "@juicyfx/php@canary", "config": { "v": "7.3", "mode": "cli" }}, 14 | { "src": "fpm.php", "use": "@juicyfx/php@canary", "config": { "v": "7.3", "mode": "fpm" }}, 15 | { "src": "server.php", "use": "@juicyfx/php@canary", "config": { "v": "7.3", "mode": "server" }} 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /examples/php/php72.php: -------------------------------------------------------------------------------- 1 | pathJoin(process.env.LAMBDA_TASK_ROOT || '/', 'user'); 5 | export const getPhpDir = (): string => pathJoin(process.env.LAMBDA_TASK_ROOT || '/', 'php'); 6 | export const isDev = (): boolean => process.env.NOW_PHP_DEV === '1'; 7 | 8 | export function normalizeEvent(event: Event): AwsRequest { 9 | if (event.Action === 'Invoke') { 10 | const invokeEvent = JSON.parse(event.body); 11 | 12 | const { 13 | method, path, host, headers = {}, encoding, 14 | }: InvokedEvent = invokeEvent; 15 | 16 | let { body } = invokeEvent; 17 | 18 | if (body) { 19 | if (encoding === 'base64') { 20 | body = Buffer.from(body, encoding); 21 | } else if (encoding === undefined) { 22 | body = Buffer.from(body); 23 | } else { 24 | throw new Error(`Unsupported encoding: ${encoding}`); 25 | } 26 | } 27 | 28 | return { 29 | method, 30 | path, 31 | host, 32 | headers, 33 | body, 34 | }; 35 | } 36 | 37 | const { 38 | httpMethod: method, path, host, headers = {}, body, 39 | } = event; 40 | 41 | return { 42 | method, 43 | path, 44 | host, 45 | headers, 46 | body, 47 | }; 48 | } 49 | 50 | export async function transformFromAwsRequest({ 51 | method, path, host, headers, body, 52 | }: AwsRequest): Promise { 53 | const { pathname, search } = urlParse(path); 54 | 55 | const filename = pathJoin( 56 | getUserDir(), 57 | process.env.NOW_ENTRYPOINT || pathname || '', 58 | ); 59 | 60 | const uri = pathname + (search || ''); 61 | 62 | return { filename, path, uri, host, method, headers, body }; 63 | } 64 | 65 | export function transformToAwsResponse({ statusCode, headers, body }: PhpOutput): AwsResponse { 66 | return { statusCode, headers, body: body.toString('base64'), encoding: 'base64' }; 67 | } 68 | -------------------------------------------------------------------------------- /runtimes/caddy/src/index.ts: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import { 3 | createLambda, 4 | shouldServe, 5 | rename, 6 | FileFsRef, 7 | BuildOptions, 8 | FileBlob 9 | } from '@now/build-utils'; 10 | 11 | import { 12 | getPhpLibFiles, 13 | getIncludedFiles 14 | } from 'now-php/dist/utils'; 15 | 16 | // ########################### 17 | // EXPORTS 18 | // ########################### 19 | 20 | export const version = 3; 21 | 22 | export async function build({ 23 | files, 24 | entrypoint, 25 | workPath, 26 | config = {}, 27 | meta = {}, 28 | }: BuildOptions) { 29 | const includedFiles = await getIncludedFiles({ files, entrypoint, workPath, config, meta }); 30 | 31 | const userFiles = rename(includedFiles, name => path.join('user', name)); 32 | const bridgeFiles: Files = { 33 | ...await getPhpLibFiles(), 34 | ...{ 35 | 'launcher.js': new FileFsRef({ 36 | fsPath: path.join(__dirname, 'launcher.js'), 37 | }), 38 | 'helpers.js': new FileFsRef({ 39 | fsPath: path.join(__dirname, 'helpers.js'), 40 | }), 41 | 'caddy': new FileFsRef({ 42 | mode: 0o755, 43 | fsPath: path.join(__dirname, '../native/caddy'), 44 | }), 45 | 'Caddyfile': new FileFsRef({ 46 | fsPath: path.join(__dirname, '../native/Caddyfile'), 47 | }), 48 | } 49 | }; 50 | 51 | if (process.env.NOW_PHP_DEBUG === '1') { 52 | console.log('🐘 Entrypoint:', entrypoint); 53 | console.log('🐘 Config:', config); 54 | console.log('🐘 Work path:', workPath); 55 | console.log('🐘 Meta:', meta); 56 | console.log('🐘 User files:', Object.keys(userFiles)); 57 | console.log('🐘 Bridge files:', Object.keys(bridgeFiles)); 58 | console.log('🐘 PHP: php.ini', (bridgeFiles['php/php.ini'] as FileBlob).data.toString()); 59 | } 60 | 61 | const lambda = await createLambda({ 62 | files: { ...userFiles, ...bridgeFiles }, 63 | handler: 'launcher.launcher', 64 | runtime: 'nodejs12.x', 65 | environment: { 66 | NOW_ENTRYPOINT: entrypoint, 67 | NOW_PHP_DEV: meta.isDev ? '1' : '0' 68 | }, 69 | }); 70 | 71 | return { output: lambda }; 72 | }; 73 | 74 | export { shouldServe }; 75 | -------------------------------------------------------------------------------- /runtimes/caddy/src/launcher.ts: -------------------------------------------------------------------------------- 1 | import { normalizeEvent, transformFromAwsRequest, transformToAwsResponse, isDev, getPhpDir, getUserDir } from "./helpers"; 2 | import { ChildProcess, spawn, SpawnOptions } from "child_process"; 3 | import http from 'http'; 4 | import net from 'net'; 5 | 6 | let connFpm: ChildProcess; 7 | let connCaddy: ChildProcess; 8 | 9 | async function startFpm() { 10 | if (connFpm) { 11 | console.log(`🐘 PHP FPM is already running`); 12 | return; 13 | } 14 | 15 | console.log(`🐘 Spawning: PHP-FPM`); 16 | 17 | // php spawn options 18 | const options: SpawnOptions = { 19 | stdio: ['pipe', 'pipe', 'pipe'], 20 | env: process.env 21 | }; 22 | 23 | // now vs now-dev 24 | if (!isDev()) { 25 | options.env!.PATH = `${getPhpDir()}:${process.env.PATH}`; 26 | options.cwd = getPhpDir(); 27 | } else { 28 | options.cwd = getUserDir(); 29 | } 30 | 31 | const fpm = spawn( 32 | 'php-fpm', 33 | ['-c', 'php.ini', '--fpm-config', 'php-fpm.ini', '--nodaemonize'], 34 | options 35 | ); 36 | 37 | fpm.on('close', function (code, signal) { 38 | console.log(`🐘 PHP-FPM process closed code ${code} and signal ${signal}`); 39 | }); 40 | 41 | fpm.on('error', function (err) { 42 | console.error(`🐘 PHP-FPM process errored ${err}`); 43 | }); 44 | 45 | process.on('exit', () => { 46 | fpm.kill(); 47 | }) 48 | 49 | await whenPortOpens(9000, 400); 50 | 51 | connFpm = fpm; 52 | } 53 | 54 | async function startCaddy() { 55 | if (connCaddy) { 56 | console.log(`🚀 Caddy is already running`); 57 | return; 58 | } 59 | 60 | console.log(`🚀 Spawning Caddy`); 61 | 62 | const caddy = spawn( 63 | './caddy', 64 | ['-conf', 'Caddyfile', '-root', '/var/task/user'], 65 | { 66 | stdio: 'inherit', 67 | cwd: '/var/task', 68 | }, 69 | ); 70 | 71 | caddy.on('close', function (code, signal) { 72 | console.log(`🚀 Caddy process closed code ${code} and signal ${signal}`); 73 | }); 74 | 75 | caddy.on('error', function (err) { 76 | console.error(`🚀 Caddy process errored ${err}`); 77 | }); 78 | 79 | process.on('exit', () => { 80 | caddy.kill(); 81 | }) 82 | 83 | await whenPortOpens(8000, 400); 84 | 85 | connCaddy = caddy; 86 | } 87 | 88 | function whenPortOpensCallback(port: number, attempts: number, cb: (error?: string) => void) { 89 | const client = net.connect(port, '127.0.0.1'); 90 | client.on('error', (error: string) => { 91 | if (!attempts) return cb(error); 92 | setTimeout(() => { 93 | whenPortOpensCallback(port, attempts - 1, cb); 94 | }, 50); 95 | }); 96 | client.on('connect', () => { 97 | client.destroy(); 98 | cb(); 99 | }); 100 | } 101 | 102 | function whenPortOpens(port: number, attempts: number): Promise { 103 | return new Promise((resolve, reject) => { 104 | whenPortOpensCallback(port, attempts, (error?: string) => { 105 | if (error) { 106 | reject(error); 107 | } else { 108 | resolve(); 109 | } 110 | }); 111 | }); 112 | } 113 | 114 | async function query({ uri, headers, method, body }: PhpInput): Promise { 115 | if (!connFpm || !connCaddy) { 116 | await Promise.all([ 117 | startFpm(), 118 | startCaddy() 119 | ]); 120 | } 121 | 122 | return new Promise(resolve => { 123 | const options = { 124 | hostname: '127.0.0.1', 125 | port: 8000, 126 | path: `${uri}`, 127 | method, 128 | headers, 129 | }; 130 | 131 | const req = http.request(options, (res) => { 132 | const chunks: Uint8Array[] = []; 133 | 134 | res.on('data', (data) => { 135 | chunks.push(data); 136 | }); 137 | res.on('end', () => { 138 | resolve({ 139 | statusCode: res.statusCode || 200, 140 | headers: res.headers, 141 | body: Buffer.concat(chunks) 142 | }); 143 | }); 144 | }); 145 | 146 | req.on('error', (error) => { 147 | console.error('🚀 Caddy HTTP errored', error); 148 | resolve({ 149 | body: Buffer.from(`🚀 Caddy HTTP error: ${error}`), 150 | headers: {}, 151 | statusCode: 500 152 | }); 153 | }); 154 | 155 | if (body) { 156 | req.write(body); 157 | } 158 | 159 | req.end(); 160 | }); 161 | } 162 | 163 | async function launcher(event: Event): Promise { 164 | const awsRequest = normalizeEvent(event); 165 | const input = await transformFromAwsRequest(awsRequest); 166 | const output = await query(input); 167 | return transformToAwsResponse(output); 168 | } 169 | 170 | exports.launcher = launcher; 171 | 172 | // (async function() { 173 | // console.log(await launcher({ 174 | // httpMethod: 'GET', 175 | // path: '/index.php' 176 | // })); 177 | // })(); 178 | -------------------------------------------------------------------------------- /runtimes/caddy/src/types.d.ts: -------------------------------------------------------------------------------- 1 | type Headers = { [k: string]: string | string[] | undefined }; 2 | 3 | interface Files { 4 | [filePath: string]: import('@now/build-utils').File; 5 | } 6 | 7 | interface MetaOptions { 8 | meta: import('@now/build-utils').Meta; 9 | } 10 | 11 | interface PhpIni { 12 | [k: string]: any, 13 | } 14 | 15 | interface AwsRequest { 16 | method: string, 17 | path: string, 18 | host: string, 19 | headers: Headers, 20 | body: string, 21 | } 22 | 23 | interface AwsResponse { 24 | statusCode: number, 25 | headers: Headers, 26 | body: string, 27 | encoding?: string 28 | } 29 | 30 | interface Event { 31 | Action: string, 32 | body: string, 33 | httpMethod: string, 34 | path: string, 35 | host: string, 36 | headers: Headers, 37 | encoding: string | undefined | null, 38 | } 39 | 40 | interface InvokedEvent { 41 | method: string, 42 | path: string, 43 | host: string, 44 | headers: Headers, 45 | encoding: string | undefined | null, 46 | } 47 | 48 | interface PhpInput { 49 | filename: string, 50 | path: string, 51 | uri: string, 52 | host: string, 53 | method: string, 54 | headers: Headers, 55 | body: string, 56 | } 57 | 58 | interface PhpOutput { 59 | statusCode: number, 60 | headers: Headers, 61 | body: Buffer, 62 | } 63 | -------------------------------------------------------------------------------- /runtimes/caddy/test/spec/helpers.js: -------------------------------------------------------------------------------- 1 | const helpers = require('../../dist/helpers'); 2 | 3 | test('transform to AWS response', () => { 4 | const response = helpers.transformToAwsResponse({ 5 | statusCode: 200, 6 | headers: [], 7 | body: "foo" 8 | }); 9 | 10 | expect(response.body).toBe("foo"); 11 | }); 12 | -------------------------------------------------------------------------------- /runtimes/caddy/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "esModuleInterop": true, 5 | "lib": [ 6 | "esnext" 7 | ], 8 | "target": "esnext", 9 | "module": "commonjs", 10 | "outDir": "dist", 11 | "sourceMap": false, 12 | "declaration": true, 13 | "typeRoots": [ 14 | "./node_modules/@types" 15 | ] 16 | }, 17 | "include": [ 18 | "src/**/*" 19 | ], 20 | "exclude": [ 21 | "dist", 22 | "node_modules", 23 | "test" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /runtimes/debug/.gitignore: -------------------------------------------------------------------------------- 1 | # NodeJS 2 | /node_modules 3 | 4 | # App 5 | /dist 6 | -------------------------------------------------------------------------------- /runtimes/debug/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vercel-debug", 3 | "version": "0.0.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "vercel-debug", 9 | "version": "0.0.1", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@now/build-utils": "^2.7.0", 13 | "@types/node": "^18.11.4", 14 | "typescript": "^4.6.2" 15 | } 16 | }, 17 | "node_modules/@now/build-utils": { 18 | "version": "2.7.0", 19 | "resolved": "https://registry.npmjs.org/@now/build-utils/-/build-utils-2.7.0.tgz", 20 | "integrity": "sha512-5917PKoI3PgVkbEl3/tPMOR+z3UD20RTfoXhAwBEsP1HJAYEl+Mv5NawDgBLRsikz2drbZn1YTOLbadBujcPow==", 21 | "dev": true 22 | }, 23 | "node_modules/@types/node": { 24 | "version": "18.11.4", 25 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.4.tgz", 26 | "integrity": "sha512-BxcJpBu8D3kv/GZkx/gSMz6VnTJREBj/4lbzYOQueUOELkt8WrO6zAcSPmp9uRPEW/d+lUO8QK0W2xnS1hEU0A==", 27 | "dev": true 28 | }, 29 | "node_modules/typescript": { 30 | "version": "4.6.2", 31 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", 32 | "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", 33 | "dev": true, 34 | "bin": { 35 | "tsc": "bin/tsc", 36 | "tsserver": "bin/tsserver" 37 | }, 38 | "engines": { 39 | "node": ">=4.2.0" 40 | } 41 | } 42 | }, 43 | "dependencies": { 44 | "@now/build-utils": { 45 | "version": "2.7.0", 46 | "resolved": "https://registry.npmjs.org/@now/build-utils/-/build-utils-2.7.0.tgz", 47 | "integrity": "sha512-5917PKoI3PgVkbEl3/tPMOR+z3UD20RTfoXhAwBEsP1HJAYEl+Mv5NawDgBLRsikz2drbZn1YTOLbadBujcPow==", 48 | "dev": true 49 | }, 50 | "@types/node": { 51 | "version": "18.11.4", 52 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.4.tgz", 53 | "integrity": "sha512-BxcJpBu8D3kv/GZkx/gSMz6VnTJREBj/4lbzYOQueUOELkt8WrO6zAcSPmp9uRPEW/d+lUO8QK0W2xnS1hEU0A==", 54 | "dev": true 55 | }, 56 | "typescript": { 57 | "version": "4.6.2", 58 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", 59 | "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", 60 | "dev": true 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /runtimes/debug/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vercel-debug", 3 | "description": "Debug Runtime for Vercel platform", 4 | "version": "0.0.1", 5 | "license": "MIT", 6 | "main": "./dist/index.js", 7 | "homepage": "https://github.com/juicyfx/juicy", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/juicyfx/juicy.git" 11 | }, 12 | "scripts": { 13 | "watch": "tsc --watch", 14 | "build": "tsc", 15 | "prepublishOnly": "tsc" 16 | }, 17 | "files": [ 18 | "dist" 19 | ], 20 | "devDependencies": { 21 | "@now/build-utils": "^2.7.0", 22 | "@types/node": "^18.11.4", 23 | "typescript": "^4.6.2" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /runtimes/debug/src/index.ts: -------------------------------------------------------------------------------- 1 | const { 2 | createLambda, 3 | shouldServe, 4 | } = require('@now/build-utils'); 5 | const FileFsRef = require('@now/build-utils/file-fs-ref.js'); 6 | const path = require('path'); 7 | 8 | exports.shouldServe = shouldServe; 9 | 10 | exports.build = async ({ entrypoint }) => { 11 | const bridgeFiles = { 12 | 'launcher.js': new FileFsRef({ 13 | fsPath: path.join(__dirname, 'launcher.js'), 14 | }), 15 | } 16 | 17 | console.log('Bridge files:', Object.keys(bridgeFiles)); 18 | console.log('Entrypoint:', entrypoint); 19 | 20 | const lambda = await createLambda({ 21 | files: { ...bridgeFiles }, 22 | handler: 'launcher.launcher', 23 | runtime: 'nodejs10.x', 24 | environment: { 25 | NOW_ENTRYPOINT: entrypoint, 26 | NOW_PURE_DEBUG: process.env.NOW_PURE_DEBUG, 27 | }, 28 | }); 29 | 30 | return { [entrypoint]: lambda }; 31 | }; 32 | -------------------------------------------------------------------------------- /runtimes/debug/src/launcher.ts: -------------------------------------------------------------------------------- 1 | function normalizeEvent(event) { 2 | if (event.Action === 'Invoke') { 3 | const invokeEvent = JSON.parse(event.body); 4 | 5 | const { 6 | method, path, headers, encoding, 7 | } = invokeEvent; 8 | 9 | let { body } = invokeEvent; 10 | 11 | if (body) { 12 | if (encoding === 'base64') { 13 | body = Buffer.from(body, encoding); 14 | } else if (encoding === undefined) { 15 | body = Buffer.from(body); 16 | } else { 17 | throw new Error(`Unsupported encoding: ${encoding}`); 18 | } 19 | } 20 | 21 | return { 22 | method, 23 | path, 24 | headers, 25 | body, 26 | }; 27 | } 28 | 29 | const { 30 | httpMethod: method, path, headers, body, 31 | } = event; 32 | 33 | return { 34 | method, 35 | path, 36 | headers, 37 | body, 38 | }; 39 | } 40 | 41 | function transformToAwsResponse(payload) { 42 | return { 43 | statusCode: 200, 44 | body: Buffer.from(JSON.stringify(payload)).toString('base64'), 45 | headers: { 46 | "Content-Type": "application/json" 47 | }, 48 | encoding: 'base64', 49 | }; 50 | } 51 | 52 | async function launcher(event) { 53 | if (process.env.NOW_PURE_DEBUG) { 54 | console.log('Event', event); 55 | } 56 | 57 | const awsRequest = normalizeEvent(event); 58 | 59 | if (process.env.NOW_PURE_DEBUG) { 60 | console.log('Normalized event', awsRequest); 61 | } 62 | 63 | return transformToAwsResponse(awsRequest); 64 | } 65 | 66 | exports.launcher = launcher; 67 | -------------------------------------------------------------------------------- /runtimes/debug/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "esModuleInterop": true, 5 | "target": "ES2018", 6 | "module": "CommonJS", 7 | "outDir": "dist", 8 | "sourceMap": false, 9 | "declaration": false, 10 | "typeRoots": [ 11 | "./node_modules/@types", 12 | ], 13 | "noFallthroughCasesInSwitch": true, 14 | "noImplicitReturns": true, 15 | "noEmitOnError": true, 16 | "noUnusedLocals": true, 17 | "noUnusedParameters": true, 18 | "removeComments": true, 19 | "preserveConstEnums": true 20 | }, 21 | "exclude": [ 22 | "dist", 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /runtimes/md/.gitignore: -------------------------------------------------------------------------------- 1 | # NodeJS 2 | /node_modules 3 | 4 | # App 5 | /dist 6 | -------------------------------------------------------------------------------- /runtimes/md/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vercel-md", 3 | "version": "0.0.5", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "vercel-md", 9 | "version": "0.0.5", 10 | "license": "MIT", 11 | "dependencies": { 12 | "rehype-document": "^6.0.0", 13 | "rehype-format": "^4.0.0", 14 | "rehype-stringify": "^9.0.0", 15 | "remark-parse": "^10.0.0", 16 | "remark-rehype": "^10.0.0", 17 | "unified": "^10.0.0", 18 | "unified-stream": "^2.0.0" 19 | }, 20 | "devDependencies": { 21 | "@types/node": "^17.0.0", 22 | "@vercel/build-utils": "^5.4.1", 23 | "typescript": "^4.0.2" 24 | } 25 | }, 26 | "node_modules/@types/debug": { 27 | "version": "4.1.7", 28 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", 29 | "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", 30 | "dependencies": { 31 | "@types/ms": "*" 32 | } 33 | }, 34 | "node_modules/@types/hast": { 35 | "version": "2.3.2", 36 | "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.2.tgz", 37 | "integrity": "sha512-Op5W7jYgZI7AWKY5wQ0/QNMzQM7dGQPyW1rXKNiymVCy5iTfdPuGu4HhYNOM2sIv8gUfIuIdcYlXmAepwaowow==", 38 | "dependencies": { 39 | "@types/unist": "*" 40 | } 41 | }, 42 | "node_modules/@types/mdast": { 43 | "version": "3.0.3", 44 | "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", 45 | "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", 46 | "dependencies": { 47 | "@types/unist": "*" 48 | } 49 | }, 50 | "node_modules/@types/mdurl": { 51 | "version": "1.0.2", 52 | "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", 53 | "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" 54 | }, 55 | "node_modules/@types/ms": { 56 | "version": "0.7.31", 57 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", 58 | "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" 59 | }, 60 | "node_modules/@types/node": { 61 | "version": "17.0.23", 62 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", 63 | "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", 64 | "dev": true 65 | }, 66 | "node_modules/@types/unist": { 67 | "version": "2.0.3", 68 | "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", 69 | "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" 70 | }, 71 | "node_modules/@vercel/build-utils": { 72 | "version": "5.5.5", 73 | "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-5.5.5.tgz", 74 | "integrity": "sha512-ZBJpqnqm2OqYyWEqfRn0CYvlmSdOf/igtFy58x0bvSbJdN6Dx2rEw9sNg8SU7O/+zWpKP5rRfWcT6iql/p0sCg==", 75 | "dev": true 76 | }, 77 | "node_modules/bail": { 78 | "version": "2.0.1", 79 | "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.1.tgz", 80 | "integrity": "sha512-d5FoTAr2S5DSUPKl85WNm2yUwsINN8eidIdIwsOge2t33DaOfOdSmmsI11jMN3GmALCXaw+Y6HMVHDzePshFAA==", 81 | "funding": { 82 | "type": "github", 83 | "url": "https://github.com/sponsors/wooorm" 84 | } 85 | }, 86 | "node_modules/ccount": { 87 | "version": "2.0.0", 88 | "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.0.tgz", 89 | "integrity": "sha512-VOR0NWFYX65n9gELQdcpqsie5L5ihBXuZGAgaPEp/U7IOSjnPMEH6geE+2f6lcekaNEfWzAHS45mPvSo5bqsUA==", 90 | "funding": { 91 | "type": "github", 92 | "url": "https://github.com/sponsors/wooorm" 93 | } 94 | }, 95 | "node_modules/character-entities": { 96 | "version": "2.0.0", 97 | "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.0.tgz", 98 | "integrity": "sha512-oHqMj3eAuJ77/P5PaIRcqk+C3hdfNwyCD2DAUcD5gyXkegAuF2USC40CEqPscDk4I8FRGMTojGJQkXDsN5QlJA==", 99 | "funding": { 100 | "type": "github", 101 | "url": "https://github.com/sponsors/wooorm" 102 | } 103 | }, 104 | "node_modules/character-entities-html4": { 105 | "version": "2.0.0", 106 | "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.0.0.tgz", 107 | "integrity": "sha512-dwT2xh5ZhUAjyP96k57ilMKoTQyASaw9IAMR9U5c1lCu2RUni6O6jxfpUEdO2RcPT6TJFvr8pqsbami4Jk+2oA==", 108 | "funding": { 109 | "type": "github", 110 | "url": "https://github.com/sponsors/wooorm" 111 | } 112 | }, 113 | "node_modules/character-entities-legacy": { 114 | "version": "2.0.0", 115 | "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-2.0.0.tgz", 116 | "integrity": "sha512-YwaEtEvWLpFa6Wh3uVLrvirA/ahr9fki/NUd/Bd4OR6EdJ8D22hovYQEOUCBfQfcqnC4IAMGMsHXY1eXgL4ZZA==", 117 | "funding": { 118 | "type": "github", 119 | "url": "https://github.com/sponsors/wooorm" 120 | } 121 | }, 122 | "node_modules/character-reference-invalid": { 123 | "version": "2.0.0", 124 | "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.0.tgz", 125 | "integrity": "sha512-pE3Z15lLRxDzWJy7bBHBopRwfI20sbrMVLQTC7xsPglCHf4Wv1e167OgYAFP78co2XlhojDyAqA+IAJse27//g==", 126 | "funding": { 127 | "type": "github", 128 | "url": "https://github.com/sponsors/wooorm" 129 | } 130 | }, 131 | "node_modules/comma-separated-tokens": { 132 | "version": "2.0.2", 133 | "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", 134 | "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==", 135 | "funding": { 136 | "type": "github", 137 | "url": "https://github.com/sponsors/wooorm" 138 | } 139 | }, 140 | "node_modules/debug": { 141 | "version": "4.3.2", 142 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 143 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 144 | "dependencies": { 145 | "ms": "2.1.2" 146 | }, 147 | "engines": { 148 | "node": ">=6.0" 149 | }, 150 | "peerDependenciesMeta": { 151 | "supports-color": { 152 | "optional": true 153 | } 154 | } 155 | }, 156 | "node_modules/extend": { 157 | "version": "3.0.2", 158 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 159 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 160 | }, 161 | "node_modules/hast-util-embedded": { 162 | "version": "2.0.0", 163 | "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-2.0.0.tgz", 164 | "integrity": "sha512-vEr54rDu2CheBM4nLkWbW8Rycf8HhkA/KsrDnlyKnvBTyhyO+vAG6twHnfUbiRGo56YeUBNCI4HFfHg3Wu+tig==", 165 | "dependencies": { 166 | "hast-util-is-element": "^2.0.0" 167 | }, 168 | "funding": { 169 | "type": "opencollective", 170 | "url": "https://opencollective.com/unified" 171 | } 172 | }, 173 | "node_modules/hast-util-has-property": { 174 | "version": "2.0.0", 175 | "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.0.tgz", 176 | "integrity": "sha512-4Qf++8o5v14us4Muv3HRj+Er6wTNGA/N9uCaZMty4JWvyFKLdhULrv4KE1b65AthsSO9TXSZnjuxS8ecIyhb0w==", 177 | "funding": { 178 | "type": "opencollective", 179 | "url": "https://opencollective.com/unified" 180 | } 181 | }, 182 | "node_modules/hast-util-is-body-ok-link": { 183 | "version": "1.0.4", 184 | "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-1.0.4.tgz", 185 | "integrity": "sha512-mFblNpLvFbD8dG2Nw5dJBYZkxIHeph1JAh5yr4huI7T5m8cV0zaXNiqzKPX/JdjA+tIDF7c33u9cxK132KRjyQ==", 186 | "dependencies": { 187 | "hast-util-has-property": "^1.0.0", 188 | "hast-util-is-element": "^1.0.0" 189 | }, 190 | "funding": { 191 | "type": "opencollective", 192 | "url": "https://opencollective.com/unified" 193 | } 194 | }, 195 | "node_modules/hast-util-is-body-ok-link/node_modules/hast-util-has-property": { 196 | "version": "1.0.4", 197 | "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz", 198 | "integrity": "sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg==", 199 | "funding": { 200 | "type": "opencollective", 201 | "url": "https://opencollective.com/unified" 202 | } 203 | }, 204 | "node_modules/hast-util-is-body-ok-link/node_modules/hast-util-is-element": { 205 | "version": "1.1.0", 206 | "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", 207 | "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", 208 | "funding": { 209 | "type": "opencollective", 210 | "url": "https://opencollective.com/unified" 211 | } 212 | }, 213 | "node_modules/hast-util-is-element": { 214 | "version": "2.1.1", 215 | "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.1.tgz", 216 | "integrity": "sha512-ag0fiZfRWsPiR1udvnSbaazJLGv8qd8E+/e3rW8rUZhbKG4HNJmFL4QkEceN+22BgE+uozXY30z/s+2dL6Z++g==", 217 | "dependencies": { 218 | "@types/hast": "^2.0.0", 219 | "@types/unist": "^2.0.0" 220 | }, 221 | "funding": { 222 | "type": "opencollective", 223 | "url": "https://opencollective.com/unified" 224 | } 225 | }, 226 | "node_modules/hast-util-parse-selector": { 227 | "version": "3.1.0", 228 | "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz", 229 | "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", 230 | "dependencies": { 231 | "@types/hast": "^2.0.0" 232 | }, 233 | "funding": { 234 | "type": "opencollective", 235 | "url": "https://opencollective.com/unified" 236 | } 237 | }, 238 | "node_modules/hast-util-phrasing": { 239 | "version": "2.0.0", 240 | "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-2.0.0.tgz", 241 | "integrity": "sha512-4rFSiFpdmTtp4aAxki6obpEbVJ85fOEN8/A8bOByoCaqRDTtd1AKTw3P/cXgVm0/RDuaWj0tSd1pTb0Jw5QfdA==", 242 | "dependencies": { 243 | "hast-util-embedded": "^2.0.0", 244 | "hast-util-has-property": "^2.0.0", 245 | "hast-util-is-body-ok-link": "^1.0.0", 246 | "hast-util-is-element": "^2.0.0" 247 | }, 248 | "funding": { 249 | "type": "opencollective", 250 | "url": "https://opencollective.com/unified" 251 | } 252 | }, 253 | "node_modules/hast-util-to-html": { 254 | "version": "8.0.2", 255 | "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.2.tgz", 256 | "integrity": "sha512-ipLhUTMyyJi9F/LXaNDG9BrRdshP6obCfmUZYbE/+T639IdzqAOkKN4DyrEyID0gbb+rsC3PKf0XlviZwzomhw==", 257 | "dependencies": { 258 | "@types/hast": "^2.0.0", 259 | "ccount": "^2.0.0", 260 | "comma-separated-tokens": "^2.0.0", 261 | "hast-util-is-element": "^2.0.0", 262 | "hast-util-whitespace": "^2.0.0", 263 | "html-void-elements": "^2.0.0", 264 | "property-information": "^6.0.0", 265 | "space-separated-tokens": "^2.0.0", 266 | "stringify-entities": "^4.0.0", 267 | "unist-util-is": "^5.0.0" 268 | }, 269 | "funding": { 270 | "type": "opencollective", 271 | "url": "https://opencollective.com/unified" 272 | } 273 | }, 274 | "node_modules/hast-util-whitespace": { 275 | "version": "2.0.0", 276 | "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", 277 | "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==", 278 | "funding": { 279 | "type": "opencollective", 280 | "url": "https://opencollective.com/unified" 281 | } 282 | }, 283 | "node_modules/hastscript": { 284 | "version": "7.0.1", 285 | "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.0.1.tgz", 286 | "integrity": "sha512-3Nww02NdnAoLZlI4mifLRYU9jZ1PrMD+eYnnW3RGVKlRD2bW+fNTvr1KLnET/DAf8c6CMlMblXVUhXJiGIKwDA==", 287 | "dependencies": { 288 | "@types/hast": "^2.0.0", 289 | "comma-separated-tokens": "^2.0.0", 290 | "hast-util-parse-selector": "^3.0.0", 291 | "property-information": "^6.0.0", 292 | "space-separated-tokens": "^2.0.0" 293 | }, 294 | "funding": { 295 | "type": "opencollective", 296 | "url": "https://opencollective.com/unified" 297 | } 298 | }, 299 | "node_modules/hastscript/node_modules/comma-separated-tokens": { 300 | "version": "2.0.2", 301 | "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", 302 | "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==", 303 | "funding": { 304 | "type": "github", 305 | "url": "https://github.com/sponsors/wooorm" 306 | } 307 | }, 308 | "node_modules/hastscript/node_modules/property-information": { 309 | "version": "6.0.1", 310 | "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.0.1.tgz", 311 | "integrity": "sha512-F4WUUAF7fMeF4/JUFHNBWDaKDXi2jbvqBW/y6o5wsf3j19wTZ7S60TmtB5HoBhtgw7NKQRMWuz5vk2PR0CygUg==", 312 | "funding": { 313 | "type": "github", 314 | "url": "https://github.com/sponsors/wooorm" 315 | } 316 | }, 317 | "node_modules/hastscript/node_modules/space-separated-tokens": { 318 | "version": "2.0.1", 319 | "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", 320 | "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==", 321 | "funding": { 322 | "type": "github", 323 | "url": "https://github.com/sponsors/wooorm" 324 | } 325 | }, 326 | "node_modules/html-void-elements": { 327 | "version": "2.0.0", 328 | "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.0.tgz", 329 | "integrity": "sha512-4OYzQQsBt0G9bJ/nM9/DDsjm4+fVdzAaPJJcWk5QwA3GIAPxQEeOR0rsI8HbDHQz5Gta8pVvGnnTNSbZVEVvkQ==", 330 | "funding": { 331 | "type": "github", 332 | "url": "https://github.com/sponsors/wooorm" 333 | } 334 | }, 335 | "node_modules/html-whitespace-sensitive-tag-names": { 336 | "version": "2.0.0", 337 | "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-2.0.0.tgz", 338 | "integrity": "sha512-SQdIvTTtnHAx72xGUIUudvVOCjeWvV1U7rvSFnNGxTGRw3ZC7RES4Gw6dm1nMYD60TXvm6zjk/bWqgNc5pjQaw==", 339 | "funding": { 340 | "type": "opencollective", 341 | "url": "https://opencollective.com/unified" 342 | } 343 | }, 344 | "node_modules/is-alphabetical": { 345 | "version": "2.0.0", 346 | "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.0.tgz", 347 | "integrity": "sha512-5OV8Toyq3oh4eq6sbWTYzlGdnMT/DPI5I0zxUBxjiigQsZycpkKF3kskkao3JyYGuYDHvhgJF+DrjMQp9SX86w==", 348 | "funding": { 349 | "type": "github", 350 | "url": "https://github.com/sponsors/wooorm" 351 | } 352 | }, 353 | "node_modules/is-alphanumerical": { 354 | "version": "2.0.0", 355 | "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.0.tgz", 356 | "integrity": "sha512-t+2GlJ+hO9yagJ+jU3+HSh80VKvz/3cG2cxbGGm4S0hjKuhWQXgPVUVOZz3tqZzMjhmphZ+1TIJTlRZRoe6GCQ==", 357 | "dependencies": { 358 | "is-alphabetical": "^2.0.0", 359 | "is-decimal": "^2.0.0" 360 | }, 361 | "funding": { 362 | "type": "github", 363 | "url": "https://github.com/sponsors/wooorm" 364 | } 365 | }, 366 | "node_modules/is-buffer": { 367 | "version": "2.0.5", 368 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", 369 | "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", 370 | "funding": [ 371 | { 372 | "type": "github", 373 | "url": "https://github.com/sponsors/feross" 374 | }, 375 | { 376 | "type": "patreon", 377 | "url": "https://www.patreon.com/feross" 378 | }, 379 | { 380 | "type": "consulting", 381 | "url": "https://feross.org/support" 382 | } 383 | ], 384 | "engines": { 385 | "node": ">=4" 386 | } 387 | }, 388 | "node_modules/is-decimal": { 389 | "version": "2.0.0", 390 | "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.0.tgz", 391 | "integrity": "sha512-QfrfjQV0LjoWQ1K1XSoEZkTAzSa14RKVMa5zg3SdAfzEmQzRM4+tbSFWb78creCeA9rNBzaZal92opi1TwPWZw==", 392 | "funding": { 393 | "type": "github", 394 | "url": "https://github.com/sponsors/wooorm" 395 | } 396 | }, 397 | "node_modules/is-hexadecimal": { 398 | "version": "2.0.0", 399 | "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.0.tgz", 400 | "integrity": "sha512-vGOtYkiaxwIiR0+Ng/zNId+ZZehGfINwTzdrDqc6iubbnQWhnPuYymOzOKUDqa2cSl59yHnEh2h6MvRLQsyNug==", 401 | "funding": { 402 | "type": "github", 403 | "url": "https://github.com/sponsors/wooorm" 404 | } 405 | }, 406 | "node_modules/is-plain-obj": { 407 | "version": "4.0.0", 408 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", 409 | "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==", 410 | "engines": { 411 | "node": ">=12" 412 | }, 413 | "funding": { 414 | "url": "https://github.com/sponsors/sindresorhus" 415 | } 416 | }, 417 | "node_modules/mdast-util-definitions": { 418 | "version": "5.1.0", 419 | "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.0.tgz", 420 | "integrity": "sha512-5hcR7FL2EuZ4q6lLMUK5w4lHT2H3vqL9quPvYZ/Ku5iifrirfMHiGdhxdXMUbUkDmz5I+TYMd7nbaxUhbQkfpQ==", 421 | "dependencies": { 422 | "@types/mdast": "^3.0.0", 423 | "@types/unist": "^2.0.0", 424 | "unist-util-visit": "^3.0.0" 425 | }, 426 | "funding": { 427 | "type": "opencollective", 428 | "url": "https://opencollective.com/unified" 429 | } 430 | }, 431 | "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { 432 | "version": "3.1.0", 433 | "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", 434 | "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", 435 | "dependencies": { 436 | "@types/unist": "^2.0.0", 437 | "unist-util-is": "^5.0.0", 438 | "unist-util-visit-parents": "^4.0.0" 439 | }, 440 | "funding": { 441 | "type": "opencollective", 442 | "url": "https://opencollective.com/unified" 443 | } 444 | }, 445 | "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { 446 | "version": "4.1.1", 447 | "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", 448 | "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", 449 | "dependencies": { 450 | "@types/unist": "^2.0.0", 451 | "unist-util-is": "^5.0.0" 452 | }, 453 | "funding": { 454 | "type": "opencollective", 455 | "url": "https://opencollective.com/unified" 456 | } 457 | }, 458 | "node_modules/mdast-util-from-markdown": { 459 | "version": "1.0.0", 460 | "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.0.0.tgz", 461 | "integrity": "sha512-uj2G60sb7z1PNOeElFwCC9b/Se/lFXuLhVKFOAY2EHz/VvgbupTQRNXPoZl7rGpXYL6BNZgcgaybrlSWbo7n/g==", 462 | "dependencies": { 463 | "@types/mdast": "^3.0.0", 464 | "@types/unist": "^2.0.0", 465 | "mdast-util-to-string": "^3.0.0", 466 | "micromark": "^3.0.0", 467 | "micromark-util-decode-numeric-character-reference": "^1.0.0", 468 | "micromark-util-normalize-identifier": "^1.0.0", 469 | "micromark-util-symbol": "^1.0.0", 470 | "micromark-util-types": "^1.0.0", 471 | "parse-entities": "^3.0.0", 472 | "unist-util-stringify-position": "^3.0.0" 473 | }, 474 | "funding": { 475 | "type": "opencollective", 476 | "url": "https://opencollective.com/unified" 477 | } 478 | }, 479 | "node_modules/mdast-util-to-hast": { 480 | "version": "12.1.0", 481 | "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.1.0.tgz", 482 | "integrity": "sha512-dHfCt9Yh05AXEeghoziB3DjJV8oCIKdQmBJOPoAT1NlgMDBy+/MQn7Pxfq0jI8YRO1IfzcnmA/OU3FVVn/E5Sg==", 483 | "dependencies": { 484 | "@types/hast": "^2.0.0", 485 | "@types/mdast": "^3.0.0", 486 | "@types/mdurl": "^1.0.0", 487 | "mdast-util-definitions": "^5.0.0", 488 | "mdurl": "^1.0.0", 489 | "micromark-util-sanitize-uri": "^1.0.0", 490 | "unist-builder": "^3.0.0", 491 | "unist-util-generated": "^2.0.0", 492 | "unist-util-position": "^4.0.0", 493 | "unist-util-visit": "^4.0.0" 494 | }, 495 | "funding": { 496 | "type": "opencollective", 497 | "url": "https://opencollective.com/unified" 498 | } 499 | }, 500 | "node_modules/mdast-util-to-string": { 501 | "version": "3.1.0", 502 | "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", 503 | "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", 504 | "funding": { 505 | "type": "opencollective", 506 | "url": "https://opencollective.com/unified" 507 | } 508 | }, 509 | "node_modules/mdurl": { 510 | "version": "1.0.1", 511 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", 512 | "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" 513 | }, 514 | "node_modules/micromark": { 515 | "version": "3.0.3", 516 | "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.0.3.tgz", 517 | "integrity": "sha512-fWuHx+JKV4zA8WfCFor2DWP9XmsZkIiyWRGofr7P7IGfpRIlb7/C5wwusGsNyr1D8HI5arghZDG1Ikc0FBwS5Q==", 518 | "funding": [ 519 | { 520 | "type": "GitHub Sponsors", 521 | "url": "https://github.com/sponsors/unifiedjs" 522 | }, 523 | { 524 | "type": "OpenCollective", 525 | "url": "https://opencollective.com/unified" 526 | } 527 | ], 528 | "dependencies": { 529 | "@types/debug": "^4.0.0", 530 | "debug": "^4.0.0", 531 | "micromark-core-commonmark": "^1.0.0", 532 | "micromark-factory-space": "^1.0.0", 533 | "micromark-util-character": "^1.0.0", 534 | "micromark-util-chunked": "^1.0.0", 535 | "micromark-util-combine-extensions": "^1.0.0", 536 | "micromark-util-decode-numeric-character-reference": "^1.0.0", 537 | "micromark-util-encode": "^1.0.0", 538 | "micromark-util-normalize-identifier": "^1.0.0", 539 | "micromark-util-resolve-all": "^1.0.0", 540 | "micromark-util-sanitize-uri": "^1.0.0", 541 | "micromark-util-subtokenize": "^1.0.0", 542 | "micromark-util-symbol": "^1.0.0", 543 | "micromark-util-types": "^1.0.0", 544 | "parse-entities": "^3.0.0" 545 | } 546 | }, 547 | "node_modules/micromark-core-commonmark": { 548 | "version": "1.0.0", 549 | "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.0.tgz", 550 | "integrity": "sha512-y9g7zymcKRBHM/aNBekstvs/Grpf+y4OEBULUTYvGZcusnp+JeOxmilJY4GMpo2/xY7iHQL9fjz5pD9pSAud9A==", 551 | "funding": [ 552 | { 553 | "type": "GitHub Sponsors", 554 | "url": "https://github.com/sponsors/unifiedjs" 555 | }, 556 | { 557 | "type": "OpenCollective", 558 | "url": "https://opencollective.com/unified" 559 | } 560 | ], 561 | "dependencies": { 562 | "micromark-factory-destination": "^1.0.0", 563 | "micromark-factory-label": "^1.0.0", 564 | "micromark-factory-space": "^1.0.0", 565 | "micromark-factory-title": "^1.0.0", 566 | "micromark-factory-whitespace": "^1.0.0", 567 | "micromark-util-character": "^1.0.0", 568 | "micromark-util-chunked": "^1.0.0", 569 | "micromark-util-classify-character": "^1.0.0", 570 | "micromark-util-html-tag-name": "^1.0.0", 571 | "micromark-util-normalize-identifier": "^1.0.0", 572 | "micromark-util-resolve-all": "^1.0.0", 573 | "micromark-util-subtokenize": "^1.0.0", 574 | "micromark-util-symbol": "^1.0.0", 575 | "micromark-util-types": "^1.0.0", 576 | "parse-entities": "^3.0.0" 577 | } 578 | }, 579 | "node_modules/micromark-factory-destination": { 580 | "version": "1.0.0", 581 | "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", 582 | "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", 583 | "funding": [ 584 | { 585 | "type": "GitHub Sponsors", 586 | "url": "https://github.com/sponsors/unifiedjs" 587 | }, 588 | { 589 | "type": "OpenCollective", 590 | "url": "https://opencollective.com/unified" 591 | } 592 | ], 593 | "dependencies": { 594 | "micromark-util-character": "^1.0.0", 595 | "micromark-util-symbol": "^1.0.0", 596 | "micromark-util-types": "^1.0.0" 597 | } 598 | }, 599 | "node_modules/micromark-factory-label": { 600 | "version": "1.0.0", 601 | "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.0.tgz", 602 | "integrity": "sha512-XWEucVZb+qBCe2jmlOnWr6sWSY6NHx+wtpgYFsm4G+dufOf6tTQRRo0bdO7XSlGPu5fyjpJenth6Ksnc5Mwfww==", 603 | "funding": [ 604 | { 605 | "type": "GitHub Sponsors", 606 | "url": "https://github.com/sponsors/unifiedjs" 607 | }, 608 | { 609 | "type": "OpenCollective", 610 | "url": "https://opencollective.com/unified" 611 | } 612 | ], 613 | "dependencies": { 614 | "micromark-util-character": "^1.0.0", 615 | "micromark-util-symbol": "^1.0.0", 616 | "micromark-util-types": "^1.0.0" 617 | } 618 | }, 619 | "node_modules/micromark-factory-space": { 620 | "version": "1.0.0", 621 | "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", 622 | "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", 623 | "funding": [ 624 | { 625 | "type": "GitHub Sponsors", 626 | "url": "https://github.com/sponsors/unifiedjs" 627 | }, 628 | { 629 | "type": "OpenCollective", 630 | "url": "https://opencollective.com/unified" 631 | } 632 | ], 633 | "dependencies": { 634 | "micromark-util-character": "^1.0.0", 635 | "micromark-util-types": "^1.0.0" 636 | } 637 | }, 638 | "node_modules/micromark-factory-title": { 639 | "version": "1.0.0", 640 | "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.0.tgz", 641 | "integrity": "sha512-flvC7Gx0dWVWorXuBl09Cr3wB5FTuYec8pMGVySIp2ZlqTcIjN/lFohZcP0EG//krTptm34kozHk7aK/CleCfA==", 642 | "funding": [ 643 | { 644 | "type": "GitHub Sponsors", 645 | "url": "https://github.com/sponsors/unifiedjs" 646 | }, 647 | { 648 | "type": "OpenCollective", 649 | "url": "https://opencollective.com/unified" 650 | } 651 | ], 652 | "dependencies": { 653 | "micromark-factory-space": "^1.0.0", 654 | "micromark-util-character": "^1.0.0", 655 | "micromark-util-symbol": "^1.0.0", 656 | "micromark-util-types": "^1.0.0" 657 | } 658 | }, 659 | "node_modules/micromark-factory-whitespace": { 660 | "version": "1.0.0", 661 | "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", 662 | "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", 663 | "funding": [ 664 | { 665 | "type": "GitHub Sponsors", 666 | "url": "https://github.com/sponsors/unifiedjs" 667 | }, 668 | { 669 | "type": "OpenCollective", 670 | "url": "https://opencollective.com/unified" 671 | } 672 | ], 673 | "dependencies": { 674 | "micromark-factory-space": "^1.0.0", 675 | "micromark-util-character": "^1.0.0", 676 | "micromark-util-symbol": "^1.0.0", 677 | "micromark-util-types": "^1.0.0" 678 | } 679 | }, 680 | "node_modules/micromark-util-character": { 681 | "version": "1.1.0", 682 | "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", 683 | "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", 684 | "funding": [ 685 | { 686 | "type": "GitHub Sponsors", 687 | "url": "https://github.com/sponsors/unifiedjs" 688 | }, 689 | { 690 | "type": "OpenCollective", 691 | "url": "https://opencollective.com/unified" 692 | } 693 | ], 694 | "dependencies": { 695 | "micromark-util-symbol": "^1.0.0", 696 | "micromark-util-types": "^1.0.0" 697 | } 698 | }, 699 | "node_modules/micromark-util-chunked": { 700 | "version": "1.0.0", 701 | "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", 702 | "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", 703 | "funding": [ 704 | { 705 | "type": "GitHub Sponsors", 706 | "url": "https://github.com/sponsors/unifiedjs" 707 | }, 708 | { 709 | "type": "OpenCollective", 710 | "url": "https://opencollective.com/unified" 711 | } 712 | ], 713 | "dependencies": { 714 | "micromark-util-symbol": "^1.0.0" 715 | } 716 | }, 717 | "node_modules/micromark-util-classify-character": { 718 | "version": "1.0.0", 719 | "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", 720 | "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", 721 | "funding": [ 722 | { 723 | "type": "GitHub Sponsors", 724 | "url": "https://github.com/sponsors/unifiedjs" 725 | }, 726 | { 727 | "type": "OpenCollective", 728 | "url": "https://opencollective.com/unified" 729 | } 730 | ], 731 | "dependencies": { 732 | "micromark-util-character": "^1.0.0", 733 | "micromark-util-symbol": "^1.0.0", 734 | "micromark-util-types": "^1.0.0" 735 | } 736 | }, 737 | "node_modules/micromark-util-combine-extensions": { 738 | "version": "1.0.0", 739 | "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", 740 | "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", 741 | "funding": [ 742 | { 743 | "type": "GitHub Sponsors", 744 | "url": "https://github.com/sponsors/unifiedjs" 745 | }, 746 | { 747 | "type": "OpenCollective", 748 | "url": "https://opencollective.com/unified" 749 | } 750 | ], 751 | "dependencies": { 752 | "micromark-util-chunked": "^1.0.0", 753 | "micromark-util-types": "^1.0.0" 754 | } 755 | }, 756 | "node_modules/micromark-util-decode-numeric-character-reference": { 757 | "version": "1.0.0", 758 | "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", 759 | "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", 760 | "funding": [ 761 | { 762 | "type": "GitHub Sponsors", 763 | "url": "https://github.com/sponsors/unifiedjs" 764 | }, 765 | { 766 | "type": "OpenCollective", 767 | "url": "https://opencollective.com/unified" 768 | } 769 | ], 770 | "dependencies": { 771 | "micromark-util-symbol": "^1.0.0" 772 | } 773 | }, 774 | "node_modules/micromark-util-encode": { 775 | "version": "1.0.0", 776 | "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.0.tgz", 777 | "integrity": "sha512-cJpFVM768h6zkd8qJ1LNRrITfY4gwFt+tziPcIf71Ui8yFzY9wG3snZQqiWVq93PG4Sw6YOtcNiKJfVIs9qfGg==", 778 | "funding": [ 779 | { 780 | "type": "GitHub Sponsors", 781 | "url": "https://github.com/sponsors/unifiedjs" 782 | }, 783 | { 784 | "type": "OpenCollective", 785 | "url": "https://opencollective.com/unified" 786 | } 787 | ] 788 | }, 789 | "node_modules/micromark-util-html-tag-name": { 790 | "version": "1.0.0", 791 | "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz", 792 | "integrity": "sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g==", 793 | "funding": [ 794 | { 795 | "type": "GitHub Sponsors", 796 | "url": "https://github.com/sponsors/unifiedjs" 797 | }, 798 | { 799 | "type": "OpenCollective", 800 | "url": "https://opencollective.com/unified" 801 | } 802 | ] 803 | }, 804 | "node_modules/micromark-util-normalize-identifier": { 805 | "version": "1.0.0", 806 | "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", 807 | "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", 808 | "funding": [ 809 | { 810 | "type": "GitHub Sponsors", 811 | "url": "https://github.com/sponsors/unifiedjs" 812 | }, 813 | { 814 | "type": "OpenCollective", 815 | "url": "https://opencollective.com/unified" 816 | } 817 | ], 818 | "dependencies": { 819 | "micromark-util-symbol": "^1.0.0" 820 | } 821 | }, 822 | "node_modules/micromark-util-resolve-all": { 823 | "version": "1.0.0", 824 | "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", 825 | "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", 826 | "funding": [ 827 | { 828 | "type": "GitHub Sponsors", 829 | "url": "https://github.com/sponsors/unifiedjs" 830 | }, 831 | { 832 | "type": "OpenCollective", 833 | "url": "https://opencollective.com/unified" 834 | } 835 | ], 836 | "dependencies": { 837 | "micromark-util-types": "^1.0.0" 838 | } 839 | }, 840 | "node_modules/micromark-util-sanitize-uri": { 841 | "version": "1.0.0", 842 | "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz", 843 | "integrity": "sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==", 844 | "funding": [ 845 | { 846 | "type": "GitHub Sponsors", 847 | "url": "https://github.com/sponsors/unifiedjs" 848 | }, 849 | { 850 | "type": "OpenCollective", 851 | "url": "https://opencollective.com/unified" 852 | } 853 | ], 854 | "dependencies": { 855 | "micromark-util-character": "^1.0.0", 856 | "micromark-util-encode": "^1.0.0", 857 | "micromark-util-symbol": "^1.0.0" 858 | } 859 | }, 860 | "node_modules/micromark-util-subtokenize": { 861 | "version": "1.0.0", 862 | "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.0.tgz", 863 | "integrity": "sha512-EsnG2qscmcN5XhkqQBZni/4oQbLFjz9yk3ZM/P8a3YUjwV6+6On2wehr1ALx0MxK3+XXXLTzuBKHDFeDFYRdgQ==", 864 | "funding": [ 865 | { 866 | "type": "GitHub Sponsors", 867 | "url": "https://github.com/sponsors/unifiedjs" 868 | }, 869 | { 870 | "type": "OpenCollective", 871 | "url": "https://opencollective.com/unified" 872 | } 873 | ], 874 | "dependencies": { 875 | "micromark-util-chunked": "^1.0.0", 876 | "micromark-util-symbol": "^1.0.0", 877 | "micromark-util-types": "^1.0.0" 878 | } 879 | }, 880 | "node_modules/micromark-util-symbol": { 881 | "version": "1.0.0", 882 | "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.0.tgz", 883 | "integrity": "sha512-NZA01jHRNCt4KlOROn8/bGi6vvpEmlXld7EHcRH+aYWUfL3Wc8JLUNNlqUMKa0hhz6GrpUWsHtzPmKof57v0gQ==", 884 | "funding": [ 885 | { 886 | "type": "GitHub Sponsors", 887 | "url": "https://github.com/sponsors/unifiedjs" 888 | }, 889 | { 890 | "type": "OpenCollective", 891 | "url": "https://opencollective.com/unified" 892 | } 893 | ] 894 | }, 895 | "node_modules/micromark-util-types": { 896 | "version": "1.0.0", 897 | "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.0.tgz", 898 | "integrity": "sha512-psf1WAaP1B77WpW4mBGDkTr+3RsPuDAgsvlP47GJzbH1jmjH8xjOx7Z6kp84L8oqHmy5pYO3Ev46odosZV+3AA==", 899 | "funding": [ 900 | { 901 | "type": "GitHub Sponsors", 902 | "url": "https://github.com/sponsors/unifiedjs" 903 | }, 904 | { 905 | "type": "OpenCollective", 906 | "url": "https://opencollective.com/unified" 907 | } 908 | ] 909 | }, 910 | "node_modules/ms": { 911 | "version": "2.1.2", 912 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 913 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 914 | }, 915 | "node_modules/parse-entities": { 916 | "version": "3.0.0", 917 | "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-3.0.0.tgz", 918 | "integrity": "sha512-AJlcIFDNPEP33KyJLguv0xJc83BNvjxwpuUIcetyXUsLpVXAUCePJ5kIoYtEN2R1ac0cYaRu/vk9dVFkewHQhQ==", 919 | "dependencies": { 920 | "character-entities": "^2.0.0", 921 | "character-entities-legacy": "^2.0.0", 922 | "character-reference-invalid": "^2.0.0", 923 | "is-alphanumerical": "^2.0.0", 924 | "is-decimal": "^2.0.0", 925 | "is-hexadecimal": "^2.0.0" 926 | }, 927 | "funding": { 928 | "type": "github", 929 | "url": "https://github.com/sponsors/wooorm" 930 | } 931 | }, 932 | "node_modules/property-information": { 933 | "version": "6.0.1", 934 | "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.0.1.tgz", 935 | "integrity": "sha512-F4WUUAF7fMeF4/JUFHNBWDaKDXi2jbvqBW/y6o5wsf3j19wTZ7S60TmtB5HoBhtgw7NKQRMWuz5vk2PR0CygUg==", 936 | "funding": { 937 | "type": "github", 938 | "url": "https://github.com/sponsors/wooorm" 939 | } 940 | }, 941 | "node_modules/rehype-document": { 942 | "version": "6.1.0", 943 | "resolved": "https://registry.npmjs.org/rehype-document/-/rehype-document-6.1.0.tgz", 944 | "integrity": "sha512-znEODHIhSjfBlvFO6z9k/6z7lJor1hqqpYy15W5vj/VLxcWsCL22hBdDSai5tYOymmGOInDLvepmS+6MIIXjFg==", 945 | "dependencies": { 946 | "@types/hast": "^2.0.0", 947 | "hastscript": "^7.0.0", 948 | "unified": "^10.0.0" 949 | }, 950 | "funding": { 951 | "type": "opencollective", 952 | "url": "https://opencollective.com/unified" 953 | } 954 | }, 955 | "node_modules/rehype-format": { 956 | "version": "4.0.1", 957 | "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-4.0.1.tgz", 958 | "integrity": "sha512-HA92WeqFri00yiClrz54IIpM9no2DH9Mgy5aFmInNODoAYn+hN42a6oqJTIie2nj0HwFyV7JvOYx5YHBphN8mw==", 959 | "dependencies": { 960 | "@types/hast": "^2.0.0", 961 | "hast-util-embedded": "^2.0.0", 962 | "hast-util-is-element": "^2.0.0", 963 | "hast-util-phrasing": "^2.0.0", 964 | "hast-util-whitespace": "^2.0.0", 965 | "html-whitespace-sensitive-tag-names": "^2.0.0", 966 | "rehype-minify-whitespace": "^5.0.0", 967 | "unified": "^10.0.0", 968 | "unist-util-visit-parents": "^5.0.0" 969 | }, 970 | "funding": { 971 | "type": "opencollective", 972 | "url": "https://opencollective.com/unified" 973 | } 974 | }, 975 | "node_modules/rehype-minify-whitespace": { 976 | "version": "5.0.0", 977 | "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-5.0.0.tgz", 978 | "integrity": "sha512-cUkQldYx8jpWM6FZmCkOF/+mev09+5NAtBzUFZgnfXsIoglxo3h6t3S3JbNouiaqIDE6vbpI+GQpOg0xD3Z7kg==", 979 | "dependencies": { 980 | "@types/hast": "^2.0.0", 981 | "hast-util-embedded": "^2.0.0", 982 | "hast-util-is-element": "^2.0.0", 983 | "hast-util-whitespace": "^2.0.0", 984 | "unified": "^10.0.0", 985 | "unist-util-is": "^5.0.0" 986 | }, 987 | "funding": { 988 | "type": "opencollective", 989 | "url": "https://opencollective.com/unified" 990 | } 991 | }, 992 | "node_modules/rehype-stringify": { 993 | "version": "9.0.3", 994 | "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", 995 | "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", 996 | "dependencies": { 997 | "@types/hast": "^2.0.0", 998 | "hast-util-to-html": "^8.0.0", 999 | "unified": "^10.0.0" 1000 | }, 1001 | "funding": { 1002 | "type": "opencollective", 1003 | "url": "https://opencollective.com/unified" 1004 | } 1005 | }, 1006 | "node_modules/remark-parse": { 1007 | "version": "10.0.1", 1008 | "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", 1009 | "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", 1010 | "dependencies": { 1011 | "@types/mdast": "^3.0.0", 1012 | "mdast-util-from-markdown": "^1.0.0", 1013 | "unified": "^10.0.0" 1014 | }, 1015 | "funding": { 1016 | "type": "opencollective", 1017 | "url": "https://opencollective.com/unified" 1018 | } 1019 | }, 1020 | "node_modules/remark-rehype": { 1021 | "version": "10.1.0", 1022 | "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", 1023 | "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", 1024 | "dependencies": { 1025 | "@types/hast": "^2.0.0", 1026 | "@types/mdast": "^3.0.0", 1027 | "mdast-util-to-hast": "^12.1.0", 1028 | "unified": "^10.0.0" 1029 | }, 1030 | "funding": { 1031 | "type": "opencollective", 1032 | "url": "https://opencollective.com/unified" 1033 | } 1034 | }, 1035 | "node_modules/space-separated-tokens": { 1036 | "version": "2.0.1", 1037 | "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", 1038 | "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==", 1039 | "funding": { 1040 | "type": "github", 1041 | "url": "https://github.com/sponsors/wooorm" 1042 | } 1043 | }, 1044 | "node_modules/stringify-entities": { 1045 | "version": "4.0.1", 1046 | "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.1.tgz", 1047 | "integrity": "sha512-gmMQxKXPWIO3NXNSPyWNhlYcBNGpPA/487D+9dLPnU4xBnIrnHdr8cv5rGJOS/1BRxEXRb7uKwg7BA36IWV7xg==", 1048 | "dependencies": { 1049 | "character-entities-html4": "^2.0.0", 1050 | "character-entities-legacy": "^2.0.0" 1051 | }, 1052 | "funding": { 1053 | "type": "github", 1054 | "url": "https://github.com/sponsors/wooorm" 1055 | } 1056 | }, 1057 | "node_modules/trough": { 1058 | "version": "2.0.2", 1059 | "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz", 1060 | "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==", 1061 | "funding": { 1062 | "type": "github", 1063 | "url": "https://github.com/sponsors/wooorm" 1064 | } 1065 | }, 1066 | "node_modules/typescript": { 1067 | "version": "4.8.2", 1068 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", 1069 | "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", 1070 | "dev": true, 1071 | "bin": { 1072 | "tsc": "bin/tsc", 1073 | "tsserver": "bin/tsserver" 1074 | }, 1075 | "engines": { 1076 | "node": ">=4.2.0" 1077 | } 1078 | }, 1079 | "node_modules/unified": { 1080 | "version": "10.1.1", 1081 | "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.1.tgz", 1082 | "integrity": "sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w==", 1083 | "dependencies": { 1084 | "@types/unist": "^2.0.0", 1085 | "bail": "^2.0.0", 1086 | "extend": "^3.0.0", 1087 | "is-buffer": "^2.0.0", 1088 | "is-plain-obj": "^4.0.0", 1089 | "trough": "^2.0.0", 1090 | "vfile": "^5.0.0" 1091 | }, 1092 | "funding": { 1093 | "type": "opencollective", 1094 | "url": "https://opencollective.com/unified" 1095 | } 1096 | }, 1097 | "node_modules/unified-stream": { 1098 | "version": "2.0.0", 1099 | "resolved": "https://registry.npmjs.org/unified-stream/-/unified-stream-2.0.0.tgz", 1100 | "integrity": "sha512-KdwODjgqGsTbHMLqm57qLxNAkbCboD5EMPC4BULs/9iy5ZTsw3xgc0BUjeCmABt/yfZt0k7rgkBLcdiZ8LwZug==", 1101 | "dependencies": { 1102 | "unified": "^10.0.0", 1103 | "vfile": "^5.0.0" 1104 | }, 1105 | "funding": { 1106 | "type": "opencollective", 1107 | "url": "https://opencollective.com/unified" 1108 | } 1109 | }, 1110 | "node_modules/unist-builder": { 1111 | "version": "3.0.0", 1112 | "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.0.tgz", 1113 | "integrity": "sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==", 1114 | "dependencies": { 1115 | "@types/unist": "^2.0.0" 1116 | }, 1117 | "funding": { 1118 | "type": "opencollective", 1119 | "url": "https://opencollective.com/unified" 1120 | } 1121 | }, 1122 | "node_modules/unist-util-generated": { 1123 | "version": "2.0.0", 1124 | "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.0.tgz", 1125 | "integrity": "sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==", 1126 | "funding": { 1127 | "type": "opencollective", 1128 | "url": "https://opencollective.com/unified" 1129 | } 1130 | }, 1131 | "node_modules/unist-util-is": { 1132 | "version": "5.1.1", 1133 | "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", 1134 | "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", 1135 | "funding": { 1136 | "type": "opencollective", 1137 | "url": "https://opencollective.com/unified" 1138 | } 1139 | }, 1140 | "node_modules/unist-util-position": { 1141 | "version": "4.0.1", 1142 | "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.1.tgz", 1143 | "integrity": "sha512-mgy/zI9fQ2HlbOtTdr2w9lhVaiFUHWQnZrFF2EUoVOqtAUdzqMtNiD99qA5a1IcjWVR8O6aVYE9u7Z2z1v0SQA==", 1144 | "funding": { 1145 | "type": "opencollective", 1146 | "url": "https://opencollective.com/unified" 1147 | } 1148 | }, 1149 | "node_modules/unist-util-stringify-position": { 1150 | "version": "3.0.0", 1151 | "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz", 1152 | "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==", 1153 | "dependencies": { 1154 | "@types/unist": "^2.0.0" 1155 | }, 1156 | "funding": { 1157 | "type": "opencollective", 1158 | "url": "https://opencollective.com/unified" 1159 | } 1160 | }, 1161 | "node_modules/unist-util-visit": { 1162 | "version": "4.1.0", 1163 | "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.0.tgz", 1164 | "integrity": "sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==", 1165 | "dependencies": { 1166 | "@types/unist": "^2.0.0", 1167 | "unist-util-is": "^5.0.0", 1168 | "unist-util-visit-parents": "^5.0.0" 1169 | }, 1170 | "funding": { 1171 | "type": "opencollective", 1172 | "url": "https://opencollective.com/unified" 1173 | } 1174 | }, 1175 | "node_modules/unist-util-visit-parents": { 1176 | "version": "5.0.0", 1177 | "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.0.0.tgz", 1178 | "integrity": "sha512-CVaLOYPM/EaFTYMytbaju3Tw4QI3DHnHFnL358FkEu0hZOzSm/hqBdVwOQDR60jF5ZzhB1tlZlRH0ll/yekZIQ==", 1179 | "dependencies": { 1180 | "@types/unist": "^2.0.0", 1181 | "unist-util-is": "^5.0.0" 1182 | }, 1183 | "funding": { 1184 | "type": "opencollective", 1185 | "url": "https://opencollective.com/unified" 1186 | } 1187 | }, 1188 | "node_modules/vfile": { 1189 | "version": "5.0.2", 1190 | "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.0.2.tgz", 1191 | "integrity": "sha512-5cV+K7tX83MT3bievROc+7AvHv0GXDB0zqbrTjbOe+HRbkzvY4EP+wS3IR77kUBCoWFMdG9py18t0sesPtQ1Rw==", 1192 | "dependencies": { 1193 | "@types/unist": "^2.0.0", 1194 | "is-buffer": "^2.0.0", 1195 | "unist-util-stringify-position": "^3.0.0", 1196 | "vfile-message": "^3.0.0" 1197 | }, 1198 | "funding": { 1199 | "type": "opencollective", 1200 | "url": "https://opencollective.com/unified" 1201 | } 1202 | }, 1203 | "node_modules/vfile-message": { 1204 | "version": "3.0.1", 1205 | "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.1.tgz", 1206 | "integrity": "sha512-gYmSHcZZUEtYpTmaWaFJwsuUD70/rTY4v09COp8TGtOkix6gGxb/a8iTQByIY9ciTk9GwAwIXd/J9OPfM4Bvaw==", 1207 | "dependencies": { 1208 | "@types/unist": "^2.0.0", 1209 | "unist-util-stringify-position": "^3.0.0" 1210 | }, 1211 | "funding": { 1212 | "type": "opencollective", 1213 | "url": "https://opencollective.com/unified" 1214 | } 1215 | } 1216 | }, 1217 | "dependencies": { 1218 | "@types/debug": { 1219 | "version": "4.1.7", 1220 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", 1221 | "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", 1222 | "requires": { 1223 | "@types/ms": "*" 1224 | } 1225 | }, 1226 | "@types/hast": { 1227 | "version": "2.3.2", 1228 | "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.2.tgz", 1229 | "integrity": "sha512-Op5W7jYgZI7AWKY5wQ0/QNMzQM7dGQPyW1rXKNiymVCy5iTfdPuGu4HhYNOM2sIv8gUfIuIdcYlXmAepwaowow==", 1230 | "requires": { 1231 | "@types/unist": "*" 1232 | } 1233 | }, 1234 | "@types/mdast": { 1235 | "version": "3.0.3", 1236 | "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", 1237 | "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", 1238 | "requires": { 1239 | "@types/unist": "*" 1240 | } 1241 | }, 1242 | "@types/mdurl": { 1243 | "version": "1.0.2", 1244 | "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", 1245 | "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" 1246 | }, 1247 | "@types/ms": { 1248 | "version": "0.7.31", 1249 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", 1250 | "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" 1251 | }, 1252 | "@types/node": { 1253 | "version": "17.0.23", 1254 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", 1255 | "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", 1256 | "dev": true 1257 | }, 1258 | "@types/unist": { 1259 | "version": "2.0.3", 1260 | "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", 1261 | "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" 1262 | }, 1263 | "@vercel/build-utils": { 1264 | "version": "5.5.5", 1265 | "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-5.5.5.tgz", 1266 | "integrity": "sha512-ZBJpqnqm2OqYyWEqfRn0CYvlmSdOf/igtFy58x0bvSbJdN6Dx2rEw9sNg8SU7O/+zWpKP5rRfWcT6iql/p0sCg==", 1267 | "dev": true 1268 | }, 1269 | "bail": { 1270 | "version": "2.0.1", 1271 | "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.1.tgz", 1272 | "integrity": "sha512-d5FoTAr2S5DSUPKl85WNm2yUwsINN8eidIdIwsOge2t33DaOfOdSmmsI11jMN3GmALCXaw+Y6HMVHDzePshFAA==" 1273 | }, 1274 | "ccount": { 1275 | "version": "2.0.0", 1276 | "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.0.tgz", 1277 | "integrity": "sha512-VOR0NWFYX65n9gELQdcpqsie5L5ihBXuZGAgaPEp/U7IOSjnPMEH6geE+2f6lcekaNEfWzAHS45mPvSo5bqsUA==" 1278 | }, 1279 | "character-entities": { 1280 | "version": "2.0.0", 1281 | "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.0.tgz", 1282 | "integrity": "sha512-oHqMj3eAuJ77/P5PaIRcqk+C3hdfNwyCD2DAUcD5gyXkegAuF2USC40CEqPscDk4I8FRGMTojGJQkXDsN5QlJA==" 1283 | }, 1284 | "character-entities-html4": { 1285 | "version": "2.0.0", 1286 | "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.0.0.tgz", 1287 | "integrity": "sha512-dwT2xh5ZhUAjyP96k57ilMKoTQyASaw9IAMR9U5c1lCu2RUni6O6jxfpUEdO2RcPT6TJFvr8pqsbami4Jk+2oA==" 1288 | }, 1289 | "character-entities-legacy": { 1290 | "version": "2.0.0", 1291 | "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-2.0.0.tgz", 1292 | "integrity": "sha512-YwaEtEvWLpFa6Wh3uVLrvirA/ahr9fki/NUd/Bd4OR6EdJ8D22hovYQEOUCBfQfcqnC4IAMGMsHXY1eXgL4ZZA==" 1293 | }, 1294 | "character-reference-invalid": { 1295 | "version": "2.0.0", 1296 | "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.0.tgz", 1297 | "integrity": "sha512-pE3Z15lLRxDzWJy7bBHBopRwfI20sbrMVLQTC7xsPglCHf4Wv1e167OgYAFP78co2XlhojDyAqA+IAJse27//g==" 1298 | }, 1299 | "comma-separated-tokens": { 1300 | "version": "2.0.2", 1301 | "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", 1302 | "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" 1303 | }, 1304 | "debug": { 1305 | "version": "4.3.2", 1306 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 1307 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 1308 | "requires": { 1309 | "ms": "2.1.2" 1310 | } 1311 | }, 1312 | "extend": { 1313 | "version": "3.0.2", 1314 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1315 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 1316 | }, 1317 | "hast-util-embedded": { 1318 | "version": "2.0.0", 1319 | "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-2.0.0.tgz", 1320 | "integrity": "sha512-vEr54rDu2CheBM4nLkWbW8Rycf8HhkA/KsrDnlyKnvBTyhyO+vAG6twHnfUbiRGo56YeUBNCI4HFfHg3Wu+tig==", 1321 | "requires": { 1322 | "hast-util-is-element": "^2.0.0" 1323 | } 1324 | }, 1325 | "hast-util-has-property": { 1326 | "version": "2.0.0", 1327 | "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.0.tgz", 1328 | "integrity": "sha512-4Qf++8o5v14us4Muv3HRj+Er6wTNGA/N9uCaZMty4JWvyFKLdhULrv4KE1b65AthsSO9TXSZnjuxS8ecIyhb0w==" 1329 | }, 1330 | "hast-util-is-body-ok-link": { 1331 | "version": "1.0.4", 1332 | "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-1.0.4.tgz", 1333 | "integrity": "sha512-mFblNpLvFbD8dG2Nw5dJBYZkxIHeph1JAh5yr4huI7T5m8cV0zaXNiqzKPX/JdjA+tIDF7c33u9cxK132KRjyQ==", 1334 | "requires": { 1335 | "hast-util-has-property": "^1.0.0", 1336 | "hast-util-is-element": "^1.0.0" 1337 | }, 1338 | "dependencies": { 1339 | "hast-util-has-property": { 1340 | "version": "1.0.4", 1341 | "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz", 1342 | "integrity": "sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg==" 1343 | }, 1344 | "hast-util-is-element": { 1345 | "version": "1.1.0", 1346 | "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", 1347 | "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==" 1348 | } 1349 | } 1350 | }, 1351 | "hast-util-is-element": { 1352 | "version": "2.1.1", 1353 | "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.1.tgz", 1354 | "integrity": "sha512-ag0fiZfRWsPiR1udvnSbaazJLGv8qd8E+/e3rW8rUZhbKG4HNJmFL4QkEceN+22BgE+uozXY30z/s+2dL6Z++g==", 1355 | "requires": { 1356 | "@types/hast": "^2.0.0", 1357 | "@types/unist": "^2.0.0" 1358 | } 1359 | }, 1360 | "hast-util-parse-selector": { 1361 | "version": "3.1.0", 1362 | "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz", 1363 | "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", 1364 | "requires": { 1365 | "@types/hast": "^2.0.0" 1366 | } 1367 | }, 1368 | "hast-util-phrasing": { 1369 | "version": "2.0.0", 1370 | "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-2.0.0.tgz", 1371 | "integrity": "sha512-4rFSiFpdmTtp4aAxki6obpEbVJ85fOEN8/A8bOByoCaqRDTtd1AKTw3P/cXgVm0/RDuaWj0tSd1pTb0Jw5QfdA==", 1372 | "requires": { 1373 | "hast-util-embedded": "^2.0.0", 1374 | "hast-util-has-property": "^2.0.0", 1375 | "hast-util-is-body-ok-link": "^1.0.0", 1376 | "hast-util-is-element": "^2.0.0" 1377 | } 1378 | }, 1379 | "hast-util-to-html": { 1380 | "version": "8.0.2", 1381 | "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.2.tgz", 1382 | "integrity": "sha512-ipLhUTMyyJi9F/LXaNDG9BrRdshP6obCfmUZYbE/+T639IdzqAOkKN4DyrEyID0gbb+rsC3PKf0XlviZwzomhw==", 1383 | "requires": { 1384 | "@types/hast": "^2.0.0", 1385 | "ccount": "^2.0.0", 1386 | "comma-separated-tokens": "^2.0.0", 1387 | "hast-util-is-element": "^2.0.0", 1388 | "hast-util-whitespace": "^2.0.0", 1389 | "html-void-elements": "^2.0.0", 1390 | "property-information": "^6.0.0", 1391 | "space-separated-tokens": "^2.0.0", 1392 | "stringify-entities": "^4.0.0", 1393 | "unist-util-is": "^5.0.0" 1394 | } 1395 | }, 1396 | "hast-util-whitespace": { 1397 | "version": "2.0.0", 1398 | "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", 1399 | "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==" 1400 | }, 1401 | "hastscript": { 1402 | "version": "7.0.1", 1403 | "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.0.1.tgz", 1404 | "integrity": "sha512-3Nww02NdnAoLZlI4mifLRYU9jZ1PrMD+eYnnW3RGVKlRD2bW+fNTvr1KLnET/DAf8c6CMlMblXVUhXJiGIKwDA==", 1405 | "requires": { 1406 | "@types/hast": "^2.0.0", 1407 | "comma-separated-tokens": "^2.0.0", 1408 | "hast-util-parse-selector": "^3.0.0", 1409 | "property-information": "^6.0.0", 1410 | "space-separated-tokens": "^2.0.0" 1411 | }, 1412 | "dependencies": { 1413 | "comma-separated-tokens": { 1414 | "version": "2.0.2", 1415 | "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", 1416 | "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" 1417 | }, 1418 | "property-information": { 1419 | "version": "6.0.1", 1420 | "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.0.1.tgz", 1421 | "integrity": "sha512-F4WUUAF7fMeF4/JUFHNBWDaKDXi2jbvqBW/y6o5wsf3j19wTZ7S60TmtB5HoBhtgw7NKQRMWuz5vk2PR0CygUg==" 1422 | }, 1423 | "space-separated-tokens": { 1424 | "version": "2.0.1", 1425 | "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", 1426 | "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" 1427 | } 1428 | } 1429 | }, 1430 | "html-void-elements": { 1431 | "version": "2.0.0", 1432 | "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.0.tgz", 1433 | "integrity": "sha512-4OYzQQsBt0G9bJ/nM9/DDsjm4+fVdzAaPJJcWk5QwA3GIAPxQEeOR0rsI8HbDHQz5Gta8pVvGnnTNSbZVEVvkQ==" 1434 | }, 1435 | "html-whitespace-sensitive-tag-names": { 1436 | "version": "2.0.0", 1437 | "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-2.0.0.tgz", 1438 | "integrity": "sha512-SQdIvTTtnHAx72xGUIUudvVOCjeWvV1U7rvSFnNGxTGRw3ZC7RES4Gw6dm1nMYD60TXvm6zjk/bWqgNc5pjQaw==" 1439 | }, 1440 | "is-alphabetical": { 1441 | "version": "2.0.0", 1442 | "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.0.tgz", 1443 | "integrity": "sha512-5OV8Toyq3oh4eq6sbWTYzlGdnMT/DPI5I0zxUBxjiigQsZycpkKF3kskkao3JyYGuYDHvhgJF+DrjMQp9SX86w==" 1444 | }, 1445 | "is-alphanumerical": { 1446 | "version": "2.0.0", 1447 | "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.0.tgz", 1448 | "integrity": "sha512-t+2GlJ+hO9yagJ+jU3+HSh80VKvz/3cG2cxbGGm4S0hjKuhWQXgPVUVOZz3tqZzMjhmphZ+1TIJTlRZRoe6GCQ==", 1449 | "requires": { 1450 | "is-alphabetical": "^2.0.0", 1451 | "is-decimal": "^2.0.0" 1452 | } 1453 | }, 1454 | "is-buffer": { 1455 | "version": "2.0.5", 1456 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", 1457 | "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" 1458 | }, 1459 | "is-decimal": { 1460 | "version": "2.0.0", 1461 | "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.0.tgz", 1462 | "integrity": "sha512-QfrfjQV0LjoWQ1K1XSoEZkTAzSa14RKVMa5zg3SdAfzEmQzRM4+tbSFWb78creCeA9rNBzaZal92opi1TwPWZw==" 1463 | }, 1464 | "is-hexadecimal": { 1465 | "version": "2.0.0", 1466 | "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.0.tgz", 1467 | "integrity": "sha512-vGOtYkiaxwIiR0+Ng/zNId+ZZehGfINwTzdrDqc6iubbnQWhnPuYymOzOKUDqa2cSl59yHnEh2h6MvRLQsyNug==" 1468 | }, 1469 | "is-plain-obj": { 1470 | "version": "4.0.0", 1471 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", 1472 | "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==" 1473 | }, 1474 | "mdast-util-definitions": { 1475 | "version": "5.1.0", 1476 | "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.0.tgz", 1477 | "integrity": "sha512-5hcR7FL2EuZ4q6lLMUK5w4lHT2H3vqL9quPvYZ/Ku5iifrirfMHiGdhxdXMUbUkDmz5I+TYMd7nbaxUhbQkfpQ==", 1478 | "requires": { 1479 | "@types/mdast": "^3.0.0", 1480 | "@types/unist": "^2.0.0", 1481 | "unist-util-visit": "^3.0.0" 1482 | }, 1483 | "dependencies": { 1484 | "unist-util-visit": { 1485 | "version": "3.1.0", 1486 | "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", 1487 | "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", 1488 | "requires": { 1489 | "@types/unist": "^2.0.0", 1490 | "unist-util-is": "^5.0.0", 1491 | "unist-util-visit-parents": "^4.0.0" 1492 | } 1493 | }, 1494 | "unist-util-visit-parents": { 1495 | "version": "4.1.1", 1496 | "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", 1497 | "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", 1498 | "requires": { 1499 | "@types/unist": "^2.0.0", 1500 | "unist-util-is": "^5.0.0" 1501 | } 1502 | } 1503 | } 1504 | }, 1505 | "mdast-util-from-markdown": { 1506 | "version": "1.0.0", 1507 | "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.0.0.tgz", 1508 | "integrity": "sha512-uj2G60sb7z1PNOeElFwCC9b/Se/lFXuLhVKFOAY2EHz/VvgbupTQRNXPoZl7rGpXYL6BNZgcgaybrlSWbo7n/g==", 1509 | "requires": { 1510 | "@types/mdast": "^3.0.0", 1511 | "@types/unist": "^2.0.0", 1512 | "mdast-util-to-string": "^3.0.0", 1513 | "micromark": "^3.0.0", 1514 | "micromark-util-decode-numeric-character-reference": "^1.0.0", 1515 | "micromark-util-normalize-identifier": "^1.0.0", 1516 | "micromark-util-symbol": "^1.0.0", 1517 | "micromark-util-types": "^1.0.0", 1518 | "parse-entities": "^3.0.0", 1519 | "unist-util-stringify-position": "^3.0.0" 1520 | } 1521 | }, 1522 | "mdast-util-to-hast": { 1523 | "version": "12.1.0", 1524 | "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.1.0.tgz", 1525 | "integrity": "sha512-dHfCt9Yh05AXEeghoziB3DjJV8oCIKdQmBJOPoAT1NlgMDBy+/MQn7Pxfq0jI8YRO1IfzcnmA/OU3FVVn/E5Sg==", 1526 | "requires": { 1527 | "@types/hast": "^2.0.0", 1528 | "@types/mdast": "^3.0.0", 1529 | "@types/mdurl": "^1.0.0", 1530 | "mdast-util-definitions": "^5.0.0", 1531 | "mdurl": "^1.0.0", 1532 | "micromark-util-sanitize-uri": "^1.0.0", 1533 | "unist-builder": "^3.0.0", 1534 | "unist-util-generated": "^2.0.0", 1535 | "unist-util-position": "^4.0.0", 1536 | "unist-util-visit": "^4.0.0" 1537 | } 1538 | }, 1539 | "mdast-util-to-string": { 1540 | "version": "3.1.0", 1541 | "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", 1542 | "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==" 1543 | }, 1544 | "mdurl": { 1545 | "version": "1.0.1", 1546 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", 1547 | "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" 1548 | }, 1549 | "micromark": { 1550 | "version": "3.0.3", 1551 | "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.0.3.tgz", 1552 | "integrity": "sha512-fWuHx+JKV4zA8WfCFor2DWP9XmsZkIiyWRGofr7P7IGfpRIlb7/C5wwusGsNyr1D8HI5arghZDG1Ikc0FBwS5Q==", 1553 | "requires": { 1554 | "@types/debug": "^4.0.0", 1555 | "debug": "^4.0.0", 1556 | "micromark-core-commonmark": "^1.0.0", 1557 | "micromark-factory-space": "^1.0.0", 1558 | "micromark-util-character": "^1.0.0", 1559 | "micromark-util-chunked": "^1.0.0", 1560 | "micromark-util-combine-extensions": "^1.0.0", 1561 | "micromark-util-decode-numeric-character-reference": "^1.0.0", 1562 | "micromark-util-encode": "^1.0.0", 1563 | "micromark-util-normalize-identifier": "^1.0.0", 1564 | "micromark-util-resolve-all": "^1.0.0", 1565 | "micromark-util-sanitize-uri": "^1.0.0", 1566 | "micromark-util-subtokenize": "^1.0.0", 1567 | "micromark-util-symbol": "^1.0.0", 1568 | "micromark-util-types": "^1.0.0", 1569 | "parse-entities": "^3.0.0" 1570 | } 1571 | }, 1572 | "micromark-core-commonmark": { 1573 | "version": "1.0.0", 1574 | "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.0.tgz", 1575 | "integrity": "sha512-y9g7zymcKRBHM/aNBekstvs/Grpf+y4OEBULUTYvGZcusnp+JeOxmilJY4GMpo2/xY7iHQL9fjz5pD9pSAud9A==", 1576 | "requires": { 1577 | "micromark-factory-destination": "^1.0.0", 1578 | "micromark-factory-label": "^1.0.0", 1579 | "micromark-factory-space": "^1.0.0", 1580 | "micromark-factory-title": "^1.0.0", 1581 | "micromark-factory-whitespace": "^1.0.0", 1582 | "micromark-util-character": "^1.0.0", 1583 | "micromark-util-chunked": "^1.0.0", 1584 | "micromark-util-classify-character": "^1.0.0", 1585 | "micromark-util-html-tag-name": "^1.0.0", 1586 | "micromark-util-normalize-identifier": "^1.0.0", 1587 | "micromark-util-resolve-all": "^1.0.0", 1588 | "micromark-util-subtokenize": "^1.0.0", 1589 | "micromark-util-symbol": "^1.0.0", 1590 | "micromark-util-types": "^1.0.0", 1591 | "parse-entities": "^3.0.0" 1592 | } 1593 | }, 1594 | "micromark-factory-destination": { 1595 | "version": "1.0.0", 1596 | "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", 1597 | "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", 1598 | "requires": { 1599 | "micromark-util-character": "^1.0.0", 1600 | "micromark-util-symbol": "^1.0.0", 1601 | "micromark-util-types": "^1.0.0" 1602 | } 1603 | }, 1604 | "micromark-factory-label": { 1605 | "version": "1.0.0", 1606 | "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.0.tgz", 1607 | "integrity": "sha512-XWEucVZb+qBCe2jmlOnWr6sWSY6NHx+wtpgYFsm4G+dufOf6tTQRRo0bdO7XSlGPu5fyjpJenth6Ksnc5Mwfww==", 1608 | "requires": { 1609 | "micromark-util-character": "^1.0.0", 1610 | "micromark-util-symbol": "^1.0.0", 1611 | "micromark-util-types": "^1.0.0" 1612 | } 1613 | }, 1614 | "micromark-factory-space": { 1615 | "version": "1.0.0", 1616 | "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", 1617 | "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", 1618 | "requires": { 1619 | "micromark-util-character": "^1.0.0", 1620 | "micromark-util-types": "^1.0.0" 1621 | } 1622 | }, 1623 | "micromark-factory-title": { 1624 | "version": "1.0.0", 1625 | "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.0.tgz", 1626 | "integrity": "sha512-flvC7Gx0dWVWorXuBl09Cr3wB5FTuYec8pMGVySIp2ZlqTcIjN/lFohZcP0EG//krTptm34kozHk7aK/CleCfA==", 1627 | "requires": { 1628 | "micromark-factory-space": "^1.0.0", 1629 | "micromark-util-character": "^1.0.0", 1630 | "micromark-util-symbol": "^1.0.0", 1631 | "micromark-util-types": "^1.0.0" 1632 | } 1633 | }, 1634 | "micromark-factory-whitespace": { 1635 | "version": "1.0.0", 1636 | "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", 1637 | "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", 1638 | "requires": { 1639 | "micromark-factory-space": "^1.0.0", 1640 | "micromark-util-character": "^1.0.0", 1641 | "micromark-util-symbol": "^1.0.0", 1642 | "micromark-util-types": "^1.0.0" 1643 | } 1644 | }, 1645 | "micromark-util-character": { 1646 | "version": "1.1.0", 1647 | "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", 1648 | "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", 1649 | "requires": { 1650 | "micromark-util-symbol": "^1.0.0", 1651 | "micromark-util-types": "^1.0.0" 1652 | } 1653 | }, 1654 | "micromark-util-chunked": { 1655 | "version": "1.0.0", 1656 | "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", 1657 | "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", 1658 | "requires": { 1659 | "micromark-util-symbol": "^1.0.0" 1660 | } 1661 | }, 1662 | "micromark-util-classify-character": { 1663 | "version": "1.0.0", 1664 | "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", 1665 | "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", 1666 | "requires": { 1667 | "micromark-util-character": "^1.0.0", 1668 | "micromark-util-symbol": "^1.0.0", 1669 | "micromark-util-types": "^1.0.0" 1670 | } 1671 | }, 1672 | "micromark-util-combine-extensions": { 1673 | "version": "1.0.0", 1674 | "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", 1675 | "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", 1676 | "requires": { 1677 | "micromark-util-chunked": "^1.0.0", 1678 | "micromark-util-types": "^1.0.0" 1679 | } 1680 | }, 1681 | "micromark-util-decode-numeric-character-reference": { 1682 | "version": "1.0.0", 1683 | "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", 1684 | "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", 1685 | "requires": { 1686 | "micromark-util-symbol": "^1.0.0" 1687 | } 1688 | }, 1689 | "micromark-util-encode": { 1690 | "version": "1.0.0", 1691 | "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.0.tgz", 1692 | "integrity": "sha512-cJpFVM768h6zkd8qJ1LNRrITfY4gwFt+tziPcIf71Ui8yFzY9wG3snZQqiWVq93PG4Sw6YOtcNiKJfVIs9qfGg==" 1693 | }, 1694 | "micromark-util-html-tag-name": { 1695 | "version": "1.0.0", 1696 | "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz", 1697 | "integrity": "sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g==" 1698 | }, 1699 | "micromark-util-normalize-identifier": { 1700 | "version": "1.0.0", 1701 | "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", 1702 | "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", 1703 | "requires": { 1704 | "micromark-util-symbol": "^1.0.0" 1705 | } 1706 | }, 1707 | "micromark-util-resolve-all": { 1708 | "version": "1.0.0", 1709 | "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", 1710 | "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", 1711 | "requires": { 1712 | "micromark-util-types": "^1.0.0" 1713 | } 1714 | }, 1715 | "micromark-util-sanitize-uri": { 1716 | "version": "1.0.0", 1717 | "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz", 1718 | "integrity": "sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==", 1719 | "requires": { 1720 | "micromark-util-character": "^1.0.0", 1721 | "micromark-util-encode": "^1.0.0", 1722 | "micromark-util-symbol": "^1.0.0" 1723 | } 1724 | }, 1725 | "micromark-util-subtokenize": { 1726 | "version": "1.0.0", 1727 | "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.0.tgz", 1728 | "integrity": "sha512-EsnG2qscmcN5XhkqQBZni/4oQbLFjz9yk3ZM/P8a3YUjwV6+6On2wehr1ALx0MxK3+XXXLTzuBKHDFeDFYRdgQ==", 1729 | "requires": { 1730 | "micromark-util-chunked": "^1.0.0", 1731 | "micromark-util-symbol": "^1.0.0", 1732 | "micromark-util-types": "^1.0.0" 1733 | } 1734 | }, 1735 | "micromark-util-symbol": { 1736 | "version": "1.0.0", 1737 | "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.0.tgz", 1738 | "integrity": "sha512-NZA01jHRNCt4KlOROn8/bGi6vvpEmlXld7EHcRH+aYWUfL3Wc8JLUNNlqUMKa0hhz6GrpUWsHtzPmKof57v0gQ==" 1739 | }, 1740 | "micromark-util-types": { 1741 | "version": "1.0.0", 1742 | "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.0.tgz", 1743 | "integrity": "sha512-psf1WAaP1B77WpW4mBGDkTr+3RsPuDAgsvlP47GJzbH1jmjH8xjOx7Z6kp84L8oqHmy5pYO3Ev46odosZV+3AA==" 1744 | }, 1745 | "ms": { 1746 | "version": "2.1.2", 1747 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1748 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1749 | }, 1750 | "parse-entities": { 1751 | "version": "3.0.0", 1752 | "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-3.0.0.tgz", 1753 | "integrity": "sha512-AJlcIFDNPEP33KyJLguv0xJc83BNvjxwpuUIcetyXUsLpVXAUCePJ5kIoYtEN2R1ac0cYaRu/vk9dVFkewHQhQ==", 1754 | "requires": { 1755 | "character-entities": "^2.0.0", 1756 | "character-entities-legacy": "^2.0.0", 1757 | "character-reference-invalid": "^2.0.0", 1758 | "is-alphanumerical": "^2.0.0", 1759 | "is-decimal": "^2.0.0", 1760 | "is-hexadecimal": "^2.0.0" 1761 | } 1762 | }, 1763 | "property-information": { 1764 | "version": "6.0.1", 1765 | "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.0.1.tgz", 1766 | "integrity": "sha512-F4WUUAF7fMeF4/JUFHNBWDaKDXi2jbvqBW/y6o5wsf3j19wTZ7S60TmtB5HoBhtgw7NKQRMWuz5vk2PR0CygUg==" 1767 | }, 1768 | "rehype-document": { 1769 | "version": "6.1.0", 1770 | "resolved": "https://registry.npmjs.org/rehype-document/-/rehype-document-6.1.0.tgz", 1771 | "integrity": "sha512-znEODHIhSjfBlvFO6z9k/6z7lJor1hqqpYy15W5vj/VLxcWsCL22hBdDSai5tYOymmGOInDLvepmS+6MIIXjFg==", 1772 | "requires": { 1773 | "@types/hast": "^2.0.0", 1774 | "hastscript": "^7.0.0", 1775 | "unified": "^10.0.0" 1776 | } 1777 | }, 1778 | "rehype-format": { 1779 | "version": "4.0.1", 1780 | "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-4.0.1.tgz", 1781 | "integrity": "sha512-HA92WeqFri00yiClrz54IIpM9no2DH9Mgy5aFmInNODoAYn+hN42a6oqJTIie2nj0HwFyV7JvOYx5YHBphN8mw==", 1782 | "requires": { 1783 | "@types/hast": "^2.0.0", 1784 | "hast-util-embedded": "^2.0.0", 1785 | "hast-util-is-element": "^2.0.0", 1786 | "hast-util-phrasing": "^2.0.0", 1787 | "hast-util-whitespace": "^2.0.0", 1788 | "html-whitespace-sensitive-tag-names": "^2.0.0", 1789 | "rehype-minify-whitespace": "^5.0.0", 1790 | "unified": "^10.0.0", 1791 | "unist-util-visit-parents": "^5.0.0" 1792 | } 1793 | }, 1794 | "rehype-minify-whitespace": { 1795 | "version": "5.0.0", 1796 | "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-5.0.0.tgz", 1797 | "integrity": "sha512-cUkQldYx8jpWM6FZmCkOF/+mev09+5NAtBzUFZgnfXsIoglxo3h6t3S3JbNouiaqIDE6vbpI+GQpOg0xD3Z7kg==", 1798 | "requires": { 1799 | "@types/hast": "^2.0.0", 1800 | "hast-util-embedded": "^2.0.0", 1801 | "hast-util-is-element": "^2.0.0", 1802 | "hast-util-whitespace": "^2.0.0", 1803 | "unified": "^10.0.0", 1804 | "unist-util-is": "^5.0.0" 1805 | } 1806 | }, 1807 | "rehype-stringify": { 1808 | "version": "9.0.3", 1809 | "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", 1810 | "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", 1811 | "requires": { 1812 | "@types/hast": "^2.0.0", 1813 | "hast-util-to-html": "^8.0.0", 1814 | "unified": "^10.0.0" 1815 | } 1816 | }, 1817 | "remark-parse": { 1818 | "version": "10.0.1", 1819 | "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", 1820 | "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", 1821 | "requires": { 1822 | "@types/mdast": "^3.0.0", 1823 | "mdast-util-from-markdown": "^1.0.0", 1824 | "unified": "^10.0.0" 1825 | } 1826 | }, 1827 | "remark-rehype": { 1828 | "version": "10.1.0", 1829 | "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", 1830 | "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", 1831 | "requires": { 1832 | "@types/hast": "^2.0.0", 1833 | "@types/mdast": "^3.0.0", 1834 | "mdast-util-to-hast": "^12.1.0", 1835 | "unified": "^10.0.0" 1836 | } 1837 | }, 1838 | "space-separated-tokens": { 1839 | "version": "2.0.1", 1840 | "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", 1841 | "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" 1842 | }, 1843 | "stringify-entities": { 1844 | "version": "4.0.1", 1845 | "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.1.tgz", 1846 | "integrity": "sha512-gmMQxKXPWIO3NXNSPyWNhlYcBNGpPA/487D+9dLPnU4xBnIrnHdr8cv5rGJOS/1BRxEXRb7uKwg7BA36IWV7xg==", 1847 | "requires": { 1848 | "character-entities-html4": "^2.0.0", 1849 | "character-entities-legacy": "^2.0.0" 1850 | } 1851 | }, 1852 | "trough": { 1853 | "version": "2.0.2", 1854 | "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz", 1855 | "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==" 1856 | }, 1857 | "typescript": { 1858 | "version": "4.8.2", 1859 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", 1860 | "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", 1861 | "dev": true 1862 | }, 1863 | "unified": { 1864 | "version": "10.1.1", 1865 | "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.1.tgz", 1866 | "integrity": "sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w==", 1867 | "requires": { 1868 | "@types/unist": "^2.0.0", 1869 | "bail": "^2.0.0", 1870 | "extend": "^3.0.0", 1871 | "is-buffer": "^2.0.0", 1872 | "is-plain-obj": "^4.0.0", 1873 | "trough": "^2.0.0", 1874 | "vfile": "^5.0.0" 1875 | } 1876 | }, 1877 | "unified-stream": { 1878 | "version": "2.0.0", 1879 | "resolved": "https://registry.npmjs.org/unified-stream/-/unified-stream-2.0.0.tgz", 1880 | "integrity": "sha512-KdwODjgqGsTbHMLqm57qLxNAkbCboD5EMPC4BULs/9iy5ZTsw3xgc0BUjeCmABt/yfZt0k7rgkBLcdiZ8LwZug==", 1881 | "requires": { 1882 | "unified": "^10.0.0", 1883 | "vfile": "^5.0.0" 1884 | } 1885 | }, 1886 | "unist-builder": { 1887 | "version": "3.0.0", 1888 | "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.0.tgz", 1889 | "integrity": "sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==", 1890 | "requires": { 1891 | "@types/unist": "^2.0.0" 1892 | } 1893 | }, 1894 | "unist-util-generated": { 1895 | "version": "2.0.0", 1896 | "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.0.tgz", 1897 | "integrity": "sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==" 1898 | }, 1899 | "unist-util-is": { 1900 | "version": "5.1.1", 1901 | "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", 1902 | "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==" 1903 | }, 1904 | "unist-util-position": { 1905 | "version": "4.0.1", 1906 | "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.1.tgz", 1907 | "integrity": "sha512-mgy/zI9fQ2HlbOtTdr2w9lhVaiFUHWQnZrFF2EUoVOqtAUdzqMtNiD99qA5a1IcjWVR8O6aVYE9u7Z2z1v0SQA==" 1908 | }, 1909 | "unist-util-stringify-position": { 1910 | "version": "3.0.0", 1911 | "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz", 1912 | "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==", 1913 | "requires": { 1914 | "@types/unist": "^2.0.0" 1915 | } 1916 | }, 1917 | "unist-util-visit": { 1918 | "version": "4.1.0", 1919 | "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.0.tgz", 1920 | "integrity": "sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==", 1921 | "requires": { 1922 | "@types/unist": "^2.0.0", 1923 | "unist-util-is": "^5.0.0", 1924 | "unist-util-visit-parents": "^5.0.0" 1925 | } 1926 | }, 1927 | "unist-util-visit-parents": { 1928 | "version": "5.0.0", 1929 | "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.0.0.tgz", 1930 | "integrity": "sha512-CVaLOYPM/EaFTYMytbaju3Tw4QI3DHnHFnL358FkEu0hZOzSm/hqBdVwOQDR60jF5ZzhB1tlZlRH0ll/yekZIQ==", 1931 | "requires": { 1932 | "@types/unist": "^2.0.0", 1933 | "unist-util-is": "^5.0.0" 1934 | } 1935 | }, 1936 | "vfile": { 1937 | "version": "5.0.2", 1938 | "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.0.2.tgz", 1939 | "integrity": "sha512-5cV+K7tX83MT3bievROc+7AvHv0GXDB0zqbrTjbOe+HRbkzvY4EP+wS3IR77kUBCoWFMdG9py18t0sesPtQ1Rw==", 1940 | "requires": { 1941 | "@types/unist": "^2.0.0", 1942 | "is-buffer": "^2.0.0", 1943 | "unist-util-stringify-position": "^3.0.0", 1944 | "vfile-message": "^3.0.0" 1945 | } 1946 | }, 1947 | "vfile-message": { 1948 | "version": "3.0.1", 1949 | "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.1.tgz", 1950 | "integrity": "sha512-gYmSHcZZUEtYpTmaWaFJwsuUD70/rTY4v09COp8TGtOkix6gGxb/a8iTQByIY9ciTk9GwAwIXd/J9OPfM4Bvaw==", 1951 | "requires": { 1952 | "@types/unist": "^2.0.0", 1953 | "unist-util-stringify-position": "^3.0.0" 1954 | } 1955 | } 1956 | } 1957 | } 1958 | -------------------------------------------------------------------------------- /runtimes/md/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vercel-md", 3 | "description": "Markdown Runtime for Vercel platform", 4 | "version": "0.0.5", 5 | "license": "MIT", 6 | "main": "./dist/index.js", 7 | "homepage": "https://github.com/juicyfx/juicy", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/juicyfx/juicy.git" 11 | }, 12 | "scripts": { 13 | "watch": "tsc --watch", 14 | "build": "tsc", 15 | "prepublishOnly": "tsc" 16 | }, 17 | "files": [ 18 | "dist" 19 | ], 20 | "dependencies": { 21 | "rehype-document": "^6.0.0", 22 | "rehype-format": "^4.0.0", 23 | "rehype-stringify": "^9.0.0", 24 | "remark-parse": "^10.0.0", 25 | "remark-rehype": "^10.0.0", 26 | "unified": "^10.0.0", 27 | "unified-stream": "^2.0.0" 28 | }, 29 | "devDependencies": { 30 | "@types/node": "^17.0.0", 31 | "@vercel/build-utils": "^5.4.1", 32 | "typescript": "^4.0.2" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /runtimes/md/src/index.ts: -------------------------------------------------------------------------------- 1 | import { FileBlob, BuildOptions } from "@vercel/build-utils"; 2 | import unified from 'unified'; 3 | // @ts-ignore 4 | import unifiedStream from 'unified-stream'; 5 | import markdown from 'remark-parse'; 6 | import remark2rehype from 'remark-rehype'; 7 | import doc from 'rehype-document'; 8 | // @ts-ignore 9 | import format from 'rehype-format'; 10 | import html from 'rehype-stringify'; 11 | 12 | export const version = 2; 13 | 14 | export async function build({ files, entrypoint, config = {} }: BuildOptions): Promise { 15 | const stream = files[entrypoint].toStream(); 16 | const options = config || {}; 17 | 18 | const title = options.title || undefined; 19 | const language = options.language || 'en'; 20 | const meta = <[]>options.meta || undefined; 21 | const css = options.css || undefined; 22 | const js = options.js || undefined; 23 | 24 | const processor = unified() 25 | .use(markdown) 26 | .use(remark2rehype) 27 | .use(doc, { 28 | title, 29 | language, 30 | meta, 31 | css, 32 | js 33 | }) 34 | .use(format) 35 | .use(html); 36 | 37 | const result = await FileBlob.fromStream({ 38 | stream: stream.pipe(unifiedStream(processor)), 39 | }); 40 | 41 | const replacedEntrypoint = entrypoint.replace(/\.[^.]+$/, '.html'); 42 | 43 | return { [replacedEntrypoint]: result }; 44 | }; 45 | -------------------------------------------------------------------------------- /runtimes/md/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "esModuleInterop": true, 5 | "resolveJsonModule": true, 6 | "moduleResolution": "node", 7 | "allowSyntheticDefaultImports": true, 8 | "target": "ES2018", 9 | "module": "CommonJS", 10 | "outDir": "dist", 11 | "sourceMap": false, 12 | "declaration": true, 13 | "noImplicitAny": true, 14 | "noUnusedLocals": true, 15 | "noUnusedParameters": true, 16 | "forceConsistentCasingInFileNames": true, 17 | "skipLibCheck": true, 18 | "typeRoots": [ 19 | "./node_modules/@types" 20 | ] 21 | }, 22 | "include": [ 23 | "src/**/*.ts" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /runtimes/plain/.gitignore: -------------------------------------------------------------------------------- 1 | # NodeJS 2 | /node_modules 3 | 4 | # App 5 | /dist 6 | -------------------------------------------------------------------------------- /runtimes/plain/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vercel-plain", 3 | "version": "0.0.2", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "vercel-plain", 9 | "version": "0.0.2", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@types/node": "^18.7.14", 13 | "@vercel/build-utils": "^5.5.5", 14 | "typescript": "^4.0.2" 15 | } 16 | }, 17 | "node_modules/@types/node": { 18 | "version": "18.7.14", 19 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", 20 | "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==", 21 | "dev": true 22 | }, 23 | "node_modules/@vercel/build-utils": { 24 | "version": "5.5.5", 25 | "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-5.5.5.tgz", 26 | "integrity": "sha512-ZBJpqnqm2OqYyWEqfRn0CYvlmSdOf/igtFy58x0bvSbJdN6Dx2rEw9sNg8SU7O/+zWpKP5rRfWcT6iql/p0sCg==", 27 | "dev": true 28 | }, 29 | "node_modules/typescript": { 30 | "version": "4.8.2", 31 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", 32 | "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", 33 | "dev": true, 34 | "bin": { 35 | "tsc": "bin/tsc", 36 | "tsserver": "bin/tsserver" 37 | }, 38 | "engines": { 39 | "node": ">=4.2.0" 40 | } 41 | } 42 | }, 43 | "dependencies": { 44 | "@types/node": { 45 | "version": "18.7.14", 46 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", 47 | "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==", 48 | "dev": true 49 | }, 50 | "@vercel/build-utils": { 51 | "version": "5.5.5", 52 | "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-5.5.5.tgz", 53 | "integrity": "sha512-ZBJpqnqm2OqYyWEqfRn0CYvlmSdOf/igtFy58x0bvSbJdN6Dx2rEw9sNg8SU7O/+zWpKP5rRfWcT6iql/p0sCg==", 54 | "dev": true 55 | }, 56 | "typescript": { 57 | "version": "4.8.2", 58 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", 59 | "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", 60 | "dev": true 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /runtimes/plain/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vercel-plain", 3 | "description": "Plain Runtime for Vercel platform", 4 | "version": "0.0.2", 5 | "license": "MIT", 6 | "main": "./dist/index.js", 7 | "homepage": "https://github.com/juicyfx/juicy", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/juicyfx/juicy.git" 11 | }, 12 | "scripts": { 13 | "watch": "tsc --watch", 14 | "build": "tsc", 15 | "prepublishOnly": "tsc" 16 | }, 17 | "files": [ 18 | "dist" 19 | ], 20 | "devDependencies": { 21 | "@types/node": "^18.7.14", 22 | "@vercel/build-utils": "^5.5.5", 23 | "typescript": "^4.0.2" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /runtimes/plain/src/index.ts: -------------------------------------------------------------------------------- 1 | import { FileBlob, BuildOptions } from "@vercel/build-utils"; 2 | 3 | export async function build(options : BuildOptions): Promise { 4 | console.log('▲', options); 5 | 6 | const data = options.config.text || 'Plain text'; 7 | const result = new FileBlob({ data }); 8 | 9 | return { [options.entrypoint]: result }; 10 | }; 11 | -------------------------------------------------------------------------------- /runtimes/plain/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "esModuleInterop": true, 5 | "resolveJsonModule": true, 6 | "moduleResolution": "node", 7 | "allowSyntheticDefaultImports": true, 8 | "target": "ES2018", 9 | "module": "CommonJS", 10 | "outDir": "dist", 11 | "sourceMap": false, 12 | "declaration": true, 13 | "noImplicitAny": true, 14 | "noUnusedLocals": true, 15 | "noUnusedParameters": true, 16 | "forceConsistentCasingInFileNames": true, 17 | "skipLibCheck": true, 18 | "typeRoots": [ 19 | "./node_modules/@types" 20 | ] 21 | }, 22 | "include": [ 23 | "src/**/*.ts" 24 | ] 25 | } 26 | --------------------------------------------------------------------------------