From 2450efe63a04f3d4b40313b5f80c55dff9d79587 Mon Sep 17 00:00:00 2001 From: Jade Ellis Date: Wed, 17 Jul 2024 02:05:28 +0100 Subject: [PATCH] Add RSS and JSON feeds --- packages/website/package.json | 1 + packages/website/src/routes/+page.svelte | 7 ++ packages/website/src/routes/blog/+page.svelte | 7 +- .../routes/blog/[...date]/[slug]/+page.svelte | 7 +- .../blog/[...date]/feed.json/+server.ts | 72 +++++++++++ .../routes/blog/[...date]/rss.xml/+server.ts | 80 +++++++++++++ .../blog/[...date]/rss.xml/rss-style.xsl | 100 ++++++++++++++++ .../routes/blog/[...date]/rss.xml/styles.css | 34 ++++++ .../website/src/routes/feed.json/+server.ts | 55 --------- .../website/src/routes/rss.xml/+server.ts | 56 --------- packages/website/vite.config.ts | 9 +- pnpm-lock.yaml | 113 ++++++++++++++++++ 12 files changed, 427 insertions(+), 114 deletions(-) create mode 100644 packages/website/src/routes/blog/[...date]/feed.json/+server.ts create mode 100644 packages/website/src/routes/blog/[...date]/rss.xml/+server.ts create mode 100644 packages/website/src/routes/blog/[...date]/rss.xml/rss-style.xsl create mode 100644 packages/website/src/routes/blog/[...date]/rss.xml/styles.css delete mode 100644 packages/website/src/routes/feed.json/+server.ts delete mode 100644 packages/website/src/routes/rss.xml/+server.ts diff --git a/packages/website/package.json b/packages/website/package.json index 387fa7bf..5f9858b4 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -38,6 +38,7 @@ "remark-wiki-link": "^0.0.4", "rollup": "^4.18.0", "rollup-plugin-type-as-json-schema": "^0.2.6", + "rollup-plugin-visualizer": "^5.12.0", "sharp": "^0.33.4", "svelte": "^4.2.18", "svelte-check": "^3.8.0", diff --git a/packages/website/src/routes/+page.svelte b/packages/website/src/routes/+page.svelte index ce924864..de9e249d 100644 --- a/packages/website/src/routes/+page.svelte +++ b/packages/website/src/routes/+page.svelte @@ -2,7 +2,14 @@ import Hero from "$lib/Hero.svelte"; import SvelteSeo from "svelte-seo"; import Homepage from "Notes/Website Homepage.md"; + import { SITE_URL, SITE_TITLE } from "$lib/metadata"; + + + + + + import { page } from "$app/stores"; - import { SITE_URL } from "$lib/metadata"; + import { SITE_URL, SITE_TITLE } from "$lib/metadata"; import SvelteSeo from "svelte-seo"; export let data; @@ -8,6 +8,11 @@ // $: console.log(data); + + + + + diff --git a/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte b/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte index e54be8b0..81f712f4 100644 --- a/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte +++ b/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte @@ -4,7 +4,7 @@ import { browser } from "$app/environment"; import SvelteSeo from "svelte-seo"; export let data; - import { SITE_URL } from "$lib/metadata"; + import { SITE_URL, SITE_TITLE } from "$lib/metadata"; import Toc from "$lib/Toc.svelte"; // let GhReleasesDownload: Promise; // if (data.ghReleaseData) { @@ -31,6 +31,11 @@ }; + + + + + s.length !== 0).map((p) => parseInt(p, 10)) + if (dateParts.length > 3) { + throw error(404, 'Feed not found (bad date)') + } + + const selectedPages = dateParts.length ? pages + .filter((post) => { + let date = new Date(post.date) + return ( + (!dateParts[0] || date.getFullYear() == dateParts[0]) && + (!dateParts[1] || date.getMonth()+1 == dateParts[1]) && + (!dateParts[2] || date.getDate() == dateParts[2]) + ) + }) : pages; + const headers = { + 'Cache-Control': 'max-age=0, s-maxage=3600', + 'Content-Type': 'application/feed+json' + }; + return new Response(await getJsonFeed(url.href, selectedPages), { headers }); +} + +const AUTHOR = "Jade Ellis" +// prettier-ignore +async function getJsonFeed(selfUrl: string, pages: any[]): Promise { + + const feed: Feed = { + version: 'https://jsonfeed.org/version/1.1', + title: SITE_TITLE, + icon: `${SITE_URL}/android-chrome-256x256.png`, + home_page_url: SITE_URL, + description: SITE_DEFAULT_DESCRIPTION, + feed_url: selfUrl, + authors: [{ name: AUTHOR }], + items: [ + ], + } + + for await (const post of pages) { + const title = post.title; + const pubDate = post.date + const postUrl = SITE_URL + "/blog/" + post.canonical + // const postHtml = + const summary = post.description; + let item: typeof feed.items[number] = { + id: post.postUrl, + title, + url: postUrl, + date_published: pubDate, + summary, + content_text: "", + } + feed.items.push(item) + } + + return JSON.stringify(feed) +} diff --git a/packages/website/src/routes/blog/[...date]/rss.xml/+server.ts b/packages/website/src/routes/blog/[...date]/rss.xml/+server.ts new file mode 100644 index 00000000..ad85b150 --- /dev/null +++ b/packages/website/src/routes/blog/[...date]/rss.xml/+server.ts @@ -0,0 +1,80 @@ +import { pages } from '../../posts' + +import { + SITE_DEFAULT_DESCRIPTION, + SITE_TITLE, + SITE_URL, + RSS_DEFAULT_POSTS_PER_PAGE +} from '$lib/metadata'; +import rssStyle from "./rss-style.xsl?url" +import rssStyleCss from "./styles.css?url" +import { create } from 'xmlbuilder2'; +import { error } from '@sveltejs/kit' +// import { base } from '$app/paths'; + +export const prerender = true; + +export async function GET({ url, params }) { + let dateParts = params.date.split(/[\/-]/).filter((s)=>s.length !== 0).map((p) => parseInt(p, 10)) + if (dateParts.length > 3) { + throw error(404, 'Feed not found (bad date)') + } + + const selectedPages = dateParts.length ? pages + .filter((post) => { + console.log("filtering") + let date = new Date(post.date) + return ( + (!dateParts[0] || date.getFullYear() == dateParts[0]) && + (!dateParts[1] || date.getMonth()+1 == dateParts[1]) && + (!dateParts[2] || date.getDate() == dateParts[2]) + ) + }) : pages; + const headers = { + 'Cache-Control': 'max-age=0, s-maxage=3600', + 'Content-Type': 'application/xml' + }; + url.search = ""; + return new Response(await getRssXml(url.href, selectedPages), { headers }); +} + +const AUTHOR = "Jade Ellis" +// prettier-ignore +async function getRssXml(selfUrl: string, pages: any[]): Promise { + // const rssUrl = `${SITE_URL}/rss.xml`; + const root = create({ version: '1.0', encoding: 'utf-8' }) + .ins('xml-stylesheet', `type="text/xsl" href="${rssStyle}"`) + .ele('feed', { + xmlns: 'http://www.w3.org/2005/Atom', + "xmlns:jade": 'http://jade.ellis.link', + }) + .ele('jade:link', { rel:"stylesheet", href: rssStyleCss }).up() + .ele('title').txt(SITE_TITLE).up() + .ele('link', { href: SITE_URL }).up() + .ele('link', { rel: 'self', href: selfUrl }).up() + .ele('updated').txt(new Date().toISOString()).up() + .ele('id').txt(SITE_URL).up() + .ele('author') + .ele('name').txt(AUTHOR).up() + .up() + .ele('subtitle').txt(SITE_DEFAULT_DESCRIPTION).up() + + for await (const post of pages) { + const title = post.title; + const pubDate = post.date + const postUrl = SITE_URL + "/blog/" + post.canonical + // const postHtml = + const summary = post.description; + + root.ele('entry') + .ele('title').txt(title).up() + .ele('link', { href: postUrl }).up() + .ele('published').txt(pubDate).up() + .ele('id').txt(postUrl).up() + // .ele('content', { type: 'html' }).txt(postHtml).up() + .ele('summary').txt(summary).up() + .up(); + } + + return root.end() +} diff --git a/packages/website/src/routes/blog/[...date]/rss.xml/rss-style.xsl b/packages/website/src/routes/blog/[...date]/rss.xml/rss-style.xsl new file mode 100644 index 00000000..5166bdaa --- /dev/null +++ b/packages/website/src/routes/blog/[...date]/rss.xml/rss-style.xsl @@ -0,0 +1,100 @@ + + + + + + + + RSS Feed | + <xsl:value-of select="/atom:feed/atom:title"/> + + + + + + + + + + +
+ + + This is an RSS feed. Subscribe by copying + the URL from the address bar into your newsreader. Visit About Feeds to learn more + and get started. It’s free. + +
+

