From 773376207b18401ea95ec3aabd5d3f0e99ee5a0c Mon Sep 17 00:00:00 2001 From: "create-issue-branch[bot]" <53036503+create-issue-branch[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 19:56:58 -0700 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20Add=20SSR=20Handling=20(#10?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Create draft PR for #9 [skip ci] * Implement SSR * add changeset --------- Co-authored-by: create-issue-branch[bot] <53036503+create-issue-branch[bot]@users.noreply.github.com> Co-authored-by: Adam Matthiesen --- .changeset/modern-carrots-develop.md | 5 + package/src/astro-hashnode.ts | 38 ++- package/src/pages/blog/[slug].astro | 1 + package/src/pages/blog/tags/[tag].astro | 5 + package/src/pages/ssr-pages/[slug].astro | 57 ++++ .../{astro.config.mts => astro.config.mjs} | 5 + playground/package.json | 7 +- pnpm-lock.yaml | 306 +++++++++++++++++- 8 files changed, 408 insertions(+), 16 deletions(-) create mode 100644 .changeset/modern-carrots-develop.md create mode 100644 package/src/pages/ssr-pages/[slug].astro rename playground/{astro.config.mts => astro.config.mjs} (71%) diff --git a/.changeset/modern-carrots-develop.md b/.changeset/modern-carrots-develop.md new file mode 100644 index 0000000..eb64680 --- /dev/null +++ b/.changeset/modern-carrots-develop.md @@ -0,0 +1,5 @@ +--- +"@matthiesenxyz/astro-hashnode": patch +--- + +Add SSR support for blog posts (Tags are still prerendered) diff --git a/package/src/astro-hashnode.ts b/package/src/astro-hashnode.ts index 2c44b21..486be0e 100644 --- a/package/src/astro-hashnode.ts +++ b/package/src/astro-hashnode.ts @@ -15,6 +15,7 @@ export default defineIntegration({ optionsSchema, plugins: [ ...corePlugins, addDtsPlugin ], setup({ options }) { + type outputType = "static" | "hybrid" | "server"; return { "astro:config:setup": ({ @@ -50,6 +51,13 @@ export default defineIntegration({ throw new AstroError(message) } + // Check if output is static or hybrid + const checkIfStatic = (output: outputType) => { + if (output === "static") { return true } + if (output === "hybrid") { return true } + return false + } + hashLogNoVerbose("Setting up Astro-Hashnode Integration") // Check for Hashnode URL @@ -62,7 +70,7 @@ export default defineIntegration({ hashLog("Setting up Virtual Imports and Layout Component") // Setup Layout Component // biome-ignore lint/suspicious/noImplicitAnyLet: This is a false positive - let layoutComponentPath + let layoutComponentPath if (options.layoutComponent) { layoutComponentPath = rootResolve(options.layoutComponent) @@ -81,8 +89,8 @@ export default defineIntegration({ content: readFileSync(resolve("./definitions/astro-hashnode.d.ts"), "utf-8"), }) - hashLog("Setting up 'Tailwind CSS v4' Integration") // Add & Setup Tailwind CSS + hashLog("Setting up 'Tailwind CSS v4' Integration") const twplugin = tailwindcss(); for (const twp of twplugin) { addVitePlugin(twp); @@ -102,22 +110,19 @@ export default defineIntegration({ } }) - hashLog("Setting up Page Routes") // Add Page Routes + hashLog("Setting up Page Routes") if (options.landingPage) { injectRoute({ pattern: config.base, entrypoint: resolve("./pages/index.astro"), + prerender: true, }); } injectRoute({ pattern: `${config.base}blog`, entrypoint: resolve("./pages/blog/index.astro"), }) - injectRoute({ - pattern: `${config.base}blog/[slug]`, - entrypoint: resolve("./pages/blog/[slug].astro"), - }) injectRoute({ pattern: `${config.base}blog/about`, entrypoint: resolve("./pages/blog/about.astro"), @@ -125,7 +130,26 @@ export default defineIntegration({ injectRoute({ pattern: `${config.base}blog/tags/[tag]`, entrypoint: resolve("./pages/blog/tags/[tag].astro"), + prerender: true, }) + + // Add Blog Post Routes based on output type + if ( checkIfStatic(config.output) ) { + // Static & Hybrid Routes + injectRoute({ + pattern: `${config.base}blog/[slug]`, + entrypoint: resolve("./pages/blog/[slug].astro"), + prerender: true, + }) + } else { + // Server Routes + injectRoute({ + pattern: `${config.base}blog/[slug]`, + entrypoint: resolve("./pages/ssr-pages/[slug].astro"), + }) + } + + }, "astro:config:done": ({ logger }) => { const HashLogger = logger.fork(c.bold(c.blue("Astro-Hashnode"))); diff --git a/package/src/pages/blog/[slug].astro b/package/src/pages/blog/[slug].astro index 6e4d14a..2ee3792 100644 --- a/package/src/pages/blog/[slug].astro +++ b/package/src/pages/blog/[slug].astro @@ -18,6 +18,7 @@ export async function getStaticPaths() { } const { slug } = Astro.params; const post = await getPost(slug); + ---
diff --git a/package/src/pages/blog/tags/[tag].astro b/package/src/pages/blog/tags/[tag].astro index 42c17f0..ef17514 100644 --- a/package/src/pages/blog/tags/[tag].astro +++ b/package/src/pages/blog/tags/[tag].astro @@ -4,10 +4,13 @@ import Posts from '../../../components/Posts.astro'; import {getAllPosts} from '../../../hn-gql'; import Taged from '../../../components/Tag.astro'; +export const prerender = true + export async function getStaticPaths() { const data = await getAllPosts(); const allPosts = data.publication.posts.edges; + // biome-ignore lint/complexity/useFlatMap: const allTags = [...new Set(allPosts.map((post) => post.node.tags).flat())]; const jsonObject = allTags.map((object) => JSON.stringify(object)); const uniqueSet = new Set(jsonObject); @@ -15,8 +18,10 @@ export async function getStaticPaths() { return uniqueTags.map((uTag) => { const filteredPosts: { node: { author: { name: string; profilePicture: string; }; publishedAt: string; title: string; subtitle: string; brief: string; slug: string; readTimeInMinutes: number; content: { html: string; }; tags: { name: string; slug: string; }[]; coverImage: { url: string; }; }; }[] = []; + // biome-ignore lint/complexity/noForEach: allPosts.forEach((post) => { const tags = post.node.tags; + // biome-ignore lint/complexity/noForEach: tags.forEach((tag) => { if(tag.slug === uTag.slug) { filteredPosts.push(post) diff --git a/package/src/pages/ssr-pages/[slug].astro b/package/src/pages/ssr-pages/[slug].astro new file mode 100644 index 0000000..5f46421 --- /dev/null +++ b/package/src/pages/ssr-pages/[slug].astro @@ -0,0 +1,57 @@ +--- +import { Layout } from "virtual:astro-hashnode/components"; +import { getPost } from '../../hn-gql'; +import Tag from '../../components/Tag.astro'; +import Author from '../../components/Author.astro'; +import { Markup } from 'astro-remote'; +import { Image } from 'astro:assets'; +import RemoteImage from '../../components/astro-remote/RemoteImage.astro'; + +const { slug } = Astro.params; + +const checkSlug = (slug:string|undefined) => { + if (slug !== undefined) { + return slug as string; + } + return " " as string; +} + +const post = await getPost(checkSlug(slug)); +--- +{post ? ( + +
+ {post.title} +

{post.title}

+

{post.subtitle}

+ + + +
+ {post.tags && post.tags.map((tag) => )} +
+ +
+ + +
+
+
) : ( + +
+

404

+

Post not found

+
+
+)} \ No newline at end of file diff --git a/playground/astro.config.mts b/playground/astro.config.mjs similarity index 71% rename from playground/astro.config.mts rename to playground/astro.config.mjs index fd966d1..2c19750 100644 --- a/playground/astro.config.mts +++ b/playground/astro.config.mjs @@ -1,8 +1,13 @@ import { defineConfig } from "astro/config"; import astroHashnode from "@matthiesenxyz/astro-hashnode"; +// import node from '@astrojs/node'; // https://astro.build/config export default defineConfig({ + // output: 'server', + // adapter: node({ + // mode: 'standalone', + // }), integrations: [ astroHashnode({ hashnodeURL: "astroplayground.hashnode.dev", diff --git a/playground/package.json b/playground/package.json index a94fb46..9a3700e 100644 --- a/playground/package.json +++ b/playground/package.json @@ -11,12 +11,13 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.4.15", - "@matthiesenxyz/astro-hashnode": "workspace:*" + "@astrojs/node": "8.2.3", + "@matthiesenxyz/astro-hashnode": "workspace:*", + "astro": "^4.5.1" }, "devDependencies": { "@astrojs/check": "^0.5.7", "@types/node": "^20.11.25", - "typescript": "^5.3.3" + "typescript": "^5.4.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7d2aef..ac924eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: 4.0.0-alpha.7 astro: specifier: '>=4.4.1' - version: 4.4.15(@types/node@20.11.25)(typescript@5.4.2) + version: 4.4.15(typescript@5.4.2) astro-font: specifier: ^0.0.77 version: 0.0.77 @@ -57,12 +57,15 @@ importers: playground: dependencies: + '@astrojs/node': + specifier: 8.2.3 + version: 8.2.3(astro@4.5.1) '@matthiesenxyz/astro-hashnode': specifier: workspace:* version: link:../package astro: - specifier: ^4.4.15 - version: 4.4.15(@types/node@20.11.25)(typescript@5.4.2) + specifier: ^4.5.1 + version: 4.5.1(@types/node@20.11.25)(typescript@5.4.2) devDependencies: '@astrojs/check': specifier: ^0.5.7 @@ -71,7 +74,7 @@ importers: specifier: ^20.11.25 version: 20.11.25 typescript: - specifier: ^5.3.3 + specifier: ^5.4.2 version: 5.4.2 packages: @@ -125,6 +128,10 @@ packages: resolution: {integrity: sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==} dev: false + /@astrojs/internal-helpers@0.3.0: + resolution: {integrity: sha512-tGmHvrhpzuz0JBHaJX8GywN9g4rldVNHtkoVDC3m/DdzBO70jGoVuc0uuNVglRYnsdwkbG0K02Iw3nOOR3/Y4g==} + dev: false + /@astrojs/language-server@2.7.6(typescript@5.4.2): resolution: {integrity: sha512-NhMSmMAuKBMXnvpfn9eYPR7R6zOasAjRb+ta8L+rCHHuKzUc0lBgAF5M6rx01FJqlpGqeqao13eYt4287Ze49g==} hasBin: true @@ -210,6 +217,43 @@ packages: - supports-color dev: false + /@astrojs/markdown-remark@4.3.0: + resolution: {integrity: sha512-iZOgYj/yNDvBRfKqkGuAvjeONhjQPq8Uk3HjyIgcTK5valq03NiUgSc5Ovq00yUVBeYJ/5EDx23c8xqtkkBlPw==} + dependencies: + '@astrojs/prism': 3.0.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.1 + hast-util-to-text: 4.0.0 + import-meta-resolve: 4.0.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + remark-smartypants: 2.1.0 + shiki: 1.1.7 + unified: 11.0.4 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/node@8.2.3(astro@4.5.1): + resolution: {integrity: sha512-VQQy7QIv4X+5dlKCEchYIxMFryS+BwDOFGNzeRmHe1/P819TlNup9/M8XqnWW4aZPxV7P6CoDeFxX6HuT/kOmQ==} + peerDependencies: + astro: ^4.2.0 + dependencies: + astro: 4.5.1(@types/node@20.11.25)(typescript@5.4.2) + send: 0.18.0 + server-destroy: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /@astrojs/prism@3.0.0: resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} engines: {node: '>=18.14.1'} @@ -1101,6 +1145,10 @@ packages: requiresBuild: true optional: true + /@shikijs/core@1.1.7: + resolution: {integrity: sha512-gTYLUIuD1UbZp/11qozD3fWpUTuMqPSf3svDMMrL0UmlGU7D9dPw/V1FonwAorCUJBltaaESxq90jrSjQyGixg==} + dev: false + /@tailwindcss/oxide-android-arm64@4.0.0-alpha.7: resolution: {integrity: sha512-T50CFEgc1ZUe3/WkXthh9pOAdqRhXDTZgnUhPcBjjZue9WXb5mqupxwMtmgzRE/o/sBtt7gVBTIu6pA3afXbcw==} engines: {node: '>= 10'} @@ -1525,7 +1573,7 @@ packages: vue: optional: true dependencies: - astro: 4.4.15(@types/node@20.11.25)(typescript@5.4.2) + astro: 4.4.15(typescript@5.4.2) pathe: 1.1.2 recast: 0.23.6 dev: false @@ -1551,7 +1599,7 @@ packages: - typescript dev: false - /astro@4.4.15(@types/node@20.11.25)(typescript@5.4.2): + /astro@4.4.15(typescript@5.4.2): resolution: {integrity: sha512-RTiAnlO8hDp6GqMVvaeJxyuCJhHNEho09lHshMNQBqgRabYPOJGW0HZZrbLRGNOqN9I14ivhZIunYGgAaGQpWw==} engines: {node: '>=18.14.1', npm: '>=6.14.0'} hasBin: true @@ -1634,6 +1682,89 @@ packages: - typescript dev: false + /astro@4.5.1(@types/node@20.11.25)(typescript@5.4.2): + resolution: {integrity: sha512-xqSBxeDZFUUgHl+npNwgoe6taTOCI8sJNwqWJaK3t/vcCHdfYJX00Tr9g43w/cYKPoTN4wKbNktbKYJZAbE3ZQ==} + engines: {node: '>=18.14.1', npm: '>=6.14.0'} + hasBin: true + dependencies: + '@astrojs/compiler': 2.7.0 + '@astrojs/internal-helpers': 0.3.0 + '@astrojs/markdown-remark': 4.3.0 + '@astrojs/telemetry': 3.0.4 + '@babel/core': 7.24.0 + '@babel/generator': 7.23.6 + '@babel/parser': 7.24.0 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.0) + '@babel/traverse': 7.24.0 + '@babel/types': 7.24.0 + '@shikijs/core': 1.1.7 + '@types/babel__core': 7.20.5 + acorn: 8.11.3 + aria-query: 5.3.0 + axobject-query: 4.0.0 + boxen: 7.1.1 + chokidar: 3.6.0 + ci-info: 4.0.0 + clsx: 2.1.0 + common-ancestor-path: 1.0.1 + cookie: 0.6.0 + cssesc: 3.0.0 + debug: 4.3.4 + deterministic-object-hash: 2.0.2 + devalue: 4.3.2 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.3 + es-module-lexer: 1.4.1 + esbuild: 0.19.12 + estree-walker: 3.0.3 + execa: 8.0.1 + fast-glob: 3.3.2 + flattie: 1.1.1 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.8 + mdast-util-to-hast: 13.0.2 + mime: 3.0.0 + ora: 7.0.1 + p-limit: 5.0.0 + p-queue: 8.0.1 + path-to-regexp: 6.2.1 + preferred-pm: 3.1.3 + prompts: 2.4.2 + rehype: 13.0.1 + resolve: 1.22.8 + semver: 7.6.0 + shiki: 1.1.7 + string-width: 7.1.0 + strip-ansi: 7.1.0 + tsconfck: 3.0.3(typescript@5.4.2) + unist-util-visit: 5.0.0 + vfile: 6.0.1 + vite: 5.1.5(@types/node@20.11.25) + vitefu: 0.2.5(vite@5.1.5) + which-pm: 2.1.1 + yargs-parser: 21.1.1 + zod: 3.22.4 + zod-to-json-schema: 3.22.4(zod@3.22.4) + optionalDependencies: + sharp: 0.32.6 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - typescript + dev: false + /available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -2031,6 +2162,17 @@ packages: stream-transform: 2.1.3 dev: true + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2102,11 +2244,21 @@ packages: object-keys: 1.1.1 dev: true + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} dev: false + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -2167,6 +2319,10 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: false + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + /electron-to-chromium@1.4.699: resolution: {integrity: sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw==} dev: false @@ -2188,6 +2344,11 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: false + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} requiresBuild: true @@ -2336,6 +2497,10 @@ packages: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -2356,6 +2521,11 @@ packages: '@types/estree': 1.0.5 dev: false + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: false @@ -2464,6 +2634,11 @@ packages: is-callable: 1.2.7 dev: true + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} requiresBuild: true @@ -2702,6 +2877,12 @@ packages: web-namespaces: 2.0.1 dev: false + /hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + dependencies: + '@types/hast': 3.0.4 + dev: false + /hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} dependencies: @@ -2755,6 +2936,15 @@ packages: zwitch: 2.0.4 dev: false + /hast-util-to-text@4.0.0: + resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + dev: false + /hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} dependencies: @@ -2787,6 +2977,17 @@ packages: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + /human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true @@ -3722,6 +3923,12 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + /mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} @@ -3776,10 +3983,18 @@ packages: dev: false optional: true + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: false + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + /muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} @@ -3870,6 +4085,13 @@ packages: object-keys: 1.1.1 dev: true + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} requiresBuild: true @@ -4143,6 +4365,11 @@ packages: engines: {node: '>=8'} dev: true + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -4466,6 +4693,31 @@ packages: dependencies: lru-cache: 6.0.0 + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /server-destroy@1.0.1: + resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} + dev: false + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true @@ -4492,6 +4744,10 @@ packages: has-property-descriptors: 1.0.2 dev: true + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + /sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} @@ -4532,6 +4788,12 @@ packages: engines: {node: '>=8'} dev: false + /shiki@1.1.7: + resolution: {integrity: sha512-9kUTMjZtcPH3i7vHunA6EraTPpPOITYTdA5uMrvsJRexktqP0s7P3s9HVK80b4pP42FRVe03D7fT3NmJv2yYhw==} + dependencies: + '@shikijs/core': 1.1.7 + dev: false + /shikiji-core@0.9.19: resolution: {integrity: sha512-AFJu/vcNT21t0e6YrfadZ+9q86gvPum6iywRyt1OtIPjPFe25RQnYJyxHQPMLKCCWA992TPxmEmbNcOZCAJclw==} dev: false @@ -4656,6 +4918,11 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + /stdin-discarder@0.1.0: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4890,6 +5157,11 @@ packages: dependencies: is-number: 7.0.0 + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false @@ -5067,6 +5339,13 @@ packages: vfile: 6.0.1 dev: false + /unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: false + /unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} dependencies: @@ -5092,6 +5371,13 @@ packages: '@types/unist': 3.0.2 dev: false + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + dev: false + /unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: @@ -5565,6 +5851,14 @@ packages: engines: {node: '>=12.20'} dev: false + /zod-to-json-schema@3.22.4(zod@3.22.4): + resolution: {integrity: sha512-2Ed5dJ+n/O3cU383xSY28cuVi0BCQhF8nYqWU5paEpl7fVdqdAmiLdqLyfblbNdfOFwFfi/mqU4O1pwc60iBhQ==} + peerDependencies: + zod: ^3.22.4 + dependencies: + zod: 3.22.4 + dev: false + /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false