From aa1db498312a678ce170402eea9f01775a548c4b Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Mon, 24 Jun 2024 17:24:28 +0100 Subject: [PATCH 01/21] wip --- packages/astro/src/content/utils.ts | 1 + .../fixtures/content-layer/astro.config.mjs | 6 +++ .../test/fixtures/content-layer/package.json | 9 +++++ .../content-layer/src/components/H2.astro | 4 ++ .../content-layer/src/components/H3.astro | 2 + .../src/components/LayoutProp.astro | 39 +++++++++++++++++++ .../src/components/WithScripts.astro | 11 ++++++ .../content-layer/src/content/blog/one.md | 5 +++ .../src/content/blog/with-layout-prop.md | 9 +++++ .../content-layer/src/content/config.ts | 10 +++++ .../content-layer/src/loaders/post-loader.ts | 25 ++++++++++++ .../content-layer/src/pages/index.astro | 19 +++++++++ .../pages/launch-week-component-scripts.astro | 14 +++++++ .../pages/launch-week-components-export.astro | 14 +++++++ .../content-layer/src/pages/launch-week.astro | 14 +++++++ .../src/pages/sort-blog-collection.astro | 22 +++++++++++ .../src/pages/with-layout-prop.astro | 9 +++++ packages/astro/types/content.d.ts | 37 +++++++++++++++++- 18 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 packages/astro/test/fixtures/content-layer/astro.config.mjs create mode 100644 packages/astro/test/fixtures/content-layer/package.json create mode 100644 packages/astro/test/fixtures/content-layer/src/components/H2.astro create mode 100644 packages/astro/test/fixtures/content-layer/src/components/H3.astro create mode 100644 packages/astro/test/fixtures/content-layer/src/components/LayoutProp.astro create mode 100644 packages/astro/test/fixtures/content-layer/src/components/WithScripts.astro create mode 100644 packages/astro/test/fixtures/content-layer/src/content/blog/one.md create mode 100644 packages/astro/test/fixtures/content-layer/src/content/blog/with-layout-prop.md create mode 100644 packages/astro/test/fixtures/content-layer/src/content/config.ts create mode 100644 packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts create mode 100644 packages/astro/test/fixtures/content-layer/src/pages/index.astro create mode 100644 packages/astro/test/fixtures/content-layer/src/pages/launch-week-component-scripts.astro create mode 100644 packages/astro/test/fixtures/content-layer/src/pages/launch-week-components-export.astro create mode 100644 packages/astro/test/fixtures/content-layer/src/pages/launch-week.astro create mode 100644 packages/astro/test/fixtures/content-layer/src/pages/sort-blog-collection.astro create mode 100644 packages/astro/test/fixtures/content-layer/src/pages/with-layout-prop.astro diff --git a/packages/astro/src/content/utils.ts b/packages/astro/src/content/utils.ts index 2bbe40fbe9a4..f6fe76c8e4c8 100644 --- a/packages/astro/src/content/utils.ts +++ b/packages/astro/src/content/utils.ts @@ -406,6 +406,7 @@ export async function loadContentConfig({ unparsedConfig = await viteServer.ssrLoadModule(configPathname); const config = contentConfigParser.safeParse(unparsedConfig); + console.log({config}); if (config.success) { return config.data; } else { diff --git a/packages/astro/test/fixtures/content-layer/astro.config.mjs b/packages/astro/test/fixtures/content-layer/astro.config.mjs new file mode 100644 index 000000000000..d69e57975a64 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/astro.config.mjs @@ -0,0 +1,6 @@ +import mdx from '@astrojs/mdx'; +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + integrations: [mdx()], +}); diff --git a/packages/astro/test/fixtures/content-layer/package.json b/packages/astro/test/fixtures/content-layer/package.json new file mode 100644 index 000000000000..3be40eb87157 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/package.json @@ -0,0 +1,9 @@ +{ + "name": "@test/content", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*", + "@astrojs/mdx": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/content-layer/src/components/H2.astro b/packages/astro/test/fixtures/content-layer/src/components/H2.astro new file mode 100644 index 000000000000..d1ad359c2ee1 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/components/H2.astro @@ -0,0 +1,4 @@ +--- +--- + +

diff --git a/packages/astro/test/fixtures/content-layer/src/components/H3.astro b/packages/astro/test/fixtures/content-layer/src/components/H3.astro new file mode 100644 index 000000000000..fa476e929eae --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/components/H3.astro @@ -0,0 +1,2 @@ + +

\ No newline at end of file diff --git a/packages/astro/test/fixtures/content-layer/src/components/LayoutProp.astro b/packages/astro/test/fixtures/content-layer/src/components/LayoutProp.astro new file mode 100644 index 000000000000..a2954162a396 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/components/LayoutProp.astro @@ -0,0 +1,39 @@ +--- +import { CollectionEntry, getCollection } from 'astro:content'; +import H3 from './H3.astro' +// Test for recursive `getCollection()` calls +const blog = await getCollection('blog'); + +type Props = { + content: CollectionEntry<'blog'>['data']; +}; + +const { + content: { title }, +} = Astro.props; +--- + + + + + + + + With Layout Prop + + +

{title}

+

H3 inserted in the layout

+ + + + + diff --git a/packages/astro/test/fixtures/content-layer/src/components/WithScripts.astro b/packages/astro/test/fixtures/content-layer/src/components/WithScripts.astro new file mode 100644 index 000000000000..e37694eaf1f0 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/components/WithScripts.astro @@ -0,0 +1,11 @@ +

Hoisted script didn't update me :(

+ +

Inline script didn't update me :(

+ + + + diff --git a/packages/astro/test/fixtures/content-layer/src/content/blog/one.md b/packages/astro/test/fixtures/content-layer/src/content/blog/one.md new file mode 100644 index 000000000000..f4293f0a5ee5 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/content/blog/one.md @@ -0,0 +1,5 @@ +--- +title: Hello world +description: Just a demo +--- +This is a post diff --git a/packages/astro/test/fixtures/content-layer/src/content/blog/with-layout-prop.md b/packages/astro/test/fixtures/content-layer/src/content/blog/with-layout-prop.md new file mode 100644 index 000000000000..ce8a866cb9c0 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/content/blog/with-layout-prop.md @@ -0,0 +1,9 @@ +--- +title: With Layout Prop +description: Use a layout prop in a content collection +layout: "../../components/LayoutProp.astro" +--- + +## Content with a layout prop + +Sure, why not? diff --git a/packages/astro/test/fixtures/content-layer/src/content/config.ts b/packages/astro/test/fixtures/content-layer/src/content/config.ts new file mode 100644 index 000000000000..440b6511e0cb --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/content/config.ts @@ -0,0 +1,10 @@ +import { defineCollection, z } from 'astro:content'; +import { loader } from '../loaders/post-loader.js'; + +const blog = defineCollection({ + type: "experimental_content", + name: "blog", + loader: loader({ url: "https://jsonplaceholder.typicode.com/posts" }), +}); + +export const collections = { blog }; diff --git a/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts new file mode 100644 index 000000000000..584aa6616163 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts @@ -0,0 +1,25 @@ +import type { Loader } from 'astro:content'; + +export interface PostLoaderConfig { + url: string; +} + +export function loader(config:PostLoaderConfig): Loader { + return { + name: "post-loader", + load: async ({ + store, collection, cache + }) => { + + const posts = await fetch(config.url) + .then((res) => res.json()); + + store.clear(collection); + + for (const post of posts) { + store.set(collection, post.id, post); + } + + }, + }; +} diff --git a/packages/astro/test/fixtures/content-layer/src/pages/index.astro b/packages/astro/test/fixtures/content-layer/src/pages/index.astro new file mode 100644 index 000000000000..a024728577e7 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/pages/index.astro @@ -0,0 +1,19 @@ +--- +import { getCollection } from 'astro:content'; + +const blog = await getCollection('blog'); +--- + + + Index + + +

Blog Posts

+ + + + diff --git a/packages/astro/test/fixtures/content-layer/src/pages/launch-week-component-scripts.astro b/packages/astro/test/fixtures/content-layer/src/pages/launch-week-component-scripts.astro new file mode 100644 index 000000000000..3936b2f8d082 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/pages/launch-week-component-scripts.astro @@ -0,0 +1,14 @@ +--- +import { getEntryBySlug } from 'astro:content'; + +const entry = await getEntryBySlug('blog', 'promo/launch-week-component-scripts'); +const { Content } = await entry.render(); +--- + + + Launch Week + + + + + diff --git a/packages/astro/test/fixtures/content-layer/src/pages/launch-week-components-export.astro b/packages/astro/test/fixtures/content-layer/src/pages/launch-week-components-export.astro new file mode 100644 index 000000000000..463e6519129c --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/pages/launch-week-components-export.astro @@ -0,0 +1,14 @@ +--- +import { getEntryBySlug } from 'astro:content'; + +const entry = await getEntryBySlug('blog', 'promo/launch-week-components-export'); +const { Content } = await entry.render(); +--- + + + Launch Week + + + + + diff --git a/packages/astro/test/fixtures/content-layer/src/pages/launch-week.astro b/packages/astro/test/fixtures/content-layer/src/pages/launch-week.astro new file mode 100644 index 000000000000..e7a992e2dfe4 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/pages/launch-week.astro @@ -0,0 +1,14 @@ +--- +import { getEntryBySlug } from 'astro:content'; + +const entry = await getEntryBySlug('blog', 'promo/launch-week'); +const { Content } = await entry.render(); +--- + + + Launch Week + + + + + diff --git a/packages/astro/test/fixtures/content-layer/src/pages/sort-blog-collection.astro b/packages/astro/test/fixtures/content-layer/src/pages/sort-blog-collection.astro new file mode 100644 index 000000000000..5426068197ad --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/pages/sort-blog-collection.astro @@ -0,0 +1,22 @@ +--- +import { getCollection } from 'astro:content'; + +const blog = await getCollection('blog'); + +// Sort descending by title, make sure mutating `blog` doesn't mutate other pages that call `getCollection` too +blog.sort((a, b) => a.data.title < b.data.title ? 1 : -1) +--- + + + Index + + +

Blog Posts

+ +
    + {blog.map(post => ( +
  • { post.data.title }
  • + ))} +
+ + diff --git a/packages/astro/test/fixtures/content-layer/src/pages/with-layout-prop.astro b/packages/astro/test/fixtures/content-layer/src/pages/with-layout-prop.astro new file mode 100644 index 000000000000..4cbb87624267 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/pages/with-layout-prop.astro @@ -0,0 +1,9 @@ +--- +import { getEntryBySlug } from 'astro:content'; +import H3 from '../components/H3.astro'; + +const entry = await getEntryBySlug('blog', 'with-layout-prop'); +const { Content } = await entry.render(); +--- +

H3 directly inserted to the page

+ \ No newline at end of file diff --git a/packages/astro/types/content.d.ts b/packages/astro/types/content.d.ts index e09bda61844b..3dda00c43c61 100644 --- a/packages/astro/types/content.d.ts +++ b/packages/astro/types/content.d.ts @@ -32,6 +32,40 @@ declare module 'astro:content' { export type SchemaContext = { image: ImageFunction }; + export interface DataStore{ + get: (collection: string, key: string) => T | undefined; + entries: (collection: string) => Array<[key: string, T]>; + set: (collection: string, key: string, value: T) => void; + delete: (collection: string, key: string) => void; + clear: (collection: string) => void; + } + + export interface LoaderContext { + collection: string; + // A database abstraction to store the actual data + store: DataStore; + // A simple KV store, designed for things like sync tokens + // Persisted to disk + cache: any; + } + + export interface Loader { + // Name of the loader, e.g. the npm package name + name: string; + // Do the actual loading of the data + load: (context: LoaderContext) => Promise; + // Allow a loader to define its own schema + schema?: S | Promise | ((context: SchemaContext) => S | Promise); + // Render content from the store + render?: (entry: any) => AstroComponentFactory; + } + + type ContentCollectionV2Config = { + type: 'experimental_content'; + name: string; + loader: Loader; + }; + type DataCollectionConfig = { type: 'data'; schema?: S | ((context: SchemaContext) => S); @@ -44,7 +78,8 @@ declare module 'astro:content' { export type CollectionConfig = | ContentCollectionConfig - | DataCollectionConfig; + | DataCollectionConfig + | ContentCollectionV2Config; export function defineCollection( input: CollectionConfig From a7639e361aecf7af00e63154d00521e7ed93aa4c Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 25 Jun 2024 08:54:02 +0100 Subject: [PATCH 02/21] wip --- packages/astro/src/content/data-store.ts | 72 +++++++++++++++++++ packages/astro/src/content/loaders.ts | 29 ++++++++ packages/astro/src/content/runtime.ts | 1 + packages/astro/src/content/types-generator.ts | 10 ++- packages/astro/src/content/utils.ts | 14 +++- packages/astro/src/core/build/index.ts | 4 +- packages/astro/src/core/sync/index.ts | 2 + .../test/fixtures/content-layer/package.json | 2 +- .../content-layer/src/content/config.ts | 2 +- .../content-layer/src/loaders/post-loader.ts | 3 +- .../content-layer/src/pages/index.astro | 2 +- .../pages/launch-week-component-scripts.astro | 14 ---- .../pages/launch-week-components-export.astro | 14 ---- .../content-layer/src/pages/launch-week.astro | 14 ---- .../src/pages/sort-blog-collection.astro | 22 ------ .../src/pages/with-layout-prop.astro | 9 --- packages/astro/types/content.d.ts | 7 +- 17 files changed, 137 insertions(+), 84 deletions(-) create mode 100644 packages/astro/src/content/data-store.ts create mode 100644 packages/astro/src/content/loaders.ts delete mode 100644 packages/astro/test/fixtures/content-layer/src/pages/launch-week-component-scripts.astro delete mode 100644 packages/astro/test/fixtures/content-layer/src/pages/launch-week-components-export.astro delete mode 100644 packages/astro/test/fixtures/content-layer/src/pages/launch-week.astro delete mode 100644 packages/astro/test/fixtures/content-layer/src/pages/sort-blog-collection.astro delete mode 100644 packages/astro/test/fixtures/content-layer/src/pages/with-layout-prop.astro diff --git a/packages/astro/src/content/data-store.ts b/packages/astro/src/content/data-store.ts new file mode 100644 index 000000000000..d53705c2a62b --- /dev/null +++ b/packages/astro/src/content/data-store.ts @@ -0,0 +1,72 @@ +export class DataStore { + #collections = new Map>(); + constructor() { + this.#collections = new Map(); + } + get(collectionName: string) { + return this.#collections.get(collectionName); + } + entries(collectionName: string): IterableIterator<[id: string, any]> { + const collection = this.#collections.get(collectionName) ?? new Map(); + return collection.entries(); + } + set(collectionName: string, key: string, value: any) { + const collection = this.#collections.get(collectionName) ?? new Map(); + collection.set(key, value); + this.#collections.set(collectionName, collection); + } + delete(collectionName: string, key: string) { + const collection = this.#collections.get(collectionName); + if (collection) { + collection.delete(key); + } + } + clear(collectionName: string) { + this.#collections.delete(collectionName); + } + + has(collectionName: string, key: string) { + const collection = this.#collections.get(collectionName); + if (collection) { + return collection.has(key); + } + return false; + } + + scopedStore(collectionName: string): ScopedDataStore { + return { + get: (key: string) => this.get(collectionName)?.get(key), + entries: () => this.entries(collectionName), + set: (key: string, value: any) => this.set(collectionName, key, value), + delete: (key: string) => this.delete(collectionName, key), + clear: () => this.clear(collectionName), + has: (key: string) => this.has(collectionName, key), + }; + } +} + +export interface ScopedDataStore { + get: (key: string) => any; + entries: () => IterableIterator<[id: string, any]>; + set: (key: string, value: any) => void; + delete: (key: string) => void; + clear: () => void; + has: (key: string) => boolean; +} + +function dataStoreSingleton() { + let instance: DataStore | undefined = undefined; + return { + get: () => { + if (!instance) { + instance = new DataStore(); + } + return instance; + }, + set: (store: DataStore) => { + instance = store; + }, + }; +} + +export const globalDataStore = dataStoreSingleton(); diff --git a/packages/astro/src/content/loaders.ts b/packages/astro/src/content/loaders.ts new file mode 100644 index 000000000000..f5a5fa7786d2 --- /dev/null +++ b/packages/astro/src/content/loaders.ts @@ -0,0 +1,29 @@ +import type { AstroSettings } from '../@types/astro.js'; +import type { Logger } from '../core/logger/core.js'; +import { globalDataStore, type DataStore } from './data-store.js'; +import { globalContentConfigObserver } from './utils.js'; + +export async function syncDataLayer({ + settings, + logger, + store = globalDataStore.get(), +}: { settings: AstroSettings; logger: Logger; store?: DataStore }) { + + const contentConfig = globalContentConfigObserver.get(); + if (contentConfig?.status !== 'loaded') { + logger.debug('content', 'Content config not loaded, skipping sync'); + return; + } + await Promise.all( + Object.entries(contentConfig.config.collections).map(async ([name, collection]) => { + if (collection.type !== 'experimental_data') { + return; + } + return collection.loader.load({ + collection: name, + store: store.scopedStore(name), + cache: {}, + }); + }) + ); +} diff --git a/packages/astro/src/content/runtime.ts b/packages/astro/src/content/runtime.ts index 6fd017c85c95..a34608e84018 100644 --- a/packages/astro/src/content/runtime.ts +++ b/packages/astro/src/content/runtime.ts @@ -57,6 +57,7 @@ export function createGetCollection({ }) { return async function getCollection(collection: string, filter?: (entry: any) => unknown) { let type: 'content' | 'data'; + console.log({ collection, contentCollectionToEntryMap, dataCollectionToEntryMap }); if (collection in contentCollectionToEntryMap) { type = 'content'; } else if (collection in dataCollectionToEntryMap) { diff --git a/packages/astro/src/content/types-generator.ts b/packages/astro/src/content/types-generator.ts index b970eadb9011..2a8e8b199acb 100644 --- a/packages/astro/src/content/types-generator.ts +++ b/packages/astro/src/content/types-generator.ts @@ -46,6 +46,10 @@ type CollectionEntryMap = { | { type: 'data'; entries: Record; + } + | { + type: 'experimental_data'; + entries: Record; }; }; @@ -400,6 +404,7 @@ async function writeContentFiles({ if ( collectionConfig?.type && collection.type !== 'unknown' && + collectionConfig.type !== 'experimental_data' && collection.type !== collectionConfig.type ) { viteServer.hot.send({ @@ -422,7 +427,7 @@ async function writeContentFiles({ }); return; } - const resolvedType: 'content' | 'data' = + const resolvedType: 'content' | 'data' | 'experimental_data' = collection.type === 'unknown' ? // Add empty / unknown collections to the data type map by default // This ensures `getCollection('empty-collection')` doesn't raise a type error @@ -491,6 +496,9 @@ async function writeContentFiles({ } } break; + case 'experimental_data': + console.log('experimental_data', collectionKey); + break; } } diff --git a/packages/astro/src/content/utils.ts b/packages/astro/src/content/utils.ts index f6fe76c8e4c8..f5d4b599aefe 100644 --- a/packages/astro/src/content/utils.ts +++ b/packages/astro/src/content/utils.ts @@ -35,6 +35,19 @@ export const collectionConfigParser = z.union([ type: z.literal('data'), schema: z.any().optional(), }), + z.object({ + type: z.literal('experimental_data'), + name: z.string(), + schema: z.undefined().optional(), + loader: z.object({ + name: z.string(), + load: z.function( + z.tuple([z.object({ collection: z.string(), store: z.any(), cache: z.any() })], z.unknown()) + ), + schema: z.any().optional(), + render: z.function(z.tuple([z.any()], z.unknown())).optional(), + }), + }), ]); export const contentConfigParser = z.object({ @@ -406,7 +419,6 @@ export async function loadContentConfig({ unparsedConfig = await viteServer.ssrLoadModule(configPathname); const config = contentConfigParser.safeParse(unparsedConfig); - console.log({config}); if (config.success) { return config.data; } else { diff --git a/packages/astro/src/core/build/index.ts b/packages/astro/src/core/build/index.ts index 50085d58132a..c4704f5eabcb 100644 --- a/packages/astro/src/core/build/index.ts +++ b/packages/astro/src/core/build/index.ts @@ -11,6 +11,7 @@ import type { RuntimeMode, } from '../../@types/astro.js'; import { injectImageEndpoint } from '../../assets/endpoint/config.js'; +import { syncDataLayer } from '../../content/loaders.js'; import { telemetry } from '../../events/index.js'; import { eventCliSession } from '../../events/session.js'; import { @@ -32,7 +33,7 @@ import { collectPagesData } from './page-data.js'; import { staticBuild, viteBuild } from './static-build.js'; import type { StaticBuildOptions } from './types.js'; import { getTimeStat } from './util.js'; - +import { globalDataStore } from '../../content/data-store.js'; export interface BuildOptions { /** * Teardown the compiler WASM instance after build. This can improve performance when @@ -148,6 +149,7 @@ class AstroBuilder { if (syncRet !== 0) { return process.exit(syncRet); } + await syncDataLayer({ settings: this.settings, logger: logger }); return { viteConfig }; } diff --git a/packages/astro/src/core/sync/index.ts b/packages/astro/src/core/sync/index.ts index 0b4bd1af46d1..c30f293ae54b 100644 --- a/packages/astro/src/core/sync/index.ts +++ b/packages/astro/src/core/sync/index.ts @@ -6,6 +6,7 @@ import { type HMRPayload, createServer } from 'vite'; import type { AstroConfig, AstroInlineConfig, AstroSettings } from '../../@types/astro.js'; import { getPackage } from '../../cli/install-package.js'; import { createContentTypesGenerator } from '../../content/index.js'; +import { syncDataLayer } from '../../content/loaders.js'; import { globalContentConfigObserver } from '../../content/utils.js'; import { telemetry } from '../../events/index.js'; import { eventCliSession } from '../../events/session.js'; @@ -83,6 +84,7 @@ export default async function sync( await dbPackage?.typegen?.(astroConfig); const exitCode = await syncContentCollections(settings, { ...options, logger }); if (exitCode !== 0) return exitCode; + await syncDataLayer({ settings, logger }); logger.info(null, `Types generated ${dim(getTimeStat(timerStart, performance.now()))}`); return 0; diff --git a/packages/astro/test/fixtures/content-layer/package.json b/packages/astro/test/fixtures/content-layer/package.json index 3be40eb87157..fc73ce6f7ac7 100644 --- a/packages/astro/test/fixtures/content-layer/package.json +++ b/packages/astro/test/fixtures/content-layer/package.json @@ -1,5 +1,5 @@ { - "name": "@test/content", + "name": "@test/content-layer", "version": "0.0.0", "private": true, "dependencies": { diff --git a/packages/astro/test/fixtures/content-layer/src/content/config.ts b/packages/astro/test/fixtures/content-layer/src/content/config.ts index 440b6511e0cb..62bc51654c8f 100644 --- a/packages/astro/test/fixtures/content-layer/src/content/config.ts +++ b/packages/astro/test/fixtures/content-layer/src/content/config.ts @@ -2,7 +2,7 @@ import { defineCollection, z } from 'astro:content'; import { loader } from '../loaders/post-loader.js'; const blog = defineCollection({ - type: "experimental_content", + type: "experimental_data", name: "blog", loader: loader({ url: "https://jsonplaceholder.typicode.com/posts" }), }); diff --git a/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts index 584aa6616163..a7f139482416 100644 --- a/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts +++ b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts @@ -10,7 +10,7 @@ export function loader(config:PostLoaderConfig): Loader { load: async ({ store, collection, cache }) => { - + console.log('loading posts'); const posts = await fetch(config.url) .then((res) => res.json()); @@ -19,7 +19,6 @@ export function loader(config:PostLoaderConfig): Loader { for (const post of posts) { store.set(collection, post.id, post); } - }, }; } diff --git a/packages/astro/test/fixtures/content-layer/src/pages/index.astro b/packages/astro/test/fixtures/content-layer/src/pages/index.astro index a024728577e7..eef648122e82 100644 --- a/packages/astro/test/fixtures/content-layer/src/pages/index.astro +++ b/packages/astro/test/fixtures/content-layer/src/pages/index.astro @@ -12,7 +12,7 @@ const blog = await getCollection('blog');
    {blog.map(post => ( -
  • { post.data.title }
  • +
  • { post.data?.title }
  • ))}
diff --git a/packages/astro/test/fixtures/content-layer/src/pages/launch-week-component-scripts.astro b/packages/astro/test/fixtures/content-layer/src/pages/launch-week-component-scripts.astro deleted file mode 100644 index 3936b2f8d082..000000000000 --- a/packages/astro/test/fixtures/content-layer/src/pages/launch-week-component-scripts.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import { getEntryBySlug } from 'astro:content'; - -const entry = await getEntryBySlug('blog', 'promo/launch-week-component-scripts'); -const { Content } = await entry.render(); ---- - - - Launch Week - - - - - diff --git a/packages/astro/test/fixtures/content-layer/src/pages/launch-week-components-export.astro b/packages/astro/test/fixtures/content-layer/src/pages/launch-week-components-export.astro deleted file mode 100644 index 463e6519129c..000000000000 --- a/packages/astro/test/fixtures/content-layer/src/pages/launch-week-components-export.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import { getEntryBySlug } from 'astro:content'; - -const entry = await getEntryBySlug('blog', 'promo/launch-week-components-export'); -const { Content } = await entry.render(); ---- - - - Launch Week - - - - - diff --git a/packages/astro/test/fixtures/content-layer/src/pages/launch-week.astro b/packages/astro/test/fixtures/content-layer/src/pages/launch-week.astro deleted file mode 100644 index e7a992e2dfe4..000000000000 --- a/packages/astro/test/fixtures/content-layer/src/pages/launch-week.astro +++ /dev/null @@ -1,14 +0,0 @@ ---- -import { getEntryBySlug } from 'astro:content'; - -const entry = await getEntryBySlug('blog', 'promo/launch-week'); -const { Content } = await entry.render(); ---- - - - Launch Week - - - - - diff --git a/packages/astro/test/fixtures/content-layer/src/pages/sort-blog-collection.astro b/packages/astro/test/fixtures/content-layer/src/pages/sort-blog-collection.astro deleted file mode 100644 index 5426068197ad..000000000000 --- a/packages/astro/test/fixtures/content-layer/src/pages/sort-blog-collection.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -import { getCollection } from 'astro:content'; - -const blog = await getCollection('blog'); - -// Sort descending by title, make sure mutating `blog` doesn't mutate other pages that call `getCollection` too -blog.sort((a, b) => a.data.title < b.data.title ? 1 : -1) ---- - - - Index - - -

Blog Posts

- -
    - {blog.map(post => ( -
  • { post.data.title }
  • - ))} -
- - diff --git a/packages/astro/test/fixtures/content-layer/src/pages/with-layout-prop.astro b/packages/astro/test/fixtures/content-layer/src/pages/with-layout-prop.astro deleted file mode 100644 index 4cbb87624267..000000000000 --- a/packages/astro/test/fixtures/content-layer/src/pages/with-layout-prop.astro +++ /dev/null @@ -1,9 +0,0 @@ ---- -import { getEntryBySlug } from 'astro:content'; -import H3 from '../components/H3.astro'; - -const entry = await getEntryBySlug('blog', 'with-layout-prop'); -const { Content } = await entry.render(); ---- -

H3 directly inserted to the page

- \ No newline at end of file diff --git a/packages/astro/types/content.d.ts b/packages/astro/types/content.d.ts index 3dda00c43c61..d324c82ba247 100644 --- a/packages/astro/types/content.d.ts +++ b/packages/astro/types/content.d.ts @@ -32,7 +32,7 @@ declare module 'astro:content' { export type SchemaContext = { image: ImageFunction }; - export interface DataStore{ + export interface DataStore { get: (collection: string, key: string) => T | undefined; entries: (collection: string) => Array<[key: string, T]>; set: (collection: string, key: string, value: T) => void; @@ -57,12 +57,13 @@ declare module 'astro:content' { // Allow a loader to define its own schema schema?: S | Promise | ((context: SchemaContext) => S | Promise); // Render content from the store - render?: (entry: any) => AstroComponentFactory; + render?: (entry: any) => any; } type ContentCollectionV2Config = { - type: 'experimental_content'; + type: 'experimental_data'; name: string; + schema?: undefined; loader: Loader; }; From 63a23d229df1fc6ad200b990ffbafb49862f0f40 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 25 Jun 2024 10:48:48 +0100 Subject: [PATCH 03/21] wip --- packages/astro/src/content/consts.ts | 2 + packages/astro/src/content/data-store.ts | 65 +++++++++++++++++-- packages/astro/src/content/loaders.ts | 12 +++- packages/astro/src/content/runtime.ts | 27 +++++++- .../vite-plugin-content-virtual-mod.ts | 5 ++ packages/astro/src/core/build/index.ts | 5 +- .../content-layer/src/content/blog/one.md | 5 -- .../src/content/blog/with-layout-prop.md | 9 --- .../content-layer/src/loaders/post-loader.ts | 4 +- packages/astro/types/content.d.ts | 11 +--- pnpm-lock.yaml | 10 ++- 11 files changed, 117 insertions(+), 38 deletions(-) delete mode 100644 packages/astro/test/fixtures/content-layer/src/content/blog/one.md delete mode 100644 packages/astro/test/fixtures/content-layer/src/content/blog/with-layout-prop.md diff --git a/packages/astro/src/content/consts.ts b/packages/astro/src/content/consts.ts index f65652453b60..70826c898414 100644 --- a/packages/astro/src/content/consts.ts +++ b/packages/astro/src/content/consts.ts @@ -5,6 +5,8 @@ export const DATA_FLAG = 'astroDataCollectionEntry'; export const VIRTUAL_MODULE_ID = 'astro:content'; export const RESOLVED_VIRTUAL_MODULE_ID = '\0' + VIRTUAL_MODULE_ID; +export const DATA_STORE_VIRTUAL_ID = 'astro:data-layer-content'; +export const RESOLVED_DATA_STORE_VIRTUAL_ID = '\0' + DATA_STORE_VIRTUAL_ID; export const LINKS_PLACEHOLDER = '@@ASTRO-LINKS@@'; export const STYLES_PLACEHOLDER = '@@ASTRO-STYLES@@'; export const SCRIPTS_PLACEHOLDER = '@@ASTRO-SCRIPTS@@'; diff --git a/packages/astro/src/content/data-store.ts b/packages/astro/src/content/data-store.ts index d53705c2a62b..dfdab5264bb2 100644 --- a/packages/astro/src/content/data-store.ts +++ b/packages/astro/src/content/data-store.ts @@ -1,10 +1,11 @@ +import { promises as fs, type PathLike, existsSync } from 'fs'; export class DataStore { #collections = new Map>(); constructor() { this.#collections = new Map(); } - get(collectionName: string) { - return this.#collections.get(collectionName); + get(collectionName: string, key: string) { + return this.#collections.get(collectionName)?.get(key); } entries(collectionName: string): IterableIterator<[id: string, any]> { const collection = this.#collections.get(collectionName) ?? new Map(); @@ -33,9 +34,17 @@ export class DataStore { return false; } + hasCollection(collectionName: string) { + return this.#collections.has(collectionName); + } + + collections() { + return this.#collections; + } + scopedStore(collectionName: string): ScopedDataStore { return { - get: (key: string) => this.get(collectionName)?.get(key), + get: (key: string) => this.get(collectionName, key), entries: () => this.entries(collectionName), set: (key: string, value: any) => this.set(collectionName, key, value), delete: (key: string) => this.delete(collectionName, key), @@ -43,6 +52,50 @@ export class DataStore { has: (key: string) => this.has(collectionName, key), }; } + + toString() { + return JSON.stringify( + Array.from(this.#collections.entries()).map(([collectionName, collection]) => { + return [collectionName, Array.from(collection.entries())]; + }) + ); + } + + async writeToDisk(filePath: PathLike) { + await fs.writeFile(filePath, this.toString()); + } + + static async fromDisk(filePath: PathLike) { + if (!existsSync(filePath)) { + return new DataStore(); + } + const str = await fs.readFile(filePath, 'utf-8'); + return DataStore.fromString(str); + } + + static fromString(str: string) { + const entries = JSON.parse(str); + return DataStore.fromJSON(entries); + } + + static async fromModule() { + try { + // @ts-expect-error + const data = await import('astro:data-layer-content'); + return DataStore.fromJSON(data.default); + } catch {} + return new DataStore(); + } + + static fromJSON(entries: Array<[string, Array<[string, any]>]>) { + const collections = new Map>(); + for (const [collectionName, collection] of entries) { + collections.set(collectionName, new Map(collection)); + } + const store = new DataStore(); + store.#collections = collections; + return store; + } } export interface ScopedDataStore { @@ -55,11 +108,11 @@ export interface ScopedDataStore { } function dataStoreSingleton() { - let instance: DataStore | undefined = undefined; + let instance: Promise | DataStore | undefined = undefined; return { - get: () => { + get: async () => { if (!instance) { - instance = new DataStore(); + instance = DataStore.fromModule(); } return instance; }, diff --git a/packages/astro/src/content/loaders.ts b/packages/astro/src/content/loaders.ts index f5a5fa7786d2..5533c0aac2fc 100644 --- a/packages/astro/src/content/loaders.ts +++ b/packages/astro/src/content/loaders.ts @@ -1,14 +1,17 @@ import type { AstroSettings } from '../@types/astro.js'; import type { Logger } from '../core/logger/core.js'; -import { globalDataStore, type DataStore } from './data-store.js'; +import type { DataStore } from './data-store.js'; +import { globalDataStore } from './data-store.js'; import { globalContentConfigObserver } from './utils.js'; export async function syncDataLayer({ settings, logger, - store = globalDataStore.get(), + store, }: { settings: AstroSettings; logger: Logger; store?: DataStore }) { - + if (!store) { + store = await globalDataStore.get(); + } const contentConfig = globalContentConfigObserver.get(); if (contentConfig?.status !== 'loaded') { logger.debug('content', 'Content config not loaded, skipping sync'); @@ -26,4 +29,7 @@ export async function syncDataLayer({ }); }) ); + const cacheFile = new URL('data-store.json', settings.config.cacheDir); + await store.writeToDisk(cacheFile); + logger.info(null, 'Synced data layer'); } diff --git a/packages/astro/src/content/runtime.ts b/packages/astro/src/content/runtime.ts index a34608e84018..51a709e055fe 100644 --- a/packages/astro/src/content/runtime.ts +++ b/packages/astro/src/content/runtime.ts @@ -14,6 +14,7 @@ import { unescapeHTML, } from '../runtime/server/index.js'; import type { ContentLookupMap } from './utils.js'; +import { DataStore, globalDataStore } from './data-store.js'; type LazyImport = () => Promise; type GlobResult = Record; @@ -56,12 +57,19 @@ export function createGetCollection({ cacheEntriesByCollection: Map; }) { return async function getCollection(collection: string, filter?: (entry: any) => unknown) { - let type: 'content' | 'data'; - console.log({ collection, contentCollectionToEntryMap, dataCollectionToEntryMap }); + const store = await globalDataStore.get(); + let type: 'content' | 'data' | 'experimental_data'; if (collection in contentCollectionToEntryMap) { type = 'content'; } else if (collection in dataCollectionToEntryMap) { type = 'data'; + } else if (store.hasCollection(collection)) { + return [...store.entries(collection)].map(([id, data]) => ({ + id, + collection, + data, + type: 'experimental_data', + })); } else { // eslint-disable-next-line no-console console.warn( @@ -154,6 +162,21 @@ export function createGetEntryBySlug({ export function createGetDataEntryById({ getEntryImport }: { getEntryImport: GetEntryImport }) { return async function getDataEntryById(collection: string, id: string) { + const store = await globalDataStore.get(); + + if (store.hasCollection(collection)) { + const data = store.get(collection, id); + if (!data) { + throw new Error(`Entry ${collection} → ${id} was not found.`); + } + + return { + id, + collection, + data: store.get(collection, id), + }; + } + const lazyImport = await getEntryImport(collection, id); // TODO: AstroError diff --git a/packages/astro/src/content/vite-plugin-content-virtual-mod.ts b/packages/astro/src/content/vite-plugin-content-virtual-mod.ts index 5e45a4aaaae0..2adce6bf31f4 100644 --- a/packages/astro/src/content/vite-plugin-content-virtual-mod.ts +++ b/packages/astro/src/content/vite-plugin-content-virtual-mod.ts @@ -14,6 +14,7 @@ import { CONTENT_FLAG, CONTENT_RENDER_FLAG, DATA_FLAG, + DATA_STORE_VIRTUAL_ID, RESOLVED_VIRTUAL_MODULE_ID, VIRTUAL_MODULE_ID, } from './consts.js'; @@ -41,6 +42,7 @@ export function astroContentVirtualModPlugin({ }: AstroContentVirtualModPluginParams): Plugin { let IS_DEV = false; const IS_SERVER = isServerLikeOutput(settings.config); + const dataStoreFile = fileURLToPath(new URL('data-store.json', settings.config.cacheDir)); return { name: 'astro-content-virtual-mod-plugin', enforce: 'pre', @@ -59,6 +61,9 @@ export function astroContentVirtualModPlugin({ return { id: RESOLVED_VIRTUAL_MODULE_ID, external: true }; } } + if (id === DATA_STORE_VIRTUAL_ID) { + return dataStoreFile; + } }, async load(id, args) { if (id === RESOLVED_VIRTUAL_MODULE_ID) { diff --git a/packages/astro/src/core/build/index.ts b/packages/astro/src/core/build/index.ts index c4704f5eabcb..e6c89e005f27 100644 --- a/packages/astro/src/core/build/index.ts +++ b/packages/astro/src/core/build/index.ts @@ -33,7 +33,7 @@ import { collectPagesData } from './page-data.js'; import { staticBuild, viteBuild } from './static-build.js'; import type { StaticBuildOptions } from './types.js'; import { getTimeStat } from './util.js'; -import { globalDataStore } from '../../content/data-store.js'; +import { globalDataStore, DataStore } from '../../content/data-store.js'; export interface BuildOptions { /** * Teardown the compiler WASM instance after build. This can improve performance when @@ -149,6 +149,9 @@ class AstroBuilder { if (syncRet !== 0) { return process.exit(syncRet); } + + const dataStore = await DataStore.fromModule(); + globalDataStore.set(dataStore); await syncDataLayer({ settings: this.settings, logger: logger }); return { viteConfig }; diff --git a/packages/astro/test/fixtures/content-layer/src/content/blog/one.md b/packages/astro/test/fixtures/content-layer/src/content/blog/one.md deleted file mode 100644 index f4293f0a5ee5..000000000000 --- a/packages/astro/test/fixtures/content-layer/src/content/blog/one.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Hello world -description: Just a demo ---- -This is a post diff --git a/packages/astro/test/fixtures/content-layer/src/content/blog/with-layout-prop.md b/packages/astro/test/fixtures/content-layer/src/content/blog/with-layout-prop.md deleted file mode 100644 index ce8a866cb9c0..000000000000 --- a/packages/astro/test/fixtures/content-layer/src/content/blog/with-layout-prop.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: With Layout Prop -description: Use a layout prop in a content collection -layout: "../../components/LayoutProp.astro" ---- - -## Content with a layout prop - -Sure, why not? diff --git a/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts index a7f139482416..706fb3087b4b 100644 --- a/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts +++ b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts @@ -14,10 +14,10 @@ export function loader(config:PostLoaderConfig): Loader { const posts = await fetch(config.url) .then((res) => res.json()); - store.clear(collection); + store.clear(); for (const post of posts) { - store.set(collection, post.id, post); + store.set(post.id, post); } }, }; diff --git a/packages/astro/types/content.d.ts b/packages/astro/types/content.d.ts index d324c82ba247..c9610a98da09 100644 --- a/packages/astro/types/content.d.ts +++ b/packages/astro/types/content.d.ts @@ -1,3 +1,4 @@ +import type { ScopedDataStore } from '../src/content/data-store.js'; declare module 'astro:content' { export { z } from 'astro/zod'; @@ -32,18 +33,10 @@ declare module 'astro:content' { export type SchemaContext = { image: ImageFunction }; - export interface DataStore { - get: (collection: string, key: string) => T | undefined; - entries: (collection: string) => Array<[key: string, T]>; - set: (collection: string, key: string, value: T) => void; - delete: (collection: string, key: string) => void; - clear: (collection: string) => void; - } - export interface LoaderContext { collection: string; // A database abstraction to store the actual data - store: DataStore; + store: ScopedDataStore; // A simple KV store, designed for things like sync tokens // Persisted to disk cache: any; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b2a73463c8d2..09e9ac7abfc9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2650,6 +2650,15 @@ importers: specifier: workspace:* version: link:../../.. + packages/astro/test/fixtures/content-layer: + dependencies: + '@astrojs/mdx': + specifier: workspace:* + version: link:../../../../integrations/mdx + astro: + specifier: workspace:* + version: link:../../.. + packages/astro/test/fixtures/content-mixed-errors: dependencies: astro: @@ -9518,7 +9527,6 @@ packages: libsql@0.3.12: resolution: {integrity: sha512-to30hj8O3DjS97wpbKN6ERZ8k66MN1IaOfFLR6oHqd25GMiPJ/ZX0VaZ7w+TsPmxcFS3p71qArj/hiedCyvXCg==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lilconfig@2.1.0: From 624c377928d4f0785ca9656281d8a85c63d45559 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 25 Jun 2024 11:04:23 +0100 Subject: [PATCH 04/21] Update demo --- packages/astro/src/content/data-store.ts | 8 ++--- .../content-layer/src/pages/blog/[id].astro | 29 +++++++++++++++++++ .../content-layer/src/pages/index.astro | 6 ++-- 3 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 packages/astro/test/fixtures/content-layer/src/pages/blog/[id].astro diff --git a/packages/astro/src/content/data-store.ts b/packages/astro/src/content/data-store.ts index dfdab5264bb2..30a942976bcc 100644 --- a/packages/astro/src/content/data-store.ts +++ b/packages/astro/src/content/data-store.ts @@ -5,7 +5,7 @@ export class DataStore { this.#collections = new Map(); } get(collectionName: string, key: string) { - return this.#collections.get(collectionName)?.get(key); + return this.#collections.get(collectionName)?.get(String(key)); } entries(collectionName: string): IterableIterator<[id: string, any]> { const collection = this.#collections.get(collectionName) ?? new Map(); @@ -13,13 +13,13 @@ export class DataStore { } set(collectionName: string, key: string, value: any) { const collection = this.#collections.get(collectionName) ?? new Map(); - collection.set(key, value); + collection.set(String(key), value); this.#collections.set(collectionName, collection); } delete(collectionName: string, key: string) { const collection = this.#collections.get(collectionName); if (collection) { - collection.delete(key); + collection.delete(String(key)); } } clear(collectionName: string) { @@ -29,7 +29,7 @@ export class DataStore { has(collectionName: string, key: string) { const collection = this.#collections.get(collectionName); if (collection) { - return collection.has(key); + return collection.has(String(key)); } return false; } diff --git a/packages/astro/test/fixtures/content-layer/src/pages/blog/[id].astro b/packages/astro/test/fixtures/content-layer/src/pages/blog/[id].astro new file mode 100644 index 000000000000..850833907ba7 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/pages/blog/[id].astro @@ -0,0 +1,29 @@ +--- +import type { GetStaticPaths } from "astro"; +import { getCollection } from "astro:content" +export const getStaticPaths = (async () => { + const collection = await getCollection("blog"); + if(!collection) return [] + return collection.map((post) => ({ + params: { + id: post.id + }, + props: { + post: post.data + } + })); +}) satisfies GetStaticPaths; + +interface Props { + post: { + title: string; + body: string; + } +} + +const { post } = Astro.props + +--- + +

{post.title}

+

{post.body}

diff --git a/packages/astro/test/fixtures/content-layer/src/pages/index.astro b/packages/astro/test/fixtures/content-layer/src/pages/index.astro index eef648122e82..6f288c96697a 100644 --- a/packages/astro/test/fixtures/content-layer/src/pages/index.astro +++ b/packages/astro/test/fixtures/content-layer/src/pages/index.astro @@ -1,7 +1,8 @@ --- -import { getCollection } from 'astro:content'; +import { getCollection, getDataEntryById } from 'astro:content'; const blog = await getCollection('blog'); +const first = await getDataEntryById('blog', 1); --- @@ -10,9 +11,10 @@ const blog = await getCollection('blog');

Blog Posts

+

{first.data.title}

From d67ee7ee508be82a27d2be385e97bf0ef6cb30d4 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 25 Jun 2024 14:21:00 +0100 Subject: [PATCH 05/21] Add meta --- packages/astro/src/content/data-store.ts | 10 ++++++++++ packages/astro/src/content/loaders.ts | 9 +++++---- packages/astro/src/content/utils.ts | 12 +++++++++++- .../content-layer/src/loaders/post-loader.ts | 16 +++++++++++++--- packages/astro/types/content.d.ts | 7 ++++--- 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/packages/astro/src/content/data-store.ts b/packages/astro/src/content/data-store.ts index 30a942976bcc..65cb4298cbd6 100644 --- a/packages/astro/src/content/data-store.ts +++ b/packages/astro/src/content/data-store.ts @@ -53,6 +53,10 @@ export class DataStore { }; } + metaStore(collectionName: string): MetaStore { + return this.scopedStore(`meta:${collectionName}`); + } + toString() { return JSON.stringify( Array.from(this.#collections.entries()).map(([collectionName, collection]) => { @@ -107,6 +111,12 @@ export interface ScopedDataStore { has: (key: string) => boolean; } +export interface MetaStore { + get: (key: string) => string | undefined; + set: (key: string, value: string) => void; + has: (key: string) => boolean; +} + function dataStoreSingleton() { let instance: Promise | DataStore | undefined = undefined; return { diff --git a/packages/astro/src/content/loaders.ts b/packages/astro/src/content/loaders.ts index 5533c0aac2fc..914452fe3257 100644 --- a/packages/astro/src/content/loaders.ts +++ b/packages/astro/src/content/loaders.ts @@ -1,7 +1,6 @@ import type { AstroSettings } from '../@types/astro.js'; import type { Logger } from '../core/logger/core.js'; -import type { DataStore } from './data-store.js'; -import { globalDataStore } from './data-store.js'; +import { DataStore, globalDataStore } from './data-store.js'; import { globalContentConfigObserver } from './utils.js'; export async function syncDataLayer({ @@ -10,7 +9,8 @@ export async function syncDataLayer({ store, }: { settings: AstroSettings; logger: Logger; store?: DataStore }) { if (!store) { - store = await globalDataStore.get(); + store = await DataStore.fromDisk(new URL('data-store.json', settings.config.cacheDir)); + globalDataStore.set(store); } const contentConfig = globalContentConfigObserver.get(); if (contentConfig?.status !== 'loaded') { @@ -25,7 +25,8 @@ export async function syncDataLayer({ return collection.loader.load({ collection: name, store: store.scopedStore(name), - cache: {}, + meta: store.metaStore(name), + logger: logger.forkIntegrationLogger('content') }); }) ); diff --git a/packages/astro/src/content/utils.ts b/packages/astro/src/content/utils.ts index f5d4b599aefe..c5e2d5223ce2 100644 --- a/packages/astro/src/content/utils.ts +++ b/packages/astro/src/content/utils.ts @@ -42,7 +42,17 @@ export const collectionConfigParser = z.union([ loader: z.object({ name: z.string(), load: z.function( - z.tuple([z.object({ collection: z.string(), store: z.any(), cache: z.any() })], z.unknown()) + z.tuple( + [ + z.object({ + collection: z.string(), + store: z.any(), + meta: z.any(), + logger: z.any(), + }), + ], + z.unknown() + ) ), schema: z.any().optional(), render: z.function(z.tuple([z.any()], z.unknown())).optional(), diff --git a/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts index 706fb3087b4b..fddcffb9a204 100644 --- a/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts +++ b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts @@ -8,17 +8,27 @@ export function loader(config:PostLoaderConfig): Loader { return { name: "post-loader", load: async ({ - store, collection, cache + store, collection, meta, logger }) => { - console.log('loading posts'); + logger.info('Loading posts'); + + const lastSynced = meta.get('lastSynced'); + + // Don't sync more than once a minute + if (lastSynced && (Date.now() - Number(lastSynced) < 1000 * 60)) { + logger.info('Skipping sync'); + return; + } + const posts = await fetch(config.url) .then((res) => res.json()); - + store.clear(); for (const post of posts) { store.set(post.id, post); } + meta.set('lastSynced', String(Date.now())); }, }; } diff --git a/packages/astro/types/content.d.ts b/packages/astro/types/content.d.ts index c9610a98da09..1d9060bbf447 100644 --- a/packages/astro/types/content.d.ts +++ b/packages/astro/types/content.d.ts @@ -1,4 +1,5 @@ -import type { ScopedDataStore } from '../src/content/data-store.js'; +import type { Logger } from '../src/core/logger/core.js'; +import type { MetaStore, ScopedDataStore } from '../src/content/data-store.js'; declare module 'astro:content' { export { z } from 'astro/zod'; @@ -38,8 +39,8 @@ declare module 'astro:content' { // A database abstraction to store the actual data store: ScopedDataStore; // A simple KV store, designed for things like sync tokens - // Persisted to disk - cache: any; + meta: MetaStore; + logger: AstroIntegrationLogger } export interface Loader { From 631f3d211a78773981b038b43fff70f770538ebe Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 25 Jun 2024 19:34:41 +0100 Subject: [PATCH 06/21] wip --- packages/astro/src/content/file.ts | 11 +++++++++++ packages/astro/src/content/loaders.ts | 2 +- packages/astro/src/content/runtime.ts | 2 +- packages/astro/templates/content/module.mjs | 2 +- .../fixtures/content-layer/src/loaders/post-loader.ts | 2 +- packages/astro/types/content.d.ts | 2 +- 6 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 packages/astro/src/content/file.ts diff --git a/packages/astro/src/content/file.ts b/packages/astro/src/content/file.ts new file mode 100644 index 000000000000..2aa48315214d --- /dev/null +++ b/packages/astro/src/content/file.ts @@ -0,0 +1,11 @@ +/// +import type { Loader } from 'astro:content'; + +export function file(fileName: string | URL): Loader { + return { + name: 'post-loader', + load: async ({ store, logger }) => { + logger.info('Loading posts'); + }, + }; +} diff --git a/packages/astro/src/content/loaders.ts b/packages/astro/src/content/loaders.ts index 914452fe3257..69dcde332c93 100644 --- a/packages/astro/src/content/loaders.ts +++ b/packages/astro/src/content/loaders.ts @@ -26,7 +26,7 @@ export async function syncDataLayer({ collection: name, store: store.scopedStore(name), meta: store.metaStore(name), - logger: logger.forkIntegrationLogger('content') + logger: logger.forkIntegrationLogger('content'), }); }) ); diff --git a/packages/astro/src/content/runtime.ts b/packages/astro/src/content/runtime.ts index 51a709e055fe..98b9ec5af286 100644 --- a/packages/astro/src/content/runtime.ts +++ b/packages/astro/src/content/runtime.ts @@ -14,7 +14,7 @@ import { unescapeHTML, } from '../runtime/server/index.js'; import type { ContentLookupMap } from './utils.js'; -import { DataStore, globalDataStore } from './data-store.js'; +import { globalDataStore } from './data-store.js'; type LazyImport = () => Promise; type GlobResult = Record; diff --git a/packages/astro/templates/content/module.mjs b/packages/astro/templates/content/module.mjs index f246678a25ec..92ae22b31119 100644 --- a/packages/astro/templates/content/module.mjs +++ b/packages/astro/templates/content/module.mjs @@ -9,7 +9,7 @@ import { createReference, } from 'astro/content/runtime'; -export { defineCollection } from 'astro/content/runtime'; +export { defineCollection, file } from 'astro/content/runtime'; export { z } from 'astro/zod'; const contentDir = '@@CONTENT_DIR@@'; diff --git a/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts index fddcffb9a204..edd2a8dbf443 100644 --- a/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts +++ b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts @@ -8,7 +8,7 @@ export function loader(config:PostLoaderConfig): Loader { return { name: "post-loader", load: async ({ - store, collection, meta, logger + store, meta, logger }) => { logger.info('Loading posts'); diff --git a/packages/astro/types/content.d.ts b/packages/astro/types/content.d.ts index 1d9060bbf447..0316ec461c5f 100644 --- a/packages/astro/types/content.d.ts +++ b/packages/astro/types/content.d.ts @@ -40,7 +40,7 @@ declare module 'astro:content' { store: ScopedDataStore; // A simple KV store, designed for things like sync tokens meta: MetaStore; - logger: AstroIntegrationLogger + logger: AstroIntegrationLogger; } export interface Loader { From 4b7f8f75913aeb36cb2938e94740379ad9f71801 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 25 Jun 2024 21:36:06 +0100 Subject: [PATCH 07/21] Add file loader --- packages/astro/src/content/file.ts | 44 ++- packages/astro/src/content/loaders.ts | 31 +- packages/astro/src/content/runtime.ts | 1 + packages/astro/src/content/types-generator.ts | 10 +- packages/astro/src/content/utils.ts | 4 +- .../content-layer/src/content/_data/dogs.json | 302 ++++++++++++++++++ .../content-layer/src/content/config.ts | 18 +- .../content-layer/src/pages/dogs/[slug].astro | 39 +++ .../content-layer/src/pages/index.astro | 9 + packages/astro/types/content.d.ts | 5 +- 10 files changed, 445 insertions(+), 18 deletions(-) create mode 100644 packages/astro/test/fixtures/content-layer/src/content/_data/dogs.json create mode 100644 packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro diff --git a/packages/astro/src/content/file.ts b/packages/astro/src/content/file.ts index 2aa48315214d..6a7e07388ff2 100644 --- a/packages/astro/src/content/file.ts +++ b/packages/astro/src/content/file.ts @@ -1,10 +1,46 @@ -/// -import type { Loader } from 'astro:content'; +import type { Loader } from './loaders.js'; +import { promises as fs, existsSync } from 'fs'; export function file(fileName: string | URL): Loader { return { - name: 'post-loader', - load: async ({ store, logger }) => { + name: 'file-loader', + load: async ({ store, logger, settings }) => { + const contentDir = new URL('./content/', settings.config.srcDir); + + const url = new URL(fileName, contentDir); + if (!existsSync(url)) { + logger.error(`File not found: ${fileName}`); + return; + } + + const data = await fs.readFile(url, 'utf-8'); + const json = JSON.parse(data); + + if (Array.isArray(json)) { + if (json.length === 0) { + logger.warn(`No items found in ${fileName}`); + } else { + const firstItem = json[0]; + if (!firstItem.id && !firstItem.slug) { + logger.error(`Invalid data in ${fileName}. Array items have an id or slug field.`); + } + } + for (const item of json) { + const id = item.id ?? item.slug; + if (!id) { + logger.debug(`Missing ID or slug for item: ${JSON.stringify(item)}`); + continue; + } + store.set(id, item); + } + } else if (typeof json === 'object') { + for (const [id, item] of Object.entries(json)) { + store.set(id, item); + } + } else { + logger.error(`Invalid data in ${fileName}. Must be an array or object.`); + } + logger.info('Loading posts'); }, }; diff --git a/packages/astro/src/content/loaders.ts b/packages/astro/src/content/loaders.ts index 69dcde332c93..5a964fd99561 100644 --- a/packages/astro/src/content/loaders.ts +++ b/packages/astro/src/content/loaders.ts @@ -1,8 +1,31 @@ +import type { ZodSchema } from 'zod'; import type { AstroSettings } from '../@types/astro.js'; -import type { Logger } from '../core/logger/core.js'; -import { DataStore, globalDataStore } from './data-store.js'; +import type { AstroIntegrationLogger, Logger } from '../core/logger/core.js'; +import { DataStore, globalDataStore, type MetaStore, type ScopedDataStore } from './data-store.js'; import { globalContentConfigObserver } from './utils.js'; +import { promises as fs, existsSync } from 'fs'; +export interface LoaderContext { + collection: string; + // A database abstraction to store the actual data + store: ScopedDataStore; + // A simple KV store, designed for things like sync tokens + meta: MetaStore; + logger: AstroIntegrationLogger; + + settings: AstroSettings; +} + +export interface Loader { + // Name of the loader, e.g. the npm package name + name: string; + // Do the actual loading of the data + load: (context: LoaderContext) => Promise; + // Allow a loader to define its own schema + schema?: S | Promise | (() => S | Promise); + // Render content from the store + render?: (entry: any) => any; +} export async function syncDataLayer({ settings, logger, @@ -27,10 +50,14 @@ export async function syncDataLayer({ store: store.scopedStore(name), meta: store.metaStore(name), logger: logger.forkIntegrationLogger('content'), + settings, }); }) ); const cacheFile = new URL('data-store.json', settings.config.cacheDir); + if (!existsSync(settings.config.cacheDir)) { + await fs.mkdir(settings.config.cacheDir, { recursive: true }); + } await store.writeToDisk(cacheFile); logger.info(null, 'Synced data layer'); } diff --git a/packages/astro/src/content/runtime.ts b/packages/astro/src/content/runtime.ts index 98b9ec5af286..a22bd291947e 100644 --- a/packages/astro/src/content/runtime.ts +++ b/packages/astro/src/content/runtime.ts @@ -15,6 +15,7 @@ import { } from '../runtime/server/index.js'; import type { ContentLookupMap } from './utils.js'; import { globalDataStore } from './data-store.js'; +export { file } from './file.js'; type LazyImport = () => Promise; type GlobResult = Record; diff --git a/packages/astro/src/content/types-generator.ts b/packages/astro/src/content/types-generator.ts index 2a8e8b199acb..600ea90b228e 100644 --- a/packages/astro/src/content/types-generator.ts +++ b/packages/astro/src/content/types-generator.ts @@ -435,7 +435,11 @@ async function writeContentFiles({ : collection.type; const collectionEntryKeys = Object.keys(collection.entries).sort(); - const dataType = collectionConfig?.schema ? `InferEntrySchema<${collectionKey}>` : 'any'; + const dataType = + collectionConfig?.schema || + (collectionConfig?.type === 'experimental_data' && collectionConfig.loader?.schema) + ? `InferEntrySchema<${collectionKey}>` + : 'any'; switch (resolvedType) { case 'content': if (collectionEntryKeys.length === 0) { @@ -455,6 +459,7 @@ async function writeContentFiles({ contentTypesStr += `};\n`; break; case 'data': + case 'experimental_data': if (collectionEntryKeys.length === 0) { dataTypesStr += `${collectionKey}: Record;\n`; } else { @@ -496,9 +501,6 @@ async function writeContentFiles({ } } break; - case 'experimental_data': - console.log('experimental_data', collectionKey); - break; } } diff --git a/packages/astro/src/content/utils.ts b/packages/astro/src/content/utils.ts index c5e2d5223ce2..1b892591e51b 100644 --- a/packages/astro/src/content/utils.ts +++ b/packages/astro/src/content/utils.ts @@ -37,8 +37,7 @@ export const collectionConfigParser = z.union([ }), z.object({ type: z.literal('experimental_data'), - name: z.string(), - schema: z.undefined().optional(), + schema: z.any().optional(), loader: z.object({ name: z.string(), load: z.function( @@ -49,6 +48,7 @@ export const collectionConfigParser = z.union([ store: z.any(), meta: z.any(), logger: z.any(), + settings: z.any(), }), ], z.unknown() diff --git a/packages/astro/test/fixtures/content-layer/src/content/_data/dogs.json b/packages/astro/test/fixtures/content-layer/src/content/_data/dogs.json new file mode 100644 index 000000000000..66e6320c65e1 --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/content/_data/dogs.json @@ -0,0 +1,302 @@ +[ + { + "breed": "Labrador Retriever", + "id": "labrador-retriever", + "size": "Large", + "origin": "Canada", + "lifespan": "10-12 years", + "temperament": [ + "Friendly", + "Active", + "Outgoing" + ] + }, + { + "breed": "German Shepherd", + "id": "german-shepherd", + "size": "Large", + "origin": "Germany", + "lifespan": "9-13 years", + "temperament": [ + "Loyal", + "Intelligent", + "Confident" + ] + }, + { + "breed": "Golden Retriever", + "id": "golden-retriever", + "size": "Large", + "origin": "Scotland", + "lifespan": "10-12 years", + "temperament": [ + "Intelligent", + "Friendly", + "Devoted" + ] + }, + { + "breed": "French Bulldog", + "id": "french-bulldog", + "size": "Small", + "origin": "France", + "lifespan": "10-12 years", + "temperament": [ + "Playful", + "Adaptable", + "Sociable" + ] + }, + { + "breed": "Bulldog", + "id": "bulldog", + "size": "Medium", + "origin": "England", + "lifespan": "8-10 years", + "temperament": [ + "Docile", + "Willful", + "Friendly" + ] + }, + { + "breed": "Beagle", + "id": "beagle", + "size": "Small to Medium", + "origin": "England", + "lifespan": "12-15 years", + "temperament": [ + "Friendly", + "Curious", + "Merry" + ] + }, + { + "breed": "Poodle", + "id": "poodle", + "size": "Toy, Miniature, or Standard", + "origin": "Germany", + "lifespan": "12-15 years", + "temperament": [ + "Intelligent", + "Active", + "Alert" + ] + }, + { + "breed": "Rottweiler", + "id": "rottweiler", + "size": "Large", + "origin": "Germany", + "lifespan": "8-10 years", + "temperament": [ + "Loyal", + "Confident", + "Courageous" + ] + }, + { + "breed": "German Shorthaired Pointer", + "id": "german-shorthaired-pointer", + "size": "Medium to Large", + "origin": "Germany", + "lifespan": "10-12 years", + "temperament": [ + "Friendly", + "Intelligent", + "Willing to Please" + ] + }, + { + "breed": "Yorkshire Terrier", + "id": "yorkshire-terrier", + "size": "Toy", + "origin": "England", + "lifespan": "13-16 years", + "temperament": [ + "Affectionate", + "Sprightly", + "Tomboyish" + ] + }, + { + "breed": "Boxer", + "id": "boxer", + "size": "Medium to Large", + "origin": "Germany", + "lifespan": "10-12 years", + "temperament": [ + "Playful", + "Energetic", + "Loyal" + ] + }, + { + "breed": "Dachshund", + "id": "dachshund", + "size": "Small", + "origin": "Germany", + "lifespan": "12-16 years", + "temperament": [ + "Clever", + "Stubborn", + "Devoted" + ] + }, + { + "breed": "Siberian Husky", + "id": "siberian-husky", + "size": "Medium", + "origin": "Siberia", + "lifespan": "12-14 years", + "temperament": [ + "Outgoing", + "Mischievous", + "Loyal" + ] + }, + { + "breed": "Great Dane", + "id": "great-dane", + "size": "Large", + "origin": "Germany", + "lifespan": "7-10 years", + "temperament": [ + "Friendly", + "Patient", + "Dependable" + ] + }, + { + "breed": "Doberman Pinscher", + "id": "doberman-pinscher", + "size": "Large", + "origin": "Germany", + "lifespan": "10-12 years", + "temperament": [ + "Loyal", + "Fearless", + "Alert" + ] + }, + { + "breed": "Australian Shepherd", + "id": "australian-shepherd", + "size": "Medium", + "origin": "United States", + "lifespan": "12-15 years", + "temperament": [ + "Intelligent", + "Work-oriented", + "Exuberant" + ] + }, + { + "breed": "Miniature Schnauzer", + "id": "miniature-schnauzer", + "size": "Small", + "origin": "Germany", + "lifespan": "12-15 years", + "temperament": [ + "Friendly", + "Smart", + "Obedient" + ] + }, + { + "breed": "Cavalier King Charles Spaniel", + "id": "cavalier-king-charles-spaniel", + "size": "Small", + "origin": "United Kingdom", + "lifespan": "9-14 years", + "temperament": [ + "Affectionate", + "Gentle", + "Graceful" + ] + }, + { + "breed": "Shih Tzu", + "id": "shih-tzu", + "size": "Small", + "origin": "China", + "lifespan": "10-18 years", + "temperament": [ + "Affectionate", + "Playful", + "Outgoing" + ] + }, + { + "breed": "Boston Terrier", + "id": "boston-terrier", + "size": "Small", + "origin": "United States", + "lifespan": "11-13 years", + "temperament": [ + "Friendly", + "Lively", + "Intelligent" + ] + }, + { + "breed": "Bernese Mountain Dog", + "id": "bernese-mountain-dog", + "size": "Large", + "origin": "Switzerland", + "lifespan": "7-10 years", + "temperament": [ + "Good-natured", + "Calm", + "Strong" + ] + }, + { + "breed": "Pomeranian", + "id": "pomeranian", + "size": "Toy", + "origin": "Germany", + "lifespan": "12-16 years", + "temperament": [ + "Lively", + "Bold", + "Inquisitive" + ] + }, + { + "breed": "Havanese", + "id": "havanese", + "size": "Small", + "origin": "Cuba", + "lifespan": "14-16 years", + "temperament": [ + "Playful", + "Intelligent", + "Outgoing" + ] + }, + { + "breed": "English Springer Spaniel", + "id": "english-springer-spaniel", + "size": "Medium", + "origin": "England", + "lifespan": "12-14 years", + "temperament": [ + "Friendly", + "Playful", + "Obedient" + ] + }, + { + "breed": "Shetland Sheepdog", + "id": "shetland-sheepdog", + "size": "Small", + "origin": "Scotland", + "lifespan": "12-14 years", + "temperament": [ + "Playful", + "Energetic", + "Intelligent" + ] + } +] diff --git a/packages/astro/test/fixtures/content-layer/src/content/config.ts b/packages/astro/test/fixtures/content-layer/src/content/config.ts index 62bc51654c8f..4f03a5039b81 100644 --- a/packages/astro/test/fixtures/content-layer/src/content/config.ts +++ b/packages/astro/test/fixtures/content-layer/src/content/config.ts @@ -1,10 +1,22 @@ -import { defineCollection, z } from 'astro:content'; +import { defineCollection, file, z } from 'astro:content'; +console.log({file}) import { loader } from '../loaders/post-loader.js'; const blog = defineCollection({ type: "experimental_data", - name: "blog", loader: loader({ url: "https://jsonplaceholder.typicode.com/posts" }), }); -export const collections = { blog }; +const dogs = defineCollection({ + type: "experimental_data", + loader: file("_data/dogs.json"), + schema: z.object({ + breed: z.string(), + id: z.string(), + size: z.string(), + origin: z.string(), + lifespan: z.string(), + temperament: z.array(z.string()), + }), +}) +export const collections = { blog, dogs }; diff --git a/packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro b/packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro new file mode 100644 index 000000000000..80524850caef --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro @@ -0,0 +1,39 @@ +--- +import type { GetStaticPaths } from "astro"; +import { getCollection } from "astro:content" +export const getStaticPaths = (async () => { + const collection = await getCollection("dogs"); + if(!collection) return [] + return collection.map((dog) => ({ + params: { + slug: dog.id + }, + props: { + dog: dog.data + } + })); +}) satisfies GetStaticPaths; + + +interface Props { + dog: { + breed: string; + id: string; + size: string; + origin: string; + lifespan: string; + temperament: string[]; + } +} + +const { dog } = Astro.props + +--- + +

{dog.breed}

+
    +
  • Size: {dog.size}
  • +
  • Origin: {dog.origin}
  • +
  • Lifespan: {dog.lifespan}
  • +
  • Temperament: {dog.temperament.join(", ")}
  • +
diff --git a/packages/astro/test/fixtures/content-layer/src/pages/index.astro b/packages/astro/test/fixtures/content-layer/src/pages/index.astro index 6f288c96697a..7036de032fdf 100644 --- a/packages/astro/test/fixtures/content-layer/src/pages/index.astro +++ b/packages/astro/test/fixtures/content-layer/src/pages/index.astro @@ -3,12 +3,20 @@ import { getCollection, getDataEntryById } from 'astro:content'; const blog = await getCollection('blog'); const first = await getDataEntryById('blog', 1); +const dogs = await getCollection('dogs'); --- Index + +

Dogs

+

Blog Posts

{first.data.title}

@@ -17,5 +25,6 @@ const first = await getDataEntryById('blog', 1);
  • { post.data?.title }
  • ))} + diff --git a/packages/astro/types/content.d.ts b/packages/astro/types/content.d.ts index 0316ec461c5f..4ae0e1bdcaeb 100644 --- a/packages/astro/types/content.d.ts +++ b/packages/astro/types/content.d.ts @@ -1,4 +1,4 @@ -import type { Logger } from '../src/core/logger/core.js'; +import type { AstroIntegrationLogger } from '../src/core/logger/core.js'; import type { MetaStore, ScopedDataStore } from '../src/content/data-store.js'; declare module 'astro:content' { export { z } from 'astro/zod'; @@ -56,8 +56,7 @@ declare module 'astro:content' { type ContentCollectionV2Config = { type: 'experimental_data'; - name: string; - schema?: undefined; + schema?: S | ((context: SchemaContext) => S); loader: Loader; }; From 14330f7d188da1e391063c4b2435c63c26a29c6b Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 26 Jun 2024 08:59:17 +0100 Subject: [PATCH 08/21] Add schema validation --- packages/astro/src/content/file.ts | 33 +++++---- packages/astro/src/content/loaders.ts | 74 ++++++++++++++++--- packages/astro/src/content/utils.ts | 8 +- .../content-layer/src/content/config.ts | 2 +- .../content-layer/src/pages/dogs/[slug].astro | 2 + 5 files changed, 91 insertions(+), 28 deletions(-) diff --git a/packages/astro/src/content/file.ts b/packages/astro/src/content/file.ts index 6a7e07388ff2..c088a3bed2b6 100644 --- a/packages/astro/src/content/file.ts +++ b/packages/astro/src/content/file.ts @@ -1,10 +1,20 @@ +import { fileURLToPath } from 'url'; import type { Loader } from './loaders.js'; import { promises as fs, existsSync } from 'fs'; -export function file(fileName: string | URL): Loader { + +/** + * Loads entries from a JSON file. The file must contain an array of objects that contain unique `id` fields, or an object with string keys. + * @todo Add support for other file types, such as YAML, CSV etc. + * @param fileName The path to the JSON file to load, relative to the content directory. + */ +export function file(fileName: string): Loader { + if(fileName.includes('*')) { + throw new Error('Glob patterns are not supported in file loader. Use `glob` loader instead.'); + } return { name: 'file-loader', - load: async ({ store, logger, settings }) => { + load: async ({ store, logger, settings, parseData }) => { const contentDir = new URL('./content/', settings.config.srcDir); const url = new URL(fileName, contentDir); @@ -16,25 +26,20 @@ export function file(fileName: string | URL): Loader { const data = await fs.readFile(url, 'utf-8'); const json = JSON.parse(data); + const filePath = fileURLToPath(url); + if (Array.isArray(json)) { if (json.length === 0) { logger.warn(`No items found in ${fileName}`); - } else { - const firstItem = json[0]; - if (!firstItem.id && !firstItem.slug) { - logger.error(`Invalid data in ${fileName}. Array items have an id or slug field.`); - } } - for (const item of json) { - const id = item.id ?? item.slug; - if (!id) { - logger.debug(`Missing ID or slug for item: ${JSON.stringify(item)}`); - continue; - } + for (const rawItem of json) { + const id = rawItem.id ?? rawItem.slug; + const item = await parseData({ id, data: rawItem, filePath }); store.set(id, item); } } else if (typeof json === 'object') { - for (const [id, item] of Object.entries(json)) { + for (const [id, rawItem] of Object.entries>(json)) { + const item = await parseData({ id, data: rawItem, filePath }); store.set(id, item); } } else { diff --git a/packages/astro/src/content/loaders.ts b/packages/astro/src/content/loaders.ts index 5a964fd99561..b966d13d47bc 100644 --- a/packages/astro/src/content/loaders.ts +++ b/packages/astro/src/content/loaders.ts @@ -2,42 +2,56 @@ import type { ZodSchema } from 'zod'; import type { AstroSettings } from '../@types/astro.js'; import type { AstroIntegrationLogger, Logger } from '../core/logger/core.js'; import { DataStore, globalDataStore, type MetaStore, type ScopedDataStore } from './data-store.js'; -import { globalContentConfigObserver } from './utils.js'; +import { getEntryData, globalContentConfigObserver } from './utils.js'; import { promises as fs, existsSync } from 'fs'; +export interface ParseDataOptions { + /** The ID of the entry. Unique per collection */ + id: string; + /** The raw, unvalidated data of the entry */ + data: Record; + /** An optional file path, where the entry represents a local file */ + filePath?: string; +} + export interface LoaderContext { collection: string; - // A database abstraction to store the actual data + /** A database abstraction to store the actual data */ store: ScopedDataStore; - // A simple KV store, designed for things like sync tokens + /** A simple KV store, designed for things like sync tokens */ meta: MetaStore; logger: AstroIntegrationLogger; settings: AstroSettings; + + /** Validates and parses the data according to the schema */ + parseData = Record>( + props: ParseDataOptions + ): T; } export interface Loader { - // Name of the loader, e.g. the npm package name + /** Unique name of the loader, e.g. the npm package name */ name: string; - // Do the actual loading of the data + /** Do the actual loading of the data */ load: (context: LoaderContext) => Promise; - // Allow a loader to define its own schema + /** Optionally, define the schema of the data. Will be overridden by user-defined schema */ schema?: S | Promise | (() => S | Promise); - // Render content from the store render?: (entry: any) => any; } export async function syncDataLayer({ settings, - logger, + logger: globalLogger, store, }: { settings: AstroSettings; logger: Logger; store?: DataStore }) { + const logger = globalLogger.forkIntegrationLogger('content'); if (!store) { store = await DataStore.fromDisk(new URL('data-store.json', settings.config.cacheDir)); globalDataStore.set(store); } const contentConfig = globalContentConfigObserver.get(); if (contentConfig?.status !== 'loaded') { - logger.debug('content', 'Content config not loaded, skipping sync'); + logger.debug('Content config not loaded, skipping sync'); return; } await Promise.all( @@ -45,12 +59,50 @@ export async function syncDataLayer({ if (collection.type !== 'experimental_data') { return; } + + let { schema } = collection; + + if (!schema) { + schema = collection.loader.schema; + } + + if (typeof schema === 'function') { + schema = await schema({ + image: () => { + throw new Error('Images are currently not supported for experimental data collections'); + }, + }); + } + + const collectionWithResolvedSchema = { ...collection, schema }; + + function parseData = Record>({ + id, + data, + filePath = '', + }: { id: string; data: T; filePath?: string }): T { + return getEntryData( + { + id, + collection: name, + unvalidatedData: data, + _internal: { + rawData: undefined, + filePath, + }, + }, + collectionWithResolvedSchema, + false + ) as unknown as T; + } + return collection.loader.load({ collection: name, store: store.scopedStore(name), meta: store.metaStore(name), - logger: logger.forkIntegrationLogger('content'), + logger, settings, + parseData, }); }) ); @@ -59,5 +111,5 @@ export async function syncDataLayer({ await fs.mkdir(settings.config.cacheDir, { recursive: true }); } await store.writeToDisk(cacheFile); - logger.info(null, 'Synced data layer'); + logger.info('Synced content'); } diff --git a/packages/astro/src/content/utils.ts b/packages/astro/src/content/utils.ts index 1b892591e51b..e48cbeeb2780 100644 --- a/packages/astro/src/content/utils.ts +++ b/packages/astro/src/content/utils.ts @@ -49,6 +49,7 @@ export const collectionConfigParser = z.union([ meta: z.any(), logger: z.any(), settings: z.any(), + parseData: z.any(), }), ], z.unknown() @@ -104,10 +105,10 @@ export async function getEntryData( }, collectionConfig: CollectionConfig, shouldEmitFile: boolean, - pluginContext: PluginContext + pluginContext?: PluginContext ) { let data; - if (collectionConfig.type === 'data') { + if (collectionConfig.type === 'data' || collectionConfig.type === 'experimental_data') { data = entry.unvalidatedData; } else { const { slug, ...unvalidatedData } = entry.unvalidatedData; @@ -116,6 +117,9 @@ export async function getEntryData( let schema = collectionConfig.schema; if (typeof schema === 'function') { + if (!pluginContext) { + throw new Error('Plugin context is required for schema functions'); + } schema = schema({ image: createImage(pluginContext, shouldEmitFile, entry._internal.filePath), }); diff --git a/packages/astro/test/fixtures/content-layer/src/content/config.ts b/packages/astro/test/fixtures/content-layer/src/content/config.ts index 4f03a5039b81..fc796ae7e39d 100644 --- a/packages/astro/test/fixtures/content-layer/src/content/config.ts +++ b/packages/astro/test/fixtures/content-layer/src/content/config.ts @@ -16,7 +16,7 @@ const dogs = defineCollection({ size: z.string(), origin: z.string(), lifespan: z.string(), - temperament: z.array(z.string()), + temperament: z.array(z.string()) }), }) export const collections = { blog, dogs }; diff --git a/packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro b/packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro index 80524850caef..b37f201e480b 100644 --- a/packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro +++ b/packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro @@ -28,6 +28,8 @@ interface Props { const { dog } = Astro.props +console.log({dog}) + ---

    {dog.breed}

    From b3b8dd4962dfc196a0fdcbd9e0d8effbdc9f7bb8 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 26 Jun 2024 12:13:08 +0100 Subject: [PATCH 09/21] Remove log --- packages/astro/test/fixtures/content-layer/src/content/config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/astro/test/fixtures/content-layer/src/content/config.ts b/packages/astro/test/fixtures/content-layer/src/content/config.ts index fc796ae7e39d..eda587f6a25f 100644 --- a/packages/astro/test/fixtures/content-layer/src/content/config.ts +++ b/packages/astro/test/fixtures/content-layer/src/content/config.ts @@ -1,5 +1,4 @@ import { defineCollection, file, z } from 'astro:content'; -console.log({file}) import { loader } from '../loaders/post-loader.js'; const blog = defineCollection({ From c932fb8ba1d0f02ef6ed23c0e587c1f43c9f2de9 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 26 Jun 2024 12:16:29 +0100 Subject: [PATCH 10/21] Changeset --- .changeset/smooth-chicken-wash.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/smooth-chicken-wash.md diff --git a/.changeset/smooth-chicken-wash.md b/.changeset/smooth-chicken-wash.md new file mode 100644 index 000000000000..a3a433831952 --- /dev/null +++ b/.changeset/smooth-chicken-wash.md @@ -0,0 +1,5 @@ +--- +'astro': minor +--- + +Implements Content Layer From 941c4be12eae51a12a33fb4713ec5f0edcddf992 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 26 Jun 2024 12:25:09 +0100 Subject: [PATCH 11/21] Format --- packages/astro/src/content/file.ts | 3 +-- packages/astro/src/core/sync/index.ts | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/astro/src/content/file.ts b/packages/astro/src/content/file.ts index c088a3bed2b6..4fa1ac21b6d5 100644 --- a/packages/astro/src/content/file.ts +++ b/packages/astro/src/content/file.ts @@ -2,14 +2,13 @@ import { fileURLToPath } from 'url'; import type { Loader } from './loaders.js'; import { promises as fs, existsSync } from 'fs'; - /** * Loads entries from a JSON file. The file must contain an array of objects that contain unique `id` fields, or an object with string keys. * @todo Add support for other file types, such as YAML, CSV etc. * @param fileName The path to the JSON file to load, relative to the content directory. */ export function file(fileName: string): Loader { - if(fileName.includes('*')) { + if (fileName.includes('*')) { throw new Error('Glob patterns are not supported in file loader. Use `glob` loader instead.'); } return { diff --git a/packages/astro/src/core/sync/index.ts b/packages/astro/src/core/sync/index.ts index d7ce03ce044a..1533e793ccf0 100644 --- a/packages/astro/src/core/sync/index.ts +++ b/packages/astro/src/core/sync/index.ts @@ -86,9 +86,9 @@ export default async function sync( const exitCode = await syncContentCollections(settings, { ...options, logger }); if (exitCode !== 0) return exitCode; syncAstroEnv(settings, options?.fs); - + await syncDataLayer({ settings, logger }); - + logger.info(null, `Types generated ${dim(getTimeStat(timerStart, performance.now()))}`); return 0; } catch (err) { From f997ca5d86b8cb3fc6d7f97cc8271c70b97f9e77 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 26 Jun 2024 13:31:21 +0100 Subject: [PATCH 12/21] Lockfile --- pnpm-lock.yaml | 1908 +++++++++++++----------------------------------- 1 file changed, 503 insertions(+), 1405 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 09e9ac7abfc9..34322118d67e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,7 +20,7 @@ importers: devDependencies: '@astrojs/check': specifier: ^0.7.0 - version: 0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.4.5) + version: 0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.5.2) '@biomejs/biome': specifier: 1.8.1 version: 1.8.1 @@ -28,8 +28,8 @@ importers: specifier: ^0.5.0 version: 0.5.0 '@changesets/cli': - specifier: ^2.27.5 - version: 2.27.5 + specifier: ^2.27.6 + version: 2.27.6 '@eslint/eslintrc': specifier: ^3.1.0 version: 3.1.0 @@ -70,11 +70,11 @@ importers: specifier: ^1.13.4 version: 1.13.4 typescript: - specifier: ~5.4.5 - version: 5.4.5 + specifier: ~5.5.2 + version: 5.5.2 typescript-eslint: - specifier: ^7.13.0 - version: 7.13.0(eslint@9.5.0)(typescript@5.4.5) + specifier: ^7.13.1 + version: 7.14.1(eslint@9.5.0)(typescript@5.5.2) benchmark: dependencies: @@ -128,28 +128,28 @@ importers: examples/basics: dependencies: astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/blog: dependencies: '@astrojs/mdx': - specifier: ^3.1.1 + specifier: ^3.1.2 version: link:../../packages/integrations/mdx '@astrojs/rss': - specifier: ^4.0.6 + specifier: ^4.0.7 version: link:../../packages/astro-rss '@astrojs/sitemap': specifier: ^3.1.6 version: link:../../packages/integrations/sitemap astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/component: devDependencies: astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/container-with-vitest: @@ -158,7 +158,7 @@ importers: specifier: ^3.6.0 version: link:../../packages/integrations/react astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro react: specifier: ^18.3.1 @@ -168,7 +168,7 @@ importers: version: 18.3.1(react@18.3.1) vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.12.7)(jsdom@23.2.0)(sass@1.77.5) + version: 1.6.0(@types/node@20.12.7)(jsdom@23.2.0)(sass@1.77.6) devDependencies: '@types/react': specifier: ^18.3.3 @@ -186,10 +186,10 @@ importers: specifier: ^3.13.10 version: 3.13.10 alpinejs: - specifier: ^3.14.0 - version: 3.14.0 + specifier: ^3.14.1 + version: 3.14.1 astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/framework-lit: @@ -201,7 +201,7 @@ importers: specifier: ^0.2.1 version: 0.2.1 astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro lit: specifier: ^3.1.4 @@ -231,7 +231,7 @@ importers: specifier: ^18.3.0 version: 18.3.0 astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro preact: specifier: ^10.22.0 @@ -249,8 +249,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) examples/framework-preact: dependencies: @@ -261,7 +261,7 @@ importers: specifier: ^1.2.3 version: 1.2.3(preact@10.22.0) astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro preact: specifier: ^10.22.0 @@ -279,7 +279,7 @@ importers: specifier: ^18.3.0 version: 18.3.0 astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro react: specifier: ^18.3.1 @@ -294,7 +294,7 @@ importers: specifier: ^4.4.0 version: link:../../packages/integrations/solid astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro solid-js: specifier: ^1.8.17 @@ -306,7 +306,7 @@ importers: specifier: ^5.6.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro svelte: specifier: ^4.2.18 @@ -318,34 +318,34 @@ importers: specifier: ^4.5.0 version: link:../../packages/integrations/vue astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) examples/hackernews: dependencies: '@astrojs/node': - specifier: ^8.3.1 + specifier: ^8.3.2 version: link:../../packages/integrations/node astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/integration: devDependencies: astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/middleware: dependencies: '@astrojs/node': - specifier: ^8.3.1 + specifier: ^8.3.2 version: link:../../packages/integrations/node astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro html-minifier: specifier: ^4.0.0 @@ -358,31 +358,31 @@ importers: examples/minimal: dependencies: astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/non-html-pages: dependencies: astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/portfolio: dependencies: astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/ssr: dependencies: '@astrojs/node': - specifier: ^8.3.1 + specifier: ^8.3.2 version: link:../../packages/integrations/node '@astrojs/svelte': specifier: ^5.6.0 version: link:../../packages/integrations/svelte astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro svelte: specifier: ^4.2.18 @@ -391,11 +391,11 @@ importers: examples/starlog: dependencies: astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro sass: - specifier: ^1.77.5 - version: 1.77.5 + specifier: ^1.77.6 + version: 1.77.6 sharp: specifier: ^0.33.3 version: 0.33.3 @@ -403,37 +403,37 @@ importers: examples/toolbar-app: devDependencies: astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/view-transitions: devDependencies: '@astrojs/node': - specifier: ^8.3.1 + specifier: ^8.3.2 version: link:../../packages/integrations/node '@astrojs/tailwind': specifier: ^5.1.0 version: link:../../packages/integrations/tailwind astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/with-markdoc: dependencies: '@astrojs/markdoc': - specifier: ^0.11.0 + specifier: ^0.11.1 version: link:../../packages/integrations/markdoc astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/with-markdown-plugins: dependencies: '@astrojs/markdown-remark': - specifier: ^5.1.0 + specifier: ^5.1.1 version: link:../../packages/markdown/remark astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro hast-util-select: specifier: ^6.0.2 @@ -454,19 +454,19 @@ importers: examples/with-markdown-shiki: dependencies: astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro examples/with-mdx: dependencies: '@astrojs/mdx': - specifier: ^3.1.1 + specifier: ^3.1.2 version: link:../../packages/integrations/mdx '@astrojs/preact': specifier: ^3.5.0 version: link:../../packages/integrations/preact astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro preact: specifier: ^10.22.0 @@ -481,7 +481,7 @@ importers: specifier: ^0.5.1 version: 0.5.1(nanostores@0.10.3)(preact@10.22.0) astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro nanostores: specifier: ^0.10.3 @@ -493,7 +493,7 @@ importers: examples/with-tailwindcss: dependencies: '@astrojs/mdx': - specifier: ^3.1.1 + specifier: ^3.1.2 version: link:../../packages/integrations/mdx '@astrojs/tailwind': specifier: ^5.1.0 @@ -502,7 +502,7 @@ importers: specifier: ^1.6.4 version: 1.6.4 astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro autoprefixer: specifier: ^10.4.19 @@ -520,17 +520,17 @@ importers: examples/with-vitest: dependencies: astro: - specifier: ^4.11.0 + specifier: ^4.11.2 version: link:../../packages/astro vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.12.7)(jsdom@23.2.0)(sass@1.77.5) + version: 1.6.0(@types/node@20.12.7)(jsdom@23.2.0)(sass@1.77.6) packages/astro: dependencies: '@astrojs/compiler': - specifier: ^2.8.0 - version: 2.8.0 + specifier: ^2.8.1 + version: 2.8.1 '@astrojs/internal-helpers': specifier: workspace:* version: link:../internal-helpers @@ -613,8 +613,8 @@ importers: specifier: ^3.1.3 version: 3.1.3 es-module-lexer: - specifier: ^1.5.3 - version: 1.5.3 + specifier: ^1.5.4 + version: 1.5.4 esbuild: specifier: ^0.21.5 version: 0.21.5 @@ -675,15 +675,12 @@ importers: rehype: specifier: ^13.0.1 version: 13.0.1 - resolve: - specifier: ^1.22.8 - version: 1.22.8 semver: specifier: ^7.6.2 version: 7.6.2 shiki: - specifier: ^1.6.5 - version: 1.6.5 + specifier: ^1.9.0 + version: 1.9.1 string-width: specifier: ^7.1.0 version: 7.1.0 @@ -692,7 +689,7 @@ importers: version: 7.1.0 tsconfck: specifier: ^3.1.0 - version: 3.1.0(typescript@5.4.5) + version: 3.1.0(typescript@5.5.2) unist-util-visit: specifier: ^5.0.0 version: 5.0.0 @@ -701,10 +698,10 @@ importers: version: 6.0.1 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + version: 5.3.1(@types/node@20.12.7)(sass@1.77.6) vitefu: specifier: ^0.2.5 - version: 0.2.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + version: 0.2.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) which-pm: specifier: ^2.2.0 version: 2.2.0 @@ -715,8 +712,8 @@ importers: specifier: ^3.23.8 version: 3.23.8 zod-to-json-schema: - specifier: ^3.23.0 - version: 3.23.0(zod@3.23.8) + specifier: ^3.23.1 + version: 3.23.1(zod@3.23.8) optionalDependencies: sharp: specifier: ^0.33.3 @@ -724,7 +721,7 @@ importers: devDependencies: '@astrojs/check': specifier: ^0.7.0 - version: 0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.4.5) + version: 0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.5.2) '@playwright/test': specifier: ^1.44.1 version: 1.44.1 @@ -776,9 +773,6 @@ importers: '@types/prompts': specifier: ^2.4.9 version: 2.4.9 - '@types/resolve': - specifier: ^1.20.6 - version: 1.20.6 '@types/semver': specifier: ^7.5.8 version: 7.5.8 @@ -810,8 +804,8 @@ importers: specifier: ^4.9.3 version: 4.9.3 node-mocks-http: - specifier: ^1.14.1 - version: 1.14.1 + specifier: ^1.15.0 + version: 1.15.0 parse-srcset: specifier: ^1.0.2 version: 1.0.2 @@ -831,8 +825,8 @@ importers: specifier: ^4.18.0 version: 4.18.0 sass: - specifier: ^1.77.5 - version: 1.77.5 + specifier: ^1.77.6 + version: 1.77.6 srcset-parse: specifier: ^1.1.0 version: 1.1.0 @@ -840,8 +834,8 @@ importers: specifier: ^6.19.2 version: 6.19.2 unified: - specifier: ^11.0.4 - version: 11.0.4 + specifier: ^11.0.5 + version: 11.0.5 packages/astro-prism: dependencies: @@ -888,7 +882,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.7.0 - version: 0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.4.5) + version: 0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.5.2) '@astrojs/db': specifier: workspace:* version: link:../../../../db @@ -914,14 +908,14 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.5.2 + version: 5.5.2 packages/astro/e2e/fixtures/actions-react-19: dependencies: '@astrojs/check': specifier: ^0.7.0 - version: 0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.4.5) + version: 0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.5.2) '@astrojs/db': specifier: workspace:* version: link:../../../../db @@ -947,8 +941,8 @@ importers: specifier: 19.0.0-rc-fb9a90fa48-20240614 version: 19.0.0-rc-fb9a90fa48-20240614(react@19.0.0-rc-fb9a90fa48-20240614) typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.5.2 + version: 5.5.2 packages/astro/e2e/fixtures/astro-component: dependencies: @@ -974,8 +968,8 @@ importers: specifier: workspace:* version: link:../../.. vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/e2e/fixtures/client-only: dependencies: @@ -995,8 +989,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) devDependencies: '@astrojs/preact': specifier: workspace:* @@ -1077,8 +1071,8 @@ importers: specifier: workspace:* version: link:../../.. sass: - specifier: ^1.77.5 - version: 1.77.5 + specifier: ^1.77.6 + version: 1.77.6 packages/astro/e2e/fixtures/errors: dependencies: @@ -1110,8 +1104,8 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) sass: - specifier: ^1.77.5 - version: 1.77.5 + specifier: ^1.77.6 + version: 1.77.6 solid-js: specifier: ^1.8.17 version: 1.8.17 @@ -1119,8 +1113,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/e2e/fixtures/hmr: devDependencies: @@ -1128,8 +1122,8 @@ importers: specifier: workspace:* version: link:../../.. sass: - specifier: ^1.77.5 - version: 1.77.5 + specifier: ^1.77.6 + version: 1.77.6 packages/astro/e2e/fixtures/hydration-race: dependencies: @@ -1188,8 +1182,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) devDependencies: '@astrojs/lit': specifier: workspace:* @@ -1247,8 +1241,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) devDependencies: '@astrojs/preact': specifier: workspace:* @@ -1287,8 +1281,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) devDependencies: '@astrojs/preact': specifier: workspace:* @@ -1327,8 +1321,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) devDependencies: '@astrojs/preact': specifier: workspace:* @@ -1367,8 +1361,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) devDependencies: '@astrojs/preact': specifier: workspace:* @@ -1407,8 +1401,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) devDependencies: '@astrojs/preact': specifier: workspace:* @@ -1447,8 +1441,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) devDependencies: '@astrojs/preact': specifier: workspace:* @@ -1673,8 +1667,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/e2e/fixtures/vue-component: dependencies: @@ -1688,8 +1682,8 @@ importers: specifier: workspace:* version: link:../../.. vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/performance: devDependencies: @@ -1817,8 +1811,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/test/fixtures/actions: dependencies: @@ -1990,8 +1984,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/test/fixtures/astro-class-list: dependencies: @@ -2121,6 +2115,12 @@ importers: specifier: workspace:* version: link:../../.. + packages/astro/test/fixtures/astro-env-required-public: + dependencies: + astro: + specifier: workspace:* + version: link:../../.. + packages/astro/test/fixtures/astro-env-server-fail: dependencies: astro: @@ -2142,8 +2142,8 @@ importers: specifier: workspace:* version: link:../../.. vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/test/fixtures/astro-expr: dependencies: @@ -2427,8 +2427,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/test/fixtures/before-hydration: dependencies: @@ -2566,8 +2566,8 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/test/fixtures/content: dependencies: @@ -3024,8 +3024,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/test/fixtures/fontsource-package: dependencies: @@ -3222,8 +3222,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) devDependencies: '@astrojs/mdx': specifier: workspace:* @@ -3410,8 +3410,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) devDependencies: postcss-preset-env: specifier: ^9.5.14 @@ -3667,8 +3667,8 @@ importers: specifier: workspace:* version: link:../../.. vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/test/fixtures/solid-component: dependencies: @@ -3676,8 +3676,8 @@ importers: specifier: workspace:* version: link:../../../../integrations/solid '@solidjs/router': - specifier: ^0.13.5 - version: 0.13.5(solid-js@1.8.17) + specifier: ^0.13.6 + version: 0.13.6(solid-js@1.8.17) '@test/solid-jsx-component': specifier: file:./deps/solid-jsx-component version: link:deps/solid-jsx-component @@ -3826,19 +3826,19 @@ importers: specifier: link:./deps/test-adapter version: link:deps/test-adapter '@types/react': - specifier: ^18.2.75 + specifier: ^18.3.3 version: 18.3.3 '@types/react-dom': - specifier: ^18.2.24 + specifier: ^18.3.0 version: 18.3.0 astro: specifier: workspace:* version: link:../../.. react: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1 react-dom: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1(react@18.3.1) packages/astro/test/fixtures/ssr-prerender-chunks/deps/test-adapter: {} @@ -4073,8 +4073,8 @@ importers: specifier: workspace:* version: link:../../.. vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/test/fixtures/vue-jsx: dependencies: @@ -4085,8 +4085,8 @@ importers: specifier: workspace:* version: link:../../.. vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/test/fixtures/vue-with-multi-renderer: dependencies: @@ -4103,8 +4103,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/astro/test/fixtures/with-endpoint-routes: dependencies: @@ -4221,11 +4221,11 @@ importers: specifier: 1.0.0-rc.12 version: 1.0.0-rc.12 typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.5.2 + version: 5.5.2 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + version: 5.3.1(@types/node@20.12.7)(sass@1.77.6) packages/db/test/fixtures/basics: dependencies: @@ -4321,7 +4321,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.7.0 - version: 0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.4.5) + version: 0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.5.2) '@astrojs/db': specifier: workspace:* version: link:../../.. @@ -4329,7 +4329,7 @@ importers: specifier: workspace:* version: link:../../../../integrations/node '@astrojs/react': - specifier: ^3.5.0 + specifier: ^3.6.0 version: link:../../../../integrations/react '@types/react': specifier: ^18.3.3 @@ -4353,8 +4353,8 @@ importers: specifier: ^0.1.12 version: 0.1.12(astro@packages+astro)(zod@3.23.8) typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.5.2 + version: 5.5.2 zod: specifier: ^3.23.8 version: 3.23.8 @@ -4372,7 +4372,7 @@ importers: version: link:../../../scripts vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + version: 5.3.1(@types/node@20.12.7)(sass@1.77.6) packages/integrations/alpinejs/test/fixtures/basics: dependencies: @@ -4383,8 +4383,8 @@ importers: specifier: ^3.13.10 version: 3.13.10 alpinejs: - specifier: ^3.14.0 - version: 3.14.0 + specifier: ^3.14.1 + version: 3.14.1 astro: specifier: workspace:* version: link:../../../../../astro @@ -4398,8 +4398,8 @@ importers: specifier: ^3.13.10 version: 3.13.10 alpinejs: - specifier: ^3.14.0 - version: 3.14.0 + specifier: ^3.14.1 + version: 3.14.1 astro: specifier: workspace:* version: link:../../../../../astro @@ -4413,8 +4413,8 @@ importers: specifier: ^3.13.10 version: 3.13.10 alpinejs: - specifier: ^3.14.0 - version: 3.14.0 + specifier: ^3.14.1 + version: 3.14.1 astro: specifier: workspace:* version: link:../../../../../astro @@ -4449,8 +4449,8 @@ importers: specifier: ^3.1.4 version: 3.1.4 sass: - specifier: ^1.77.5 - version: 1.77.5 + specifier: ^1.77.6 + version: 1.77.6 packages/integrations/markdoc: dependencies: @@ -4505,7 +4505,7 @@ importers: version: 0.18.3 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + version: 5.3.1(@types/node@20.12.7)(sass@1.77.6) packages/integrations/markdoc/test/fixtures/content-collections: dependencies: @@ -4651,8 +4651,8 @@ importers: specifier: ^8.12.0 version: 8.12.0 es-module-lexer: - specifier: ^1.5.3 - version: 1.5.3 + specifier: ^1.5.4 + version: 1.5.4 estree-util-visit: specifier: ^2.0.0 version: 2.0.0 @@ -4728,7 +4728,7 @@ importers: version: 6.0.0 rehype-pretty-code: specifier: ^0.13.2 - version: 0.13.2(shiki@1.6.5) + version: 0.13.2(shiki@1.9.1) remark-math: specifier: ^6.0.0 version: 6.0.0 @@ -4737,16 +4737,16 @@ importers: version: 11.1.0 remark-shiki-twoslash: specifier: ^3.1.3 - version: 3.1.3(typescript@5.4.5) + version: 3.1.3(typescript@5.5.2) remark-toc: specifier: ^9.0.0 version: 9.0.0 unified: - specifier: ^11.0.4 - version: 11.0.4 + specifier: ^11.0.5 + version: 11.0.5 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + version: 5.3.1(@types/node@20.12.7)(sass@1.77.6) packages/integrations/mdx/test/fixtures/css-head-mdx: dependencies: @@ -4937,8 +4937,8 @@ importers: specifier: ^4.19.2 version: 4.19.2 node-mocks-http: - specifier: ^1.14.1 - version: 1.14.1 + specifier: ^1.15.0 + version: 1.15.0 packages/integrations/node/test/fixtures/api-route: dependencies: @@ -5091,8 +5091,8 @@ importers: specifier: ^7.24.7 version: 7.24.7(@babel/core@7.24.7) '@preact/preset-vite': - specifier: ^2.8.2 - version: 2.8.2(@babel/core@7.24.7)(preact@10.22.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + specifier: 2.8.2 + version: 2.8.2(@babel/core@7.24.7)(preact@10.22.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) '@preact/signals': specifier: ^1.2.3 version: 1.2.3(preact@10.22.0) @@ -5120,7 +5120,7 @@ importers: dependencies: '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + version: 4.3.1(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) ultrahtml: specifier: ^1.5.3 version: 1.5.3 @@ -5148,7 +5148,7 @@ importers: version: 18.3.1(react@18.3.1) vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + version: 5.3.1(@types/node@20.12.7)(sass@1.77.6) packages/integrations/react/test/fixtures/react-component: dependencies: @@ -5168,8 +5168,8 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/integrations/sitemap: dependencies: @@ -5236,7 +5236,7 @@ importers: dependencies: vite-plugin-solid: specifier: ^2.10.2 - version: 2.10.2(solid-js@1.8.17)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + version: 2.10.2(solid-js@1.8.17)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) devDependencies: astro: specifier: workspace:* @@ -5249,16 +5249,16 @@ importers: version: 1.8.17 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + version: 5.3.1(@types/node@20.12.7)(sass@1.77.6) packages/integrations/svelte: dependencies: '@sveltejs/vite-plugin-svelte': specifier: ^3.1.1 - version: 3.1.1(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + version: 3.1.1(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) svelte2tsx: - specifier: ^0.7.9 - version: 0.7.9(svelte@4.2.18)(typescript@5.4.5) + specifier: ^0.7.10 + version: 0.7.12(svelte@4.2.18)(typescript@5.5.2) devDependencies: astro: specifier: workspace:* @@ -5271,7 +5271,7 @@ importers: version: 4.2.18 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + version: 5.3.1(@types/node@20.12.7)(sass@1.77.6) packages/integrations/tailwind: dependencies: @@ -5296,7 +5296,7 @@ importers: version: 3.4.4 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + version: 5.3.1(@types/node@20.12.7)(sass@1.77.6) packages/integrations/tailwind/test/fixtures/basic: dependencies: @@ -5531,16 +5531,16 @@ importers: dependencies: '@vitejs/plugin-vue': specifier: ^5.0.5 - version: 5.0.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))(vue@3.4.29(typescript@5.4.5)) + version: 5.0.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))(vue@3.4.30(typescript@5.5.2)) '@vitejs/plugin-vue-jsx': specifier: ^4.0.0 - version: 4.0.0(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))(vue@3.4.29(typescript@5.4.5)) + version: 4.0.0(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))(vue@3.4.30(typescript@5.5.2)) '@vue/compiler-sfc': - specifier: ^3.4.29 - version: 3.4.29 + specifier: ^3.4.30 + version: 3.4.30 vite-plugin-vue-devtools: - specifier: ^7.3.0 - version: 7.3.0(rollup@4.18.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))(vue@3.4.29(typescript@5.4.5)) + specifier: ^7.3.4 + version: 7.3.4(rollup@4.18.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))(vue@3.4.30(typescript@5.5.2)) devDependencies: astro: specifier: workspace:* @@ -5556,10 +5556,10 @@ importers: version: 0.18.3 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + version: 5.3.1(@types/node@20.12.7)(sass@1.77.6) vue: - specifier: ^3.4.29 - version: 3.4.29(typescript@5.4.5) + specifier: ^3.4.30 + version: 3.4.30(typescript@5.5.2) packages/integrations/vue/test/fixtures/app-entrypoint: dependencies: @@ -5571,7 +5571,7 @@ importers: version: link:../../../../../astro vite-svg-loader: specifier: 5.1.0 - version: 5.1.0(vue@3.4.29(typescript@5.4.5)) + version: 5.1.0(vue@3.4.30(typescript@5.5.2)) packages/integrations/vue/test/fixtures/app-entrypoint-async: dependencies: @@ -5583,7 +5583,7 @@ importers: version: link:../../../../../astro vite-svg-loader: specifier: 5.1.0 - version: 5.1.0(vue@3.4.29(typescript@5.4.5)) + version: 5.1.0(vue@3.4.30(typescript@5.5.2)) packages/integrations/vue/test/fixtures/app-entrypoint-css: dependencies: @@ -5604,7 +5604,7 @@ importers: version: link:../../../../../astro vite-svg-loader: specifier: 5.1.0 - version: 5.1.0(vue@3.4.29(typescript@5.4.5)) + version: 5.1.0(vue@3.4.30(typescript@5.5.2)) packages/integrations/vue/test/fixtures/app-entrypoint-relative: dependencies: @@ -5636,8 +5636,8 @@ importers: packages/integrations/web-vitals: dependencies: web-vitals: - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.2.0 + version: 4.2.0 devDependencies: '@astrojs/db': specifier: workspace:* @@ -5712,11 +5712,11 @@ importers: specifier: ^3.0.1 version: 3.0.1 shiki: - specifier: ^1.6.5 - version: 1.6.5 + specifier: ^1.9.0 + version: 1.9.1 unified: - specifier: ^11.0.4 - version: 11.0.4 + specifier: ^11.0.5 + version: 11.0.5 unist-util-remove-position: specifier: ^5.0.0 version: 5.0.0 @@ -5771,11 +5771,11 @@ importers: specifier: workspace:* version: link:../../scripts typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.5.2 + version: 5.5.2 vite: specifier: ^5.3.1 - version: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + version: 5.3.1(@types/node@20.12.7)(sass@1.77.6) packages/telemetry: dependencies: @@ -5875,8 +5875,8 @@ importers: specifier: ^4.2.18 version: 4.2.18 tar: - specifier: ^7.2.0 - version: 7.2.0 + specifier: ^7.4.0 + version: 7.4.0 devDependencies: '@octokit/action': specifier: ^7.0.0 @@ -5956,8 +5956,8 @@ packages: '@astrojs/compiler@1.8.2': resolution: {integrity: sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw==} - '@astrojs/compiler@2.8.0': - resolution: {integrity: sha512-yrpD1WRGqsJwANaDIdtHo+YVjvIOFAjC83lu5qENIgrafwZcJgSXDuwVMXOgok4tFzpeKLsFQ6c3FoUdloLWBQ==} + '@astrojs/compiler@2.8.1': + resolution: {integrity: sha512-NGfPAgU/9rvDEwsXu82RI1AxiivaxtEYBK9saW1f+2fTHUUqCJQ27HYtb2akG2QxCmFikgZ9zk26BEWgiHho1Q==} '@astrojs/language-server@2.10.0': resolution: {integrity: sha512-crHXpqYfA5qWioiuZnZFpTsNItgBlF1f0S9MzDYS7/pfCALkHNJ7K3w9U/j0uMKymsT4hC7BfMaX0DYlfdSzHg==} @@ -6237,8 +6237,8 @@ packages: '@changesets/changelog-github@0.5.0': resolution: {integrity: sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==} - '@changesets/cli@2.27.5': - resolution: {integrity: sha512-UVppOvzCjjylBenFcwcZNG5IaZ8jsIaEVraV/pbXgukYNb0Oqa0d8UWb0LkYzA1Bf1HmUrOfccFcRLheRuA7pA==} + '@changesets/cli@2.27.6': + resolution: {integrity: sha512-PB7KS5JkCQ4WSXlnfThn8CXAHVwYxFdZvYTimhi12fls/tzj9iimUhKsYwkrKSbw1AiVlGCZtihj5Wkt6siIjA==} hasBin: true '@changesets/config@3.0.1': @@ -7201,8 +7201,8 @@ packages: cpu: [x64] os: [win32] - '@shikijs/core@1.6.5': - resolution: {integrity: sha512-XcQYt6e4L61ruAxHiL3Xg1DL/XkWWjzDdeckB/DtN8jAxoAU+bcxsV6DetC8NafHpL4YpGhxy9iXF0ND/u6HmA==} + '@shikijs/core@1.9.1': + resolution: {integrity: sha512-EmUful2MQtY8KgCF1OkBtOuMcvaZEvmdubhW0UHCGXi21O9dRLeADVCj+k6ZS+de7Mz9d2qixOXJ+GLhcK3pXg==} '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -7211,8 +7211,8 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} - '@solidjs/router@0.13.5': - resolution: {integrity: sha512-I/bR5ZHCz2Dx80qL+6uGwSdclqXRqoT49SJ5cvLbOuT3HnYysSIxSfULCTWUMLFVcgPh5GrdHV6KwEoyrbPZZA==} + '@solidjs/router@0.13.6': + resolution: {integrity: sha512-CdpFsBYoiJ/FQ4wZIamj3KEFRkmrYu5sVXM6PouNkmSENta1YJamsm9wa/VjaPmkw2RsnDnO0UvZ705v6EgOXQ==} peerDependencies: solid-js: ^1.8.6 @@ -7358,9 +7358,6 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -7385,9 +7382,6 @@ packages: '@types/node@20.12.7': resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/prismjs@1.26.4': resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==} @@ -7469,8 +7463,8 @@ packages: '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@typescript-eslint/eslint-plugin@7.13.0': - resolution: {integrity: sha512-FX1X6AF0w8MdVFLSdqwqN/me2hyhuQg4ykN6ZpVhh1ij/80pTvDKclX1sZB9iqex8SjQfVhwMKs3JtnnMLzG9w==} + '@typescript-eslint/eslint-plugin@7.14.1': + resolution: {integrity: sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -7480,8 +7474,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.13.0': - resolution: {integrity: sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA==} + '@typescript-eslint/parser@7.14.1': + resolution: {integrity: sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -7490,12 +7484,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.13.0': - resolution: {integrity: sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==} + '@typescript-eslint/scope-manager@7.14.1': + resolution: {integrity: sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.13.0': - resolution: {integrity: sha512-xMEtMzxq9eRkZy48XuxlBFzpVMDurUAfDu5Rz16GouAtXm0TaAoTFzqWUFPPuQYXI/CDaH/Bgx/fk/84t/Bc9A==} + '@typescript-eslint/type-utils@7.14.1': + resolution: {integrity: sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -7504,12 +7498,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.13.0': - resolution: {integrity: sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==} + '@typescript-eslint/types@7.14.1': + resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.13.0': - resolution: {integrity: sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==} + '@typescript-eslint/typescript-estree@7.14.1': + resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -7517,14 +7511,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.13.0': - resolution: {integrity: sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==} + '@typescript-eslint/utils@7.14.1': + resolution: {integrity: sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.13.0': - resolution: {integrity: sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==} + '@typescript-eslint/visitor-keys@7.14.1': + resolution: {integrity: sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==} engines: {node: ^18.18.0 || >=20.0.0} '@typescript/twoslash@3.1.0': @@ -7644,42 +7638,48 @@ packages: '@vue/compiler-core@3.4.29': resolution: {integrity: sha512-TFKiRkKKsRCKvg/jTSSKK7mYLJEQdUiUfykbG49rubC9SfDyvT2JrzTReopWlz2MxqeLyxh9UZhvxEIBgAhtrg==} + '@vue/compiler-core@3.4.30': + resolution: {integrity: sha512-ZL8y4Xxdh8O6PSwfdZ1IpQ24PjTAieOz3jXb/MDTfDtANcKBMxg1KLm6OX2jofsaQGYfIVzd3BAG22i56/cF1w==} + '@vue/compiler-dom@3.4.29': resolution: {integrity: sha512-A6+iZ2fKIEGnfPJejdB7b1FlJzgiD+Y/sxxKwJWg1EbJu6ZPgzaPQQ51ESGNv0CP6jm6Z7/pO6Ia8Ze6IKrX7w==} - '@vue/compiler-sfc@3.4.29': - resolution: {integrity: sha512-zygDcEtn8ZimDlrEQyLUovoWgKQic6aEQqRXce2WXBvSeHbEbcAsXyCk9oG33ZkyWH4sl9D3tkYc1idoOkdqZQ==} + '@vue/compiler-dom@3.4.30': + resolution: {integrity: sha512-+16Sd8lYr5j/owCbr9dowcNfrHd+pz+w2/b5Lt26Oz/kB90C9yNbxQ3bYOvt7rI2bxk0nqda39hVcwDFw85c2Q==} - '@vue/compiler-ssr@3.4.29': - resolution: {integrity: sha512-rFbwCmxJ16tDp3N8XCx5xSQzjhidYjXllvEcqX/lopkoznlNPz3jyy0WGJCyhAaVQK677WWFt3YO/WUEkMMUFQ==} + '@vue/compiler-sfc@3.4.30': + resolution: {integrity: sha512-8vElKklHn/UY8+FgUFlQrYAPbtiSB2zcgeRKW7HkpSRn/JjMRmZvuOtwDx036D1aqKNSTtXkWRfqx53Qb+HmMg==} - '@vue/devtools-core@7.3.0': - resolution: {integrity: sha512-J5nmaYadJvDgH9zsQI9vSLlWjfZn/TdKWEKMcc9xjbF3OvdhQwRrojvFax1G+WPoQ/X67EZKeUVY/ovCCyLo7A==} + '@vue/compiler-ssr@3.4.30': + resolution: {integrity: sha512-ZJ56YZGXJDd6jky4mmM0rNaNP6kIbQu9LTKZDhcpddGe/3QIalB1WHHmZ6iZfFNyj5mSypTa4+qDJa5VIuxMSg==} - '@vue/devtools-kit@7.3.0': - resolution: {integrity: sha512-J9C+ue3Ka8cumQY/hMsNTcbb1tczqVBBXFMw4isa5YvPjyIBgEtJBfDSUVIK3nE+YWk7UNliUuCcE1GHEKaGcw==} + '@vue/devtools-core@7.3.4': + resolution: {integrity: sha512-HiaskdszC1ajYhZkglBzc4BBb4OHAhYonoOaQMx62ZId++ezpd4n0CbM9SXYp8o1JhxImSdueKgJgtyvhm4vAA==} peerDependencies: vue: ^3.0.0 - '@vue/devtools-shared@7.3.0': - resolution: {integrity: sha512-bYw4BtZclxzVrYBeYYHzNOcLlvVZbe9tutwtrixTtdgynHvuSJa5KI2MqWiumpGYm2feFI5sHlC8Vt61v4z18g==} + '@vue/devtools-kit@7.3.4': + resolution: {integrity: sha512-DalQZWaFLRyA4qfKT0WT7e+q2AwvYoTwd0pWqswHqcpviXw+oU6FlSJHMrEACB3lBHjN1KBS9Kh527sWIe1vcg==} + + '@vue/devtools-shared@7.3.4': + resolution: {integrity: sha512-5S5cHh7oWLZdboujnLteR3rT8UGfKHfA34aGLyFRB/B5TqBxmeLW1Rq32xW6TCDEy4isoYsYHGwJVp6DQcpiDA==} '@vue/reactivity@3.1.5': resolution: {integrity: sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==} - '@vue/reactivity@3.4.29': - resolution: {integrity: sha512-w8+KV+mb1a8ornnGQitnMdLfE0kXmteaxLdccm2XwdFxXst4q/Z7SEboCV5SqJNpZbKFeaRBBJBhW24aJyGINg==} + '@vue/reactivity@3.4.30': + resolution: {integrity: sha512-bVJurnCe3LS0JII8PPoAA63Zd2MBzcKrEzwdQl92eHCcxtIbxD2fhNwJpa+KkM3Y/A4T5FUnmdhgKwOf6BfbcA==} - '@vue/runtime-core@3.4.29': - resolution: {integrity: sha512-s8fmX3YVR/Rk5ig0ic0NuzTNjK2M7iLuVSZyMmCzN/+Mjuqqif1JasCtEtmtoJWF32pAtUjyuT2ljNKNLeOmnQ==} + '@vue/runtime-core@3.4.30': + resolution: {integrity: sha512-qaFEbnNpGz+tlnkaualomogzN8vBLkgzK55uuWjYXbYn039eOBZrWxyXWq/7qh9Bz2FPifZqGjVDl/FXiq9L2g==} - '@vue/runtime-dom@3.4.29': - resolution: {integrity: sha512-gI10atCrtOLf/2MPPMM+dpz3NGulo9ZZR9d1dWo4fYvm+xkfvRrw1ZmJ7mkWtiJVXSsdmPbcK1p5dZzOCKDN0g==} + '@vue/runtime-dom@3.4.30': + resolution: {integrity: sha512-tV6B4YiZRj5QsaJgw2THCy5C1H+2UeywO9tqgWEc21tn85qHEERndHN/CxlyXvSBFrpmlexCIdnqPuR9RM9thw==} - '@vue/server-renderer@3.4.29': - resolution: {integrity: sha512-HMLCmPI2j/k8PVkSBysrA2RxcxC5DgBiCdj7n7H2QtR8bQQPqKAe8qoaxLcInzouBmzwJ+J0x20ygN/B5mYBng==} + '@vue/server-renderer@3.4.30': + resolution: {integrity: sha512-TBD3eqR1DeDc0cMrXS/vEs/PWzq1uXxnvjoqQuDGFIEHFIwuDTX/KWAQKIBjyMWLFHEeTDGYVsYci85z2UbTDg==} peerDependencies: - vue: 3.4.29 + vue: 3.4.30 '@vue/shared@3.1.5': resolution: {integrity: sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==} @@ -7687,6 +7687,9 @@ packages: '@vue/shared@3.4.29': resolution: {integrity: sha512-hQ2gAQcBO/CDpC82DCrinJNgOHI2v+FA7BDW4lMSPeBpQ7sRe2OLHWe5cph1s7D8DUQAwRt18dBDfJJ220APEA==} + '@vue/shared@3.4.30': + resolution: {integrity: sha512-CLg+f8RQCHQnKvuHY9adMsMaQOcqclh6Z5V9TaoMgy0ut0tz848joZ7/CYFFyF/yZ5i2yaw7Fn498C+CNZVHIg==} + '@webcomponents/template-shadowroot@0.2.1': resolution: {integrity: sha512-fXL/vIUakyZL62hyvUh+EMwbVoTc0hksublmRz6ai6et8znHkJa6gtqMUZo1oc7dIz46exHSIImml9QTdknMHg==} @@ -7731,8 +7734,8 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - alpinejs@3.14.0: - resolution: {integrity: sha512-YCWF95PMJqePe9ll6KMyDt/nLhh2R7RhqBf4loEmLzIskcHque4Br/9UgAa6cw13H0Cm3FM9e1hzDwP5z5wlDA==} + alpinejs@3.14.1: + resolution: {integrity: sha512-ICar8UsnRZAYvv/fCNfNeKMXNoXGUfwHrjx7LqXd08zIP95G2d9bAOuaL97re+1mgt/HojqHsfdOLo/A5LuWgQ==} ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -7796,10 +7799,6 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -7810,18 +7809,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} @@ -7865,10 +7852,6 @@ packages: peerDependencies: postcss: ^8.1.0 - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} @@ -7943,9 +7926,6 @@ packages: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} - breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -7981,14 +7961,6 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} @@ -8097,17 +8069,10 @@ packages: resolution: {integrity: sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==} engines: {node: 10.* || >= 12.*} - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -8281,19 +8246,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - - csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - - csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - - csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} - data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -8302,18 +8254,6 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} @@ -8334,14 +8274,6 @@ packages: supports-color: optional: true - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -8373,9 +8305,6 @@ packages: resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} engines: {node: '>=18'} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -8384,10 +8313,6 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -8610,16 +8535,9 @@ packages: eol@0.9.1: resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - error-stack-parser-es@0.1.1: resolution: {integrity: sha512-g/9rfnvnagiNf+DRMHEVGuGuIBlCIMDFoTA616HaP2l9PlCjGjVhD98PNbVSJvmK4TttqT5mV5tInMhoFgi+aA==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -8628,23 +8546,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.5.3: - resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} esbuild-plugin-copy@2.1.1: resolution: {integrity: sha512-Bk66jpevTcV8KMFzZI1P7MZKZ+uDcrZm2G2egZ2jNIvVnivDpodZI+/KnpL3Jnap0PBdIHU7HwFGB8r+vV5CVw==} @@ -8846,9 +8749,6 @@ packages: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -8908,13 +8808,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} @@ -8943,10 +8836,6 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - giget@1.2.3: resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} hasBin: true @@ -8979,10 +8868,6 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} @@ -9007,9 +8892,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -9017,16 +8899,9 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - has-async-hooks@1.0.0: resolution: {integrity: sha512-YF0VPGjkxr7AyyQQNykX8zK4PvtEDsUJAPqwu06UFz1lb6EvI53sPh5H1kWxg8NXI5LsfRCZ8uX9NkYDZBb/mw==} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -9046,10 +8921,6 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} @@ -9122,9 +8993,6 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -9218,10 +9086,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - indent-string@5.0.0: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} @@ -9239,10 +9103,6 @@ packages: inline-style-parser@0.2.3: resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -9253,42 +9113,16 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -9329,14 +9163,6 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -9353,10 +9179,6 @@ packages: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -9367,34 +9189,14 @@ packages: is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} @@ -9403,9 +9205,6 @@ packages: resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} engines: {node: '>=18'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -9418,9 +9217,6 @@ packages: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -9470,9 +9266,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -9644,14 +9437,6 @@ packages: manage-path@2.0.0: resolution: {integrity: sha512-NJhyB+PJYTpxhxZJ3lecIGgh4kwIY2RAh44XvAz9UlqthlQwtPBf62uBVR8XaD8CRuSjQ6TnZH2lNJkbLPZM2A==} - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -9748,10 +9533,6 @@ packages: resolution: {integrity: sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==} engines: {node: '>= 4.0.0'} - meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} - merge-anything@5.1.7: resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} engines: {node: '>=12.13'} @@ -9909,10 +9690,6 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -9924,10 +9701,6 @@ packages: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -9943,6 +9716,10 @@ packages: resolution: {integrity: sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==} engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -9954,10 +9731,6 @@ packages: mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} - mj-context-menu@0.6.1: resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} @@ -10059,8 +9832,8 @@ packages: node-html-parser@6.1.13: resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} - node-mocks-http@1.14.1: - resolution: {integrity: sha512-mfXuCGonz0A7uG1FEjnypjm34xegeN5+HI6xeGhYKecfgaZhjsmYoLE9LEFmT+53G1n8IuagPZmVnEL/xNsFaA==} + node-mocks-http@1.15.0: + resolution: {integrity: sha512-3orGBAxXrnwz3ixU8AZpa0x8srAvVSHvbWanAqd5F0zVCVA2QstxaVcTSarFcjz4+pFSnR1zm28MsV83s/BtmA==} engines: {node: '>=14'} node-releases@2.0.14: @@ -10071,9 +9844,6 @@ packages: engines: {node: '>=6'} hasBin: true - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -10112,14 +9882,6 @@ packages: object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - ohash@1.1.3: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} @@ -10229,10 +9991,6 @@ packages: parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} @@ -10346,10 +10104,6 @@ packages: port-authority@2.0.1: resolution: {integrity: sha512-Hz/WvSNt5+7x+Rq1Cn6DetJOZxKtLDehJ1mLCYge6ju4QvSF/PHvRgy94e1SKJVI96AJTcqEdNwkkaAFad+TXQ==} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - postcss-attribute-case-insensitive@6.0.3: resolution: {integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==} engines: {node: ^14 || ^16 || >=18} @@ -10633,10 +10387,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -10673,14 +10423,6 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -10696,10 +10438,6 @@ packages: reading-time@1.5.0: resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - refa@0.12.1: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -10714,10 +10452,6 @@ packages: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - rehype-autolink-headings@7.1.0: resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} @@ -10803,9 +10537,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -10844,8 +10575,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} @@ -10875,25 +10606,17 @@ packages: s.color@0.0.15: resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} sass-formatter@0.7.9: resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} - sass@1.77.5: - resolution: {integrity: sha512-oDfX1mukIlxacPdQqNb6mV2tVCrnE+P3nVYioy72V5tlk56CPNcO4TCuFcaCRKKfJ1M3lH95CleRS+dVKL2qMg==} + sass@1.77.6: + resolution: {integrity: sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==} engines: {node: '>=14.0.0'} hasBin: true @@ -10965,10 +10688,6 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -11000,8 +10719,8 @@ packages: shiki@0.10.1: resolution: {integrity: sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==} - shiki@1.6.5: - resolution: {integrity: sha512-iFzypldJG0zeyRHKAhaSGCf+YWXpMMyUyOrCVFBFKGGdF5vrB6jbd66/SQljxV20aSrVZEAQwUto/hhuNi/CIg==} + shiki@1.9.1: + resolution: {integrity: sha512-8PDkgb5ja3nfujTjvC4VytL6wGOGCtFAClUb2r3QROevYXxcq+/shVJK5s6gy0HZnjaJgFxd6BpPqpRfqne5rA==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -11058,11 +10777,6 @@ packages: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} - smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true - smartypants@0.2.2: resolution: {integrity: sha512-TzobUYoEft/xBtb2voRPryAUIvYguG0V7Tt3de79I1WfXgCwelqVsGuZSnu3GFGRZhXR90AeEYIM+icuB/S06Q==} hasBin: true @@ -11093,18 +10807,6 @@ packages: spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} @@ -11140,9 +10842,6 @@ packages: stream-replace-string@2.0.0: resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} - stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -11155,17 +10854,6 @@ packages: resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} engines: {node: '>=18'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -11196,10 +10884,6 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -11261,8 +10945,8 @@ packages: peerDependencies: svelte: ^3.19.0 || ^4.0.0 - svelte2tsx@0.7.9: - resolution: {integrity: sha512-Rm+0LAwg9wT4H2IsR8EaM9EWErTzi9LmuZKxkH5b1ua94XjQmwHstBP4VabLgA9AE6XmwBg+xK7Cjzwfm6ustQ==} + svelte2tsx@0.7.12: + resolution: {integrity: sha512-LFPsKxxUi+q2QCBI0TBm2m1MDPXp6mN0w0bldauwkZ+3tcvo1S6On3RQdOKe1C2vWRZKyfenj4Nu5Vb0YKagKw==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 @@ -11295,8 +10979,8 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - tar@7.2.0: - resolution: {integrity: sha512-hctwP0Nb4AB60bj8WQgRYaMOuJYRAPMGiQUAotms5igN8ppfQM+IvjQ5HcKu1MaZh2Wy2KWVTe563Yj8dfc14w==} + tar@7.4.0: + resolution: {integrity: sha512-XQs0S8fuAkQWuqhDeCdMlJXDX80D7EOVLDPVFkna9yQfzS+PHKgfxcei0jf6/+QAWcjqrnC8uM3fSAnrQl+XYg==} engines: {node: '>=18'} term-size@2.2.1: @@ -11381,10 +11065,6 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -11422,11 +11102,6 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true - turbo-darwin-64@1.13.4: resolution: {integrity: sha512-A0eKd73R7CGnRinTiS7txkMElg+R5rKFp9HV7baDiEL4xTG1FIg/56Vm7A5RVgg8UNgG2qNnrfatJtb+dRmNdw==} cpu: [x64] @@ -11469,18 +11144,6 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -11497,22 +11160,6 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - types-react-dom@19.0.0-alpha.3: resolution: {integrity: sha512-foCg3VSAoTLKBpU6FKgtHjOzqZVo7UVXfG/JnKM8imXq/+TvSGebj+KJlAVG6H1n+hiQtqpjHc+hk5FmZOJCqw==} @@ -11525,8 +11172,8 @@ packages: typescript-auto-import-cache@0.3.2: resolution: {integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==} - typescript-eslint@7.13.0: - resolution: {integrity: sha512-upO0AXxyBwJ4BbiC6CRgAJKtGYha2zw4m1g7TIVPSonwYEuf7vCicw3syjS1OxdDMTz96sZIXl3Jx3vWJLLKFw==} + typescript-eslint@7.14.1: + resolution: {integrity: sha512-Eo1X+Y0JgGPspcANKjeR6nIqXl4VL5ldXLc15k4m9upq+eY5fhU2IueiEZL6jmHrKH8aCfbIvM/v3IrX5Hg99w==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -11535,8 +11182,8 @@ packages: typescript: optional: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@5.5.2: + resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} engines: {node: '>=14.17'} hasBin: true @@ -11554,9 +11201,6 @@ packages: ultrahtml@1.5.3: resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -11571,6 +11215,9 @@ packages: unified@11.0.4: resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} @@ -11673,9 +11320,6 @@ packages: validate-html-nesting@1.2.2: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -11719,8 +11363,8 @@ packages: '@testing-library/jest-dom': optional: true - vite-plugin-vue-devtools@7.3.0: - resolution: {integrity: sha512-XnxQzTloGkQUTpsRdWVsEBzyh9F6i8NBmuPo8lotx4lSUnWYJ+jUlXvfftzmOf14hFgsTOySLJCr9nhaqOzgOA==} + vite-plugin-vue-devtools@7.3.4: + resolution: {integrity: sha512-5WKGIFldO9/E/J6d+x286ENieFUsexcg8Qgh/js3rEJtzipHzxiD47xMJVSBhl14n1E4jABIMuwmn1FYtpwm3w==} engines: {node: '>=v14.21.3'} peerDependencies: vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 @@ -11888,8 +11532,8 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - vue@3.4.29: - resolution: {integrity: sha512-8QUYfRcYzNlYuzKPfge1UWC6nF9ym0lx7mpGVPJYNhddxEf3DD0+kU07NTL0sXuiT2HuJuKr/iEO8WvXvT0RSQ==} + vue@3.4.30: + resolution: {integrity: sha512-NcxtKCwkdf1zPsr7Y8+QlDBCGqxvjLXF2EX+yi76rV5rrz90Y6gK1cq0olIhdWGgrlhs9ElHuhi9t3+W5sG5Xw==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -11900,9 +11544,6 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -11913,8 +11554,8 @@ packages: web-vitals@3.5.2: resolution: {integrity: sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==} - web-vitals@4.1.1: - resolution: {integrity: sha512-wW3cdBZ56Rc5Az8p1Pw6g1zHU7X8HPLigQjD5Z0ef3EG9SPo4iO7RxsiU87aH3xaaEw0if6Ven2s+zlNGiXYqw==} + web-vitals@4.2.0: + resolution: {integrity: sha512-ohj72kbtVWCpKYMxcbJ+xaOBV3En76hW47j52dG+tEGG36LZQgfFw5yHl9xyjmosy3XUMn8d/GBUAy4YPM839w==} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -11938,12 +11579,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-pm-runs@1.1.0: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} @@ -11956,10 +11591,6 @@ packages: resolution: {integrity: sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw==} engines: {node: '>=8.15'} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -11984,10 +11615,6 @@ packages: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -12030,9 +11657,6 @@ packages: resolution: {integrity: sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==} engines: {node: '>=0.1'} - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -12055,18 +11679,10 @@ packages: engines: {node: '>= 14'} hasBin: true - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -12079,8 +11695,8 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} - zod-to-json-schema@3.23.0: - resolution: {integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==} + zod-to-json-schema@3.23.1: + resolution: {integrity: sha512-oT9INvydob1XV0v1d2IadrR74rLtDInLvDFfAa1CG0Pmg/vxATk7I2gSelfj271mbzeM4Da0uuDQE/Nkj3DWNw==} peerDependencies: zod: ^3.23.3 @@ -12145,13 +11761,13 @@ snapshots: astro: link:packages/astro lite-youtube-embed: 0.3.2 - '@astrojs/check@0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.4.5)': + '@astrojs/check@0.7.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.5.2)': dependencies: - '@astrojs/language-server': 2.10.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.4.5) + '@astrojs/language-server': 2.10.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.5.2) chokidar: 3.6.0 fast-glob: 3.3.2 kleur: 4.1.5 - typescript: 5.4.5 + typescript: 5.5.2 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -12165,13 +11781,13 @@ snapshots: '@astrojs/compiler@1.8.2': {} - '@astrojs/compiler@2.8.0': {} + '@astrojs/compiler@2.8.1': {} - '@astrojs/language-server@2.10.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.4.5)': + '@astrojs/language-server@2.10.0(prettier-plugin-astro@0.14.0)(prettier@3.3.2)(typescript@5.5.2)': dependencies: - '@astrojs/compiler': 2.8.0 + '@astrojs/compiler': 2.8.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@volar/kit': 2.2.5(typescript@5.4.5) + '@volar/kit': 2.2.5(typescript@5.5.2) '@volar/language-core': 2.2.5 '@volar/language-server': 2.2.5 '@volar/language-service': 2.2.5 @@ -12532,7 +12148,7 @@ snapshots: transitivePeerDependencies: - encoding - '@changesets/cli@2.27.5': + '@changesets/cli@2.27.6': dependencies: '@babel/runtime': 7.24.4 '@changesets/apply-release-plan': 7.0.3 @@ -12558,7 +12174,7 @@ snapshots: external-editor: 3.1.0 fs-extra: 7.0.1 human-id: 1.0.2 - meow: 6.1.1 + mri: 1.2.0 outdent: 0.5.0 p-limit: 2.3.0 preferred-pm: 3.1.3 @@ -12566,7 +12182,6 @@ snapshots: semver: 7.6.2 spawndamnit: 2.0.0 term-size: 2.2.1 - tty-table: 4.2.3 '@changesets/config@3.0.1': dependencies: @@ -13133,7 +12748,7 @@ snapshots: '@isaacs/fs-minipass@4.0.1': dependencies: - minipass: 7.1.0 + minipass: 7.1.2 '@jest/schemas@29.6.3': dependencies: @@ -13319,7 +12934,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.0 source-map: 0.7.4 - unified: 11.0.4 + unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 unist-util-visit: 5.0.0 @@ -13423,12 +13038,12 @@ snapshots: '@polka/url@1.0.0-next.25': {} - '@preact/preset-vite@2.8.2(@babel/core@7.24.7)(preact@10.22.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))': + '@preact/preset-vite@2.8.2(@babel/core@7.24.7)(preact@10.22.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.24.7) - '@prefresh/vite': 2.4.5(preact@10.22.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + '@prefresh/vite': 2.4.5(preact@10.22.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.7) debug: 4.3.5 @@ -13438,7 +13053,7 @@ snapshots: resolve: 1.22.8 source-map: 0.7.4 stack-trace: 1.0.0-pre2 - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) transitivePeerDependencies: - preact - supports-color @@ -13458,7 +13073,7 @@ snapshots: '@prefresh/utils@1.2.0': {} - '@prefresh/vite@2.4.5(preact@10.22.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))': + '@prefresh/vite@2.4.5(preact@10.22.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))': dependencies: '@babel/core': 7.24.7 '@prefresh/babel-plugin': 0.5.1 @@ -13466,7 +13081,7 @@ snapshots: '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 preact: 10.22.0 - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) transitivePeerDependencies: - supports-color @@ -13531,36 +13146,36 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true - '@shikijs/core@1.6.5': {} + '@shikijs/core@1.9.1': {} '@sinclair/typebox@0.27.8': {} '@sindresorhus/merge-streams@2.3.0': {} - '@solidjs/router@0.13.5(solid-js@1.8.17)': + '@solidjs/router@0.13.6(solid-js@1.8.17)': dependencies: solid-js: 1.8.17 - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)))(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)))(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) debug: 4.3.5 svelte: 4.2.18 - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))': + '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)))(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)))(svelte@4.2.18)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) debug: 4.3.5 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.10 svelte: 4.2.18 svelte-hmr: 0.16.0(svelte@4.2.18) - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) - vitefu: 0.2.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) + vitefu: 0.2.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) transitivePeerDependencies: - supports-color @@ -13705,8 +13320,6 @@ snapshots: '@types/mime@1.3.5': {} - '@types/minimist@1.2.5': {} - '@types/ms@0.7.34': {} '@types/needle@3.3.0': @@ -13731,8 +13344,6 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/normalize-package-data@2.4.4': {} - '@types/prismjs@1.26.4': {} '@types/probe-image-size@7.2.4': @@ -13817,85 +13428,85 @@ snapshots: '@types/yargs-parser@21.0.3': {} - '@typescript-eslint/eslint-plugin@7.13.0(@typescript-eslint/parser@7.13.0(eslint@9.5.0)(typescript@5.4.5))(eslint@9.5.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.13.0(eslint@9.5.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.13.0 - '@typescript-eslint/type-utils': 7.13.0(eslint@9.5.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.13.0(eslint@9.5.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.13.0 + '@typescript-eslint/parser': 7.14.1(eslint@9.5.0)(typescript@5.5.2) + '@typescript-eslint/scope-manager': 7.14.1 + '@typescript-eslint/type-utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) + '@typescript-eslint/utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 7.14.1 eslint: 9.5.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.13.0(eslint@9.5.0)(typescript@5.4.5)': + '@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.2)': dependencies: - '@typescript-eslint/scope-manager': 7.13.0 - '@typescript-eslint/types': 7.13.0 - '@typescript-eslint/typescript-estree': 7.13.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.13.0 + '@typescript-eslint/scope-manager': 7.14.1 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 7.14.1 debug: 4.3.5 eslint: 9.5.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.13.0': + '@typescript-eslint/scope-manager@7.14.1': dependencies: - '@typescript-eslint/types': 7.13.0 - '@typescript-eslint/visitor-keys': 7.13.0 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/visitor-keys': 7.14.1 - '@typescript-eslint/type-utils@7.13.0(eslint@9.5.0)(typescript@5.4.5)': + '@typescript-eslint/type-utils@7.14.1(eslint@9.5.0)(typescript@5.5.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.13.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.13.0(eslint@9.5.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) + '@typescript-eslint/utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) debug: 4.3.5 eslint: 9.5.0 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.13.0': {} + '@typescript-eslint/types@7.14.1': {} - '@typescript-eslint/typescript-estree@7.13.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@7.14.1(typescript@5.5.2)': dependencies: - '@typescript-eslint/types': 7.13.0 - '@typescript-eslint/visitor-keys': 7.13.0 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/visitor-keys': 7.14.1 debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.13.0(eslint@9.5.0)(typescript@5.4.5)': + '@typescript-eslint/utils@7.14.1(eslint@9.5.0)(typescript@5.5.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) - '@typescript-eslint/scope-manager': 7.13.0 - '@typescript-eslint/types': 7.13.0 - '@typescript-eslint/typescript-estree': 7.13.0(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.14.1 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) eslint: 9.5.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.13.0': + '@typescript-eslint/visitor-keys@7.14.1': dependencies: - '@typescript-eslint/types': 7.13.0 + '@typescript-eslint/types': 7.14.1 eslint-visitor-keys: 3.4.3 '@typescript/twoslash@3.1.0': @@ -13946,31 +13557,31 @@ snapshots: - encoding - supports-color - '@vitejs/plugin-react@4.3.1(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))': + '@vitejs/plugin-react@4.3.1(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.0.0(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))(vue@3.4.29(typescript@5.4.5))': + '@vitejs/plugin-vue-jsx@4.0.0(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))(vue@3.4.30(typescript@5.5.2))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.24.7) '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.7) - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) - vue: 3.4.29(typescript@5.4.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) + vue: 3.4.30(typescript@5.5.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.0.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))(vue@3.4.29(typescript@5.4.5))': + '@vitejs/plugin-vue@5.0.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))(vue@3.4.30(typescript@5.5.2))': dependencies: - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) - vue: 3.4.29(typescript@5.4.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) + vue: 3.4.30(typescript@5.5.2) '@vitest/expect@1.6.0': dependencies: @@ -14001,12 +13612,12 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 - '@volar/kit@2.2.5(typescript@5.4.5)': + '@volar/kit@2.2.5(typescript@5.5.2)': dependencies: '@volar/language-service': 2.2.5 '@volar/typescript': 2.2.5 typesafe-path: 0.2.2 - typescript: 5.4.5 + typescript: 5.5.2 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 @@ -14088,7 +13699,7 @@ snapshots: '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.24.7 '@babel/parser': 7.24.7 - '@vue/compiler-sfc': 3.4.29 + '@vue/compiler-sfc': 3.4.30 '@vue/compiler-core@3.4.29': dependencies: @@ -14098,85 +13709,99 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.0 + '@vue/compiler-core@3.4.30': + dependencies: + '@babel/parser': 7.24.7 + '@vue/shared': 3.4.30 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + '@vue/compiler-dom@3.4.29': dependencies: '@vue/compiler-core': 3.4.29 '@vue/shared': 3.4.29 - '@vue/compiler-sfc@3.4.29': + '@vue/compiler-dom@3.4.30': + dependencies: + '@vue/compiler-core': 3.4.30 + '@vue/shared': 3.4.30 + + '@vue/compiler-sfc@3.4.30': dependencies: '@babel/parser': 7.24.7 - '@vue/compiler-core': 3.4.29 - '@vue/compiler-dom': 3.4.29 - '@vue/compiler-ssr': 3.4.29 - '@vue/shared': 3.4.29 + '@vue/compiler-core': 3.4.30 + '@vue/compiler-dom': 3.4.30 + '@vue/compiler-ssr': 3.4.30 + '@vue/shared': 3.4.30 estree-walker: 2.0.2 magic-string: 0.30.10 postcss: 8.4.38 source-map-js: 1.2.0 - '@vue/compiler-ssr@3.4.29': + '@vue/compiler-ssr@3.4.30': dependencies: - '@vue/compiler-dom': 3.4.29 - '@vue/shared': 3.4.29 + '@vue/compiler-dom': 3.4.30 + '@vue/shared': 3.4.30 - '@vue/devtools-core@7.3.0(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))(vue@3.4.29(typescript@5.4.5))': + '@vue/devtools-core@7.3.4(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))(vue@3.4.30(typescript@5.5.2))': dependencies: - '@vue/devtools-kit': 7.3.0(vue@3.4.29(typescript@5.4.5)) - '@vue/devtools-shared': 7.3.0 + '@vue/devtools-kit': 7.3.4 + '@vue/devtools-shared': 7.3.4 mitt: 3.0.1 nanoid: 3.3.7 pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + vite-hot-client: 0.2.3(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) + vue: 3.4.30(typescript@5.5.2) transitivePeerDependencies: - vite - - vue - '@vue/devtools-kit@7.3.0(vue@3.4.29(typescript@5.4.5))': + '@vue/devtools-kit@7.3.4': dependencies: - '@vue/devtools-shared': 7.3.0 + '@vue/devtools-shared': 7.3.4 birpc: 0.2.17 hookable: 5.5.3 mitt: 3.0.1 perfect-debounce: 1.0.0 speakingurl: 14.0.1 superjson: 2.2.1 - vue: 3.4.29(typescript@5.4.5) - '@vue/devtools-shared@7.3.0': + '@vue/devtools-shared@7.3.4': dependencies: - rfdc: 1.3.1 + rfdc: 1.4.1 '@vue/reactivity@3.1.5': dependencies: '@vue/shared': 3.1.5 - '@vue/reactivity@3.4.29': + '@vue/reactivity@3.4.30': dependencies: - '@vue/shared': 3.4.29 + '@vue/shared': 3.4.30 - '@vue/runtime-core@3.4.29': + '@vue/runtime-core@3.4.30': dependencies: - '@vue/reactivity': 3.4.29 - '@vue/shared': 3.4.29 + '@vue/reactivity': 3.4.30 + '@vue/shared': 3.4.30 - '@vue/runtime-dom@3.4.29': + '@vue/runtime-dom@3.4.30': dependencies: - '@vue/reactivity': 3.4.29 - '@vue/runtime-core': 3.4.29 - '@vue/shared': 3.4.29 + '@vue/reactivity': 3.4.30 + '@vue/runtime-core': 3.4.30 + '@vue/shared': 3.4.30 csstype: 3.1.3 - '@vue/server-renderer@3.4.29(vue@3.4.29(typescript@5.4.5))': + '@vue/server-renderer@3.4.30(vue@3.4.30(typescript@5.5.2))': dependencies: - '@vue/compiler-ssr': 3.4.29 - '@vue/shared': 3.4.29 - vue: 3.4.29(typescript@5.4.5) + '@vue/compiler-ssr': 3.4.30 + '@vue/shared': 3.4.30 + vue: 3.4.30(typescript@5.5.2) '@vue/shared@3.1.5': {} '@vue/shared@3.4.29': {} + '@vue/shared@3.4.30': {} + '@webcomponents/template-shadowroot@0.2.1': {} abbrev@1.1.1: {} @@ -14222,7 +13847,7 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - alpinejs@3.14.0: + alpinejs@3.14.1: dependencies: '@vue/reactivity': 3.1.5 @@ -14278,37 +13903,12 @@ snapshots: dependencies: dequal: 2.0.3 - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - array-flatten@1.1.1: {} array-iterate@2.0.1: {} array-union@2.1.0: {} - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - arrify@1.0.1: {} - assertion-error@1.1.0: {} astring@1.8.6: {} @@ -14378,10 +13978,6 @@ snapshots: postcss: 8.4.38 postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - axobject-query@4.0.0: dependencies: dequal: 2.0.3 @@ -14475,10 +14071,6 @@ snapshots: dependencies: fill-range: 7.0.1 - breakword@1.0.6: - dependencies: - wcwidth: 1.0.1 - browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001610 @@ -14516,14 +14108,6 @@ snapshots: camelcase-css@2.0.1: {} - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - - camelcase@5.3.1: {} - camelcase@6.3.0: {} camelcase@7.0.1: {} @@ -14638,19 +14222,11 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 - cliui@6.0.0: + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone@1.0.4: {} + wrap-ansi: 7.0.0 clsx@2.1.1: {} @@ -14802,19 +14378,6 @@ snapshots: csstype@3.1.3: {} - csv-generate@3.4.3: {} - - csv-parse@4.16.3: {} - - csv-stringify@5.6.5: {} - - csv@5.5.3: - dependencies: - csv-generate: 3.4.3 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - stream-transform: 2.1.3 - data-uri-to-buffer@4.0.1: {} data-urls@5.0.0: @@ -14822,24 +14385,6 @@ snapshots: whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dataloader@1.4.0: {} debug@2.6.9: @@ -14850,13 +14395,6 @@ snapshots: dependencies: ms: 2.1.2 - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - decimal.js@10.4.3: {} decode-named-character-reference@1.0.2: @@ -14882,10 +14420,6 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.0 - defaults@1.0.4: - dependencies: - clone: 1.0.4 - define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 @@ -14894,12 +14428,6 @@ snapshots: define-lazy-prop@3.0.0: {} - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - defu@6.1.4: {} del@7.1.0: @@ -15023,88 +14551,15 @@ snapshots: eol@0.9.1: {} - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - error-stack-parser-es@0.1.1: {} - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 es-errors@1.3.0: {} - es-module-lexer@1.5.3: {} - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + es-module-lexer@1.5.4: {} esbuild-plugin-copy@2.1.1(esbuild@0.21.5): dependencies: @@ -15404,10 +14859,6 @@ snapshots: flattie@1.1.1: {} - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 @@ -15467,15 +14918,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - gauge@3.0.2: dependencies: aproba: 2.0.0 @@ -15506,12 +14948,6 @@ snapshots: get-stream@8.0.1: {} - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - giget@1.2.3: dependencies: citty: 0.1.6 @@ -15554,10 +14990,6 @@ snapshots: globals@14.0.0: {} - globalthis@1.0.3: - dependencies: - define-properties: 1.2.1 - globalyzer@0.1.0: {} globby@11.1.0: @@ -15594,8 +15026,6 @@ snapshots: graceful-fs@4.2.11: {} - grapheme-splitter@1.0.4: {} - graphemer@1.4.0: {} gray-matter@4.0.3: @@ -15605,12 +15035,8 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - hard-rejection@2.1.0: {} - has-async-hooks@1.0.0: {} - has-bigints@1.0.2: {} - has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -15623,10 +15049,6 @@ snapshots: has-symbols@1.0.3: {} - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - has-unicode@2.0.1: {} hasown@2.0.2: @@ -15811,8 +15233,6 @@ snapshots: hookable@5.5.3: {} - hosted-git-info@2.8.9: {} - html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -15917,8 +15337,6 @@ snapshots: imurmurhash@0.1.4: {} - indent-string@4.0.0: {} - indent-string@5.0.0: {} inflight@1.0.6: @@ -15932,12 +15350,6 @@ snapshots: inline-style-parser@0.2.3: {} - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - ipaddr.js@1.9.1: {} is-alphabetical@2.0.1: {} @@ -15947,42 +15359,16 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-arrayish@0.2.1: {} - is-arrayish@0.3.2: {} - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-callable@1.2.7: {} - is-core-module@2.13.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - is-decimal@2.0.1: {} is-docker@3.0.0: {} @@ -16007,12 +15393,6 @@ snapshots: is-interactive@2.0.0: {} - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-number@7.0.0: {} is-path-cwd@3.0.0: {} @@ -16021,8 +15401,6 @@ snapshots: is-path-inside@4.0.0: {} - is-plain-obj@1.1.0: {} - is-plain-obj@4.1.0: {} is-potential-custom-element-name@1.0.1: {} @@ -16031,41 +15409,16 @@ snapshots: dependencies: '@types/estree': 1.0.5 - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - is-stream@3.0.0: {} - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - is-unicode-supported@1.3.0: {} is-unicode-supported@2.0.0: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - is-what@4.1.16: {} is-windows@1.0.2: {} @@ -16074,8 +15427,6 @@ snapshots: dependencies: is-inside-container: 1.0.0 - isarray@2.0.5: {} - isexe@2.0.0: {} jackspeak@2.3.6: @@ -16135,8 +15486,6 @@ snapshots: json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -16321,10 +15670,6 @@ snapshots: manage-path@2.0.0: {} - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - markdown-extensions@2.0.0: {} markdown-table@3.0.3: {} @@ -16551,20 +15896,6 @@ snapshots: tree-dump: 1.0.1(tslib@2.6.2) tslib: 2.6.2 - meow@6.1.1: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 2.5.0 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.13.1 - yargs-parser: 18.1.3 - merge-anything@5.1.7: dependencies: is-what: 4.1.16 @@ -16872,8 +16203,6 @@ snapshots: mimic-fn@4.0.0: {} - min-indent@1.0.1: {} - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -16886,12 +16215,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - minimist@1.2.8: {} minipass@3.3.6: @@ -16902,6 +16225,8 @@ snapshots: minipass@7.1.0: {} + minipass@7.1.2: {} + minizlib@2.1.2: dependencies: minipass: 3.3.6 @@ -16909,13 +16234,11 @@ snapshots: minizlib@3.0.1: dependencies: - minipass: 7.1.0 + minipass: 7.1.2 rimraf: 5.0.5 mitt@3.0.1: {} - mixme@0.5.10: {} - mj-context-menu@0.6.1: {} mkdirp@1.0.4: {} @@ -16993,7 +16316,7 @@ snapshots: css-select: 5.1.0 he: 1.2.0 - node-mocks-http@1.14.1: + node-mocks-http@1.15.0: dependencies: '@types/express': 4.17.21 '@types/node': 20.12.7 @@ -17014,13 +16337,6 @@ snapshots: dependencies: abbrev: 1.1.1 - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -17056,15 +16372,6 @@ snapshots: object-inspect@1.13.1: {} - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - ohash@1.1.3: {} on-finished@2.4.1: @@ -17190,13 +16497,6 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.24.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - parse-latin@7.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -17293,8 +16593,6 @@ snapshots: port-authority@2.0.1: {} - possible-typed-array-names@1.0.0: {} - postcss-attribute-case-insensitive@6.0.3(postcss@8.4.38): dependencies: postcss: 8.4.38 @@ -17613,8 +16911,6 @@ snapshots: queue-microtask@1.2.3: {} - quick-lru@4.0.1: {} - range-parser@1.2.1: {} raw-body@2.5.2: @@ -17649,19 +16945,6 @@ snapshots: dependencies: pify: 2.3.0 - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -17681,11 +16964,6 @@ snapshots: reading-time@1.5.0: {} - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - refa@0.12.1: dependencies: '@eslint-community/regexpp': 4.10.0 @@ -17699,13 +16977,6 @@ snapshots: '@eslint-community/regexpp': 4.10.0 refa: 0.12.1 - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - rehype-autolink-headings@7.1.0: dependencies: '@types/hast': 3.0.4 @@ -17723,7 +16994,7 @@ snapshots: hast-util-to-text: 4.0.2 jsdom: 23.2.0 mathjax-full: 3.2.2 - unified: 11.0.4 + unified: 11.0.5 unist-util-visit-parents: 6.0.1 transitivePeerDependencies: - bufferutil @@ -17735,18 +17006,18 @@ snapshots: dependencies: '@types/hast': 3.0.4 hast-util-from-html: 2.0.1 - unified: 11.0.4 + unified: 11.0.5 - rehype-pretty-code@0.13.2(shiki@1.6.5): + rehype-pretty-code@0.13.2(shiki@1.9.1): dependencies: '@types/hast': 3.0.4 hast-util-to-string: 3.0.0 parse-numeric-range: 1.3.0 rehype-parse: 9.0.0 - unified: 11.0.4 + unified: 11.0.5 unist-util-visit: 5.0.0 optionalDependencies: - shiki: 1.6.5 + shiki: 1.9.1 rehype-raw@7.0.0: dependencies: @@ -17766,7 +17037,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 hast-util-to-html: 9.0.1 - unified: 11.0.4 + unified: 11.0.5 rehype-toc@3.0.2: dependencies: @@ -17777,7 +17048,7 @@ snapshots: '@types/hast': 3.0.4 rehype-parse: 9.0.0 rehype-stringify: 10.0.0 - unified: 11.0.4 + unified: 11.0.5 reinterval@1.1.0: {} @@ -17794,7 +17065,7 @@ snapshots: micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -17803,7 +17074,7 @@ snapshots: '@types/mdast': 4.0.4 mdast-util-math: 3.0.0 micromark-extension-math: 3.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -17819,7 +17090,7 @@ snapshots: '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.0 micromark-util-types: 2.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -17828,10 +17099,10 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 mdast-util-to-hast: 13.1.0 - unified: 11.0.4 + unified: 11.0.5 vfile: 6.0.1 - remark-shiki-twoslash@3.1.3(typescript@5.4.5): + remark-shiki-twoslash@3.1.3(typescript@5.5.2): dependencies: '@types/unist': 2.0.10 '@typescript/twoslash': 3.1.0 @@ -17839,9 +17110,9 @@ snapshots: fenceparser: 1.1.1 regenerator-runtime: 0.13.11 shiki: 0.10.1 - shiki-twoslash: 3.1.2(typescript@5.4.5) + shiki-twoslash: 3.1.2(typescript@5.5.2) tslib: 2.1.0 - typescript: 5.4.5 + typescript: 5.5.2 unist-util-visit: 2.0.3 transitivePeerDependencies: - supports-color @@ -17850,14 +17121,14 @@ snapshots: dependencies: retext: 9.0.0 retext-smartypants: 6.1.0 - unified: 11.0.4 + unified: 11.0.5 unist-util-visit: 5.0.0 remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 + unified: 11.0.5 remark-toc@9.0.0: dependencies: @@ -17870,8 +17141,6 @@ snapshots: require-from-string@2.0.2: {} - require-main-filename@2.0.0: {} - requires-port@1.0.0: {} resolve-from@4.0.0: {} @@ -17893,7 +17162,7 @@ snapshots: dependencies: '@types/nlcst': 2.0.3 parse-latin: 7.0.0 - unified: 11.0.4 + unified: 11.0.5 retext-smartypants@6.1.0: dependencies: @@ -17905,20 +17174,20 @@ snapshots: dependencies: '@types/nlcst': 2.0.3 nlcst-to-string: 4.0.0 - unified: 11.0.4 + unified: 11.0.5 retext@9.0.0: dependencies: '@types/nlcst': 2.0.3 retext-latin: 4.0.0 retext-stringify: 4.0.0 - unified: 11.0.4 + unified: 11.0.5 retimer@3.0.0: {} reusify@1.0.4: {} - rfdc@1.3.1: {} + rfdc@1.4.1: {} rimraf@3.0.2: dependencies: @@ -17960,28 +17229,15 @@ snapshots: s.color@0.0.15: {} - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safer-buffer@2.1.2: {} sass-formatter@0.7.9: dependencies: suf-log: 2.5.3 - sass@1.77.5: + sass@1.77.6: dependencies: chokidar: 3.6.0 immutable: 4.3.5 @@ -18066,13 +17322,6 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - setprototypeof@1.2.0: {} sharp@0.33.3: @@ -18113,13 +17362,13 @@ snapshots: shebang-regex@3.0.0: {} - shiki-twoslash@3.1.2(typescript@5.4.5): + shiki-twoslash@3.1.2(typescript@5.5.2): dependencies: '@typescript/twoslash': 3.1.0 '@typescript/vfs': 1.3.4 fenceparser: 1.1.1 shiki: 0.10.1 - typescript: 5.4.5 + typescript: 5.5.2 transitivePeerDependencies: - supports-color @@ -18129,9 +17378,9 @@ snapshots: vscode-oniguruma: 1.7.0 vscode-textmate: 5.2.0 - shiki@1.6.5: + shiki@1.9.1: dependencies: - '@shikijs/core': 1.6.5 + '@shikijs/core': 1.9.1 side-channel@1.0.6: dependencies: @@ -18187,15 +17436,6 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - smartwrap@2.0.2: - dependencies: - array.prototype.flat: 1.3.2 - breakword: 1.0.6 - grapheme-splitter: 1.0.4 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 15.4.1 - smartypants@0.2.2: {} solid-js@1.8.17: @@ -18226,20 +17466,6 @@ snapshots: cross-spawn: 5.1.0 signal-exit: 3.0.7 - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - - spdx-license-ids@3.0.17: {} - speakingurl@14.0.1: {} speech-rule-engine@4.0.7: @@ -18264,10 +17490,6 @@ snapshots: stream-replace-string@2.0.0: {} - stream-transform@2.1.3: - dependencies: - mixme: 0.5.10 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -18286,25 +17508,6 @@ snapshots: get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -18330,10 +17533,6 @@ snapshots: strip-final-newline@3.0.0: {} - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} @@ -18395,12 +17594,12 @@ snapshots: dependencies: svelte: 4.2.18 - svelte2tsx@0.7.9(svelte@4.2.18)(typescript@5.4.5): + svelte2tsx@0.7.12(svelte@4.2.18)(typescript@5.5.2): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 svelte: 4.2.18 - typescript: 5.4.5 + typescript: 5.5.2 svelte@4.2.18: dependencies: @@ -18471,11 +17670,11 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - tar@7.2.0: + tar@7.4.0: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 - minipass: 7.1.0 + minipass: 7.1.2 minizlib: 3.0.1 mkdirp: 3.0.1 yallist: 5.0.0 @@ -18547,13 +17746,11 @@ snapshots: trim-lines@3.0.1: {} - trim-newlines@3.0.1: {} - trough@2.2.0: {} - ts-api-utils@1.3.0(typescript@5.4.5): + ts-api-utils@1.3.0(typescript@5.5.2): dependencies: - typescript: 5.4.5 + typescript: 5.5.2 ts-interface-checker@0.1.13: {} @@ -18562,9 +17759,9 @@ snapshots: '@ts-morph/common': 0.20.0 code-block-writer: 12.0.0 - tsconfck@3.1.0(typescript@5.4.5): + tsconfck@3.1.0(typescript@5.5.2): optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 tsconfig-resolver@3.0.1: dependencies: @@ -18586,16 +17783,6 @@ snapshots: tslib@2.6.2: {} - tty-table@4.2.3: - dependencies: - chalk: 4.1.2 - csv: 5.5.3 - kleur: 4.1.5 - smartwrap: 2.0.2 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 17.7.2 - turbo-darwin-64@1.13.4: optional: true @@ -18629,12 +17816,6 @@ snapshots: type-detect@4.0.8: {} - type-fest@0.13.1: {} - - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - type-fest@1.4.0: {} type-fest@2.19.0: {} @@ -18646,38 +17827,6 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - types-react-dom@19.0.0-alpha.3: dependencies: '@types/react': 18.3.3 @@ -18692,18 +17841,18 @@ snapshots: dependencies: semver: 7.6.2 - typescript-eslint@7.13.0(eslint@9.5.0)(typescript@5.4.5): + typescript-eslint@7.14.1(eslint@9.5.0)(typescript@5.5.2): dependencies: - '@typescript-eslint/eslint-plugin': 7.13.0(@typescript-eslint/parser@7.13.0(eslint@9.5.0)(typescript@5.4.5))(eslint@9.5.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.13.0(eslint@9.5.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.13.0(eslint@9.5.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2) + '@typescript-eslint/parser': 7.14.1(eslint@9.5.0)(typescript@5.5.2) + '@typescript-eslint/utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) eslint: 9.5.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 transitivePeerDependencies: - supports-color - typescript@5.4.5: {} + typescript@5.5.2: {} ufo@1.5.3: {} @@ -18713,13 +17862,6 @@ snapshots: ultrahtml@1.5.3: {} - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - undici-types@5.26.5: {} undici@6.19.2: {} @@ -18736,6 +17878,16 @@ snapshots: trough: 2.2.0 vfile: 6.0.1 + unified@11.0.5: + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.1 + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.2 @@ -18849,11 +18001,6 @@ snapshots: validate-html-nesting@1.2.2: {} - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - vary@1.1.2: {} vfile-location@5.0.2: @@ -18872,17 +18019,17 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite-hot-client@0.2.3(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)): + vite-hot-client@0.2.3(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)): dependencies: - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) - vite-node@1.6.0(@types/node@20.12.7)(sass@1.77.5): + vite-node@1.6.0(@types/node@20.12.7)(sass@1.77.6): dependencies: cac: 6.7.14 debug: 4.3.5 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) transitivePeerDependencies: - '@types/node' - less @@ -18893,7 +18040,7 @@ snapshots: - supports-color - terser - vite-plugin-inspect@0.8.4(rollup@4.18.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)): + vite-plugin-inspect@0.8.4(rollup@4.18.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)): dependencies: '@antfu/utils': 0.7.8 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) @@ -18904,12 +18051,12 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.0.0 sirv: 2.0.4 - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) transitivePeerDependencies: - rollup - supports-color - vite-plugin-solid@2.10.2(solid-js@1.8.17)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)): + vite-plugin-solid@2.10.2(solid-js@1.8.17)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)): dependencies: '@babel/core': 7.24.7 '@types/babel__core': 7.20.5 @@ -18917,28 +18064,28 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.8.17 solid-refresh: 0.6.3(solid-js@1.8.17) - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) - vitefu: 0.2.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) + vitefu: 0.2.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) transitivePeerDependencies: - supports-color - vite-plugin-vue-devtools@7.3.0(rollup@4.18.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))(vue@3.4.29(typescript@5.4.5)): + vite-plugin-vue-devtools@7.3.4(rollup@4.18.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))(vue@3.4.30(typescript@5.5.2)): dependencies: - '@vue/devtools-core': 7.3.0(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5))(vue@3.4.29(typescript@5.4.5)) - '@vue/devtools-kit': 7.3.0(vue@3.4.29(typescript@5.4.5)) - '@vue/devtools-shared': 7.3.0 + '@vue/devtools-core': 7.3.4(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6))(vue@3.4.30(typescript@5.5.2)) + '@vue/devtools-kit': 7.3.4 + '@vue/devtools-shared': 7.3.4 execa: 8.0.1 sirv: 2.0.4 - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) - vite-plugin-inspect: 0.8.4(rollup@4.18.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) - vite-plugin-vue-inspector: 5.1.2(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) + vite-plugin-inspect: 0.8.4(rollup@4.18.0)(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) + vite-plugin-vue-inspector: 5.1.2(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)) transitivePeerDependencies: - '@nuxt/kit' - rollup - supports-color - vue - vite-plugin-vue-inspector@5.1.2(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)): + vite-plugin-vue-inspector@5.1.2(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)): dependencies: '@babel/core': 7.24.7 '@babel/plugin-proposal-decorators': 7.24.1(@babel/core@7.24.7) @@ -18949,17 +18096,17 @@ snapshots: '@vue/compiler-dom': 3.4.29 kolorist: 1.8.0 magic-string: 0.30.10 - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) transitivePeerDependencies: - supports-color - vite-svg-loader@5.1.0(vue@3.4.29(typescript@5.4.5)): + vite-svg-loader@5.1.0(vue@3.4.30(typescript@5.5.2)): dependencies: svgo: 3.2.0 optionalDependencies: - vue: 3.4.29(typescript@5.4.5) + vue: 3.4.30(typescript@5.5.2) - vite@5.3.1(@types/node@20.12.7)(sass@1.77.5): + vite@5.3.1(@types/node@20.12.7)(sass@1.77.6): dependencies: esbuild: 0.21.5 postcss: 8.4.38 @@ -18967,13 +18114,13 @@ snapshots: optionalDependencies: '@types/node': 20.12.7 fsevents: 2.3.3 - sass: 1.77.5 + sass: 1.77.6 - vitefu@0.2.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.5)): + vitefu@0.2.5(vite@5.3.1(@types/node@20.12.7)(sass@1.77.6)): optionalDependencies: - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) - vitest@1.6.0(@types/node@20.12.7)(jsdom@23.2.0)(sass@1.77.5): + vitest@1.6.0(@types/node@20.12.7)(jsdom@23.2.0)(sass@1.77.6): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -18992,8 +18139,8 @@ snapshots: strip-literal: 2.1.0 tinybench: 2.7.0 tinypool: 0.8.4 - vite: 5.3.1(@types/node@20.12.7)(sass@1.77.5) - vite-node: 1.6.0(@types/node@20.12.7)(sass@1.77.5) + vite: 5.3.1(@types/node@20.12.7)(sass@1.77.6) + vite-node: 1.6.0(@types/node@20.12.7)(sass@1.77.6) why-is-node-running: 2.2.2 optionalDependencies: '@types/node': 20.12.7 @@ -19091,31 +18238,27 @@ snapshots: vscode-uri@3.0.8: {} - vue@3.4.29(typescript@5.4.5): + vue@3.4.30(typescript@5.5.2): dependencies: - '@vue/compiler-dom': 3.4.29 - '@vue/compiler-sfc': 3.4.29 - '@vue/runtime-dom': 3.4.29 - '@vue/server-renderer': 3.4.29(vue@3.4.29(typescript@5.4.5)) - '@vue/shared': 3.4.29 + '@vue/compiler-dom': 3.4.30 + '@vue/compiler-sfc': 3.4.30 + '@vue/runtime-dom': 3.4.30 + '@vue/server-renderer': 3.4.30(vue@3.4.30(typescript@5.5.2)) + '@vue/shared': 3.4.30 optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - web-namespaces@2.0.1: {} web-streams-polyfill@3.3.3: {} web-vitals@3.5.2: {} - web-vitals@4.1.1: {} + web-vitals@4.2.0: {} webidl-conversions@3.0.1: {} @@ -19137,16 +18280,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-module@2.0.1: {} - which-pm-runs@1.1.0: {} which-pm@2.0.0: @@ -19159,14 +18292,6 @@ snapshots: load-yaml-file: 0.2.0 path-exists: 4.0.0 - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - which@1.3.1: dependencies: isexe: 2.0.0 @@ -19190,12 +18315,6 @@ snapshots: dependencies: string-width: 5.1.2 - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -19225,8 +18344,6 @@ snapshots: xmldom-sre@0.1.31: {} - y18n@4.0.3: {} - y18n@5.0.8: {} yallist@2.1.2: {} @@ -19239,27 +18356,8 @@ snapshots: yaml@2.4.1: {} - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - yargs-parser@21.1.1: {} - yargs@15.4.1: - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -19274,7 +18372,7 @@ snapshots: yocto-queue@1.0.0: {} - zod-to-json-schema@3.23.0(zod@3.23.8): + zod-to-json-schema@3.23.1(zod@3.23.8): dependencies: zod: 3.23.8 From 92c3312d88d367f42e3d6a8cec82c1fb7c615f2f Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 26 Jun 2024 13:36:49 +0100 Subject: [PATCH 13/21] Fix type --- packages/astro/src/content/types-generator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astro/src/content/types-generator.ts b/packages/astro/src/content/types-generator.ts index 600ea90b228e..5aed9f1ecd1c 100644 --- a/packages/astro/src/content/types-generator.ts +++ b/packages/astro/src/content/types-generator.ts @@ -249,7 +249,7 @@ export async function createContentTypesGenerator({ collectionEntryMap[collectionKey] = { type: 'content', entries: { - ...collectionInfo.entries, + ...(collectionInfo.entries as Record), [entryKey]: { slug: addedSlug }, }, }; From 5cd5670232a5cdbd228ca52f8697caee85ebc268 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 26 Jun 2024 14:14:02 +0100 Subject: [PATCH 14/21] Handle loading for data store JSON --- .../src/content/vite-plugin-content-virtual-mod.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/astro/src/content/vite-plugin-content-virtual-mod.ts b/packages/astro/src/content/vite-plugin-content-virtual-mod.ts index d03ad0365c7a..6cd084989fea 100644 --- a/packages/astro/src/content/vite-plugin-content-virtual-mod.ts +++ b/packages/astro/src/content/vite-plugin-content-virtual-mod.ts @@ -16,6 +16,7 @@ import { CONTENT_RENDER_FLAG, DATA_FLAG, DATA_STORE_VIRTUAL_ID, + RESOLVED_DATA_STORE_VIRTUAL_ID, RESOLVED_VIRTUAL_MODULE_ID, VIRTUAL_MODULE_ID, } from './consts.js'; @@ -43,7 +44,7 @@ export function astroContentVirtualModPlugin({ }: AstroContentVirtualModPluginParams): Plugin { let IS_DEV = false; const IS_SERVER = isServerLikeOutput(settings.config); - const dataStoreFile = fileURLToPath(new URL('data-store.json', settings.config.cacheDir)); + const dataStoreFile = new URL('data-store.json', settings.config.cacheDir); return { name: 'astro-content-virtual-mod-plugin', enforce: 'pre', @@ -63,7 +64,7 @@ export function astroContentVirtualModPlugin({ } } if (id === DATA_STORE_VIRTUAL_ID) { - return dataStoreFile; + return RESOLVED_DATA_STORE_VIRTUAL_ID; } }, async load(id, args) { @@ -96,6 +97,13 @@ export function astroContentVirtualModPlugin({ } satisfies AstroPluginMetadata, }; } + if(id === RESOLVED_DATA_STORE_VIRTUAL_ID) { + if(!fs.existsSync(dataStoreFile)) { + return 'export default {}' + } + const jsonData = await fs.promises.readFile(dataStoreFile, 'utf-8'); + return `export default ${jsonData}`; + } }, renderChunk(code, chunk) { if (!settings.config.experimental.contentCollectionCache) { From 3fcdc59b8b1f84645259afdf2524a67bd114554e Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 26 Jun 2024 14:33:13 +0100 Subject: [PATCH 15/21] Use rollup util to import JSON --- packages/astro/package.json | 1 + .../vite-plugin-content-virtual-mod.ts | 21 +++++++++++++++---- pnpm-lock.yaml | 3 +++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/astro/package.json b/packages/astro/package.json index d9069bb71a6e..56c224604b72 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -133,6 +133,7 @@ "@babel/plugin-transform-react-jsx": "^7.24.7", "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7", + "@rollup/pluginutils": "^5.1.0", "@types/babel__core": "^7.20.5", "@types/cookie": "^0.6.0", "acorn": "^8.12.0", diff --git a/packages/astro/src/content/vite-plugin-content-virtual-mod.ts b/packages/astro/src/content/vite-plugin-content-virtual-mod.ts index 6cd084989fea..9af1d4a7ec0e 100644 --- a/packages/astro/src/content/vite-plugin-content-virtual-mod.ts +++ b/packages/astro/src/content/vite-plugin-content-virtual-mod.ts @@ -4,6 +4,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url'; import glob from 'fast-glob'; import pLimit from 'p-limit'; import type { Plugin } from 'vite'; +import { dataToEsm } from '@rollup/pluginutils'; import type { AstroSettings } from '../@types/astro.js'; import { encodeName } from '../core/build/util.js'; import { AstroError, AstroErrorData } from '../core/errors/index.js'; @@ -97,12 +98,24 @@ export function astroContentVirtualModPlugin({ } satisfies AstroPluginMetadata, }; } - if(id === RESOLVED_DATA_STORE_VIRTUAL_ID) { - if(!fs.existsSync(dataStoreFile)) { - return 'export default {}' + if (id === RESOLVED_DATA_STORE_VIRTUAL_ID) { + if (!fs.existsSync(dataStoreFile)) { + return 'export default {}'; } const jsonData = await fs.promises.readFile(dataStoreFile, 'utf-8'); - return `export default ${jsonData}`; + + try { + const parsed = JSON.parse(jsonData); + return { + code: dataToEsm(parsed, { + compact: true, + }), + map: { mappings: '' }, + }; + } catch (err) { + const message = 'Could not parse JSON file'; + this.error({ message, id, cause: err }); + } } }, renderChunk(code, chunk) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11820df913c6..2951b639e8ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -558,6 +558,9 @@ importers: '@babel/types': specifier: ^7.24.7 version: 7.24.7 + '@rollup/pluginutils': + specifier: ^5.1.0 + version: 5.1.0(rollup@4.18.0) '@types/babel__core': specifier: ^7.20.5 version: 7.20.5 From 14322d44f1951dbb2aff6fee6dc324f60df9702b Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 26 Jun 2024 17:12:52 +0100 Subject: [PATCH 16/21] Fix types --- packages/astro/types/content.d.ts | 67 +++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/packages/astro/types/content.d.ts b/packages/astro/types/content.d.ts index 4ae0e1bdcaeb..0f491fc15841 100644 --- a/packages/astro/types/content.d.ts +++ b/packages/astro/types/content.d.ts @@ -1,5 +1,3 @@ -import type { AstroIntegrationLogger } from '../src/core/logger/core.js'; -import type { MetaStore, ScopedDataStore } from '../src/content/data-store.js'; declare module 'astro:content' { export { z } from 'astro/zod'; @@ -22,6 +20,51 @@ declare module 'astro:content' { >; }>; + export interface DataStore { + get: (key: string) => any; + entries: () => IterableIterator<[id: string, any]>; + set: (key: string, value: any) => void; + delete: (key: string) => void; + clear: () => void; + has: (key: string) => boolean; + } + export interface MetaStore { + get: (key: string) => string | undefined; + set: (key: string, value: string) => void; + has: (key: string) => boolean; + } + + export interface ParseDataOptions { + /** The ID of the entry. Unique per collection */ + id: string; + /** The raw, unvalidated data of the entry */ + data: Record; + /** An optional file path, where the entry represents a local file */ + filePath?: string; +} +export interface LoaderContext { + collection: string; + /** A database abstraction to store the actual data */ + store: DataStore; + /** A simple KV store, designed for things like sync tokens */ + meta: MetaStore; + logger: import("astro").AstroIntegrationLogger; + settings: any; + /** Validates and parses the data according to the schema */ + parseData = Record>(props: ParseDataOptions): T; +} +export interface Loader { + /** Unique name of the loader, e.g. the npm package name */ + name: string; + /** Do the actual loading of the data */ + load: (context: LoaderContext) => Promise; + /** Optionally, define the schema of the data. Will be overridden by user-defined schema */ + schema?: S | Promise | (() => S | Promise); + render?: (entry: any) => any; +} + + export function file(filePath: string): Loader; + type BaseSchemaWithoutEffects = | import('astro/zod').AnyZodObject | import('astro/zod').ZodUnion<[BaseSchemaWithoutEffects, ...BaseSchemaWithoutEffects[]]> @@ -34,26 +77,6 @@ declare module 'astro:content' { export type SchemaContext = { image: ImageFunction }; - export interface LoaderContext { - collection: string; - // A database abstraction to store the actual data - store: ScopedDataStore; - // A simple KV store, designed for things like sync tokens - meta: MetaStore; - logger: AstroIntegrationLogger; - } - - export interface Loader { - // Name of the loader, e.g. the npm package name - name: string; - // Do the actual loading of the data - load: (context: LoaderContext) => Promise; - // Allow a loader to define its own schema - schema?: S | Promise | ((context: SchemaContext) => S | Promise); - // Render content from the store - render?: (entry: any) => any; - } - type ContentCollectionV2Config = { type: 'experimental_data'; schema?: S | ((context: SchemaContext) => S); From 8d310af109b995e2156205ae7a9e8349261168b1 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 26 Jun 2024 19:33:29 +0100 Subject: [PATCH 17/21] Format --- packages/astro/types/content.d.ts | 56 ++++++++++++++++--------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/packages/astro/types/content.d.ts b/packages/astro/types/content.d.ts index 0f491fc15841..4894d8341be5 100644 --- a/packages/astro/types/content.d.ts +++ b/packages/astro/types/content.d.ts @@ -35,33 +35,35 @@ declare module 'astro:content' { } export interface ParseDataOptions { - /** The ID of the entry. Unique per collection */ - id: string; - /** The raw, unvalidated data of the entry */ - data: Record; - /** An optional file path, where the entry represents a local file */ - filePath?: string; -} -export interface LoaderContext { - collection: string; - /** A database abstraction to store the actual data */ - store: DataStore; - /** A simple KV store, designed for things like sync tokens */ - meta: MetaStore; - logger: import("astro").AstroIntegrationLogger; - settings: any; - /** Validates and parses the data according to the schema */ - parseData = Record>(props: ParseDataOptions): T; -} -export interface Loader { - /** Unique name of the loader, e.g. the npm package name */ - name: string; - /** Do the actual loading of the data */ - load: (context: LoaderContext) => Promise; - /** Optionally, define the schema of the data. Will be overridden by user-defined schema */ - schema?: S | Promise | (() => S | Promise); - render?: (entry: any) => any; -} + /** The ID of the entry. Unique per collection */ + id: string; + /** The raw, unvalidated data of the entry */ + data: Record; + /** An optional file path, where the entry represents a local file */ + filePath?: string; + } + export interface LoaderContext { + collection: string; + /** A database abstraction to store the actual data */ + store: DataStore; + /** A simple KV store, designed for things like sync tokens */ + meta: MetaStore; + logger: import('astro').AstroIntegrationLogger; + settings: any; + /** Validates and parses the data according to the schema */ + parseData = Record>( + props: ParseDataOptions + ): T; + } + export interface Loader { + /** Unique name of the loader, e.g. the npm package name */ + name: string; + /** Do the actual loading of the data */ + load: (context: LoaderContext) => Promise; + /** Optionally, define the schema of the data. Will be overridden by user-defined schema */ + schema?: S | Promise | (() => S | Promise); + render?: (entry: any) => any; + } export function file(filePath: string): Loader; From d8f2d6eefb899ff64eae40231b531272f15d5674 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 27 Jun 2024 07:27:04 +0100 Subject: [PATCH 18/21] feat: add typegen for loaders --- packages/astro/package.json | 3 +- packages/astro/src/content/loaders.ts | 6 ++-- packages/astro/src/content/types-generator.ts | 28 +++++++++++++++---- .../content-layer/src/loaders/post-loader.ts | 12 +++++++- packages/astro/tsconfig.json | 3 +- packages/astro/types/content.d.ts | 6 ++-- pnpm-lock.yaml | 14 ++++++++++ 7 files changed, 58 insertions(+), 14 deletions(-) diff --git a/packages/astro/package.json b/packages/astro/package.json index 56c224604b72..7e0a4bfa2583 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -185,7 +185,8 @@ "which-pm": "^2.2.0", "yargs-parser": "^21.1.1", "zod": "^3.23.8", - "zod-to-json-schema": "^3.23.1" + "zod-to-json-schema": "^3.23.1", + "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.33.3" diff --git a/packages/astro/src/content/loaders.ts b/packages/astro/src/content/loaders.ts index b966d13d47bc..eeb1f54d921b 100644 --- a/packages/astro/src/content/loaders.ts +++ b/packages/astro/src/content/loaders.ts @@ -1,4 +1,4 @@ -import type { ZodSchema } from 'zod'; +import type { AnyZodObject } from 'astro/zod'; import type { AstroSettings } from '../@types/astro.js'; import type { AstroIntegrationLogger, Logger } from '../core/logger/core.js'; import { DataStore, globalDataStore, type MetaStore, type ScopedDataStore } from './data-store.js'; @@ -30,13 +30,13 @@ export interface LoaderContext { ): T; } -export interface Loader { +export interface Loader { /** Unique name of the loader, e.g. the npm package name */ name: string; /** Do the actual loading of the data */ load: (context: LoaderContext) => Promise; /** Optionally, define the schema of the data. Will be overridden by user-defined schema */ - schema?: S | Promise | (() => S | Promise); + schema?: AnyZodObject | Promise | (() => AnyZodObject | Promise); render?: (entry: any) => any; } export async function syncDataLayer({ diff --git a/packages/astro/src/content/types-generator.ts b/packages/astro/src/content/types-generator.ts index 5aed9f1ecd1c..4532ac1f56e7 100644 --- a/packages/astro/src/content/types-generator.ts +++ b/packages/astro/src/content/types-generator.ts @@ -5,6 +5,7 @@ import glob from 'fast-glob'; import { bold, cyan } from 'kleur/colors'; import { type ViteDevServer, normalizePath } from 'vite'; import { z } from 'zod'; +import { zodToTs, printNode } from 'zod-to-ts'; import { zodToJsonSchema } from 'zod-to-json-schema'; import type { AstroSettings, ContentEntryType } from '../@types/astro.js'; import { AstroError } from '../core/errors/errors.js'; @@ -360,6 +361,27 @@ function normalizeConfigPath(from: string, to: string) { return `"${isRelativePath(configPath) ? '' : './'}${normalizedPath}"` as const; } +async function typeForCollection( + collection: ContentConfig['collections'][T] | undefined, + collectionKey: T +): Promise { + if (collection?.schema) { + return `InferEntrySchema<${collectionKey}>`; + } + + if (collection?.type === 'experimental_data' && collection.loader.schema) { + let schema = collection.loader.schema; + if (typeof schema === 'function') { + schema = await schema(); + } + if (schema) { + const ast = zodToTs(schema); + return printNode(ast.node); + } + } + return 'any'; +} + async function writeContentFiles({ fs, contentPaths, @@ -435,11 +457,7 @@ async function writeContentFiles({ : collection.type; const collectionEntryKeys = Object.keys(collection.entries).sort(); - const dataType = - collectionConfig?.schema || - (collectionConfig?.type === 'experimental_data' && collectionConfig.loader?.schema) - ? `InferEntrySchema<${collectionKey}>` - : 'any'; + const dataType = await typeForCollection(collectionConfig, collectionKey); switch (resolvedType) { case 'content': if (collectionEntryKeys.length === 0) { diff --git a/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts index edd2a8dbf443..38e4e28b5816 100644 --- a/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts +++ b/packages/astro/test/fixtures/content-layer/src/loaders/post-loader.ts @@ -1,4 +1,4 @@ -import type { Loader } from 'astro:content'; +import { type Loader, z } from 'astro:content'; export interface PostLoaderConfig { url: string; @@ -30,5 +30,15 @@ export function loader(config:PostLoaderConfig): Loader { } meta.set('lastSynced', String(Date.now())); }, + schema: async () => { + // Simulate a delay + await new Promise((resolve) => setTimeout(resolve, 1000)); + return z.object({ + title: z.string(), + body: z.string(), + userId: z.number(), + id: z.number(), + }); + } }; } diff --git a/packages/astro/tsconfig.json b/packages/astro/tsconfig.json index a9172654793b..c4f6c1899cdc 100644 --- a/packages/astro/tsconfig.json +++ b/packages/astro/tsconfig.json @@ -6,6 +6,7 @@ "declarationDir": "./dist", "outDir": "./dist", "jsx": "preserve", - "types": ["@types/dom-view-transitions"] + "types": ["@types/dom-view-transitions"], + "rootDir": "src" } } diff --git a/packages/astro/types/content.d.ts b/packages/astro/types/content.d.ts index 4894d8341be5..67fb92b4438a 100644 --- a/packages/astro/types/content.d.ts +++ b/packages/astro/types/content.d.ts @@ -55,13 +55,13 @@ declare module 'astro:content' { props: ParseDataOptions ): T; } - export interface Loader { + export interface Loader { /** Unique name of the loader, e.g. the npm package name */ name: string; /** Do the actual loading of the data */ load: (context: LoaderContext) => Promise; /** Optionally, define the schema of the data. Will be overridden by user-defined schema */ - schema?: S | Promise | (() => S | Promise); + schema?: BaseSchema | Promise | (() => BaseSchema | Promise); render?: (entry: any) => any; } @@ -82,7 +82,7 @@ declare module 'astro:content' { type ContentCollectionV2Config = { type: 'experimental_data'; schema?: S | ((context: SchemaContext) => S); - loader: Loader; + loader: Loader; }; type DataCollectionConfig = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2951b639e8ad..cea105105e2b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -717,6 +717,9 @@ importers: zod-to-json-schema: specifier: ^3.23.1 version: 3.23.1(zod@3.23.8) + zod-to-ts: + specifier: ^1.2.0 + version: 1.2.0(typescript@5.5.2)(zod@3.23.8) optionalDependencies: sharp: specifier: ^0.33.3 @@ -11703,6 +11706,12 @@ packages: peerDependencies: zod: ^3.23.3 + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -18379,6 +18388,11 @@ snapshots: dependencies: zod: 3.23.8 + zod-to-ts@1.2.0(typescript@5.5.2)(zod@3.23.8): + dependencies: + typescript: 5.5.2 + zod: 3.23.8 + zod@3.23.8: {} zwitch@2.0.4: {} From 527073d7d06ef5e0ce96a680ec62a37c99b12f49 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 27 Jun 2024 09:04:00 +0100 Subject: [PATCH 19/21] Change back to direct zod import --- packages/astro/src/content/loaders.ts | 4 ++-- packages/astro/tsconfig.json | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/astro/src/content/loaders.ts b/packages/astro/src/content/loaders.ts index eeb1f54d921b..6107dac84b0a 100644 --- a/packages/astro/src/content/loaders.ts +++ b/packages/astro/src/content/loaders.ts @@ -1,4 +1,4 @@ -import type { AnyZodObject } from 'astro/zod'; +import type { ZodSchema } from 'zod'; import type { AstroSettings } from '../@types/astro.js'; import type { AstroIntegrationLogger, Logger } from '../core/logger/core.js'; import { DataStore, globalDataStore, type MetaStore, type ScopedDataStore } from './data-store.js'; @@ -36,7 +36,7 @@ export interface Loader { /** Do the actual loading of the data */ load: (context: LoaderContext) => Promise; /** Optionally, define the schema of the data. Will be overridden by user-defined schema */ - schema?: AnyZodObject | Promise | (() => AnyZodObject | Promise); + schema?: ZodSchema | Promise | (() => ZodSchema | Promise); render?: (entry: any) => any; } export async function syncDataLayer({ diff --git a/packages/astro/tsconfig.json b/packages/astro/tsconfig.json index c4f6c1899cdc..a9172654793b 100644 --- a/packages/astro/tsconfig.json +++ b/packages/astro/tsconfig.json @@ -6,7 +6,6 @@ "declarationDir": "./dist", "outDir": "./dist", "jsx": "preserve", - "types": ["@types/dom-view-transitions"], - "rootDir": "src" + "types": ["@types/dom-view-transitions"] } } From 9de133f66a85ad98375682ef974927b8d955a5a5 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 27 Jun 2024 11:12:58 +0100 Subject: [PATCH 20/21] Add tests --- packages/astro/test/content-layer.test.js | 89 +++++++++++++++++++ .../src/pages/collections.json.js | 12 +++ .../content-layer/src/pages/dogs/[slug].astro | 1 - 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 packages/astro/test/content-layer.test.js create mode 100644 packages/astro/test/fixtures/content-layer/src/pages/collections.json.js diff --git a/packages/astro/test/content-layer.test.js b/packages/astro/test/content-layer.test.js new file mode 100644 index 000000000000..0262d4d06bda --- /dev/null +++ b/packages/astro/test/content-layer.test.js @@ -0,0 +1,89 @@ +import assert from 'node:assert/strict'; +import { before, describe, it } from 'node:test'; +import { loadFixture } from './test-utils.js'; + +describe('Content Collections', () => { + describe('Query', () => { + let fixture; + before(async () => { + fixture = await loadFixture({ root: './fixtures/content-layer/' }); + await fixture.build(); + }); + + describe('Collection', () => { + let json; + before(async () => { + const rawJson = await fixture.readFile('/collections.json'); + json = JSON.parse(rawJson); + }); + + it('Returns custom loader collection', async () => { + assert.ok(json.hasOwnProperty('customLoader')); + assert.ok(Array.isArray(json.customLoader)); + + const item = json.customLoader[0]; + assert.deepEqual(item, { + id: '1', + collection: 'blog', + data: { + userId: 1, + id: 1, + title: 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit', + body: 'quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto', + }, + type: 'experimental_data', + }); + }); + + it('Returns file loader collection', async () => { + assert.ok(json.hasOwnProperty('fileLoader')); + assert.ok(Array.isArray(json.fileLoader)); + + const ids = json.fileLoader.map((item) => item.data.id); + assert.deepEqual(ids, [ + 'labrador-retriever', + 'german-shepherd', + 'golden-retriever', + 'french-bulldog', + 'bulldog', + 'beagle', + 'poodle', + 'rottweiler', + 'german-shorthaired-pointer', + 'yorkshire-terrier', + 'boxer', + 'dachshund', + 'siberian-husky', + 'great-dane', + 'doberman-pinscher', + 'australian-shepherd', + 'miniature-schnauzer', + 'cavalier-king-charles-spaniel', + 'shih-tzu', + 'boston-terrier', + 'bernese-mountain-dog', + 'pomeranian', + 'havanese', + 'english-springer-spaniel', + 'shetland-sheepdog', + ]); + }); + + it('Returns data entry by id', async () => { + assert.ok(json.hasOwnProperty('dataEntryById')); + assert.deepEqual(json.dataEntryById, { + id: 'beagle', + collection: 'dogs', + data: { + breed: 'Beagle', + id: 'beagle', + size: 'Small to Medium', + origin: 'England', + lifespan: '12-15 years', + temperament: ['Friendly', 'Curious', 'Merry'], + }, + }); + }); + }); + }); +}); diff --git a/packages/astro/test/fixtures/content-layer/src/pages/collections.json.js b/packages/astro/test/fixtures/content-layer/src/pages/collections.json.js new file mode 100644 index 000000000000..bb41b224677f --- /dev/null +++ b/packages/astro/test/fixtures/content-layer/src/pages/collections.json.js @@ -0,0 +1,12 @@ +import { getCollection, getDataEntryById } from 'astro:content'; + +export async function GET() { + const customLoader = await getCollection('blog'); + const fileLoader = await getCollection('dogs'); + + const dataEntryById = await getDataEntryById('dogs', 'beagle'); + + return new Response( + JSON.stringify({ customLoader, fileLoader, dataEntryById }), + ); +} diff --git a/packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro b/packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro index b37f201e480b..977ae6efa167 100644 --- a/packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro +++ b/packages/astro/test/fixtures/content-layer/src/pages/dogs/[slug].astro @@ -28,7 +28,6 @@ interface Props { const { dog } = Astro.props -console.log({dog}) --- From 6bb89bc82711465d738a7a40196066893ade8b78 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 27 Jun 2024 15:15:24 +0100 Subject: [PATCH 21/21] Changes from review --- packages/astro/src/content/consts.ts | 2 + packages/astro/src/content/data-store.ts | 36 ++++- packages/astro/src/content/file.ts | 23 ++- packages/astro/src/content/loaders.ts | 18 ++- .../vite-plugin-content-virtual-mod.ts | 3 +- packages/astro/src/core/build/index.ts | 4 +- packages/astro/src/core/sync/index.ts | 4 +- packages/astro/test/content-layer.test.js | 146 +++++++++--------- 8 files changed, 136 insertions(+), 100 deletions(-) diff --git a/packages/astro/src/content/consts.ts b/packages/astro/src/content/consts.ts index 70826c898414..c4ace33d11c9 100644 --- a/packages/astro/src/content/consts.ts +++ b/packages/astro/src/content/consts.ts @@ -19,3 +19,5 @@ export const CONTENT_FLAGS = [ ] as const; export const CONTENT_TYPES_FILE = 'types.d.ts'; + +export const DATA_STORE_FILE = 'data-store.json'; diff --git a/packages/astro/src/content/data-store.ts b/packages/astro/src/content/data-store.ts index 65cb4298cbd6..07971562d226 100644 --- a/packages/astro/src/content/data-store.ts +++ b/packages/astro/src/content/data-store.ts @@ -7,11 +7,19 @@ export class DataStore { get(collectionName: string, key: string) { return this.#collections.get(collectionName)?.get(String(key)); } - entries(collectionName: string): IterableIterator<[id: string, any]> { + entries(collectionName: string): Array<[id: string, any]> { const collection = this.#collections.get(collectionName) ?? new Map(); - return collection.entries(); + return [...collection.entries()]; } - set(collectionName: string, key: string, value: any) { + values(collectionName: string): Array { + const collection = this.#collections.get(collectionName) ?? new Map(); + return [...collection.values()]; + } + keys(collectionName: string): Array { + const collection = this.#collections.get(collectionName) ?? new Map(); + return [...collection.keys()]; + } + set(collectionName: string, key: string, value: unknown) { const collection = this.#collections.get(collectionName) ?? new Map(); collection.set(String(key), value); this.#collections.set(collectionName, collection); @@ -46,6 +54,8 @@ export class DataStore { return { get: (key: string) => this.get(collectionName, key), entries: () => this.entries(collectionName), + values: () => this.values(collectionName), + keys: () => this.keys(collectionName), set: (key: string, value: any) => this.set(collectionName, key, value), delete: (key: string) => this.delete(collectionName, key), clear: () => this.clear(collectionName), @@ -54,7 +64,7 @@ export class DataStore { } metaStore(collectionName: string): MetaStore { - return this.scopedStore(`meta:${collectionName}`); + return this.scopedStore(`meta:${collectionName}`) as MetaStore; } toString() { @@ -66,7 +76,11 @@ export class DataStore { } async writeToDisk(filePath: PathLike) { - await fs.writeFile(filePath, this.toString()); + try { + await fs.writeFile(filePath, this.toString()); + } catch { + throw new Error(`Failed to save data store to disk`); + } } static async fromDisk(filePath: PathLike) { @@ -103,14 +117,20 @@ export class DataStore { } export interface ScopedDataStore { - get: (key: string) => any; - entries: () => IterableIterator<[id: string, any]>; - set: (key: string, value: any) => void; + get: (key: string) => unknown; + entries: () => Array<[id: string, unknown]>; + set: (key: string, value: unknown) => void; + values: () => Array; + keys: () => Array; delete: (key: string) => void; clear: () => void; has: (key: string) => boolean; } +/** + * A key-value store for metadata strings. Useful for storing things like sync tokens. + */ + export interface MetaStore { get: (key: string) => string | undefined; set: (key: string, value: string) => void; diff --git a/packages/astro/src/content/file.ts b/packages/astro/src/content/file.ts index 4fa1ac21b6d5..572d89d34e84 100644 --- a/packages/astro/src/content/file.ts +++ b/packages/astro/src/content/file.ts @@ -9,7 +9,8 @@ import { promises as fs, existsSync } from 'fs'; */ export function file(fileName: string): Loader { if (fileName.includes('*')) { - throw new Error('Glob patterns are not supported in file loader. Use `glob` loader instead.'); + // TODO: AstroError + throw new Error('Glob patterns are not supported in `file` loader. Use `glob` loader instead.'); } return { name: 'file-loader', @@ -22,8 +23,16 @@ export function file(fileName: string): Loader { return; } - const data = await fs.readFile(url, 'utf-8'); - const json = JSON.parse(data); + let json: Array>; + + try { + const data = await fs.readFile(url, 'utf-8'); + json = JSON.parse(data); + } catch (error: any) { + logger.error(`Error reading data from ${fileName}`); + logger.debug(error.message); + return; + } const filePath = fileURLToPath(url); @@ -32,7 +41,11 @@ export function file(fileName: string): Loader { logger.warn(`No items found in ${fileName}`); } for (const rawItem of json) { - const id = rawItem.id ?? rawItem.slug; + const id = (rawItem.id ?? rawItem.slug)?.toString(); + if (!id) { + logger.error(`Item in ${fileName} is missing an id or slug field.`); + continue; + } const item = await parseData({ id, data: rawItem, filePath }); store.set(id, item); } @@ -44,8 +57,6 @@ export function file(fileName: string): Loader { } else { logger.error(`Invalid data in ${fileName}. Must be an array or object.`); } - - logger.info('Loading posts'); }, }; } diff --git a/packages/astro/src/content/loaders.ts b/packages/astro/src/content/loaders.ts index b966d13d47bc..934ef99e3e30 100644 --- a/packages/astro/src/content/loaders.ts +++ b/packages/astro/src/content/loaders.ts @@ -4,17 +4,19 @@ import type { AstroIntegrationLogger, Logger } from '../core/logger/core.js'; import { DataStore, globalDataStore, type MetaStore, type ScopedDataStore } from './data-store.js'; import { getEntryData, globalContentConfigObserver } from './utils.js'; import { promises as fs, existsSync } from 'fs'; +import { DATA_STORE_FILE } from './consts.js'; export interface ParseDataOptions { /** The ID of the entry. Unique per collection */ id: string; /** The raw, unvalidated data of the entry */ data: Record; - /** An optional file path, where the entry represents a local file */ + /** An optional file path, where the entry represents a local file. */ filePath?: string; } export interface LoaderContext { + /** The unique name of the collection */ collection: string; /** A database abstraction to store the actual data */ store: ScopedDataStore; @@ -24,7 +26,7 @@ export interface LoaderContext { settings: AstroSettings; - /** Validates and parses the data according to the schema */ + /** Validates and parses the data according to the collection schema */ parseData = Record>( props: ParseDataOptions ): T; @@ -39,14 +41,20 @@ export interface Loader { schema?: S | Promise | (() => S | Promise); render?: (entry: any) => any; } -export async function syncDataLayer({ + +/** + * Run the `load()` method of each collection's loader, which will load the data and save it in the data store. + * The loader itself is responsible for deciding whether this will clear and reload the full collection, or + * perform an incremental update. After the data is loaded, the data store is written to disk. + */ +export async function syncContentLayer({ settings, logger: globalLogger, store, }: { settings: AstroSettings; logger: Logger; store?: DataStore }) { const logger = globalLogger.forkIntegrationLogger('content'); if (!store) { - store = await DataStore.fromDisk(new URL('data-store.json', settings.config.cacheDir)); + store = await DataStore.fromDisk(new URL(DATA_STORE_FILE, settings.config.cacheDir)); globalDataStore.set(store); } const contentConfig = globalContentConfigObserver.get(); @@ -106,7 +114,7 @@ export async function syncDataLayer({ }); }) ); - const cacheFile = new URL('data-store.json', settings.config.cacheDir); + const cacheFile = new URL(DATA_STORE_FILE, settings.config.cacheDir); if (!existsSync(settings.config.cacheDir)) { await fs.mkdir(settings.config.cacheDir, { recursive: true }); } diff --git a/packages/astro/src/content/vite-plugin-content-virtual-mod.ts b/packages/astro/src/content/vite-plugin-content-virtual-mod.ts index 9af1d4a7ec0e..6308c47757e3 100644 --- a/packages/astro/src/content/vite-plugin-content-virtual-mod.ts +++ b/packages/astro/src/content/vite-plugin-content-virtual-mod.ts @@ -16,6 +16,7 @@ import { CONTENT_FLAG, CONTENT_RENDER_FLAG, DATA_FLAG, + DATA_STORE_FILE, DATA_STORE_VIRTUAL_ID, RESOLVED_DATA_STORE_VIRTUAL_ID, RESOLVED_VIRTUAL_MODULE_ID, @@ -45,7 +46,7 @@ export function astroContentVirtualModPlugin({ }: AstroContentVirtualModPluginParams): Plugin { let IS_DEV = false; const IS_SERVER = isServerLikeOutput(settings.config); - const dataStoreFile = new URL('data-store.json', settings.config.cacheDir); + const dataStoreFile = new URL(DATA_STORE_FILE, settings.config.cacheDir); return { name: 'astro-content-virtual-mod-plugin', enforce: 'pre', diff --git a/packages/astro/src/core/build/index.ts b/packages/astro/src/core/build/index.ts index 1f1fdf56a348..b318ffb5b4b2 100644 --- a/packages/astro/src/core/build/index.ts +++ b/packages/astro/src/core/build/index.ts @@ -11,7 +11,7 @@ import type { RuntimeMode, } from '../../@types/astro.js'; import { injectImageEndpoint } from '../../assets/endpoint/config.js'; -import { syncDataLayer } from '../../content/loaders.js'; +import { syncContentLayer } from '../../content/loaders.js'; import { telemetry } from '../../events/index.js'; import { eventCliSession } from '../../events/session.js'; import { @@ -152,7 +152,7 @@ class AstroBuilder { const dataStore = await DataStore.fromModule(); globalDataStore.set(dataStore); - await syncDataLayer({ settings: this.settings, logger: logger }); + await syncContentLayer({ settings: this.settings, logger: logger }); return { viteConfig }; } diff --git a/packages/astro/src/core/sync/index.ts b/packages/astro/src/core/sync/index.ts index 1533e793ccf0..e399ee516a02 100644 --- a/packages/astro/src/core/sync/index.ts +++ b/packages/astro/src/core/sync/index.ts @@ -6,7 +6,7 @@ import { type HMRPayload, createServer } from 'vite'; import type { AstroConfig, AstroInlineConfig, AstroSettings } from '../../@types/astro.js'; import { getPackage } from '../../cli/install-package.js'; import { createContentTypesGenerator } from '../../content/index.js'; -import { syncDataLayer } from '../../content/loaders.js'; +import { syncContentLayer } from '../../content/loaders.js'; import { globalContentConfigObserver } from '../../content/utils.js'; import { syncAstroEnv } from '../../env/sync.js'; import { telemetry } from '../../events/index.js'; @@ -87,7 +87,7 @@ export default async function sync( if (exitCode !== 0) return exitCode; syncAstroEnv(settings, options?.fs); - await syncDataLayer({ settings, logger }); + await syncContentLayer({ settings, logger }); logger.info(null, `Types generated ${dim(getTimeStat(timerStart, performance.now()))}`); return 0; diff --git a/packages/astro/test/content-layer.test.js b/packages/astro/test/content-layer.test.js index 0262d4d06bda..6b079e299818 100644 --- a/packages/astro/test/content-layer.test.js +++ b/packages/astro/test/content-layer.test.js @@ -2,88 +2,82 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; import { loadFixture } from './test-utils.js'; -describe('Content Collections', () => { - describe('Query', () => { - let fixture; - before(async () => { - fixture = await loadFixture({ root: './fixtures/content-layer/' }); - await fixture.build(); - }); +describe('Content Layer', () => { + let fixture; + let json; - describe('Collection', () => { - let json; - before(async () => { - const rawJson = await fixture.readFile('/collections.json'); - json = JSON.parse(rawJson); - }); + before(async () => { + fixture = await loadFixture({ root: './fixtures/content-layer/' }); + await fixture.build(); + const rawJson = await fixture.readFile('/collections.json'); + json = JSON.parse(rawJson); + }); - it('Returns custom loader collection', async () => { - assert.ok(json.hasOwnProperty('customLoader')); - assert.ok(Array.isArray(json.customLoader)); + it('Returns custom loader collection', async () => { + assert.ok(json.hasOwnProperty('customLoader')); + assert.ok(Array.isArray(json.customLoader)); - const item = json.customLoader[0]; - assert.deepEqual(item, { - id: '1', - collection: 'blog', - data: { - userId: 1, - id: 1, - title: 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit', - body: 'quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto', - }, - type: 'experimental_data', - }); - }); + const item = json.customLoader[0]; + assert.deepEqual(item, { + id: '1', + collection: 'blog', + data: { + userId: 1, + id: 1, + title: 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit', + body: 'quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto', + }, + type: 'experimental_data', + }); + }); - it('Returns file loader collection', async () => { - assert.ok(json.hasOwnProperty('fileLoader')); - assert.ok(Array.isArray(json.fileLoader)); + it('Returns `file()` loader collection', async () => { + assert.ok(json.hasOwnProperty('fileLoader')); + assert.ok(Array.isArray(json.fileLoader)); - const ids = json.fileLoader.map((item) => item.data.id); - assert.deepEqual(ids, [ - 'labrador-retriever', - 'german-shepherd', - 'golden-retriever', - 'french-bulldog', - 'bulldog', - 'beagle', - 'poodle', - 'rottweiler', - 'german-shorthaired-pointer', - 'yorkshire-terrier', - 'boxer', - 'dachshund', - 'siberian-husky', - 'great-dane', - 'doberman-pinscher', - 'australian-shepherd', - 'miniature-schnauzer', - 'cavalier-king-charles-spaniel', - 'shih-tzu', - 'boston-terrier', - 'bernese-mountain-dog', - 'pomeranian', - 'havanese', - 'english-springer-spaniel', - 'shetland-sheepdog', - ]); - }); + const ids = json.fileLoader.map((item) => item.data.id); + assert.deepEqual(ids, [ + 'labrador-retriever', + 'german-shepherd', + 'golden-retriever', + 'french-bulldog', + 'bulldog', + 'beagle', + 'poodle', + 'rottweiler', + 'german-shorthaired-pointer', + 'yorkshire-terrier', + 'boxer', + 'dachshund', + 'siberian-husky', + 'great-dane', + 'doberman-pinscher', + 'australian-shepherd', + 'miniature-schnauzer', + 'cavalier-king-charles-spaniel', + 'shih-tzu', + 'boston-terrier', + 'bernese-mountain-dog', + 'pomeranian', + 'havanese', + 'english-springer-spaniel', + 'shetland-sheepdog', + ]); + }); - it('Returns data entry by id', async () => { - assert.ok(json.hasOwnProperty('dataEntryById')); - assert.deepEqual(json.dataEntryById, { - id: 'beagle', - collection: 'dogs', - data: { - breed: 'Beagle', - id: 'beagle', - size: 'Small to Medium', - origin: 'England', - lifespan: '12-15 years', - temperament: ['Friendly', 'Curious', 'Merry'], - }, - }); - }); + it('Returns data entry by id', async () => { + assert.ok(json.hasOwnProperty('dataEntryById')); + assert.deepEqual(json.dataEntryById, { + id: 'beagle', + collection: 'dogs', + data: { + breed: 'Beagle', + id: 'beagle', + size: 'Small to Medium', + origin: 'England', + lifespan: '12-15 years', + temperament: ['Friendly', 'Curious', 'Merry'], + }, }); }); });