+ + + + + + + + + + + + + + + + + + + + + RSS Feed Preview +

+

+

+ +

+ + + + + Visit Website → + + +

Recent blog posts

+ + + +
+
+ + +
+
diff --git a/packages/website/src/routes/blog/[...date]/rss.xml/styles.css b/packages/website/src/routes/blog/[...date]/rss.xml/styles.css new file mode 100644 index 00000000..696d4179 --- /dev/null +++ b/packages/website/src/routes/blog/[...date]/rss.xml/styles.css @@ -0,0 +1,34 @@ +@import url("$lib/styles.css"); + +body { + padding-block: var(--spacing); +} +.inline-icon { + margin-right: 0.75rem +} +h1 { + /* font-size: 3.8rem; */ + line-height: 1; + /* font-weight: 800; */ + /* margin-bottom: 4rem; */ + text-wrap: balance; + } +.flex { + display: flex +} + +.flex-col { + flex-direction: column +} + +.flex-wrap { + flex-wrap: wrap +} + +.items-center { + align-items: center +} + +.items-start { + align-items: flex-start +} \ No newline at end of file diff --git a/packages/website/src/routes/feed.json/+server.ts b/packages/website/src/routes/feed.json/+server.ts deleted file mode 100644 index 0a9bb206..00000000 --- a/packages/website/src/routes/feed.json/+server.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type Feed from '@json-feed-types/1_1' -import { - SITE_DEFAULT_DESCRIPTION, - SITE_TITLE, - SITE_URL, - RSS_DEFAULT_POSTS_PER_PAGE -} from '$lib/metadata'; - -import { create } from 'xmlbuilder2'; -// import { base } from '$app/paths'; - -export const prerender = true; - -export async function GET() { - const headers = { - 'Cache-Control': 'max-age=0, s-maxage=3600', - 'Content-Type': 'application/feed+json' - }; - return new Response(await getJsonFeed(), { headers }); -} - -const AUTHOR = "Jade Ellis" -// prettier-ignore -async function getJsonFeed(): Promise { - const feedUrl = `${SITE_URL}/feed.json`; - - const feed: Feed = { - version: 'https://jsonfeed.org/version/1.1', - title: SITE_TITLE, - icon: `${SITE_URL}/android-chrome-256x256.png`, - home_page_url: SITE_URL, - description: SITE_DEFAULT_DESCRIPTION, - feed_url: feedUrl, - authors: [{ name: AUTHOR }], - items: [ - ], - } - // for await (const post of posts) { - // const pubDate = - // const postUrl = - // const postHtml = - // const summary = post.metadata.description; - - // root.ele('entry') - // .ele('title').txt(post.metadata.title).up() - // .ele('link', { href: postUrl }).up() - // .ele('updated').txt(pubDate).up() - // .ele('id').txt(postUrl).up() - // .ele('content', { type: 'html' }).txt(postHtml).up() - // .ele('summary').txt(summary).up() - // .up(); - // } - - return JSON.stringify(feed) -} diff --git a/packages/website/src/routes/rss.xml/+server.ts b/packages/website/src/routes/rss.xml/+server.ts deleted file mode 100644 index 389aaa4b..00000000 --- a/packages/website/src/routes/rss.xml/+server.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - SITE_DEFAULT_DESCRIPTION, - SITE_TITLE, - SITE_URL, - RSS_DEFAULT_POSTS_PER_PAGE -} from '$lib/metadata'; - -import { create } from 'xmlbuilder2'; -// import { base } from '$app/paths'; - -export const prerender = true; - -export async function GET() { - const headers = { - 'Cache-Control': 'max-age=0, s-maxage=3600', - 'Content-Type': 'application/xml' - }; - return new Response(await getRssXml(), { headers }); -} - -const AUTHOR = "Jade Ellis" -// prettier-ignore -async function getRssXml(): Promise { - const rssUrl = `${SITE_URL}/rss.xml`; - const root = create({ version: '1.0', encoding: 'utf-8' }) - .ele('feed', { - xmlns: 'http://www.w3.org/2005/Atom', - }) - .ele('title').txt(SITE_TITLE).up() - .ele('link', { href: SITE_URL }).up() - .ele('link', { rel: 'self', href: rssUrl }).up() - .ele('updated').txt(new Date().toISOString()).up() - .ele('id').txt(SITE_URL).up() - .ele('author') - .ele('name').txt(AUTHOR).up() - .up() - .ele('subtitle').txt(SITE_DEFAULT_DESCRIPTION).up() - - // for await (const post of posts) { - // const pubDate = - // const postUrl = - // const postHtml = - // const summary = post.metadata.description; - - // root.ele('entry') - // .ele('title').txt(post.metadata.title).up() - // .ele('link', { href: postUrl }).up() - // .ele('updated').txt(pubDate).up() - // .ele('id').txt(postUrl).up() - // .ele('content', { type: 'html' }).txt(postHtml).up() - // .ele('summary').txt(summary).up() - // .up(); - // } - - return root.end() -} diff --git a/packages/website/vite.config.ts b/packages/website/vite.config.ts index 70d440ad..ea6a4565 100644 --- a/packages/website/vite.config.ts +++ b/packages/website/vite.config.ts @@ -1,5 +1,5 @@ import { sveltekit } from "@sveltejs/kit/vite"; -import { defineConfig } from "vite"; +import { defineConfig, type PluginOption } from "vite"; import { ViteImageOptimizer } from "vite-plugin-image-optimizer"; import dynamicImport from 'vite-plugin-dynamic-import' import typeAsJsonSchemaPlugin from "rollup-plugin-type-as-json-schema"; @@ -49,6 +49,9 @@ const fallback: {[key: string]: string} = { '.webp': 'png' }; + +import { visualizer } from "rollup-plugin-visualizer"; + export default defineConfig({ resolve: { alias: { @@ -94,6 +97,10 @@ export default defineConfig({ // dynamicImportVars({ // // options // }) + // visualizer({ + // emitFile: true, + // filename: "stats.html", + // }) as PluginOption ], build: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8635099d..052487fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -164,6 +164,9 @@ importers: rollup-plugin-type-as-json-schema: specifier: ^0.2.6 version: 0.2.6 + rollup-plugin-visualizer: + specifier: ^5.12.0 + version: 5.12.0(rollup@4.18.0) sharp: specifier: ^0.33.4 version: 0.33.4 @@ -1136,6 +1139,10 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} @@ -1251,6 +1258,10 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} @@ -1324,6 +1335,10 @@ packages: engines: {node: '>=12'} hasBin: true + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -1397,6 +1412,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -1506,6 +1525,11 @@ packages: is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1539,6 +1563,10 @@ packages: is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1836,6 +1864,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -1957,6 +1989,10 @@ packages: remark-wiki-link@0.0.4: resolution: {integrity: sha512-Mmd5TspUWTnt+gafIdUtczHsjZY21XYEI9BeR6HMLKv/pUiNa5tDSWSjiPMvx07DlD4OmSM+tIhhk7SQXV3LrA==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1978,6 +2014,16 @@ packages: resolution: {integrity: sha512-oxnqPK25qv5AqMOxZELQOGVFeidJJLBbd6Hngn4kbTGP9qH+CEw4SUW8hwt8bEVBGQPaL7wLYZXkVXYJgnlZ1Q==} engines: {node: '>=14'} + rollup-plugin-visualizer@5.12.0: + resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rollup: + optional: true + rollup@4.18.0: resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -2058,6 +2104,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -2478,6 +2528,18 @@ packages: resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} engines: {node: '>=12.0'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -3335,6 +3397,12 @@ snapshots: clean-stack@2.2.0: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + code-red@1.0.4: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -3455,6 +3523,8 @@ snapshots: deepmerge@4.3.1: {} + define-lazy-prop@2.0.0: {} + deprecation@2.3.1: {} dequal@2.0.3: {} @@ -3541,6 +3611,8 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + escalade@3.1.2: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@5.0.0: {} @@ -3605,6 +3677,8 @@ snapshots: function-bind@1.1.2: {} + get-caller-file@2.0.5: {} + github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -3750,6 +3824,8 @@ snapshots: dependencies: hasown: 2.0.2 + is-docker@2.2.1: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -3774,6 +3850,10 @@ snapshots: dependencies: '@types/estree': 1.0.5 + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + isexe@2.0.0: {} jackspeak@3.4.0: @@ -4250,6 +4330,12 @@ snapshots: dependencies: wrappy: 1.0.2 + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + param-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -4405,6 +4491,8 @@ snapshots: '@babel/runtime': 7.24.7 unist-util-map: 1.0.5 + require-directory@2.1.1: {} + resolve-from@4.0.0: {} resolve@1.22.8: @@ -4424,6 +4512,15 @@ snapshots: lodash: 4.17.21 ts-json-schema-generator: 1.5.1 + rollup-plugin-visualizer@5.12.0(rollup@4.18.0): + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + source-map: 0.7.4 + yargs: 17.7.2 + optionalDependencies: + rollup: 4.18.0 + rollup@4.18.0: dependencies: '@types/estree': 1.0.5 @@ -4541,6 +4638,8 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.4: {} + space-separated-tokens@2.0.2: {} sprintf-js@1.0.3: {} @@ -4986,4 +5085,18 @@ snapshots: '@oozcitak/util': 8.3.8 js-yaml: 3.14.1 + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + zwitch@2.0.4: {}