feat: Add SSR Handling (#10)

* 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 <amatthiesen@outlook.com>
This commit is contained in:
create-issue-branch[bot] 2024-03-11 19:56:58 -07:00 committed by GitHub
parent 4b159a9bbb
commit 773376207b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 408 additions and 16 deletions

View File

@ -0,0 +1,5 @@
---
"@matthiesenxyz/astro-hashnode": patch
---
Add SSR support for blog posts (Tags are still prerendered)

View File

@ -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
@ -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")));

View File

@ -18,6 +18,7 @@ export async function getStaticPaths() {
}
const { slug } = Astro.params;
const post = await getPost(slug);
---
<Layout pageTitle={post.title} ogImage={post.coverImage.url}>
<article class="bg-white p-3 mt-3 flex flex-col">

View File

@ -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: <explanation>
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: <explanation>
allPosts.forEach((post) => {
const tags = post.node.tags;
// biome-ignore lint/complexity/noForEach: <explanation>
tags.forEach((tag) => {
if(tag.slug === uTag.slug) {
filteredPosts.push(post)

View File

@ -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 ? (
<Layout pageTitle={post.title} ogImage={post.coverImage.url}>
<article class="bg-white p-3 mt-3 flex flex-col">
<Image
class="rounded-lg"
src={post.coverImage.url}
alt={post.title}
inferSize={true}
loading="eager"
/>
<h1 class="text-4xl font-bold pt-5">{post.title}</h1>
<h2 class="text-xl pt-3 pb-3" aria-label="CoverPhoto Subtitle">{post.subtitle}</h2>
<Author post={post} />
<div class="flex flex-wrap justify-center items-center mt-5 mb-5">
{post.tags && post.tags.map((tag) => <Tag tag={tag} />)}
</div>
<div class="post-details">
<Markup
content={post.content.html}
components={{
img: RemoteImage
}}
/>
</div>
</article>
</Layout>) : (
<Layout pageTitle="404">
<div class="text-center my-20">
<h1 class="text-4xl font-bold">404</h1>
<p>Post not found</p>
</div>
</Layout>
)}

View File

@ -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",

View File

@ -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"
}
}

View File

@ -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