├── wrangler.example.toml ├── .gitignore ├── .editorconfig ├── tsconfig.json ├── package.json ├── LICENSE ├── src ├── utils.ts ├── index.ts └── request.ts ├── README.md └── pnpm-lock.yaml /wrangler.example.toml: -------------------------------------------------------------------------------- 1 | name = "omnivore2rss" 2 | compatibility_date = "2023-01-01" 3 | 4 | [vars] 5 | OMNIVORE_AUTH_TOKEN = "Your API token here" 6 | PUBLIC_MODE = "" 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .wrangler 4 | .dev.vars 5 | 6 | # Change them to your taste: 7 | wrangler.toml 8 | wrangler.public.toml 9 | wrangler.private.toml 10 | package-lock.json 11 | yarn.lock -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = false 12 | insert_final_newline = false -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "moduleResolution": "node", 6 | "esModuleInterop": true, 7 | "strict": true, 8 | "lib": [ 9 | "esnext" 10 | ], 11 | "types": [ 12 | "@cloudflare/workers-types" 13 | ], 14 | "jsx": "react-jsx", 15 | "jsxImportSource": "hono/jsx" 16 | }, 17 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "dev": "wrangler dev src/index.ts", 4 | "deploy": "cp wrangler.private.toml wrangler.toml && wrangler deploy --minify src/index.ts", 5 | "deploy:public": "cp wrangler.public.toml wrangler.toml && wrangler deploy --minify src/index.ts" 6 | }, 7 | "dependencies": { 8 | "hono": "^3.7.2", 9 | "mime": "4.0.1" 10 | }, 11 | "devDependencies": { 12 | "@cloudflare/workers-types": "^4.20230914.0", 13 | "wrangler": "^3.9.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 savokiss 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 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import mime from 'mime' 2 | 3 | const sanitizeXML = (str: string) => { 4 | return str.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '') 5 | .replace(/&(?!(amp;|lt;|gt;|apos;|quot;))/g, '&') 6 | } 7 | 8 | const getImageType = (imageUrl: string) => { 9 | const urlWithoutParams = imageUrl.split('?')[0] 10 | return mime.getType(urlWithoutParams) 11 | } 12 | 13 | const createRSSItem = (article: any) => { 14 | const node = article['node'] 15 | const title = sanitizeXML(node['title']) 16 | const link = sanitizeXML(node['url']) 17 | const content = sanitizeXML(node['content']) 18 | const author = node['author'] ? `author@omnivore.app (${node['author']})` : '' 19 | const imageType = node['image'] ? getImageType(node['image']) : null 20 | 21 | return ` 22 | ${title} 23 | ${link} 24 | 25 | ${new Date(node['createdAt']).toUTCString()} 26 | ${node['id']} 27 | ${author} 28 | ${node['image'] ? `` : ''} 29 | ` 30 | } 31 | 32 | export const convertArticlesToRSS = (articles: any[], reqUrl: string) => { 33 | const items = articles.map(createRSSItem).join('') 34 | const requestUrl = sanitizeXML(reqUrl) 35 | 36 | return ` 37 | 38 | 39 | Omnivore 40 | https://omnivore.app 41 | Articles from Omnivore 42 | 43 | ${items} 44 | 45 | ` 46 | } 47 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Omnivore2RSS 2 | 3 | A simple project to turn your [Omnivore](https://omnivore.app/) inbox into an RSS feed. 4 | 5 | This is a cloudflare worker project that can be easily deployed at the edge. 6 | 7 | ## Features 8 | - Using Cloudflare Workers 9 | - One Click Deployment 10 | - Public Mode, get your feed instantly through 11 | - Official Search Supports, see [Params](#params) 12 | 13 | ## Deployment 14 | 15 | [![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/savokiss/omnivore2rss) 16 | 17 | ## Public Mode 18 | 19 | You can get your feed instantly through: 20 | 21 | ```bash 22 | https://o2rss.detools.dev/public?token= 23 | ``` 24 | 25 | > Please note that we do not store your token, but we also advise against saving any sensitive data in your feed. 26 | 27 | 28 | ## Usage 29 | ### Install dependencies 30 | 31 | ```bash 32 | pnpm i 33 | ``` 34 | 35 | ### Replace wrangler config 36 | 37 | ```bash 38 | cp wrangler.example.toml wrangler.toml 39 | ``` 40 | 41 | Then replace the `OMNIVORE_AUTH_TOKEN` field. 42 | 43 | Your omnivore auth token can be found here: 44 | 45 | ### Deploy your worker 46 | 47 | ```bash 48 | pnpm run deploy 49 | ``` 50 | 51 | ### The Feed URL 52 | 53 | ```bash 54 | https:///feed 55 | ``` 56 | 57 | Add this url to your RSS reader, then enjoy reading articles in one place! 58 | 59 | ## Params 60 | 61 | ### Limit 62 | The default limit is 10, you can change it like this: 63 | 64 | ```bash 65 | https:///feed?limit=20 66 | ``` 67 | 68 | ### Query 69 | The `query` is the same from the official, you can find the `query string` on your omnivore inbox page's top **input box**. 70 | 71 | ```bash 72 | https:///feed?query=in:inbox 73 | ``` 74 | 75 | Avaliable Queries: 76 | 77 | - `in:inbox` 78 | - `in:inbox sort:read-desc is:reading` 79 | - `in:library` 80 | - `no:label` 81 | ... 82 | 83 | Plus all your custom labels, it's the same thing. 84 | 85 | ## Develop 86 | ``` 87 | pnpm dev 88 | ``` 89 | 90 | ## License 91 | 92 | [MIT](https://choosealicense.com/licenses/mit/) 93 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { Context, Hono } from 'hono' 2 | import { GraphQLFetcher } from './request' 3 | import { convertArticlesToRSS } from './utils' 4 | 5 | const defaultUrl = 'https://api-prod.omnivore.app/api/graphql' 6 | 7 | type Bindings = { 8 | OMNIVORE_API_URL: string 9 | OMNIVORE_AUTH_TOKEN: string 10 | PUBLIC_MODE: string 11 | } 12 | 13 | type OmniOptions = { 14 | reqUrl: string 15 | limit?: number, 16 | query?: string 17 | } 18 | 19 | const app = new Hono<{ Bindings: Bindings }>() 20 | 21 | app.get('/', async (c) => { 22 | if (c.env.PUBLIC_MODE) { 23 | return c.text('Public mode enabled, please use the /public?token= endpoint.') 24 | } 25 | return c.json({ 26 | msg: 'Server is ready.' 27 | }) 28 | }) 29 | 30 | app.get('/feed', async (c) => { 31 | if (c.env.PUBLIC_MODE) { 32 | return c.json({ 33 | msg: 'Public mode enabled, please use the /public endpoint.' 34 | }) 35 | } 36 | const { limit, query = '' } = c.req.query() 37 | const omniUrl = c.env.OMNIVORE_API_URL ?? defaultUrl 38 | const token = c.env.OMNIVORE_AUTH_TOKEN 39 | // singleton 40 | const api = GraphQLFetcher.getInstance(omniUrl, token) 41 | const feed = await handleTransform(api, { 42 | reqUrl: c.req.url, 43 | limit: parseInt(limit), 44 | query 45 | }) 46 | c.header('Content-Type', 'application/xml') 47 | return c.body(feed) 48 | }) 49 | 50 | app.get('/public', async (c) => { 51 | if (!c.env.PUBLIC_MODE) { 52 | return c.json({ 53 | msg: 'Public mode disabled, please use the /feed endpoint.' 54 | }) 55 | } 56 | const { token, limit, query = '' } = c.req.query() 57 | if (!token) { 58 | return c.json({ 59 | msg: 'In public mode, please provide a token, or you can deploy it yourself on cloudflare.' 60 | }) 61 | } 62 | const omniUrl = c.env.OMNIVORE_API_URL ?? defaultUrl 63 | // per request instance 64 | const api = new GraphQLFetcher(omniUrl, token) 65 | const feed = await handleTransform(api, { 66 | reqUrl: c.req.url, 67 | limit: parseInt(limit), 68 | query 69 | }) 70 | c.header('Content-Type', 'application/xml') 71 | return c.body(feed) 72 | }) 73 | 74 | async function handleTransform (api: GraphQLFetcher, options: OmniOptions) { 75 | const { reqUrl, limit = 10, query = '' } = options 76 | const data = await api.request(undefined, limit, query) 77 | const articles = data.data.search.edges 78 | const feed = convertArticlesToRSS(articles, reqUrl) 79 | return feed 80 | } 81 | 82 | export default app 83 | -------------------------------------------------------------------------------- /src/request.ts: -------------------------------------------------------------------------------- 1 | type ApiResult = { 2 | data: { 3 | search: { 4 | edges: any[] 5 | pageInfo: { 6 | hasNextPage: boolean 7 | endCursor: string 8 | totalCount: number 9 | } 10 | } 11 | } 12 | } 13 | 14 | export class GraphQLFetcher { 15 | private static instance: GraphQLFetcher | null = null 16 | private apiUrl: string 17 | private authToken: string 18 | 19 | constructor(apiUrl: string, authToken: string) { 20 | this.apiUrl = apiUrl 21 | this.authToken = authToken 22 | } 23 | 24 | static getInstance(apiUrl: string, authToken: string): GraphQLFetcher { 25 | if (!this.instance) { 26 | this.instance = new GraphQLFetcher(apiUrl, authToken) 27 | } 28 | return this.instance 29 | } 30 | 31 | /** 32 | * Requests data from the server. 33 | * 34 | * @param {string | undefined} cursor - The cursor for pagination. 35 | * @param {number} limit - The maximum number of items to return. 36 | * @param {string} searchQuery - The search query. 37 | * @return {Promise} A promise that resolves to the response from the server. 38 | */ 39 | async request( 40 | cursor: string | undefined, 41 | limit: number, 42 | searchQuery: string 43 | ): Promise { 44 | const query = ` 45 | query Search( 46 | $after: String 47 | $first: Int 48 | $query: String 49 | $includeContent: Boolean 50 | $format: String 51 | ) { 52 | search( 53 | after: $after 54 | first: $first 55 | query: $query 56 | includeContent: $includeContent 57 | format: $format 58 | ) { 59 | ... on SearchSuccess { 60 | edges { 61 | node { 62 | id 63 | title 64 | slug 65 | content 66 | url 67 | createdAt 68 | image 69 | author 70 | } 71 | } 72 | pageInfo { 73 | hasNextPage 74 | endCursor 75 | totalCount 76 | } 77 | } 78 | ... on SearchError { 79 | errorCodes 80 | } 81 | } 82 | } 83 | ` 84 | 85 | const variables = { 86 | after: cursor, 87 | first: limit, 88 | format: "html", 89 | includeContent: true, 90 | query: searchQuery, 91 | } 92 | 93 | const headers = { 94 | Cookie: `auth=${this.authToken};`, 95 | "Content-Type": "application/json", 96 | } 97 | 98 | const params = { 99 | variables, 100 | query, 101 | } 102 | 103 | const response = await fetch(this.apiUrl, { 104 | method: "POST", 105 | headers, 106 | body: JSON.stringify(params), 107 | }) 108 | 109 | return await response.json() 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | hono: 9 | specifier: ^3.7.2 10 | version: 3.7.2 11 | mime: 12 | specifier: 4.0.1 13 | version: 4.0.1 14 | 15 | devDependencies: 16 | '@cloudflare/workers-types': 17 | specifier: ^4.20230914.0 18 | version: 4.20230914.0 19 | wrangler: 20 | specifier: ^3.9.0 21 | version: 3.9.0 22 | 23 | packages: 24 | 25 | /@cloudflare/kv-asset-handler@0.2.0: 26 | resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} 27 | dependencies: 28 | mime: 3.0.0 29 | dev: true 30 | 31 | /@cloudflare/workerd-darwin-64@1.20230904.0: 32 | resolution: {integrity: sha512-/GDlmxAFbDtrQwP4zOXFbqOfaPvkDxdsCoEa+KEBcAl5uR98+7WW5/b8naBHX+t26uS7p4bLlImM8J5F1ienRQ==} 33 | engines: {node: '>=16'} 34 | cpu: [x64] 35 | os: [darwin] 36 | requiresBuild: true 37 | dev: true 38 | optional: true 39 | 40 | /@cloudflare/workerd-darwin-arm64@1.20230904.0: 41 | resolution: {integrity: sha512-x8WXNc2xnDqr5y1iirnNdyx8GZY3rL5xiF7ebK3mKQeB+jFjkhO71yuPTkDCzUWtOvw1Wfd4jbwy4wxacMX4mQ==} 42 | engines: {node: '>=16'} 43 | cpu: [arm64] 44 | os: [darwin] 45 | requiresBuild: true 46 | dev: true 47 | optional: true 48 | 49 | /@cloudflare/workerd-linux-64@1.20230904.0: 50 | resolution: {integrity: sha512-V58xyMS3oDpKO8Dpdh0r0BXm99OzoGgvWe9ufttVraj/1NTMGELwb6i9ySb8k3F1J9m/sO26+TV7pQc/bGC1VQ==} 51 | engines: {node: '>=16'} 52 | cpu: [x64] 53 | os: [linux] 54 | requiresBuild: true 55 | dev: true 56 | optional: true 57 | 58 | /@cloudflare/workerd-linux-arm64@1.20230904.0: 59 | resolution: {integrity: sha512-VrDaW+pjb5IAKEnNWtEaFiG377kXKmk5Fu0Era4W+jKzPON2BW/qRb/4LNHXQ4yxg/2HLm7RiUTn7JZtt1qO6A==} 60 | engines: {node: '>=16'} 61 | cpu: [arm64] 62 | os: [linux] 63 | requiresBuild: true 64 | dev: true 65 | optional: true 66 | 67 | /@cloudflare/workerd-windows-64@1.20230904.0: 68 | resolution: {integrity: sha512-/R/dE8uy+8J2YeXfDhI8/Bg7YUirdbbjH5/l/Vv00ZRE0lC3nPLcYeyBXSwXIQ6/Xht3gN+lksLQgKd0ZWRd+Q==} 69 | engines: {node: '>=16'} 70 | cpu: [x64] 71 | os: [win32] 72 | requiresBuild: true 73 | dev: true 74 | optional: true 75 | 76 | /@cloudflare/workers-types@4.20230914.0: 77 | resolution: {integrity: sha512-OVeN4lFVu1O0PJGZ2d0FwpK8lelFcr33qYOgCh77ErEYmEBO4adwnIxcIsdQbFbhF0ffN6joiVcljD4zakdaeQ==} 78 | dev: true 79 | 80 | /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19): 81 | resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} 82 | peerDependencies: 83 | esbuild: '*' 84 | dependencies: 85 | esbuild: 0.17.19 86 | dev: true 87 | 88 | /@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19): 89 | resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} 90 | peerDependencies: 91 | esbuild: '*' 92 | dependencies: 93 | esbuild: 0.17.19 94 | escape-string-regexp: 4.0.0 95 | rollup-plugin-node-polyfills: 0.2.1 96 | dev: true 97 | 98 | /@esbuild/android-arm64@0.17.19: 99 | resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} 100 | engines: {node: '>=12'} 101 | cpu: [arm64] 102 | os: [android] 103 | requiresBuild: true 104 | dev: true 105 | optional: true 106 | 107 | /@esbuild/android-arm@0.17.19: 108 | resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} 109 | engines: {node: '>=12'} 110 | cpu: [arm] 111 | os: [android] 112 | requiresBuild: true 113 | dev: true 114 | optional: true 115 | 116 | /@esbuild/android-x64@0.17.19: 117 | resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} 118 | engines: {node: '>=12'} 119 | cpu: [x64] 120 | os: [android] 121 | requiresBuild: true 122 | dev: true 123 | optional: true 124 | 125 | /@esbuild/darwin-arm64@0.17.19: 126 | resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} 127 | engines: {node: '>=12'} 128 | cpu: [arm64] 129 | os: [darwin] 130 | requiresBuild: true 131 | dev: true 132 | optional: true 133 | 134 | /@esbuild/darwin-x64@0.17.19: 135 | resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} 136 | engines: {node: '>=12'} 137 | cpu: [x64] 138 | os: [darwin] 139 | requiresBuild: true 140 | dev: true 141 | optional: true 142 | 143 | /@esbuild/freebsd-arm64@0.17.19: 144 | resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} 145 | engines: {node: '>=12'} 146 | cpu: [arm64] 147 | os: [freebsd] 148 | requiresBuild: true 149 | dev: true 150 | optional: true 151 | 152 | /@esbuild/freebsd-x64@0.17.19: 153 | resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} 154 | engines: {node: '>=12'} 155 | cpu: [x64] 156 | os: [freebsd] 157 | requiresBuild: true 158 | dev: true 159 | optional: true 160 | 161 | /@esbuild/linux-arm64@0.17.19: 162 | resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} 163 | engines: {node: '>=12'} 164 | cpu: [arm64] 165 | os: [linux] 166 | requiresBuild: true 167 | dev: true 168 | optional: true 169 | 170 | /@esbuild/linux-arm@0.17.19: 171 | resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} 172 | engines: {node: '>=12'} 173 | cpu: [arm] 174 | os: [linux] 175 | requiresBuild: true 176 | dev: true 177 | optional: true 178 | 179 | /@esbuild/linux-ia32@0.17.19: 180 | resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} 181 | engines: {node: '>=12'} 182 | cpu: [ia32] 183 | os: [linux] 184 | requiresBuild: true 185 | dev: true 186 | optional: true 187 | 188 | /@esbuild/linux-loong64@0.17.19: 189 | resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} 190 | engines: {node: '>=12'} 191 | cpu: [loong64] 192 | os: [linux] 193 | requiresBuild: true 194 | dev: true 195 | optional: true 196 | 197 | /@esbuild/linux-mips64el@0.17.19: 198 | resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} 199 | engines: {node: '>=12'} 200 | cpu: [mips64el] 201 | os: [linux] 202 | requiresBuild: true 203 | dev: true 204 | optional: true 205 | 206 | /@esbuild/linux-ppc64@0.17.19: 207 | resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} 208 | engines: {node: '>=12'} 209 | cpu: [ppc64] 210 | os: [linux] 211 | requiresBuild: true 212 | dev: true 213 | optional: true 214 | 215 | /@esbuild/linux-riscv64@0.17.19: 216 | resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} 217 | engines: {node: '>=12'} 218 | cpu: [riscv64] 219 | os: [linux] 220 | requiresBuild: true 221 | dev: true 222 | optional: true 223 | 224 | /@esbuild/linux-s390x@0.17.19: 225 | resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} 226 | engines: {node: '>=12'} 227 | cpu: [s390x] 228 | os: [linux] 229 | requiresBuild: true 230 | dev: true 231 | optional: true 232 | 233 | /@esbuild/linux-x64@0.17.19: 234 | resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} 235 | engines: {node: '>=12'} 236 | cpu: [x64] 237 | os: [linux] 238 | requiresBuild: true 239 | dev: true 240 | optional: true 241 | 242 | /@esbuild/netbsd-x64@0.17.19: 243 | resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} 244 | engines: {node: '>=12'} 245 | cpu: [x64] 246 | os: [netbsd] 247 | requiresBuild: true 248 | dev: true 249 | optional: true 250 | 251 | /@esbuild/openbsd-x64@0.17.19: 252 | resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} 253 | engines: {node: '>=12'} 254 | cpu: [x64] 255 | os: [openbsd] 256 | requiresBuild: true 257 | dev: true 258 | optional: true 259 | 260 | /@esbuild/sunos-x64@0.17.19: 261 | resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} 262 | engines: {node: '>=12'} 263 | cpu: [x64] 264 | os: [sunos] 265 | requiresBuild: true 266 | dev: true 267 | optional: true 268 | 269 | /@esbuild/win32-arm64@0.17.19: 270 | resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} 271 | engines: {node: '>=12'} 272 | cpu: [arm64] 273 | os: [win32] 274 | requiresBuild: true 275 | dev: true 276 | optional: true 277 | 278 | /@esbuild/win32-ia32@0.17.19: 279 | resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} 280 | engines: {node: '>=12'} 281 | cpu: [ia32] 282 | os: [win32] 283 | requiresBuild: true 284 | dev: true 285 | optional: true 286 | 287 | /@esbuild/win32-x64@0.17.19: 288 | resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} 289 | engines: {node: '>=12'} 290 | cpu: [x64] 291 | os: [win32] 292 | requiresBuild: true 293 | dev: true 294 | optional: true 295 | 296 | /@fastify/busboy@2.0.0: 297 | resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} 298 | engines: {node: '>=14'} 299 | dev: true 300 | 301 | /acorn-walk@8.2.0: 302 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 303 | engines: {node: '>=0.4.0'} 304 | dev: true 305 | 306 | /acorn@8.10.0: 307 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 308 | engines: {node: '>=0.4.0'} 309 | hasBin: true 310 | dev: true 311 | 312 | /anymatch@3.1.3: 313 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 314 | engines: {node: '>= 8'} 315 | dependencies: 316 | normalize-path: 3.0.0 317 | picomatch: 2.3.1 318 | dev: true 319 | 320 | /as-table@1.0.55: 321 | resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} 322 | dependencies: 323 | printable-characters: 1.0.42 324 | dev: true 325 | 326 | /binary-extensions@2.2.0: 327 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 328 | engines: {node: '>=8'} 329 | dev: true 330 | 331 | /blake3-wasm@2.1.5: 332 | resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 333 | dev: true 334 | 335 | /braces@3.0.2: 336 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 337 | engines: {node: '>=8'} 338 | dependencies: 339 | fill-range: 7.0.1 340 | dev: true 341 | 342 | /buffer-from@1.1.2: 343 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 344 | dev: true 345 | 346 | /capnp-ts@0.7.0: 347 | resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} 348 | dependencies: 349 | debug: 4.3.4 350 | tslib: 2.6.2 351 | transitivePeerDependencies: 352 | - supports-color 353 | dev: true 354 | 355 | /chokidar@3.5.3: 356 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 357 | engines: {node: '>= 8.10.0'} 358 | dependencies: 359 | anymatch: 3.1.3 360 | braces: 3.0.2 361 | glob-parent: 5.1.2 362 | is-binary-path: 2.1.0 363 | is-glob: 4.0.3 364 | normalize-path: 3.0.0 365 | readdirp: 3.6.0 366 | optionalDependencies: 367 | fsevents: 2.3.3 368 | dev: true 369 | 370 | /cookie@0.5.0: 371 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 372 | engines: {node: '>= 0.6'} 373 | dev: true 374 | 375 | /data-uri-to-buffer@2.0.2: 376 | resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} 377 | dev: true 378 | 379 | /debug@4.3.4: 380 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 381 | engines: {node: '>=6.0'} 382 | peerDependencies: 383 | supports-color: '*' 384 | peerDependenciesMeta: 385 | supports-color: 386 | optional: true 387 | dependencies: 388 | ms: 2.1.2 389 | dev: true 390 | 391 | /esbuild@0.17.19: 392 | resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} 393 | engines: {node: '>=12'} 394 | hasBin: true 395 | requiresBuild: true 396 | optionalDependencies: 397 | '@esbuild/android-arm': 0.17.19 398 | '@esbuild/android-arm64': 0.17.19 399 | '@esbuild/android-x64': 0.17.19 400 | '@esbuild/darwin-arm64': 0.17.19 401 | '@esbuild/darwin-x64': 0.17.19 402 | '@esbuild/freebsd-arm64': 0.17.19 403 | '@esbuild/freebsd-x64': 0.17.19 404 | '@esbuild/linux-arm': 0.17.19 405 | '@esbuild/linux-arm64': 0.17.19 406 | '@esbuild/linux-ia32': 0.17.19 407 | '@esbuild/linux-loong64': 0.17.19 408 | '@esbuild/linux-mips64el': 0.17.19 409 | '@esbuild/linux-ppc64': 0.17.19 410 | '@esbuild/linux-riscv64': 0.17.19 411 | '@esbuild/linux-s390x': 0.17.19 412 | '@esbuild/linux-x64': 0.17.19 413 | '@esbuild/netbsd-x64': 0.17.19 414 | '@esbuild/openbsd-x64': 0.17.19 415 | '@esbuild/sunos-x64': 0.17.19 416 | '@esbuild/win32-arm64': 0.17.19 417 | '@esbuild/win32-ia32': 0.17.19 418 | '@esbuild/win32-x64': 0.17.19 419 | dev: true 420 | 421 | /escape-string-regexp@4.0.0: 422 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 423 | engines: {node: '>=10'} 424 | dev: true 425 | 426 | /estree-walker@0.6.1: 427 | resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} 428 | dev: true 429 | 430 | /exit-hook@2.2.1: 431 | resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} 432 | engines: {node: '>=6'} 433 | dev: true 434 | 435 | /fill-range@7.0.1: 436 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 437 | engines: {node: '>=8'} 438 | dependencies: 439 | to-regex-range: 5.0.1 440 | dev: true 441 | 442 | /fsevents@2.3.3: 443 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 444 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 445 | os: [darwin] 446 | requiresBuild: true 447 | dev: true 448 | optional: true 449 | 450 | /get-source@2.0.12: 451 | resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} 452 | dependencies: 453 | data-uri-to-buffer: 2.0.2 454 | source-map: 0.6.1 455 | dev: true 456 | 457 | /glob-parent@5.1.2: 458 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 459 | engines: {node: '>= 6'} 460 | dependencies: 461 | is-glob: 4.0.3 462 | dev: true 463 | 464 | /glob-to-regexp@0.4.1: 465 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 466 | dev: true 467 | 468 | /hono@3.7.2: 469 | resolution: {integrity: sha512-5SWYrAQJlfjHggcDTnmKZd5zlUEXmoUiBjnmL6C1W8MX39/bUw6ZIvfEJZgpo7d7Z/vCJ5FRfkjIQPRH5yV/dQ==} 470 | engines: {node: '>=16.0.0'} 471 | dev: false 472 | 473 | /is-binary-path@2.1.0: 474 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 475 | engines: {node: '>=8'} 476 | dependencies: 477 | binary-extensions: 2.2.0 478 | dev: true 479 | 480 | /is-extglob@2.1.1: 481 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 482 | engines: {node: '>=0.10.0'} 483 | dev: true 484 | 485 | /is-glob@4.0.3: 486 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 487 | engines: {node: '>=0.10.0'} 488 | dependencies: 489 | is-extglob: 2.1.1 490 | dev: true 491 | 492 | /is-number@7.0.0: 493 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 494 | engines: {node: '>=0.12.0'} 495 | dev: true 496 | 497 | /magic-string@0.25.9: 498 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 499 | dependencies: 500 | sourcemap-codec: 1.4.8 501 | dev: true 502 | 503 | /mime@3.0.0: 504 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 505 | engines: {node: '>=10.0.0'} 506 | hasBin: true 507 | dev: true 508 | 509 | /mime@4.0.1: 510 | resolution: {integrity: sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==} 511 | engines: {node: '>=16'} 512 | hasBin: true 513 | dev: false 514 | 515 | /miniflare@3.20230918.0: 516 | resolution: {integrity: sha512-Dd29HB7ZlT1CXB2tPH8nW6fBOOXi/m7qFZHjKm2jGS+1OaGfrv0PkT5UspWW5jQi8rWI87xtordAUiIJkwWqRw==} 517 | engines: {node: '>=16.13'} 518 | dependencies: 519 | acorn: 8.10.0 520 | acorn-walk: 8.2.0 521 | capnp-ts: 0.7.0 522 | exit-hook: 2.2.1 523 | glob-to-regexp: 0.4.1 524 | source-map-support: 0.5.21 525 | stoppable: 1.1.0 526 | undici: 5.26.4 527 | workerd: 1.20230904.0 528 | ws: 8.14.2 529 | youch: 3.3.2 530 | zod: 3.22.4 531 | transitivePeerDependencies: 532 | - bufferutil 533 | - supports-color 534 | - utf-8-validate 535 | dev: true 536 | 537 | /ms@2.1.2: 538 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 539 | dev: true 540 | 541 | /mustache@4.2.0: 542 | resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} 543 | hasBin: true 544 | dev: true 545 | 546 | /nanoid@3.3.6: 547 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 548 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 549 | hasBin: true 550 | dev: true 551 | 552 | /node-forge@1.3.1: 553 | resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} 554 | engines: {node: '>= 6.13.0'} 555 | dev: true 556 | 557 | /normalize-path@3.0.0: 558 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 559 | engines: {node: '>=0.10.0'} 560 | dev: true 561 | 562 | /path-to-regexp@6.2.1: 563 | resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} 564 | dev: true 565 | 566 | /picomatch@2.3.1: 567 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 568 | engines: {node: '>=8.6'} 569 | dev: true 570 | 571 | /printable-characters@1.0.42: 572 | resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} 573 | dev: true 574 | 575 | /readdirp@3.6.0: 576 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 577 | engines: {node: '>=8.10.0'} 578 | dependencies: 579 | picomatch: 2.3.1 580 | dev: true 581 | 582 | /rollup-plugin-inject@3.0.2: 583 | resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} 584 | deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. 585 | dependencies: 586 | estree-walker: 0.6.1 587 | magic-string: 0.25.9 588 | rollup-pluginutils: 2.8.2 589 | dev: true 590 | 591 | /rollup-plugin-node-polyfills@0.2.1: 592 | resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} 593 | dependencies: 594 | rollup-plugin-inject: 3.0.2 595 | dev: true 596 | 597 | /rollup-pluginutils@2.8.2: 598 | resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} 599 | dependencies: 600 | estree-walker: 0.6.1 601 | dev: true 602 | 603 | /selfsigned@2.1.1: 604 | resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} 605 | engines: {node: '>=10'} 606 | dependencies: 607 | node-forge: 1.3.1 608 | dev: true 609 | 610 | /source-map-support@0.5.21: 611 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 612 | dependencies: 613 | buffer-from: 1.1.2 614 | source-map: 0.6.1 615 | dev: true 616 | 617 | /source-map@0.6.1: 618 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 619 | engines: {node: '>=0.10.0'} 620 | dev: true 621 | 622 | /sourcemap-codec@1.4.8: 623 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 624 | deprecated: Please use @jridgewell/sourcemap-codec instead 625 | dev: true 626 | 627 | /stacktracey@2.1.8: 628 | resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} 629 | dependencies: 630 | as-table: 1.0.55 631 | get-source: 2.0.12 632 | dev: true 633 | 634 | /stoppable@1.1.0: 635 | resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} 636 | engines: {node: '>=4', npm: '>=6'} 637 | dev: true 638 | 639 | /to-regex-range@5.0.1: 640 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 641 | engines: {node: '>=8.0'} 642 | dependencies: 643 | is-number: 7.0.0 644 | dev: true 645 | 646 | /tslib@2.6.2: 647 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 648 | dev: true 649 | 650 | /undici@5.26.4: 651 | resolution: {integrity: sha512-OG+QOf0fTLtazL9P9X7yqWxQ+Z0395Wk6DSkyTxtaq3wQEjIroVe7Y4asCX/vcCxYpNGMnwz8F0qbRYUoaQVMw==} 652 | engines: {node: '>=14.0'} 653 | dependencies: 654 | '@fastify/busboy': 2.0.0 655 | dev: true 656 | 657 | /workerd@1.20230904.0: 658 | resolution: {integrity: sha512-t9znszH0rQGK4mJGvF9L3nN0qKEaObAGx0JkywFtAwH8OkSn+YfQbHNZE+YsJ4qa1hOz1DCNEk08UDFRBaYq4g==} 659 | engines: {node: '>=16'} 660 | hasBin: true 661 | requiresBuild: true 662 | optionalDependencies: 663 | '@cloudflare/workerd-darwin-64': 1.20230904.0 664 | '@cloudflare/workerd-darwin-arm64': 1.20230904.0 665 | '@cloudflare/workerd-linux-64': 1.20230904.0 666 | '@cloudflare/workerd-linux-arm64': 1.20230904.0 667 | '@cloudflare/workerd-windows-64': 1.20230904.0 668 | dev: true 669 | 670 | /wrangler@3.9.0: 671 | resolution: {integrity: sha512-Ho1A76KxbqfcRgCsuN6xGar3BVPyn4oVWM9zx0HvEVhT9wQ7n/LvB6GlPdXKABqEBYhVe/oTH72S5TgWl0DgaA==} 672 | engines: {node: '>=16.13.0'} 673 | hasBin: true 674 | dependencies: 675 | '@cloudflare/kv-asset-handler': 0.2.0 676 | '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) 677 | '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) 678 | blake3-wasm: 2.1.5 679 | chokidar: 3.5.3 680 | esbuild: 0.17.19 681 | miniflare: 3.20230918.0 682 | nanoid: 3.3.6 683 | path-to-regexp: 6.2.1 684 | selfsigned: 2.1.1 685 | source-map: 0.6.1 686 | source-map-support: 0.5.21 687 | xxhash-wasm: 1.0.2 688 | optionalDependencies: 689 | fsevents: 2.3.3 690 | transitivePeerDependencies: 691 | - bufferutil 692 | - supports-color 693 | - utf-8-validate 694 | dev: true 695 | 696 | /ws@8.14.2: 697 | resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} 698 | engines: {node: '>=10.0.0'} 699 | peerDependencies: 700 | bufferutil: ^4.0.1 701 | utf-8-validate: '>=5.0.2' 702 | peerDependenciesMeta: 703 | bufferutil: 704 | optional: true 705 | utf-8-validate: 706 | optional: true 707 | dev: true 708 | 709 | /xxhash-wasm@1.0.2: 710 | resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} 711 | dev: true 712 | 713 | /youch@3.3.2: 714 | resolution: {integrity: sha512-9cwz/z7abtcHOIuH45nzmUFCZbyJA1nLqlirKvyNRx4wDMhqsBaifAJzBej7L4fsVPjFxYq3NK3GAcfvZsydFw==} 715 | dependencies: 716 | cookie: 0.5.0 717 | mustache: 4.2.0 718 | stacktracey: 2.1.8 719 | dev: true 720 | 721 | /zod@3.22.4: 722 | resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} 723 | dev: true 724 | --------------------------------------------------------------------------------